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
|
||||
/platypush/backend/http/static/css/dist
|
||||
/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
|
||||
|
||||
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
|
||||
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.
|
||||
Given the high speed of development in the first phase, changes are being reported only starting from v0.20.2.
|
||||
|
||||
## [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
|
||||
directly accessing the device's Bluetooth interface.
|
||||
|
||||
|
||||
- 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
|
||||
dictionaries and lists.
|
||||
|
||||
|
||||
- Support for custom MQTT timeout on all the `zwavejs2mqtt` calls.
|
||||
|
||||
- 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
|
||||
`python-inputs`.
|
||||
|
||||
|
||||
- Added PWM PCA9685 plugin.
|
||||
|
||||
- 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 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.
|
||||
|
||||
|
@ -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
|
||||
(see [#174](https://git.platypush.tech/platypush/platypush/-/issues/174)).
|
||||
|
||||
|
||||
- Added `weather.openweathermap` plugin and backend, which replaces `weather.darksky`, since the
|
||||
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,
|
||||
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.
|
||||
|
||||
- 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
|
||||
websocket clients though, so you can still debug Z-Wave values issues from the browser
|
||||
developer console (enable debug traces).
|
||||
|
||||
|
||||
- Added suffix to the `zigbee.mqtt` backend default `client_id` to prevent clashes with
|
||||
the default `mqtt` backend `client_id`.
|
||||
|
||||
|
|
|
@ -29,11 +29,9 @@ Guidelines:
|
|||
|
||||
- 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
|
||||
an `extras_require` entry.
|
||||
- In the plugin/backend class pydoc string.
|
||||
- In the `manifest.yaml` - refer to the Wiki (how to write
|
||||
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
|
||||
and [backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
|
||||
for examples on how to write an extension manifest file.
|
||||
an `extras_require` entry
|
||||
- In [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) -
|
||||
if the feature is optional then leave it commented and add a one-line comment to explain which
|
||||
plugin or backend requires it.
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
recursive-include platypush/backend/http/webapp/dist *
|
||||
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/)
|
||||
[![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/)
|
||||
[![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)
|
||||
[![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)
|
||||
|
||||
<!-- 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).
|
||||
|
||||
- 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.
|
||||
- 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.
|
||||
|
||||
- The [wiki](https://git.platypush.tech/platypush/platypush/wiki) also
|
||||
contains many resources on getting started.
|
||||
- The [wiki](https://git.platypush.tech/platypush/platypush/-/wikis/home) also contains many resources on getting started.
|
||||
|
||||
- Extensive documentation for all the available integrations and messages [is
|
||||
available](https://docs.platypush.tech/).
|
||||
- Extensive documentation for all the available integrations and messages [is available](https://docs.platypush.tech/).
|
||||
|
||||
- If you have issues/feature requests/enhancement ideas please [create an
|
||||
issue](https://git.platypush.tech/platypush/platypush/-/issues).
|
||||
- If you have issues/feature requests/enhancement ideas please [create an issue](https://git.platypush.tech/platypush/platypush/-/issues).
|
||||
|
||||
- A [Reddit channel](https://www.reddit.com/r/platypush) is also available for
|
||||
more general questions.
|
||||
|
||||
- A [Matrix instance](https://matrix.to/#/#platypush:matrix.platypush.tech) is
|
||||
also available if you are looking for more interactive support.
|
||||
- A [Reddit channel](https://www.reddit.com/r/platypush) is also available for more general questions.
|
||||
|
||||
---
|
||||
|
||||
Platypush is a general-purpose extensible platform for automation and
|
||||
integration across multiple services and devices.
|
||||
Platypush is a general-purpose extensible platform for automation and integration across multiple services and devices.
|
||||
|
||||
It enables users to create their own self-hosted pieces of automation based on
|
||||
events (*if this happens then do that*)
|
||||
and it provides a comprehensive and customizable user interface that collects
|
||||
everything you need to visualize and control under one roof.
|
||||
It enables users to create their own self-hosted pieces of automation based on events (*if this happens then do that*)
|
||||
and it provides a comprehensive and customizable user interface that collects everything you need to visualize and
|
||||
control under one roof.
|
||||
|
||||
It takes some concepts from [IFTTT](https://ifttt.com),
|
||||
[Tasker](https://tasker.joaoapps.com/), [Microsoft
|
||||
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 together.
|
||||
It takes some concepts from [IFTTT](https://ifttt.com), [Tasker](https://tasker.joaoapps.com/),
|
||||
[Microsoft 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
|
||||
together.
|
||||
|
||||
Its ideal home is a single-board computer like a RaspberryPi that you can
|
||||
configure to orchestrate any home automation and cloud automation in your own
|
||||
living room or garage, but it can easily run on any device that can run a
|
||||
Python interpreter, and the bar for the hardware requirements is very low as
|
||||
well - I use it to run pieces of automation on devices as powerful as a
|
||||
RaspberryPi Zero or an old Nokia N900 with Linux.
|
||||
Its ideal home is a single-board computer like a RaspberryPi that you can configure to orchestrate any home automation
|
||||
and cloud automation in your own living room or garage, but it can easily run on any device that can run a Python
|
||||
interpreter, and the bar for the hardware requirements is very low as 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:
|
||||
|
||||
|
@ -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)
|
||||
- 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),
|
||||
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html)
|
||||
and [machine learning
|
||||
models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html)
|
||||
to create smart
|
||||
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html) and
|
||||
[machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html) to create smart
|
||||
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)
|
||||
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)
|
||||
- [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)
|
||||
- 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
|
||||
- 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
|
||||
- [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)
|
||||
- Build your own web dashboard with calendar, weather, news and music controls
|
||||
(basically, anything that has a Platypush web widget)
|
||||
- Build your own web dashboard with calendar, weather, news and music controls (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))
|
||||
|
||||
## Architecture
|
||||
|
||||
The architecture of Platypush consists of a few simple pieces, orchestrated by
|
||||
a configuration file stored by default under
|
||||
[`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml):
|
||||
The architecture of Platypush consists of a few simple pieces, orchestrated by a configuration file stored by default
|
||||
under [`~/.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
|
||||
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.
|
||||
|
||||
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:
|
||||
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
|
||||
light.hue:
|
||||
|
@ -163,11 +100,9 @@ light.hue:
|
|||
|
||||
### Actions
|
||||
|
||||
Plugins expose *actions*, that match one-on-one the plugin class methods
|
||||
denoted by `@action`, so it's very straightforward to invoke plugin actions by
|
||||
just reading the plugin documentation. They can be invoked directly from your
|
||||
own scripts or they can be sent to the platform through any supported channel
|
||||
as simple JSON messages:
|
||||
Plugins expose *actions*, that match one-on-one the plugin class methods denoted by `@action`, so it's very
|
||||
straightforward to invoke plugin actions by just reading the plugin documentation. They can be invoked directly from
|
||||
your own scripts or they can be sent to the platform through any supported channel as simple JSON messages:
|
||||
|
||||
```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
|
||||
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.).
|
||||
|
||||
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:
|
||||
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
|
||||
# Get a token
|
||||
# Get a token
|
||||
curl -XPOST -H 'Content-Type: application/json' -d '
|
||||
{
|
||||
"username": "$YOUR_USER",
|
||||
"password": "$YOUR_PASSWORD"
|
||||
}' http://host:8008/auth
|
||||
|
||||
# Execute a request
|
||||
# Execute a request
|
||||
|
||||
curl -XPOST -H 'Content-Type: application/json' \
|
||||
-H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||
{
|
||||
"type": "request",
|
||||
"action": "tts.say",
|
||||
|
@ -236,38 +154,33 @@ curl -XPOST -H 'Content-Type: application/json' \
|
|||
}' 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),
|
||||
or a [Flic button is
|
||||
pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
|
||||
or some [speech is detected on the voice assistant
|
||||
service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
|
||||
or an [RSS feed has new
|
||||
items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
|
||||
or a [new email is
|
||||
received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
|
||||
or a [new track is
|
||||
played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
|
||||
or an [NFC tag is
|
||||
detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
|
||||
or [new sensor data is
|
||||
available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
|
||||
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).
|
||||
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),
|
||||
or a
|
||||
[Flic button is pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
|
||||
or some
|
||||
[speech is detected on the voice assistant service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
|
||||
or an
|
||||
[RSS feed has new items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
|
||||
or a
|
||||
[new email is received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
|
||||
or a
|
||||
[new track is played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
|
||||
or an
|
||||
[NFC tag is detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
|
||||
or
|
||||
[new sensor data is available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
|
||||
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
|
||||
|
||||
Event hooks are custom pieces of logic that will be run when a certain event is
|
||||
triggered. Hooks are the glue that connects events to actions, exposing a
|
||||
paradigm similar to IFTTT (_if a certain event happens then run these
|
||||
actions_). They can declared as:
|
||||
Event hooks are custom pieces of logic that will be run when a certain event is triggered. Hooks are the glue that
|
||||
connects events to actions, exposing a paradigm similar to IFTTT (_if a certain event happens then run these actions_).
|
||||
They can declared as:
|
||||
|
||||
- Sections of the [`config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml).
|
||||
Example:
|
||||
|
@ -291,10 +204,9 @@ event.hook.SearchSongVoiceCommand:
|
|||
resource: ${output[0]['file']}
|
||||
```
|
||||
|
||||
- Stand-alone Python scripts stored under `~/.config/platypush/scripts` and
|
||||
will be dynamically imported at start time.
|
||||
- Stand-alone Python scripts stored under `~/.config/platypush/scripts` and will be dynamically imported at start time.
|
||||
[Example](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/hook.py):
|
||||
|
||||
|
||||
```python
|
||||
from platypush.event.hook import hook
|
||||
from platypush.utils import run
|
||||
|
@ -313,17 +225,13 @@ def on_music_play_command(event, title=None, artist=None, **context):
|
|||
|
||||
### Procedures
|
||||
|
||||
Procedures are pieces of custom logic that can be executed as atomic actions
|
||||
using `procedure.<name>` as an action name.
|
||||
Procedures are pieces of custom logic that can be executed as atomic actions 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
|
||||
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.
|
||||
|
||||
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 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
|
||||
procedure.at_home:
|
||||
|
@ -346,7 +254,7 @@ procedure.at_home:
|
|||
Python example:
|
||||
|
||||
```python
|
||||
# Content of ~/.config/platypush/scripts/home.py
|
||||
# Content of ~/.config/platypush/scripts/home.py
|
||||
from platypush.procedure import procedure
|
||||
from platypush.utils import run
|
||||
|
||||
|
@ -360,12 +268,11 @@ def at_home(**context):
|
|||
run('music.mpd.play')
|
||||
```
|
||||
|
||||
In either case, you can easily trigger the at-home procedure by sending an
|
||||
action request message to a backend - for example, over the HTTP backend:
|
||||
In either case, you can easily trigger the at-home procedure by sending an action request message to a backend - for
|
||||
example, over the HTTP backend:
|
||||
|
||||
```shell
|
||||
curl -XPOST -H 'Content-Type: application/json' \
|
||||
-H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
|
||||
{
|
||||
"type": "request",
|
||||
"action": "procedure.at_home"
|
||||
|
@ -374,18 +281,15 @@ curl -XPOST -H 'Content-Type: application/json' \
|
|||
|
||||
### Cronjobs
|
||||
|
||||
Cronjobs are pieces of logic that will be run at regular intervals, expressed
|
||||
in crontab-compatible syntax. They can be defined either in the `config.yaml`
|
||||
or as Python scripts stored under `~/.config/platypush/scripts` as functions
|
||||
labelled by the `@cron` decorator.
|
||||
Cronjobs are pieces of logic that will be run at regular intervals, expressed in crontab-compatible syntax.
|
||||
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` as
|
||||
functions labelled by the `@cron` decorator.
|
||||
|
||||
Note that seconds are also supported (unlike the standard crontab definition),
|
||||
but, for back-compatibility with the standard crontab format, they are at the
|
||||
end of the cron expression, so the expression is actually in the format
|
||||
Note that seconds are also supported (unlike the standard crontab definition), but, for back-compatibility with the
|
||||
standard crontab format, they are at the end of the cron expression, so the expression is actually in the format
|
||||
`<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
|
||||
Bluetooth device is nearby:
|
||||
YAML example for a cronjob that is executed every 30 seconds and checks if a Bluetooth device is nearby:
|
||||
|
||||
```yaml
|
||||
cron.check_bt_device:
|
||||
|
@ -404,7 +308,7 @@ cron.check_bt_device:
|
|||
Python example:
|
||||
|
||||
```python
|
||||
# Content of ~/.config/platypush/scripts/bt_cron.py
|
||||
# Content of ~/.config/platypush/scripts/bt_cron.py
|
||||
from platypush.cron import cron
|
||||
from platypush.utils import run
|
||||
|
||||
|
@ -419,18 +323,15 @@ def check_bt_device(**context):
|
|||
|
||||
### The web interface
|
||||
|
||||
If
|
||||
[`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html)
|
||||
is enabled then a web interface will be provided by default on
|
||||
`http://host:8008/`. Besides using the `/execute` endpoint for running
|
||||
requests, the built-in web server also provides a full-featured interface that
|
||||
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.
|
||||
If [`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html) is enabled then a web interface
|
||||
will be provided by default on `http://host:8008/`. Besides using the `/execute` endpoint for running requests, the
|
||||
built-in web server also provides a full-featured interface that 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
|
||||
dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml)
|
||||
that can be used to show information from multiple sources on a large screen.
|
||||
The web service also provides means for the user to create
|
||||
[custom dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml) that can
|
||||
be used to show information from multiple sources on a large screen.
|
||||
|
||||
## 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:
|
||||
|
||||
```yaml
|
||||
# Example for Debian-based distributions
|
||||
# Example for Debian-based distributions
|
||||
[sudo] apt-get install redis-server
|
||||
|
||||
# Enable and start the service
|
||||
# Enable and start the service
|
||||
[sudo] systemctl enable redis
|
||||
[sudo] systemctl start redis
|
||||
```
|
||||
|
||||
#### Install through `pip`
|
||||
To install the core platform:
|
||||
|
||||
* The `pip` way:
|
||||
|
||||
```shell
|
||||
[sudo] pip3 install platypush
|
||||
```
|
||||
|
||||
#### Install through a system package manager
|
||||
|
||||
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
|
||||
* The sources way:
|
||||
|
||||
```shell
|
||||
git clone https://git.platypush.tech/platypush/platypush.git
|
||||
cd platypush
|
||||
[sudo] pip install .
|
||||
# Or
|
||||
[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
|
||||
configuration required by the extensions that you wish to use. There are a few
|
||||
ways to check the dependencies required by an extension:
|
||||
#### Check their `extras` name in [`extras_require` under `setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72).
|
||||
|
||||
#### Install via `extras` name
|
||||
|
||||
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:
|
||||
If you follow this route then you can install the extra dependencies in one of the following ways:
|
||||
|
||||
1. `pip` installation:
|
||||
|
||||
|
@ -515,18 +383,25 @@ dependencies, then you can install them in two ways:
|
|||
cd $DIR_TO_PLATYPUSH
|
||||
[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
|
||||
[plugin/backend documentation](https://docs.platypush.tech) to get the
|
||||
dependencies installed.
|
||||
#### Check/uncomment the associated lines in [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/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.
|
||||
If you follow this route then uncomment the lines in
|
||||
[`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) associated to the
|
||||
plugins/backends that you want to use and run:
|
||||
|
||||
```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:
|
||||
|
||||
|
@ -535,100 +410,85 @@ platypush
|
|||
```
|
||||
|
||||
It's advised to run it as a systemd service though - simply copy the provided
|
||||
[`.service`
|
||||
file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service)
|
||||
to `~/.config/systemd/user`, check if the path of `platypush` matches the path
|
||||
where it's installed on your system, and start the service via `systemctl`:
|
||||
[`.service` file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service) to
|
||||
`~/.config/systemd/user`, check if the path of `platypush` matches the path where it's installed on your system, and
|
||||
start the service via `systemctl`:
|
||||
|
||||
```shell
|
||||
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`
|
||||
and automatically create a virtual environment (under
|
||||
`~/.local/share/platypush/venv/<device_id>`) with all the dependencies required
|
||||
by the configured integrations.
|
||||
Platypush provides a script named `platyvenv` that can parse a `config.yaml` and automatically create a virtual
|
||||
environment (under `~/.local/share/platypush/venv/<device_id>`) with all the dependencies required by the configured
|
||||
integrations.
|
||||
|
||||
1. Create the environment from a configuration file:
|
||||
|
||||
```shell
|
||||
platyvenv build -c /path/to/config.yaml
|
||||
```
|
||||
```shell
|
||||
platyvenv build -c /path/to/config.yaml
|
||||
```
|
||||
|
||||
2. Start the service from the virtual environment:
|
||||
|
||||
```shell
|
||||
# device_id matches either the hostname or the device_id in config.yaml
|
||||
platyvenv start device_id
|
||||
```
|
||||
```shell
|
||||
# device_id matches either the hostname or the device_id in config.yaml
|
||||
platyvenv start device_id
|
||||
```
|
||||
|
||||
3. Stop the instance:
|
||||
|
||||
```shell
|
||||
platyvenv stop device_id
|
||||
```
|
||||
```shell
|
||||
platyvenv stop device_id
|
||||
```
|
||||
|
||||
4. Remove the instance:
|
||||
|
||||
```shell
|
||||
platyvenv rm device_id
|
||||
```
|
||||
```shell
|
||||
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:
|
||||
|
||||
```shell
|
||||
platydock build -c /path/to/config.yaml
|
||||
```
|
||||
```shell
|
||||
platydock build -c /path/to/config.yaml
|
||||
```
|
||||
|
||||
2. Start the container:
|
||||
|
||||
```shell
|
||||
# device_id matches either the hostname or the device_id in config.yaml
|
||||
platydock start device_id
|
||||
```
|
||||
```shell
|
||||
# device_id matches either the hostname or the device_id in config.yaml
|
||||
platydock start device_id
|
||||
```
|
||||
|
||||
3. Stop the instance:
|
||||
|
||||
```shell
|
||||
platydock stop device_id
|
||||
```
|
||||
```shell
|
||||
platydock stop device_id
|
||||
```
|
||||
|
||||
4. Remove the instance:
|
||||
|
||||
```shell
|
||||
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)
|
||||
```shell
|
||||
platydock rm device_id
|
||||
```
|
||||
|
||||
## Mobile app
|
||||
|
||||
An [official Android
|
||||
app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on
|
||||
the F-Droid store. It allows to easily discover and manage multiple Platypush
|
||||
services on a network through the web interface, and it easily brings the power
|
||||
of Platypush to your fingertips.
|
||||
An [official Android app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on the F-Droid store.
|
||||
It allows to easily discover and manage multiple Platypush services on a network through the web interface, and it
|
||||
easily brings the power of Platypush to your fingertips.
|
||||
|
||||
## Tests
|
||||
|
||||
To run the tests simply run `pytest` either from the project root folder or the
|
||||
`tests/` folder. Or run the following command from the project root folder:
|
||||
To run the tests simply run `pytest` either from the project root folder or the `tests/` folder.
|
||||
Or run the following command from the project root folder:
|
||||
|
||||
```shell
|
||||
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).
|
||||
|
||||
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 open and free.
|
||||
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
|
||||
open and free.
|
||||
|
||||
If you like this product, please consider supporting - I'm definitely not
|
||||
planning to get rich with this project, but I'd love to have at least the costs
|
||||
for the server covered by users.
|
||||
If you like this product, please consider supporting - I'm definitely not planning to get rich with this project, but
|
||||
I'd love to have at least the costs for the server covered by users.
|
||||
|
||||
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, #
|
||||
# stop and remove them #
|
||||
# #
|
||||
# @author: Fabio Manganiello <fabio@platypush.tech> #
|
||||
# @author: Fabio Manganiello <blacklight86@gmail.com> #
|
||||
# @licence: MIT #
|
||||
##############################################################################
|
||||
|
||||
|
||||
workdir="$HOME/.local/share/platypush/venv"
|
||||
workdir=$HOME/.local/share/platypush/venv
|
||||
|
||||
function build {
|
||||
cfgfile=
|
||||
|
@ -35,74 +35,88 @@ function build {
|
|||
fi
|
||||
|
||||
echo "Parsing configuration file"
|
||||
pip_cmd=
|
||||
pkg_cmd=
|
||||
deps=()
|
||||
includes=()
|
||||
cmd_exec=()
|
||||
|
||||
while read -r line; do
|
||||
if echo "$line" | grep -E "^pip:\s*"; then
|
||||
pip_cmd="$(echo "$line" | sed -r -e 's/^pip:\s*(.*)'/\\1/)"
|
||||
elif echo "$line" | grep -E "^packages:\s*"; then
|
||||
pkg_cmd="$(echo "$line" | sed -r -e 's/^packages:\s*(.*)'/\\1/)"
|
||||
elif echo "$line" | grep -E "^exec:\s*"; then
|
||||
cmd_exec+=("$(echo "$line" | sed -r -e 's/^exec:\s*(.*)'/\\1/)")
|
||||
elif echo "$line" | grep -E "^include:\s*"; then
|
||||
includes+=("$(echo "$line" | sed -r -e 's/^include:\s*(.*)'/\\1/)")
|
||||
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
|
||||
echo ${line} | egrep '``pip install .+?``' > /dev/null 2>&1
|
||||
if (( $? != 0 )); then
|
||||
continue
|
||||
fi
|
||||
|
||||
dep=$(echo ${line} | sed -r -e 's/.*``pip install (.+?)``.*/\1/')
|
||||
deps+=("$dep")
|
||||
done <<< $(python <<EOF
|
||||
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}")')
|
||||
print(f'device_id: {Config.get("device_id")}')
|
||||
Config.init('`realpath ${cfgfile}`')
|
||||
register_backends()
|
||||
backend_config = Config.get_backends()
|
||||
|
||||
if deps.get('pip'):
|
||||
print(f'pip: {deps["pip"]}')
|
||||
for name in Config.get_backends().keys():
|
||||
backend = get_backend(name)
|
||||
print(backend.__doc__)
|
||||
|
||||
if deps.get('packages'):
|
||||
print(f'packages: {deps["packages"]}')
|
||||
for name in Config.get_plugins().keys():
|
||||
try:
|
||||
plugin = get_plugin(name)
|
||||
print(plugin.__doc__)
|
||||
except:
|
||||
pass
|
||||
EOF
|
||||
)
|
||||
|
||||
for cmd in deps.get('exec', []):
|
||||
print(f'exec: {cmd}')
|
||||
while read -r include; do
|
||||
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:
|
||||
print(f'include: {include}')
|
||||
print(include)
|
||||
EOF
|
||||
)"
|
||||
)
|
||||
|
||||
envdir="${workdir}/${device_id}"
|
||||
etcdir="${envdir}/etc/platypush"
|
||||
device_id=$(python <<EOF
|
||||
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"
|
||||
mkdir -p "$envdir"
|
||||
mkdir -p "$etcdir"
|
||||
srcdir=$(dirname "$cfgfile")
|
||||
srcdir=`dirname "$cfgfile"`
|
||||
|
||||
for ((i=0; i < ${#includes[@]}; i++)); do
|
||||
incdir=$(dirname "${includes[$i]}")
|
||||
incdir=$(realpath --relative-to="$srcdir" "$incdir")
|
||||
for ((i=0; $i < ${#includes[@]}; i++)); do
|
||||
incdir=`dirname "${includes[$i]}"`
|
||||
incdir=`realpath --relative-to="$srcdir" "$incdir"`
|
||||
destdir="$etcdir/$incdir"
|
||||
mkdir -p "$destdir"
|
||||
cp "${includes[$i]}" "$destdir"
|
||||
done
|
||||
|
||||
cp "$cfgfile" "$etcdir/config.yaml"
|
||||
cfgfile="${etcdir}/config.yaml"
|
||||
cfgfile=${etcdir}/config.yaml
|
||||
|
||||
python3 -m venv "${envdir}"
|
||||
cd "${envdir}" || exit 1
|
||||
source "${envdir}/bin/activate"
|
||||
python3 -m venv ${envdir}
|
||||
cd ${envdir}
|
||||
source ${envdir}/bin/activate
|
||||
|
||||
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
|
||||
${cmd_exec[$i]}
|
||||
for ((i=0; $i < ${#deps[@]}; i++)); do
|
||||
echo ${deps[$i]}
|
||||
done | sort -u | while read dep; do
|
||||
pip install ${dep}
|
||||
done
|
||||
|
||||
pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git
|
||||
|
@ -116,41 +130,44 @@ function start {
|
|||
fi
|
||||
|
||||
env=$1
|
||||
envdir="${workdir}/${env}"
|
||||
rundir="${envdir}/var/run"
|
||||
pidfile="${rundir}/platypush.pid"
|
||||
cfgfile="${envdir}/etc/platypush/config.yaml"
|
||||
envdir=${workdir}/${env}
|
||||
logsdir=${envdir}/var/log/platypush
|
||||
rundir=${envdir}/var/run
|
||||
pidfile=${rundir}/platypush.pid
|
||||
cfgfile=${envdir}/etc/platypush/config.yaml
|
||||
|
||||
if [[ ! -d "$envdir" ]]; then
|
||||
echo "No such directory: $envdir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${rundir}"
|
||||
mkdir -p ${logsdir}
|
||||
mkdir -p ${rundir}
|
||||
|
||||
if [[ -f "$pidfile" ]]; then
|
||||
if pgrep -F "${pidfile}"; then
|
||||
echo "Another instance (PID $(cat "${pidfile}")) is running, please stop that instance first"
|
||||
pid=`cat "$pidfile"`
|
||||
if ps -p ${pid} | grep platypush; then
|
||||
echo "Another instance (PID $pid) is running, please stop that instance first"
|
||||
exit 1
|
||||
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"
|
||||
fi
|
||||
|
||||
python3 -m venv "${envdir}"
|
||||
cd "${envdir}" || exit 1
|
||||
python3 -m venv ${envdir}
|
||||
cd ${envdir}
|
||||
source bin/activate
|
||||
bin/platypush -c "$cfgfile" -P "$pidfile" &
|
||||
start_time=$(date +'%s')
|
||||
bin/platypush -c "$cfgfile" -P "$pidfile" > ${logsdir}/stdout.log 2> ${logsdir}/stderr.log &
|
||||
start_time=`date +'%s'`
|
||||
timeout=30
|
||||
|
||||
while :; do
|
||||
[[ -f "$pidfile" ]] && break
|
||||
now=$(date +'%s')
|
||||
elapsed=$(( now-start_time ))
|
||||
if (( elapsed >= timeout )); then
|
||||
echo "Platypush instance '$env' did not start within $timeout seconds" >&2
|
||||
now=`date +'%s'`
|
||||
let elapsed=$now-$start_time
|
||||
if (( ${elapsed} >= ${timeout} )); then
|
||||
echo "Platypush instance '$env' didn't start within $timeout seconds" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
@ -158,11 +175,9 @@ function start {
|
|||
sleep 1
|
||||
done
|
||||
|
||||
pid=$(cat "$pidfile")
|
||||
pid=`cat "$pidfile"`
|
||||
echo
|
||||
echo "Platypush environment $env started with PID $pid"
|
||||
wait "${pid}"
|
||||
echo "Platypush environment $env terminated"
|
||||
echo "Platypush environment $env started with PID $pid, logs dir: $logsdir"
|
||||
}
|
||||
|
||||
function stop {
|
||||
|
@ -172,9 +187,9 @@ function stop {
|
|||
fi
|
||||
|
||||
env=$1
|
||||
envdir="${workdir}/${env}"
|
||||
rundir="${envdir}/var/run"
|
||||
pidfile="${rundir}/platypush.pid"
|
||||
envdir=${workdir}/${env}
|
||||
rundir=${envdir}/var/run
|
||||
pidfile=${rundir}/platypush.pid
|
||||
|
||||
if [[ ! -d "$envdir" ]]; then
|
||||
echo "No such directory: $envdir" >&2
|
||||
|
@ -182,13 +197,12 @@ function stop {
|
|||
fi
|
||||
|
||||
if [[ ! -f "$pidfile" ]]; then
|
||||
echo "No pidfile found for instance \"${env}\""
|
||||
echo "No pidfile found for instance "${env}""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pid=$(cat "$pidfile")
|
||||
pids="$pid $(ps --no-headers -o pid= --ppid "$pid")"
|
||||
# shellcheck disable=SC2086
|
||||
pid=`cat "$pidfile"`
|
||||
pids="$pid `ps --no-headers -o pid= --ppid $pid`"
|
||||
kill -9 ${pids}
|
||||
rm -f "$pidfile"
|
||||
echo "Instance '$env' with PID $pid stopped"
|
||||
|
@ -200,9 +214,9 @@ function rme {
|
|||
exit 1
|
||||
fi
|
||||
|
||||
envdir="${workdir}/$1"
|
||||
rundir="${envdir}/var/run"
|
||||
pidfile="${rundir}/platypush.pid"
|
||||
envdir=${workdir}/$1
|
||||
rundir=${envdir}/var/run
|
||||
pidfile=${rundir}/platypush.pid
|
||||
|
||||
if [[ ! -d "$envdir" ]]; then
|
||||
echo "No such directory: $envdir" >&2
|
||||
|
@ -210,18 +224,14 @@ function rme {
|
|||
fi
|
||||
|
||||
if [[ -f "$pidfile" ]]; then
|
||||
if pgrep -F "${pidfile}"; then
|
||||
echo "Another instance (PID $(cat "$pidfile")) is running, please stop that instance first"
|
||||
if ps -p `cat "$pidfile"` | grep platypush; then
|
||||
echo "Another instance (PID $pidfile) is running, please stop that instance first"
|
||||
exit 1
|
||||
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
|
||||
|
||||
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"
|
||||
echo "$envdir removed"
|
||||
}
|
||||
|
@ -237,13 +247,13 @@ fi
|
|||
|
||||
action=$1
|
||||
shift
|
||||
mkdir -p "${workdir}"
|
||||
mkdir -p ${workdir}
|
||||
|
||||
# shellcheck disable=SC2048,SC2086
|
||||
case ${action} in
|
||||
'build') build $*;;
|
||||
'build') build;;
|
||||
'start') start $*;;
|
||||
'stop') stop $*;;
|
||||
'rm') rme $*;;
|
||||
*) usage;;
|
||||
esac
|
||||
|
||||
|
|
|
@ -3,12 +3,10 @@ import json
|
|||
import os
|
||||
import re
|
||||
import sys
|
||||
from random import randint
|
||||
from typing import Union, List
|
||||
|
||||
from docutils import nodes
|
||||
from docutils.parsers.rst import Directive
|
||||
from marshmallow import fields
|
||||
|
||||
|
||||
class SchemaDirective(Directive):
|
||||
|
@ -24,43 +22,17 @@ class SchemaDirective(Directive):
|
|||
|
||||
sys.path.insert(0, _schemas_path)
|
||||
|
||||
@classmethod
|
||||
def _get_field_value(cls, field):
|
||||
@staticmethod
|
||||
def _get_field_value(field) -> str:
|
||||
metadata = getattr(field, 'metadata', {})
|
||||
if metadata.get('example'):
|
||||
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()
|
||||
return metadata.get('example', metadata.get('description', str(field.__class__.__name__).lower()))
|
||||
|
||||
def _parse_schema(self) -> Union[dict, List[dict]]:
|
||||
m = self._schema_regex.match('\n'.join(self.content))
|
||||
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
|
||||
schema_module = importlib.import_module(schema_module_name)
|
||||
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)
|
||||
output = {
|
||||
name: self._get_field_value(field)
|
||||
|
|
|
@ -3,13 +3,15 @@ Backends
|
|||
========
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:maxdepth: 2
|
||||
:caption: Backends:
|
||||
|
||||
platypush/backend/adafruit.io.rst
|
||||
platypush/backend/alarm.rst
|
||||
platypush/backend/assistant.rst
|
||||
platypush/backend/assistant.google.rst
|
||||
platypush/backend/assistant.snowboy.rst
|
||||
platypush/backend/bluetooth.rst
|
||||
platypush/backend/bluetooth.fileserver.rst
|
||||
platypush/backend/bluetooth.pushserver.rst
|
||||
platypush/backend/bluetooth.scanner.rst
|
||||
|
@ -17,7 +19,9 @@ Backends
|
|||
platypush/backend/button.flic.rst
|
||||
platypush/backend/camera.pi.rst
|
||||
platypush/backend/chat.telegram.rst
|
||||
platypush/backend/clipboard.rst
|
||||
platypush/backend/covid19.rst
|
||||
platypush/backend/dbus.rst
|
||||
platypush/backend/file.monitor.rst
|
||||
platypush/backend/foursquare.rst
|
||||
platypush/backend/github.rst
|
||||
|
@ -40,7 +44,6 @@ Backends
|
|||
platypush/backend/music.mopidy.rst
|
||||
platypush/backend/music.mpd.rst
|
||||
platypush/backend/music.snapcast.rst
|
||||
platypush/backend/music.spotify.rst
|
||||
platypush/backend/nextcloud.rst
|
||||
platypush/backend/nfc.rst
|
||||
platypush/backend/nodered.rst
|
||||
|
@ -48,6 +51,7 @@ Backends
|
|||
platypush/backend/pushbullet.rst
|
||||
platypush/backend/redis.rst
|
||||
platypush/backend/scard.rst
|
||||
platypush/backend/sensor.rst
|
||||
platypush/backend/sensor.accelerometer.rst
|
||||
platypush/backend/sensor.arduino.rst
|
||||
platypush/backend/sensor.battery.rst
|
||||
|
@ -60,8 +64,9 @@ Backends
|
|||
platypush/backend/sensor.leap.rst
|
||||
platypush/backend/sensor.ltr559.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/stt.rst
|
||||
platypush/backend/stt.deepspeech.rst
|
||||
platypush/backend/stt.picovoice.hotword.rst
|
||||
platypush/backend/stt.picovoice.speech.rst
|
||||
|
@ -69,6 +74,7 @@ Backends
|
|||
platypush/backend/todoist.rst
|
||||
platypush/backend/travisci.rst
|
||||
platypush/backend/trello.rst
|
||||
platypush/backend/weather.rst
|
||||
platypush/backend/weather.buienradar.rst
|
||||
platypush/backend/weather.darksky.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.
|
||||
# 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
|
||||
# directories to ignore when looking for source files.
|
||||
|
@ -89,11 +89,8 @@ pygments_style = 'sphinx'
|
|||
#
|
||||
# html_theme = 'haiku'
|
||||
# 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
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
|
@ -101,12 +98,50 @@ html_domain_indices = True
|
|||
# documentation.
|
||||
#
|
||||
html_theme_options = {
|
||||
'toc_title': 'Platypush documentation',
|
||||
'repository_url': 'https://git.platypush.tech/platypush/platypush',
|
||||
'use_repository_button': True,
|
||||
'use_issues_button': True,
|
||||
'use_fullscreen_button': True,
|
||||
'home_page_in_toc': True,
|
||||
'nav_title': 'Platypush documentation',
|
||||
'repo_url': 'https://git.platypush.tech/platypush/platypush',
|
||||
'repo_name': 'Source code',
|
||||
'repo_type': 'gitlab',
|
||||
'color_primary': 'green',
|
||||
'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,
|
||||
|
@ -122,9 +157,9 @@ html_theme_options = {
|
|||
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
|
||||
# 'searchbox.html']``.
|
||||
#
|
||||
# html_sidebars = {
|
||||
# '**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
|
||||
# }
|
||||
html_sidebars = {
|
||||
'**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
|
||||
}
|
||||
|
||||
# -- Options for HTMLHelp output ---------------------------------------------
|
||||
|
||||
|
@ -138,12 +173,15 @@ latex_elements = {
|
|||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#
|
||||
# 'papersize': 'letterpaper',
|
||||
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#
|
||||
# 'pointsize': '10pt',
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# 'preamble': '',
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# 'figure_align': 'htbp',
|
||||
|
@ -153,7 +191,8 @@ latex_elements = {
|
|||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
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
|
||||
# (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 ----------------------------------------------
|
||||
|
@ -170,15 +212,9 @@ man_pages = [(master_doc, 'platypush', 'platypush Documentation', [author], 1)]
|
|||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(
|
||||
master_doc,
|
||||
'platypush',
|
||||
'platypush Documentation',
|
||||
author,
|
||||
'platypush',
|
||||
'One line description of project.',
|
||||
'Miscellaneous',
|
||||
),
|
||||
(master_doc, 'platypush', '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.
|
||||
todo_include_todos = True
|
||||
|
||||
autodoc_default_options = {
|
||||
'members': True,
|
||||
'show-inheritance': True,
|
||||
}
|
||||
|
||||
autodoc_mock_imports = [
|
||||
'googlesamples.assistant.grpc.audio_helpers',
|
||||
'google.assistant.embedded',
|
||||
'google.assistant.library',
|
||||
'google.assistant.library.event',
|
||||
'google.assistant.library.file_helpers',
|
||||
'google.oauth2.credentials',
|
||||
'oauth2client',
|
||||
'apiclient',
|
||||
'tenacity',
|
||||
'smartcard',
|
||||
'Leap',
|
||||
'oauth2client',
|
||||
'rtmidi',
|
||||
'bluetooth',
|
||||
'gevent.wsgi',
|
||||
'Adafruit_IO',
|
||||
'pyperclip',
|
||||
'pydbus',
|
||||
'inputs',
|
||||
'inotify',
|
||||
'omxplayer',
|
||||
'plexapi',
|
||||
'cwiid',
|
||||
'sounddevice',
|
||||
'soundfile',
|
||||
'numpy',
|
||||
'cv2',
|
||||
'nfc',
|
||||
'ndef',
|
||||
'bcrypt',
|
||||
'google',
|
||||
'feedparser',
|
||||
'kafka',
|
||||
'googlesamples',
|
||||
'icalendar',
|
||||
'httplib2',
|
||||
'mpd',
|
||||
'serial',
|
||||
'pyHS100',
|
||||
'grpc',
|
||||
'envirophat',
|
||||
'gps',
|
||||
'picamera',
|
||||
'pmw3901',
|
||||
'PIL',
|
||||
'croniter',
|
||||
'pyaudio',
|
||||
'avs',
|
||||
'PyOBEX',
|
||||
'todoist',
|
||||
'trello',
|
||||
'telegram',
|
||||
'telegram.ext',
|
||||
'pyfirmata2',
|
||||
'cups',
|
||||
'graphyte',
|
||||
'cpuinfo',
|
||||
'psutil',
|
||||
'openzwave',
|
||||
'deepspeech',
|
||||
'wave',
|
||||
'pvporcupine ',
|
||||
'pvcheetah',
|
||||
'pyotp',
|
||||
'linode_api4',
|
||||
'pyzbar',
|
||||
'tensorflow',
|
||||
'keras',
|
||||
'pandas',
|
||||
'samsungtvws',
|
||||
'paramiko',
|
||||
'luma',
|
||||
'zeroconf',
|
||||
'dbus',
|
||||
'gi',
|
||||
'gi.repository',
|
||||
'twilio',
|
||||
'Adafruit_Python_DHT',
|
||||
'RPi.GPIO',
|
||||
'RPLCD',
|
||||
'imapclient',
|
||||
'pysmartthings',
|
||||
'aiohttp',
|
||||
'watchdog',
|
||||
'pyngrok',
|
||||
'irc',
|
||||
'irc.bot',
|
||||
'irc.strings',
|
||||
'irc.client',
|
||||
'irc.connection',
|
||||
'irc.events',
|
||||
'defusedxml',
|
||||
'nio',
|
||||
'aiofiles',
|
||||
'aiofiles.os',
|
||||
'async_lru',
|
||||
]
|
||||
autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
|
||||
'google.assistant.embedded',
|
||||
'google.assistant.library',
|
||||
'google.assistant.library.event',
|
||||
'google.assistant.library.file_helpers',
|
||||
'google.oauth2.credentials',
|
||||
'oauth2client',
|
||||
'apiclient',
|
||||
'tenacity',
|
||||
'smartcard',
|
||||
'Leap',
|
||||
'oauth2client',
|
||||
'rtmidi',
|
||||
'bluetooth',
|
||||
'gevent.wsgi',
|
||||
'Adafruit_IO',
|
||||
'pyperclip',
|
||||
'dbus',
|
||||
'inputs',
|
||||
'inotify',
|
||||
'omxplayer',
|
||||
'plexapi',
|
||||
'cwiid',
|
||||
'sounddevice',
|
||||
'soundfile',
|
||||
'numpy',
|
||||
'cv2',
|
||||
'nfc',
|
||||
'ndef',
|
||||
'bcrypt',
|
||||
'google',
|
||||
'feedparser',
|
||||
'kafka',
|
||||
'googlesamples',
|
||||
'icalendar',
|
||||
'httplib2',
|
||||
'mpd',
|
||||
'serial',
|
||||
'pyHS100',
|
||||
'grpc',
|
||||
'envirophat',
|
||||
'gps',
|
||||
'picamera',
|
||||
'pwm3901',
|
||||
'PIL',
|
||||
'croniter',
|
||||
'pyaudio',
|
||||
'avs',
|
||||
'PyOBEX',
|
||||
'todoist',
|
||||
'trello',
|
||||
'telegram',
|
||||
'telegram.ext',
|
||||
'pyfirmata2',
|
||||
'cups',
|
||||
'graphyte',
|
||||
'cpuinfo',
|
||||
'psutil',
|
||||
'openzwave',
|
||||
'deepspeech',
|
||||
'wave',
|
||||
'pvporcupine ',
|
||||
'pvcheetah',
|
||||
'pyotp',
|
||||
'linode_api4',
|
||||
'pyzbar',
|
||||
'tensorflow',
|
||||
'keras',
|
||||
'pandas',
|
||||
'samsungtvws',
|
||||
'paramiko',
|
||||
'luma',
|
||||
'zeroconf',
|
||||
'dbus',
|
||||
'gi',
|
||||
'gi.repository',
|
||||
'twilio',
|
||||
'pytz',
|
||||
'Adafruit_Python_DHT',
|
||||
'RPi.GPIO',
|
||||
'RPLCD',
|
||||
'imapclient',
|
||||
'pysmartthings',
|
||||
'aiohttp',
|
||||
'watchdog',
|
||||
]
|
||||
|
||||
sys.path.insert(0, os.path.abspath('../..'))
|
||||
|
||||
|
||||
def skip(app, what, name, obj, skip, options):
|
||||
if name == "__init__":
|
||||
return False
|
||||
return skip
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.connect("autodoc-skip-member", skip)
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ Events
|
|||
======
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:maxdepth: 2
|
||||
:caption: Events:
|
||||
|
||||
platypush/events/adafruit.rst
|
||||
|
@ -13,12 +13,10 @@ Events
|
|||
platypush/events/bluetooth.rst
|
||||
platypush/events/button.flic.rst
|
||||
platypush/events/camera.rst
|
||||
platypush/events/chat.slack.rst
|
||||
platypush/events/chat.telegram.rst
|
||||
platypush/events/clipboard.rst
|
||||
platypush/events/covid19.rst
|
||||
platypush/events/custom.rst
|
||||
platypush/events/dbus.rst
|
||||
platypush/events/distance.rst
|
||||
platypush/events/file.rst
|
||||
platypush/events/foursquare.rst
|
||||
|
@ -27,35 +25,27 @@ Events
|
|||
platypush/events/google.rst
|
||||
platypush/events/google.fit.rst
|
||||
platypush/events/google.pubsub.rst
|
||||
platypush/events/gotify.rst
|
||||
platypush/events/gpio.rst
|
||||
platypush/events/gps.rst
|
||||
platypush/events/http.rst
|
||||
platypush/events/http.hook.rst
|
||||
platypush/events/http.rss.rst
|
||||
platypush/events/inotify.rst
|
||||
platypush/events/irc.rst
|
||||
platypush/events/joystick.rst
|
||||
platypush/events/kafka.rst
|
||||
platypush/events/light.rst
|
||||
platypush/events/linode.rst
|
||||
platypush/events/log.http.rst
|
||||
platypush/events/mail.rst
|
||||
platypush/events/matrix.rst
|
||||
platypush/events/media.rst
|
||||
platypush/events/midi.rst
|
||||
platypush/events/mqtt.rst
|
||||
platypush/events/music.rst
|
||||
platypush/events/music.snapcast.rst
|
||||
platypush/events/music.tidal.rst
|
||||
platypush/events/nextcloud.rst
|
||||
platypush/events/nfc.rst
|
||||
platypush/events/ngrok.rst
|
||||
platypush/events/ntfy.rst
|
||||
platypush/events/ping.rst
|
||||
platypush/events/pushbullet.rst
|
||||
platypush/events/qrcode.rst
|
||||
platypush/events/rss.rst
|
||||
platypush/events/scard.rst
|
||||
platypush/events/sensor.rst
|
||||
platypush/events/sensor.ir.rst
|
||||
|
@ -64,7 +54,6 @@ Events
|
|||
platypush/events/serial.rst
|
||||
platypush/events/sound.rst
|
||||
platypush/events/stt.rst
|
||||
platypush/events/sun.rst
|
||||
platypush/events/tensorflow.rst
|
||||
platypush/events/todoist.rst
|
||||
platypush/events/torrent.rst
|
||||
|
@ -74,7 +63,6 @@ Events
|
|||
platypush/events/weather.rst
|
||||
platypush/events/web.rst
|
||||
platypush/events/web.widget.rst
|
||||
platypush/events/websocket.rst
|
||||
platypush/events/wiimote.rst
|
||||
platypush/events/zeroborg.rst
|
||||
platypush/events/zeroconf.rst
|
||||
|
|
|
@ -3,20 +3,18 @@ Platypush
|
|||
|
||||
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 `Gitea page`_ of the project
|
||||
* The `Gitlab page`_ of the project
|
||||
* The `online wiki`_ for quickstart and examples
|
||||
* The `Blog articles`_ for inspiration on use-cases possible projects
|
||||
|
||||
.. _main page: https://platypush.tech
|
||||
.. _Gitea page: https://git.platypush.tech/platypush/platypush
|
||||
.. _online wiki: https://git.platypush.tech/platypush/platypush/wiki
|
||||
.. _Gitlab page: https://git.platypush.tech/platypush/platypush
|
||||
.. _online wiki: https://git.platypush.tech/platypush/platypush/-/wikis/home
|
||||
.. _Blog articles: https://blog.platypush.tech
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:maxdepth: 3
|
||||
:caption: Contents:
|
||||
|
||||
backends
|
||||
|
@ -30,3 +28,4 @@ Indices and tables
|
|||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``adafruit.io``
|
||||
``platypush.backend.adafruit.io``
|
||||
=================================
|
||||
|
||||
.. automodule:: platypush.backend.adafruit.io
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``alarm``
|
||||
``platypush.backend.alarm``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.alarm
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``assistant.google``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``bluetooth.fileserver``
|
||||
``platypush.backend.bluetooth.fileserver``
|
||||
==========================================
|
||||
|
||||
.. automodule:: platypush.backend.bluetooth.fileserver
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``bluetooth.pushserver``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``bluetooth.scanner``
|
||||
``platypush.backend.bluetooth.scanner``
|
||||
=======================================
|
||||
|
||||
.. automodule:: platypush.backend.bluetooth.scanner
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``button.flic``
|
||||
``platypush.backend.button.flic``
|
||||
=================================
|
||||
|
||||
.. automodule:: platypush.backend.button.flic
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``camera.pi``
|
||||
``platypush.backend.camera.pi``
|
||||
===============================
|
||||
|
||||
.. automodule:: platypush.backend.camera.pi
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``chat.telegram``
|
||||
``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
|
||||
|
|
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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``foursquare``
|
||||
``platypush.backend.foursquare``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.backend.foursquare
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``github``
|
||||
``platypush.backend.github``
|
||||
============================
|
||||
|
||||
.. automodule:: platypush.backend.github
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``google.fit``
|
||||
``platypush.backend.google.fit``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.backend.google.fit
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``google.pubsub``
|
||||
``platypush.backend.google.pubsub``
|
||||
===================================
|
||||
|
||||
.. automodule:: platypush.backend.google.pubsub
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``gps``
|
||||
``platypush.backend.gps``
|
||||
=========================
|
||||
|
||||
.. automodule:: platypush.backend.gps
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``http.poll``
|
||||
``platypush.backend.http.poll``
|
||||
===============================
|
||||
|
||||
.. automodule:: platypush.backend.http.poll
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``http``
|
||||
``platypush.backend.http``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.http
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``inotify``
|
||||
``platypush.backend.inotify``
|
||||
=============================
|
||||
|
||||
.. automodule:: platypush.backend.inotify
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``joystick.jstest``
|
||||
``platypush.backend.joystick.jstest``
|
||||
=====================================
|
||||
|
||||
.. automodule:: platypush.backend.joystick.jstest
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``joystick.linux``
|
||||
``platypush.backend.joystick.linux``
|
||||
====================================
|
||||
|
||||
.. automodule:: platypush.backend.joystick.linux
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``joystick``
|
||||
``platypush.backend.joystick``
|
||||
==============================
|
||||
|
||||
.. automodule:: platypush.backend.joystick
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``kafka``
|
||||
``platypush.backend.kafka``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.kafka
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``light.hue``
|
||||
``platypush.backend.light.hue``
|
||||
===============================
|
||||
|
||||
.. automodule:: platypush.backend.light.hue
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``linode``
|
||||
``platypush.backend.linode``
|
||||
============================
|
||||
|
||||
.. automodule:: platypush.backend.linode
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``log.http``
|
||||
``platypush.backend.log.http``
|
||||
==============================
|
||||
|
||||
.. automodule:: platypush.backend.log.http
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``mail``
|
||||
``platypush.backend.mail``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.mail
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``midi``
|
||||
``platypush.backend.midi``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.midi
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``mqtt``
|
||||
``platypush.backend.mqtt``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.mqtt
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``music.mopidy``
|
||||
``platypush.backend.music.mopidy``
|
||||
==================================
|
||||
|
||||
.. automodule:: platypush.backend.music.mopidy
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``music.mpd``
|
||||
``platypush.backend.music.mpd``
|
||||
===============================
|
||||
|
||||
.. automodule:: platypush.backend.music.mpd
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``music.snapcast``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``nfc``
|
||||
``platypush.backend.nfc``
|
||||
=========================
|
||||
|
||||
.. automodule:: platypush.backend.nfc
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``nodered``
|
||||
``platypush.backend.nodered``
|
||||
=============================
|
||||
|
||||
.. automodule:: platypush.backend.nodered
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``ping``
|
||||
``platypush.backend.ping``
|
||||
==========================
|
||||
|
||||
.. automodule:: platypush.backend.ping
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``pushbullet``
|
||||
``platypush.backend.pushbullet``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.backend.pushbullet
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``redis``
|
||||
``platypush.backend.redis``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.redis
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``scard``
|
||||
``platypush.backend.scard``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.scard
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.accelerometer``
|
||||
``platypush.backend.sensor.accelerometer``
|
||||
==========================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.accelerometer
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.arduino``
|
||||
``platypush.backend.sensor.arduino``
|
||||
====================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.arduino
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.battery``
|
||||
``platypush.backend.sensor.battery``
|
||||
====================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.battery
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.bme280``
|
||||
``platypush.backend.sensor.bme280``
|
||||
===================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.bme280
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.dht``
|
||||
``platypush.backend.sensor.dht``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.dht
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.distance``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.envirophat``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.leap``
|
||||
``platypush.backend.sensor.leap``
|
||||
=================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.leap
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.ltr559``
|
||||
``platypush.backend.sensor.ltr559``
|
||||
===================================
|
||||
|
||||
.. automodule:: platypush.backend.sensor.ltr559
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``sensor.mcp3008``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``stt.deepspeech``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``stt.picovoice.speech``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``todoist``
|
||||
``platypush.backend.todoist``
|
||||
=============================
|
||||
|
||||
.. automodule:: platypush.backend.todoist
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``travisci``
|
||||
``platypush.backend.travisci``
|
||||
==============================
|
||||
|
||||
.. automodule:: platypush.backend.travisci
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``trello``
|
||||
``platypush.backend.trello``
|
||||
============================
|
||||
|
||||
.. automodule:: platypush.backend.trello
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``weather.buienradar``
|
||||
``platypush.backend.weather.buienradar``
|
||||
========================================
|
||||
|
||||
.. automodule:: platypush.backend.weather.buienradar
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``weather.darksky``
|
||||
``platypush.backend.weather.darksky``
|
||||
=====================================
|
||||
|
||||
.. automodule:: platypush.backend.weather.darksky
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``weather.openweathermap``
|
||||
``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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``wiimote``
|
||||
``platypush.backend.wiimote``
|
||||
=============================
|
||||
|
||||
.. automodule:: platypush.backend.wiimote
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``zigbee.mqtt``
|
||||
``platypush.backend.zigbee.mqtt``
|
||||
=================================
|
||||
|
||||
.. automodule:: platypush.backend.zigbee.mqtt
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``zwave.mqtt``
|
||||
``platypush.backend.zwave.mqtt``
|
||||
================================
|
||||
|
||||
.. automodule:: platypush.backend.zwave.mqtt
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``zwave``
|
||||
``platypush.backend.zwave``
|
||||
===========================
|
||||
|
||||
.. automodule:: platypush.backend.zwave
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``adafruit``
|
||||
``platypush.message.event.adafruit``
|
||||
====================================
|
||||
|
||||
.. automodule:: platypush.message.event.adafruit
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``alarm``
|
||||
``platypush.message.event.alarm``
|
||||
=================================
|
||||
|
||||
.. automodule:: platypush.message.event.alarm
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
``application``
|
||||
``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