Compare commits

...

676 Commits

Author SHA1 Message Date
Fabio Manganiello db8ea33b68 Removed deprecated `setup.py web_build` command from platydock [see #195] 2021-07-05 20:07:55 +02:00
Fabio Manganiello 03631bcebc Fixed import error in Adafruit.IO 2021-07-04 23:49:18 +02:00
Fabio Manganiello ade3a7c2cf Added plugin_name to weather.buienradar events 2021-07-04 18:04:51 +02:00
Fabio Manganiello 1f6c7aae60 get_redis() should be a general utility method 2021-06-26 11:14:26 +02:00
Fabio Manganiello a6c7d64511 Removed audio_format option from Spotify Connect backend (not supported by all versions of Librespot) 2021-06-25 23:20:21 +02:00
Fabio Manganiello af7977bcf7 Added music.spotify.connect backend 2021-06-25 22:47:40 +02:00
Fabio Manganiello 0762004838 Bump version: 0.21.0 → 0.21.1 2021-06-22 23:40:53 +02:00
Fabio Manganiello c8bfbae4f0 Prevented an infinite recursion error on the Pushbullet on_error() handler in case close() failed 2021-05-20 02:06:43 +02:00
Fabio Manganiello d35a9729a4 More robust reconnection logic for Pushbullet backend 2021-05-19 18:44:01 +02:00
Fabio Manganiello a39452124d Refactored PCA9685 backend 2021-05-17 15:32:43 +02:00
Fabio Manganiello fc1d9ad3e6 Added joystick.linux backend 2021-05-17 14:52:08 +02:00
Fabio Manganiello 7ee869ce42 More robust logic for smooth transients on PCA9685 2021-05-16 18:14:02 +02:00
Fabio Manganiello df36a9f811 s/execute/write/ 2021-05-16 17:53:22 +02:00
Fabio Manganiello abf793e703 Added get_channels() method to PCA9685 driver 2021-05-16 17:51:51 +02:00
Fabio Manganiello 132c659d3c Reset self._pca to None on deinit() 2021-05-16 17:42:05 +02:00
Fabio Manganiello acc4f1c0e3 Added PCA9685 PWM driver plugin 2021-05-16 17:29:03 +02:00
Fabio Manganiello d7d5bcdd0c Wait until the joystick device is readable after it appears to prevent race conditions where jstest fails with temporary "permission denied" errors 2021-05-16 00:26:28 +02:00
Fabio Manganiello def8c0dd76 The joystick backend should properly jstest even when the jstest executable fails 2021-05-16 00:16:19 +02:00
Fabio Manganiello 6cc28a3c3b More robust logic in case of joystick device lost while the backend is running 2021-05-16 00:06:20 +02:00
Fabio Manganiello 93c3327bcd Map name typo fix 2021-05-15 23:53:24 +02:00
Fabio Manganiello 85d975edc6 Logic typo 2021-05-15 23:50:23 +02:00
Fabio Manganiello d767cafafe `joystick.jstest` should actually run the parent `run` method but not extend `JoystickBackend` 2021-05-15 23:48:17 +02:00
Fabio Manganiello cee8f9f8e0 `joystick.jstest` should not execute the parent `run` method 2021-05-15 23:43:37 +02:00
Fabio Manganiello b2e2ae9538 Proper initialization for device attribute in parent joystick backend class 2021-05-15 23:34:41 +02:00
Fabio Manganiello f296f4b161 Added generic `joystick.jstest` backend 2021-05-15 23:28:24 +02:00
Fabio Manganiello 9eab526e47 Specify propertyKey on set_value() if exposed/required by the value payload [see #188] 2021-05-13 22:38:04 +02:00
Fabio Manganiello 8f6404d0b1 Revert "Support for custom timeout on MQTT message publish" (already implemented in the current logic) 2021-05-13 21:49:24 +02:00
Fabio Manganiello eac26b9b22 CHANGELOG edit 2021-05-13 21:37:45 +02:00
Fabio Manganiello b42c491390 Support for custom timeout on MQTT message publish 2021-05-13 21:33:08 +02:00
Fabio Manganiello c7fb97cdc7 Updated CHANGELOG 2021-05-10 21:23:15 +02:00
Fabio Manganiello 18e99c6f12 Added new Google Fit scopes for sleep and heart rate read 2021-05-10 21:21:03 +02:00
Fabio Manganiello 664ce4050d Added Switchbot plugin 2021-05-10 18:43:00 +02:00
Fabio Manganiello 69583d2e15 Added support for Marshmallow schemas in responses 2021-05-10 18:42:13 +02:00
Fabio Manganiello 2f840200be Updated UI files 2021-05-10 18:40:35 +02:00
Fabio Manganiello 46aef7c8b5 autodoc fixes 2021-05-08 21:38:32 +02:00
Fabio Manganiello 5ca15937e3 Bump version: 0.20.10 → 0.21.0 2021-05-06 23:21:11 +02:00
Fabio Manganiello ce882381c0 Fixes to torrent search + SASS library migration
- Support for custom PopcornTime API mirror/base URL.

- Full support for TV series search.

- Fixed torrent search (now using a different PopcornTime API mirror).

- Migrated SASS engine from `node-sass` (currently deprecated and broken on Node 16) to `sass`.

- Fixed alignment of Z-Wave UI header on Chrome/Webkit.
2021-05-06 23:18:47 +02:00
Fabio Manganiello 99b35b292f
Merge pull request #180 from BlackLight/snyk-upgrade-8faf0370e1fe9c73606043b43c1f95fc
[Snyk] Upgrade core-js from 3.7.0 to 3.10.1
2021-05-04 01:10:12 +02:00
snyk-bot 174439a8ed
fix: upgrade core-js from 3.7.0 to 3.10.1
Snyk has created this PR to upgrade core-js from 3.7.0 to 3.10.1.

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=upgrade-pr
2021-04-28 22:35:45 +00:00
Fabio Manganiello 3a18e9faf4 Upgraded npm dependencies 2021-04-28 23:55:01 +02:00
Fabio Manganiello f8d76fe4eb Bumped chalk/ssri versions 2021-04-28 23:43:45 +02:00
Fabio Manganiello 9fa3385766 Bump version: 0.20.9 → 0.20.10 2021-04-28 23:06:14 +02:00
Fabio Manganiello 4fe5322600 Explicitly case propertyKey to str 2021-04-22 23:23:41 +02:00
Fabio Manganiello 2224681e3c Removed OZW type references altogether to prevent import errors 2021-04-18 02:27:33 +02:00
Fabio Manganiello 68c44c0c3c OZW objects should be imported inside of the `ZwavePlugin` class to prevent `ImportError` on other Z-Wave plugins that don't depend on OZW 2021-04-18 02:19:53 +02:00
Fabio Manganiello 02a22d4a88 The zwave and zwave.mqtt plugins should extend a common abstract class instead of having a zwave.mqtt -> zwave functional dependency that introduces the PyOWZ dependency into zwave.mqtt 2021-04-16 20:54:07 +02:00
Fabio Manganiello b9bc4b5fe0 Bump version: 0.20.8 → 0.20.9 2021-04-12 02:48:30 +02:00
Fabio Manganiello c006c4b368 Added zwave.mqtt plugin and backend [closes #186] 2021-04-12 02:45:59 +02:00
Fabio Manganiello 75e1f35523
Merge pull request #173 from BlackLight/snyk-upgrade-13988d07be83d12370897cdf2a722b2a
[Snyk] Upgrade @fortawesome/fontawesome-free from 5.15.1 to 5.15.3
2021-04-08 21:18:25 +02:00
Fabio Manganiello 9e08b731a5
Merge pull request #172 from BlackLight/snyk-upgrade-2c28692e689ab7a78e388455f598523f
[Snyk] Upgrade vue-router from 4.0.0-rc.3 to 4.0.5
2021-04-08 21:18:05 +02:00
snyk-bot edfa5ed16f
fix: upgrade @fortawesome/fontawesome-free from 5.15.1 to 5.15.3
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 5.15.1 to 5.15.3.

See this package in npm:
https://www.npmjs.com/package/@fortawesome/fontawesome-free

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=upgrade-pr
2021-04-06 22:36:19 +00:00
snyk-bot f2628f4f2c
fix: upgrade vue-router from 4.0.0-rc.3 to 4.0.5
Snyk has created this PR to upgrade vue-router from 4.0.0-rc.3 to 4.0.5.

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=upgrade-pr
2021-04-06 22:36:16 +00:00
Fabio Manganiello f1faa1141e More LINT fixes 2021-04-06 21:10:48 +02:00
Fabio Manganiello 2a78f81a7b Major LINT fixes 2021-04-05 00:58:44 +02:00
Fabio Manganiello 86761e7088 Bump version: 0.20.7 → 0.20.8 2021-04-04 00:15:11 +02:00
Fabio Manganiello 89beab4767 Added controls to music dashboard widgets 2021-04-03 21:16:22 +02:00
Fabio Manganiello 8db8f3e6c4 Unparseable context variables should be logged on debug, not warning, level. 2021-04-03 16:12:51 +02:00
Fabio Manganiello ee0685363e Fixed regression on UI event handler callbacks 2021-04-02 19:48:13 +02:00
Fabio Manganiello 33276bf697 Updated CHANGELOG.md 2021-04-02 19:30:57 +02:00
Fabio Manganiello 99831bf0c7 Fix compatibility with all versions of websocket-client, regardless of the list of arguments required by the callbacks (either ws as a first argument or not) 2021-04-02 19:27:25 +02:00
Fabio Manganiello 641d9c0d41 Updated CHANGELOG.md 2021-04-01 22:46:45 +02:00
Fabio Manganiello 95625a401d Skip MQTT message if it has no content [closes #184] 2021-04-01 21:33:44 +02:00
Fabio Manganiello a147a4d37a Added <Camera> dashboard widget 2021-03-29 21:14:32 +02:00
Fabio Manganiello 177c697f83 Added support for custom dashboard components [see #129] 2021-03-28 17:34:11 +02:00
Fabio Manganiello eb486df1ee Bump version: 0.20.6 → 0.20.7 2021-03-26 23:09:33 +01:00
Fabio Manganiello a4c70f1e4d Fixed typo in README 2021-03-26 01:46:31 +01:00
Fabio Manganiello c16f8aa39e Added mobile app section to the README 2021-03-26 01:44:54 +01:00
Fabio Manganiello 570f1d0cf6 Passing expire_on_commit=False on sessionmaker() [see #181]
Accessing db objects outside of their session seems to fail on SQLAlchemy >= 1.4
with a `Instance `Instance <x> is not bound to a Session` error.

Setting expire_on_commit=False on the session seems to somehow fix the issue
(see https://stackoverflow.com/questions/3039567/sqlalchemy-detachedinstanceerror-with-regular-attribute-not-a-relation)
2021-03-25 20:30:51 +01:00
Fabio Manganiello 4313b6e883 media.vlc.status should synchronize on _stop_lock, or it may fail in the middle of its execution if the VLC session is being freed 2021-03-24 15:02:05 +01:00
Fabio Manganiello 00fabf3853 Reverted MQTT client reconnection logic until I find a more reliable way to identify the errors that caused the disconnections 2021-03-22 02:11:46 +01:00
Fabio Manganiello cad184fc1f MQTT_ERR_NOMEM should not result in a reconnection 2021-03-22 02:07:53 +01:00
Fabio Manganiello 928bb3667a Reconnection logic for MQTT disconnections caused by temporary errors 2021-03-22 01:52:27 +01:00
Fabio Manganiello 782be7794b More robust logic to deal with broken lines in HTTP logs 2021-03-21 10:12:27 +01:00
Fabio Manganiello 40dc739d09 Even more robust logic in case of missing HTTP version on the logged request - if anything is wrong with the format simply default to http_version = 1.0 2021-03-18 14:02:25 +01:00
Fabio Manganiello 4821fe086b More robust logic in case of missing HTTP version on the logged request 2021-03-18 11:30:57 +01:00
Fabio Manganiello 8d621b2688 Updated CHANGELOG 2021-03-18 01:35:03 +01:00
Fabio Manganiello 1355f7a3f6 [Dashboards] The class value should only apply to the widget wrapper, not to the wrapped widget [see #179] 2021-03-18 01:30:29 +01:00
Fabio Manganiello 3ce98305f0 Support for on_moved handler on file/log monitor backends 2021-03-17 23:21:52 +01:00
Fabio Manganiello 0a4cadba3e Fixed KeyError 2021-03-17 01:53:10 +01:00
Fabio Manganiello 9e46ab0b60 Wait for _on_stop_event in media.vlc.stop before releasing the instance 2021-03-16 22:34:03 +01:00
Fabio Manganiello c74d2fb124 Bump version: 0.20.5 → 0.20.6 2021-03-16 21:33:08 +01:00
Fabio Manganiello ca573cb980 Added possibility to pass id instead of name to the switch mixin toggle method 2021-03-16 21:03:58 +01:00
Fabio Manganiello 75deb0393d Fixed class name typo 2021-03-16 20:56:34 +01:00
Fabio Manganiello 14f1c44378 - If a Z-Wave event includes an explicit value update then explicitly set that value on the node, in order to prevent issues with Z-Wave value updates not yet propagated to the node structure
- Added Z-Wave switch component
2021-03-16 20:52:30 +01:00
Fabio Manganiello fdd46edb6a Do not force type cohercion on bool values - !!parseInt(true) = false in JavaScript, for some reason 2021-03-16 20:11:49 +01:00
Fabio Manganiello b9738d88df Added some temporary debug lines to Z-Wave's Value.vue to investigate setValue issues 2021-03-16 20:00:25 +01:00
Fabio Manganiello f92d19a24e media.vlc.stop should be synchronized on the _stop_lock and should call _reset_state instead of simply setting self._player = None 2021-03-16 19:42:59 +01:00
Fabio Manganiello ce0ca2e9ee Explicitly pass the new value on the Z-Wave setValue handler in case of binary toggles, since the target element can't be reliably determined 2021-03-16 19:37:42 +01:00
Fabio Manganiello 7f157d0234 Dockerfile should be part of the examples/ folder 2021-03-16 00:29:52 +01:00
Fabio Manganiello 8a3df30001 Removed Travis-CI and ReadTheDocs integrations (replaced by Platypush CI hooks) 2021-03-16 00:28:25 +01:00
Fabio Manganiello 82274d3d12 Added updated reference to CONTRIBUTING.md in README 2021-03-16 00:20:21 +01:00
Fabio Manganiello ab6c85c2a6 Updated CHANGELOG 2021-03-16 00:17:20 +01:00
Fabio Manganiello f8564c19cd Added log.http backend to monitor HTTP logs [closes #167] 2021-03-16 00:03:32 +01:00
Fabio Manganiello bf519babb0 Updated tests and docs build badges 2021-03-14 17:35:25 +01:00
Fabio Manganiello 632a7ab792 Added README for auto-generated docs and changed theme to sphinx-material 2021-03-14 15:07:10 +01:00
Fabio Manganiello 1d3d741212 Fixed Sphinx build warnings 2021-03-14 01:09:01 +01:00
Fabio Manganiello b171cb1012 A click on a Z-Wave binary event should result in the value being toggled, not rewritten [see #176] 2021-03-14 01:05:02 +01:00
Fabio Manganiello 352d421e61 Added file.monitor backend [closes #172]
The file.monitor backend leverages watchdog instead of the Linux-only
inotify API and it replaces the inotify backend.
2021-03-14 00:08:20 +01:00
Fabio Manganiello 6f224cbda9 Removed legacy "local" backend and pusher script 2021-03-13 01:52:15 +01:00
Fabio Manganiello adb472da7f Messages should always be posted to the Redis bus in valid JSON format - no need for ast.literal_eval fallback 2021-03-13 01:52:15 +01:00
Fabio Manganiello 347a4d2555 disable_logging=True for ZwaveNodeGroupEvent 2021-03-12 20:29:26 +01:00
Fabio Manganiello cef310ffd7 Added missing methods docs 2021-03-12 01:53:16 +01:00
Fabio Manganiello 96588df83b Bump version: 0.20.4 → 0.20.5 2021-03-12 01:40:03 +01:00
Fabio Manganiello 02f6845e72 - Added weather.openweathermap plugin and backend, as a replacement for Darksky [closes #177]
- Added note to the Darksky plugin about the decomissioning of the API by the end of the year
2021-03-12 01:31:26 +01:00
Fabio Manganiello 40834f7ce5 The zigbee2mqtt backend should use a suffix for the default client_id to prevent clashes with the default client_id from the MQTT backend [see #175] 2021-03-11 19:24:13 +01:00
Fabio Manganiello 3d6af00ee6 Disable logging of ZwaveValueEvent objects, as they tend to be very verbose 2021-03-11 17:53:39 +01:00
Fabio Manganiello b06867dc5d Added CONTRIBUTING file 2021-03-11 01:50:24 +01:00
Fabio Manganiello 22dad79dd5
Merge pull request #166 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/elliptic-6.5.4
Bump elliptic from 6.5.3 to 6.5.4 in /platypush/backend/http/webapp
2021-03-10 11:38:07 +01:00
Fabio Manganiello 211025cedb The redis_queue parameter is not necessarily defined on the app config 2021-03-10 11:15:06 +01:00
dependabot[bot] da27ed7546
Bump elliptic from 6.5.3 to 6.5.4 in /platypush/backend/http/webapp
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-10 10:00:42 +00:00
Fabio Manganiello 775478fff0 Improvement management of Z-Wave value types from the web panel 2021-03-10 10:58:51 +01:00
Fabio Manganiello 093bac3a60 - Addressed comments in #174
- Replaced active_scan flag with a list of track_devices
2021-03-09 19:03:04 +01:00
Fabio Manganiello b3606a8ac3 Changelog edit 2021-03-09 12:54:43 +01:00
Fabio Manganiello 4902475caf Added active_scan mode to bluetooth.scanner backend to actively perform a lookup name on each device discovered at least once [see #174] 2021-03-09 11:50:59 +01:00
Fabio Manganiello 7687e52058 Added cron examples to README.md 2021-03-09 01:43:28 +01:00
Fabio Manganiello eae4b4f62a The tmp_file fixture destructor should clean up any temporary files (in case multiple tests import it) 2021-03-09 00:22:18 +01:00
Fabio Manganiello 296458ece3 Cron expressions should follow the machine local time, not UTC [closes #173] 2021-03-09 00:18:33 +01:00
Fabio Manganiello 71af6e87e0 Bump version: 0.20.3 → 0.20.4 2021-03-08 01:51:39 +01:00
Fabio Manganiello c659ec507f Added tests/__main__.py entry point to run all the tests 2021-03-06 20:13:38 +01:00
Fabio Manganiello fb1953ce34 Using tests status badge from ci.platypush.tech on README instead of the Travis-CI status badge 2021-03-06 20:04:58 +01:00
Fabio Manganiello 34a108bbcb Clear log objects on teardown to prevent pytest logging errors 2021-03-06 20:02:25 +01:00
Fabio Manganiello 5be6ca50f0 Travis-CI pipeline migrated to pytest 2021-03-06 19:50:22 +01:00
Fabio Manganiello 090e7d6de8 Support for specifying the application Redis queue from the command line or service constructor 2021-03-06 19:22:13 +01:00
Fabio Manganiello 6f85318868 Use another Redis queue for the test app to prevent clashes with another Platypush service running on the same machine 2021-03-06 17:17:55 +01:00
Fabio Manganiello 8f256e4077 Check for file creation and content multiple times with timeout 2021-03-06 17:09:40 +01:00
Fabio Manganiello 4ed80a0945 More tests improvements 2021-03-06 17:03:50 +01:00
Fabio Manganiello ca90060ba1 Tests improvements 2021-03-06 16:25:37 +01:00
Fabio Manganiello 49ad3261f1 Refactored tests to use pytest with fixtures instead of unittest.TestCase 2021-03-06 16:21:28 +01:00
Fabio Manganiello 73e16fa6b1 Updated web app files 2021-03-05 21:43:16 +01:00
Fabio Manganiello d860d8aef1 Added SmartThings switch web plugin 2021-03-05 21:29:32 +01:00
Fabio Manganiello 36aee6f787 The same applies to procedures - don't dump context as a JSON in case of exceptions 2021-03-05 19:00:26 +01:00
Fabio Manganiello 04ff008800 Context shouldn't be dumped as json in case of exceptions - if some objects are not JSON serializable then we end up with an uncaught exception 2021-03-05 18:52:57 +01:00
Fabio Manganiello 47ba13d985 calendar.ical.get_upcoming_events should fail hard if there was any exception/unsuccessful response
The error should not be swallowed and it should be instead propagated up
to calendar.get_upcoming_events, if it's called from that context. And
calendar.get_upcoming_events should be in charge of handling the
exceptions and make sure that failing to retrieve the events for one
calendar doesn't make the whole method fail.
2021-03-05 11:16:14 +01:00
Fabio Manganiello 4ada1c663d Added SmartThings plugin [#148] 2021-03-05 02:23:28 +01:00
Fabio Manganiello 210cefc1a4 General improvements on the Zeroconf plugin and backend 2021-03-03 19:20:12 +01:00
Fabio Manganiello e43147e6a3 Added CHANGELOG 2021-02-28 23:54:22 +01:00
Fabio Manganiello 66c1e59c61 Bump version: 0.20.2 → 0.20.3 2021-02-28 23:48:34 +01:00
Fabio Manganiello 0e3845ef88 The vlc _reset_state logic should be wrapped within a lock context to make sure that two threads don't try to deallocate the context at the same time 2021-02-28 20:56:32 +01:00
Fabio Manganiello 833f810d4b Fixed stop handler for vlc plugin.
For some reason, vlc event handlers are not re-entrant (https://github.com/oaubert/python-vlc/issues/44#issuecomment-378520074).

This means that the vlc API can't be used from an event handler,
and that an event handler that reacts to stop/end-of-stream by
releasing the player and the vlc instance will likely get stuck
and the app may eventually die with SIGSEGV.

Because of this design limitation on the vlc side, the plugin has
to run another thread in the main app that monitors the stop event
set by the event handler and releases the resources appropriately.
2021-02-28 13:03:10 +01:00
Fabio Manganiello d190560536 Support for media.vlc.play toggling paused state if called with no arguments, and MediaPlayRequestEvent should have player and plugin attributes set 2021-02-28 01:40:29 +01:00
Fabio Manganiello e0e3081eb1 VLC volume should strictly be an integer 2021-02-28 01:31:00 +01:00
Fabio Manganiello 708ce210ba Added missing vlc requirements 2021-02-28 01:09:35 +01:00
Fabio Manganiello d0707b6479 Bump version: 0.20.1 → 0.20.2 2021-02-27 21:27:37 +01:00
Fabio Manganiello 66445cb4e4 - Do not parse Zeroconf info at all if not available
- Temporarily skip test_procedure until I find a proper way to clean up the status from the previous run and start a fresh platform
2021-02-27 21:11:37 +01:00
Fabio Manganiello f93df2fd49 Avoid the loop on the Zeroconf addresses object if the object is None (e.g. in the context of some tests) 2021-02-27 20:55:38 +01:00
Fabio Manganiello 0d806eeb6e - Removed setUp method from test_event_parse - let the parent setUp run and properly start the daemon
- More resilient logic in case some entries in the Zeroconf registry are still loading and the info object is still None
2021-02-27 20:51:48 +01:00
Fabio Manganiello 36fdcf6963 - The context should be properly expanded also when calling a Python procedure
- Refactored the logic for executing a request and wrapping the response common to procedures, crons and event hook decorators into platypush.common.exec_wrapper

- Added mock getvalue() method to Logger to prevent PyCharm failures in the tests when sys.stdout is redirected to the Logger object
2021-02-27 20:27:36 +01:00
Fabio Manganiello 3932fb56c4 test_event_parse must include a config_file, even if it doesn't use it, otherwise the service will fail to start 2021-02-27 17:01:47 +01:00
Fabio Manganiello cde5e4e4f9 Bump version: 0.20.0 → 0.20.1 2021-02-27 15:01:38 +01:00
Fabio Manganiello b4f9472fc5 - Proper expansion of the context variables on functional procedure call
- Expanded and refactored tests framework

- Added test_procedure
2021-02-27 15:01:25 +01:00
Fabio Manganiello 9e00428568 Don't fail silently if there were errors in parsing ${} variables or getting the context 2021-02-26 22:43:54 +01:00
Fabio Manganiello b4258faa29 Fixed broken regular expressions after LINT refactor 2021-02-26 22:33:26 +01:00
Fabio Manganiello 9e4daacd74 Aligning flex elements to the right with justify-content: right doesn't work on Chromium-based browsers - use flex-end instead 2021-02-26 21:10:45 +01:00
Fabio Manganiello 61c5bae527 Bump version: 0.13.9 → 0.20.0 2021-02-24 22:41:16 +01:00
Fabio Manganiello 82fcf86900 Added README note on how to run tests 2021-02-24 22:40:39 +01:00
Fabio Manganiello a5f02c6a30 The /hook route should not require token authentication - authentication is up to the hook implementation 2021-02-24 22:21:01 +01:00
Fabio Manganiello 076cc6a63e Fixed regex format 2021-02-24 01:34:41 +01:00
Fabio Manganiello d0a579cf4b Fixed old regex sequences to r'' format 2021-02-24 01:28:46 +01:00
Fabio Manganiello 33af368940 Removed Gitlab CI - it requires too much set up for now 2021-02-24 01:03:09 +01:00
Fabio Manganiello 531be19a66 .context needs to be imported in test_event_parse to make sure that the configuration is properly initialized 2021-02-24 00:35:41 +01:00
Fabio Manganiello ef36c76f10 Added CI pipeline script for Gitlab 2021-02-24 00:31:46 +01:00
Fabio Manganiello 571a8ca9d1 Improvements on HTTP integration test. Plus, removed ApplicationStoppedEvent - it's unreliable and it could be delivered when the bus has already been stopped 2021-02-24 00:23:32 +01:00
Fabio Manganiello 2800bac3fb Make sure that all hanging threads, backends and services are stopped and their resources cleaned up when the application stops. 2021-02-23 23:09:26 +01:00
Fabio Manganiello d1b7b1768c Improved tests script 2021-02-23 01:09:03 +01:00
Fabio Manganiello 1a7d0a3b07 Added sub-section on procedures to README.md 2021-02-23 00:11:16 +01:00
Fabio Manganiello b27c9ee630 Make sure to always run .quit() on the _player instance on stop/exit event, even if the player is already stopped, otherwise the OMXPlayer session may be hanging in the background and prevent new DBus connections 2021-02-22 14:22:45 +01:00
Fabio Manganiello 04a23d555d Updated README (it hadn't been updated for ages) 2021-02-22 02:53:20 +01:00
Fabio Manganiello dae8cf0111 Uncommented some sections of the example config.yaml 2021-02-22 02:08:26 +01:00
Fabio Manganiello 67702d3cc8 Rephrased disclaimer for the Google assistant backend 2021-02-22 01:41:54 +01:00
Fabio Manganiello 6df336465f Fixed nested list style in backend.http documentation 2021-02-22 01:35:42 +01:00
Fabio Manganiello ffb7a3e5a3 Extended and updated pieces of documentation on the HTTP server, Zigbee2mqtt and mpd. Also added example dashboard template and event hook script. 2021-02-22 01:20:01 +01:00
Fabio Manganiello 151d0008ee Removed docs references to removed plugin media.ctrl 2021-02-21 23:34:47 +01:00
Fabio Manganiello 10eb0c12aa Don't fail hard if the web app is initialized without access to a configuration file (e.g. from a ReadTheDocs build environment) 2021-02-21 23:30:05 +01:00
Fabio Manganiello aa5cbbce28 pyjwt added to Travis-CI requirements list 2021-02-21 18:57:15 +01:00
Fabio Manganiello 53fb254c57 js dependencies updated 2021-02-21 18:47:26 +01:00
Fabio Manganiello 727094467d Fixed some UI elements for Chrome on mobile 2021-02-21 18:10:22 +01:00
Fabio Manganiello 6f9428487f Higher priority to gstreamer plugin over omxplayer for tts 2021-02-21 02:44:26 +01:00
Fabio Manganiello 3e777bd19f Media buttons should have no background by default 2021-02-21 02:15:27 +01:00
Fabio Manganiello 7ab4da6156 Merge branch 'master' into vuejs 2021-02-21 00:47:02 +01:00
Fabio Manganiello 7922ae4801 Removed old templates/ and static/ web directories 2021-02-21 00:41:40 +01:00
Fabio Manganiello 94c35e210e Migrated /plugin/<pluginName> route 2021-02-21 00:39:06 +01:00
Fabio Manganiello 34892e227a The webapp dist/ folder should actually be under the webapp dir 2021-02-20 23:26:25 +01:00
Fabio Manganiello 856eb720b0 Migrated execute panel 2021-02-20 23:12:54 +01:00
Fabio Manganiello 94ad14f23f Migrated Samsung TV web panel 2021-02-20 01:18:05 +01:00
Fabio Manganiello c8fa61cc4f Fixed navigator scrolling and style 2021-02-19 22:55:31 +01:00
Fabio Manganiello 8ab72e8f94 Upgraded axios and bulma 2021-02-19 21:06:58 +01:00
Fabio Manganiello 6b5b50d186 Migrated switches plugin 2021-02-19 20:47:29 +01:00
Fabio Manganiello 56f8d85feb Migrated switches web panel and refactored switch plugins to expose a more consistent interface 2021-02-19 02:54:12 +01:00
Fabio Manganiello 51de11da25 Finalized migration of camera and sound plugins 2021-02-17 01:02:57 +01:00
Fabio Manganiello ca2fd60950 Migrated camera.android.ipcam UI 2021-02-16 23:56:43 +01:00
Fabio Manganiello e508d453ba Set better default scaling for camera.ir.mlx90640 UI 2021-02-16 22:57:09 +01:00
Fabio Manganiello 12e1c60f6c Fixed camera.ir.mlx90640 UI panel reference and RSS widget font 2021-02-16 22:42:43 +01:00
Fabio Manganiello 8c3ba9f367 Migrated camera.pi and camera.ir.mlx90640 UI panels 2021-02-16 20:14:20 +01:00
Fabio Manganiello 41acb02eb0 Migrated camera.cv/camera.ffmpeg/camera.gstreamer UI panels 2021-02-16 01:51:37 +01:00
Fabio Manganiello 748609c6f4 Migrated settings panel and logout button 2021-02-15 23:09:27 +01:00
Fabio Manganiello ee7407a7cc Don't create an MQTT client connection if there are no topics to subscribe.
If we open multiple connections from multiple MQTT-based backends to the
same host, with some of them having no topics subscribed, Paho-MQTT can
mess up which client is supposed to receive which message and we may end
up with lost messages on the platypush_bus_mqt/<host> topic.
2021-02-15 22:05:08 +01:00
Fabio Manganiello 201bb5986f Don't create an MQTT client connection if there are no topics to subscribe.
If we open multiple connections from multiple MQTT-based backends to the
same host, with some of them having no topics subscribed, Paho-MQTT can
mess up which client is supposed to receive which message and we may end
up with lost messages on the platypush_bus_mqt/<host> topic.
2021-02-15 22:02:58 +01:00
Fabio Manganiello 51e6d95205 Fixed valueId lookup in Z-Wave filtered values 2021-02-14 22:02:17 +01:00
Fabio Manganiello c78420749b More Z-Wave UI fixes [WIP] 2021-02-14 21:43:11 +01:00
Fabio Manganiello adbde5a681 Z-Wave UI style fixes [WIP] 2021-02-14 21:08:29 +01:00
Fabio Manganiello 80aa9b968d More Z-Wave UI fixes [WIP] 2021-02-14 19:16:21 +01:00
Fabio Manganiello b922f29bb8 Moar Z-Wave UI style fixes [WIP] 2021-02-14 18:53:59 +01:00
Fabio Manganiello 4dd5ea71d6 Style fixes for Z-Wave UI migration [WIP] 2021-02-14 18:07:40 +01:00
Fabio Manganiello 297c18e176 Fixed glitches in new Z-Wave panel [WIP] 2021-02-14 16:28:34 +01:00
Fabio Manganiello a1e2bf9b3a Fixed font size and ratio on new dashboard 2021-02-14 15:31:24 +01:00
Fabio Manganiello c2784c400f Added dist files for z-wave panel migration 2021-02-14 14:46:02 +01:00
Fabio Manganiello b49865181b Z-Wave plugin UI migration [WIP] 2021-02-14 02:29:39 +01:00
Fabio Manganiello 77c6f699a0 Keep track of the last state of the Zigbee controller so that new messages on the `bridge/state` topic won't trigger new events unless the state has actually changed [see #183] 2021-02-13 15:55:29 +01:00
Fabio Manganiello add1bd05cb Keep track of the last state of the Zigbee controller so that new messages on the `bridge/state` topic won't trigger new events unless the state has actually changed [see #183] 2021-02-13 15:54:21 +01:00
Fabio Manganiello 4c69a1e579 Merge branch 'master' into vuejs 2021-02-13 15:14:06 +01:00
Fabio Manganiello 5832bc68d5 Don't default on logging.INFO level if another level is set in the configuration, and apply the same logging level also to the web server [closes #162] 2021-02-13 15:13:53 +01:00
Fabio Manganiello 8168cd3ab3 Don't default on logging.INFO level if another level is set in the configuration, and apply the same logging level also to the web server [closes #162] 2021-02-13 15:13:07 +01:00
Fabio Manganiello be497548c1 Merge branch 'master' into vuejs 2021-02-12 22:44:20 +01:00
Fabio Manganiello b3c28f6773 Added support for JWT token-based authentication 2021-02-12 22:43:34 +01:00
Fabio Manganiello 9b9334682f Still support default host/port fallback on mqtt.publish 2021-02-12 02:20:04 +01:00
Fabio Manganiello 06ca5be54b Still support default host/port fallback on mqtt.publish 2021-02-12 02:19:36 +01:00
Fabio Manganiello 30d5cdcb00 Generated new dist files for the web app 2021-02-11 23:58:36 +01:00
Fabio Manganiello 2427cceb5e Migration completed for the zigbee.mqtt web panel 2021-02-11 23:53:05 +01:00
Fabio Manganiello 73cc742dfb Fixed backend.zigbee.mqtt to work with the new zigbee2mqtt API 2021-02-11 23:52:06 +01:00
Fabio Manganiello ade04a6ea1 Refactored backend.mqtt to reuse connections whenever possible, as well as programmatically subscribe/unsubscribe topics at runtime 2021-02-11 23:52:06 +01:00
Fabio Manganiello 3cf91a3f27 Fixed backend.zigbee.mqtt to work with the new zigbee2mqtt API 2021-02-11 23:50:28 +01:00
Fabio Manganiello f9598977db Refactored backend.mqtt to reuse connections whenever possible, as well as programmatically subscribe/unsubscribe topics at runtime 2021-02-10 22:31:33 +01:00
Fabio Manganiello 7325c87068 Fixed remaining Zigbee groups and binding methods to work with the new zigbee2mqtt API [see #163] 2021-02-10 02:01:30 +01:00
Fabio Manganiello 1a70c6ea0b Fixed remaining Zigbee groups and binding methods to work with the new zigbee2mqtt API [see #163] 2021-02-10 02:00:52 +01:00
Fabio Manganiello 021dd32190 Moved more zigbee2mqtt methods to the new API 2021-02-09 02:34:38 +01:00
Fabio Manganiello db80240209 zigbee2mqtt web panel migration [WIP] 2021-02-09 02:33:56 +01:00
Fabio Manganiello 1eedcaf2be Moved more zigbee2mqtt methods to the new API 2021-02-09 02:33:43 +01:00
Fabio Manganiello 86e6ffd18d Zigbee web panel migration [WIP] 2021-02-08 02:04:59 +01:00
Fabio Manganiello 15d2e1116b Fixed device_get and device_rename to use the new zigbee2mqtt API 2021-02-08 01:46:18 +01:00
Fabio Manganiello 452533db17 Fixed MQTT over SSL default version spec in case the parameter is not a string 2021-02-08 01:46:18 +01:00
Fabio Manganiello b8979040da Fixed device_get and device_rename to use the new zigbee2mqtt API 2021-02-08 01:45:21 +01:00
Fabio Manganiello 816492d3b2 Fixed MQTT over SSL default version spec in case the parameter is not a string 2021-02-08 01:44:26 +01:00
Fabio Manganiello 0bddbb0bca Merge branch 'master' into vuejs 2021-02-06 14:46:08 +01:00
Fabio Manganiello 314c01ef97 Refactored Zigbee backend and remove unused logic for keeping devices up-to-date 2021-02-06 14:45:50 +01:00
Fabio Manganiello 4c5a52417e Support for new zigbee2mqtt API and protocol (see #163) 2021-02-06 02:19:15 +01:00
Fabio Manganiello 23a5cd519a Merge branch 'master' into vuejs 2021-02-05 23:18:31 +01:00
Fabio Manganiello b57a241f52 Changed base URL to platypush.tech 2021-02-05 23:18:18 +01:00
Fabio Manganiello 2abfb2964c Merge branch 'master' into vuejs 2021-02-04 01:57:36 +01:00
Fabio Manganiello 4858dbc060 Back/forward seek changed from 60 to 30 2021-02-04 01:56:28 +01:00
Fabio Manganiello 2834ed2a7c Refactored and fixed many bugs on the media.omxplayer plugin 2021-02-04 01:44:21 +01:00
Fabio Manganiello 165f85f8dc Added support for background shell commands 2021-02-04 01:43:51 +01:00
Fabio Manganiello 7f24b82281 Removed deprecated media.ctrl plugin 2021-02-03 22:13:10 +01:00
Fabio Manganiello 7e1d232942 Another fix bites the dust 2021-02-03 17:47:33 +01:00
Fabio Manganiello 31a7ecee03 Quick fix 2021-02-03 17:46:05 +01:00
Fabio Manganiello 346bd9602d The whole get_plugin/.status() block should be under try/except 2021-02-03 17:44:40 +01:00
Fabio Manganiello 673351db51 Don't fail if a media plugin can't be imported 2021-02-03 17:43:26 +01:00
Fabio Manganiello 86ebc4fae9 Get the plugin name, not the object 2021-02-03 17:42:20 +01:00
Fabio Manganiello 118540db8c Fixed unreferenced var 2021-02-03 17:41:06 +01:00
Fabio Manganiello a1d6c4fbe4 Added missing Config import 2021-02-03 17:39:55 +01:00
Fabio Manganiello 2bb07ae191 Fixed base class name 2021-02-03 17:39:16 +01:00
Fabio Manganiello 1920bd80a3 First search among the configured media plugins in media.ctrl plugin 2021-02-03 17:34:33 +01:00
Fabio Manganiello 269000ab85 Merge branch 'master' into vuejs 2021-02-02 22:18:07 +01:00
Fabio Manganiello 0ad4597daf No need to keep the wiki as a submodule 2021-02-02 01:26:54 +01:00
Fabio Manganiello e08d4c21b8 Documentation domain name moved to docs.platypush.tech 2021-02-02 01:05:07 +01:00
Fabio Manganiello 254045283b Removed deprecated message.events.path module 2021-02-02 00:54:17 +01:00
Fabio Manganiello 41b8b738d6 Fixed links referenced in the documentation 2021-02-02 00:50:17 +01:00
Fabio Manganiello 0411145ebf Updated blog link 2021-02-02 00:32:39 +01:00
Fabio Manganiello cca4444af2 Updated README 2021-02-01 00:38:59 +01:00
Fabio Manganiello 3332c5c573 Updated README 2021-02-01 00:33:31 +01:00
fabio-eiq dca81de5a3 Updated README 2021-02-01 00:33:20 +01:00
Fabio Manganiello 1c84891df6 Update README.md 2021-02-01 00:31:59 +01:00
Fabio Manganiello fca0c2265c Added extra alias "snowboy" for "hotword" 2021-01-31 12:42:02 +01:00
Fabio Manganiello fda8872a15 Updated README 2021-01-31 01:28:58 +01:00
Fabio Manganiello ef63c3769e Cast request headers to dict before adding them to the event 2021-01-31 00:16:44 +01:00
Fabio Manganiello fddf2006e4 Added headers argument to webhook event 2021-01-31 00:01:58 +01:00
Fabio Manganiello a0bf227573 Fixed trailing column in wss: protocol 2021-01-30 23:21:52 +01:00
fabio-eiq 32ec76611a Removed .github folder 2021-01-28 14:48:19 +01:00
fabio-eiq 13f4edbc92 Updated README 2021-01-28 14:48:09 +01:00
fabio-eiq 8a1a8bc9a0 Merge branch 'master' into vuejs 2021-01-25 15:38:05 +01:00
fabio-eiq 7d4d9eb438 Refactored submodules 2021-01-25 13:26:20 +01:00
Fabio Manganiello e2415928a7 Added blog as submodule 2021-01-23 19:54:13 +01:00
Fabio Manganiello 80112652bf Merge branch 'master' into vuejs 2021-01-23 16:31:45 +01:00
Fabio Manganiello 92c98f26e5 Moved wiki module 2021-01-23 16:31:31 +01:00
Fabio Manganiello 8e2d590e62 Merge branch 'master' into vuejs 2021-01-23 15:06:14 +01:00
Fabio Manganiello e2e7011e53 s/github.com/git.platypush.tech/g 2021-01-23 15:03:43 +01:00
Fabio Manganiello 31b110a06c FIX: zigbee2mqtt applies different logic to /<device_name> and /<device_name>/get 2021-01-22 16:24:43 +01:00
Fabio Manganiello 717ad5d88c Revert "FIX: zigbee2mqtt /get calls require a property field specified on the message"
This reverts commit 7ff08a9587.
2021-01-22 16:13:18 +01:00
Fabio Manganiello cc839620cf FIX: zigbee2mqtt /get calls require a property field specified on the message 2021-01-22 01:03:52 +01:00
Fabio Manganiello cebd79079b Merge branch 'master' into vuejs 2021-01-22 01:01:22 +01:00
Fabio Manganiello 7a7e00bea2 Migrated music.snapcast UI 2021-01-22 01:00:49 +01:00
Fabio Manganiello 7ff08a9587 FIX: zigbee2mqtt /get calls require a property field specified on the message 2021-01-22 00:45:52 +01:00
Fabio Manganiello 370a7d4c15 Added frontend support for Plex 2021-01-18 01:28:10 +01:00
Fabio Manganiello 85f56cf98c New media panel [WIP] 2021-01-14 00:15:35 +01:00
Fabio Manganiello 6ae76f1f38 Migrating media plugins [WIP] 2021-01-05 00:50:24 +01:00
Fabio Manganiello 67d3b40772 Finalized new music.mpd web interface 2021-01-02 14:33:01 +01:00
Fabio Manganiello d2887b7454 Implemented search in music.mpd 2021-01-01 15:58:56 +01:00
fabio-eiq d10649e1f1 Support for token over Authorization: Bearer header 2020-12-31 15:36:48 +01:00
Fabio Manganiello e127f2597c music.mpd refactor WIP 2020-12-31 01:36:02 +01:00
Fabio Manganiello 1777ebb051 Retry logic in case of Pushbullet listener error 2020-12-30 19:44:30 +01:00
Fabio Manganiello 3eb7f01d38 Updated dist files 2020-12-26 17:43:00 +01:00
Fabio Manganiello 57304e8d7e Music buttons should have no background 2020-12-26 17:41:12 +01:00
Fabio Manganiello b4fc734a15 music.mpd panel migration - WIP 2020-12-26 15:03:12 +01:00
Fabio Manganiello bc3e0b8634 Support for plugin panels embedded into dashboards 2020-12-17 02:09:23 +01:00
Fabio Manganiello 1726cbd96a Optimized panel size for tablet 2020-12-16 22:31:04 +01:00
Fabio Manganiello e5c8adfc1b Fixed and expanded integration tests to deal with HTTP user authentication 2020-12-16 02:10:37 +01:00
Fabio Manganiello 049a48e156 Fixed modified property Vue warning 2020-12-15 21:32:39 +01:00
Fabio Manganiello 5d4f4b0378 Support for subscribe-once/unsubscribe frontend events mechanisms 2020-12-15 00:01:28 +01:00
Fabio Manganiello 0db997c6a0 transitiontime is not supported on hue/sat/bri change 2020-12-14 16:31:24 +01:00
Fabio Manganiello 5e7c6c26c9 Migrating lights panel WIP 2020-12-14 02:13:55 +01:00
Fabio Manganiello 2de1e3ebe6 Lights panel migration - WIP 2020-12-09 21:16:07 +01:00
Fabio Manganiello 79179746a7 Fixed websocket reconnection logic 2020-12-09 20:40:22 +01:00
Fabio Manganiello fc718c907a Migrating light.hue panel WIP 2020-12-03 00:59:35 +01:00
Fabio Manganiello 0cd120f492 New template for index panel 2020-11-30 20:57:00 +01:00
Fabio Manganiello c3f01c198f Keep track of the user authentication state 2020-11-28 15:32:07 +01:00
Fabio Manganiello 229b2de566 The /execute endpoint should require authentication as well 2020-11-28 15:28:09 +01:00
Fabio Manganiello dea547a491 Migrated Pushbullet component 2020-11-28 01:12:54 +01:00
Fabio Manganiello 1036358b28 Use a $watch-based system to register subscribe handlers when the events component is not yet ready instead of relying on setTimeout hacks 2020-11-28 00:29:22 +01:00
Fabio Manganiello 8f477fa335 Migrated voice assistant component 2020-11-27 23:12:10 +01:00
Fabio Manganiello 3c6f3c5a21 Migrated login and register components 2020-11-26 23:43:16 +01:00
Fabio Manganiello 0902099855 Migrated RSS news widget 2020-11-26 17:11:03 +01:00
Fabio Manganiello 3c9a633907 Fixed carousel style 2020-11-26 12:53:34 +01:00
Fabio Manganiello 1e193f8346 Added new static files 2020-11-26 12:41:56 +01:00
Fabio Manganiello 9af02ba886 Carousel default font increased 2020-11-26 12:27:42 +01:00
Fabio Manganiello 221bcc058b Need static/js and static/css as well 2020-11-26 12:02:41 +01:00
Fabio Manganiello 04cb2324aa Removed dashboard configuration from HttpBackend, removed old HTTP
static files and replaced them with Vue app target dist/ directory.
2020-11-26 11:54:28 +01:00
Fabio Manganiello 887a0e5e88 Webapp dist files 2020-11-26 11:44:08 +01:00
Fabio Manganiello cc3e52c69d Migrated ImageCarousel widget 2020-11-26 00:26:10 +01:00
Fabio Manganiello 243e56b194 Added support for rows on dashboard and music widget 2020-11-23 00:44:31 +01:00
Fabio Manganiello ecf6a844dd Added support for refreshSeconds on dashboard level 2020-11-22 14:26:25 +01:00
Fabio Manganiello 62b651789a Migrated DateTimeWeather and Calendar widgets 2020-11-22 12:57:28 +01:00
Fabio Manganiello ba8e5ef6a0 Fixed croniter timezone offset logic mismatch 2020-11-21 01:38:07 +01:00
Fabio Manganiello 9dacd2d3c9 Fixed croniter timezone offset logic mismatch 2020-11-21 01:36:37 +01:00
Fabio Manganiello 39abdfe40a New Vue.js template for dashbord WIP 2020-11-21 01:12:08 +01:00
Fabio Manganiello 0c0e7411f7 Bump version: 0.13.8 → 0.13.9 2020-11-11 22:31:47 +01:00
Fabio Manganiello 9179f35a82 Support for row height for dashboard widgets 2020-11-11 22:28:43 +01:00
Fabio Manganiello 470bd62af7 Parse actions in cron also from list 2020-11-11 17:09:36 +01:00
Fabio Manganiello c7711d75a1 New pychromecast has replaced host/port with uri 2020-11-11 03:07:42 +01:00
Fabio Manganiello 711ea543bb Use youtube-dl to extract the video URL instead of streaming its content to a local sock file 2020-11-11 03:07:23 +01:00
Fabio Manganiello 43f71ed47b Bump version: 0.13.7 → 0.13.8 2020-11-10 22:55:03 +01:00
Fabio Manganiello a07cb6ec3d Explicit cast of possible dict_keys element to list() before copy() 2020-11-10 22:53:12 +01:00
Fabio Manganiello 45d998130b Event import fixed 2020-10-28 23:29:34 +01:00
Fabio Manganiello cc36325ca6 Added support for custom user events 2020-10-28 23:28:41 +01:00
Fabio Manganiello c5dc9333f0 Extended light plugin status method signature 2020-10-28 23:19:16 +01:00
Fabio Manganiello 8a7f783032 Support for list args type in requests 2020-10-28 23:18:55 +01:00
Fabio Manganiello 77530b4a06 Use a threading Event to synchronize with the Hue animation thread instead of relying on the Redis backend 2020-10-14 00:18:23 +02:00
Fabio Manganiello 6d7f1502ce Wiki updated 2020-10-13 23:47:10 +02:00
Fabio Manganiello 8279f22940 Bump version: 0.13.6 → 0.13.7 2020-10-13 23:26:13 +02:00
Fabio Manganiello 1c84659e34 Support for Python cronjobs in scripts folder - closes #156 2020-10-13 23:25:27 +02:00
Fabio Manganiello 37e006d86e Refined Tensorflow train methods 2020-10-12 01:06:32 +02:00
Fabio Manganiello 8d7e790eda More descriptive attribute names for the Tensorflow predict response.
Using `outputs` instead of `values` and `predictions` instead of `labels`.
2020-10-02 01:17:34 +02:00
Fabio Manganiello daaa0050d1 Squeeze the extra dimensions in a grayscale image and pass the model name to the response objects 2020-10-01 18:50:36 +02:00
Fabio Manganiello 287b6303ae More flexible module loading and better lock management for models in Tensorflow plugin 2020-10-01 17:41:12 +02:00
Fabio Manganiello 9b23ab7015 Only stop the loop if it is set 2020-09-30 13:53:32 +02:00
Fabio Manganiello 7947c1031d More robust frontend reaction in case of race conditions on player state events 2020-09-29 15:58:23 +02:00
Fabio Manganiello 9e6c40d393 media.gstreamer added to the list of compatible media plugins 2020-09-29 15:37:46 +02:00
Fabio Manganiello f3a9dc4ef5 Added navigator icon for media.gstreamer plugin 2020-09-29 15:35:29 +02:00
Fabio Manganiello 05b0a7f14d Added GStreamer media plugin [closes #151] 2020-09-29 15:32:40 +02:00
Fabio Manganiello 6ad5397a25 Removed unused import 2020-09-28 22:13:42 +02:00
Fabio Manganiello 0a9c4fc3a7 Added GStreamer camera plugin [relates to #151] 2020-09-28 22:10:56 +02:00
Fabio Manganiello b30145dfc9 Copyright year update 2020-09-28 13:11:07 +02:00
Fabio Manganiello e9d9ef252f Frames directory should be created in 0o755 mode 2020-09-28 02:33:27 +02:00
Fabio Manganiello f2a654bdec Reset camera.android.ipcam stylesheet 2020-09-27 19:47:21 +02:00
Fabio Manganiello d92e630314 Bump version: 0.13.5 → 0.13.6 2020-09-27 17:20:51 +02:00
Fabio Manganiello 07336d3272 Fixed login redirect page [closes #154] 2020-09-27 17:20:14 +02:00
Fabio Manganiello 00012aacae Added missing docs 2020-09-27 17:12:37 +02:00
Fabio Manganiello 959cc8b75b Added navigator icon for ffmpeg camera 2020-09-27 17:09:52 +02:00
Fabio Manganiello df1e03f0af Added FFmpeg camera plugin [relates to #150] 2020-09-27 12:52:07 +02:00
Fabio Manganiello b21193dc74 Added camera.ffmpeg plugin web panel 2020-09-27 03:09:14 +02:00
Fabio Manganiello 9ad6188b5d New js file for camera.pi plugin 2020-09-27 02:52:20 +02:00
Fabio Manganiello 31f2c5152c New template file for camera.pi 2020-09-27 02:47:38 +02:00
Fabio Manganiello c269c62fe6 Refactored logging names 2020-09-27 01:33:38 +02:00
Fabio Manganiello 6e6092e4b2 Do proper decapsulation for PiCamera wrapped object when reinitialized 2020-09-25 18:25:33 +02:00
Fabio Manganiello ac42f7eba4 Make sure that the PiCamera session is properly closed and re-opened on each stream request 2020-09-25 18:06:27 +02:00
Fabio Manganiello 258a9b57ce release_device should not fail hard if stop_recording or close fail on ConnectionError 2020-09-25 17:42:21 +02:00
Fabio Manganiello 28409b8688 The device should be released after each streaming session 2020-09-25 17:34:53 +02:00
Fabio Manganiello c12e7bab90 The streaming thread shouldn't fail and exit if it fails closing a client socket 2020-09-25 17:28:25 +02:00
Fabio Manganiello 09f9e974b1 Camera plugins refactor 2020-09-25 17:19:43 +02:00
Fabio Manganiello c0f7cc0782 Added NextCloud integration [closes #149] 2020-09-10 11:10:26 +02:00
Fabio Manganiello 0af326fa11 Refactored inotify backend 2020-09-09 02:16:13 +02:00
Fabio Manganiello beeb7dca7c Removed unneeded import 2020-09-09 02:15:52 +02:00
Fabio Manganiello 1e972ded99 More robust logic on the bus in case the message failed to parse (prevents the application from crashing) 2020-09-09 02:15:35 +02:00
Fabio Manganiello a650840429 Refactored variable plugin 2020-09-09 02:14:59 +02:00
Fabio Manganiello 4d0d467292 PIL JPEG format name typo fix 2020-09-08 18:14:49 +02:00
Fabio Manganiello 83122becdb Applied degrees -> PIL rotation ID conversion to the output image 2020-09-08 18:03:18 +02:00
Fabio Manganiello 9623752e19 Fixed module name typo 2020-09-08 17:57:18 +02:00
Fabio Manganiello 53ddbad7ce Refactored MLX90640 plugin and HTTP route to work with direct BytesIO - it improves performance over using temporary files or base64-encoded responses 2020-09-08 17:51:46 +02:00
Fabio Manganiello ac02becba8 Switched RSS HTML digests style to inline CSS for better client cross-compatibility and added docstring to RssUpdates 2020-09-05 16:54:08 +02:00
Fabio Manganiello 13642cc42e Possibility to customize the CSS in the generated RSS digests 2020-09-05 01:48:28 +02:00
Fabio Manganiello d6f653d834 Using named arguments for formatting the parsed content of a feed 2020-09-05 01:43:33 +02:00
Fabio Manganiello dc254d6474 Also include the link in an RSS feed digest 2020-09-05 01:39:16 +02:00
Fabio Manganiello 8a1f49a906 Open the source file in read non-binary mode in case of MIMEText 2020-09-05 01:29:43 +02:00
Fabio Manganiello 6dce4c59f6 (Forgot to pass the new arguments to the MIME constructor) 2020-09-05 01:27:08 +02:00
Fabio Manganiello ce42f5aada MIMEText doesn't accept the Name parameter 2020-09-05 01:25:12 +02:00
Fabio Manganiello e9d4ed3911 Added more source fields to the RSS NewFeedEvent 2020-09-05 00:50:04 +02:00
Fabio Manganiello 2ceb3511b3 More robust websocket retry handler for Todoist 2020-09-04 22:59:23 +02:00
Fabio Manganiello d27b23ec5a Bump version: 0.13.4 → 0.13.5 2020-09-03 17:17:47 +02:00
Fabio Manganiello 9402e4f65f Removed trailing column 2020-09-03 17:16:35 +02:00
Fabio Manganiello a4c6028dc4 Fixed wrong code-block syntax 2020-09-03 14:32:51 +02:00
Fabio Manganiello aeed86e377 Added missing docs 2020-09-03 14:26:48 +02:00
Fabio Manganiello 907bc0f75b Added rtorrent integration [closes #120] 2020-09-03 13:08:42 +02:00
Fabio Manganiello d7806757c5 Polished mail integration 2020-09-02 01:34:18 +02:00
Fabio Manganiello ca168828de Added events on IMAP flagged/starred messages and extended IMAP plugin with remaining methods [closes #146] 2020-09-02 00:07:08 +02:00
Fabio Manganiello 6c24783df7 Log full exceptions in case of failures in a procedure 2020-09-01 10:33:56 +02:00
Fabio Manganiello a65a6e9d02 Added missing docs 2020-09-01 02:23:58 +02:00
Fabio Manganiello 681e9f1703 Added SMTP plugin [links to #146] 2020-09-01 01:52:22 +02:00
Fabio Manganiello 737c135996 More robust logic to pass procedures to the index.html template 2020-08-31 21:32:00 +02:00
Fabio Manganiello edd2235cbc Removed old reference to __plugins__ in kodi.js - using `inspect.get_config` endpoint instead. 2020-08-31 18:31:15 +02:00
Fabio Manganiello dc1b54961f Added `inspect.get_config()` method to get the configuration programmatically 2020-08-31 18:26:08 +02:00
Fabio Manganiello 3c3ee09d90 Fixed auto-generated docs indentation and code blocks 2020-08-31 17:39:42 +02:00
Fabio Manganiello e533484505 Added missing docs 2020-08-31 15:34:48 +02:00
Fabio Manganiello 1681f80728 Added IMAP plugin and generic mail check backend [links to #146] 2020-08-31 15:33:03 +02:00
Fabio Manganiello f1ab923bfe Option to reuse the MQTT configuration of the plugin if not provided on the backend 2020-08-27 17:39:22 +02:00
Fabio Manganiello d7c3ad64f5 Use default MQTT settings for MQTT listeners if not provided 2020-08-27 17:16:33 +02:00
Fabio Manganiello ca0c4e3089 Don't overwrite the client variable within the same scope 2020-08-27 16:59:35 +02:00
Fabio Manganiello beceb39b0c Added client_id in MQTT integrations 2020-08-27 16:41:51 +02:00
Fabio Manganiello 9f1128e2c0 typo fix 2020-08-27 16:30:18 +02:00
Fabio Manganiello e77e5bb3d8 Only expand paths if set 2020-08-27 16:29:21 +02:00
Fabio Manganiello 0d182820e8 expanduser for TLS files in MQTT listeners 2020-08-27 16:25:52 +02:00
Fabio Manganiello f7df1d2f6e typo fix 2020-08-27 16:01:51 +02:00
Fabio Manganiello cd8732dc8f Added tls_insecure flag to MQTT 2020-08-27 15:56:43 +02:00
Fabio Manganiello b8917de52f TLS version in MQTT configuration parsed from string 2020-08-27 12:44:00 +02:00
Fabio Manganiello aa631deb88 Fixed docs typo 2020-08-24 01:24:24 +02:00
Fabio Manganiello 2e6388f6f4 ReadTheDocs fixes 2020-08-24 01:14:40 +02:00
Fabio Manganiello 5d2e74eb97 LINT fixes for LCD plugins 2020-08-24 00:42:34 +02:00
Fabio Manganiello 40269ddaad Added missing docs 2020-08-23 21:13:14 +02:00
Fabio Manganiello af614480b8 Added LCD display integration (closes #145) 2020-08-23 20:00:08 +01:00
Fabio Manganiello 7a7c065754 Added missing docs 2020-08-23 00:49:51 +02:00
Fabio Manganiello 6bed284e8b Added DHT temperature/humidity sensor integration [closes #113] 2020-08-22 23:46:21 +01:00
Fabio Manganiello 289eebd6a0 Moved definition of workdir inside the constructor, otherwise readthedocs will fail for missing configuration file 2020-08-22 15:33:44 +02:00
Fabio Manganiello f54a5cdf87 Minimum required Python version bumped (3.5->3.6) and readthedocs Python interpreter upgraded (3.6->3.7). 2020-08-22 15:28:52 +02:00
Fabio Manganiello 43ef4bccdf LINT fixes 2020-08-22 14:31:00 +02:00
Fabio Manganiello 1bb22d818a Added missing docs 2020-08-22 14:26:47 +02:00
Fabio Manganiello fa0a5805be LINT fixes 2020-08-22 14:25:31 +02:00
Fabio Manganiello bf92d66be1 Bump version: 0.13.3 → 0.13.4 2020-08-22 14:08:14 +02:00
Fabio Manganiello a9509fc959 Pass the repo reference to the Github event 2020-08-22 12:25:55 +02:00
Fabio Manganiello 2dc8fe9437 Added Github backend [closes #95] 2020-08-22 12:09:24 +02:00
Fabio Manganiello a0d97c0f18 service_type and service_name are actually needed even if empty 2020-08-20 00:48:01 +02:00
Fabio Manganiello d8f7b15111 Post ZeroconfServiceRemovedEvent also if the zeroconf_info object has already been deallocated 2020-08-20 00:40:02 +02:00
Fabio Manganiello ddedcd647c The Zeroconf object might already be closed after unregister_service 2020-08-20 00:37:39 +02:00
Fabio Manganiello 63ad4bfdce Doc fixes 2020-08-20 00:35:06 +02:00
Fabio Manganiello 1abcb1de4b Added Zeroconf to Travis requirements 2020-08-20 00:32:01 +02:00
Fabio Manganiello 8eb457017a Added missing docs 2020-08-20 00:10:11 +02:00
Fabio Manganiello 019bcbf90a Replaced values.unset in Twilio methods signature with None for JSON compatibility 2020-08-20 00:08:10 +02:00
Fabio Manganiello 403076e6ab Fixed method name 2020-08-19 23:56:23 +02:00
Fabio Manganiello 988601b10e Added Twilio integration [closes #132] 2020-08-19 23:30:26 +02:00
Fabio Manganiello cbae8132ed Python 3.5 compatibility 2020-08-19 22:20:00 +02:00
Fabio Manganiello 5302d3143e Better reconnection logic for mopidy backend 2020-08-19 20:23:33 +02:00
Fabio Manganiello 4b86b8ef54 Fixed ndef submodules import 2020-08-17 17:16:53 +02:00
Fabio Manganiello 62e5d03931 Matching new ndef naming conventions 2020-08-17 17:10:28 +02:00
Fabio Manganiello d5292e068d Re-formatted header 2020-08-16 16:06:13 +02:00
Fabio Manganiello 40c2c157ec typo 2020-08-16 16:04:25 +02:00
Fabio Manganiello ead5b94942 Readthedocs link copied to the README header 2020-08-16 16:03:58 +02:00
Fabio Manganiello 9b2c6ef62d Added more links to the README 2020-08-16 16:02:42 +02:00
Fabio Manganiello ccc01e1823 Extended README badges 2020-08-16 14:36:48 +02:00
Fabio Manganiello 9c52d96c08 Bump version: 0.13.2 → 0.13.3 2020-08-16 02:01:41 +02:00
Fabio Manganiello 06258b8304 Added missing docs 2020-08-16 01:59:18 +02:00
Fabio Manganiello 0659996c48 Added DBus integration [closes #141] 2020-08-16 01:57:30 +02:00
Fabio Manganiello af2dbf899d Importing Zeroconf inside of the method to prevent Travic-CI from breaking because of module not found 2020-08-14 20:53:20 +02:00
Fabio Manganiello 20b095232d Support for extended information in zeroconf.discover_service 2020-08-14 15:52:24 +02:00
Fabio Manganiello 72bb159263 python-zeroconf introduced (even more) breaking changes in 0.27.0.
Give up and explicitly depend on zeroconf>=0.27.0, even if this can
break other packages. For any issues, please shout at the python-zeroconf
maintainers.
2020-08-14 02:16:46 +02:00
Fabio Manganiello f35bacaae5 Bump version: 0.13.1 → 0.13.2 2020-08-14 02:02:29 +02:00
Fabio Manganiello c057cd13fd python-zeroconf has introduced too many breaking changes - giving up. 2020-08-14 02:01:31 +02:00
Fabio Manganiello b79fd4e25d Bump version: 0.13.0 → 0.13.1 2020-08-14 00:37:39 +02:00
Fabio Manganiello 7e8bef40cd Added Zeroconf integration [closes #105] 2020-08-14 00:36:39 +02:00
Fabio Manganiello bc3c01254e
Created FUNDIG.yml 2020-08-12 01:15:14 +02:00
Fabio Manganiello dc5afebd27 Bump version: 0.12.10 → 0.13.0 2020-08-12 00:59:04 +02:00
Fabio Manganiello 5bb4053ed8 New webext commits 2020-08-12 00:58:37 +02:00
Fabio Manganiello 6b43a5e592 Added luma.oled display support 2020-08-11 14:48:14 +02:00
Fabio Manganiello d3e52ba944 Backends should be started with daemon=True 2020-08-01 17:20:46 +02:00
Fabio Manganiello 6883db7f8b New webext commits 2020-07-28 22:42:14 +02:00
Fabio Manganiello 65bac0ccc5 Fix for pychromecast.get_chromecasts new return type.
On newer versions of pychromecast get_chromecasts returns
a tuple (devices, browser_service) instead of a list. The
software should be robust enough with both older and newer
versions of pychromecast.
2020-07-25 01:35:06 +02:00
Fabio Manganiello cabc154252 systemd unit should depend on redis 2020-07-20 01:42:28 +02:00
Fabio Manganiello 20e67ffc93 Bump version: 0.12.9 → 0.12.10 2020-07-20 00:20:19 +02:00
Fabio Manganiello 1973d1a6b5
Created python-publish.yml workflow 2020-07-19 23:46:32 +02:00
Fabio Manganiello a6730d5252 Added generated CSS folder (prevents pyScss dependencies for binary builds) 2020-07-19 22:41:37 +02:00
Fabio Manganiello e85bd125a9 Using https link instead of git (not supported by readthedocs) 2020-07-19 00:04:31 +02:00
Fabio Manganiello 3521f75eab Webext update 2020-07-15 00:54:38 +02:00
Fabio Manganiello 09a8533413 Using git@ link instead of https:// link for web extension submodule 2020-07-15 00:07:51 +02:00
Fabio Manganiello 1c6393be4c Updated web extension version 2020-07-07 23:25:00 +02:00
Fabio Manganiello a3a5a2b955 Updated web extension version 2020-07-07 20:03:17 +02:00
Fabio Manganiello 590d416682 Google Translate API supports a maximum of 2000 characters per API call.
Therefore it's a good idea to split the input text/html.
2020-07-05 21:04:54 +02:00
Fabio Manganiello f1c9554b1b Updated web extension version 2020-07-05 01:36:10 +02:00
Fabio Manganiello 1c1e92149a Updated web extension version 2020-07-04 00:59:24 +02:00
Fabio Manganiello adc94349c7 Missing commas 2020-07-04 00:31:24 +02:00
Fabio Manganiello b716b1a0c1 More robust URL query for YouTube 2020-07-04 00:25:49 +02:00
Fabio Manganiello 93ac6c8af9 Regex format fix 2020-07-04 00:18:45 +02:00
Fabio Manganiello 03dc524f80 Fixed response type 2020-07-04 00:15:44 +02:00
Fabio Manganiello c943acb9c2 Smarter logic for parsing YouTube URLs in Kodi 2020-07-04 00:12:16 +02:00
Fabio Manganiello a4824a4e95 Google Cloud Translate API works through GOOGLE_APPLICATION_CREDENTIALS env variable 2020-07-02 02:24:54 +02:00
Fabio Manganiello 566fd42ee8 Added missing docs 2020-07-02 02:08:53 +02:00
Fabio Manganiello 46515020cf Added Google Translate plugin 2020-07-02 02:07:57 +02:00
Fabio Manganiello facc6e7c15 Added web extension as submodule 2020-07-01 01:33:37 +02:00
Fabio Manganiello 1e15bb5606 Changed favicon 2020-07-01 01:08:31 +02:00
Fabio Manganiello b32232b46e Prevent a tight loop in HttpPoll if one of the requests fails 2020-07-01 00:53:23 +02:00
Fabio Manganiello 3174db5776 Always convert content to string before writing it to a file 2020-06-30 11:41:38 +02:00
Fabio Manganiello 11709641d7 Extended file plugin with more util methods 2020-06-29 23:53:11 +02:00
Fabio Manganiello d560823887 Replaced deprecated options in PiCamera module 2020-06-27 13:55:18 +02:00
Fabio Manganiello 96716dc872 Support for pre-fetched HTML/Markdown content.
HTML output can be too large for the process called over the command
line. HTML data exchange now happens through an intermediate temporary
file.
2020-06-25 01:37:59 +02:00
Fabio Manganiello f50ad767e0 Support for more arguments passed to the Mercury parser 2020-06-23 01:54:35 +02:00
Fabio Manganiello 4d650da3e5 Updated setup dependencies 2020-06-21 13:09:41 +02:00
Fabio Manganiello a1c20a52da Defined get_procedures() method on inspect plugin 2020-06-17 22:31:07 +02:00
Fabio Manganiello fb58c89911 More robust node_to_dict code in case of race conditions where some of the attributes required to generate id_on_network are not available 2020-06-11 14:50:41 +02:00
Fabio Manganiello 4e8876309c One last attempt to get shit to work 2020-06-10 12:37:26 +02:00
Fabio Manganiello 929b7c9a5c Still trying to get CSS generation to happen within install... 2020-06-10 12:31:23 +02:00
Fabio Manganiello f607c6757f Trying to get web_build to run in install - see https://stackoverflow.com/questions/20194565/running-custom-setuptools-build-during-install 2020-06-10 12:24:13 +02:00
Fabio Manganiello bfdc9d7d46 First run web_build then install 2020-06-10 12:16:43 +02:00
Fabio Manganiello 7441c35566 SCSS compilation done in install command instead of build 2020-06-10 12:15:05 +02:00
Fabio Manganiello a18002dea0 The command class of a Z-Wave value can also be null: prevent the plugin from breaking in such case 2020-06-09 16:14:02 +02:00
Fabio Manganiello 9d6375f381 More robust logic in case of Tplink device not available 2020-06-08 19:43:08 +02:00
Fabio Manganiello 526bca847b Bump version: 0.12.8 → 0.12.9 2020-06-08 00:38:04 +02:00
Fabio Manganiello 0ced46058a Always set check_same_thread=False in case of SQLite engines.
Platypush is heavily multi-threaded, and it can happen that some
transactions are handled in different threads - and consistency
is managed by the application itself.
2020-06-08 00:27:41 +02:00
Fabio Manganiello 6ba92e7fdd Added missing doc line 2020-05-23 23:12:45 +02:00
Fabio Manganiello 82a9aa1232 Added clipboard backend 2020-05-23 23:11:42 +02:00
Fabio Manganiello b5f0e2b4df Bump version: 0.12.7 → 0.12.8 2020-05-23 21:39:26 +02:00
Fabio Manganiello 3cdd9e8474 Added SSH plugin [closes #136] 2020-05-23 21:38:22 +02:00
Fabio Manganiello f20cb4df5b No need to override background-color in main for dashboard 2020-05-23 12:26:45 +02:00
Fabio Manganiello 97343e97de background-image for dashboard CSS 2020-05-23 12:22:56 +02:00
Fabio Manganiello 1b47615100 More robust attribute checking before conversion, as the object can actually be either a ZWaveNode or a ZWaveController 2020-05-22 12:08:17 +02:00
Fabio Manganiello 98ced4b4e4 Don't push a ZwaveNetworkStoppedEvent directly to the event_queue - the object type is incompatible 2020-05-22 11:54:19 +02:00
Fabio Manganiello d6b509e98a Replaced fullscreen auto logic with button toggle 2020-05-20 16:15:08 +02:00
Fabio Manganiello 82162c3c5e Apply fullscreen to document.documentElement instead of getting the body 2020-05-20 15:58:28 +02:00
Fabio Manganiello 7e0a91d839 Portable implementation of fullscreen JS methods 2020-05-20 15:47:17 +02:00
Fabio Manganiello e44dfbc169 Added fullscreen support in webpanel and dashboard 2020-05-20 15:29:49 +02:00
Fabio Manganiello d595688d55 Use the /total/country/<cc> endpoint instead of /total/dayone/country/<cc> 2020-05-17 16:52:37 +02:00
Fabio Manganiello 0c10825d2e Bump version: 0.12.6 → 0.12.7 2020-05-17 12:56:36 +02:00
Fabio Manganiello 51f99026ac The network object isn't always available on a ZWave event 2020-05-17 12:56:01 +02:00
Fabio Manganiello aa66b81b7b Fixed webhook event management 2020-05-09 01:47:12 +02:00
Fabio Manganiello 80d5a6ad19 Support for multiple torrent sessions 2020-05-07 23:34:56 +02:00
Fabio Manganiello 26f6feebb7 Implemented retry+sleep mechanism in Switchbot plugin in case of errors
This should prevent race conditions in case of command timeout+quick
disconnection and retry that can result in race conditions and double
free corruptions.
2020-05-06 00:25:19 +02:00
Fabio Manganiello 99fee9ce20 Parse countries from the official country list 2020-05-04 13:15:17 +00:00
Fabio Manganiello 07299e49e7 Bump version: 0.12.5 → 0.12.6 2020-05-03 18:10:25 +02:00
Fabio Manganiello d0ccd65214 Added Samsung smart TV web plugin 2020-05-03 17:21:16 +02:00
Fabio Manganiello 2f57ccf412 Added Samsung smart TV plugin 2020-05-03 00:57:13 +02:00
Fabio Manganiello 1cf93199d0 Adaptive dashboard widget height 2020-05-01 15:03:13 +02:00
Fabio Manganiello 1d24c878e6 Use both country and country_code on the event 2020-05-01 00:03:55 +02:00
Fabio Manganiello a387b84623 Don't swallow the exception if something goes wrong in a Python hook 2020-04-30 23:55:28 +02:00
Fabio Manganiello 9d0f43707a Support for list of countries 2020-04-30 22:45:04 +02:00
Fabio Manganiello 15c9feee9c Added missing docs 2020-04-30 01:15:19 +02:00
Fabio Manganiello 77e302cd4b Using session.merge instead of session.add to handle insert/update logic 2020-04-30 00:59:33 +02:00
Fabio Manganiello 3bb4c4434c Added Covid-19 country stats plugin and backend/monitor 2020-04-30 00:44:34 +02:00
Fabio Manganiello 3c209a800b New popcorn time API URLs 2020-04-28 13:49:31 +02:00
Fabio Manganiello 42d29ca1f6 LINT fixes 2020-04-23 18:33:57 +02:00
Fabio Manganiello d067553a3a Removed typoed package from .travis.requirements 2020-04-23 00:01:37 +00:00
Fabio Manganiello 8440320031 Don't swallow the stack trace in backend.http.request if a request fails 2020-04-22 23:46:05 +00:00
Fabio Manganiello 01ce9284a1 Bump version: 0.12.4 → 0.12.5 2020-04-12 22:56:33 +02:00
Fabio Manganiello f7d644c32d get_procedures() can now return Python function objects as well.
This means that the JSON encoder must act accordingly and parse
the function object into an encodable string.
2020-04-12 22:56:12 +02:00
Fabio Manganiello 124269776d Support for procedure imports from scripts base module 2020-04-10 20:59:32 +02:00
Fabio Manganiello 25ea0ea77c Included scripts_dir parent dir on sys.path so scripts can import members through the "scripts" package 2020-04-10 00:40:46 +02:00
Fabio Manganiello 0cd28f7499 If the response contains errors in run() then raise a RuntimeError, otherwise return the output instead of the Response object 2020-04-10 00:06:36 +02:00
Fabio Manganiello 7b79e4b669 Support for multiple positional arguments on utils.run() 2020-04-09 23:50:08 +02:00
Fabio Manganiello ca718d0748 Bump version: 0.12.3 → 0.12.4 2020-04-09 00:15:08 +02:00
Fabio Manganiello d46385687f Support for event filter on functional hook 2020-04-09 00:09:36 +02:00
Fabio Manganiello 0dae03551f Implemented interface for custom Python scripts, procedures and hooks [closes #131] 2020-04-08 23:22:54 +02:00
Fabio Manganiello 3e56666ba3 Added Reddit channel to README 2020-03-31 23:04:47 +02:00
Fabio Manganiello b490344632 Fixed missing static_folder issue on settings page and JS document race condition 2020-03-29 13:47:22 +02:00
Fabio Manganiello 13c25f94d5 Better fix for the calendar widget font size 2020-03-24 17:23:48 +01:00
Fabio Manganiello 9e32f1fb42 Tweaked font-size for upcoming event and other events in calendar widget 2020-03-24 17:14:13 +01:00
Fabio Manganiello a388e8dd83 Reduced font-size for calendar events to prevent overflow on smaller screens 2020-03-24 17:06:14 +01:00
Fabio Manganiello 03968928e7 Don't do QRcode plugin base imports, or the web app may fail if the dependencies are not installed 2020-03-24 10:29:22 +01:00
Fabio Manganiello 7ce5efaf2e Removed numpy and PIL top-level imports that could break the HTTP server if not installed on the system 2020-03-24 10:25:25 +01:00
Fabio Manganiello 4ece49bfe7 Added missing string format parameter 2020-03-24 09:11:07 +01:00
Fabio Manganiello 83a3f127cc Added HTTP client environment variables to .gitignore 2020-03-24 00:18:04 +01:00
Fabio Manganiello 7af8fb581b A more robust logic to check whether the first dimension of the input tensor is None 2020-03-23 23:54:18 +01:00
Fabio Manganiello 30a5f7b297 Fixed docs typo 2020-03-23 01:25:35 +01:00
Fabio Manganiello 41ccf3e5dc Bump version: 0.12.2 → 0.12.3 2020-03-23 01:19:49 +01:00
Fabio Manganiello 0f099158cc Bump version: 0.12.1 → 0.12.2 2020-03-23 01:15:54 +01:00
Fabio Manganiello 375a8376dc Don't use Config.get on __init__, or docs build will fail because of missing config.yaml 2020-03-23 01:14:44 +01:00
Fabio Manganiello f4dcf688f0 Set default values for metrics for regression and networks 2020-03-23 01:10:59 +01:00
Fabio Manganiello 50e372be36 Implemented extensive support for neural networks, images and directories [closes #121] 2020-03-23 01:00:25 +01:00
Fabio Manganiello 1f1fefca9d Tensorflow plugin implementation WIP [#121]
TODO: Extend neural network implementation to work
also with e.g. input from images, sounds or binary
2020-03-21 19:50:59 +01:00
Fabio Manganiello d938017bf8 Added support for extra mplayer arguments for TTS plugins 2020-03-16 18:40:17 +01:00
Fabio Manganiello f2b3000922 Handle numpy types in the JSON message encoder 2020-03-14 18:35:45 +01:00
Fabio Manganiello e7084b5d6f Added CSV plugin 2020-03-13 01:29:43 +01:00
Fabio Manganiello a130edb74f Made QR-code scan work also on picamera 2020-03-11 01:06:07 +01:00
Fabio Manganiello 2992d5f726 List of dependencies for qrcode plugin should also include numpy 2020-03-10 22:50:33 +01:00
Fabio Manganiello 141275ecdf Support for scanning QR-codes and barcodes through a camera plugin 2020-03-10 22:35:50 +01:00
Fabio Manganiello c9db887505 Added QR code/barcode integration [closes #119] 2020-03-10 00:07:21 +01:00
Fabio Manganiello c26d456109 Added Linode integration [closes #116] 2020-03-09 21:34:06 +01:00
Fabio Manganiello 096f84c865 Added OTP integration [closes #118] 2020-03-09 01:11:23 +01:00
Fabio Manganiello fc7982378a The bluetooth BLE plugin must also implement get_measurement to work with the scanner backend 2020-03-08 23:50:23 +01:00
Fabio Manganiello 59e3f81202 Added bluetooth scanner backends [closes #112] 2020-03-08 23:37:57 +01:00
Fabio Manganiello 535b2ec083 Changed mpd filter to dict on the frontend as well 2020-03-08 13:07:35 +01:00
Fabio Manganiello 42c5bbe0e4 Fixed LINT warnings and changed MPD filter format (from list to dict) 2020-03-08 13:04:00 +01:00
Fabio Manganiello ed02505dce Bump version: 0.12.0 → 0.12.1 2020-03-07 20:37:41 +01:00
Fabio Manganiello 642d5117a1 Added note about the license for PicoVoice Cheetah 2020-03-07 20:28:42 +01:00
Fabio Manganiello 46c20e9327 Added missing docs 2020-03-07 20:22:40 +01:00
Fabio Manganiello ce0f3227ec Implemented PicoVoice speech-to-text integration [closes #130] 2020-03-07 20:21:32 +01:00
Fabio Manganiello a5c08ed3e4 Added PicoVoice plugin with support for hotwords [see #130] 2020-03-07 02:00:35 +01:00
Fabio Manganiello e04c6fb921 Extracted common logic for speech-to-text integrations into abstract STT plugin 2020-03-06 23:11:19 +01:00
Fabio Manganiello 7ed847b646 Removed __future__ annotations (it breaks readthedocs build) 2020-03-06 00:53:24 +01:00
Fabio Manganiello 1533f7ee69 Added wave to mocks list in readthedocs conf.py 2020-03-06 00:51:55 +01:00
Fabio Manganiello b0339754b2 Implemented Mozilla DeepSpeech speech-to-text integration [closes #126] 2020-03-06 00:38:24 +01:00
Fabio Manganiello fc949ed9f1 Skip base Response type 2020-03-05 23:19:26 +01:00
Fabio Manganiello 27f847eac6 Support for is_muted/toggle_muted on Google assistant 2020-03-05 18:13:44 +01:00
Fabio Manganiello 124d2e356d Support for mic muted/unmuted event in Google assistant 2020-03-05 18:03:05 +01:00
Fabio Manganiello e66c02f3de Added documentation for response objects as well 2020-03-05 17:41:26 +01:00
Fabio Manganiello 5504048c22 Don't iterate on data if data is None 2020-02-26 11:33:50 +01:00
Fabio Manganiello 6e93c03438 Set success=True when we're able to retrieve data from the sensor 2020-02-26 11:27:34 +01:00
Fabio Manganiello cb0dd900ab Don't overwrite the original byte read from serial 2020-02-26 11:22:52 +01:00
Fabio Manganiello a9cb834499 Be more robust in case we receive non-Unicode characters on the serial port 2020-02-26 11:19:59 +01:00
Fabio Manganiello 52a13f0511 Implemented retry mechanism in sensor backend 2020-02-26 11:12:46 +01:00
Fabio Manganiello 76800e00b1 Use the right handlers for Zigbee network online/offline events 2020-02-25 18:38:44 +01:00
Fabio Manganiello f74c44c7fb There can be many Zigbee property set events; don't trigger a full refresh on all of them and only update the impacted devices instead 2020-02-25 18:13:11 +01:00
Fabio Manganiello 87a51b391c Support for custom TTS engine for rendering assistant response (see #86) 2020-02-24 20:23:22 +01:00
Fabio Manganiello 40a29a8214 fire_event could also be called by an external web server or service with no access to the bus. Therefore don't fail hard if the bus is not available 2020-02-24 17:17:36 +01:00
Fabio Manganiello 6e60edf2e1 Added missing docs 2020-02-23 23:36:22 +01:00
Fabio Manganiello ce66e0c855 Bump version: 0.11.5 → 0.12.0 2020-02-23 23:33:32 +01:00
Fabio Manganiello fb17aafe53 Support for custom audio volume for alarms 2020-02-23 23:09:40 +01:00
Fabio Manganiello 2d3c61173d Added Zigbee web panel (closes #123) 2020-02-23 22:54:50 +01:00
Fabio Manganiello 0643b7fade Support for intervals in seconds on alarm add/set 2020-02-22 16:18:56 +01:00
Fabio Manganiello f8f3d2e310 Show default node number instead of empty string if name is not set 2020-02-22 01:10:36 +01:00
Fabio Manganiello 424077fdbc Completed ZWave web panel (see #123) 2020-02-22 01:00:52 +01:00
Fabio Manganiello a9dbda455f Support for default media player volume 2020-02-21 18:40:46 +01:00
Fabio Manganiello 70fe2459de _event_callbacks is a protected attribute of mpv.MPV 2020-02-21 18:29:40 +01:00
Fabio Manganiello 9ee81d7999 Removed header from documentation - pydoc can't handle headers in methods 2020-02-21 18:20:38 +01:00
Fabio Manganiello 98727c4f31 Added support for values in Z-Wave web panel (see #123) 2020-02-20 02:34:35 +01:00
Fabio Manganiello a0ceb560b4 Implemented alarm/timer plugin (closes #111) 2020-02-17 19:37:22 +01:00
Fabio Manganiello 8248b5353f Added status action to MediaPlugin interface 2020-02-17 18:12:40 +01:00
Fabio Manganiello 9b2e4f9d0c Added count parameter to the ping backend 2020-02-17 13:39:40 +01:00
Fabio Manganiello 30e51ee299 Network initialization for the Pushbullet backend should be done in the run method.
Network errors in the constructor cause the whole application to fail.
Better to do the initialization in the run method with retries.
2020-02-17 00:46:33 +01:00
Fabio Manganiello b83f6539a5 Removed old config example 2020-02-16 01:52:31 +01:00
Fabio Manganiello fcef7af6a4 Adding Z-Wave web panel (#123) [WIP] 2020-02-10 00:39:32 +01:00
Fabio Manganiello c5adc141ea More robust mechanism for websocket message send section locking 2020-02-06 19:30:40 +01:00
Fabio Manganiello ca030c9b25 Websocket notifications delivery should be thread-safe.
If multiple threads process events and notify the websocket
clients at the same time then we may end up with inconsistent
messages delivered on the websocket (and websockets is not
designed to handle such cases). Protecting the send call with
a per-socket lock makes sure that we only write one message
at the time for a certain client.
2020-02-06 01:04:36 +01:00
Fabio Manganiello a6526a2a2d Added Z-Wave docs 2020-02-05 23:24:20 +01:00
Fabio Manganiello 02246a48ae Added Z-Wave integration (closes #76) 2020-02-05 22:26:52 +01:00
Fabio Manganiello 8d203723da Added -a option for platydock to attach to the instance after booting it up 2020-02-03 16:57:40 +01:00
Fabio Manganiello 96bdefdaf3 Use Debian Buster image instead of Alpine for docker images 2020-02-03 16:50:51 +01:00
Fabio Manganiello 20feedaf07 Use --no-cache-dir for pip installations in Dockerfile 2020-02-03 15:06:16 +00:00
Fabio Manganiello 8caa170676 Don't consider the trailing / in pre-select tab mode 2020-02-01 00:17:11 +01:00
Fabio Manganiello b02b30656c Using /#[plugin.name] as a URL hint for selecting a tab on load.
Closes #83
2020-01-31 20:29:47 +01:00
Fabio Manganiello eff21c0720 Added /plugin/<plugin_name> route for single plugin view (see #83) 2020-01-23 00:27:36 +01:00
Fabio Manganiello 8255f9af28 Added zigbee2mqtt integration (see #76) 2020-01-22 18:34:28 +01:00
Fabio Manganiello 976c4c4854 Fixed Github pip links 2020-01-20 22:48:07 +01:00
Fabio Manganiello 410fad3e18 Bump version: 0.11.4 → 0.11.5 2020-01-20 22:38:36 +01:00
Fabio Manganiello f3b50d0de1 Using the Github link for the flag-icon.css instead of cloning the whole submodule 2020-01-20 22:38:13 +01:00
Fabio Manganiello 6ad997a239 Bump version: 0.11.3 → 0.11.4 2020-01-20 22:28:00 +01:00
Fabio Manganiello f91fd00067 Removed old comment note for esp.file_download 2020-01-20 15:41:24 +01:00
Fabio Manganiello b484fcf9ed - New implementation of esp.file_get that also works with binary files
- New communication protocol for downloaded chunks based on queues
  instead of events.
2020-01-20 15:39:23 +01:00
Fabio Manganiello 4b56431e2a Added proper support for ESP file upload/download (closes #110) 2020-01-20 11:47:10 +01:00
Fabio Manganiello b7d9917d1d Cleaned up unused variables 2020-01-20 08:54:59 +01:00
Fabio Manganiello f38121d176 Always pause/resume speech detection on backend level 2020-01-19 16:32:41 +01:00
Fabio Manganiello 6c797b0ad9 Implemented support for assistant pause/resume conversation (closes #109) 2020-01-19 16:21:29 +01:00
Fabio Manganiello 89ae86492f If the latest build is still running then we should wait and not process events 2020-01-19 15:43:39 +01:00
Fabio Manganiello db862d1d96 Datetime conversion should also support cases where the input is a float timestamp represented as a string 2020-01-19 15:39:57 +01:00
Fabio Manganiello 42eabcf661 More robust ISO date to timestamp conversion 2020-01-19 15:37:55 +01:00
Fabio Manganiello bbb52ba191 Always convert datetime to UNIX timestamp in Travis-Ci backend.
Python can't perform comparisons between offset-aware and
offset-naive dateime objects. Instead, convert them to UTC
timestamps before comparisons.
2020-01-19 15:35:13 +01:00
Fabio Manganiello c44de5e2d7 Grouped common CSS and JS includes into separate templates 2020-01-19 14:47:51 +01:00
Fabio Manganiello 5ae57e3aaf Added action to retrieve temperature and pressure from a DHT11/DHT22 sensor on ESP plugin 2020-01-18 20:15:31 +01:00
Fabio Manganiello 4e45c1d0bc Removed font-awesome full submodule clone. Use the CDN-provided all.css file instead.
It won't work if the webapp runs on a device not connected to the internet,
but it saves a lot of installation space.
2020-01-18 19:59:02 +01:00
Fabio Manganiello 2598e2fb30 Replace the \r\n sequence with \n in the processed response 2020-01-18 18:26:23 +01:00
Fabio Manganiello 2f63a861cb Fixed ESP plugin extra args formatting 2020-01-18 18:11:35 +01:00
Fabio Manganiello c3c88b23fe Added ESP8266/ESP32 integration (closes #108) 2020-01-17 21:16:14 +01:00
Fabio Manganiello 02607bae97 Dumb Python won't convert perfectly finely formatted ISO dates unless I do some manual conversion 2020-01-12 14:05:58 +01:00
Fabio Manganiello b920927dab Added Travis-Ci integration (closes #104) 2020-01-12 13:53:46 +01:00
Fabio Manganiello f5b010c15c Added nmap integration (closes #99) 2020-01-11 18:51:54 +01:00
Fabio Manganiello 1e342cc8a5 New interface for implementing backends.
Backends that simply poll for changes and wait some time
between checks can just implement a `loop()` method and,
optionally, `__enter__` and `__exit__` methods, so they
can perform initialization/cleanup logic within a context
manager.
2020-01-11 18:13:25 +01:00
Fabio Manganiello a7ca779870 Argument of int() can't be nullable 2020-01-11 16:24:35 +01:00
Fabio Manganiello 3b2ca4d70c Added Foursquare backend 2020-01-11 16:11:35 +01:00
Fabio Manganiello 3daf39e3e0 Stop polluting Pushbullet messages with StopEvent JSON whenever the backend stops. 2020-01-11 12:31:32 +01:00
Fabio Manganiello b0a5f1e272 Added Foursquare integration - closes #94 2020-01-10 22:51:07 +01:00
Fabio Manganiello ddbe76646b Throw an assert error (no reload/retry mechanism) instead of a runtime error when a method is called outside of the registered plugin actions 2020-01-10 00:07:40 +01:00
Fabio Manganiello 2541cab0f7 _static directory in docs is no longer used 2020-01-09 23:44:52 +01:00
Fabio Manganiello 4c3140c9b5 Fixed docs 2020-01-09 23:40:59 +01:00
Fabio Manganiello f2de1015a8 Fixed doc URL 2020-01-09 22:24:15 +01:00
Fabio Manganiello 4e4cf06b62 Added missing docs 2020-01-09 22:18:18 +01:00
Fabio Manganiello e709908d7e Added Google Drive plugin - closes #91 2020-01-09 22:07:03 +01:00
Fabio Manganiello 40e65d882f Support for while/break/continue/return statemnts - closes #107 2020-01-09 10:28:02 +01:00
Fabio Manganiello 35cefcc9f5 Improved consistency and robustness of sensors backend 2020-01-08 22:58:24 +01:00
Fabio Manganiello 9d592fe370 Added battery sensor backend 2020-01-08 14:55:58 +01:00
Fabio Manganiello 6738ff832a get_data/get_measurement/close should be implemented in a base SensorPlugin
class, not specifically in GpioSensorPlugin
2020-01-08 00:20:00 +01:00
Fabio Manganiello aa6bf5379a Added process management actions 2020-01-08 00:07:15 +01:00
Fabio Manganiello c53dfab246 Added pid_exists action 2020-01-07 23:03:30 +01:00
Fabio Manganiello 8fe34d541b Added system monitor integration - closes #98 2020-01-07 22:44:59 +01:00
Fabio Manganiello 3e2a9c0401 Skip torrent status responses with no url. 2020-01-07 09:59:45 +01:00
Fabio Manganiello 9134a231b3 success=true will always be in the response: deal with it 2020-01-07 09:46:26 +01:00
Fabio Manganiello 3271759fba Added Pi-hole integration - closes #100 2020-01-06 19:22:04 +01:00
Fabio Manganiello e880f00498 Added Graphite integration - closes #96 2020-01-06 15:24:52 +01:00
Fabio Manganiello d73df1454e Added TCP and UDP plugins - closes #106 2020-01-05 20:52:42 +01:00
Fabio Manganiello c3024fba2d Commented pycups in requirements.txt 2020-01-05 19:46:11 +01:00
Fabio Manganiello bcd05ecf4a Added CUPS plugin - closes #93 2020-01-05 19:25:20 +01:00
Fabio Manganiello a9fdbe7812 Fixed code-block format 2020-01-05 13:11:44 +01:00
Fabio Manganiello 084b5ba807 Stop also board iterators on `close` 2020-01-05 13:02:41 +01:00
Fabio Manganiello f0a77c12a4 Added Arduino docs 2020-01-05 00:50:58 +01:00
Fabio Manganiello d8a7c9c6e0 Added Arduino over Firmata integration - closes #92 2020-01-05 00:46:46 +01:00
Fabio Manganiello 42686f229e Added Trello backend docs 2020-01-03 16:58:45 +01:00
2241 changed files with 165426 additions and 19114 deletions

6
.gitignore vendored
View File

@ -3,7 +3,7 @@
*.pyc
__pycache__
build/
dist/
/dist/
*.egg-info/
package.sh
.pypirc
@ -15,3 +15,7 @@ platypush/backend/http/static/css/*/.sass-cache/
.vscode
platypush/backend/http/static/js/lib/vue.js
platypush/notebooks
platypush/requests
/http-client.env.json
/platypush/backend/http/static/css/dist
/tests/etc/dashboards

9
.gitmodules vendored
View File

@ -1,12 +1,3 @@
[submodule "platypush/backend/http/static/font-awesome"]
path = platypush/backend/http/static/font-awesome
url = https://github.com/FortAwesome/Font-Awesome
[submodule "docs/wiki"]
path = docs/wiki
url = https://github.com/BlackLight/platypush.wiki.git
[submodule "platypush/backend/http/static/flag-icons"]
path = platypush/backend/http/static/flag-icons
url = https://github.com/BlackLight/flag-icon-css.git
[submodule "platypush/plugins/gpio/sensor/ir/mlx90640/lib"]
path = platypush/plugins/camera/ir/mlx90640/lib
url = https://github.com/pimoroni/mlx90640-library

View File

@ -1,7 +0,0 @@
build:
image: latest
python:
version: 3.6
setup_py_install: true

View File

@ -1,10 +0,0 @@
pyyaml
requires
requests
flask
redis
python-dateutil
websockets
bcrypt
sqlalchemy
croniter

View File

@ -1,22 +0,0 @@
language: python
dist: xenial
python:
- "3.7"
install: "pip install -r .travis.requirements"
script: ./run_tests.sh
notifications:
email:
recipients:
- blacklight86@gmail.com
on_success: change
on_failure: change
services:
- redis-server
git:
submodules: false

177
CHANGELOG.md Normal file
View File

@ -0,0 +1,177 @@
# Changelog
All notable changes to this project will be documented in this file.
Given the high speed of development in the first phase, changes are being reported only starting from v0.20.2.
## [Unreleased]
- Added `music.spotify.connect` backend to emulate a Spotify Connect receiver through Platypush.
## [0.21.1] - 2021-06-22
### Added
- Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of
directly accessing the device's Bluetooth interface.
- Added `marshmallow` dependency - it will be used from now own to dump and document schemas
and responses instead of the currently mixed approach with `Response` objects and plain
dictionaries and lists.
- Support for custom MQTT timeout on all the `zwavejs2mqtt` calls.
- Added generic joystick backend `backend.joystick.jstest` which uses `jstest` from the
standard `joystick` system package to read the state of joysticks not compatible with
`python-inputs`.
- Added PWM PCA9685 plugin.
- Added Linux native joystick plugin, ``backend.joystick.linux``, for the cases where
``python-inputs`` doesn't work and ``jstest`` is too slow.
### Changed
- `switch.switchbot` plugin renamed to `switchbot.bluetooth` plugin, while the new plugin
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
### Added
- Support for custom PopcornTime API mirror/base URL.
- Full support for TV series search.
### Fixed
- Fixed torrent search (now using a different PopcornTime API mirror).
- Migrated SASS engine from `node-sass` (currently deprecated and broken on Node 16) to `sass`.
- Fixed alignment of Z-Wave UI header on Chrome/Webkit.
## [0.20.10] - 2021-04-28
### Fixed
- Fixed zwave/zwavejs2mqtt interoperability.
## [0.20.9] - 2021-04-12
### Added
- Added zwavejs2mqtt integration (see [#186](https://git.platypush.tech/platypush/platypush/-/issues/186).
### Fixed
- Major LINT fixes.
### Removed
- Removed unmaintained integrations: TorrentCast and Booking.com
## [0.20.8] - 2021-04-04
### Added
- 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 controls on `music.mpd` dashboard widget.
### Fixed
- Fixed zigbee2mqtt backend error in case of messages with empty payload (see [#184](https://git.platypush.tech/platypush/platypush/-/issues/184)).
- Fixed compatibility with all versions of websocket-client - versions >= 0.58.0 pass a `WebSocketApp` object as a first
argument to the callbacks, as well as versions < 0.54.0 do, but the versions in between don't pass this argument.
## [0.20.7] - 2021-03-26
### Fixed
- Fixed race condition on `media.vlc.stop` when clearing the VLC instance.
- Fixed dashboard widgets custom classes being propagated both to the container and to the widget content [see #179]
- Fixed compatibility with SQLAlchemy >= 1.4.
## [0.20.6] - 2021-03-16
### Added
- Added `log.http` backend to monitor changes to HTTP log files
(see [#167](https://git.platypush.tech/platypush/platypush/-/issues/167)).
- Added `file.monitor` backend, which replaces the `inotify` backend
(see [#172](https://git.platypush.tech/platypush/platypush/-/issues/172)).
### Removed
- Removed legacy `pusher` script and `local` backend.
### Fixed
- Fixed support for Z-Wave switches.
- Fixed possible race condition on VLC stop.
## [0.20.5] - 2021-03-12
### Added
- Added support for a static list of devices to actively scan to the `bluetooth.scanner` backend
(see [#174](https://git.platypush.tech/platypush/platypush/-/issues/174)).
- Added `weather.openweathermap` plugin and backend, which replaces `weather.darksky`, since the
Darksky API will be completely shut down by the end of 2021.
### Fixed
- Cron expressions should adhere to the UNIX cronjob standard and use the machine local time,
not UTC, as a reference (closes [#173](https://git.platypush.tech/platypush/platypush/-/issues/173)).
- Better management of Z-Wave values types from the UI.
- Disable logging for `ZwaveValueEvent` events - they tend to be very verbose and
can impact the performance on slower devices. They will still be published to the
websocket clients though, so you can still debug Z-Wave values issues from the browser
developer console (enable debug traces).
- Added suffix to the `zigbee.mqtt` backend default `client_id` to prevent clashes with
the default `mqtt` backend `client_id`.
## [0.20.4] - 2021-03-08
### Added
- Added SmartThings integration.
- Support for custom Redis message queue name over the `--redis-queue` argument.
### Fixed
- Refactored tests to use `pytest` instead of `unittest`.
- Some major bug fixes on procedures and hooks context evaluation.
## [0.20.3] - 2021-02-28
### Fixed
- Several bug fixes on the VLC plugin, including proper management of stop/end-of-stream, volume set and missing integration requirements in `requirements.txt` and `setup.py`.
## [0.20.2] - 2021-02-27
### Fixed
- More stable ZeroConf backends registration logic in case of partial or missing results.
- Improved and refactored integration tests.
### Added
- Support for passing context variables (${}) from YAML procedures/hooks/crons to Python procedure/hooks/crons.
- New integration test for testing procedures.

37
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,37 @@
Thanks for considering contributing your work to make Platypush a better product!
Contributions are more than welcome, and the follow the standard Gitlab procedure:
- [Fork the repo](https://git.platypush.tech/platypush/platypush).
- Prepare your changes.
- [Submit a merge request](https://git.platypush.tech/platypush/platypush/-/merge_requests).
Guidelines:
- The code should ideally have no LINT warnings/issues.
- Project conventions:
- 4 spaces to indent.
- RST format for classes and methods documentation
- Run `python generate_missing_docs.py` if you are adding new plugins/backends to automatically
generate the doc templates. Make sure that you don't accidentally remove lines elements from
the docs because of missing dependencies on the machine you use to generate the docs.
- Naming conventions: plugin classes are named `<Module>Plugin` and backend classes are
named `<Module>Backend`, with `<Module>` being the (camel-case) representation of the
Python module of the plugin without the prefix - for example, the plugin under
`platypush.plugins.light.hue` must be named `LightHuePlugin`.
- If possible, [add a test](https://git.platypush.tech/platypush/platypush/-/tree/master/tests)
for the new functionality. If you have built a new functionality that works with some specific
device or service then it's not required to write a test that mocks the whole service, but if
you are changing some of the core entities (e.g. requests, events, procedures, hooks, crons
or the bus) then make sure to add tests and not to break the existing tests.
- 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 [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
an `extras_require` entry
- In [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) -
if the feature is optional then leave it commented and add a one-line comment to explain which
plugin or backend requires it.

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017, 2018 Fabio Manganiello
Copyright (c) 2017, 2020 Fabio Manganiello
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,3 +1,2 @@
recursive-include platypush/backend/http/static *
recursive-include platypush/backend/http/templates *
recursive-include platypush/backend/http/webapp/dist *
include platypush/plugins/http/webpage/mercury-parser.js

538
README.md
View File

@ -1,67 +1,509 @@
Platypush
=========
[![Build Status](https://travis-ci.org/BlackLight/platypush.svg?branch=master)](https://travis-ci.org/BlackLight/platypush)
[![Documentation Status](https://readthedocs.org/projects/platypush/badge/?version=latest)](https://platypush.readthedocs.io/en/latest/?badge=latest)
[![Build Status](https://ci.platypush.tech/status.svg)](https://ci.platypush.tech/latest.log)
[![Documentation Status](https://ci.platypush.tech/docs/status.svg)](https://ci.platypush.tech/docs/latest.log)
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
Advised read: [**Getting started with Platypush**](https://medium.com/@automationguru/automate-your-house-your-life-and-everything-else-around-with-platypush-dba1cd13e3f6) (Medium article).
- Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush).
Imagine Platypush as some kind of [IFTTT](https://ifttt.com) on steroids - or [Tasker](https://tasker.joaoapps.com/), or [Microsoft Flow](https://flow.microsoft.com), or [PushBullet](https://pushbullet.com) on steroids.
Platypush aims to turn any device in a smart hub that can control things, interact with cloud services and send messages to other devices. It's a general-purpose lightweight platform to process any request and run any logic triggered by custom events.
- 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.
Imagine the ability of running any task you like, or automate any routine you like, on any of your devices. And the flexibility of executing actions through a cloud service, with the power of running them from your laptop, Raspberry Pi, smart home device or smartphone.
- The [wiki](https://git.platypush.tech/platypush/platypush/-/wikis/home) also contains many resources on getting started.
- Extensive documentation for all the available integrations and messages [is available](https://docs.platypush.tech/).
- 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.
---
Platypush is a general-purpose extensible platform for automation and integration across multiple services and devices.
It enables users to create their own self-hosted pieces of automation based on events (*if this happens then do that*)
and it provides a comprehensive and customizable user interface that collects everything you need to visualize and
control under one roof.
It takes some concepts from [IFTTT](https://ifttt.com), [Tasker](https://tasker.joaoapps.com/),
[Microsoft Flow](https://flow.microsoft.com), [PushBullet](https://pushbullet.com) and
[Home Assistant](https://www.home-assistant.io/) to provide an environment where the user can easily connect things
together.
Its ideal home is a single-board computer like a RaspberryPi that you can configure to orchestrate any home automation
and cloud automation in your own living room or garage, but it can easily run on any device that can run a Python
interpreter, and the bar for the hardware requirements is very low as well - I use it to run pieces of automation on
devices as powerful as a RaspberryPi Zero or an old Nokia N900 with Linux.
You can use Platypush to do things like:
- Control your smart home lights
- Control your favourite music player
- Interact with your voice assistant
- Get events from your Google or Facebook calendars
- Read data from your sensors and trigger custom events whenever they go above or below some custom thresholds
- Control the motors of your robot
- Send automated emails
- Synchronize the clipboards on your devices
- Control your smart switches
- Implement custom text-to-speech commands
- Build any kind of interaction with your Android device using Tasker
- Play local videos, YouTube videos and torrent links
- Get weather forecast for your location
- [Control your smart home lights](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush)
- [Control your music and synchronize it to multiple devices](https://blog.platypush.tech/article/Build-your-open-source-multi-room-and-multi-provider-sound-server-with-Platypush-Mopidy-and-Snapcast)
- [Create custom and privacy-secure voice assistants that run custom hooks on your phrases](https://blog.platypush.tech/article/Build-custom-voice-assistants)
- Build integrations between [sensors](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html),
[cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
[microphones](https://docs.platypush.tech/en/latest/platypush/plugins/sound.html) and
[machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html) to create smart
pieces of automation for e.g.
[people detection](https://blog.platypush.tech/article/Detect-people-with-a-RaspberryPi-a-thermal-camera-Platypush-and-a-pinch-of-machine-learning)
or [sound detection](https://blog.platypush.tech/article/Create-your-smart-baby-monitor-with-Platypush-and-Tensorflow)
- [Get events from your Google or Facebook calendars](https://docs.platypush.tech/en/latest/platypush/plugins/calendar.html)
- [Read data from your sensors and trigger custom events whenever they go above or below some custom thresholds](https://blog.platypush.tech/article/How-to-build-your-personal-infrastructure-for-data-collection-and-visualization)
- [Control and automate a self-built robot](https://docs.platypush.tech/en/latest/platypush/plugins/gpio.zeroborg.html)
- [Deliver automated newsletters from custom RSS digests](https://blog.platypush.tech/article/Deliver-customized-newsletters-from-RSS-feeds-with-Platypush)
- [Synchronize the clipboards on your devices](https://docs.platypush.tech/en/latest/platypush/plugins/clipboard.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)
- [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
- [Get weather forecast events for your location and build automation routines on them](https://docs.platypush.tech/en/latest/platypush/plugins/weather.darksky.html)
- [Create a custom single hub for Zigbee and Z-Wave smart devices](https://blog.platypush.tech/article/Transform-a-RaspberryPi-into-a-universal-Zigbee-and-Z-Wave-bridge)
- Build your own web dashboard with calendar, weather, news and music controls (basically, anything that has a Platypush web widget)
- ...and much more (basically, anything that comes with a [Platypush plugin](https://platypush.readthedocs.io/en/latest/plugins.html))
- ...and much more (basically, anything that comes with a [Platypush plugin](https://docs.platypush.tech/en/latest/plugins.html))
Imagine the ability of executing all the actions above through messages delivered through:
## Architecture
- A web interface
- A JSON-RPC API
- Raw TCP messages
- Web sockets
- [PushBullet](https://pushbullet.com)
- [Kafka](https://kafka.apache.org)
- [Redis](https://redis.io)
- [MQTT](https://mqtt.org)
- ...amd much more (basically, anything that comes with a [Platypush backend](https://platypush.readthedocs.io/en/latest/backends.html))
The architecture of Platypush consists of a few simple pieces, orchestrated by a configuration file stored by default
under [`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml):
Imagine the ability of building custom event hooks to automatically trigger any actions:
### [Plugins](https://docs.platypush.tech/en/latest/plugins.html)
- When your voice assistant recognizes some text
- When you start playing a new song
- When a new event is added to your calendar
- When a new article is published on your favourite feed
- When the weather conditions change
- When your press a [Flic button](https://flic.io) with a certain pattern
- When you receive a new push on your Pushbullet account
- When your GPS signal enters a certain area
- Whenever a new MIDI event is received (yes, you heard well :) )
- Whenever a sensor sends new data
- At a specific date or time
- ...and so on (basically, anything can send events that can be used to build hooks)
They are integrations that do things - like
[modify files](https://docs.platypush.tech/en/latest/platypush/plugins/file.html),
[train and evaluate machine learning models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html),
[control cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
[read sensors](https://docs.platypush.tech/en/latest/platypush/plugins/gpio.sensor.dht.html),
[parse a web page](https://docs.platypush.tech/en/latest/platypush/plugins/http.webpage.html),
[control lights](https://docs.platypush.tech/en/latest/platypush/plugins/light.hue.html),
[send emails](https://docs.platypush.tech/en/latest/platypush/plugins/mail.smtp.html),
[control Chromecasts](https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html),
[run voice queries](https://docs.platypush.tech/en/latest/platypush/plugins/assistant.google.html),
[handle torrent transfers](https://docs.platypush.tech/en/latest/platypush/plugins/torrent.html) or
control [Zigbee](https://docs.platypush.tech/en/latest/platypush/plugins/zigbee.mqtt.html) or
[Z-Wave](https://docs.platypush.tech/en/latest/platypush/plugins/zwave.html) devices.
Imagine the ability of running the application, with lots of those bundled features, on any device that can comes with Python (_only compatible with version 3.5 and higher_). Platypush has been designed with performance in mind, it's been heavily tested on slower devices like Raspberry Pis, and it can run the web server features, multiple backends and plugins quite well even on a Raspberry Pi Zero - it's even been tested with some quite impressive performance on an older [Nokia N900](https://en.wikipedia.org/wiki/Nokia_N900), and of course you can run it on any laptop, desktop, server environment. It's been developed mainly with IoT in mind (and some of its features overlap with IoT frameworks like [Mozilla IoT](https://iot.mozilla.com) and [Android Things](https://developer.android.com/things/)), but nothing prevents you from automating any task on any device and environment.
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:
To get started:
```yaml
light.hue:
# Groups that will be controlled by default
groups:
- Living Room
- Hall
```
- [Wiki](https://github.com/BlackLight/platypush/wiki) for installation notes, quick start, examples and architecture reference
- [Read the docs](https://platypush.readthedocs.io/en/latest/) for a complete reference on the available plugins and backends
- [Medium articles](https://medium.com/tag/platypush/archive) that describe hands-on applications of platypush
### Actions
Plugins expose *actions*, that match one-on-one the plugin class methods denoted by `@action`, so it's very
straightforward to invoke plugin actions by just reading the plugin documentation. They can be invoked directly from
your own scripts or they can be sent to the platform through any supported channel as simple JSON messages:
```json
{
"type": "request",
"action": "light.hue.on",
"args": {
"lights": ["Entrance Bulb"]
}
}
```
### [Backends](https://docs.platypush.tech/en/latest/backends.html)
They are background services that either listen for messages on channels (like an
[HTTP backend](https://docs.platypush.tech/en/latest/platypush/backend/http.html), an
[MQTT instance](https://docs.platypush.tech/en/latest/platypush/backend/mqtt.html), a
[Kafka instance](https://docs.platypush.tech/en/latest/platypush/backend/kafka.html), a
[Websocket service](https://docs.platypush.tech/en/latest/platypush/backend/websocket.html),
[Pushbullet](https://docs.platypush.tech/en/latest/platypush/backend/pushbullet.html) etc.) or monitor a device or a
service for events (like a [sensor](https://docs.platypush.tech/en/latest/platypush/backend/sensor.html), a custom
[voice assistant](https://docs.platypush.tech/en/latest/platypush/backend/assistant.google.html), a bridge running on a
[Zigbee](https://docs.platypush.tech/en/latest/platypush/backend/zigbee.mqtt.html) or
[Z-Wave](https://docs.platypush.tech/en/latest/platypush/backend/zwave.html), an
[NFC card reader](https://docs.platypush.tech/en/latest/platypush/backend/nfc.html), a
[MIDI device](https://docs.platypush.tech/en/latest/platypush/backend/midi.html), a
[Telegram channel](https://docs.platypush.tech/en/latest/platypush/backend/chat.telegram.html), a
[Bluetooth scanner](https://docs.platypush.tech/en/latest/platypush/backend/bluetooth.scanner.ble.html) etc.).
If a backend supports the execution of requests (e.g. HTTP, MQTT, Kafka, Websocket and TCP) then you can send requests
to these services in JSON format. For example, in the case of the HTTP backend:
```shell
# Get a token
curl -XPOST -H 'Content-Type: application/json' -d '
{
"username": "$YOUR_USER",
"password": "$YOUR_PASSWORD"
}' http://host:8008/auth
# Execute a request
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
{
"type": "request",
"action": "tts.say",
"args": {
"text": "This is a test"
}
}' http://host:8008/execute
```
### [Events](https://docs.platypush.tech/en/latest/events.html)
When a certain event occurs (e.g. a JSON request is received, or a
[Bluetooth device is connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
or a
[Flic button is pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
or some
[speech is detected on the voice assistant service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
or an
[RSS feed has new items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
or a
[new email is received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
or a
[new track is played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
or an
[NFC tag is detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
or
[new sensor data is available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
or
[a value of a Zigbee device changes](https://docs.platypush.tech/en/latest/platypush/events/zigbee.mqtt.html#platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent),
etc.), the associated backend will trigger an [event](https://docs.platypush.tech/en/latest/events.html).
### Hooks
Event hooks are custom pieces of logic that will be run when a certain event is triggered. Hooks are the glue that
connects events to actions, exposing a paradigm similar to IFTTT (_if a certain event happens then run these actions_).
They can declared as:
- Sections of the [`config.yaml`](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/config.yaml).
Example:
```yaml
event.hook.SearchSongVoiceCommand:
if:
type: platypush.message.event.assistant.SpeechRecognizedEvent
phrase: "play ${title} by ${artist}"
then:
- action: music.mpd.clear
- action: music.mpd.search
args:
filter:
artist: ${artist}
title: ${title}
- if ${len(output)}:
- action: music.mpd.play
args:
resource: ${output[0]['file']}
```
- Stand-alone Python scripts stored under `~/.config/platypush/scripts` and will be dynamically imported at start time.
[Example](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/hook.py):
```python
from platypush.event.hook import hook
from platypush.utils import run
from platypush.message.event.assistant import SpeechRecognizedEvent
@hook(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None, **context):
results = run('music.mpd.search', filter={
'artist': artist,
'title': title,
})
if results:
run('music.mpd.play', results[0]['file'])
```
### Procedures
Procedures are pieces of custom logic that can be executed as atomic actions using `procedure.<name>` as an action name.
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` -
provided that the procedure is also imported in `~/.config/platypush/scripts/__init__.py` so it can be discovered by
the service.
YAML example for a procedure that can be executed when we arrive home and turns on the lights if the luminosity is lower
that a certain thresholds, says a welcome home message using the TTS engine and starts playing the music:
```yaml
procedure.at_home:
# Get luminosity data from a sensor - e.g. LTR559
- action: gpio.sensor.ltr559.get_data
# If it's lower than a certain threshold, turn on the lights
- if ${int(light or 0) < 110}:
- action: light.hue.on
# Say a welcome home message
- action: tts.google.say
args:
text: Welcome home
# Play the music
- action: music.mpd.play
```
Python example:
```python
# Content of ~/.config/platypush/scripts/home.py
from platypush.procedure import procedure
from platypush.utils import run
@procedure
def at_home(**context):
sensor_data = run('gpio.sensor.ltr559.get_data')
if sensor_data['light'] < 110:
run('light.hue.on')
run('tts.google.say', text='Welcome home')
run('music.mpd.play')
```
In either case, you can easily trigger the at-home procedure by sending an action request message to a backend - for
example, over the HTTP backend:
```shell
curl -XPOST -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" -d '
{
"type": "request",
"action": "procedure.at_home"
}' http://host:8008/execute
```
### Cronjobs
Cronjobs are pieces of logic that will be run at regular intervals, expressed in crontab-compatible syntax.
They can be defined either in the `config.yaml` or as Python scripts stored under `~/.config/platypush/scripts` as
functions labelled by the `@cron` decorator.
Note that seconds are also supported (unlike the standard crontab definition), but, for back-compatibility with the
standard crontab format, they are at the end of the cron expression, so the expression is actually in the format
`<minute> <hour> <day_of_month> <month> <day_of_week> <second>`.
YAML example for a cronjob that is executed every 30 seconds and checks if a Bluetooth device is nearby:
```yaml
cron.check_bt_device:
cron_expression: '* * * * * */30'
actions:
- action: bluetooth.lookup_name
args:
addr: XX:XX:XX:XX:XX:XX
- if ${name}:
- action: procedure.on_device_on
- else:
- action: procedure.on_device_off
```
Python example:
```python
# Content of ~/.config/platypush/scripts/bt_cron.py
from platypush.cron import cron
from platypush.utils import run
@cron('* * * * * */30')
def check_bt_device(**context):
name = run('bluetooth.lookup_name').get('name')
if name:
# on_device_on logic here
else:
# on_device_off logic here
```
### The web interface
If [`backend.http`](https://docs.platypush.tech/en/latest/platypush/backend/http.html) is enabled then a web interface
will be provided by default on `http://host:8008/`. Besides using the `/execute` endpoint for running requests, the
built-in web server also provides a full-featured interface that groups together the controls for most of the plugins -
e.g. sensors, switches, music controls and search, media library and torrent management, lights, Zigbee/Z-Wave devices
and so on. The UI is responsive and mobile-friendly.
The web service also provides means for the user to create
[custom dashboards](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/conf/dashboard.xml) that can
be used to show information from multiple sources on a large screen.
## Installation
### System installation
Platypush uses Redis to deliver and store requests and temporary messages:
```yaml
# Example for Debian-based distributions
[sudo] apt-get install redis-server
# Enable and start the service
[sudo] systemctl enable redis
[sudo] systemctl start redis
```
To install the core platform:
* The `pip` way:
```shell
[sudo] pip3 install platypush
```
* The sources way:
```shell
git clone https://git.platypush.tech/platypush/platypush.git
cd platypush
[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
extension:
#### Check their `extras` name in [`extras_require` under `setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72).
If you follow this route then you can install the extra dependencies in one of the following ways:
1. `pip` installation:
```shell
[sudo] pip3 install 'platypush[extra1,extra2,extra3]'
```
2. Sources installation:
```shell
cd $DIR_TO_PLATYPUSH
[sudo] pip3 install '.[extra1,extra2,extra3]'
```
#### Check the dependencies/installation instructions reported under the plugin/backend documentation.
If you follow this route then simply run the commands listed in the plugin/backend documentation to get the dependencies
installed.
#### Check/uncomment the associated lines in [`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt).
If you follow this route then uncomment the lines in
[`requirements.txt`](https://git.platypush.tech/platypush/platypush/-/blob/master/requirements.txt) associated to the
plugins/backends that you want to use and run:
```shell
[sudo] pip3 install -r requirements.txt
```
After installing the dependencies, create a configuration file under `~/.config/platypush/config.yaml` (the application
can load the configuration from another location through the `-c` option) containing the configuration of the backend
and plugins that you want to use, and add any hooks and procedures for your use case.
You can then start the service by simply running:
```shell
platypush
```
It's advised to run it as a systemd service though - simply copy the provided
[`.service` file](https://git.platypush.tech/platypush/platypush/-/blob/master/examples/systemd/platypush.service) to
`~/.config/systemd/user`, check if the path of `platypush` matches the path where it's installed on your system, and
start the service via `systemctl`:
```shell
systemctl --user start platypush
```
### [Virtual environment installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-virtual-environment)
Platypush provides a script named `platyvenv` that can parse a `config.yaml` and automatically create a virtual
environment (under `~/.local/share/platypush/venv/<device_id>`) with all the dependencies required by the configured
integrations.
1. Create the environment from a configuration file:
```shell
platyvenv build -c /path/to/config.yaml
```
2. Start the service from the virtual environment:
```shell
# device_id matches either the hostname or the device_id in config.yaml
platyvenv start device_id
```
3. Stop the instance:
```shell
platyvenv stop device_id
```
4. Remove the instance:
```shell
platyvenv rm device_id
```
### [Docker installation](https://git.platypush.tech/platypush/platypush/-/wikis/Run-platypush-in-a-container)
You can also install Platypush in a container - the application provides a script named `platydock` that automatically
creates a container instance from a `config.yaml`:
1. Create the container from a configuration file:
```shell
platydock build -c /path/to/config.yaml
```
2. Start the container:
```shell
# device_id matches either the hostname or the device_id in config.yaml
platydock start device_id
```
3. Stop the instance:
```shell
platydock stop device_id
```
4. Remove the instance:
```shell
platydock rm device_id
```
## Mobile app
An [official Android app](https://f-droid.org/en/packages/tech.platypush.platypush/) is provided on the F-Droid store.
It allows to easily discover and manage multiple Platypush services on a network through the web interface, and it
easily brings the power of Platypush to your fingertips.
## Tests
To run the tests simply run `pytest` either from the project root folder or the `tests/` folder.
Or run the following command from the project root folder:
```shell
python -m tests
```
---
## Funding
If you use and love Platypush, please consider [buying me a coffee/beer](https://paypal.me/fabiomanganiello).
I've been working on Platypush all by myself in my spare time for the past few years, and I've made sure that it remains
open and free.
If you like this product, please consider supporting - I'm definitely not planning to get rich with this project, but
I'd love to have at least the costs for the server covered by users.
Issues and requests opened by donors will also be given priority over others.

View File

@ -119,7 +119,7 @@ EOF
pip install ${dep}
done
pip install --upgrade git+https://github.com/BlackLight/platypush.git
pip install --upgrade git+https://git.platypush.tech/platypush/platypush.git
echo "Platypush virtual environment prepared under $envdir"
}

21
docs/README.md Normal file
View File

@ -0,0 +1,21 @@
# Platypush self-generated reference
====================================
This directory contains the Sphinx self-generated documentation for Platypush.
Dependencies required to generate the documentation:
```shell
$ [sudo] pip install sphinx 'git+https://github.com/bashtage/sphinx-material.git'
```
To generate the HTML documentation:
```shell
$ make html
```
The output will be generated under `build/html`.
Type `make` with no additional arguments to get a full list of the supported output formats.

View File

@ -0,0 +1,59 @@
import importlib
import json
import os
import re
import sys
from typing import Union, List
from docutils import nodes
from docutils.parsers.rst import Directive
class SchemaDirective(Directive):
"""
Support for response/message schemas in the docs. Format: ``.. schema:: rel_path.SchemaClass(arg1=value1, ...)``,
where ``rel_path`` is the path of the schema relative to ``platypush/schemas``.
"""
has_content = True
_schema_regex = re.compile(r'^\s*(.+?)\s*(\((.+?)\))?\s*$')
_schemas_path = os.path.abspath(
os.path.join(
os.path.dirname(os.path.relpath(__file__)), '..', '..', '..', 'platypush', 'schemas'))
sys.path.insert(0, _schemas_path)
@staticmethod
def _get_field_value(field) -> str:
metadata = getattr(field, 'metadata', {})
return metadata.get('example', metadata.get('description', str(field.__class__.__name__).lower()))
def _parse_schema(self) -> Union[dict, List[dict]]:
m = self._schema_regex.match('\n'.join(self.content))
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
schema_module = importlib.import_module(schema_module_name)
schema_class = getattr(schema_module, m.group(1).split('.')[-1])
schema_args = eval(f'dict({m.group(3)})')
schema = schema_class(**schema_args)
output = {
name: self._get_field_value(field)
for name, field in schema.fields.items()
if not field.load_only
}
return [output] if schema.many else output
def run(self):
content = json.dumps(self._parse_schema(), sort_keys=True, indent=2)
block = nodes.literal_block(content, content)
block['language'] = 'json'
return [block]
def setup(app):
app.add_directive('schema', SchemaDirective)
return {
'version': '0.1',
'parallel_read_safe': True,
'parallel_write_safe': True,
}

View File

@ -7,14 +7,24 @@ Backends
:caption: Backends:
platypush/backend/adafruit.io.rst
platypush/backend/alarm.rst
platypush/backend/assistant.rst
platypush/backend/assistant.google.rst
platypush/backend/assistant.snowboy.rst
platypush/backend/bluetooth.rst
platypush/backend/bluetooth.fileserver.rst
platypush/backend/bluetooth.pushserver.rst
platypush/backend/bluetooth.scanner.rst
platypush/backend/bluetooth.scanner.ble.rst
platypush/backend/button.flic.rst
platypush/backend/camera.pi.rst
platypush/backend/chat.telegram.rst
platypush/backend/clipboard.rst
platypush/backend/covid19.rst
platypush/backend/dbus.rst
platypush/backend/file.monitor.rst
platypush/backend/foursquare.rst
platypush/backend/github.rst
platypush/backend/google.fit.rst
platypush/backend/google.pubsub.rst
platypush/backend/gps.rst
@ -22,14 +32,20 @@ Backends
platypush/backend/http.poll.rst
platypush/backend/inotify.rst
platypush/backend/joystick.rst
platypush/backend/joystick.jstest.rst
platypush/backend/joystick.linux.rst
platypush/backend/kafka.rst
platypush/backend/light.hue.rst
platypush/backend/local.rst
platypush/backend/linode.rst
platypush/backend/log.http.rst
platypush/backend/mail.rst
platypush/backend/midi.rst
platypush/backend/mqtt.rst
platypush/backend/music.mopidy.rst
platypush/backend/music.mpd.rst
platypush/backend/music.snapcast.rst
platypush/backend/music.spotify.connect.rst
platypush/backend/nextcloud.rst
platypush/backend/nfc.rst
platypush/backend/nodered.rst
platypush/backend/ping.rst
@ -38,18 +54,33 @@ Backends
platypush/backend/scard.rst
platypush/backend/sensor.rst
platypush/backend/sensor.accelerometer.rst
platypush/backend/sensor.arduino.rst
platypush/backend/sensor.battery.rst
platypush/backend/sensor.bme280.rst
platypush/backend/sensor.dht.rst
platypush/backend/sensor.distance.rst
platypush/backend/sensor.distance.vl53l1x.rst
platypush/backend/sensor.envirophat.rst
platypush/backend/sensor.ir.zeroborg.rst
platypush/backend/sensor.leap.rst
platypush/backend/sensor.ltr559.rst
platypush/backend/sensor.mcp3008.rst
platypush/backend/sensor.motion.pwm3901.rst
platypush/backend/sensor.serial.rst
platypush/backend/stt.rst
platypush/backend/stt.deepspeech.rst
platypush/backend/stt.picovoice.hotword.rst
platypush/backend/stt.picovoice.speech.rst
platypush/backend/tcp.rst
platypush/backend/todoist.rst
platypush/backend/travisci.rst
platypush/backend/trello.rst
platypush/backend/weather.rst
platypush/backend/weather.buienradar.rst
platypush/backend/weather.darksky.rst
platypush/backend/weather.openweathermap.rst
platypush/backend/websocket.rst
platypush/backend/wiimote.rst
platypush/backend/zigbee.mqtt.rst
platypush/backend/zwave.rst
platypush/backend/zwave.mqtt.rst

View File

@ -18,13 +18,14 @@ import sys
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath("./_ext"))
# -- Project information -----------------------------------------------------
project = 'platypush'
copyright = '2018, BlackLight'
author = 'BlackLight'
project = 'Platypush'
copyright = '2017-2021, Fabio Manganiello'
author = 'Fabio Manganiello'
# The short X.Y version
version = ''
@ -49,6 +50,8 @@ extensions = [
'sphinx.ext.ifconfig',
'sphinx.ext.viewcode',
'sphinx.ext.githubpages',
'sphinx_rtd_theme',
'sphinx_marshmallow',
]
# Add any paths that contain templates here, relative to this directory.
@ -84,8 +87,9 @@ pygments_style = 'sphinx'
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
# html_theme = 'alabaster'
html_theme = 'nature'
# html_theme = 'haiku'
# html_theme = 'sphinx_rtd_theme'
html_theme = 'sphinx_material'
html_domain_indices = True
@ -93,12 +97,57 @@ html_domain_indices = True
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
html_theme_options = {
'nav_title': 'Platypush documentation',
'repo_url': 'https://git.platypush.tech/platypush/platypush',
'repo_name': 'Source code',
'repo_type': 'gitlab',
'color_primary': 'green',
'color_accent': 'light-green',
'logo_icon': '&#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,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# html_static_path = ['_static']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
@ -108,8 +157,9 @@ html_static_path = ['_static']
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}
html_sidebars = {
'**': ['logo-text.html', 'globaltoc.html', 'localtoc.html', 'searchbox.html']
}
# -- Options for HTMLHelp output ---------------------------------------------
@ -233,6 +283,38 @@ autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'trello',
'telegram',
'telegram.ext',
'pyfirmata2',
'cups',
'graphyte',
'cpuinfo',
'psutil',
'openzwave',
'deepspeech',
'wave',
'pvporcupine ',
'pvcheetah',
'pyotp',
'linode_api4',
'pyzbar',
'tensorflow',
'keras',
'pandas',
'samsungtvws',
'paramiko',
'luma',
'zeroconf',
'dbus',
'gi',
'gi.repository',
'twilio',
'pytz',
'Adafruit_Python_DHT',
'RPi.GPIO',
'RPLCD',
'imapclient',
'pysmartthings',
'aiohttp',
'watchdog',
]
sys.path.insert(0, os.path.abspath('../..'))
@ -245,3 +327,5 @@ def skip(app, what, name, obj, skip, options):
def setup(app):
app.connect("autodoc-skip-member", skip)
# vim:sw=4:ts=4:et:

View File

@ -6,36 +6,46 @@ Events
:maxdepth: 2
:caption: Events:
platypush/events/.rst
platypush/events/adafruit.rst
platypush/events/alarm.rst
platypush/events/application.rst
platypush/events/assistant.rst
platypush/events/bluetooth.rst
platypush/events/button.flic.rst
platypush/events/camera.rst
platypush/events/chat.telegram.rst
platypush/events/clipboard.rst
platypush/events/covid19.rst
platypush/events/custom.rst
platypush/events/distance.rst
platypush/events/file.rst
platypush/events/foursquare.rst
platypush/events/geo.rst
platypush/events/github.rst
platypush/events/google.rst
platypush/events/google.fit.rst
platypush/events/google.pubsub.rst
platypush/events/gps.rst
platypush/events/http.rst
platypush/events/http.hook.rst
platypush/events/http.ota.booking.rst
platypush/events/http.rss.rst
platypush/events/inotify.rst
platypush/events/joystick.rst
platypush/events/kafka.rst
platypush/events/light.rst
platypush/events/linode.rst
platypush/events/log.http.rst
platypush/events/mail.rst
platypush/events/media.rst
platypush/events/midi.rst
platypush/events/mqtt.rst
platypush/events/music.rst
platypush/events/music.snapcast.rst
platypush/events/nextcloud.rst
platypush/events/nfc.rst
platypush/events/path.rst
platypush/events/ping.rst
platypush/events/pushbullet.rst
platypush/events/qrcode.rst
platypush/events/scard.rst
platypush/events/sensor.rst
platypush/events/sensor.ir.rst
@ -43,11 +53,18 @@ Events
platypush/events/sensor.light.rst
platypush/events/serial.rst
platypush/events/sound.rst
platypush/events/stt.rst
platypush/events/tensorflow.rst
platypush/events/todoist.rst
platypush/events/torrent.rst
platypush/events/travisci.rst
platypush/events/trello.rst
platypush/events/video.rst
platypush/events/weather.rst
platypush/events/web.rst
platypush/events/web.widget.rst
platypush/events/wiimote.rst
platypush/events/zeroborg.rst
platypush/events/zeroconf.rst
platypush/events/zigbee.mqtt.rst
platypush/events/zwave.rst

View File

@ -5,11 +5,13 @@ Welcome to the Platypush reference of available plugins, backends and event type
For more information on Platypush please check out:
* The `GitHub page`_ of the project
* The `Gitlab page`_ of the project
* The `online wiki`_ for quickstart and examples
* The `Blog articles`_ for inspiration on use-cases possible projects
.. _GitHub page: https://github.com/BlackLight/platypush
.. _online wiki: https://github.com/BlackLight/platypush/wiki
.. _Gitlab page: https://git.platypush.tech/platypush/platypush
.. _online wiki: https://git.platypush.tech/platypush/platypush/-/wikis/home
.. _Blog articles: https://blog.platypush.tech
.. toctree::
:maxdepth: 3
@ -18,6 +20,7 @@ For more information on Platypush please check out:
backends
plugins
events
responses
Indices and tables
==================

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +0,0 @@
``platypush.backend.http.request.rss``
======================================
.. automodule:: platypush.backend.http.request.rss
:members:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +0,0 @@
``platypush.message.event``
===========================
.. automodule:: platypush.message.event
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.alarm``
=================================
.. automodule:: platypush.message.event.alarm
:members:

View File

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

View File

@ -0,0 +1,5 @@
``platypush.message.event.covid19``
===================================
.. automodule:: platypush.message.event.covid19
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.custom``
==================================
.. automodule:: platypush.message.event.custom
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.file``
================================
.. automodule:: platypush.message.event.file
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.foursquare``
======================================
.. automodule:: platypush.message.event.foursquare
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.github``
==================================
.. automodule:: platypush.message.event.github
:members:

View File

@ -1,5 +0,0 @@
``platypush.message.event.http.ota.booking``
============================================
.. automodule:: platypush.message.event.http.ota.booking
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.inotify``
===================================
.. automodule:: platypush.message.event.inotify
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.linode``
==================================
.. automodule:: platypush.message.event.linode
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.log.http``
====================================
.. automodule:: platypush.message.event.log.http
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.mail``
================================
.. automodule:: platypush.message.event.mail
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.nextcloud``
=====================================
.. automodule:: platypush.message.event.nextcloud
:members:

View File

@ -1,6 +0,0 @@
``platypush.message.event.path``
================================
.. automodule:: platypush.message.event.path
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.qrcode``
==================================
.. automodule:: platypush.message.event.qrcode
:members:

View File

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

View File

@ -0,0 +1,5 @@
``platypush.message.event.tensorflow``
======================================
.. automodule:: platypush.message.event.tensorflow
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.travisci``
====================================
.. automodule:: platypush.message.event.travisci
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.trello``
==================================
.. automodule:: platypush.message.event.trello
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.zeroconf``
====================================
.. automodule:: platypush.message.event.zeroconf
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.zigbee.mqtt``
=======================================
.. automodule:: platypush.message.event.zigbee.mqtt
:members:

View File

@ -0,0 +1,5 @@
``platypush.message.event.zwave``
=================================
.. automodule:: platypush.message.event.zwave
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.alarm``
===========================
.. automodule:: platypush.plugins.alarm
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.arduino``
=============================
.. automodule:: platypush.plugins.arduino
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.camera.cv``
===============================
.. automodule:: platypush.plugins.camera.cv
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.camera.ffmpeg``
===================================
.. automodule:: platypush.plugins.camera.ffmpeg
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.camera.gstreamer``
======================================
.. automodule:: platypush.plugins.camera.gstreamer
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.config``
============================
.. automodule:: platypush.plugins.config
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.covid19``
=============================
.. automodule:: platypush.plugins.covid19
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.csv``
=========================
.. automodule:: platypush.plugins.csv
:members:

View File

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

View File

@ -0,0 +1,5 @@
``platypush.plugins.esp``
=========================
.. automodule:: platypush.plugins.esp
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.ffmpeg``
============================
.. automodule:: platypush.plugins.ffmpeg
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.foursquare``
================================
.. automodule:: platypush.plugins.foursquare
:members:

View File

@ -1,6 +0,0 @@
``platypush.plugins.google.credentials``
========================================
.. automodule:: platypush.plugins.google.credentials
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.google.drive``
==================================
.. automodule:: platypush.plugins.google.drive
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.google.translate``
======================================
.. automodule:: platypush.plugins.google.translate
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.gpio.sensor.dht``
=====================================
.. automodule:: platypush.plugins.gpio.sensor.dht
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.graphite``
==============================
.. automodule:: platypush.plugins.graphite
:members:

View File

@ -1,5 +0,0 @@
``platypush.plugins.http.request.ota.booking``
==============================================
.. automodule:: platypush.plugins.http.request.ota.booking
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.lcd.gpio``
==============================
.. automodule:: platypush.plugins.lcd.gpio
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.lcd.i2c``
=============================
.. automodule:: platypush.plugins.lcd.i2c
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.lcd``
=========================
.. automodule:: platypush.plugins.lcd
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.linode``
============================
.. automodule:: platypush.plugins.linode
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.luma.oled``
===============================
.. automodule:: platypush.plugins.luma.oled
:members:

View File

@ -0,0 +1,5 @@
``platypush.plugins.mail.imap``
===============================
.. automodule:: platypush.plugins.mail.imap
:members:

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