Compare commits

...

293 commits

Author SHA1 Message Date
b8215d2736 A more robust cron start logic
If may happen (usually because of a race condition) that a cronjob has
already been started, but it hasn't yet changed its status from IDLE to
RUNNING when the scheduler checks it.

This fix guards the application against such events. If they occur, we
should just report them and move on, not terminate the whole scheduler.
2022-10-27 10:45:59 +02:00
a5db599268
FIX: Skip empty lines on config.include 2022-10-14 20:56:18 +02:00
b88983f055
Added qos argument to mqtt.publish. 2022-10-05 01:13:47 +02:00
85f583a0ad
Reduced :maxdepth: of toctree in documentation.
Recent versions of Sphinx get a bit too zealous about generating deeply
nested toctrees.
2022-09-30 11:47:19 +02:00
fed7c2c6ff
Fixed typo in schema path 2022-09-30 11:30:57 +02:00
1d78c3e753
FIX: Broken docstring 2022-09-30 10:56:08 +02:00
00d47731c5 Merge pull request 'Mimic3 integration' (#227) from 226-mimic3-integration into master
Reviewed-on: platypush/platypush#227
2022-09-30 10:52:53 +02:00
ae226a5b01
Added tts.mimic3 integration.
Closes: #226
2022-09-30 10:51:17 +02:00
fef7aff245
LINT fixes for mpv plugin 2022-09-30 10:41:56 +02:00
82ab7face2
A more robust logic to detect the webserver local bind address 2022-09-30 03:10:37 +02:00
3ed10092ae Merge pull request 'Wallabag integration' (#225) from 222-wallabag-integration into master
Reviewed-on: platypush/platypush#225
2022-09-29 10:52:16 +02:00
4bab9d2607
[#224] Implemented Wallabag integration 2022-09-29 10:51:16 +02:00
a0575ed6de
Bump version: 0.23.5 → 0.23.6 2022-09-19 20:41:02 +02:00
3d74f0a11f
Updated CHANGELOG 2022-09-19 20:40:54 +02:00
09baceab4b
Include album_id and the list of tracks in music.tidal.get_album 2022-09-19 20:39:21 +02:00
c2a3f2f4f3
Bump version: 0.23.4 → 0.23.5 2022-09-18 19:55:05 +02:00
36dd645209
Use session.playlist instead of session.user.playlist to query playlists 2022-09-18 06:04:53 +02:00
61cda60751
Proper implementation for Tidal's add_to_playlist and remove_from_playlist methods
- Using tidalapi's `UserPlaylist.add` and `UserPlaylist.delete` methods
  instead of defining my own through `_api_request`, so we won't have to
  deal with the logic to set the ETag header.

- Added `remove_from_playlist` method.
2022-09-18 05:22:12 +02:00
7c610adc84
FIX: Apply expanduser to the credentials_file setting in music.tidal 2022-09-17 06:30:20 +02:00
a9ebb4805a
Fixed doc warnings 2022-09-17 06:25:28 +02:00
1b405de0d5
Added missing docs 2022-09-17 06:09:39 +02:00
e1aa214bad tidal-integration (#223)
Reviewed-on: platypush/platypush#223
2022-09-16 21:48:09 +02:00
41acf4b253
Generate event ID as true random strings, not MD5 hashes of UUIDs 2022-09-05 03:08:39 +02:00
c77746e278 If the output of a hook is null, make sure to normalize it an empty string before pushing it to Redis 2022-09-04 16:16:02 +02:00
4682fb4210
Throw an assertion error when on_duplicate_update is specified on db.insert with no key_columns 2022-09-04 16:02:37 +02:00
0143dac216
Improved support for bulk database statements
- Wrapped insert/update/delete operations in transactions
- Proper (and much more efficient) bulk logic
- Better upsert logic
- Return inserted/updated records if the engine supports it
2022-09-04 13:30:35 +02:00
a90aa2cb2e Make sure that a webhook function never returns a null response 2022-09-04 00:52:41 +02:00
1ea53a6f50
Support for query placeholders in db.select 2022-09-04 00:28:08 +02:00
e77d6a4ad4 Merge pull request 'Add support for OPML import and export in the RSS plugin' (#220) from 219-opml-import-export into master
Reviewed-on: platypush/platypush#220
2022-09-02 00:24:37 +02:00
61c96612bc Merge branch 'master' into 219-opml-import-export 2022-09-02 00:23:57 +02:00
6c6e68b512
Added support for OPML import and export in the RSS plugin.
[closes #219]
2022-09-02 00:21:40 +02:00
a286cf5000 Updated PopcornTime base URL 2022-09-01 11:13:16 +02:00
c5b12403d0
Implemented support for returning richer HTTP responses on webhooks.
A `WebhookEvent` hook can now return a tuple in the format `(data,
http_code, headers)` in order to customize the HTTP status code and the
headers of a response.
2022-09-01 01:37:18 +02:00
96b2ad148c
A smarter way of building and matching the event condition 2022-08-31 02:19:21 +02:00
67413c02cd
Handle the case where the condition is a serialized dictionary 2022-08-31 01:55:21 +02:00
db45d7ecbf
FIX: More robust logic against section configurations that may not be maps 2022-08-31 01:27:53 +02:00
a675fe6a92
Updated CHANGELOG 2022-08-31 00:49:08 +02:00
c3fa3315f5
Implemented synchronization with webhook responses.
When a client triggers a `WebhookEvent` by calling a configured webhook
over `/hook/<hook_name>`, the server will now wait for the configured
`@hook` function to complete and it will return the returned response
back to the client.

This makes webhooks much more powerful, as they can be used to proxy
HTTP calls or other services, and in general return something to the
client instead of just executing actions.
2022-08-30 23:35:19 +02:00
e08947a3b7
Merge pull request #311 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/terser-5.14.2
Bump terser from 5.12.1 to 5.14.2 in /platypush/backend/http/webapp
2022-08-29 00:59:55 +02:00
6d63d2fc74
Merge pull request #305 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/shell-quote-1.7.3
Bump shell-quote from 1.7.2 to 1.7.3 in /platypush/backend/http/webapp
2022-08-29 00:59:19 +02:00
540a7d469e
- Fixed documentation errors and warnings
- Split Matrix integration into `plugin` and `client` files.
2022-08-29 00:55:46 +02:00
b11a0e8bbb
Bump version: 0.23.3 → 0.23.4 2022-08-28 15:27:54 +02:00
f4360dc0e0 Merge pull request 'Matrix Integration' (#217) from matrix-integration into master
Reviewed-on: platypush/platypush#217

Closes: #2
2022-08-28 15:21:05 +02:00
ba68341d28 Merge branch 'master' into matrix-integration 2022-08-28 15:19:58 +02:00
4308024eef
Added missing docs 2022-08-28 15:18:23 +02:00
c417d2f692
Implemented last Matrix integration features.
- Added presence, typing and seen receipt events.
- Added set display_name and avatar methods.
2022-08-28 15:17:11 +02:00
e479ca7e3e
Completing the Matrix plugin integration
Newly implemented actions:

- `get_messages`
- `get_room_members`
- `update_device`
- `delete_devices`
- `room_alias_to_id`
- `add_room_alias`
- `delete_room_alias`
- `kick`
- `ban`
- `unban`
- `forget`
2022-08-28 12:26:27 +02:00
0e3cabc5f6
Support attribute parameter on Function schema fields. 2022-08-28 11:55:30 +02:00
d890b6cbe8
Added create_room action 2022-08-27 23:26:42 +02:00
912168626c
Added join_room, leave_room and invite_to_room and extended handling on invitation events 2022-08-27 21:50:48 +02:00
513195b396
Implemented support for file upload 2022-08-27 15:12:50 +02:00
48ec6ef68b
Implemented proper support for encrypted media and added download method 2022-08-26 23:48:29 +02:00
e4eb4cd7dc
More granular control over trusted devices, and added global synchronization event 2022-08-25 00:34:01 +02:00
550f026e13
Cleaner logging for assertion errors in plugin actions 2022-08-25 00:30:53 +02:00
c89c712928
Fixed device trust process 2022-08-24 01:49:43 +02:00
05908e1a77
Fixing key verification process 2022-08-17 10:28:31 +02:00
c04bc8d2bc
The matrix plugin joins the AsyncRunnablePlugin family too 2022-08-15 02:18:29 +02:00
2797ffbe53
The websocket plugin now extends AsyncRunnablePlugin too 2022-08-15 02:18:29 +02:00
770a14daae
ntfy plugin migrated to AsyncRunnablePlugin.
This commit removes a lot of the loop management boilerplate.
2022-08-15 02:18:29 +02:00
dba03d3e33
Added AsyncRunnablePlugin class.
This class handles runnable plugins that have their own asyncio event
loop, without the pain usually caused by the management of multiple
threads + asyncio loops.
2022-08-15 02:18:28 +02:00
f4672ce5c3
Refactored concurrency model in ntfy plugin 2022-08-15 02:18:28 +02:00
9e2b4a0043
Removed references to deprecated websockets attributes 2022-08-15 02:18:28 +02:00
4e3c6a5c16
The websocket plugin now extends AsyncRunnablePlugin too 2022-08-15 02:17:05 +02:00
e17e65a703
ntfy plugin migrated to AsyncRunnablePlugin.
This commit removes a lot of the loop management boilerplate.
2022-08-15 02:17:05 +02:00
3b1ab78268
Added AsyncRunnablePlugin class.
This class handles runnable plugins that have their own asyncio event
loop, without the pain usually caused by the management of multiple
threads + asyncio loops.
2022-08-15 02:17:05 +02:00
4043878afd
Refactored concurrency model in ntfy plugin 2022-08-15 02:16:25 +02:00
2e7f3d8868
Removed references to deprecated websockets attributes 2022-08-12 15:22:04 +02:00
dc7ba881f1
Merge branch 'master' into matrix-integration 2022-08-12 14:39:13 +02:00
4e1e6da67e
Added recv action on websocket plugin 2022-08-12 14:16:01 +02:00
354f3906f9
Changed autojoin_on_invite default value 2022-08-12 00:11:15 +02:00
7ab02e705d
Removed redundant _action_wrapper decorator 2022-08-05 19:04:43 +02:00
99de5318ff
Merge pull request #313 from BlackLight/snyk-upgrade-58f5a7acf019c661bec911d06f0bf10a
[Snyk] Upgrade core-js from 3.21.1 to 3.23.4
2022-08-05 13:26:25 +02:00
b3bab9b1d8
Merge pull request #314 from BlackLight/snyk-upgrade-9823d0f9eee2d94f4547598322ba6a48
[Snyk] Upgrade vue-router from 4.0.14 to 4.1.2
2022-08-05 13:26:07 +02:00
7e4877c793
Merge pull request #315 from BlackLight/snyk-upgrade-30cde2b595c9da96da481c691c0964d5
[Snyk] Upgrade sass from 1.49.9 to 1.53.0
2022-08-05 13:23:38 +02:00
55602cc282
Merge branch 'master' into snyk-upgrade-30cde2b595c9da96da481c691c0964d5 2022-08-05 13:05:25 +02:00
d2053a012a
Merge pull request #316 from BlackLight/snyk-upgrade-ba00badb7e42a7b25417256efb18f67b
[Snyk] Upgrade sass-loader from 10.2.1 to 10.3.1
2022-08-05 13:03:46 +02:00
snyk-bot
3d5fc9a10b
fix: upgrade sass-loader from 10.2.1 to 10.3.1
Snyk has created this PR to upgrade sass-loader from 10.2.1 to 10.3.1.

See this package in npm:
https://www.npmjs.com/package/sass-loader

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-04 20:31:51 +00:00
snyk-bot
be4dd48d76
fix: upgrade sass from 1.49.9 to 1.53.0
Snyk has created this PR to upgrade sass from 1.49.9 to 1.53.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-04 20:31:45 +00:00
snyk-bot
bd21779a17
fix: upgrade vue-router from 4.0.14 to 4.1.2
Snyk has created this PR to upgrade vue-router from 4.0.14 to 4.1.2.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-04 20:31:33 +00:00
snyk-bot
58afc1090c
fix: upgrade core-js from 3.21.1 to 3.23.4
Snyk has created this PR to upgrade core-js from 3.21.1 to 3.23.4.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2022-08-04 20:31:28 +00:00
cbe2e7bbfe
[WIP] 2022-08-04 03:08:54 +02:00
c17d0080b5
Merge branch 'master' into matrix-integration 2022-08-04 02:14:22 +02:00
7c87238fec
match_condition should return immediately (no score-based fuzzy search) if an event condition is an exact match 2022-08-04 01:04:00 +02:00
55671f4aff
If a request on a RunnablePlugin throws an exception then we should also restart the plugin upon reload
Plus some Black/LINT chores
2022-07-25 00:41:08 +02:00
c32142c8b5
Added wait_stop() method to RunnablePlugin 2022-07-23 17:33:23 +02:00
32be4df11c
More robust way to retrieve an object's attribute on schemas 2022-07-23 17:32:14 +02:00
dependabot[bot]
c7927a3d2f
Bump terser from 5.12.1 to 5.14.2 in /platypush/backend/http/webapp
Bumps [terser](https://github.com/terser/terser) from 5.12.1 to 5.14.2.
- [Release notes](https://github.com/terser/terser/releases)
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/commits)

---
updated-dependencies:
- dependency-name: terser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-21 00:35:29 +00:00
3edb8352b4
Support sections with empty bodies in the YAML configuration files. 2022-07-16 02:09:22 +02:00
cc29136db7
[#2] Support for caching rooms info and exposing them in the events 2022-07-15 00:37:21 +02:00
719bd4fddf
[#217 WIP] Initial plugin implementation.
- Added initial synchronization and users cache.
- Added loop to poll for new events (TODO: use websocket after the first sync)
- Added login, sync and join actions
2022-07-14 01:50:46 +02:00
cbf8ba7fdd
Updated wiki URLs and replaced Gitlab references with Gitea 2022-07-06 22:01:25 +02:00
dependabot[bot]
06168d4ebd
Bump shell-quote from 1.7.2 to 1.7.3 in /platypush/backend/http/webapp
Bumps [shell-quote](https://github.com/substack/node-shell-quote) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/substack/node-shell-quote/releases)
- [Changelog](https://github.com/substack/node-shell-quote/blob/master/CHANGELOG.md)
- [Commits](https://github.com/substack/node-shell-quote/compare/v1.7.2...1.7.3)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 11:29:13 +00:00
c6c7128099
Wrapped clipboard management logic in a try-except block to prevent the clipboard plugin from failing hard 2022-06-14 16:47:52 +02:00
1a316bc3a6
Added reference to the Matrix channel 2022-06-14 09:41:14 +02:00
5966566d54
Fixed LGTM warnings 2022-06-10 20:56:40 +02:00
8d26c8634d Keep the ntfy process in stop_wait state even when the plugin is configured with no subscriptions 2022-06-09 11:59:29 +02:00
1da17fca35 Print invalid rules to help debug broken configurations 2022-06-08 15:34:14 +02:00
35cb72f5aa
Do a lazy plugin initialization in the Variable class
This is useful for two reason:

1. Slightly faster variable initialization times.
2. The cached variable object won't fail on the next `.get()`/`.set()`
   if the `db` or `redis` plugins have failed for some reason.
2022-06-07 00:04:29 +02:00
115bed7d8b
Added limit parameter to lastfm.get_similar_tracks 2022-06-06 14:12:45 +02:00
3d22d6b082
Added get_track and get_similar_tracks methods on lastfm plugin 2022-06-05 18:49:34 +02:00
5971ec32c8
Removed clipboard backend.
The relevant clipboard monitoring logic has been moved to the
`clipboard` plugin. Thus, enabling the plugin should provide all the
feature, with no need for an additional backend.
2022-06-04 12:32:02 +02:00
7e31ac6ed8
Added missing web build files 2022-06-02 23:41:50 +02:00
c9f435a6cb
Added support for ntfy notification on the frontend (just like Pushbullet) 2022-06-02 23:36:43 +02:00
cb7021152f
Added get_recent_tracks method to the lastfm plugin 2022-06-02 20:57:35 +02:00
d3f4865395
Fixed variable name conflict 2022-06-02 01:44:38 +02:00
f080478385
s/click_url/url/g in ntfy message definitions 2022-06-02 00:40:26 +02:00
b857ce60a7
Bump version: 0.23.2 → 0.23.3 2022-06-01 23:08:32 +02:00
af483cade3 Merge branch '219-ntfy-integration' into 'master'
ntfy integration

Closes #219

See merge request platypush/platypush!14
2022-06-01 23:07:37 +02:00
8be515c17b
[closes #219] Added ntfy integration 2022-06-01 23:01:29 +02:00
239025290d
--redis-queue argument should be a string 2022-05-25 10:11:29 +02:00
2e2169544d
Added Matrix chat badge and instructions for installation on Arch Linux 2022-05-23 00:09:23 +02:00
7a0e39111d FIX: A feed entry may not necessarily have an id attribute 2022-05-06 14:38:25 +02:00
2cd7ae9513
Merge pull request #288 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/async-2.6.4
Bump async from 2.6.3 to 2.6.4 in /platypush/backend/http/webapp
2022-04-29 16:52:07 +02:00
55958c1b57
[#217] Casting get_next to datetime to prevent DST issues 2022-04-28 23:29:45 +02:00
e9454b0c0f Merge branch '217-cron-decorated-function-are-off-after-dst-change' into 'master'
Resolve "@cron decorated function are off after DST change"

Closes #217

See merge request platypush/platypush!13
2022-04-28 01:14:18 +02:00
ba23eb7280
Small LINT fix 2022-04-28 01:04:30 +02:00
41d0725ebf
Fix for #217
The cron scheduler has been made more robust against changes in the
system clock (caused by e.g. DST changes, NTP syncs or manual setting).

A more granular management for cronjob events has been introduced, now
supporting a `TIME_SYNC` event besides the usual `STOP`. When the cron
scheduler detects a system clock drift (i.e. the timestamp offset before
and after a blocking wait is >1 sec) then all the cronjobs are notified
and forced to refresh their state.
2022-04-28 00:57:49 +02:00
820a1c8184
Don't raise a pytest warning upon the asyncio "No event loop" warning 2022-04-27 23:25:14 +02:00
dependabot[bot]
5929602c15
Bump async from 2.6.3 to 2.6.4 in /platypush/backend/http/webapp
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-27 12:55:03 +00:00
fee5fc4ae0
HTTP backend dependencies moved from optional to required
If Platypush is supposed to work also without a manually created
`config.yaml`, and the HTTP backend is enabled by default in that
configuration, then Flask and companions should be among the required
dependencies.
2022-04-27 14:52:41 +02:00
371fd7e46b
Generate a default config.yaml if none is present instead of failing 2022-04-27 13:57:42 +02:00
da73a5f1b9
Replaced deprecated json_output arg in NextCloud client with response.json_data 2022-04-26 19:30:26 +02:00
a80adc996f [WIP] Default config.yaml in case a configuration file is missing in the default locations 2022-04-25 16:54:26 +02:00
12887b61fe Don't fail hard if the Linode API doesn't return a list of instances 2022-04-25 14:02:40 +02:00
ca25607262
Skip string and underscore normalization in black 2022-04-04 20:55:10 +02:00
1b30bfc454
Added more pre-commit hooks 2022-04-04 17:21:47 +02:00
486801653a
Added .exception action to logger plugin 2022-04-03 00:26:39 +02:00
f7c594cc3f
get_bus() should return a default RedisBus() instance if the main bus is not registered 2022-04-02 22:47:23 +02:00
b1491b8048
Better style for scrollbars 2022-03-30 17:42:09 +02:00
96a2d8bef0
Fixed size for nav icons with static images 2022-03-30 13:53:10 +02:00
e261dcc27a
More UI fixes 2022-03-30 01:43:59 +02:00
d0790aaba3
Better style for toggle switches 2022-03-29 23:45:57 +02:00
bb28617cc9
Refactored slider and range-slider components 2022-03-29 14:36:17 +02:00
e1e6da9307
Fixed icon size for img tags in nav bar 2022-03-28 16:00:18 +02:00
f6ce0d7200
Fixed broken paddings after bulma removal 2022-03-28 13:13:31 +02:00
ed5f7070a2
Removed bulma dependency from frontend
The UI is now much faster, the build process completes within one minute
(it used to take >15 minutes), and the size of the bundles has been
reduced by ~70%.
2022-03-28 12:54:36 +02:00
5ee47902f4
Refactored camera stream route 2022-03-28 12:44:04 +02:00
128b45686a
Updated Vue dependencies for the webapp 2022-03-28 01:19:21 +02:00
3d192a9733
Removed unused import 2022-03-27 22:01:25 +02:00
08acaad218
Merge pull request #284 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6 in /platypush/backend/http/webapp
2022-03-27 18:36:51 +02:00
385914c04a
Added missing docs for gpio events 2022-03-27 18:30:46 +02:00
dependabot[bot]
b72c9a19ae
Bump minimist from 1.2.5 to 1.2.6 in /platypush/backend/http/webapp
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-27 14:45:19 +00:00
2e33d3b3c5
Bump version: 0.23.1 → 0.23.2 2022-03-27 16:43:36 +02:00
c5395cc9e5 Merge branch '212-starting-cronjob-with-high-pin' into 'master'
Resolve "Starting Cronjob with High Pin"

Closes #212

See merge request platypush/platypush!11
2022-03-27 16:30:54 +02:00
88846aa8f8 Updated CHANGELOG 2022-03-27 16:28:26 +02:00
ffd23cf04d [#212] Support for asynchronous event monitoring on the GPIO plugin 2022-03-27 16:14:30 +02:00
34e1e673e8
CHANGELOG update and LINT fixes 2022-03-12 02:04:07 +01:00
c3934e2a7e
Script API for platform variables [closes #206]
Added utility `platypush.context.Variable` class to simplify the
interaction with platform variables in custom Python scripts.
2022-03-12 01:51:18 +01:00
b3b2a7a805
Generating the README TOC via pre-commit script [closes #209] 2022-03-09 23:43:10 +01:00
747e7f3e5d
Fixed table of contents in README [closes #209] 2022-03-09 21:35:47 +01:00
fdf6d8fb4e
Better auto-generated documentation and fixed docstring warnings 2022-03-03 20:26:25 +01:00
7c9e9d284d
Bump version: 0.23.0 → 0.23.1 2022-03-01 12:50:31 +01:00
19a1e9c626
Updated CI/CD pipeline - now using repo tokens to push new releases to pypi 2022-03-01 12:50:13 +01:00
c0039c3f87
Bump version: 0.22.10 → 0.23.0 2022-03-01 01:33:43 +01:00
0d0797a465
Added Jellyfin integration 2022-03-01 01:32:50 +01:00
0b293ff214
gitignore 2022-02-21 22:23:40 +01:00
75ad537155
Merge pull request #273 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/url-parse-1.5.7
Bump url-parse from 1.5.4 to 1.5.7 in /platypush/backend/http/webapp
2022-02-20 00:24:58 +01:00
dependabot[bot]
0324eb9f6b
Bump url-parse from 1.5.4 to 1.5.7 in /platypush/backend/http/webapp
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.4 to 1.5.7.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.4...1.5.7)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-19 16:39:08 +00:00
e3f67766a3
Proper fix for variable arguments on process_data 2022-02-17 12:43:56 +01:00
1933ec709f
FIX: Proper fix for process_data taking a variable number of arguments 2022-02-17 11:50:04 +01:00
71cb73cf63
FIX: The CN of the organizer may not necessarily be set in calendar.ical 2022-02-17 10:55:35 +01:00
94bb3e0541
Added TOC to readme and more LGTM fixes 2022-02-09 21:06:49 +01:00
29a7eff15a
Fixed/suppressed LGTM warnings 2022-02-08 21:51:37 +01:00
d13e4fc271
Merge pull request #240 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/axios-0.21.2
Bump axios from 0.21.1 to 0.21.2 in /platypush/backend/http/webapp
2022-02-07 21:41:29 +01:00
6e0c249b7e
Merge pull request #267 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/url-parse-1.5.4
Bump url-parse from 1.5.1 to 1.5.4 in /platypush/backend/http/webapp
2022-02-07 21:40:24 +01:00
2944a77f93
Merge pull request #265 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/nanoid-3.2.0
Bump nanoid from 3.1.23 to 3.2.0 in /platypush/backend/http/webapp
2022-02-07 21:39:06 +01:00
dependabot[bot]
5b666814d5
Bump nanoid from 3.1.23 to 3.2.0 in /platypush/backend/http/webapp
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.23 to 3.2.0.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.23...3.2.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 20:38:55 +00:00
dependabot[bot]
21ad599a08
Bump url-parse from 1.5.1 to 1.5.4 in /platypush/backend/http/webapp
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.4.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.4)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 20:37:56 +00:00
782c198311
Merge pull request #266 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/follow-redirects-1.14.7
Bump follow-redirects from 1.14.1 to 1.14.7 in /platypush/backend/http/webapp
2022-02-07 21:37:09 +01:00
08b3cddb7b
Added missing docs for dbus events 2022-02-07 21:29:21 +01:00
530245733c
FIX: Fixed defusedxml module mock definition in docs/conf.py 2022-02-07 20:47:56 +01:00
dependabot[bot]
1662873e54
Bump follow-redirects in /platypush/backend/http/webapp
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.7.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.7)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 15:00:43 +00:00
42ee149b95
Bump version: 0.22.9 → 0.22.10 2022-02-07 15:59:20 +01:00
1038090ffd
LINT fixes 2022-02-07 15:51:12 +01:00
786286eac6
Refactored D-Bus integration
- Added ability to listen for signals
- Improved introspection output
- `dbus` plugin and backend have now been merged
- Migrated from `dbus` to `pydbus`
2022-02-07 15:45:43 +01:00
1914322fda
FIX: get_plugin methods should never swallow errors in case of failed initialization 2022-02-07 01:47:38 +01:00
e4eb12fa6d
LINT warning fixes 2022-01-23 14:25:00 +01:00
c534adf31f
varname typo fix 2022-01-17 16:39:40 +01:00
0c423e3809
FIX: SensorDataChangeEvent trigger logic
The event should be skipped only if new_data is null or an empty,
list/object, not if it contains
a zero/false-y value.
2022-01-17 16:38:43 +01:00
6656bb4ce5
Revert "Support for SSL flag on MQTT plugins without having to specify other tls_* options"
This reverts commit f3be4a50d8.
2022-01-14 21:53:24 +01:00
f3be4a50d8
Support for SSL flag on MQTT plugins without having to specify other tls_* options 2022-01-14 21:39:16 +01:00
a6b552504e
FIX: Use a separate error handler for the Pushbullet backend that doesn't raise another exception (prevents maximum recursion errors in the logs caused by the interpreter entering an infinite loop of error handlers) 2022-01-08 19:52:41 +01:00
833e1c49be
Bump version: 0.22.8 → 0.22.9 2022-01-06 14:08:55 +01:00
a46ce79f0a
Added guard against null variable names 2022-01-06 00:58:14 +01:00
e9f6d9a8bc
Refactored RSS integration into its own rss plugin [closes #199] 2022-01-06 00:46:05 +01:00
3e4b91cd6c
Removed pytz dependency 2022-01-05 18:04:32 +01:00
e242dc53bf FIX: All timestamps should be isoformat strings, otherwise come comparisons may break 2022-01-05 13:39:13 +01:00
ee0b6d237a FIX: Timestamps on calendar parsed objects should be of type string, not datetime 2022-01-05 13:35:10 +01:00
9ba2c18595 Better logic for timezone handling/conversion in calendar plugin 2022-01-05 13:31:07 +01:00
0a3fd4065a
Proper implementation for filesystem monitor filters
The logic Watchdog applies to filter events based
on `ignore_directories`, `ignore_patterns` and
`ignore_regexes` isn't really sophisticated, and
it doesn't check whether a partial directory/file
name is used in one of the `ignore_*` patterns.
The `file.monitor` backend should therefore implement
this logic on its side.
2021-12-20 00:58:41 +01:00
e94d338de5
Proper handling for ignore_directories in file.monitor backend 2021-12-19 02:28:49 +01:00
081da3eb84
Bump version: 0.22.7 → 0.22.8 2021-12-13 21:21:42 +01:00
1569f940c6
FIX: had accidentally removed an on_mqtt_message usage 2021-12-13 21:21:12 +01:00
6df9cbcf3c
Bump version: 0.22.6 → 0.22.7 2021-12-13 20:47:50 +01:00
e98aa63110
Updated CHANGELOG 2021-12-13 20:46:21 +01:00
fa0f4925ed
New client ID generation logic (closes #205)
MQTT client IDs are now generated as a function of
`(client_id, host, port, topics, on_message)` to
prevent client ID clashes.
2021-12-13 20:34:06 +01:00
fa708663e1
Replaced command-line uwsgi wrapper in the backend.http docs with gunicorn
gunicorn makes it easier to set up a uWSGI wrapper
around the web application, and it's easier to
install and document than handling uwsgi as an
external system dependency.
2021-12-11 22:44:00 +01:00
20fc3d91fc
Updated Chromecast plugin to work with pychromecast >= 10.0
pychromecast 10.0 introduced some [breaking changes](https://github.com/home-assistant-libs/pychromecast/pull/556/files)
in the declaration of the Chromecast object -
namely, the `device` attribute has been renamed to
`cast_info`. The code of ChromecastPlugin has been
updated to guarantee compatibility in both cases.
2021-12-11 22:14:47 +01:00
2560bfa03f
Plex searcher extended to include also audio tracks 2021-12-04 00:08:47 +01:00
46d8d575ba
Handle and log media workers search errors 2021-12-03 21:54:41 +01:00
f478e1ff40
Added libcap-dev to build requirements for Ubuntu Docker images 2021-11-28 22:40:04 +01:00
Fabio Manganiello
6023fd3db3 Given the new object-oriented design of the LTR559 library, the sensor object should be initialized in __init__ and read upon get_measurement() 2021-11-28 15:11:20 +01:00
Fabio Manganiello
f6057274a0 Variable name fix 2021-11-28 11:32:03 +01:00
Fabio Manganiello
2d9dff7d4c Fixed LTR559 integration after a change in the core library interface 2021-11-28 11:25:41 +01:00
f74ca28382
Bump version: 0.22.5 → 0.22.6 2021-11-27 10:56:28 +01:00
e615891bf3
Fixed missed assignment 2021-11-27 02:00:43 +01:00
02b5ec1d38
Fixed regex typo 2021-11-27 01:43:57 +01:00
2914a74b75
Replace relative links in converted markdown 2021-11-27 01:19:55 +01:00
1e1bf46f32
Fixed handling of URLs on Pushbullet notes 2021-11-26 19:07:44 +01:00
848b736d6e
Support for output format type on http.webpage.simplify even when outfile is not specified 2021-11-26 19:07:15 +01:00
f9f9c38a8b
Improved robustness of ICal event parser 2021-11-21 23:50:35 +01:00
518d9f20c6
Added docs for config plugin 2021-11-17 23:59:17 +01:00
40903393df
Removed pydoc of internal plugin methods that were propagated to the docs of all the derived plugins 2021-11-15 01:57:44 +01:00
d5cddc23fa
Fixed autodoc indentation 2021-11-15 01:21:31 +01:00
ea3b49a17f
Use inherited-members: true in autodoc_default_options to ensure documentation of inherited actions 2021-11-15 01:05:53 +01:00
adb9672989
Bump version: 0.22.4 → 0.22.5 2021-11-15 00:12:42 +01:00
b432488876
Prevent null pointer on music.spotify backend stop if the Librespot process has already been terminated 2021-11-15 00:10:40 +01:00
65d4740cd7 Merge branch '201-mailgun-integration' into 'master'
Resolve "Mailgun integration"

Closes #201

See merge request platypush/platypush!10
2021-11-14 22:42:45 +01:00
6ba3128ac4
[#201] Added Mailgun integration 2021-11-14 22:40:59 +01:00
82fe4d93f3 Merge branch '203-irc-integration' into 'master'
Resolve "IRC integration"

Closes #203

See merge request platypush/platypush!9
2021-11-14 19:47:18 +01:00
d7b273434b
[#203] Added IRC integration 2021-11-14 19:43:19 +01:00
dependabot[bot]
5491682543
Bump axios from 0.21.1 to 0.21.2 in /platypush/backend/http/webapp
Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-07 10:46:07 +00:00
3ef602cc0b
Fixed typo in AVS repo URL [closes #204] 2021-11-07 11:45:04 +01:00
195ae5c488
Create application ngrok tunnel method moved to utils 2021-11-07 11:35:47 +01:00
de25719563
Replaced deprecated arguments in librespot 2021-11-07 01:19:34 +01:00
e86c61a44d Merge branch '202-mastodon-integration' into 'master'
Resolve "Mastodon integration"

Closes #202

See merge request platypush/platypush!8
2021-11-07 01:00:29 +01:00
acdc636b1f Resolve "Mastodon integration" 2021-11-07 01:00:29 +01:00
6db070db1c
- Fixed switchbot.status to handle virtual devices
- Fixed StrippedString schema field serialize handler

- Fixed rendering of lists in documentation schemas
2021-10-26 00:48:05 +02:00
952a2a9379
- Render nested attributes in schemas
- Provide relevant examples for schema fields with no description/examples based on the field type

- Fixed RST warnings in Slack plugin

- Fixed list of events in ngrok plugin
2021-10-24 11:53:38 +02:00
49676fcc7f
Don't fail hard if the Zeroconf service can't be registered 2021-10-24 02:54:20 +02:00
6c0a8bf259
Bump version: 0.22.3 → 0.22.4 2021-10-19 23:30:25 +02:00
1906876969
FIX: Replaced VLC event.u occurrences
Newer versions of python-vlc have apparently
removed the `event.u` union object from the
events dispatched by the player, resulting in
player callback failures.

The occurrences of `event.u` have therefore
been replaced with the player methods to
correctly retrieve the current state.
2021-10-17 17:56:57 +02:00
f9ce03919b
FIX: Various omxplayer fixes
- Better synchronization with the player upon `play` request - wait until the play started event is received before returning the status

- DBus exceptions should be caught and handled in the status call
2021-10-17 16:54:57 +02:00
c3681e7b2a
FIX: Don't try and set the volume of the omxplayer when the instance may not be ready yet 2021-10-17 16:38:38 +02:00
144700b693
media.mpv should send MediaPlayRequestEvent with player and plugin parameters 2021-10-17 16:17:20 +02:00
4a5bb766af
Fixed some media plugins inconsistencies
- Removed replication of logic between media.get_youtube_url (action) and media.get_youtube_video_url (internal method)

- Added differentiation between MediaPlayEvent and MediaResumeEvent
2021-10-17 16:03:57 +02:00
cb4cfa40d8
Updated CHANGELOG 2021-10-17 02:55:26 +02:00
8c339d0d55
Added support for custom YouTube preferred video/audio formats 2021-10-17 02:53:38 +02:00
1962a8c4de
FIX: The response to a request received on the MQTT channel should be dispatched to <base_topic>/responses/<id>, not to <base_topic> 2021-10-17 01:57:47 +02:00
c664796733 Merge branch '115-google-maps-travel-time-integration' into 'master'
Resolve "Google Maps travel time integration"

Closes #115

See merge request platypush/platypush!7
2021-10-16 22:35:38 +02:00
64c402b1c0 [#115] Added google.maps.get_travel_time method 2021-10-16 22:35:37 +02:00
a5f1dc2638 CHANGELOG format fixes 2021-10-03 22:27:44 +02:00
0e27c8f68a Updated CHANGELOG 2021-10-02 23:53:21 +02:00
31ef9515f8 Added support for virtual IR devices in Switchbot plugin 2021-10-02 23:44:13 +02:00
d844890ab2 Bump version: 0.22.2 → 0.22.3 2021-10-01 23:53:05 +02:00
ee35ea995b Merge branch '198-feature-request-gotify-push-intergration' into 'master'
Resolve "[Feature Request] Gotify Push Intergration"

Closes #198

See merge request platypush/platypush!6
2021-10-01 23:50:53 +02:00
04a5480d19 Resolve "[Feature Request] Gotify Push Intergration" 2021-10-01 23:50:53 +02:00
e3f0219554 Errors should be caught also before a request action is executed (prevents HTTP timeouts when the error is on e.g. get_plugin() level) 2021-10-01 23:40:43 +02:00
fa17011b24 Fixed hierarchy for ngrok events 2021-10-01 23:39:07 +02:00
c12c83b386 Bump version: 0.22.1 → 0.22.2 2021-09-25 12:54:01 +02:00
229d05a40f Updated CI deploy pipeline to also include pip package upload to the local repo 2021-09-25 12:53:30 +02:00
c4bd854be2 Added docs for ngrok plugin 2021-09-25 01:37:19 +02:00
f856ae69e1 Merge branch 'plugin/ngrok' into 'master'
[#196] Added ngrok integration

Closes #196

See merge request platypush/platypush!4
2021-09-25 01:34:45 +02:00
68831e9e81 [#196] Added ngrok integration 2021-09-25 01:34:45 +02:00
d18245b15f Fixed Slack plugin docs 2021-09-22 00:38:34 +02:00
b961ef0424 update-aur-packages should also be executed upon new tags 2021-09-22 00:36:51 +02:00
cb0638fe19 Bump version: 0.22.0 → 0.22.1 2021-09-22 00:29:03 +02:00
98cb216ba7 Fixed LGTM warning 2021-09-22 00:22:42 +02:00
f147c44a8a Fixed docs issues 2021-09-22 00:19:14 +02:00
f720e7fc7f Merge branch 'gitlab-ci' into 'master'
Moved CI automation from Platypush hooks to Gitlab CI

See merge request platypush/platypush!3
2021-09-22 00:04:12 +02:00
10e11d66dc Moved CI automation from Platypush hooks to Gitlab CI 2021-09-22 00:04:11 +02:00
a1cd25fe5a zigbee.mqtt backend configuration should be fetched from the zigbee.mqtt plugin configuration if not reported 2021-09-17 22:35:01 +02:00
1a314ffd6b Fixed LGTM errors and warnings 2021-09-17 22:21:29 +02:00
85af031c26 Empty torrent responses can sometimes include the objects as an empty list instead of an empty dict 2021-09-17 10:47:01 +02:00
7b8938cb12 Fixed LGTM errors and warnings 2021-09-17 00:47:33 +02:00
8c31905534 Updated README 2021-09-17 00:05:06 +02:00
a2f5755496 Bump version: 0.21.4 → 0.22.0 2021-09-16 23:28:39 +02:00
fa11b13638 - Updated docs.
- Implemented synchronous behaviour (without background process and stdout/stderr log files) for `platyvenv start`.
2021-09-16 23:28:00 +02:00
2b5698bdfe Merge branch 'manifest-refactor' into 'master'
Moved to manifest files for describing plugins and backends and their dependencies

See merge request platypush/platypush!2
2021-09-16 17:53:41 +02:00
3bfc5b83ef Moved to manifest files for describing plugins and backends and their dependencies 2021-09-16 17:53:40 +02:00
ac0dd95bcc Bump version: 0.21.3 → 0.21.4 2021-08-24 23:01:45 +02:00
87b70716c1 Logic for supporting JWT tokens both as bytes and strings [closes #197] 2021-08-24 22:55:42 +02:00
a8064d2add parse_magnet_uri can return either a metadata object or a dict depending on the libtorrent version 2021-08-05 20:23:54 +02:00
d086da64f6 Bump version: 0.21.2 → 0.21.3 2021-07-28 01:09:27 +02:00
90ec108580 Added Slack integration 2021-07-28 01:09:09 +02:00
286bab7489 typo 2021-07-27 00:11:57 +02:00
0f37102ce4 Close Redis connection upon backend stop 2021-07-26 01:06:35 +02:00
8e2d4d0bce Make sure that the accept() in backend.tcp does not block the process 2021-07-25 11:33:48 +02:00
550fd3abe9 Don't fail on the Pushbullet close handler 2021-07-25 01:17:25 +02:00
2fc7327788 Missing import 2021-07-24 23:49:23 +02:00
371dd6da0a Added sun plugin [closes #194] 2021-07-22 01:02:15 +02:00
47228f2432 Bump version: 0.21.1 → 0.21.2 2021-07-20 01:36:59 +02:00
1483d602f8 Added music.spotify UI integration 2021-07-20 01:35:21 +02:00
00e744e93e Added type field metadata 2021-07-17 22:28:48 +02:00
35c4a30a63 Added music.spotify plugin and refactored MusicPlugin 2021-07-17 22:14:15 +02:00
f250681a78 Refactored documentation and changed theme 2021-07-17 14:41:35 +02:00
db8ea33b68 Removed deprecated setup.py web_build command from platydock [see #195] 2021-07-05 20:07:55 +02:00
03631bcebc Fixed import error in Adafruit.IO 2021-07-04 23:49:18 +02:00
ade3a7c2cf Added plugin_name to weather.buienradar events 2021-07-04 18:04:51 +02:00
1f6c7aae60 get_redis() should be a general utility method 2021-06-26 11:14:26 +02:00
a6c7d64511 Removed audio_format option from Spotify Connect backend (not supported by all versions of Librespot) 2021-06-25 23:20:21 +02:00
af7977bcf7 Added music.spotify.connect backend 2021-06-25 22:47:40 +02:00
0762004838 Bump version: 0.21.0 → 0.21.1 2021-06-22 23:40:53 +02:00
1872 changed files with 30791 additions and 29320 deletions

3
.gitignore vendored
View file

@ -19,3 +19,6 @@ platypush/requests
/http-client.env.json /http-client.env.json
/platypush/backend/http/static/css/dist /platypush/backend/http/static/css/dist
/tests/etc/dashboards /tests/etc/dashboards
.coverage
coverage.xml
Session.vim

72
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,72 @@
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

33
.gitlab/rebuild_docs.sh Executable file
View file

@ -0,0 +1,33 @@
#!/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

60
.gitlab/run_ci_tests.sh Executable file
View file

@ -0,0 +1,60 @@
#!/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

32
.pre-commit-config.yaml Normal file
View file

@ -0,0 +1,32 @@
# 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

View file

@ -1,12 +1,280 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
Given the high speed of development in the first phase, changes are being reported only starting from v0.20.2. Given the high speed of development in the first phase, changes are being
reported only starting from v0.20.2.
## [Unreleased] ## [Unreleased]
### Added ### Added
- Added [Wallabag integration](https://git.platypush.tech/platypush/platypush/issues/224).
- Added [Mimic3 TTS integration](https://git.platypush.tech/platypush/platypush/issues/226).
## [0.23.6] - 2022-09-19
### Fixed
- Fixed album_id and list of tracks on `music.tidal.get_album`.
## [0.23.5] - 2022-09-18
### Added
- Added support for web hooks returning their hook method responses back to the
HTTP client.
- Added [Tidal integration](https://git.platypush.tech/platypush/platypush/pulls/223)
- Added support for [OPML
subscriptions](https://git.platypush.tech/platypush/platypush/pulls/220) to
the `rss` plugin.
- Better support for bulk database operations on the `db` plugin.
### Fixed
- Now supporting YAML sections with empty configurations.
## [0.23.4] - 2022-08-28
### Added
- Added `matrix` integration
([issue](https://git.platypush.tech/platypush/platypush/issues/2),
[PR](https://git.platypush.tech/platypush/platypush/pulls/217)).
### Changed
- Removed `clipboard` backend. Enabling the `clipboard` plugin will also enable
clipboard monitoring, with no need for an additional backend.
## [0.23.3] - 2022-06-01
### Added
- Added `ntfy` integration (see #219).
- Support for a default `config.yaml` if one isn't specified in the default
locations.
### Changed
- The HTTP server dependencies are now marked as required, since the default
`config.yaml` will have the HTTP backend enabled by default in order to allow
the creation of a first user.
- Updated Vue.js frontend dependencies to the latest version.
- Removed bulma from the frontend dependencies, making the frontend much
lighter and loading times much faster.
- Other UI improvements.
### Fixed
- More reliable cronjobs in case of DST change or any clock changes in general
(see #217).
- Fixed `--redis-queue` argument.
## [0.23.2] - 2022-03-27
### Added
- Support for asynchronous events over GPIO PINs. It is now possible to specify
a list of `monitored_pins` in the [`gpio`
plugin](https://git.platypush.tech/platypush/platypush/-/blob/master/platypush/plugins/gpio/__init__.py)
configuration. A change in the value on those GPIO PINs (caused by e.g. a
button, a binary sensor or a probe) will trigger a
`platypush.message.event.gpio.GPIOEvent` that you can use in your automation
scripts.
- Simplified script API to interact with platform variables
(closes [#206](https://git.platypush.tech/platypush/platypush/-/issues/206)).
You can now read and write stored variables in your Platypush scripts through
a much more intuitive interface compared to explicitly using the `variable`
plugin explicitly:
```python
from platypush.context import Variable
# ...
my_var = Variable.get('my_var')
my_var = int(my_var) + 1
Variable.set(my_var=my_var)
```
## [0.23.0] - 2022-03-01
### Added
- Added [Jellyfin integration](https://git.platypush.tech/platypush/platypush/-/issues/208).
### Fixed
- Merged several PRs from `dependabot`.
- Fixed management of the `CN` field in the `calendar.ical` plugin.
## [0.22.10] - 2022-02-07
### Added
- Refactored the `dbus` integration. The plugin and backend have been merged into a
single plugin component, and the ability to subscribe to custom signals has been
added.
### Fixed
- Proper support for empty payloads on the integrations that trigger a `SensorDataChangeEvent`.
- Fixed possible infinite recursion on the Pushbullet integration in case of errors where the
error and close handlers keep calling each other in a loop.
## [0.22.9] - 2022-01-06
### Added
- Added `rss` integration (replaces the cumbersome and deprecated `backend.http.poll`).
### Fixed
- Fixed timezone handling in calendar integrations.
- Fixed handling of ignored directories in the `file.monitor` backend.
## [0.22.8] - 2021-12-13
### Added
- Added support for audio tracks in Plex integration.
### Changed
- Web server uWSGI wrapper changed from `uwsgi` to `gunicorn`.
### Fixed
- Fixed client ID assignment logic in MQTT backends to prevent client ID clashes and reconnections
(closes #205).
- Updated LTR559 integration to be compatible with the new API.
- Updated Chromecast integration to be compatible with `pychromecast >= 10`.
- Better handling of media errors.
## [0.22.6] - 2021-11-27
### Added
- Added support for converting webpages to markdown in `http.webpage.simplify`
even if no `outfile` is specified.
### Fixed
- Improved robustness of the ICal calendar parser in case some fields (e.g. `*status`)
are not defined.
## [0.22.5] - 2021-11-15
### Added
- Added `mastodon` plugin.
- Added `chat.irc` plugin.
- Added `mailgun` plugin.
### Fixed
- Fixed `switchbot.status` method in case of virtual devices.
- Fixed `platypush[alexa]` optional package installation.
## [0.22.4] - 2021-10-19
### Added
- Support for IR virtual devices in Switchbot plugin.
- Added [`google.maps.get_travel_time`](https://docs.platypush.tech/platypush/plugins/google.maps.html#platypush.plugins.google.maps.GoogleMapsPlugin.get_travel_time)
method (closes #115).
- Support for custom YouTube video/audio formats on media plugins.
### Fixed
- Responses for requests received over an MQTT backend are now delivered to the right topic
(`<device_base_topic>/responses/<msg_id>`).
- Various fixes on media plugins.
## [0.22.3] - 2021-10-01
### Added
- `gotify` integration (see #198).
## [0.22.2] - 2021-09-25
### Added
- `ngrok` integration (see #196).
## [0.22.1] - 2021-09-22
### Fixed
- `zigbee.mqtt` backend now no longer requires the MQTT backend/plugin to be enabled.
- Fixed bug on empty popcorn API responses.
### Changed
- Created CI Gitlab pipeline to replace the Platypush event-based pre-existing pipeline.
### Removed
- Removed docs references to removed/abstract integrations.
## [0.22.0] - 2021-09-16
### Changed
- Platypush now uses manifest files to describe plugins and backends. Each extension is now
expected to provide a `manifest.yaml` file in its folder, reporting its package name, pip
dependencies, required system packages and optional extra installation commands.
- Refactored `platyvenv`, `platydock`, documentation generation and plugin management engine.
They are now both faster and more robust, since they can rely on the manifest definition to
operate instead of pydoc strings conventions or `config.yaml` conventions.
- `platyvenv start` now starts the environment process synchronously and it prints
stdout/stderr instead of redirecting it to the logs dir (previous behaviour:
`platyvenv start` used to start the process asynchronously and the logs were stored
to `~/.local/share/platypush/venv/<env>/logs/<stdout|stderr>.log`).
### Removed
- Removed `Homeseer` integration - it was based on a Python integration that has now been
pulled out of PyPI and GitHub. A new integration may come in the future if there is enough
demand for it.
## [0.21.4] - 2021-08-24
### Fixed
- Fixed JWT token generation, since python-jwt >= 2.0 always returns strings (not bytes) upon `jwt.encode`.
## [0.21.3] - 2021-07-28
### Added
- Added `sun` plugin for sunrise/sunset events.
- Added `slack` integration.
## [0.21.2] - 2021-07-20
### Added
- Added `music.spotify` backend to emulate a Spotify Connect receiver through Platypush.
- Added `music.spotify` plugin.
- Added `music.spotify` UI integration.
## [0.21.1] - 2021-06-22
### Added
- Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of - Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of
directly accessing the device's Bluetooth interface. directly accessing the device's Bluetooth interface.
@ -30,6 +298,10 @@ Given the high speed of development in the first phase, changes are being report
- `switch.switchbot` plugin renamed to `switchbot.bluetooth` plugin, while the new plugin - `switch.switchbot` plugin renamed to `switchbot.bluetooth` plugin, while the new plugin
that uses the Switchbot API is simply named `switchbot`. that uses the Switchbot API is simply named `switchbot`.
### Fixed
- More robust reconnection logic on the Pushbullet backend in case of websocket errors.
## [0.21.0] - 2021-05-06 ## [0.21.0] - 2021-05-06
### Added ### Added
@ -72,7 +344,7 @@ Given the high speed of development in the first phase, changes are being report
- Added `<Camera>` dashboard widget. - Added `<Camera>` dashboard widget.
- Added support for custom dashboard widgets with customized (see https://git.platypush.tech/platypush/platypush/-/wikis/Backends#creating-custom-widgets). - Added support for custom dashboard widgets with customized (see https://git.platypush.tech/platypush/platypush/wiki/Backends#creating-custom-widgets).
- Added support for controls on `music.mpd` dashboard widget. - Added support for controls on `music.mpd` dashboard widget.

View file

@ -29,9 +29,11 @@ Guidelines:
- If the feature requires an optional dependency then make sure to document it: - If the feature requires an optional dependency then make sure to document it:
- In the class docstring (see other plugins and backends for examples) - In the class docstring (see other plugins and backends for examples).
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as - In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
an `extras_require` entry an `extras_require` entry.
- In [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) - - In the plugin/backend class pydoc string.
if the feature is optional then leave it commented and add a one-line comment to explain which - In the `manifest.yaml` - refer to the Wiki (how to write
plugin or backend requires it. [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.

View file

@ -1,2 +1,4 @@
recursive-include platypush/backend/http/webapp/dist * recursive-include platypush/backend/http/webapp/dist *
include platypush/plugins/http/webpage/mercury-parser.js include platypush/plugins/http/webpage/mercury-parser.js
include platypush/config/*.yaml
global-include manifest.yaml

505
README.md
View file

@ -6,39 +6,82 @@ Platypush
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/) [![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt) [![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/) [![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
[![Join chat on Matrix](https://img.shields.io/matrix/:platypush?server_fqdn=matrix.platypush.tech)](https://matrix.to/#/#platypush:matrix.platypush.tech)
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md) [![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python) [![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript) [![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
<!-- toc -->
- [Architecture](#architecture)
* [Plugins](#plugins)
* [Actions](#actions)
* [Backends](#backends)
* [Events](#events)
* [Hooks](#hooks)
* [Procedures](#procedures)
* [Cronjobs](#cronjobs)
* [The web interface](#the-web-interface)
- [Installation](#installation)
* [System installation](#system-installation)
+ [Install through `pip`](#install-through-pip)
+ [Install through a system package manager](#install-through-a-system-package-manager)
+ [Install from sources](#install-from-sources)
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
+ [Install via `extras` name](#install-via-extras-name)
+ [Install via `manifest.yaml`](#install-via-manifestyaml)
+ [Check the instructions reported in the documentation](#check-the-instructions-reported-in-the-documentation)
* [Virtual environment installation](#virtual-environment-installation)
* [Docker installation](#docker-installation)
- [Mobile app](#mobile-app)
- [Tests](#tests)
- [Funding](#funding)
<!-- tocstop -->
- Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush). - Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush).
- The [blog](https://blog.platypush.tech) is in general a good place to get 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/-/wikis/home) also contains many resources on getting started. - The [wiki](https://git.platypush.tech/platypush/platypush/wiki) 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 [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.
--- ---
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*) It enables users to create their own self-hosted pieces of automation based on
and it provides a comprehensive and customizable user interface that collects everything you need to visualize and events (*if this happens then do that*)
control under one roof. 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/), It takes some concepts from [IFTTT](https://ifttt.com),
[Microsoft Flow](https://flow.microsoft.com), [PushBullet](https://pushbullet.com) and [Tasker](https://tasker.joaoapps.com/), [Microsoft
[Home Assistant](https://www.home-assistant.io/) to provide an environment where the user can easily connect things Flow](https://flow.microsoft.com), [PushBullet](https://pushbullet.com) and
together. [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 Its ideal home is a single-board computer like a RaspberryPi that you can
and cloud automation in your own living room or garage, but it can easily run on any device that can run a Python configure to orchestrate any home automation and cloud automation in your own
interpreter, and the bar for the hardware requirements is very low as well - I use it to run pieces of automation on living room or garage, but it can easily run on any device that can run a
devices as powerful as a RaspberryPi Zero or an old Nokia N900 with Linux. 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: You can use Platypush to do things like:
@ -47,8 +90,10 @@ You can use Platypush to do things like:
- [Create custom and privacy-secure voice assistants that run custom hooks on your phrases](https://blog.platypush.tech/article/Build-custom-voice-assistants) - [Create custom and privacy-secure voice assistants that run custom hooks on your phrases](https://blog.platypush.tech/article/Build-custom-voice-assistants)
- Build integrations between [sensors](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html), - Build integrations between [sensors](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html),
[cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html), [cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html) and [microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html)
[machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html) to create smart and [machine learning
models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html)
to create smart
pieces of automation for e.g. pieces of automation for e.g.
[people detection](https://blog.platypush.tech/article/Detect-people-with-a-RaspberryPi-a-thermal-camera-Platypush-and-a-pinch-of-machine-learning) [people detection](https://blog.platypush.tech/article/Detect-people-with-a-RaspberryPi-a-thermal-camera-Platypush-and-a-pinch-of-machine-learning)
or [sound detection](https://blog.platypush.tech/article/Create-your-smart-baby-monitor-with-Platypush-and-Tensorflow) or [sound detection](https://blog.platypush.tech/article/Create-your-smart-baby-monitor-with-Platypush-and-Tensorflow)
@ -60,35 +105,53 @@ You can use Platypush to do things like:
- [Control your smart switches](https://docs.platypush.tech/en/latest/platypush/plugins/switch.html) - [Control your smart switches](https://docs.platypush.tech/en/latest/platypush/plugins/switch.html)
- [Implement automated custom text-to-speech routines](https://docs.platypush.tech/en/latest/platypush/plugins/tts.html) - [Implement automated custom text-to-speech routines](https://docs.platypush.tech/en/latest/platypush/plugins/tts.html)
- [Build any kind of interactions and automation routines with your Android device using Tasker](https://blog.platypush.tech/article/How-to-build-your-personal-infrastructure-for-data-collection-and-visualization) - [Build any kind of interactions and automation routines with your Android device using Tasker](https://blog.platypush.tech/article/How-to-build-your-personal-infrastructure-for-data-collection-and-visualization)
- Play [local 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) - [Get weather forecast events for your location and build automation routines on them](https://docs.platypush.tech/en/latest/platypush/plugins/weather.darksky.html)
- [Create a custom single hub for Zigbee and Z-Wave smart devices](https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge) - [Create a custom single hub for Zigbee and Z-Wave smart devices](https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge)
- Build your own web dashboard with calendar, weather, news and music controls (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)) - ...and much more (basically, anything that comes with a [Platypush plugin](https://docs.platypush.tech/en/latest/plugins.html))
## Architecture ## Architecture
The architecture of Platypush consists of a few simple pieces, orchestrated by a configuration file stored by default The architecture of Platypush consists of a few simple pieces, orchestrated by
under [`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml): a configuration file stored by default under
[`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml):
### [Plugins](https://docs.platypush.tech/en/latest/plugins.html) ### Plugins
They are integrations that do things - like [Full list](https://docs.platypush.tech/en/latest/plugins.html)
[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 Plugins are integrations that do things - like [modify
to write a configuration for a plugin by reading its documentation: 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:
```yaml ```yaml
light.hue: light.hue:
@ -100,9 +163,11 @@ light.hue:
### Actions ### Actions
Plugins expose *actions*, that match one-on-one the plugin class methods denoted by `@action`, so it's very Plugins expose *actions*, that match one-on-one the plugin class methods
straightforward to invoke plugin actions by just reading the plugin documentation. They can be invoked directly from denoted by `@action`, so it's very straightforward to invoke plugin actions by
your own scripts or they can be sent to the platform through any supported channel as simple JSON messages: 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 ```json
{ {
@ -114,37 +179,54 @@ your own scripts or they can be sent to the platform through any supported chann
} }
``` ```
### [Backends](https://docs.platypush.tech/en/latest/backends.html) ### Backends
They are background services that either listen for messages on channels (like an [Full list](https://docs.platypush.tech/en/latest/backends.html)
[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 They are background services that either listen for messages on channels (like
to these services in JSON format. For example, in the case of the HTTP backend: 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:
```shell ```shell
# Get a token # Get a token
curl -XPOST -H 'Content-Type: application/json' -d ' curl -XPOST -H 'Content-Type: application/json' -d '
{ {
"username": "$YOUR_USER", "username": "$YOUR_USER",
"password": "$YOUR_PASSWORD" "password": "$YOUR_PASSWORD"
}' http://host:8008/auth }' http://host:8008/auth
# Execute a request # Execute a request
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d ' curl -XPOST -H 'Content-Type: application/json' \
-H "Authorization: Bearer $YOUR_TOKEN" -d '
{ {
"type": "request", "type": "request",
"action": "tts.say", "action": "tts.say",
@ -154,33 +236,38 @@ curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_
}' http://host:8008/execute }' http://host:8008/execute
``` ```
### [Events](https://docs.platypush.tech/en/latest/events.html) ### Events
When a certain event occurs (e.g. a JSON request is received, or a [Full list](https://docs.platypush.tech/en/latest/events.html)
[Bluetooth device is connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
or a When a certain event occurs (e.g. a JSON request is received, or a [Bluetooth
[Flic button is pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent), device is
or some connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
[speech is detected on the voice assistant service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent), or a [Flic button is
or an pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
[RSS feed has new items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent), or some [speech is detected on the voice assistant
or a service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
[new email is received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent), or an [RSS feed has new
or a items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
[new track is played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent), or a [new email is
or an received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
[NFC tag is detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent), or a [new track is
or played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
[new sensor data is available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent), or an [NFC tag is
or detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
[a value of a Zigbee device changes](https://docs.platypush.tech/en/latest/platypush/events/zigbee.mqtt.html#platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent), or [new sensor data is
etc.), the associated backend will trigger an [event](https://docs.platypush.tech/en/latest/events.html). 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 ### Hooks
Event hooks are custom pieces of logic that will be run when a certain event is triggered. Hooks are the glue that Event hooks are custom pieces of logic that will be run when a certain event is
connects events to actions, exposing a paradigm similar to IFTTT (_if a certain event happens then run these actions_). triggered. Hooks are the glue that connects events to actions, exposing a
They can declared as: 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). - Sections of the [`config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml).
Example: Example:
@ -204,7 +291,8 @@ event.hook.SearchSongVoiceCommand:
resource: ${output[0]['file']} 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): [Example](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/hook.py):
```python ```python
@ -225,13 +313,17 @@ def on_music_play_command(event, title=None, artist=None, **context):
### Procedures ### Procedures
Procedures are pieces of custom logic that can be executed as atomic actions using `procedure.<name>` as an action name. Procedures are pieces of custom logic that can be executed as atomic actions
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` - using `procedure.<name>` as an action name.
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 They can be defined either in the `config.yaml` or as Python scripts stored
that a certain thresholds, says a welcome home message using the TTS engine and starts playing the music: 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 ```yaml
procedure.at_home: procedure.at_home:
@ -254,7 +346,7 @@ procedure.at_home:
Python example: Python example:
```python ```python
# Content of ~/.config/platypush/scripts/home.py # Content of ~/.config/platypush/scripts/home.py
from platypush.procedure import procedure from platypush.procedure import procedure
from platypush.utils import run from platypush.utils import run
@ -268,11 +360,12 @@ def at_home(**context):
run('music.mpd.play') run('music.mpd.play')
``` ```
In either case, you can easily trigger the at-home procedure by sending an action request message to a backend - for In either case, you can easily trigger the at-home procedure by sending an
example, over the HTTP backend: action request message to a backend - for example, over the HTTP backend:
```shell ```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", "type": "request",
"action": "procedure.at_home" "action": "procedure.at_home"
@ -281,15 +374,18 @@ curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_
### Cronjobs ### Cronjobs
Cronjobs are pieces of logic that will be run at regular intervals, expressed in crontab-compatible syntax. Cronjobs are pieces of logic that will be run at regular intervals, expressed
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` as in crontab-compatible syntax. They can be defined either in the `config.yaml`
functions labelled by the `@cron` decorator. 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 Note that seconds are also supported (unlike the standard crontab definition),
standard crontab format, they are at the end of the cron expression, so the expression is actually in the format 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>`. `<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 ```yaml
cron.check_bt_device: cron.check_bt_device:
@ -308,7 +404,7 @@ cron.check_bt_device:
Python example: Python example:
```python ```python
# Content of ~/.config/platypush/scripts/bt_cron.py # Content of ~/.config/platypush/scripts/bt_cron.py
from platypush.cron import cron from platypush.cron import cron
from platypush.utils import run from platypush.utils import run
@ -323,15 +419,18 @@ def check_bt_device(**context):
### The web interface ### The web interface
If [`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html) is enabled then a web interface If
will be provided by default on `http://host:8008/`. Besides using the `/execute` endpoint for running requests, the [`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html)
built-in web server also provides a full-featured interface that groups together the controls for most of the plugins - is enabled then a web interface will be provided by default on
e.g. sensors, switches, music controls and search, media library and torrent management, lights, Zigbee/Z-Wave devices `http://host:8008/`. Besides using the `/execute` endpoint for running
and so on. The UI is responsive and mobile-friendly. 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 The web service also provides means for the user to create [custom
[custom dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml) that can dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml)
be used to show information from multiple sources on a large screen. that can be used to show information from multiple sources on a large screen.
## Installation ## Installation
@ -340,36 +439,69 @@ be used to show information from multiple sources on a large screen.
Platypush uses Redis to deliver and store requests and temporary messages: Platypush uses Redis to deliver and store requests and temporary messages:
```yaml ```yaml
# Example for Debian-based distributions # Example for Debian-based distributions
[sudo] apt-get install redis-server [sudo] apt-get install redis-server
# Enable and start the service # Enable and start the service
[sudo] systemctl enable redis [sudo] systemctl enable redis
[sudo] systemctl start redis [sudo] systemctl start redis
``` ```
To install the core platform: #### Install through `pip`
* The `pip` way:
```shell ```shell
[sudo] pip3 install platypush [sudo] pip3 install platypush
``` ```
* The sources way: #### 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
```shell ```shell
git clone https://git.platypush.tech/platypush/platypush.git git clone https://git.platypush.tech/platypush/platypush.git
cd platypush cd platypush
[sudo] pip install .
# Or
[sudo] python3 setup.py install [sudo] python3 setup.py install
``` ```
Then install the extensions that you wish to use. There are a few ways to check the dependencies required by an ### Installing the dependencies for your extensions
extension:
#### Check their `extras` name in [`extras_require` under `setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72). 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:
If you follow this route then you can install the extra dependencies in one of the following ways: #### 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:
1. `pip` installation: 1. `pip` installation:
@ -384,24 +516,17 @@ cd $DIR_TO_PLATYPUSH
[sudo] pip3 install '.[extra1,extra2,extra3]' [sudo] pip3 install '.[extra1,extra2,extra3]'
``` ```
#### Check the dependencies/installation instructions reported under the plugin/backend documentation. #### Check the instructions reported in the documentation
If you follow this route then simply run the commands listed in the plugin/backend documentation to get the dependencies If you follow this route then simply run the commands listed in the
installed. [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
If you follow this route then uncomment the lines in from another location through the `-c` option) containing the configuration of
[`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) associated to the the backend and plugins that you want to use, and add any hooks and procedures
plugins/backends that you want to use and run: for your use case.
```shell
[sudo] pip3 install -r requirements.txt
```
After installing the dependencies, create a configuration file under `~/.config/platypush/config.yaml` (the application
can load the configuration from another location through the `-c` option) containing the configuration of the backend
and plugins that you want to use, and add any hooks and procedures for your use case.
You can then start the service by simply running: You can then start the service by simply running:
@ -410,85 +535,100 @@ platypush
``` ```
It's advised to run it as a systemd service though - simply copy the provided It's advised to run it as a systemd service though - simply copy the provided
[`.service` file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service) to [`.service`
`~/.config/systemd/user`, check if the path of `platypush` matches the path where it's installed on your system, and file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service)
start the service via `systemctl`: 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 ```shell
systemctl --user start platypush systemctl --user start platypush
``` ```
### [Virtual environment installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-virtual-environment) ### Virtual environment installation
Platypush provides a script named `platyvenv` that can parse a `config.yaml` and automatically create a virtual Platypush provides a script named `platyvenv` that can parse a `config.yaml`
environment (under `~/.local/share/platypush/venv/<device_id>`) with all the dependencies required by the configured and automatically create a virtual environment (under
integrations. `~/.local/share/platypush/venv/<device_id>`) with all the dependencies required
by the configured integrations.
1. Create the environment from a configuration file: 1. Create the environment from a configuration file:
```shell ```shell
platyvenv build -c /path/to/config.yaml platyvenv build -c /path/to/config.yaml
``` ```
2. Start the service from the virtual environment: 2. Start the service from the virtual environment:
```shell ```shell
# device_id matches either the hostname or the device_id in config.yaml # device_id matches either the hostname or the device_id in config.yaml
platyvenv start device_id platyvenv start device_id
``` ```
3. Stop the instance: 3. Stop the instance:
```shell ```shell
platyvenv stop device_id platyvenv stop device_id
``` ```
4. Remove the instance: 4. Remove the instance:
```shell ```shell
platyvenv rm device_id platyvenv rm device_id
``` ```
### [Docker installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-container) [Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-virtual-environment)
You can also install Platypush in a container - the application provides a script named `platydock` that automatically ### Docker installation
creates a container instance from a `config.yaml`:
You can also install Platypush in a container - the application provides a
script named `platydock` that automatically creates a container instance from a
`config.yaml`:
1. Create the container from a configuration file: 1. Create the container from a configuration file:
```shell ```shell
platydock build -c /path/to/config.yaml platydock build -c /path/to/config.yaml
``` ```
2. Start the container: 2. Start the container:
```shell ```shell
# device_id matches either the hostname or the device_id in config.yaml # device_id matches either the hostname or the device_id in config.yaml
platydock start device_id platydock start device_id
``` ```
3. Stop the instance: 3. Stop the instance:
```shell ```shell
platydock stop device_id platydock stop device_id
``` ```
4. Remove the instance: 4. Remove the instance:
```shell ```shell
platydock rm device_id platydock rm device_id
``` ```
Note that both the virtual environment and Docker container option offer the
possibility to include extra YAML configuration files in the main `config.yaml`
through the `include` directive (as long as they are in the same folder as the
main `config.yaml`), as well as external Python scripts in a `scripts`
directory in the same folder as the `config.yaml`.
[Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-container)
## Mobile app ## Mobile app
An [official Android app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on the F-Droid store. An [official Android
It allows to easily discover and manage multiple Platypush services on a network through the web interface, and it app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on
easily brings the power of Platypush to your fingertips. 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 ## Tests
To run the tests simply run `pytest` either from the project root folder or the `tests/` folder. To run the tests simply run `pytest` either from the project root folder or the
Or run the following command from the project root folder: `tests/` folder. Or run the following command from the project root folder:
```shell ```shell
python -m tests python -m tests
@ -500,10 +640,11 @@ python -m tests
If you use and love Platypush, please consider [buying me a coffee/beer](https://paypal.me/fabiomanganiello). If you use and love Platypush, please consider [buying me a coffee/beer](https://paypal.me/fabiomanganiello).
I've been working on Platypush all by myself in my spare time for the past few years, and I've made sure that it remains I've been working on Platypush all by myself in my spare time for the past few
open and free. 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 If you like this product, please consider supporting - I'm definitely not
I'd love to have at least the costs for the server covered by users. 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. Issues and requests opened by donors will also be given priority over others.

BIN
assets/logo-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
assets/logo-256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
assets/logo-64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View file

@ -6,12 +6,12 @@
# and automatically managed the required dependencies, as well as start, # # and automatically managed the required dependencies, as well as start, #
# stop and remove them # # stop and remove them #
# # # #
# @author: Fabio Manganiello <blacklight86@gmail.com> # # @author: Fabio Manganiello <fabio@platypush.tech> #
# @licence: MIT # # @licence: MIT #
############################################################################## ##############################################################################
workdir=$HOME/.local/share/platypush/venv workdir="$HOME/.local/share/platypush/venv"
function build { function build {
cfgfile= cfgfile=
@ -35,88 +35,74 @@ function build {
fi fi
echo "Parsing configuration file" echo "Parsing configuration file"
deps=() pip_cmd=
pkg_cmd=
includes=() includes=()
cmd_exec=()
while read -r line; do while read -r line; do
echo ${line} | egrep '``pip install .+?``' > /dev/null 2>&1 if echo "$line" | grep -E "^pip:\s*"; then
if (( $? != 0 )); then pip_cmd="$(echo "$line" | sed -r -e 's/^pip:\s*(.*)'/\\1/)"
continue 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 fi
done <<< "$(python <<EOF
dep=$(echo ${line} | sed -r -e 's/.*``pip install (.+?)``.*/\1/')
deps+=("$dep")
done <<< $(python <<EOF
from platypush.config import Config from platypush.config import Config
from platypush.context import get_plugin, get_backend, register_backends from platypush.utils.manifest import get_install_commands_from_conf
Config.init('`realpath ${cfgfile}`') deps = get_install_commands_from_conf('$(realpath "${cfgfile}")')
register_backends() print(f'device_id: {Config.get("device_id")}')
backend_config = Config.get_backends()
for name in Config.get_backends().keys(): if deps.get('pip'):
backend = get_backend(name) print(f'pip: {deps["pip"]}')
print(backend.__doc__)
for name in Config.get_plugins().keys(): if deps.get('packages'):
try: print(f'packages: {deps["packages"]}')
plugin = get_plugin(name)
print(plugin.__doc__)
except:
pass
EOF
)
while read -r include; do for cmd in deps.get('exec', []):
includes+=(${include}) print(f'exec: {cmd}')
done <<< $(python <<EOF
from platypush.config import Config
from platypush.context import get_plugin, get_backend, register_backends
Config.init('`realpath ${cfgfile}`')
for include in Config._included_files: for include in Config._included_files:
print(include) print(f'include: {include}')
EOF EOF
) )"
device_id=$(python <<EOF envdir="${workdir}/${device_id}"
from platypush.config import Config etcdir="${envdir}/etc/platypush"
Config.init('`realpath ${cfgfile}`')
print(Config.get('device_id'))
EOF
)
envdir=${workdir}/${device_id}
etcdir=${envdir}/etc/platypush
echo "Preparing virtual environment for device $device_id" echo "Preparing virtual environment for device $device_id"
mkdir -p "$envdir" mkdir -p "$envdir"
mkdir -p "$etcdir" mkdir -p "$etcdir"
srcdir=`dirname "$cfgfile"` srcdir=$(dirname "$cfgfile")
for ((i=0; $i < ${#includes[@]}; i++)); do for ((i=0; i < ${#includes[@]}; i++)); do
incdir=`dirname "${includes[$i]}"` incdir=$(dirname "${includes[$i]}")
incdir=`realpath --relative-to="$srcdir" "$incdir"` incdir=$(realpath --relative-to="$srcdir" "$incdir")
destdir="$etcdir/$incdir" destdir="$etcdir/$incdir"
mkdir -p "$destdir" mkdir -p "$destdir"
cp "${includes[$i]}" "$destdir" cp "${includes[$i]}" "$destdir"
done done
cp "$cfgfile" "$etcdir/config.yaml" cp "$cfgfile" "$etcdir/config.yaml"
cfgfile=${etcdir}/config.yaml cfgfile="${etcdir}/config.yaml"
python3 -m venv ${envdir} python3 -m venv "${envdir}"
cd ${envdir} cd "${envdir}" || exit 1
source ${envdir}/bin/activate source "${envdir}/bin/activate"
echo "Installing required dependencies" echo "Installing required dependencies"
# shellcheck disable=SC2086
[ -n "${pkg_cmd}" ] && sudo ${pkg_cmd}
[ -n "${pip_cmd}" ] && ${pip_cmd}
for ((i=0; $i < ${#deps[@]}; i++)); do for ((i=0; i < ${#cmd_exec[@]}; i++)); do
echo ${deps[$i]} ${cmd_exec[$i]}
done | sort -u | while read dep; do
pip install ${dep}
done done
pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git
@ -130,44 +116,41 @@ function start {
fi fi
env=$1 env=$1
envdir=${workdir}/${env} envdir="${workdir}/${env}"
logsdir=${envdir}/var/log/platypush rundir="${envdir}/var/run"
rundir=${envdir}/var/run pidfile="${rundir}/platypush.pid"
pidfile=${rundir}/platypush.pid cfgfile="${envdir}/etc/platypush/config.yaml"
cfgfile=${envdir}/etc/platypush/config.yaml
if [[ ! -d "$envdir" ]]; then if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2 echo "No such directory: $envdir" >&2
exit 1 exit 1
fi fi
mkdir -p ${logsdir} mkdir -p "${rundir}"
mkdir -p ${rundir}
if [[ -f "$pidfile" ]]; then if [[ -f "$pidfile" ]]; then
pid=`cat "$pidfile"` if pgrep -F "${pidfile}"; then
if ps -p ${pid} | grep platypush; then echo "Another instance (PID $(cat "${pidfile}")) is running, please stop that instance first"
echo "Another instance (PID $pid) is running, please stop that instance first"
exit 1 exit 1
fi fi
echo "A PID file was found but the process doesn't seem to be running, starting anyway" echo "A PID file was found but the process does not seem to be running, starting anyway"
rm -f "$pidfile" rm -f "$pidfile"
fi fi
python3 -m venv ${envdir} python3 -m venv "${envdir}"
cd ${envdir} cd "${envdir}" || exit 1
source bin/activate source bin/activate
bin/platypush -c "$cfgfile" -P "$pidfile" > ${logsdir}/stdout.log 2> ${logsdir}/stderr.log & bin/platypush -c "$cfgfile" -P "$pidfile" &
start_time=`date +'%s'` start_time=$(date +'%s')
timeout=30 timeout=30
while :; do while :; do
[[ -f "$pidfile" ]] && break [[ -f "$pidfile" ]] && break
now=`date +'%s'` now=$(date +'%s')
let elapsed=$now-$start_time elapsed=$(( now-start_time ))
if (( ${elapsed} >= ${timeout} )); then if (( elapsed >= timeout )); then
echo "Platypush instance '$env' didn't start within $timeout seconds" >&2 echo "Platypush instance '$env' did not start within $timeout seconds" >&2
exit 1 exit 1
fi fi
@ -175,9 +158,11 @@ function start {
sleep 1 sleep 1
done done
pid=`cat "$pidfile"` pid=$(cat "$pidfile")
echo echo
echo "Platypush environment $env started with PID $pid, logs dir: $logsdir" echo "Platypush environment $env started with PID $pid"
wait "${pid}"
echo "Platypush environment $env terminated"
} }
function stop { function stop {
@ -187,9 +172,9 @@ function stop {
fi fi
env=$1 env=$1
envdir=${workdir}/${env} envdir="${workdir}/${env}"
rundir=${envdir}/var/run rundir="${envdir}/var/run"
pidfile=${rundir}/platypush.pid pidfile="${rundir}/platypush.pid"
if [[ ! -d "$envdir" ]]; then if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2 echo "No such directory: $envdir" >&2
@ -197,12 +182,13 @@ function stop {
fi fi
if [[ ! -f "$pidfile" ]]; then if [[ ! -f "$pidfile" ]]; then
echo "No pidfile found for instance "${env}"" echo "No pidfile found for instance \"${env}\""
exit 1 exit 1
fi fi
pid=`cat "$pidfile"` pid=$(cat "$pidfile")
pids="$pid `ps --no-headers -o pid= --ppid $pid`" pids="$pid $(ps --no-headers -o pid= --ppid "$pid")"
# shellcheck disable=SC2086
kill -9 ${pids} kill -9 ${pids}
rm -f "$pidfile" rm -f "$pidfile"
echo "Instance '$env' with PID $pid stopped" echo "Instance '$env' with PID $pid stopped"
@ -214,9 +200,9 @@ function rme {
exit 1 exit 1
fi fi
envdir=${workdir}/$1 envdir="${workdir}/$1"
rundir=${envdir}/var/run rundir="${envdir}/var/run"
pidfile=${rundir}/platypush.pid pidfile="${rundir}/platypush.pid"
if [[ ! -d "$envdir" ]]; then if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2 echo "No such directory: $envdir" >&2
@ -224,14 +210,18 @@ function rme {
fi fi
if [[ -f "$pidfile" ]]; then if [[ -f "$pidfile" ]]; then
if ps -p `cat "$pidfile"` | grep platypush; then if pgrep -F "${pidfile}"; then
echo "Another instance (PID $pidfile) is running, please stop that instance first" echo "Another instance (PID $(cat "$pidfile")) is running, please stop that instance first"
exit 1 exit 1
fi fi
echo "A PID file was found but the process doesn't seem to be running, removing anyway" echo "A PID file was found but the process does not seem to be running, removing anyway"
fi fi
echo "WARNING: This operation will permanently remove the Platypush environment $1"
echo -n "Are you sure you want to continue? (y/N) "
IFS= read -r answer
echo "$answer" | grep -E '^[yY]' >/dev/null || exit 0
rm -rf "$envdir" rm -rf "$envdir"
echo "$envdir removed" echo "$envdir removed"
} }
@ -247,13 +237,13 @@ fi
action=$1 action=$1
shift shift
mkdir -p ${workdir} mkdir -p "${workdir}"
# shellcheck disable=SC2048,SC2086
case ${action} in case ${action} in
'build') build;; 'build') build $*;;
'start') start $*;; 'start') start $*;;
'stop') stop $*;; 'stop') stop $*;;
'rm') rme $*;; 'rm') rme $*;;
*) usage;; *) usage;;
esac esac

View file

@ -3,10 +3,12 @@ import json
import os import os
import re import re
import sys import sys
from random import randint
from typing import Union, List from typing import Union, List
from docutils import nodes from docutils import nodes
from docutils.parsers.rst import Directive from docutils.parsers.rst import Directive
from marshmallow import fields
class SchemaDirective(Directive): class SchemaDirective(Directive):
@ -22,17 +24,43 @@ class SchemaDirective(Directive):
sys.path.insert(0, _schemas_path) sys.path.insert(0, _schemas_path)
@staticmethod @classmethod
def _get_field_value(field) -> str: def _get_field_value(cls, field):
metadata = getattr(field, 'metadata', {}) metadata = getattr(field, 'metadata', {})
return metadata.get('example', metadata.get('description', str(field.__class__.__name__).lower())) 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()
def _parse_schema(self) -> Union[dict, List[dict]]: def _parse_schema(self) -> Union[dict, List[dict]]:
m = self._schema_regex.match('\n'.join(self.content)) m = self._schema_regex.match('\n'.join(self.content))
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])]) schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
schema_module = importlib.import_module(schema_module_name) schema_module = importlib.import_module(schema_module_name)
schema_class = getattr(schema_module, m.group(1).split('.')[-1]) schema_class = getattr(schema_module, m.group(1).split('.')[-1])
schema_args = eval(f'dict({m.group(3)})') schema_args = eval(f'dict({m.group(3)})') if m.group(3) else {}
schema = schema_class(**schema_args) schema = schema_class(**schema_args)
output = { output = {
name: self._get_field_value(field) name: self._get_field_value(field)

View file

@ -3,15 +3,13 @@ Backends
======== ========
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 1
:caption: Backends: :caption: Backends:
platypush/backend/adafruit.io.rst platypush/backend/adafruit.io.rst
platypush/backend/alarm.rst platypush/backend/alarm.rst
platypush/backend/assistant.rst
platypush/backend/assistant.google.rst platypush/backend/assistant.google.rst
platypush/backend/assistant.snowboy.rst platypush/backend/assistant.snowboy.rst
platypush/backend/bluetooth.rst
platypush/backend/bluetooth.fileserver.rst platypush/backend/bluetooth.fileserver.rst
platypush/backend/bluetooth.pushserver.rst platypush/backend/bluetooth.pushserver.rst
platypush/backend/bluetooth.scanner.rst platypush/backend/bluetooth.scanner.rst
@ -19,9 +17,7 @@ Backends
platypush/backend/button.flic.rst platypush/backend/button.flic.rst
platypush/backend/camera.pi.rst platypush/backend/camera.pi.rst
platypush/backend/chat.telegram.rst platypush/backend/chat.telegram.rst
platypush/backend/clipboard.rst
platypush/backend/covid19.rst platypush/backend/covid19.rst
platypush/backend/dbus.rst
platypush/backend/file.monitor.rst platypush/backend/file.monitor.rst
platypush/backend/foursquare.rst platypush/backend/foursquare.rst
platypush/backend/github.rst platypush/backend/github.rst
@ -44,6 +40,7 @@ Backends
platypush/backend/music.mopidy.rst platypush/backend/music.mopidy.rst
platypush/backend/music.mpd.rst platypush/backend/music.mpd.rst
platypush/backend/music.snapcast.rst platypush/backend/music.snapcast.rst
platypush/backend/music.spotify.rst
platypush/backend/nextcloud.rst platypush/backend/nextcloud.rst
platypush/backend/nfc.rst platypush/backend/nfc.rst
platypush/backend/nodered.rst platypush/backend/nodered.rst
@ -51,7 +48,6 @@ Backends
platypush/backend/pushbullet.rst platypush/backend/pushbullet.rst
platypush/backend/redis.rst platypush/backend/redis.rst
platypush/backend/scard.rst platypush/backend/scard.rst
platypush/backend/sensor.rst
platypush/backend/sensor.accelerometer.rst platypush/backend/sensor.accelerometer.rst
platypush/backend/sensor.arduino.rst platypush/backend/sensor.arduino.rst
platypush/backend/sensor.battery.rst platypush/backend/sensor.battery.rst
@ -64,9 +60,8 @@ Backends
platypush/backend/sensor.leap.rst platypush/backend/sensor.leap.rst
platypush/backend/sensor.ltr559.rst platypush/backend/sensor.ltr559.rst
platypush/backend/sensor.mcp3008.rst platypush/backend/sensor.mcp3008.rst
platypush/backend/sensor.motion.pwm3901.rst platypush/backend/sensor.motion.pmw3901.rst
platypush/backend/sensor.serial.rst platypush/backend/sensor.serial.rst
platypush/backend/stt.rst
platypush/backend/stt.deepspeech.rst platypush/backend/stt.deepspeech.rst
platypush/backend/stt.picovoice.hotword.rst platypush/backend/stt.picovoice.hotword.rst
platypush/backend/stt.picovoice.speech.rst platypush/backend/stt.picovoice.speech.rst
@ -74,7 +69,6 @@ Backends
platypush/backend/todoist.rst platypush/backend/todoist.rst
platypush/backend/travisci.rst platypush/backend/travisci.rst
platypush/backend/trello.rst platypush/backend/trello.rst
platypush/backend/weather.rst
platypush/backend/weather.buienradar.rst platypush/backend/weather.buienradar.rst
platypush/backend/weather.darksky.rst platypush/backend/weather.darksky.rst
platypush/backend/weather.openweathermap.rst platypush/backend/weather.openweathermap.rst

View file

@ -71,7 +71,7 @@ master_doc = 'index'
# #
# This is also used if you do content translation via gettext catalogs. # This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases. # Usually you set "language" from the command line for these cases.
language = None language = 'en'
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
@ -89,8 +89,11 @@ pygments_style = 'sphinx'
# #
# html_theme = 'haiku' # html_theme = 'haiku'
# html_theme = 'sphinx_rtd_theme' # html_theme = 'sphinx_rtd_theme'
html_theme = 'sphinx_material' html_theme = 'sphinx_book_theme'
html_title = 'Platypush Documentation'
html_logo = '../../assets/logo-64.png'
html_favicon = '../../platypush/backend/http/webapp/public/favicon.ico'
html_domain_indices = True html_domain_indices = True
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
@ -98,50 +101,12 @@ html_domain_indices = True
# documentation. # documentation.
# #
html_theme_options = { html_theme_options = {
'nav_title': 'Platypush documentation', 'toc_title': 'Platypush documentation',
'repo_url': 'https://git.platypush.tech/platypush/platypush', 'repository_url': 'https://git.platypush.tech/platypush/platypush',
'repo_name': 'Source code', 'use_repository_button': True,
'repo_type': 'gitlab', 'use_issues_button': True,
'color_primary': 'green', 'use_fullscreen_button': True,
'color_accent': 'light-green', 'home_page_in_toc': True,
'logo_icon': '&#128366',
'nav_links': [
{
'href': 'https://platypush.tech/',
'title': 'Homepage',
'internal': False,
},
{
'href': 'https://blog.platypush.tech/',
'title': 'Blog',
'internal': False,
},
{
'href': 'https://git.platypush.tech/platypush/platypush',
'title': 'Repository',
'internal': False,
},
{
'href': 'https://git.platypush.tech/platypush/platypush/-/wikis/home',
'title': 'Wiki',
'internal': False,
},
{
'href': 'https://chrome.google.com/webstore/detail/platypush/aphldjclndofhflbbdnmpejbjgomkbie',
'title': 'Chrome Extension',
'internal': False,
},
{
'href': 'https://addons.mozilla.org/en-US/firefox/addon/platypush/',
'title': 'Firefox Extension',
'internal': False,
},
{
'href': 'https://f-droid.org/en/packages/tech.platypush.platypush/',
'title': 'Android App',
'internal': False,
},
],
} }
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
@ -157,9 +122,9 @@ html_theme_options = {
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', # default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``. # 'searchbox.html']``.
# #
html_sidebars = { # html_sidebars = {
'**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html'] # '**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
} # }
# -- Options for HTMLHelp output --------------------------------------------- # -- Options for HTMLHelp output ---------------------------------------------
@ -173,15 +138,12 @@ latex_elements = {
# The paper size ('letterpaper' or 'a4paper'). # The paper size ('letterpaper' or 'a4paper').
# #
# 'papersize': 'letterpaper', # 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt'). # The font size ('10pt', '11pt' or '12pt').
# #
# 'pointsize': '10pt', # 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble. # Additional stuff for the LaTeX preamble.
# #
# 'preamble': '', # 'preamble': '',
# Latex figure (float) alignment # Latex figure (float) alignment
# #
# 'figure_align': 'htbp', # 'figure_align': 'htbp',
@ -191,8 +153,7 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
(master_doc, 'platypush.tex', 'platypush Documentation', (master_doc, 'platypush.tex', 'platypush Documentation', 'BlackLight', 'manual'),
'BlackLight', 'manual'),
] ]
@ -200,10 +161,7 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [(master_doc, 'platypush', 'platypush Documentation', [author], 1)]
(master_doc, 'platypush', 'platypush Documentation',
[author], 1)
]
# -- Options for Texinfo output ---------------------------------------------- # -- Options for Texinfo output ----------------------------------------------
@ -212,9 +170,15 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
(master_doc, 'platypush', 'platypush Documentation', (
author, 'platypush', 'One line description of project.', master_doc,
'Miscellaneous'), 'platypush',
'platypush Documentation',
author,
'platypush',
'One line description of project.',
'Miscellaneous',
),
] ]
@ -230,7 +194,13 @@ intersphinx_mapping = {'https://docs.python.org/': None}
# If true, `todo` and `todoList` produce output, else they produce nothing. # If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True todo_include_todos = True
autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers', autodoc_default_options = {
'members': True,
'show-inheritance': True,
}
autodoc_mock_imports = [
'googlesamples.assistant.grpc.audio_helpers',
'google.assistant.embedded', 'google.assistant.embedded',
'google.assistant.library', 'google.assistant.library',
'google.assistant.library.event', 'google.assistant.library.event',
@ -247,7 +217,7 @@ autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'gevent.wsgi', 'gevent.wsgi',
'Adafruit_IO', 'Adafruit_IO',
'pyperclip', 'pyperclip',
'dbus', 'pydbus',
'inputs', 'inputs',
'inotify', 'inotify',
'omxplayer', 'omxplayer',
@ -273,7 +243,7 @@ autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'envirophat', 'envirophat',
'gps', 'gps',
'picamera', 'picamera',
'pwm3901', 'pmw3901',
'PIL', 'PIL',
'croniter', 'croniter',
'pyaudio', 'pyaudio',
@ -307,7 +277,6 @@ autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'gi', 'gi',
'gi.repository', 'gi.repository',
'twilio', 'twilio',
'pytz',
'Adafruit_Python_DHT', 'Adafruit_Python_DHT',
'RPi.GPIO', 'RPi.GPIO',
'RPLCD', 'RPLCD',
@ -315,15 +284,29 @@ autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'pysmartthings', 'pysmartthings',
'aiohttp', 'aiohttp',
'watchdog', 'watchdog',
] 'pyngrok',
'irc',
'irc.bot',
'irc.strings',
'irc.client',
'irc.connection',
'irc.events',
'defusedxml',
'nio',
'aiofiles',
'aiofiles.os',
'async_lru',
]
sys.path.insert(0, os.path.abspath('../..')) sys.path.insert(0, os.path.abspath('../..'))
def skip(app, what, name, obj, skip, options): def skip(app, what, name, obj, skip, options):
if name == "__init__": if name == "__init__":
return False return False
return skip return skip
def setup(app): def setup(app):
app.connect("autodoc-skip-member", skip) app.connect("autodoc-skip-member", skip)

View file

@ -3,7 +3,7 @@ Events
====== ======
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 1
:caption: Events: :caption: Events:
platypush/events/adafruit.rst platypush/events/adafruit.rst
@ -13,10 +13,12 @@ Events
platypush/events/bluetooth.rst platypush/events/bluetooth.rst
platypush/events/button.flic.rst platypush/events/button.flic.rst
platypush/events/camera.rst platypush/events/camera.rst
platypush/events/chat.slack.rst
platypush/events/chat.telegram.rst platypush/events/chat.telegram.rst
platypush/events/clipboard.rst platypush/events/clipboard.rst
platypush/events/covid19.rst platypush/events/covid19.rst
platypush/events/custom.rst platypush/events/custom.rst
platypush/events/dbus.rst
platypush/events/distance.rst platypush/events/distance.rst
platypush/events/file.rst platypush/events/file.rst
platypush/events/foursquare.rst platypush/events/foursquare.rst
@ -25,27 +27,35 @@ Events
platypush/events/google.rst platypush/events/google.rst
platypush/events/google.fit.rst platypush/events/google.fit.rst
platypush/events/google.pubsub.rst platypush/events/google.pubsub.rst
platypush/events/gotify.rst
platypush/events/gpio.rst
platypush/events/gps.rst platypush/events/gps.rst
platypush/events/http.rst platypush/events/http.rst
platypush/events/http.hook.rst platypush/events/http.hook.rst
platypush/events/http.rss.rst platypush/events/http.rss.rst
platypush/events/inotify.rst platypush/events/inotify.rst
platypush/events/irc.rst
platypush/events/joystick.rst platypush/events/joystick.rst
platypush/events/kafka.rst platypush/events/kafka.rst
platypush/events/light.rst platypush/events/light.rst
platypush/events/linode.rst platypush/events/linode.rst
platypush/events/log.http.rst platypush/events/log.http.rst
platypush/events/mail.rst platypush/events/mail.rst
platypush/events/matrix.rst
platypush/events/media.rst platypush/events/media.rst
platypush/events/midi.rst platypush/events/midi.rst
platypush/events/mqtt.rst platypush/events/mqtt.rst
platypush/events/music.rst platypush/events/music.rst
platypush/events/music.snapcast.rst platypush/events/music.snapcast.rst
platypush/events/music.tidal.rst
platypush/events/nextcloud.rst platypush/events/nextcloud.rst
platypush/events/nfc.rst platypush/events/nfc.rst
platypush/events/ngrok.rst
platypush/events/ntfy.rst
platypush/events/ping.rst platypush/events/ping.rst
platypush/events/pushbullet.rst platypush/events/pushbullet.rst
platypush/events/qrcode.rst platypush/events/qrcode.rst
platypush/events/rss.rst
platypush/events/scard.rst platypush/events/scard.rst
platypush/events/sensor.rst platypush/events/sensor.rst
platypush/events/sensor.ir.rst platypush/events/sensor.ir.rst
@ -54,6 +64,7 @@ Events
platypush/events/serial.rst platypush/events/serial.rst
platypush/events/sound.rst platypush/events/sound.rst
platypush/events/stt.rst platypush/events/stt.rst
platypush/events/sun.rst
platypush/events/tensorflow.rst platypush/events/tensorflow.rst
platypush/events/todoist.rst platypush/events/todoist.rst
platypush/events/torrent.rst platypush/events/torrent.rst
@ -63,6 +74,7 @@ Events
platypush/events/weather.rst platypush/events/weather.rst
platypush/events/web.rst platypush/events/web.rst
platypush/events/web.widget.rst platypush/events/web.widget.rst
platypush/events/websocket.rst
platypush/events/wiimote.rst platypush/events/wiimote.rst
platypush/events/zeroborg.rst platypush/events/zeroborg.rst
platypush/events/zeroconf.rst platypush/events/zeroconf.rst

View file

@ -3,18 +3,20 @@ Platypush
Welcome to the Platypush reference of available plugins, backends and event types. Welcome to the Platypush reference of available plugins, backends and event types.
For more information on Platypush please check out: For more information on Platypush check out:
* The `Gitlab page`_ of the project * The `main page`_ of the project
* The `Gitea page`_ of the project
* The `online wiki`_ for quickstart and examples * The `online wiki`_ for quickstart and examples
* The `Blog articles`_ for inspiration on use-cases possible projects * The `Blog articles`_ for inspiration on use-cases possible projects
.. _Gitlab page: https://git.platypush.tech/platypush/platypush .. _main page: https://platypush.tech
.. _online wiki: https://git.platypush.tech/platypush/platypush/-/wikis/home .. _Gitea page: https://git.platypush.tech/platypush/platypush
.. _online wiki: https://git.platypush.tech/platypush/platypush/wiki
.. _Blog articles: https://blog.platypush.tech .. _Blog articles: https://blog.platypush.tech
.. toctree:: .. toctree::
:maxdepth: 3 :maxdepth: 2
:caption: Contents: :caption: Contents:
backends backends
@ -28,4 +30,3 @@ Indices and tables
* :ref:`genindex` * :ref:`genindex`
* :ref:`modindex` * :ref:`modindex`
* :ref:`search` * :ref:`search`

View file

@ -1,4 +1,4 @@
``platypush.backend.adafruit.io`` ``adafruit.io``
================================= =================================
.. automodule:: platypush.backend.adafruit.io .. automodule:: platypush.backend.adafruit.io

View file

@ -1,4 +1,4 @@
``platypush.backend.alarm`` ``alarm``
=========================== ===========================
.. automodule:: platypush.backend.alarm .. automodule:: platypush.backend.alarm

View file

@ -1,4 +1,4 @@
``platypush.backend.assistant.google`` ``assistant.google``
====================================== ======================================
.. automodule:: platypush.backend.assistant.google .. automodule:: platypush.backend.assistant.google

View file

@ -1,5 +0,0 @@
``platypush.backend.assistant``
===============================
.. automodule:: platypush.backend.assistant
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.assistant.snowboy`` ``assistant.snowboy``
======================================= =======================================
.. automodule:: platypush.backend.assistant.snowboy .. automodule:: platypush.backend.assistant.snowboy

View file

@ -1,4 +1,4 @@
``platypush.backend.bluetooth.fileserver`` ``bluetooth.fileserver``
========================================== ==========================================
.. automodule:: platypush.backend.bluetooth.fileserver .. automodule:: platypush.backend.bluetooth.fileserver

View file

@ -1,4 +1,4 @@
``platypush.backend.bluetooth.pushserver`` ``bluetooth.pushserver``
========================================== ==========================================
.. automodule:: platypush.backend.bluetooth.pushserver .. automodule:: platypush.backend.bluetooth.pushserver

View file

@ -1,5 +0,0 @@
``platypush.backend.bluetooth``
===============================
.. automodule:: platypush.backend.bluetooth
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.bluetooth.scanner.ble`` ``bluetooth.scanner.ble``
=========================================== ===========================================
.. automodule:: platypush.backend.bluetooth.scanner.ble .. automodule:: platypush.backend.bluetooth.scanner.ble

View file

@ -1,4 +1,4 @@
``platypush.backend.bluetooth.scanner`` ``bluetooth.scanner``
======================================= =======================================
.. automodule:: platypush.backend.bluetooth.scanner .. automodule:: platypush.backend.bluetooth.scanner

View file

@ -1,4 +1,4 @@
``platypush.backend.button.flic`` ``button.flic``
================================= =================================
.. automodule:: platypush.backend.button.flic .. automodule:: platypush.backend.button.flic

View file

@ -1,4 +1,4 @@
``platypush.backend.camera.pi`` ``camera.pi``
=============================== ===============================
.. automodule:: platypush.backend.camera.pi .. automodule:: platypush.backend.camera.pi

View file

@ -1,4 +1,4 @@
``platypush.backend.chat.telegram`` ``chat.telegram``
=================================== ===================================
.. automodule:: platypush.backend.chat.telegram .. automodule:: platypush.backend.chat.telegram

View file

@ -1,5 +0,0 @@
``platypush.backend.clipboard``
===============================
.. automodule:: platypush.backend.clipboard
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.covid19`` ``covid19``
============================= =============================
.. automodule:: platypush.backend.covid19 .. automodule:: platypush.backend.covid19

View file

@ -1,5 +0,0 @@
``platypush.backend.dbus``
==========================
.. automodule:: platypush.backend.dbus
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.file.monitor`` ``file.monitor``
================================== ==================================
.. automodule:: platypush.backend.file.monitor .. automodule:: platypush.backend.file.monitor

View file

@ -1,4 +1,4 @@
``platypush.backend.foursquare`` ``foursquare``
================================ ================================
.. automodule:: platypush.backend.foursquare .. automodule:: platypush.backend.foursquare

View file

@ -1,4 +1,4 @@
``platypush.backend.github`` ``github``
============================ ============================
.. automodule:: platypush.backend.github .. automodule:: platypush.backend.github

View file

@ -1,4 +1,4 @@
``platypush.backend.google.fit`` ``google.fit``
================================ ================================
.. automodule:: platypush.backend.google.fit .. automodule:: platypush.backend.google.fit

View file

@ -1,4 +1,4 @@
``platypush.backend.google.pubsub`` ``google.pubsub``
=================================== ===================================
.. automodule:: platypush.backend.google.pubsub .. automodule:: platypush.backend.google.pubsub

View file

@ -1,4 +1,4 @@
``platypush.backend.gps`` ``gps``
========================= =========================
.. automodule:: platypush.backend.gps .. automodule:: platypush.backend.gps

View file

@ -1,4 +1,4 @@
``platypush.backend.http.poll`` ``http.poll``
=============================== ===============================
.. automodule:: platypush.backend.http.poll .. automodule:: platypush.backend.http.poll

View file

@ -1,4 +1,4 @@
``platypush.backend.http`` ``http``
========================== ==========================
.. automodule:: platypush.backend.http .. automodule:: platypush.backend.http

View file

@ -1,4 +1,4 @@
``platypush.backend.inotify`` ``inotify``
============================= =============================
.. automodule:: platypush.backend.inotify .. automodule:: platypush.backend.inotify

View file

@ -1,4 +1,4 @@
``platypush.backend.joystick.jstest`` ``joystick.jstest``
===================================== =====================================
.. automodule:: platypush.backend.joystick.jstest .. automodule:: platypush.backend.joystick.jstest

View file

@ -1,4 +1,4 @@
``platypush.backend.joystick.linux`` ``joystick.linux``
==================================== ====================================
.. automodule:: platypush.backend.joystick.linux .. automodule:: platypush.backend.joystick.linux

View file

@ -1,4 +1,4 @@
``platypush.backend.joystick`` ``joystick``
============================== ==============================
.. automodule:: platypush.backend.joystick .. automodule:: platypush.backend.joystick

View file

@ -1,4 +1,4 @@
``platypush.backend.kafka`` ``kafka``
=========================== ===========================
.. automodule:: platypush.backend.kafka .. automodule:: platypush.backend.kafka

View file

@ -1,4 +1,4 @@
``platypush.backend.light.hue`` ``light.hue``
=============================== ===============================
.. automodule:: platypush.backend.light.hue .. automodule:: platypush.backend.light.hue

View file

@ -1,4 +1,4 @@
``platypush.backend.linode`` ``linode``
============================ ============================
.. automodule:: platypush.backend.linode .. automodule:: platypush.backend.linode

View file

@ -1,4 +1,4 @@
``platypush.backend.log.http`` ``log.http``
============================== ==============================
.. automodule:: platypush.backend.log.http .. automodule:: platypush.backend.log.http

View file

@ -1,4 +1,4 @@
``platypush.backend.mail`` ``mail``
========================== ==========================
.. automodule:: platypush.backend.mail .. automodule:: platypush.backend.mail

View file

@ -1,4 +1,4 @@
``platypush.backend.midi`` ``midi``
========================== ==========================
.. automodule:: platypush.backend.midi .. automodule:: platypush.backend.midi

View file

@ -1,4 +1,4 @@
``platypush.backend.mqtt`` ``mqtt``
========================== ==========================
.. automodule:: platypush.backend.mqtt .. automodule:: platypush.backend.mqtt

View file

@ -1,4 +1,4 @@
``platypush.backend.music.mopidy`` ``music.mopidy``
================================== ==================================
.. automodule:: platypush.backend.music.mopidy .. automodule:: platypush.backend.music.mopidy

View file

@ -1,4 +1,4 @@
``platypush.backend.music.mpd`` ``music.mpd``
=============================== ===============================
.. automodule:: platypush.backend.music.mpd .. automodule:: platypush.backend.music.mpd

View file

@ -1,4 +1,4 @@
``platypush.backend.music.snapcast`` ``music.snapcast``
==================================== ====================================
.. automodule:: platypush.backend.music.snapcast .. automodule:: platypush.backend.music.snapcast

View file

@ -0,0 +1,5 @@
``music.spotify``
===================================
.. automodule:: platypush.backend.music.spotify
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.nextcloud`` ``nextcloud``
=============================== ===============================
.. automodule:: platypush.backend.nextcloud .. automodule:: platypush.backend.nextcloud

View file

@ -1,4 +1,4 @@
``platypush.backend.nfc`` ``nfc``
========================= =========================
.. automodule:: platypush.backend.nfc .. automodule:: platypush.backend.nfc

View file

@ -1,4 +1,4 @@
``platypush.backend.nodered`` ``nodered``
============================= =============================
.. automodule:: platypush.backend.nodered .. automodule:: platypush.backend.nodered

View file

@ -1,4 +1,4 @@
``platypush.backend.ping`` ``ping``
========================== ==========================
.. automodule:: platypush.backend.ping .. automodule:: platypush.backend.ping

View file

@ -1,4 +1,4 @@
``platypush.backend.pushbullet`` ``pushbullet``
================================ ================================
.. automodule:: platypush.backend.pushbullet .. automodule:: platypush.backend.pushbullet

View file

@ -1,4 +1,4 @@
``platypush.backend.redis`` ``redis``
=========================== ===========================
.. automodule:: platypush.backend.redis .. automodule:: platypush.backend.redis

View file

@ -1,4 +1,4 @@
``platypush.backend.scard`` ``scard``
=========================== ===========================
.. automodule:: platypush.backend.scard .. automodule:: platypush.backend.scard

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.accelerometer`` ``sensor.accelerometer``
========================================== ==========================================
.. automodule:: platypush.backend.sensor.accelerometer .. automodule:: platypush.backend.sensor.accelerometer

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.arduino`` ``sensor.arduino``
==================================== ====================================
.. automodule:: platypush.backend.sensor.arduino .. automodule:: platypush.backend.sensor.arduino

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.battery`` ``sensor.battery``
==================================== ====================================
.. automodule:: platypush.backend.sensor.battery .. automodule:: platypush.backend.sensor.battery

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.bme280`` ``sensor.bme280``
=================================== ===================================
.. automodule:: platypush.backend.sensor.bme280 .. automodule:: platypush.backend.sensor.bme280

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.dht`` ``sensor.dht``
================================ ================================
.. automodule:: platypush.backend.sensor.dht .. automodule:: platypush.backend.sensor.dht

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.distance`` ``sensor.distance``
===================================== =====================================
.. automodule:: platypush.backend.sensor.distance .. automodule:: platypush.backend.sensor.distance

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.distance.vl53l1x`` ``sensor.distance.vl53l1x``
============================================= =============================================
.. automodule:: platypush.backend.sensor.distance.vl53l1x .. automodule:: platypush.backend.sensor.distance.vl53l1x

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.envirophat`` ``sensor.envirophat``
======================================= =======================================
.. automodule:: platypush.backend.sensor.envirophat .. automodule:: platypush.backend.sensor.envirophat

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.ir.zeroborg`` ``sensor.ir.zeroborg``
======================================== ========================================
.. automodule:: platypush.backend.sensor.ir.zeroborg .. automodule:: platypush.backend.sensor.ir.zeroborg

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.leap`` ``sensor.leap``
================================= =================================
.. automodule:: platypush.backend.sensor.leap .. automodule:: platypush.backend.sensor.leap

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.ltr559`` ``sensor.ltr559``
=================================== ===================================
.. automodule:: platypush.backend.sensor.ltr559 .. automodule:: platypush.backend.sensor.ltr559

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.mcp3008`` ``sensor.mcp3008``
==================================== ====================================
.. automodule:: platypush.backend.sensor.mcp3008 .. automodule:: platypush.backend.sensor.mcp3008

View file

@ -0,0 +1,5 @@
``sensor.motion.pmw3901``
=========================
.. automodule:: platypush.backend.sensor.motion.pmw3901
:members:

View file

@ -1,5 +0,0 @@
``platypush.backend.sensor.motion.pwm3901``
===========================================
.. automodule:: platypush.backend.sensor.motion.pwm3901
:members:

View file

@ -1,6 +0,0 @@
``platypush.backend.sensor``
============================
.. automodule:: platypush.backend.sensor
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.sensor.serial`` ``sensor.serial``
=================================== ===================================
.. automodule:: platypush.backend.sensor.serial .. automodule:: platypush.backend.sensor.serial

View file

@ -1,4 +1,4 @@
``platypush.backend.stt.deepspeech`` ``stt.deepspeech``
==================================== ====================================
.. automodule:: platypush.backend.stt.deepspeech .. automodule:: platypush.backend.stt.deepspeech

View file

@ -1,4 +1,4 @@
``platypush.backend.stt.picovoice.hotword`` ``stt.picovoice.hotword``
=========================================== ===========================================
.. automodule:: platypush.backend.stt.picovoice.hotword .. automodule:: platypush.backend.stt.picovoice.hotword

View file

@ -1,4 +1,4 @@
``platypush.backend.stt.picovoice.speech`` ``stt.picovoice.speech``
========================================== ==========================================
.. automodule:: platypush.backend.stt.picovoice.speech .. automodule:: platypush.backend.stt.picovoice.speech

View file

@ -1,5 +0,0 @@
``platypush.backend.stt``
=========================
.. automodule:: platypush.backend.stt
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.tcp`` ``tcp``
========================= =========================
.. automodule:: platypush.backend.tcp .. automodule:: platypush.backend.tcp

View file

@ -1,4 +1,4 @@
``platypush.backend.todoist`` ``todoist``
============================= =============================
.. automodule:: platypush.backend.todoist .. automodule:: platypush.backend.todoist

View file

@ -1,4 +1,4 @@
``platypush.backend.travisci`` ``travisci``
============================== ==============================
.. automodule:: platypush.backend.travisci .. automodule:: platypush.backend.travisci

View file

@ -1,4 +1,4 @@
``platypush.backend.trello`` ``trello``
============================ ============================
.. automodule:: platypush.backend.trello .. automodule:: platypush.backend.trello

View file

@ -1,4 +1,4 @@
``platypush.backend.weather.buienradar`` ``weather.buienradar``
======================================== ========================================
.. automodule:: platypush.backend.weather.buienradar .. automodule:: platypush.backend.weather.buienradar

View file

@ -1,4 +1,4 @@
``platypush.backend.weather.darksky`` ``weather.darksky``
===================================== =====================================
.. automodule:: platypush.backend.weather.darksky .. automodule:: platypush.backend.weather.darksky

View file

@ -1,4 +1,4 @@
``platypush.backend.weather.openweathermap`` ``weather.openweathermap``
============================================ ============================================
.. automodule:: platypush.backend.weather.openweathermap .. automodule:: platypush.backend.weather.openweathermap

View file

@ -1,5 +0,0 @@
``platypush.backend.weather``
=============================
.. automodule:: platypush.backend.weather
:members:

View file

@ -1,4 +1,4 @@
``platypush.backend.websocket`` ``websocket``
=============================== ===============================
.. automodule:: platypush.backend.websocket .. automodule:: platypush.backend.websocket

View file

@ -1,4 +1,4 @@
``platypush.backend.wiimote`` ``wiimote``
============================= =============================
.. automodule:: platypush.backend.wiimote .. automodule:: platypush.backend.wiimote

View file

@ -1,4 +1,4 @@
``platypush.backend.zigbee.mqtt`` ``zigbee.mqtt``
================================= =================================
.. automodule:: platypush.backend.zigbee.mqtt .. automodule:: platypush.backend.zigbee.mqtt

View file

@ -1,4 +1,4 @@
``platypush.backend.zwave.mqtt`` ``zwave.mqtt``
================================ ================================
.. automodule:: platypush.backend.zwave.mqtt .. automodule:: platypush.backend.zwave.mqtt

View file

@ -1,4 +1,4 @@
``platypush.backend.zwave`` ``zwave``
=========================== ===========================
.. automodule:: platypush.backend.zwave .. automodule:: platypush.backend.zwave

View file

@ -1,4 +1,4 @@
``platypush.message.event.adafruit`` ``adafruit``
==================================== ====================================
.. automodule:: platypush.message.event.adafruit .. automodule:: platypush.message.event.adafruit

View file

@ -1,4 +1,4 @@
``platypush.message.event.alarm`` ``alarm``
================================= =================================
.. automodule:: platypush.message.event.alarm .. automodule:: platypush.message.event.alarm

View file

@ -1,4 +1,4 @@
``platypush.message.event.application`` ``application``
======================================= =======================================
.. automodule:: platypush.message.event.application .. automodule:: platypush.message.event.application

Some files were not shown because too many files have changed in this diff Show more