forked from platypush/platypush
Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
5c9b8efef2 | |||
b0268d4c9d |
1872 changed files with 29113 additions and 30580 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -19,6 +19,3 @@ platypush/requests
|
||||||
/http-client.env.json
|
/http-client.env.json
|
||||||
/platypush/backend/http/static/css/dist
|
/platypush/backend/http/static/css/dist
|
||||||
/tests/etc/dashboards
|
/tests/etc/dashboards
|
||||||
.coverage
|
|
||||||
coverage.xml
|
|
||||||
Session.vim
|
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
sync-to-github:
|
|
||||||
stage: build
|
|
||||||
script:
|
|
||||||
- echo "Synchronizing repo state to Github"
|
|
||||||
- export REPO_DIR="$(mktemp -d /tmp/platypush-XXXXX)"
|
|
||||||
- git clone git@git.platypush.tech:platypush/platypush.git "$REPO_DIR"
|
|
||||||
- cd "$REPO_DIR"
|
|
||||||
- git remote add github git@github.com:/BlackLight/platypush.git
|
|
||||||
- git checkout $CI_COMMIT_BRANCH
|
|
||||||
- git pull
|
|
||||||
- git push --mirror -v github
|
|
||||||
|
|
||||||
run-tests:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- ./.gitlab/run_ci_tests.sh
|
|
||||||
|
|
||||||
rebuild-docs:
|
|
||||||
stage: deploy
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
script:
|
|
||||||
- ./.gitlab/rebuild_docs.sh
|
|
||||||
|
|
||||||
update-aur-packages:
|
|
||||||
stage: deploy
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- tags
|
|
||||||
script:
|
|
||||||
- echo "Updating AUR packages"
|
|
||||||
- export REPO_DIR="$(mktemp -d /tmp/platypush-distutils-XXXXX)"
|
|
||||||
- git clone git@fabiomanganiello.com:/home/git/platypush-distutils.git "$REPO_DIR"
|
|
||||||
- cd "$REPO_DIR"
|
|
||||||
- git submodule init
|
|
||||||
- git submodule update
|
|
||||||
- cd distro/arch/git
|
|
||||||
- git checkout master
|
|
||||||
- git pull --rebase
|
|
||||||
- cd ../../../
|
|
||||||
- cd distro/arch/stable
|
|
||||||
- git checkout master
|
|
||||||
- git pull --rebase
|
|
||||||
- cd ../../../
|
|
||||||
- ./update.sh
|
|
||||||
- cd distro/arch/git
|
|
||||||
- changes="$(git status --porcelain --untracked-files=no)"
|
|
||||||
- "[[ -n \"$changes\" ]] && git commit -a -m '[Automatic] Package updated' && git push || echo 'No changes'"
|
|
||||||
- cd ../../../
|
|
||||||
- cd distro/arch/stable
|
|
||||||
- changes="$(git status --porcelain --untracked-files=no)"
|
|
||||||
- "[[ -n \"$changes\" ]] && git commit -a -m '[Automatic] Package updated' && git push || echo 'No changes'"
|
|
||||||
|
|
||||||
upload-pip-package:
|
|
||||||
stage: deploy
|
|
||||||
only:
|
|
||||||
- tags
|
|
||||||
script:
|
|
||||||
# Update the CI/CD configuration
|
|
||||||
- cd ~/platypush-ci-cd
|
|
||||||
- git pull
|
|
||||||
- cd -
|
|
||||||
# Build the package
|
|
||||||
- rm -rf build dist *.egg-info
|
|
||||||
- export VERSION=$(grep -e '^\s*__version__\s*=' platypush/__init__.py | sed -r -e 's/^\s*__version__\s*=\s*.(.+?).\s*$/\1/')
|
|
||||||
- source ~/.credentials/pypi.env
|
|
||||||
- python setup.py sdist bdist_wheel
|
|
||||||
# Upload to PyPI
|
|
||||||
- twine upload --repository platypush ./dist/platypush-${VERSION}.tar.gz
|
|
||||||
# Upload to the local package repository
|
|
||||||
- TWINE_USERNAME=$LOCAL_TWINE_USERNAME TWINE_PASSWORD=$LOCAL_TWINE_PASSWORD twine upload --repository-url https://git.platypush.tech/api/v4/projects/3/packages/pypi dist/platypush-${VERSION}.tar.gz
|
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
LOGFILE="./docs.log"
|
|
||||||
STATUS_IMG_PATH="./docs-status.svg"
|
|
||||||
|
|
||||||
build_docs() {
|
|
||||||
cd ./docs || exit 1
|
|
||||||
make html 2>&1 | tee "../$LOGFILE"
|
|
||||||
ret=$?
|
|
||||||
cd .. || exit 1
|
|
||||||
return $?
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# MAIN #
|
|
||||||
########
|
|
||||||
|
|
||||||
build_docs
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
log_base_path="$(date +/opt/tests/platypush/logs/docs/%Y-%m-%dT%H:%M:%S.%m)"
|
|
||||||
if [[ $ret == 0 ]]; then
|
|
||||||
wget -O "$STATUS_IMG_PATH" https://ci.platypush.tech/docs/passed.svg
|
|
||||||
cp "$LOGFILE" "${log_base_path}_PASSED.log"
|
|
||||||
else
|
|
||||||
wget -O "$STATUS_IMG_PATH" https://ci.platypush.tech/docs/failed.svg
|
|
||||||
cp "$LOGFILE" "${log_base_path}_FAILED.log"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mv "$STATUS_IMG_PATH" /opt/tests/platypush/logs/docs/
|
|
||||||
mv "$LOGFILE" /opt/tests/platypush/logs/latest.log
|
|
||||||
cp -r docs/build/html /opt/repos/platypush/docs/build/
|
|
||||||
exit $ret
|
|
|
@ -1,60 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
BASE_DIR="$(mktemp -d '/tmp/platypush-ci-tests-XXXXX')"
|
|
||||||
VENV_DIR="$BASE_DIR/venv"
|
|
||||||
TEST_LOG="./test.log"
|
|
||||||
STATUS_IMG_PATH="./status.svg"
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
echo "Cleaning up environment"
|
|
||||||
rm -rf "$BASE_DIR"
|
|
||||||
}
|
|
||||||
|
|
||||||
prepare_venv() {
|
|
||||||
echo "Preparing virtual environment"
|
|
||||||
python -m venv "$VENV_DIR"
|
|
||||||
cd "$VENV_DIR" || exit 1
|
|
||||||
source ./bin/activate
|
|
||||||
cd - || exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
install_repo() {
|
|
||||||
echo "Installing latest version of the repository"
|
|
||||||
pip install '.[http]'
|
|
||||||
}
|
|
||||||
|
|
||||||
run_tests() {
|
|
||||||
echo "Running tests"
|
|
||||||
pytest 2>&1 | tee "$TEST_LOG"
|
|
||||||
deactivate
|
|
||||||
|
|
||||||
if grep -e '^FAILED ' "$TEST_LOG"; then
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
return 0 # PASSED
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# MAIN #
|
|
||||||
########
|
|
||||||
|
|
||||||
cleanup
|
|
||||||
prepare_venv
|
|
||||||
install_repo
|
|
||||||
run_tests
|
|
||||||
ret=$?
|
|
||||||
cleanup
|
|
||||||
|
|
||||||
log_base_path="$(date +/opt/tests/platypush/logs/%Y-%m-%dT%H:%M:%S.%m)"
|
|
||||||
if [[ $ret == 0 ]]; then
|
|
||||||
wget -O "$STATUS_IMG_PATH" https://ci.platypush.tech/passed.svg
|
|
||||||
cp "$TEST_LOG" "${log_base_path}_PASSED.log"
|
|
||||||
else
|
|
||||||
wget -O "$STATUS_IMG_PATH" https://ci.platypush.tech/failed.svg
|
|
||||||
cp "$TEST_LOG" "${log_base_path}_FAILED.log"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mv "$STATUS_IMG_PATH" /opt/tests/platypush/logs/status.svg
|
|
||||||
mv "$TEST_LOG" /opt/tests/platypush/logs/latest.log
|
|
||||||
exit $ret
|
|
|
@ -1,32 +0,0 @@
|
||||||
# See https://pre-commit.com for more information
|
|
||||||
# See https://pre-commit.com/hooks.html for more hooks
|
|
||||||
repos:
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
||||||
rev: v4.1.0
|
|
||||||
hooks:
|
|
||||||
# - id: trailing-whitespace
|
|
||||||
# - id: end-of-file-fixer
|
|
||||||
- id: check-yaml
|
|
||||||
- id: check-json
|
|
||||||
- id: check-xml
|
|
||||||
- id: check-symlinks
|
|
||||||
- id: check-added-large-files
|
|
||||||
|
|
||||||
- repo: https://github.com/Lucas-C/pre-commit-hooks-nodejs
|
|
||||||
rev: v1.1.2
|
|
||||||
hooks:
|
|
||||||
- id: markdown-toc
|
|
||||||
|
|
||||||
- repo: https://github.com/pycqa/flake8
|
|
||||||
rev: 4.0.1
|
|
||||||
hooks:
|
|
||||||
- id: flake8
|
|
||||||
additional_dependencies:
|
|
||||||
- flake8-bugbear
|
|
||||||
- flake8-comprehensions
|
|
||||||
- flake8-simplify
|
|
||||||
|
|
||||||
- repo: https://github.com/psf/black
|
|
||||||
rev: 22.3.0
|
|
||||||
hooks:
|
|
||||||
- id: black
|
|
284
CHANGELOG.md
284
CHANGELOG.md
|
@ -1,275 +1,7 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
Given the high speed of development in the first phase, changes are being
|
Given the high speed of development in the first phase, changes are being reported only starting from v0.20.2.
|
||||||
reported only starting from v0.20.2.
|
|
||||||
|
|
||||||
## [Unreleased]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added [Wallabag integration](https://git.platypush.tech/platypush/platypush/issues/224).
|
|
||||||
- Added [Mimic3 TTS integration](https://git.platypush.tech/platypush/platypush/issues/226).
|
|
||||||
|
|
||||||
## [0.23.6] - 2022-09-19
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fixed album_id and list of tracks on `music.tidal.get_album`.
|
|
||||||
|
|
||||||
## [0.23.5] - 2022-09-18
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added support for web hooks returning their hook method responses back to the
|
|
||||||
HTTP client.
|
|
||||||
|
|
||||||
- Added [Tidal integration](https://git.platypush.tech/platypush/platypush/pulls/223)
|
|
||||||
|
|
||||||
- Added support for [OPML
|
|
||||||
subscriptions](https://git.platypush.tech/platypush/platypush/pulls/220) to
|
|
||||||
the `rss` plugin.
|
|
||||||
|
|
||||||
- Better support for bulk database operations on the `db` plugin.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Now supporting YAML sections with empty configurations.
|
|
||||||
|
|
||||||
## [0.23.4] - 2022-08-28
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `matrix` integration
|
|
||||||
([issue](https://git.platypush.tech/platypush/platypush/issues/2),
|
|
||||||
[PR](https://git.platypush.tech/platypush/platypush/pulls/217)).
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Removed `clipboard` backend. Enabling the `clipboard` plugin will also enable
|
|
||||||
clipboard monitoring, with no need for an additional backend.
|
|
||||||
|
|
||||||
## [0.23.3] - 2022-06-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `ntfy` integration (see #219).
|
|
||||||
- Support for a default `config.yaml` if one isn't specified in the default
|
|
||||||
locations.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- The HTTP server dependencies are now marked as required, since the default
|
|
||||||
`config.yaml` will have the HTTP backend enabled by default in order to allow
|
|
||||||
the creation of a first user.
|
|
||||||
- Updated Vue.js frontend dependencies to the latest version.
|
|
||||||
- Removed bulma from the frontend dependencies, making the frontend much
|
|
||||||
lighter and loading times much faster.
|
|
||||||
- Other UI improvements.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- More reliable cronjobs in case of DST change or any clock changes in general
|
|
||||||
(see #217).
|
|
||||||
- Fixed `--redis-queue` argument.
|
|
||||||
|
|
||||||
## [0.23.2] - 2022-03-27
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Support for asynchronous events over GPIO PINs. It is now possible to specify
|
|
||||||
a list of `monitored_pins` in the [`gpio`
|
|
||||||
plugin](https://git.platypush.tech/platypush/platypush/-/blob/master/platypush/plugins/gpio/__init__.py)
|
|
||||||
configuration. A change in the value on those GPIO PINs (caused by e.g. a
|
|
||||||
button, a binary sensor or a probe) will trigger a
|
|
||||||
`platypush.message.event.gpio.GPIOEvent` that you can use in your automation
|
|
||||||
scripts.
|
|
||||||
|
|
||||||
- Simplified script API to interact with platform variables
|
|
||||||
(closes [#206](https://git.platypush.tech/platypush/platypush/-/issues/206)).
|
|
||||||
You can now read and write stored variables in your Platypush scripts through
|
|
||||||
a much more intuitive interface compared to explicitly using the `variable`
|
|
||||||
plugin explicitly:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from platypush.context import Variable
|
|
||||||
|
|
||||||
# ...
|
|
||||||
|
|
||||||
my_var = Variable.get('my_var')
|
|
||||||
my_var = int(my_var) + 1
|
|
||||||
Variable.set(my_var=my_var)
|
|
||||||
```
|
|
||||||
|
|
||||||
## [0.23.0] - 2022-03-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added [Jellyfin integration](https://git.platypush.tech/platypush/platypush/-/issues/208).
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Merged several PRs from `dependabot`.
|
|
||||||
|
|
||||||
- Fixed management of the `CN` field in the `calendar.ical` plugin.
|
|
||||||
|
|
||||||
## [0.22.10] - 2022-02-07
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Refactored the `dbus` integration. The plugin and backend have been merged into a
|
|
||||||
single plugin component, and the ability to subscribe to custom signals has been
|
|
||||||
added.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Proper support for empty payloads on the integrations that trigger a `SensorDataChangeEvent`.
|
|
||||||
- Fixed possible infinite recursion on the Pushbullet integration in case of errors where the
|
|
||||||
error and close handlers keep calling each other in a loop.
|
|
||||||
|
|
||||||
## [0.22.9] - 2022-01-06
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `rss` integration (replaces the cumbersome and deprecated `backend.http.poll`).
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fixed timezone handling in calendar integrations.
|
|
||||||
- Fixed handling of ignored directories in the `file.monitor` backend.
|
|
||||||
|
|
||||||
## [0.22.8] - 2021-12-13
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added support for audio tracks in Plex integration.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Web server uWSGI wrapper changed from `uwsgi` to `gunicorn`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fixed client ID assignment logic in MQTT backends to prevent client ID clashes and reconnections
|
|
||||||
(closes #205).
|
|
||||||
- Updated LTR559 integration to be compatible with the new API.
|
|
||||||
- Updated Chromecast integration to be compatible with `pychromecast >= 10`.
|
|
||||||
- Better handling of media errors.
|
|
||||||
|
|
||||||
## [0.22.6] - 2021-11-27
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added support for converting webpages to markdown in `http.webpage.simplify`
|
|
||||||
even if no `outfile` is specified.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Improved robustness of the ICal calendar parser in case some fields (e.g. `*status`)
|
|
||||||
are not defined.
|
|
||||||
|
|
||||||
## [0.22.5] - 2021-11-15
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `mastodon` plugin.
|
|
||||||
- Added `chat.irc` plugin.
|
|
||||||
- Added `mailgun` plugin.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fixed `switchbot.status` method in case of virtual devices.
|
|
||||||
- Fixed `platypush[alexa]` optional package installation.
|
|
||||||
|
|
||||||
## [0.22.4] - 2021-10-19
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Support for IR virtual devices in Switchbot plugin.
|
|
||||||
- Added [`google.maps.get_travel_time`](https://docs.platypush.tech/platypush/plugins/google.maps.html#platypush.plugins.google.maps.GoogleMapsPlugin.get_travel_time)
|
|
||||||
method (closes #115).
|
|
||||||
- Support for custom YouTube video/audio formats on media plugins.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Responses for requests received over an MQTT backend are now delivered to the right topic
|
|
||||||
(`<device_base_topic>/responses/<msg_id>`).
|
|
||||||
- Various fixes on media plugins.
|
|
||||||
|
|
||||||
## [0.22.3] - 2021-10-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `gotify` integration (see #198).
|
|
||||||
|
|
||||||
## [0.22.2] - 2021-09-25
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `ngrok` integration (see #196).
|
|
||||||
|
|
||||||
## [0.22.1] - 2021-09-22
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- `zigbee.mqtt` backend now no longer requires the MQTT backend/plugin to be enabled.
|
|
||||||
|
|
||||||
- Fixed bug on empty popcorn API responses.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Created CI Gitlab pipeline to replace the Platypush event-based pre-existing pipeline.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Removed docs references to removed/abstract integrations.
|
|
||||||
|
|
||||||
## [0.22.0] - 2021-09-16
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Platypush now uses manifest files to describe plugins and backends. Each extension is now
|
|
||||||
expected to provide a `manifest.yaml` file in its folder, reporting its package name, pip
|
|
||||||
dependencies, required system packages and optional extra installation commands.
|
|
||||||
|
|
||||||
- Refactored `platyvenv`, `platydock`, documentation generation and plugin management engine.
|
|
||||||
They are now both faster and more robust, since they can rely on the manifest definition to
|
|
||||||
operate instead of pydoc strings conventions or `config.yaml` conventions.
|
|
||||||
|
|
||||||
- `platyvenv start` now starts the environment process synchronously and it prints
|
|
||||||
stdout/stderr instead of redirecting it to the logs dir (previous behaviour:
|
|
||||||
`platyvenv start` used to start the process asynchronously and the logs were stored
|
|
||||||
to `~/.local/share/platypush/venv/<env>/logs/<stdout|stderr>.log`).
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Removed `Homeseer` integration - it was based on a Python integration that has now been
|
|
||||||
pulled out of PyPI and GitHub. A new integration may come in the future if there is enough
|
|
||||||
demand for it.
|
|
||||||
|
|
||||||
## [0.21.4] - 2021-08-24
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fixed JWT token generation, since python-jwt >= 2.0 always returns strings (not bytes) upon `jwt.encode`.
|
|
||||||
|
|
||||||
## [0.21.3] - 2021-07-28
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `sun` plugin for sunrise/sunset events.
|
|
||||||
|
|
||||||
- Added `slack` integration.
|
|
||||||
|
|
||||||
## [0.21.2] - 2021-07-20
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Added `music.spotify` backend to emulate a Spotify Connect receiver through Platypush.
|
|
||||||
|
|
||||||
- Added `music.spotify` plugin.
|
|
||||||
|
|
||||||
- Added `music.spotify` UI integration.
|
|
||||||
|
|
||||||
## [0.21.1] - 2021-06-22
|
## [0.21.1] - 2021-06-22
|
||||||
|
|
||||||
|
@ -277,17 +9,17 @@ Variable.set(my_var=my_var)
|
||||||
|
|
||||||
- Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of
|
- Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of
|
||||||
directly accessing the device's Bluetooth interface.
|
directly accessing the device's Bluetooth interface.
|
||||||
|
|
||||||
- Added `marshmallow` dependency - it will be used from now own to dump and document schemas
|
- Added `marshmallow` dependency - it will be used from now own to dump and document schemas
|
||||||
and responses instead of the currently mixed approach with `Response` objects and plain
|
and responses instead of the currently mixed approach with `Response` objects and plain
|
||||||
dictionaries and lists.
|
dictionaries and lists.
|
||||||
|
|
||||||
- Support for custom MQTT timeout on all the `zwavejs2mqtt` calls.
|
- Support for custom MQTT timeout on all the `zwavejs2mqtt` calls.
|
||||||
|
|
||||||
- Added generic joystick backend `backend.joystick.jstest` which uses `jstest` from the
|
- Added generic joystick backend `backend.joystick.jstest` which uses `jstest` from the
|
||||||
standard `joystick` system package to read the state of joysticks not compatible with
|
standard `joystick` system package to read the state of joysticks not compatible with
|
||||||
`python-inputs`.
|
`python-inputs`.
|
||||||
|
|
||||||
- Added PWM PCA9685 plugin.
|
- Added PWM PCA9685 plugin.
|
||||||
|
|
||||||
- Added Linux native joystick plugin, ``backend.joystick.linux``, for the cases where
|
- Added Linux native joystick plugin, ``backend.joystick.linux``, for the cases where
|
||||||
|
@ -344,7 +76,7 @@ Variable.set(my_var=my_var)
|
||||||
|
|
||||||
- Added `<Camera>` dashboard widget.
|
- Added `<Camera>` dashboard widget.
|
||||||
|
|
||||||
- Added support for custom dashboard widgets with customized (see https://git.platypush.tech/platypush/platypush/wiki/Backends#creating-custom-widgets).
|
- Added support for custom dashboard widgets with customized (see https://git.platypush.tech/platypush/platypush/-/wikis/Backends#creating-custom-widgets).
|
||||||
|
|
||||||
- Added support for controls on `music.mpd` dashboard widget.
|
- Added support for controls on `music.mpd` dashboard widget.
|
||||||
|
|
||||||
|
@ -391,7 +123,7 @@ Variable.set(my_var=my_var)
|
||||||
|
|
||||||
- Added support for a static list of devices to actively scan to the `bluetooth.scanner` backend
|
- Added support for a static list of devices to actively scan to the `bluetooth.scanner` backend
|
||||||
(see [#174](https://git.platypush.tech/platypush/platypush/-/issues/174)).
|
(see [#174](https://git.platypush.tech/platypush/platypush/-/issues/174)).
|
||||||
|
|
||||||
- Added `weather.openweathermap` plugin and backend, which replaces `weather.darksky`, since the
|
- Added `weather.openweathermap` plugin and backend, which replaces `weather.darksky`, since the
|
||||||
Darksky API will be completely shut down by the end of 2021.
|
Darksky API will be completely shut down by the end of 2021.
|
||||||
|
|
||||||
|
@ -399,14 +131,14 @@ Variable.set(my_var=my_var)
|
||||||
|
|
||||||
- Cron expressions should adhere to the UNIX cronjob standard and use the machine local time,
|
- Cron expressions should adhere to the UNIX cronjob standard and use the machine local time,
|
||||||
not UTC, as a reference (closes [#173](https://git.platypush.tech/platypush/platypush/-/issues/173)).
|
not UTC, as a reference (closes [#173](https://git.platypush.tech/platypush/platypush/-/issues/173)).
|
||||||
|
|
||||||
- Better management of Z-Wave values types from the UI.
|
- Better management of Z-Wave values types from the UI.
|
||||||
|
|
||||||
- Disable logging for `ZwaveValueEvent` events - they tend to be very verbose and
|
- Disable logging for `ZwaveValueEvent` events - they tend to be very verbose and
|
||||||
can impact the performance on slower devices. They will still be published to the
|
can impact the performance on slower devices. They will still be published to the
|
||||||
websocket clients though, so you can still debug Z-Wave values issues from the browser
|
websocket clients though, so you can still debug Z-Wave values issues from the browser
|
||||||
developer console (enable debug traces).
|
developer console (enable debug traces).
|
||||||
|
|
||||||
- Added suffix to the `zigbee.mqtt` backend default `client_id` to prevent clashes with
|
- Added suffix to the `zigbee.mqtt` backend default `client_id` to prevent clashes with
|
||||||
the default `mqtt` backend `client_id`.
|
the default `mqtt` backend `client_id`.
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,9 @@ Guidelines:
|
||||||
|
|
||||||
- If the feature requires an optional dependency then make sure to document it:
|
- If the feature requires an optional dependency then make sure to document it:
|
||||||
|
|
||||||
- In the class docstring (see other plugins and backends for examples).
|
- In the class docstring (see other plugins and backends for examples)
|
||||||
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
|
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
|
||||||
an `extras_require` entry.
|
an `extras_require` entry
|
||||||
- In the plugin/backend class pydoc string.
|
- In [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) -
|
||||||
- In the `manifest.yaml` - refer to the Wiki (how to write
|
if the feature is optional then leave it commented and add a one-line comment to explain which
|
||||||
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
|
plugin or backend requires it.
|
||||||
and [backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
|
|
||||||
for examples on how to write an extension manifest file.
|
|
||||||
|
|
|
@ -1,4 +1,2 @@
|
||||||
recursive-include platypush/backend/http/webapp/dist *
|
recursive-include platypush/backend/http/webapp/dist *
|
||||||
include platypush/plugins/http/webpage/mercury-parser.js
|
include platypush/plugins/http/webpage/mercury-parser.js
|
||||||
include platypush/config/*.yaml
|
|
||||||
global-include manifest.yaml
|
|
||||||
|
|
507
README.md
507
README.md
|
@ -6,82 +6,39 @@ Platypush
|
||||||
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
|
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
|
||||||
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
|
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
|
||||||
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
|
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
|
||||||
[![Join chat on Matrix](https://img.shields.io/matrix/:platypush?server_fqdn=matrix.platypush.tech)](https://matrix.to/#/#platypush:matrix.platypush.tech)
|
|
||||||
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
|
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
|
||||||
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
|
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
|
||||||
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
|
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
|
||||||
|
|
||||||
<!-- toc -->
|
|
||||||
|
|
||||||
- [Architecture](#architecture)
|
|
||||||
* [Plugins](#plugins)
|
|
||||||
* [Actions](#actions)
|
|
||||||
* [Backends](#backends)
|
|
||||||
* [Events](#events)
|
|
||||||
* [Hooks](#hooks)
|
|
||||||
* [Procedures](#procedures)
|
|
||||||
* [Cronjobs](#cronjobs)
|
|
||||||
* [The web interface](#the-web-interface)
|
|
||||||
- [Installation](#installation)
|
|
||||||
* [System installation](#system-installation)
|
|
||||||
+ [Install through `pip`](#install-through-pip)
|
|
||||||
+ [Install through a system package manager](#install-through-a-system-package-manager)
|
|
||||||
+ [Install from sources](#install-from-sources)
|
|
||||||
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
|
|
||||||
+ [Install via `extras` name](#install-via-extras-name)
|
|
||||||
+ [Install via `manifest.yaml`](#install-via-manifestyaml)
|
|
||||||
+ [Check the instructions reported in the documentation](#check-the-instructions-reported-in-the-documentation)
|
|
||||||
* [Virtual environment installation](#virtual-environment-installation)
|
|
||||||
* [Docker installation](#docker-installation)
|
|
||||||
- [Mobile app](#mobile-app)
|
|
||||||
- [Tests](#tests)
|
|
||||||
- [Funding](#funding)
|
|
||||||
|
|
||||||
<!-- tocstop -->
|
|
||||||
|
|
||||||
- Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush).
|
- Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush).
|
||||||
|
|
||||||
- The [blog](https://blog.platypush.tech) is in general a good place to get
|
- The [blog](https://blog.platypush.tech) is in general a good place to get more insights on what you can build with it and inspiration about possible usages.
|
||||||
more insights on what you can build with it and inspiration about possible
|
|
||||||
usages.
|
|
||||||
|
|
||||||
- The [wiki](https://git.platypush.tech/platypush/platypush/wiki) also
|
- The [wiki](https://git.platypush.tech/platypush/platypush/-/wikis/home) also contains many resources on getting started.
|
||||||
contains many resources on getting started.
|
|
||||||
|
|
||||||
- Extensive documentation for all the available integrations and messages [is
|
- Extensive documentation for all the available integrations and messages [is available](https://docs.platypush.tech/).
|
||||||
available](https://docs.platypush.tech/).
|
|
||||||
|
|
||||||
- If you have issues/feature requests/enhancement ideas please [create an
|
- If you have issues/feature requests/enhancement ideas please [create an issue](https://git.platypush.tech/platypush/platypush/-/issues).
|
||||||
issue](https://git.platypush.tech/platypush/platypush/-/issues).
|
|
||||||
|
|
||||||
- A [Reddit channel](https://www.reddit.com/r/platypush) is also available for
|
- A [Reddit channel](https://www.reddit.com/r/platypush) is also available for more general questions.
|
||||||
more general questions.
|
|
||||||
|
|
||||||
- A [Matrix instance](https://matrix.to/#/#platypush:matrix.platypush.tech) is
|
|
||||||
also available if you are looking for more interactive support.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Platypush is a general-purpose extensible platform for automation and
|
Platypush is a general-purpose extensible platform for automation and integration across multiple services and devices.
|
||||||
integration across multiple services and devices.
|
|
||||||
|
|
||||||
It enables users to create their own self-hosted pieces of automation based on
|
It enables users to create their own self-hosted pieces of automation based on events (*if this happens then do that*)
|
||||||
events (*if this happens then do that*)
|
and it provides a comprehensive and customizable user interface that collects everything you need to visualize and
|
||||||
and it provides a comprehensive and customizable user interface that collects
|
control under one roof.
|
||||||
everything you need to visualize and control under one roof.
|
|
||||||
|
|
||||||
It takes some concepts from [IFTTT](https://ifttt.com),
|
It takes some concepts from [IFTTT](https://ifttt.com), [Tasker](https://tasker.joaoapps.com/),
|
||||||
[Tasker](https://tasker.joaoapps.com/), [Microsoft
|
[Microsoft Flow](https://flow.microsoft.com), [PushBullet](https://pushbullet.com) and
|
||||||
Flow](https://flow.microsoft.com), [PushBullet](https://pushbullet.com) and
|
[Home Assistant](https://www.home-assistant.io/) to provide an environment where the user can easily connect things
|
||||||
[Home Assistant](https://www.home-assistant.io/) to provide an environment
|
together.
|
||||||
where the user can easily connect things together.
|
|
||||||
|
|
||||||
Its ideal home is a single-board computer like a RaspberryPi that you can
|
Its ideal home is a single-board computer like a RaspberryPi that you can configure to orchestrate any home automation
|
||||||
configure to orchestrate any home automation and cloud automation in your own
|
and cloud automation in your own living room or garage, but it can easily run on any device that can run a Python
|
||||||
living room or garage, but it can easily run on any device that can run a
|
interpreter, and the bar for the hardware requirements is very low as well - I use it to run pieces of automation on
|
||||||
Python interpreter, and the bar for the hardware requirements is very low as
|
devices as powerful as a RaspberryPi Zero or an old Nokia N900 with Linux.
|
||||||
well - I use it to run pieces of automation on devices as powerful as a
|
|
||||||
RaspberryPi Zero or an old Nokia N900 with Linux.
|
|
||||||
|
|
||||||
You can use Platypush to do things like:
|
You can use Platypush to do things like:
|
||||||
|
|
||||||
|
@ -90,10 +47,8 @@ You can use Platypush to do things like:
|
||||||
- [Create custom and privacy-secure voice assistants that run custom hooks on your phrases](https://blog.platypush.tech/article/Build-custom-voice-assistants)
|
- [Create custom and privacy-secure voice assistants that run custom hooks on your phrases](https://blog.platypush.tech/article/Build-custom-voice-assistants)
|
||||||
- Build integrations between [sensors](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html),
|
- Build integrations between [sensors](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html),
|
||||||
[cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
|
[cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
|
||||||
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html)
|
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html) and
|
||||||
and [machine learning
|
[machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html) to create smart
|
||||||
models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html)
|
|
||||||
to create smart
|
|
||||||
pieces of automation for e.g.
|
pieces of automation for e.g.
|
||||||
[people detection](https://blog.platypush.tech/article/Detect-people-with-a-RaspberryPi-a-thermal-camera-Platypush-and-a-pinch-of-machine-learning)
|
[people detection](https://blog.platypush.tech/article/Detect-people-with-a-RaspberryPi-a-thermal-camera-Platypush-and-a-pinch-of-machine-learning)
|
||||||
or [sound detection](https://blog.platypush.tech/article/Create-your-smart-baby-monitor-with-Platypush-and-Tensorflow)
|
or [sound detection](https://blog.platypush.tech/article/Create-your-smart-baby-monitor-with-Platypush-and-Tensorflow)
|
||||||
|
@ -105,53 +60,35 @@ You can use Platypush to do things like:
|
||||||
- [Control your smart switches](https://docs.platypush.tech/en/latest/platypush/plugins/switch.html)
|
- [Control your smart switches](https://docs.platypush.tech/en/latest/platypush/plugins/switch.html)
|
||||||
- [Implement automated custom text-to-speech routines](https://docs.platypush.tech/en/latest/platypush/plugins/tts.html)
|
- [Implement automated custom text-to-speech routines](https://docs.platypush.tech/en/latest/platypush/plugins/tts.html)
|
||||||
- [Build any kind of interactions and automation routines with your Android device using Tasker](https://blog.platypush.tech/article/How-to-build-your-personal-infrastructure-for-data-collection-and-visualization)
|
- [Build any kind of interactions and automation routines with your Android device using Tasker](https://blog.platypush.tech/article/How-to-build-your-personal-infrastructure-for-data-collection-and-visualization)
|
||||||
- Play [local
|
- Play [local videos](https://docs.platypush.tech/en/latest/platypush/plugins/media.mpv.html), YouTube videos and torrent media from any device and service, to any device
|
||||||
videos](https://docs.platypush.tech/en/latest/platypush/plugins/media.mpv.html),
|
|
||||||
YouTube videos and torrent media from any device and service, to any device
|
|
||||||
- [Get weather forecast events for your location and build automation routines on them](https://docs.platypush.tech/en/latest/platypush/plugins/weather.darksky.html)
|
- [Get weather forecast events for your location and build automation routines on them](https://docs.platypush.tech/en/latest/platypush/plugins/weather.darksky.html)
|
||||||
- [Create a custom single hub for Zigbee and Z-Wave smart devices](https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge)
|
- [Create a custom single hub for Zigbee and Z-Wave smart devices](https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge)
|
||||||
- Build your own web dashboard with calendar, weather, news and music controls
|
- Build your own web dashboard with calendar, weather, news and music controls (basically, anything that has a Platypush web widget)
|
||||||
(basically, anything that has a Platypush web widget)
|
|
||||||
- ...and much more (basically, anything that comes with a [Platypush plugin](https://docs.platypush.tech/en/latest/plugins.html))
|
- ...and much more (basically, anything that comes with a [Platypush plugin](https://docs.platypush.tech/en/latest/plugins.html))
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
The architecture of Platypush consists of a few simple pieces, orchestrated by
|
The architecture of Platypush consists of a few simple pieces, orchestrated by a configuration file stored by default
|
||||||
a configuration file stored by default under
|
under [`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml):
|
||||||
[`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml):
|
|
||||||
|
|
||||||
### Plugins
|
### [Plugins](https://docs.platypush.tech/en/latest/plugins.html)
|
||||||
|
|
||||||
[Full list](https://docs.platypush.tech/en/latest/plugins.html)
|
They are integrations that do things - like
|
||||||
|
[modify files](https://docs.platypush.tech/en/latest/platypush/plugins/file.html),
|
||||||
|
[train and evaluate machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html),
|
||||||
|
[control cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
|
||||||
|
[read sensors](https://docs.platypush.tech/en/latest/platypush/plugins/gpio.sensor.dht.html),
|
||||||
|
[parse a web page](https://docs.platypush.tech/en/latest/platypush/plugins/http.webpage.html),
|
||||||
|
[control lights](https://docs.platypush.tech/en/latest/platypush/plugins/light.hue.html),
|
||||||
|
[send emails](https://docs.platypush.tech/en/latest/platypush/plugins/mail.smtp.html),
|
||||||
|
[control Chromecasts](https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html),
|
||||||
|
[run voice queries](https://docs.platypush.tech/en/latest/platypush/plugins/assistant.google.html),
|
||||||
|
[handle torrent transfers](https://docs.platypush.tech/en/latest/platypush/plugins/torrent.html) or
|
||||||
|
control [Zigbee](https://docs.platypush.tech/en/latest/platypush/plugins/zigbee.mqtt.html) or
|
||||||
|
[Z-Wave](https://docs.platypush.tech/en/latest/platypush/plugins/zwave.html) devices.
|
||||||
|
|
||||||
Plugins are integrations that do things - like [modify
|
The configuration of a plugin matches one-on-one that of its documented class constructor, so it's very straightforward
|
||||||
files](https://docs.platypush.tech/en/latest/platypush/plugins/file.html),
|
to write a configuration for a plugin by reading its documentation:
|
||||||
[train and evaluate machine learning
|
|
||||||
models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html),
|
|
||||||
[control
|
|
||||||
cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
|
|
||||||
[read
|
|
||||||
sensors](https://docs.platypush.tech/en/latest/platypush/plugins/gpio.sensor.dht.html),
|
|
||||||
[parse a web
|
|
||||||
page](https://docs.platypush.tech/en/latest/platypush/plugins/http.webpage.html),
|
|
||||||
[control
|
|
||||||
lights](https://docs.platypush.tech/en/latest/platypush/plugins/light.hue.html),
|
|
||||||
[send
|
|
||||||
emails](https://docs.platypush.tech/en/latest/platypush/plugins/mail.smtp.html),
|
|
||||||
[control
|
|
||||||
Chromecasts](https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html),
|
|
||||||
[run voice
|
|
||||||
queries](https://docs.platypush.tech/en/latest/platypush/plugins/assistant.google.html),
|
|
||||||
[handle torrent
|
|
||||||
transfers](https://docs.platypush.tech/en/latest/platypush/plugins/torrent.html)
|
|
||||||
or control
|
|
||||||
[Zigbee](https://docs.platypush.tech/en/latest/platypush/plugins/zigbee.mqtt.html)
|
|
||||||
or [Z-Wave](https://docs.platypush.tech/en/latest/platypush/plugins/zwave.html)
|
|
||||||
devices.
|
|
||||||
|
|
||||||
The configuration of a plugin matches one-on-one that of its documented class
|
|
||||||
constructor, so it's very straightforward to write a configuration for a plugin
|
|
||||||
by reading its documentation:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
light.hue:
|
light.hue:
|
||||||
|
@ -163,11 +100,9 @@ light.hue:
|
||||||
|
|
||||||
### Actions
|
### Actions
|
||||||
|
|
||||||
Plugins expose *actions*, that match one-on-one the plugin class methods
|
Plugins expose *actions*, that match one-on-one the plugin class methods denoted by `@action`, so it's very
|
||||||
denoted by `@action`, so it's very straightforward to invoke plugin actions by
|
straightforward to invoke plugin actions by just reading the plugin documentation. They can be invoked directly from
|
||||||
just reading the plugin documentation. They can be invoked directly from your
|
your own scripts or they can be sent to the platform through any supported channel as simple JSON messages:
|
||||||
own scripts or they can be sent to the platform through any supported channel
|
|
||||||
as simple JSON messages:
|
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
@ -179,54 +114,37 @@ as simple JSON messages:
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Backends
|
### [Backends](https://docs.platypush.tech/en/latest/backends.html)
|
||||||
|
|
||||||
[Full list](https://docs.platypush.tech/en/latest/backends.html)
|
They are background services that either listen for messages on channels (like an
|
||||||
|
[HTTP backend](https://docs.platypush.tech/en/latest/platypush/backend/http.html), an
|
||||||
|
[MQTT instance](https://docs.platypush.tech/en/latest/platypush/backend/mqtt.html), a
|
||||||
|
[Kafka instance](https://docs.platypush.tech/en/latest/platypush/backend/kafka.html), a
|
||||||
|
[Websocket service](https://docs.platypush.tech/en/latest/platypush/backend/websocket.html),
|
||||||
|
[Pushbullet](https://docs.platypush.tech/en/latest/platypush/backend/pushbullet.html) etc.) or monitor a device or a
|
||||||
|
service for events (like a [sensor](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html), a custom
|
||||||
|
[voice assistant](https://docs.platypush.tech/en/latest/platypush/backend/assistant.google.html), a bridge running on a
|
||||||
|
[Zigbee](https://docs.platypush.tech/en/latest/platypush/backend/zigbee.mqtt.html) or
|
||||||
|
[Z-Wave](https://docs.platypush.tech/en/latest/platypush/backend/zwave.html), an
|
||||||
|
[NFC card reader](https://docs.platypush.tech/en/latest/platypush/backend/nfc.html), a
|
||||||
|
[MIDI device](https://docs.platypush.tech/en/latest/platypush/backend/midi.html), a
|
||||||
|
[Telegram channel](https://docs.platypush.tech/en/latest/platypush/backend/chat.telegram.html), a
|
||||||
|
[Bluetooth scanner](https://docs.platypush.tech/en/latest/platypush/backend/bluetooth.scanner.ble.html) etc.).
|
||||||
|
|
||||||
They are background services that either listen for messages on channels (like
|
If a backend supports the execution of requests (e.g. HTTP, MQTT, Kafka, Websocket and TCP) then you can send requests
|
||||||
an [HTTP
|
to these services in JSON format. For example, in the case of the HTTP backend:
|
||||||
backend](https://docs.platypush.tech/en/latest/platypush/backend/http.html), an
|
|
||||||
[MQTT
|
|
||||||
instance](https://docs.platypush.tech/en/latest/platypush/backend/mqtt.html), a
|
|
||||||
[Kafka
|
|
||||||
instance](https://docs.platypush.tech/en/latest/platypush/backend/kafka.html),
|
|
||||||
a [Websocket
|
|
||||||
service](https://docs.platypush.tech/en/latest/platypush/backend/websocket.html),
|
|
||||||
[Pushbullet](https://docs.platypush.tech/en/latest/platypush/backend/pushbullet.html)
|
|
||||||
etc.) or monitor a device or a service for events (like a
|
|
||||||
[sensor](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html),
|
|
||||||
a custom [voice
|
|
||||||
assistant](https://docs.platypush.tech/en/latest/platypush/backend/assistant.google.html),
|
|
||||||
a bridge running on a
|
|
||||||
[Zigbee](https://docs.platypush.tech/en/latest/platypush/backend/zigbee.mqtt.html)
|
|
||||||
or
|
|
||||||
[Z-Wave](https://docs.platypush.tech/en/latest/platypush/backend/zwave.html),
|
|
||||||
an [NFC card
|
|
||||||
reader](https://docs.platypush.tech/en/latest/platypush/backend/nfc.html), a
|
|
||||||
[MIDI
|
|
||||||
device](https://docs.platypush.tech/en/latest/platypush/backend/midi.html), a
|
|
||||||
[Telegram
|
|
||||||
channel](https://docs.platypush.tech/en/latest/platypush/backend/chat.telegram.html),
|
|
||||||
a [Bluetooth
|
|
||||||
scanner](https://docs.platypush.tech/en/latest/platypush/backend/bluetooth.scanner.ble.html)
|
|
||||||
etc.).
|
|
||||||
|
|
||||||
If a backend supports the execution of requests (e.g. HTTP, MQTT, Kafka,
|
|
||||||
Websocket and TCP) then you can send requests to these services in JSON format.
|
|
||||||
For example, in the case of the HTTP backend:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# Get a token
|
# Get a token
|
||||||
curl -XPOST -H 'Content-Type: application/json' -d '
|
curl -XPOST -H 'Content-Type: application/json' -d '
|
||||||
{
|
{
|
||||||
"username": "$YOUR_USER",
|
"username": "$YOUR_USER",
|
||||||
"password": "$YOUR_PASSWORD"
|
"password": "$YOUR_PASSWORD"
|
||||||
}' http://host:8008/auth
|
}' http://host:8008/auth
|
||||||
|
|
||||||
# Execute a request
|
# Execute a request
|
||||||
|
|
||||||
curl -XPOST -H 'Content-Type: application/json' \
|
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||||
-H "Authorization: Bearer $YOUR_TOKEN" -d '
|
|
||||||
{
|
{
|
||||||
"type": "request",
|
"type": "request",
|
||||||
"action": "tts.say",
|
"action": "tts.say",
|
||||||
|
@ -236,38 +154,33 @@ curl -XPOST -H 'Content-Type: application/json' \
|
||||||
}' http://host:8008/execute
|
}' http://host:8008/execute
|
||||||
```
|
```
|
||||||
|
|
||||||
### Events
|
### [Events](https://docs.platypush.tech/en/latest/events.html)
|
||||||
|
|
||||||
[Full list](https://docs.platypush.tech/en/latest/events.html)
|
When a certain event occurs (e.g. a JSON request is received, or a
|
||||||
|
[Bluetooth device is connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
|
||||||
When a certain event occurs (e.g. a JSON request is received, or a [Bluetooth
|
or a
|
||||||
device is
|
[Flic button is pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
|
||||||
connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
|
or some
|
||||||
or a [Flic button is
|
[speech is detected on the voice assistant service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
|
||||||
pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
|
or an
|
||||||
or some [speech is detected on the voice assistant
|
[RSS feed has new items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
|
||||||
service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
|
or a
|
||||||
or an [RSS feed has new
|
[new email is received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
|
||||||
items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
|
or a
|
||||||
or a [new email is
|
[new track is played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
|
||||||
received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
|
or an
|
||||||
or a [new track is
|
[NFC tag is detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
|
||||||
played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
|
or
|
||||||
or an [NFC tag is
|
[new sensor data is available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
|
||||||
detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
|
or
|
||||||
or [new sensor data is
|
[a value of a Zigbee device changes](https://docs.platypush.tech/en/latest/platypush/events/zigbee.mqtt.html#platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent),
|
||||||
available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
|
etc.), the associated backend will trigger an [event](https://docs.platypush.tech/en/latest/events.html).
|
||||||
or [a value of a Zigbee device
|
|
||||||
changes](https://docs.platypush.tech/en/latest/platypush/events/zigbee.mqtt.html#platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent),
|
|
||||||
etc.), the associated backend will trigger an
|
|
||||||
[event](https://docs.platypush.tech/en/latest/events.html).
|
|
||||||
|
|
||||||
### Hooks
|
### Hooks
|
||||||
|
|
||||||
Event hooks are custom pieces of logic that will be run when a certain event is
|
Event hooks are custom pieces of logic that will be run when a certain event is triggered. Hooks are the glue that
|
||||||
triggered. Hooks are the glue that connects events to actions, exposing a
|
connects events to actions, exposing a paradigm similar to IFTTT (_if a certain event happens then run these actions_).
|
||||||
paradigm similar to IFTTT (_if a certain event happens then run these
|
They can declared as:
|
||||||
actions_). They can declared as:
|
|
||||||
|
|
||||||
- Sections of the [`config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml).
|
- Sections of the [`config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml).
|
||||||
Example:
|
Example:
|
||||||
|
@ -291,10 +204,9 @@ event.hook.SearchSongVoiceCommand:
|
||||||
resource: ${output[0]['file']}
|
resource: ${output[0]['file']}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Stand-alone Python scripts stored under `~/.config/platypush/scripts` and
|
- Stand-alone Python scripts stored under `~/.config/platypush/scripts` and will be dynamically imported at start time.
|
||||||
will be dynamically imported at start time.
|
|
||||||
[Example](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/hook.py):
|
[Example](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/hook.py):
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from platypush.event.hook import hook
|
from platypush.event.hook import hook
|
||||||
from platypush.utils import run
|
from platypush.utils import run
|
||||||
|
@ -313,17 +225,13 @@ def on_music_play_command(event, title=None, artist=None, **context):
|
||||||
|
|
||||||
### Procedures
|
### Procedures
|
||||||
|
|
||||||
Procedures are pieces of custom logic that can be executed as atomic actions
|
Procedures are pieces of custom logic that can be executed as atomic actions using `procedure.<name>` as an action name.
|
||||||
using `procedure.<name>` as an action name.
|
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` -
|
||||||
|
provided that the procedure is also imported in `~/.config/platypush/scripts/__init__.py` so it can be discovered by
|
||||||
|
the service.
|
||||||
|
|
||||||
They can be defined either in the `config.yaml` or as Python scripts stored
|
YAML example for a procedure that can be executed when we arrive home and turns on the lights if the luminosity is lower
|
||||||
under `~/.config/platypush/scripts` - provided that the procedure is also
|
that a certain thresholds, says a welcome home message using the TTS engine and starts playing the music:
|
||||||
imported in `~/.config/platypush/scripts/__init__.py` so it can be discovered
|
|
||||||
by the service.
|
|
||||||
|
|
||||||
YAML example for a procedure that can be executed when we arrive home and turns
|
|
||||||
on the lights if the luminosity is lower that a certain thresholds, says a
|
|
||||||
welcome home message using the TTS engine and starts playing the music:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
procedure.at_home:
|
procedure.at_home:
|
||||||
|
@ -346,7 +254,7 @@ procedure.at_home:
|
||||||
Python example:
|
Python example:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Content of ~/.config/platypush/scripts/home.py
|
# Content of ~/.config/platypush/scripts/home.py
|
||||||
from platypush.procedure import procedure
|
from platypush.procedure import procedure
|
||||||
from platypush.utils import run
|
from platypush.utils import run
|
||||||
|
|
||||||
|
@ -360,12 +268,11 @@ def at_home(**context):
|
||||||
run('music.mpd.play')
|
run('music.mpd.play')
|
||||||
```
|
```
|
||||||
|
|
||||||
In either case, you can easily trigger the at-home procedure by sending an
|
In either case, you can easily trigger the at-home procedure by sending an action request message to a backend - for
|
||||||
action request message to a backend - for example, over the HTTP backend:
|
example, over the HTTP backend:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
curl -XPOST -H 'Content-Type: application/json' \
|
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||||
-H "Authorization: Bearer $YOUR_TOKEN" -d '
|
|
||||||
{
|
{
|
||||||
"type": "request",
|
"type": "request",
|
||||||
"action": "procedure.at_home"
|
"action": "procedure.at_home"
|
||||||
|
@ -374,18 +281,15 @@ curl -XPOST -H 'Content-Type: application/json' \
|
||||||
|
|
||||||
### Cronjobs
|
### Cronjobs
|
||||||
|
|
||||||
Cronjobs are pieces of logic that will be run at regular intervals, expressed
|
Cronjobs are pieces of logic that will be run at regular intervals, expressed in crontab-compatible syntax.
|
||||||
in crontab-compatible syntax. They can be defined either in the `config.yaml`
|
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` as
|
||||||
or as Python scripts stored under `~/.config/platypush/scripts` as functions
|
functions labelled by the `@cron` decorator.
|
||||||
labelled by the `@cron` decorator.
|
|
||||||
|
|
||||||
Note that seconds are also supported (unlike the standard crontab definition),
|
Note that seconds are also supported (unlike the standard crontab definition), but, for back-compatibility with the
|
||||||
but, for back-compatibility with the standard crontab format, they are at the
|
standard crontab format, they are at the end of the cron expression, so the expression is actually in the format
|
||||||
end of the cron expression, so the expression is actually in the format
|
|
||||||
`<minute> <hour> <day_of_month> <month> <day_of_week> <second>`.
|
`<minute> <hour> <day_of_month> <month> <day_of_week> <second>`.
|
||||||
|
|
||||||
YAML example for a cronjob that is executed every 30 seconds and checks if a
|
YAML example for a cronjob that is executed every 30 seconds and checks if a Bluetooth device is nearby:
|
||||||
Bluetooth device is nearby:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
cron.check_bt_device:
|
cron.check_bt_device:
|
||||||
|
@ -404,7 +308,7 @@ cron.check_bt_device:
|
||||||
Python example:
|
Python example:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# Content of ~/.config/platypush/scripts/bt_cron.py
|
# Content of ~/.config/platypush/scripts/bt_cron.py
|
||||||
from platypush.cron import cron
|
from platypush.cron import cron
|
||||||
from platypush.utils import run
|
from platypush.utils import run
|
||||||
|
|
||||||
|
@ -419,18 +323,15 @@ def check_bt_device(**context):
|
||||||
|
|
||||||
### The web interface
|
### The web interface
|
||||||
|
|
||||||
If
|
If [`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html) is enabled then a web interface
|
||||||
[`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html)
|
will be provided by default on `http://host:8008/`. Besides using the `/execute` endpoint for running requests, the
|
||||||
is enabled then a web interface will be provided by default on
|
built-in web server also provides a full-featured interface that groups together the controls for most of the plugins -
|
||||||
`http://host:8008/`. Besides using the `/execute` endpoint for running
|
e.g. sensors, switches, music controls and search, media library and torrent management, lights, Zigbee/Z-Wave devices
|
||||||
requests, the built-in web server also provides a full-featured interface that
|
and so on. The UI is responsive and mobile-friendly.
|
||||||
groups together the controls for most of the plugins - e.g. sensors, switches,
|
|
||||||
music controls and search, media library and torrent management, lights,
|
|
||||||
Zigbee/Z-Wave devices and so on. The UI is responsive and mobile-friendly.
|
|
||||||
|
|
||||||
The web service also provides means for the user to create [custom
|
The web service also provides means for the user to create
|
||||||
dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml)
|
[custom dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml) that can
|
||||||
that can be used to show information from multiple sources on a large screen.
|
be used to show information from multiple sources on a large screen.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
@ -439,69 +340,36 @@ that can be used to show information from multiple sources on a large screen.
|
||||||
Platypush uses Redis to deliver and store requests and temporary messages:
|
Platypush uses Redis to deliver and store requests and temporary messages:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# Example for Debian-based distributions
|
# Example for Debian-based distributions
|
||||||
[sudo] apt-get install redis-server
|
[sudo] apt-get install redis-server
|
||||||
|
|
||||||
# Enable and start the service
|
# Enable and start the service
|
||||||
[sudo] systemctl enable redis
|
[sudo] systemctl enable redis
|
||||||
[sudo] systemctl start redis
|
[sudo] systemctl start redis
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Install through `pip`
|
To install the core platform:
|
||||||
|
|
||||||
|
* The `pip` way:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[sudo] pip3 install platypush
|
[sudo] pip3 install platypush
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Install through a system package manager
|
* The sources way:
|
||||||
|
|
||||||
Note: currently only Arch Linux and derived distributions are supported.
|
|
||||||
|
|
||||||
You can either install the
|
|
||||||
[`platypush`](https://aur.archlinux.org/packages/platypush) package (for the
|
|
||||||
latest stable version) or the
|
|
||||||
[`platypush-git`](https://aur.archlinux.org/packages/platypush-git) package
|
|
||||||
(for the latest git version) through your favourite AUR package manager. For
|
|
||||||
example, using `yay`:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
yay platypush
|
|
||||||
# Or
|
|
||||||
yay platypush-git
|
|
||||||
```
|
|
||||||
|
|
||||||
The Arch Linux packages on AUR are automatically updated upon new git commits
|
|
||||||
or tags.
|
|
||||||
|
|
||||||
#### Install from sources
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git clone https://git.platypush.tech/platypush/platypush.git
|
git clone https://git.platypush.tech/platypush/platypush.git
|
||||||
cd platypush
|
cd platypush
|
||||||
[sudo] pip install .
|
|
||||||
# Or
|
|
||||||
[sudo] python3 setup.py install
|
[sudo] python3 setup.py install
|
||||||
```
|
```
|
||||||
|
|
||||||
### Installing the dependencies for your extensions
|
Then install the extensions that you wish to use. There are a few ways to check the dependencies required by an
|
||||||
|
extension:
|
||||||
|
|
||||||
After installing the base platform, you may want to check the dependencies and
|
#### Check their `extras` name in [`extras_require` under `setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72).
|
||||||
configuration required by the extensions that you wish to use. There are a few
|
|
||||||
ways to check the dependencies required by an extension:
|
|
||||||
|
|
||||||
#### Install via `extras` name
|
If you follow this route then you can install the extra dependencies in one of the following ways:
|
||||||
|
|
||||||
All the extensions that require extra dependencies are listed in the
|
|
||||||
[`extras_require` section under
|
|
||||||
`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72).
|
|
||||||
|
|
||||||
#### Install via `manifest.yaml`
|
|
||||||
|
|
||||||
All the plugins and backends have a `manifest.yaml` file in their source folder.
|
|
||||||
Any extra dependencies are listed there
|
|
||||||
|
|
||||||
If you followed the `extras` or `manifest.yaml` way to discover the
|
|
||||||
dependencies, then you can install them in two ways:
|
|
||||||
|
|
||||||
1. `pip` installation:
|
1. `pip` installation:
|
||||||
|
|
||||||
|
@ -515,18 +383,25 @@ dependencies, then you can install them in two ways:
|
||||||
cd $DIR_TO_PLATYPUSH
|
cd $DIR_TO_PLATYPUSH
|
||||||
[sudo] pip3 install '.[extra1,extra2,extra3]'
|
[sudo] pip3 install '.[extra1,extra2,extra3]'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Check the dependencies/installation instructions reported under the plugin/backend documentation.
|
||||||
|
|
||||||
#### Check the instructions reported in the documentation
|
If you follow this route then simply run the commands listed in the plugin/backend documentation to get the dependencies
|
||||||
|
installed.
|
||||||
|
|
||||||
If you follow this route then simply run the commands listed in the
|
#### Check/uncomment the associated lines in [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt).
|
||||||
[plugin/backend documentation](https://docs.platypush.tech) to get the
|
|
||||||
dependencies installed.
|
|
||||||
|
|
||||||
After installing the dependencies, create a configuration file under
|
If you follow this route then uncomment the lines in
|
||||||
`~/.config/platypush/config.yaml` (the application can load the configuration
|
[`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) associated to the
|
||||||
from another location through the `-c` option) containing the configuration of
|
plugins/backends that you want to use and run:
|
||||||
the backend and plugins that you want to use, and add any hooks and procedures
|
|
||||||
for your use case.
|
```shell
|
||||||
|
[sudo] pip3 install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
After installing the dependencies, create a configuration file under `~/.config/platypush/config.yaml` (the application
|
||||||
|
can load the configuration from another location through the `-c` option) containing the configuration of the backend
|
||||||
|
and plugins that you want to use, and add any hooks and procedures for your use case.
|
||||||
|
|
||||||
You can then start the service by simply running:
|
You can then start the service by simply running:
|
||||||
|
|
||||||
|
@ -535,100 +410,85 @@ platypush
|
||||||
```
|
```
|
||||||
|
|
||||||
It's advised to run it as a systemd service though - simply copy the provided
|
It's advised to run it as a systemd service though - simply copy the provided
|
||||||
[`.service`
|
[`.service` file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service) to
|
||||||
file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service)
|
`~/.config/systemd/user`, check if the path of `platypush` matches the path where it's installed on your system, and
|
||||||
to `~/.config/systemd/user`, check if the path of `platypush` matches the path
|
start the service via `systemctl`:
|
||||||
where it's installed on your system, and start the service via `systemctl`:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
systemctl --user start platypush
|
systemctl --user start platypush
|
||||||
```
|
```
|
||||||
|
|
||||||
### Virtual environment installation
|
### [Virtual environment installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-virtual-environment)
|
||||||
|
|
||||||
Platypush provides a script named `platyvenv` that can parse a `config.yaml`
|
Platypush provides a script named `platyvenv` that can parse a `config.yaml` and automatically create a virtual
|
||||||
and automatically create a virtual environment (under
|
environment (under `~/.local/share/platypush/venv/<device_id>`) with all the dependencies required by the configured
|
||||||
`~/.local/share/platypush/venv/<device_id>`) with all the dependencies required
|
integrations.
|
||||||
by the configured integrations.
|
|
||||||
|
|
||||||
1. Create the environment from a configuration file:
|
1. Create the environment from a configuration file:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platyvenv build -c /path/to/config.yaml
|
platyvenv build -c /path/to/config.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Start the service from the virtual environment:
|
2. Start the service from the virtual environment:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# device_id matches either the hostname or the device_id in config.yaml
|
# device_id matches either the hostname or the device_id in config.yaml
|
||||||
platyvenv start device_id
|
platyvenv start device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Stop the instance:
|
3. Stop the instance:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platyvenv stop device_id
|
platyvenv stop device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Remove the instance:
|
4. Remove the instance:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platyvenv rm device_id
|
platyvenv rm device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
[Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-virtual-environment)
|
### [Docker installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-container)
|
||||||
|
|
||||||
### Docker installation
|
You can also install Platypush in a container - the application provides a script named `platydock` that automatically
|
||||||
|
creates a container instance from a `config.yaml`:
|
||||||
You can also install Platypush in a container - the application provides a
|
|
||||||
script named `platydock` that automatically creates a container instance from a
|
|
||||||
`config.yaml`:
|
|
||||||
|
|
||||||
1. Create the container from a configuration file:
|
1. Create the container from a configuration file:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platydock build -c /path/to/config.yaml
|
platydock build -c /path/to/config.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Start the container:
|
2. Start the container:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# device_id matches either the hostname or the device_id in config.yaml
|
# device_id matches either the hostname or the device_id in config.yaml
|
||||||
platydock start device_id
|
platydock start device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Stop the instance:
|
3. Stop the instance:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platydock stop device_id
|
platydock stop device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Remove the instance:
|
4. Remove the instance:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
platydock rm device_id
|
platydock rm device_id
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that both the virtual environment and Docker container option offer the
|
|
||||||
possibility to include extra YAML configuration files in the main `config.yaml`
|
|
||||||
through the `include` directive (as long as they are in the same folder as the
|
|
||||||
main `config.yaml`), as well as external Python scripts in a `scripts`
|
|
||||||
directory in the same folder as the `config.yaml`.
|
|
||||||
|
|
||||||
[Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-container)
|
|
||||||
|
|
||||||
## Mobile app
|
## Mobile app
|
||||||
|
|
||||||
An [official Android
|
An [official Android app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on the F-Droid store.
|
||||||
app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on
|
It allows to easily discover and manage multiple Platypush services on a network through the web interface, and it
|
||||||
the F-Droid store. It allows to easily discover and manage multiple Platypush
|
easily brings the power of Platypush to your fingertips.
|
||||||
services on a network through the web interface, and it easily brings the power
|
|
||||||
of Platypush to your fingertips.
|
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
To run the tests simply run `pytest` either from the project root folder or the
|
To run the tests simply run `pytest` either from the project root folder or the `tests/` folder.
|
||||||
`tests/` folder. Or run the following command from the project root folder:
|
Or run the following command from the project root folder:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
python -m tests
|
python -m tests
|
||||||
|
@ -640,11 +500,10 @@ python -m tests
|
||||||
|
|
||||||
If you use and love Platypush, please consider [buying me a coffee/beer](https://paypal.me/fabiomanganiello).
|
If you use and love Platypush, please consider [buying me a coffee/beer](https://paypal.me/fabiomanganiello).
|
||||||
|
|
||||||
I've been working on Platypush all by myself in my spare time for the past few
|
I've been working on Platypush all by myself in my spare time for the past few years, and I've made sure that it remains
|
||||||
years, and I've made sure that it remains open and free.
|
open and free.
|
||||||
|
|
||||||
If you like this product, please consider supporting - I'm definitely not
|
If you like this product, please consider supporting - I'm definitely not planning to get rich with this project, but
|
||||||
planning to get rich with this project, but I'd love to have at least the costs
|
I'd love to have at least the costs for the server covered by users.
|
||||||
for the server covered by users.
|
|
||||||
|
|
||||||
Issues and requests opened by donors will also be given priority over others.
|
Issues and requests opened by donors will also be given priority over others.
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 12 KiB |
Binary file not shown.
Before Width: | Height: | Size: 20 KiB |
Binary file not shown.
Before Width: | Height: | Size: 8.1 KiB |
176
bin/platyvenv
176
bin/platyvenv
|
@ -6,12 +6,12 @@
|
||||||
# and automatically managed the required dependencies, as well as start, #
|
# and automatically managed the required dependencies, as well as start, #
|
||||||
# stop and remove them #
|
# stop and remove them #
|
||||||
# #
|
# #
|
||||||
# @author: Fabio Manganiello <fabio@platypush.tech> #
|
# @author: Fabio Manganiello <blacklight86@gmail.com> #
|
||||||
# @licence: MIT #
|
# @licence: MIT #
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
workdir="$HOME/.local/share/platypush/venv"
|
workdir=$HOME/.local/share/platypush/venv
|
||||||
|
|
||||||
function build {
|
function build {
|
||||||
cfgfile=
|
cfgfile=
|
||||||
|
@ -35,74 +35,88 @@ function build {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Parsing configuration file"
|
echo "Parsing configuration file"
|
||||||
pip_cmd=
|
deps=()
|
||||||
pkg_cmd=
|
|
||||||
includes=()
|
includes=()
|
||||||
cmd_exec=()
|
|
||||||
|
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
if echo "$line" | grep -E "^pip:\s*"; then
|
echo ${line} | egrep '``pip install .+?``' > /dev/null 2>&1
|
||||||
pip_cmd="$(echo "$line" | sed -r -e 's/^pip:\s*(.*)'/\\1/)"
|
if (( $? != 0 )); then
|
||||||
elif echo "$line" | grep -E "^packages:\s*"; then
|
continue
|
||||||
pkg_cmd="$(echo "$line" | sed -r -e 's/^packages:\s*(.*)'/\\1/)"
|
fi
|
||||||
elif echo "$line" | grep -E "^exec:\s*"; then
|
|
||||||
cmd_exec+=("$(echo "$line" | sed -r -e 's/^exec:\s*(.*)'/\\1/)")
|
dep=$(echo ${line} | sed -r -e 's/.*``pip install (.+?)``.*/\1/')
|
||||||
elif echo "$line" | grep -E "^include:\s*"; then
|
deps+=("$dep")
|
||||||
includes+=("$(echo "$line" | sed -r -e 's/^include:\s*(.*)'/\\1/)")
|
done <<< $(python <<EOF
|
||||||
elif echo "$line" | grep -E "^device_id:\s*"; then
|
|
||||||
device_id="$(echo "$line" | sed -r -e 's/^device_id:\s*(.*)'/\\1/)"
|
|
||||||
fi
|
|
||||||
done <<< "$(python <<EOF
|
|
||||||
from platypush.config import Config
|
from platypush.config import Config
|
||||||
from platypush.utils.manifest import get_install_commands_from_conf
|
from platypush.context import get_plugin, get_backend, register_backends
|
||||||
|
|
||||||
deps = get_install_commands_from_conf('$(realpath "${cfgfile}")')
|
Config.init('`realpath ${cfgfile}`')
|
||||||
print(f'device_id: {Config.get("device_id")}')
|
register_backends()
|
||||||
|
backend_config = Config.get_backends()
|
||||||
|
|
||||||
if deps.get('pip'):
|
for name in Config.get_backends().keys():
|
||||||
print(f'pip: {deps["pip"]}')
|
backend = get_backend(name)
|
||||||
|
print(backend.__doc__)
|
||||||
|
|
||||||
if deps.get('packages'):
|
for name in Config.get_plugins().keys():
|
||||||
print(f'packages: {deps["packages"]}')
|
try:
|
||||||
|
plugin = get_plugin(name)
|
||||||
|
print(plugin.__doc__)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
for cmd in deps.get('exec', []):
|
while read -r include; do
|
||||||
print(f'exec: {cmd}')
|
includes+=(${include})
|
||||||
|
done <<< $(python <<EOF
|
||||||
|
from platypush.config import Config
|
||||||
|
from platypush.context import get_plugin, get_backend, register_backends
|
||||||
|
|
||||||
|
Config.init('`realpath ${cfgfile}`')
|
||||||
|
|
||||||
for include in Config._included_files:
|
for include in Config._included_files:
|
||||||
print(f'include: {include}')
|
print(include)
|
||||||
EOF
|
EOF
|
||||||
)"
|
)
|
||||||
|
|
||||||
envdir="${workdir}/${device_id}"
|
device_id=$(python <<EOF
|
||||||
etcdir="${envdir}/etc/platypush"
|
from platypush.config import Config
|
||||||
|
|
||||||
|
Config.init('`realpath ${cfgfile}`')
|
||||||
|
print(Config.get('device_id'))
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
envdir=${workdir}/${device_id}
|
||||||
|
etcdir=${envdir}/etc/platypush
|
||||||
|
|
||||||
echo "Preparing virtual environment for device $device_id"
|
echo "Preparing virtual environment for device $device_id"
|
||||||
mkdir -p "$envdir"
|
mkdir -p "$envdir"
|
||||||
mkdir -p "$etcdir"
|
mkdir -p "$etcdir"
|
||||||
srcdir=$(dirname "$cfgfile")
|
srcdir=`dirname "$cfgfile"`
|
||||||
|
|
||||||
for ((i=0; i < ${#includes[@]}; i++)); do
|
for ((i=0; $i < ${#includes[@]}; i++)); do
|
||||||
incdir=$(dirname "${includes[$i]}")
|
incdir=`dirname "${includes[$i]}"`
|
||||||
incdir=$(realpath --relative-to="$srcdir" "$incdir")
|
incdir=`realpath --relative-to="$srcdir" "$incdir"`
|
||||||
destdir="$etcdir/$incdir"
|
destdir="$etcdir/$incdir"
|
||||||
mkdir -p "$destdir"
|
mkdir -p "$destdir"
|
||||||
cp "${includes[$i]}" "$destdir"
|
cp "${includes[$i]}" "$destdir"
|
||||||
done
|
done
|
||||||
|
|
||||||
cp "$cfgfile" "$etcdir/config.yaml"
|
cp "$cfgfile" "$etcdir/config.yaml"
|
||||||
cfgfile="${etcdir}/config.yaml"
|
cfgfile=${etcdir}/config.yaml
|
||||||
|
|
||||||
python3 -m venv "${envdir}"
|
python3 -m venv ${envdir}
|
||||||
cd "${envdir}" || exit 1
|
cd ${envdir}
|
||||||
source "${envdir}/bin/activate"
|
source ${envdir}/bin/activate
|
||||||
|
|
||||||
echo "Installing required dependencies"
|
echo "Installing required dependencies"
|
||||||
# shellcheck disable=SC2086
|
|
||||||
[ -n "${pkg_cmd}" ] && sudo ${pkg_cmd}
|
|
||||||
[ -n "${pip_cmd}" ] && ${pip_cmd}
|
|
||||||
|
|
||||||
for ((i=0; i < ${#cmd_exec[@]}; i++)); do
|
for ((i=0; $i < ${#deps[@]}; i++)); do
|
||||||
${cmd_exec[$i]}
|
echo ${deps[$i]}
|
||||||
|
done | sort -u | while read dep; do
|
||||||
|
pip install ${dep}
|
||||||
done
|
done
|
||||||
|
|
||||||
pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git
|
pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git
|
||||||
|
@ -116,41 +130,44 @@ function start {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
env=$1
|
env=$1
|
||||||
envdir="${workdir}/${env}"
|
envdir=${workdir}/${env}
|
||||||
rundir="${envdir}/var/run"
|
logsdir=${envdir}/var/log/platypush
|
||||||
pidfile="${rundir}/platypush.pid"
|
rundir=${envdir}/var/run
|
||||||
cfgfile="${envdir}/etc/platypush/config.yaml"
|
pidfile=${rundir}/platypush.pid
|
||||||
|
cfgfile=${envdir}/etc/platypush/config.yaml
|
||||||
|
|
||||||
if [[ ! -d "$envdir" ]]; then
|
if [[ ! -d "$envdir" ]]; then
|
||||||
echo "No such directory: $envdir" >&2
|
echo "No such directory: $envdir" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p "${rundir}"
|
mkdir -p ${logsdir}
|
||||||
|
mkdir -p ${rundir}
|
||||||
|
|
||||||
if [[ -f "$pidfile" ]]; then
|
if [[ -f "$pidfile" ]]; then
|
||||||
if pgrep -F "${pidfile}"; then
|
pid=`cat "$pidfile"`
|
||||||
echo "Another instance (PID $(cat "${pidfile}")) is running, please stop that instance first"
|
if ps -p ${pid} | grep platypush; then
|
||||||
|
echo "Another instance (PID $pid) is running, please stop that instance first"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "A PID file was found but the process does not seem to be running, starting anyway"
|
echo "A PID file was found but the process doesn't seem to be running, starting anyway"
|
||||||
rm -f "$pidfile"
|
rm -f "$pidfile"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python3 -m venv "${envdir}"
|
python3 -m venv ${envdir}
|
||||||
cd "${envdir}" || exit 1
|
cd ${envdir}
|
||||||
source bin/activate
|
source bin/activate
|
||||||
bin/platypush -c "$cfgfile" -P "$pidfile" &
|
bin/platypush -c "$cfgfile" -P "$pidfile" > ${logsdir}/stdout.log 2> ${logsdir}/stderr.log &
|
||||||
start_time=$(date +'%s')
|
start_time=`date +'%s'`
|
||||||
timeout=30
|
timeout=30
|
||||||
|
|
||||||
while :; do
|
while :; do
|
||||||
[[ -f "$pidfile" ]] && break
|
[[ -f "$pidfile" ]] && break
|
||||||
now=$(date +'%s')
|
now=`date +'%s'`
|
||||||
elapsed=$(( now-start_time ))
|
let elapsed=$now-$start_time
|
||||||
if (( elapsed >= timeout )); then
|
if (( ${elapsed} >= ${timeout} )); then
|
||||||
echo "Platypush instance '$env' did not start within $timeout seconds" >&2
|
echo "Platypush instance '$env' didn't start within $timeout seconds" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -158,11 +175,9 @@ function start {
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
|
||||||
pid=$(cat "$pidfile")
|
pid=`cat "$pidfile"`
|
||||||
echo
|
echo
|
||||||
echo "Platypush environment $env started with PID $pid"
|
echo "Platypush environment $env started with PID $pid, logs dir: $logsdir"
|
||||||
wait "${pid}"
|
|
||||||
echo "Platypush environment $env terminated"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop {
|
function stop {
|
||||||
|
@ -172,9 +187,9 @@ function stop {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
env=$1
|
env=$1
|
||||||
envdir="${workdir}/${env}"
|
envdir=${workdir}/${env}
|
||||||
rundir="${envdir}/var/run"
|
rundir=${envdir}/var/run
|
||||||
pidfile="${rundir}/platypush.pid"
|
pidfile=${rundir}/platypush.pid
|
||||||
|
|
||||||
if [[ ! -d "$envdir" ]]; then
|
if [[ ! -d "$envdir" ]]; then
|
||||||
echo "No such directory: $envdir" >&2
|
echo "No such directory: $envdir" >&2
|
||||||
|
@ -182,13 +197,12 @@ function stop {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f "$pidfile" ]]; then
|
if [[ ! -f "$pidfile" ]]; then
|
||||||
echo "No pidfile found for instance \"${env}\""
|
echo "No pidfile found for instance "${env}""
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pid=$(cat "$pidfile")
|
pid=`cat "$pidfile"`
|
||||||
pids="$pid $(ps --no-headers -o pid= --ppid "$pid")"
|
pids="$pid `ps --no-headers -o pid= --ppid $pid`"
|
||||||
# shellcheck disable=SC2086
|
|
||||||
kill -9 ${pids}
|
kill -9 ${pids}
|
||||||
rm -f "$pidfile"
|
rm -f "$pidfile"
|
||||||
echo "Instance '$env' with PID $pid stopped"
|
echo "Instance '$env' with PID $pid stopped"
|
||||||
|
@ -200,9 +214,9 @@ function rme {
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
envdir="${workdir}/$1"
|
envdir=${workdir}/$1
|
||||||
rundir="${envdir}/var/run"
|
rundir=${envdir}/var/run
|
||||||
pidfile="${rundir}/platypush.pid"
|
pidfile=${rundir}/platypush.pid
|
||||||
|
|
||||||
if [[ ! -d "$envdir" ]]; then
|
if [[ ! -d "$envdir" ]]; then
|
||||||
echo "No such directory: $envdir" >&2
|
echo "No such directory: $envdir" >&2
|
||||||
|
@ -210,18 +224,14 @@ function rme {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -f "$pidfile" ]]; then
|
if [[ -f "$pidfile" ]]; then
|
||||||
if pgrep -F "${pidfile}"; then
|
if ps -p `cat "$pidfile"` | grep platypush; then
|
||||||
echo "Another instance (PID $(cat "$pidfile")) is running, please stop that instance first"
|
echo "Another instance (PID $pidfile) is running, please stop that instance first"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "A PID file was found but the process does not seem to be running, removing anyway"
|
echo "A PID file was found but the process doesn't seem to be running, removing anyway"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "WARNING: This operation will permanently remove the Platypush environment $1"
|
|
||||||
echo -n "Are you sure you want to continue? (y/N) "
|
|
||||||
IFS= read -r answer
|
|
||||||
echo "$answer" | grep -E '^[yY]' >/dev/null || exit 0
|
|
||||||
rm -rf "$envdir"
|
rm -rf "$envdir"
|
||||||
echo "$envdir removed"
|
echo "$envdir removed"
|
||||||
}
|
}
|
||||||
|
@ -237,13 +247,13 @@ fi
|
||||||
|
|
||||||
action=$1
|
action=$1
|
||||||
shift
|
shift
|
||||||
mkdir -p "${workdir}"
|
mkdir -p ${workdir}
|
||||||
|
|
||||||
# shellcheck disable=SC2048,SC2086
|
|
||||||
case ${action} in
|
case ${action} in
|
||||||
'build') build $*;;
|
'build') build;;
|
||||||
'start') start $*;;
|
'start') start $*;;
|
||||||
'stop') stop $*;;
|
'stop') stop $*;;
|
||||||
'rm') rme $*;;
|
'rm') rme $*;;
|
||||||
*) usage;;
|
*) usage;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,10 @@ import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from random import randint
|
|
||||||
from typing import Union, List
|
from typing import Union, List
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
from docutils.parsers.rst import Directive
|
from docutils.parsers.rst import Directive
|
||||||
from marshmallow import fields
|
|
||||||
|
|
||||||
|
|
||||||
class SchemaDirective(Directive):
|
class SchemaDirective(Directive):
|
||||||
|
@ -24,43 +22,17 @@ class SchemaDirective(Directive):
|
||||||
|
|
||||||
sys.path.insert(0, _schemas_path)
|
sys.path.insert(0, _schemas_path)
|
||||||
|
|
||||||
@classmethod
|
@staticmethod
|
||||||
def _get_field_value(cls, field):
|
def _get_field_value(field) -> str:
|
||||||
metadata = getattr(field, 'metadata', {})
|
metadata = getattr(field, 'metadata', {})
|
||||||
if metadata.get('example'):
|
return metadata.get('example', metadata.get('description', str(field.__class__.__name__).lower()))
|
||||||
return metadata['example']
|
|
||||||
if metadata.get('description'):
|
|
||||||
return metadata['description']
|
|
||||||
|
|
||||||
if isinstance(field, fields.Number):
|
|
||||||
return randint(1, 99)
|
|
||||||
if isinstance(field, fields.Boolean):
|
|
||||||
return bool(randint(0, 1))
|
|
||||||
if isinstance(field, fields.URL):
|
|
||||||
return 'https://example.org'
|
|
||||||
if isinstance(field, fields.List):
|
|
||||||
return [cls._get_field_value(field.inner)]
|
|
||||||
if isinstance(field, fields.Dict):
|
|
||||||
return {
|
|
||||||
cls._get_field_value(field.key_field) if field.key_field else 'key':
|
|
||||||
cls._get_field_value(field.value_field) if field.value_field else 'value'
|
|
||||||
}
|
|
||||||
if isinstance(field, fields.Nested):
|
|
||||||
ret = {
|
|
||||||
name: cls._get_field_value(f)
|
|
||||||
for name, f in field.nested().fields.items()
|
|
||||||
}
|
|
||||||
|
|
||||||
return [ret] if field.many else ret
|
|
||||||
|
|
||||||
return str(field.__class__.__name__).lower()
|
|
||||||
|
|
||||||
def _parse_schema(self) -> Union[dict, List[dict]]:
|
def _parse_schema(self) -> Union[dict, List[dict]]:
|
||||||
m = self._schema_regex.match('\n'.join(self.content))
|
m = self._schema_regex.match('\n'.join(self.content))
|
||||||
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
|
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
|
||||||
schema_module = importlib.import_module(schema_module_name)
|
schema_module = importlib.import_module(schema_module_name)
|
||||||
schema_class = getattr(schema_module, m.group(1).split('.')[-1])
|
schema_class = getattr(schema_module, m.group(1).split('.')[-1])
|
||||||
schema_args = eval(f'dict({m.group(3)})') if m.group(3) else {}
|
schema_args = eval(f'dict({m.group(3)})')
|
||||||
schema = schema_class(**schema_args)
|
schema = schema_class(**schema_args)
|
||||||
output = {
|
output = {
|
||||||
name: self._get_field_value(field)
|
name: self._get_field_value(field)
|
||||||
|
|
|
@ -3,13 +3,15 @@ Backends
|
||||||
========
|
========
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
:caption: Backends:
|
:caption: Backends:
|
||||||
|
|
||||||
platypush/backend/adafruit.io.rst
|
platypush/backend/adafruit.io.rst
|
||||||
platypush/backend/alarm.rst
|
platypush/backend/alarm.rst
|
||||||
|
platypush/backend/assistant.rst
|
||||||
platypush/backend/assistant.google.rst
|
platypush/backend/assistant.google.rst
|
||||||
platypush/backend/assistant.snowboy.rst
|
platypush/backend/assistant.snowboy.rst
|
||||||
|
platypush/backend/bluetooth.rst
|
||||||
platypush/backend/bluetooth.fileserver.rst
|
platypush/backend/bluetooth.fileserver.rst
|
||||||
platypush/backend/bluetooth.pushserver.rst
|
platypush/backend/bluetooth.pushserver.rst
|
||||||
platypush/backend/bluetooth.scanner.rst
|
platypush/backend/bluetooth.scanner.rst
|
||||||
|
@ -17,7 +19,9 @@ Backends
|
||||||
platypush/backend/button.flic.rst
|
platypush/backend/button.flic.rst
|
||||||
platypush/backend/camera.pi.rst
|
platypush/backend/camera.pi.rst
|
||||||
platypush/backend/chat.telegram.rst
|
platypush/backend/chat.telegram.rst
|
||||||
|
platypush/backend/clipboard.rst
|
||||||
platypush/backend/covid19.rst
|
platypush/backend/covid19.rst
|
||||||
|
platypush/backend/dbus.rst
|
||||||
platypush/backend/file.monitor.rst
|
platypush/backend/file.monitor.rst
|
||||||
platypush/backend/foursquare.rst
|
platypush/backend/foursquare.rst
|
||||||
platypush/backend/github.rst
|
platypush/backend/github.rst
|
||||||
|
@ -40,7 +44,6 @@ Backends
|
||||||
platypush/backend/music.mopidy.rst
|
platypush/backend/music.mopidy.rst
|
||||||
platypush/backend/music.mpd.rst
|
platypush/backend/music.mpd.rst
|
||||||
platypush/backend/music.snapcast.rst
|
platypush/backend/music.snapcast.rst
|
||||||
platypush/backend/music.spotify.rst
|
|
||||||
platypush/backend/nextcloud.rst
|
platypush/backend/nextcloud.rst
|
||||||
platypush/backend/nfc.rst
|
platypush/backend/nfc.rst
|
||||||
platypush/backend/nodered.rst
|
platypush/backend/nodered.rst
|
||||||
|
@ -48,6 +51,7 @@ Backends
|
||||||
platypush/backend/pushbullet.rst
|
platypush/backend/pushbullet.rst
|
||||||
platypush/backend/redis.rst
|
platypush/backend/redis.rst
|
||||||
platypush/backend/scard.rst
|
platypush/backend/scard.rst
|
||||||
|
platypush/backend/sensor.rst
|
||||||
platypush/backend/sensor.accelerometer.rst
|
platypush/backend/sensor.accelerometer.rst
|
||||||
platypush/backend/sensor.arduino.rst
|
platypush/backend/sensor.arduino.rst
|
||||||
platypush/backend/sensor.battery.rst
|
platypush/backend/sensor.battery.rst
|
||||||
|
@ -60,8 +64,9 @@ Backends
|
||||||
platypush/backend/sensor.leap.rst
|
platypush/backend/sensor.leap.rst
|
||||||
platypush/backend/sensor.ltr559.rst
|
platypush/backend/sensor.ltr559.rst
|
||||||
platypush/backend/sensor.mcp3008.rst
|
platypush/backend/sensor.mcp3008.rst
|
||||||
platypush/backend/sensor.motion.pmw3901.rst
|
platypush/backend/sensor.motion.pwm3901.rst
|
||||||
platypush/backend/sensor.serial.rst
|
platypush/backend/sensor.serial.rst
|
||||||
|
platypush/backend/stt.rst
|
||||||
platypush/backend/stt.deepspeech.rst
|
platypush/backend/stt.deepspeech.rst
|
||||||
platypush/backend/stt.picovoice.hotword.rst
|
platypush/backend/stt.picovoice.hotword.rst
|
||||||
platypush/backend/stt.picovoice.speech.rst
|
platypush/backend/stt.picovoice.speech.rst
|
||||||
|
@ -69,6 +74,7 @@ Backends
|
||||||
platypush/backend/todoist.rst
|
platypush/backend/todoist.rst
|
||||||
platypush/backend/travisci.rst
|
platypush/backend/travisci.rst
|
||||||
platypush/backend/trello.rst
|
platypush/backend/trello.rst
|
||||||
|
platypush/backend/weather.rst
|
||||||
platypush/backend/weather.buienradar.rst
|
platypush/backend/weather.buienradar.rst
|
||||||
platypush/backend/weather.darksky.rst
|
platypush/backend/weather.darksky.rst
|
||||||
platypush/backend/weather.openweathermap.rst
|
platypush/backend/weather.openweathermap.rst
|
||||||
|
|
|
@ -71,7 +71,7 @@ master_doc = 'index'
|
||||||
#
|
#
|
||||||
# This is also used if you do content translation via gettext catalogs.
|
# This is also used if you do content translation via gettext catalogs.
|
||||||
# Usually you set "language" from the command line for these cases.
|
# Usually you set "language" from the command line for these cases.
|
||||||
language = 'en'
|
language = None
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
# List of patterns, relative to source directory, that match files and
|
||||||
# directories to ignore when looking for source files.
|
# directories to ignore when looking for source files.
|
||||||
|
@ -89,11 +89,8 @@ pygments_style = 'sphinx'
|
||||||
#
|
#
|
||||||
# html_theme = 'haiku'
|
# html_theme = 'haiku'
|
||||||
# html_theme = 'sphinx_rtd_theme'
|
# html_theme = 'sphinx_rtd_theme'
|
||||||
html_theme = 'sphinx_book_theme'
|
html_theme = 'sphinx_material'
|
||||||
|
|
||||||
html_title = 'Platypush Documentation'
|
|
||||||
html_logo = '../../assets/logo-64.png'
|
|
||||||
html_favicon = '../../platypush/backend/http/webapp/public/favicon.ico'
|
|
||||||
html_domain_indices = True
|
html_domain_indices = True
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
@ -101,12 +98,50 @@ html_domain_indices = True
|
||||||
# documentation.
|
# documentation.
|
||||||
#
|
#
|
||||||
html_theme_options = {
|
html_theme_options = {
|
||||||
'toc_title': 'Platypush documentation',
|
'nav_title': 'Platypush documentation',
|
||||||
'repository_url': 'https://git.platypush.tech/platypush/platypush',
|
'repo_url': 'https://git.platypush.tech/platypush/platypush',
|
||||||
'use_repository_button': True,
|
'repo_name': 'Source code',
|
||||||
'use_issues_button': True,
|
'repo_type': 'gitlab',
|
||||||
'use_fullscreen_button': True,
|
'color_primary': 'green',
|
||||||
'home_page_in_toc': True,
|
'color_accent': 'light-green',
|
||||||
|
'logo_icon': '🕮',
|
||||||
|
'nav_links': [
|
||||||
|
{
|
||||||
|
'href': 'https://platypush.tech/',
|
||||||
|
'title': 'Homepage',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://blog.platypush.tech/',
|
||||||
|
'title': 'Blog',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://git.platypush.tech/platypush/platypush',
|
||||||
|
'title': 'Repository',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://git.platypush.tech/platypush/platypush/-/wikis/home',
|
||||||
|
'title': 'Wiki',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://chrome.google.com/webstore/detail/platypush/aphldjclndofhflbbdnmpejbjgomkbie',
|
||||||
|
'title': 'Chrome Extension',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://addons.mozilla.org/en-US/firefox/addon/platypush/',
|
||||||
|
'title': 'Firefox Extension',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'href': 'https://f-droid.org/en/packages/tech.platypush.platypush/',
|
||||||
|
'title': 'Android App',
|
||||||
|
'internal': False,
|
||||||
|
},
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
@ -122,9 +157,9 @@ html_theme_options = {
|
||||||
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
||||||
# 'searchbox.html']``.
|
# 'searchbox.html']``.
|
||||||
#
|
#
|
||||||
# html_sidebars = {
|
html_sidebars = {
|
||||||
# '**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
|
'**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
|
||||||
# }
|
}
|
||||||
|
|
||||||
# -- Options for HTMLHelp output ---------------------------------------------
|
# -- Options for HTMLHelp output ---------------------------------------------
|
||||||
|
|
||||||
|
@ -138,12 +173,15 @@ latex_elements = {
|
||||||
# The paper size ('letterpaper' or 'a4paper').
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
#
|
#
|
||||||
# 'papersize': 'letterpaper',
|
# 'papersize': 'letterpaper',
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
#
|
#
|
||||||
# 'pointsize': '10pt',
|
# 'pointsize': '10pt',
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
# Additional stuff for the LaTeX preamble.
|
||||||
#
|
#
|
||||||
# 'preamble': '',
|
# 'preamble': '',
|
||||||
|
|
||||||
# Latex figure (float) alignment
|
# Latex figure (float) alignment
|
||||||
#
|
#
|
||||||
# 'figure_align': 'htbp',
|
# 'figure_align': 'htbp',
|
||||||
|
@ -153,7 +191,8 @@ latex_elements = {
|
||||||
# (source start file, target name, title,
|
# (source start file, target name, title,
|
||||||
# author, documentclass [howto, manual, or own class]).
|
# author, documentclass [howto, manual, or own class]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
(master_doc, 'platypush.tex', 'platypush Documentation', 'BlackLight', 'manual'),
|
(master_doc, 'platypush.tex', 'platypush Documentation',
|
||||||
|
'BlackLight', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -161,7 +200,10 @@ latex_documents = [
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [(master_doc, 'platypush', 'platypush Documentation', [author], 1)]
|
man_pages = [
|
||||||
|
(master_doc, 'platypush', 'platypush Documentation',
|
||||||
|
[author], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output ----------------------------------------------
|
# -- Options for Texinfo output ----------------------------------------------
|
||||||
|
@ -170,15 +212,9 @@ man_pages = [(master_doc, 'platypush', 'platypush Documentation', [author], 1)]
|
||||||
# (source start file, target name, title, author,
|
# (source start file, target name, title, author,
|
||||||
# dir menu entry, description, category)
|
# dir menu entry, description, category)
|
||||||
texinfo_documents = [
|
texinfo_documents = [
|
||||||
(
|
(master_doc, 'platypush', 'platypush Documentation',
|
||||||
master_doc,
|
author, 'platypush', 'One line description of project.',
|
||||||
'platypush',
|
'Miscellaneous'),
|
||||||
'platypush Documentation',
|
|
||||||
author,
|
|
||||||
'platypush',
|
|
||||||
'One line description of project.',
|
|
||||||
'Miscellaneous',
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -194,119 +230,100 @@ intersphinx_mapping = {'https://docs.python.org/': None}
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
||||||
todo_include_todos = True
|
todo_include_todos = True
|
||||||
|
|
||||||
autodoc_default_options = {
|
autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
|
||||||
'members': True,
|
'google.assistant.embedded',
|
||||||
'show-inheritance': True,
|
'google.assistant.library',
|
||||||
}
|
'google.assistant.library.event',
|
||||||
|
'google.assistant.library.file_helpers',
|
||||||
autodoc_mock_imports = [
|
'google.oauth2.credentials',
|
||||||
'googlesamples.assistant.grpc.audio_helpers',
|
'oauth2client',
|
||||||
'google.assistant.embedded',
|
'apiclient',
|
||||||
'google.assistant.library',
|
'tenacity',
|
||||||
'google.assistant.library.event',
|
'smartcard',
|
||||||
'google.assistant.library.file_helpers',
|
'Leap',
|
||||||
'google.oauth2.credentials',
|
'oauth2client',
|
||||||
'oauth2client',
|
'rtmidi',
|
||||||
'apiclient',
|
'bluetooth',
|
||||||
'tenacity',
|
'gevent.wsgi',
|
||||||
'smartcard',
|
'Adafruit_IO',
|
||||||
'Leap',
|
'pyperclip',
|
||||||
'oauth2client',
|
'dbus',
|
||||||
'rtmidi',
|
'inputs',
|
||||||
'bluetooth',
|
'inotify',
|
||||||
'gevent.wsgi',
|
'omxplayer',
|
||||||
'Adafruit_IO',
|
'plexapi',
|
||||||
'pyperclip',
|
'cwiid',
|
||||||
'pydbus',
|
'sounddevice',
|
||||||
'inputs',
|
'soundfile',
|
||||||
'inotify',
|
'numpy',
|
||||||
'omxplayer',
|
'cv2',
|
||||||
'plexapi',
|
'nfc',
|
||||||
'cwiid',
|
'ndef',
|
||||||
'sounddevice',
|
'bcrypt',
|
||||||
'soundfile',
|
'google',
|
||||||
'numpy',
|
'feedparser',
|
||||||
'cv2',
|
'kafka',
|
||||||
'nfc',
|
'googlesamples',
|
||||||
'ndef',
|
'icalendar',
|
||||||
'bcrypt',
|
'httplib2',
|
||||||
'google',
|
'mpd',
|
||||||
'feedparser',
|
'serial',
|
||||||
'kafka',
|
'pyHS100',
|
||||||
'googlesamples',
|
'grpc',
|
||||||
'icalendar',
|
'envirophat',
|
||||||
'httplib2',
|
'gps',
|
||||||
'mpd',
|
'picamera',
|
||||||
'serial',
|
'pwm3901',
|
||||||
'pyHS100',
|
'PIL',
|
||||||
'grpc',
|
'croniter',
|
||||||
'envirophat',
|
'pyaudio',
|
||||||
'gps',
|
'avs',
|
||||||
'picamera',
|
'PyOBEX',
|
||||||
'pmw3901',
|
'todoist',
|
||||||
'PIL',
|
'trello',
|
||||||
'croniter',
|
'telegram',
|
||||||
'pyaudio',
|
'telegram.ext',
|
||||||
'avs',
|
'pyfirmata2',
|
||||||
'PyOBEX',
|
'cups',
|
||||||
'todoist',
|
'graphyte',
|
||||||
'trello',
|
'cpuinfo',
|
||||||
'telegram',
|
'psutil',
|
||||||
'telegram.ext',
|
'openzwave',
|
||||||
'pyfirmata2',
|
'deepspeech',
|
||||||
'cups',
|
'wave',
|
||||||
'graphyte',
|
'pvporcupine ',
|
||||||
'cpuinfo',
|
'pvcheetah',
|
||||||
'psutil',
|
'pyotp',
|
||||||
'openzwave',
|
'linode_api4',
|
||||||
'deepspeech',
|
'pyzbar',
|
||||||
'wave',
|
'tensorflow',
|
||||||
'pvporcupine ',
|
'keras',
|
||||||
'pvcheetah',
|
'pandas',
|
||||||
'pyotp',
|
'samsungtvws',
|
||||||
'linode_api4',
|
'paramiko',
|
||||||
'pyzbar',
|
'luma',
|
||||||
'tensorflow',
|
'zeroconf',
|
||||||
'keras',
|
'dbus',
|
||||||
'pandas',
|
'gi',
|
||||||
'samsungtvws',
|
'gi.repository',
|
||||||
'paramiko',
|
'twilio',
|
||||||
'luma',
|
'pytz',
|
||||||
'zeroconf',
|
'Adafruit_Python_DHT',
|
||||||
'dbus',
|
'RPi.GPIO',
|
||||||
'gi',
|
'RPLCD',
|
||||||
'gi.repository',
|
'imapclient',
|
||||||
'twilio',
|
'pysmartthings',
|
||||||
'Adafruit_Python_DHT',
|
'aiohttp',
|
||||||
'RPi.GPIO',
|
'watchdog',
|
||||||
'RPLCD',
|
]
|
||||||
'imapclient',
|
|
||||||
'pysmartthings',
|
|
||||||
'aiohttp',
|
|
||||||
'watchdog',
|
|
||||||
'pyngrok',
|
|
||||||
'irc',
|
|
||||||
'irc.bot',
|
|
||||||
'irc.strings',
|
|
||||||
'irc.client',
|
|
||||||
'irc.connection',
|
|
||||||
'irc.events',
|
|
||||||
'defusedxml',
|
|
||||||
'nio',
|
|
||||||
'aiofiles',
|
|
||||||
'aiofiles.os',
|
|
||||||
'async_lru',
|
|
||||||
]
|
|
||||||
|
|
||||||
sys.path.insert(0, os.path.abspath('../..'))
|
sys.path.insert(0, os.path.abspath('../..'))
|
||||||
|
|
||||||
|
|
||||||
def skip(app, what, name, obj, skip, options):
|
def skip(app, what, name, obj, skip, options):
|
||||||
if name == "__init__":
|
if name == "__init__":
|
||||||
return False
|
return False
|
||||||
return skip
|
return skip
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
def setup(app):
|
||||||
app.connect("autodoc-skip-member", skip)
|
app.connect("autodoc-skip-member", skip)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ Events
|
||||||
======
|
======
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
:caption: Events:
|
:caption: Events:
|
||||||
|
|
||||||
platypush/events/adafruit.rst
|
platypush/events/adafruit.rst
|
||||||
|
@ -13,12 +13,10 @@ Events
|
||||||
platypush/events/bluetooth.rst
|
platypush/events/bluetooth.rst
|
||||||
platypush/events/button.flic.rst
|
platypush/events/button.flic.rst
|
||||||
platypush/events/camera.rst
|
platypush/events/camera.rst
|
||||||
platypush/events/chat.slack.rst
|
|
||||||
platypush/events/chat.telegram.rst
|
platypush/events/chat.telegram.rst
|
||||||
platypush/events/clipboard.rst
|
platypush/events/clipboard.rst
|
||||||
platypush/events/covid19.rst
|
platypush/events/covid19.rst
|
||||||
platypush/events/custom.rst
|
platypush/events/custom.rst
|
||||||
platypush/events/dbus.rst
|
|
||||||
platypush/events/distance.rst
|
platypush/events/distance.rst
|
||||||
platypush/events/file.rst
|
platypush/events/file.rst
|
||||||
platypush/events/foursquare.rst
|
platypush/events/foursquare.rst
|
||||||
|
@ -27,35 +25,27 @@ Events
|
||||||
platypush/events/google.rst
|
platypush/events/google.rst
|
||||||
platypush/events/google.fit.rst
|
platypush/events/google.fit.rst
|
||||||
platypush/events/google.pubsub.rst
|
platypush/events/google.pubsub.rst
|
||||||
platypush/events/gotify.rst
|
|
||||||
platypush/events/gpio.rst
|
|
||||||
platypush/events/gps.rst
|
platypush/events/gps.rst
|
||||||
platypush/events/http.rst
|
platypush/events/http.rst
|
||||||
platypush/events/http.hook.rst
|
platypush/events/http.hook.rst
|
||||||
platypush/events/http.rss.rst
|
platypush/events/http.rss.rst
|
||||||
platypush/events/inotify.rst
|
platypush/events/inotify.rst
|
||||||
platypush/events/irc.rst
|
|
||||||
platypush/events/joystick.rst
|
platypush/events/joystick.rst
|
||||||
platypush/events/kafka.rst
|
platypush/events/kafka.rst
|
||||||
platypush/events/light.rst
|
platypush/events/light.rst
|
||||||
platypush/events/linode.rst
|
platypush/events/linode.rst
|
||||||
platypush/events/log.http.rst
|
platypush/events/log.http.rst
|
||||||
platypush/events/mail.rst
|
platypush/events/mail.rst
|
||||||
platypush/events/matrix.rst
|
|
||||||
platypush/events/media.rst
|
platypush/events/media.rst
|
||||||
platypush/events/midi.rst
|
platypush/events/midi.rst
|
||||||
platypush/events/mqtt.rst
|
platypush/events/mqtt.rst
|
||||||
platypush/events/music.rst
|
platypush/events/music.rst
|
||||||
platypush/events/music.snapcast.rst
|
platypush/events/music.snapcast.rst
|
||||||
platypush/events/music.tidal.rst
|
|
||||||
platypush/events/nextcloud.rst
|
platypush/events/nextcloud.rst
|
||||||
platypush/events/nfc.rst
|
platypush/events/nfc.rst
|
||||||
platypush/events/ngrok.rst
|
|
||||||
platypush/events/ntfy.rst
|
|
||||||
platypush/events/ping.rst
|
platypush/events/ping.rst
|
||||||
platypush/events/pushbullet.rst
|
platypush/events/pushbullet.rst
|
||||||
platypush/events/qrcode.rst
|
platypush/events/qrcode.rst
|
||||||
platypush/events/rss.rst
|
|
||||||
platypush/events/scard.rst
|
platypush/events/scard.rst
|
||||||
platypush/events/sensor.rst
|
platypush/events/sensor.rst
|
||||||
platypush/events/sensor.ir.rst
|
platypush/events/sensor.ir.rst
|
||||||
|
@ -64,7 +54,6 @@ Events
|
||||||
platypush/events/serial.rst
|
platypush/events/serial.rst
|
||||||
platypush/events/sound.rst
|
platypush/events/sound.rst
|
||||||
platypush/events/stt.rst
|
platypush/events/stt.rst
|
||||||
platypush/events/sun.rst
|
|
||||||
platypush/events/tensorflow.rst
|
platypush/events/tensorflow.rst
|
||||||
platypush/events/todoist.rst
|
platypush/events/todoist.rst
|
||||||
platypush/events/torrent.rst
|
platypush/events/torrent.rst
|
||||||
|
@ -74,7 +63,6 @@ Events
|
||||||
platypush/events/weather.rst
|
platypush/events/weather.rst
|
||||||
platypush/events/web.rst
|
platypush/events/web.rst
|
||||||
platypush/events/web.widget.rst
|
platypush/events/web.widget.rst
|
||||||
platypush/events/websocket.rst
|
|
||||||
platypush/events/wiimote.rst
|
platypush/events/wiimote.rst
|
||||||
platypush/events/zeroborg.rst
|
platypush/events/zeroborg.rst
|
||||||
platypush/events/zeroconf.rst
|
platypush/events/zeroconf.rst
|
||||||
|
|
|
@ -3,20 +3,18 @@ Platypush
|
||||||
|
|
||||||
Welcome to the Platypush reference of available plugins, backends and event types.
|
Welcome to the Platypush reference of available plugins, backends and event types.
|
||||||
|
|
||||||
For more information on Platypush check out:
|
For more information on Platypush please check out:
|
||||||
|
|
||||||
* The `main page`_ of the project
|
* The `Gitlab page`_ of the project
|
||||||
* The `Gitea page`_ of the project
|
|
||||||
* The `online wiki`_ for quickstart and examples
|
* The `online wiki`_ for quickstart and examples
|
||||||
* The `Blog articles`_ for inspiration on use-cases possible projects
|
* The `Blog articles`_ for inspiration on use-cases possible projects
|
||||||
|
|
||||||
.. _main page: https://platypush.tech
|
.. _Gitlab page: https://git.platypush.tech/platypush/platypush
|
||||||
.. _Gitea page: https://git.platypush.tech/platypush/platypush
|
.. _online wiki: https://git.platypush.tech/platypush/platypush/-/wikis/home
|
||||||
.. _online wiki: https://git.platypush.tech/platypush/platypush/wiki
|
|
||||||
.. _Blog articles: https://blog.platypush.tech
|
.. _Blog articles: https://blog.platypush.tech
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 3
|
||||||
:caption: Contents:
|
:caption: Contents:
|
||||||
|
|
||||||
backends
|
backends
|
||||||
|
@ -30,3 +28,4 @@ Indices and tables
|
||||||
* :ref:`genindex`
|
* :ref:`genindex`
|
||||||
* :ref:`modindex`
|
* :ref:`modindex`
|
||||||
* :ref:`search`
|
* :ref:`search`
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``adafruit.io``
|
``platypush.backend.adafruit.io``
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.adafruit.io
|
.. automodule:: platypush.backend.adafruit.io
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``alarm``
|
``platypush.backend.alarm``
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.alarm
|
.. automodule:: platypush.backend.alarm
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``assistant.google``
|
``platypush.backend.assistant.google``
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.assistant.google
|
.. automodule:: platypush.backend.assistant.google
|
||||||
|
|
5
docs/source/platypush/backend/assistant.rst
Normal file
5
docs/source/platypush/backend/assistant.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.assistant``
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.assistant
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``assistant.snowboy``
|
``platypush.backend.assistant.snowboy``
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.assistant.snowboy
|
.. automodule:: platypush.backend.assistant.snowboy
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``bluetooth.fileserver``
|
``platypush.backend.bluetooth.fileserver``
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.bluetooth.fileserver
|
.. automodule:: platypush.backend.bluetooth.fileserver
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``bluetooth.pushserver``
|
``platypush.backend.bluetooth.pushserver``
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.bluetooth.pushserver
|
.. automodule:: platypush.backend.bluetooth.pushserver
|
||||||
|
|
5
docs/source/platypush/backend/bluetooth.rst
Normal file
5
docs/source/platypush/backend/bluetooth.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.bluetooth``
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.bluetooth
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``bluetooth.scanner.ble``
|
``platypush.backend.bluetooth.scanner.ble``
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.bluetooth.scanner.ble
|
.. automodule:: platypush.backend.bluetooth.scanner.ble
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``bluetooth.scanner``
|
``platypush.backend.bluetooth.scanner``
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.bluetooth.scanner
|
.. automodule:: platypush.backend.bluetooth.scanner
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``button.flic``
|
``platypush.backend.button.flic``
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.button.flic
|
.. automodule:: platypush.backend.button.flic
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``camera.pi``
|
``platypush.backend.camera.pi``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.camera.pi
|
.. automodule:: platypush.backend.camera.pi
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``chat.telegram``
|
``platypush.backend.chat.telegram``
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.chat.telegram
|
.. automodule:: platypush.backend.chat.telegram
|
||||||
|
|
5
docs/source/platypush/backend/clipboard.rst
Normal file
5
docs/source/platypush/backend/clipboard.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.clipboard``
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.clipboard
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``covid19``
|
``platypush.backend.covid19``
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.covid19
|
.. automodule:: platypush.backend.covid19
|
||||||
|
|
5
docs/source/platypush/backend/dbus.rst
Normal file
5
docs/source/platypush/backend/dbus.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.dbus``
|
||||||
|
==========================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.dbus
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``file.monitor``
|
``platypush.backend.file.monitor``
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.file.monitor
|
.. automodule:: platypush.backend.file.monitor
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``foursquare``
|
``platypush.backend.foursquare``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.foursquare
|
.. automodule:: platypush.backend.foursquare
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``github``
|
``platypush.backend.github``
|
||||||
============================
|
============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.github
|
.. automodule:: platypush.backend.github
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``google.fit``
|
``platypush.backend.google.fit``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.google.fit
|
.. automodule:: platypush.backend.google.fit
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``google.pubsub``
|
``platypush.backend.google.pubsub``
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.google.pubsub
|
.. automodule:: platypush.backend.google.pubsub
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``gps``
|
``platypush.backend.gps``
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.gps
|
.. automodule:: platypush.backend.gps
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``http.poll``
|
``platypush.backend.http.poll``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.http.poll
|
.. automodule:: platypush.backend.http.poll
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``http``
|
``platypush.backend.http``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.http
|
.. automodule:: platypush.backend.http
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``inotify``
|
``platypush.backend.inotify``
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.inotify
|
.. automodule:: platypush.backend.inotify
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``joystick.jstest``
|
``platypush.backend.joystick.jstest``
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.joystick.jstest
|
.. automodule:: platypush.backend.joystick.jstest
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``joystick.linux``
|
``platypush.backend.joystick.linux``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.joystick.linux
|
.. automodule:: platypush.backend.joystick.linux
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``joystick``
|
``platypush.backend.joystick``
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.joystick
|
.. automodule:: platypush.backend.joystick
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``kafka``
|
``platypush.backend.kafka``
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.kafka
|
.. automodule:: platypush.backend.kafka
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``light.hue``
|
``platypush.backend.light.hue``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.light.hue
|
.. automodule:: platypush.backend.light.hue
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``linode``
|
``platypush.backend.linode``
|
||||||
============================
|
============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.linode
|
.. automodule:: platypush.backend.linode
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``log.http``
|
``platypush.backend.log.http``
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.log.http
|
.. automodule:: platypush.backend.log.http
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``mail``
|
``platypush.backend.mail``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.mail
|
.. automodule:: platypush.backend.mail
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``midi``
|
``platypush.backend.midi``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.midi
|
.. automodule:: platypush.backend.midi
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``mqtt``
|
``platypush.backend.mqtt``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.mqtt
|
.. automodule:: platypush.backend.mqtt
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``music.mopidy``
|
``platypush.backend.music.mopidy``
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.music.mopidy
|
.. automodule:: platypush.backend.music.mopidy
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``music.mpd``
|
``platypush.backend.music.mpd``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.music.mpd
|
.. automodule:: platypush.backend.music.mpd
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``music.snapcast``
|
``platypush.backend.music.snapcast``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.music.snapcast
|
.. automodule:: platypush.backend.music.snapcast
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
``music.spotify``
|
|
||||||
===================================
|
|
||||||
|
|
||||||
.. automodule:: platypush.backend.music.spotify
|
|
||||||
:members:
|
|
|
@ -1,4 +1,4 @@
|
||||||
``nextcloud``
|
``platypush.backend.nextcloud``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.nextcloud
|
.. automodule:: platypush.backend.nextcloud
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``nfc``
|
``platypush.backend.nfc``
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.nfc
|
.. automodule:: platypush.backend.nfc
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``nodered``
|
``platypush.backend.nodered``
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.nodered
|
.. automodule:: platypush.backend.nodered
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``ping``
|
``platypush.backend.ping``
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.ping
|
.. automodule:: platypush.backend.ping
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``pushbullet``
|
``platypush.backend.pushbullet``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.pushbullet
|
.. automodule:: platypush.backend.pushbullet
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``redis``
|
``platypush.backend.redis``
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.redis
|
.. automodule:: platypush.backend.redis
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``scard``
|
``platypush.backend.scard``
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.scard
|
.. automodule:: platypush.backend.scard
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.accelerometer``
|
``platypush.backend.sensor.accelerometer``
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.accelerometer
|
.. automodule:: platypush.backend.sensor.accelerometer
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.arduino``
|
``platypush.backend.sensor.arduino``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.arduino
|
.. automodule:: platypush.backend.sensor.arduino
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.battery``
|
``platypush.backend.sensor.battery``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.battery
|
.. automodule:: platypush.backend.sensor.battery
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.bme280``
|
``platypush.backend.sensor.bme280``
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.bme280
|
.. automodule:: platypush.backend.sensor.bme280
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.dht``
|
``platypush.backend.sensor.dht``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.dht
|
.. automodule:: platypush.backend.sensor.dht
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.distance``
|
``platypush.backend.sensor.distance``
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.distance
|
.. automodule:: platypush.backend.sensor.distance
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.distance.vl53l1x``
|
``platypush.backend.sensor.distance.vl53l1x``
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.distance.vl53l1x
|
.. automodule:: platypush.backend.sensor.distance.vl53l1x
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.envirophat``
|
``platypush.backend.sensor.envirophat``
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.envirophat
|
.. automodule:: platypush.backend.sensor.envirophat
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.ir.zeroborg``
|
``platypush.backend.sensor.ir.zeroborg``
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.ir.zeroborg
|
.. automodule:: platypush.backend.sensor.ir.zeroborg
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.leap``
|
``platypush.backend.sensor.leap``
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.leap
|
.. automodule:: platypush.backend.sensor.leap
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.ltr559``
|
``platypush.backend.sensor.ltr559``
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.ltr559
|
.. automodule:: platypush.backend.sensor.ltr559
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.mcp3008``
|
``platypush.backend.sensor.mcp3008``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.mcp3008
|
.. automodule:: platypush.backend.sensor.mcp3008
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
``sensor.motion.pmw3901``
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.motion.pmw3901
|
|
||||||
:members:
|
|
5
docs/source/platypush/backend/sensor.motion.pwm3901.rst
Normal file
5
docs/source/platypush/backend/sensor.motion.pwm3901.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.sensor.motion.pwm3901``
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.sensor.motion.pwm3901
|
||||||
|
:members:
|
6
docs/source/platypush/backend/sensor.rst
Normal file
6
docs/source/platypush/backend/sensor.rst
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
``platypush.backend.sensor``
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.sensor
|
||||||
|
:members:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``sensor.serial``
|
``platypush.backend.sensor.serial``
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.sensor.serial
|
.. automodule:: platypush.backend.sensor.serial
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``stt.deepspeech``
|
``platypush.backend.stt.deepspeech``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.stt.deepspeech
|
.. automodule:: platypush.backend.stt.deepspeech
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``stt.picovoice.hotword``
|
``platypush.backend.stt.picovoice.hotword``
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.stt.picovoice.hotword
|
.. automodule:: platypush.backend.stt.picovoice.hotword
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``stt.picovoice.speech``
|
``platypush.backend.stt.picovoice.speech``
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.stt.picovoice.speech
|
.. automodule:: platypush.backend.stt.picovoice.speech
|
||||||
|
|
5
docs/source/platypush/backend/stt.rst
Normal file
5
docs/source/platypush/backend/stt.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.stt``
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.stt
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``tcp``
|
``platypush.backend.tcp``
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.tcp
|
.. automodule:: platypush.backend.tcp
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``todoist``
|
``platypush.backend.todoist``
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.todoist
|
.. automodule:: platypush.backend.todoist
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``travisci``
|
``platypush.backend.travisci``
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.travisci
|
.. automodule:: platypush.backend.travisci
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``trello``
|
``platypush.backend.trello``
|
||||||
============================
|
============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.trello
|
.. automodule:: platypush.backend.trello
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``weather.buienradar``
|
``platypush.backend.weather.buienradar``
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.weather.buienradar
|
.. automodule:: platypush.backend.weather.buienradar
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``weather.darksky``
|
``platypush.backend.weather.darksky``
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.weather.darksky
|
.. automodule:: platypush.backend.weather.darksky
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``weather.openweathermap``
|
``platypush.backend.weather.openweathermap``
|
||||||
============================================
|
============================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.weather.openweathermap
|
.. automodule:: platypush.backend.weather.openweathermap
|
||||||
|
|
5
docs/source/platypush/backend/weather.rst
Normal file
5
docs/source/platypush/backend/weather.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.backend.weather``
|
||||||
|
=============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.backend.weather
|
||||||
|
:members:
|
|
@ -1,4 +1,4 @@
|
||||||
``websocket``
|
``platypush.backend.websocket``
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.websocket
|
.. automodule:: platypush.backend.websocket
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``wiimote``
|
``platypush.backend.wiimote``
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.wiimote
|
.. automodule:: platypush.backend.wiimote
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``zigbee.mqtt``
|
``platypush.backend.zigbee.mqtt``
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.zigbee.mqtt
|
.. automodule:: platypush.backend.zigbee.mqtt
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``zwave.mqtt``
|
``platypush.backend.zwave.mqtt``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.zwave.mqtt
|
.. automodule:: platypush.backend.zwave.mqtt
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``zwave``
|
``platypush.backend.zwave``
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
.. automodule:: platypush.backend.zwave
|
.. automodule:: platypush.backend.zwave
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``adafruit``
|
``platypush.message.event.adafruit``
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
.. automodule:: platypush.message.event.adafruit
|
.. automodule:: platypush.message.event.adafruit
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``alarm``
|
``platypush.message.event.alarm``
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. automodule:: platypush.message.event.alarm
|
.. automodule:: platypush.message.event.alarm
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
``application``
|
``platypush.message.event.application``
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
.. automodule:: platypush.message.event.application
|
.. automodule:: platypush.message.event.application
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue