Commit Graph

1029 Commits

Author SHA1 Message Date
Fabio Manganiello 35c5e2d8f7 Serial plugin now extends the general sensor plugin class 2018-07-17 00:59:02 +02:00
Fabio Manganiello 86754534ae Fixed omxplayer plugin doc 2018-07-16 23:17:00 +02:00
Fabio Manganiello 72d490456f Fixed docstring 2018-07-16 22:58:56 +02:00
Fabio Manganiello 2888cb3a4b Propagate the docstring of the wrapped function when using an @action annotation 2018-07-16 22:56:07 +02:00
Fabio Manganiello cba40744fb No need to commit without opening a transaction first 2018-07-15 20:33:09 +02:00
Fabio Manganiello 2fda066e39 - Support for Platypush main configuration db, where plugins and backends can store their data
- Support for permanent cross-process storage of session variables through SQLite db
- Support for db.select with table+filter instead of raw SQL query
2018-07-15 20:12:23 +02:00
Fabio Manganiello 7114d8bcaa Implemented update and delete method for the db plugin and ON DUPLICATE UPDATE logic for insert 2018-07-15 19:31:11 +02:00
Fabio Manganiello b3e3621c5a Removed unneeded imports 2018-07-15 17:28:17 +02:00
Fabio Manganiello a2898f63c3 - Unwrap the response in the decorator if we got a Response object from the decorated plugin
- No need for @action wrappers around omxplayer event handlers
2018-07-15 02:03:24 +02:00
Fabio Manganiello 88d9f9d3ac Stability fixes 2018-07-06 03:38:14 +02:00
Fabio Manganiello 85cdd8e5af Removed old Response reference 2018-07-06 03:35:47 +02:00
Fabio Manganiello 6cf0f39a03 Added call to parent constructor in db plugin 2018-07-06 03:03:09 +02:00
Fabio Manganiello cfda6e019c Don't wrap events in a Response object twice 2018-07-06 02:55:36 +02:00
Fabio Manganiello b8665b7fbb Added another @action decorator 2018-07-06 02:41:43 +02:00
Fabio Manganiello c0b1b70e4e Added call to parent constructor in the remaining plugins 2018-07-06 02:37:47 +02:00
Fabio Manganiello eb229a6fbe Added call to parent constructor in media.ctrl 2018-07-06 02:37:47 +02:00
Fabio Manganiello d0e7b96ed4 Fixed missed self on some of the new constructors 2018-07-06 02:34:12 +02:00
Fabio Manganiello a4c7b06e4c Forgot an @action annotation 2018-07-06 02:27:44 +02:00
Fabio Manganiello b5fb6ecf93 Added call to parent constructor in lastfm plugin 2018-07-06 02:21:38 +02:00
Fabio Manganiello 66d78c8615 [#61] Plugins actions refactoring
- Using `@action` annotation to indicate methods that are allowed to be
executed as actions

- The output and errors of an action are automatically wrapped into a
`Response` object without any response build required on the plugin side
2018-07-06 02:08:38 +02:00
Fabio Manganiello 81a81312e3 Basic support for token authentication on request level 2018-07-05 09:15:53 +02:00
Fabio Manganiello 3872276234 Better way to handle plugins->backends communication through Redis 2018-06-29 10:21:19 +02:00
Fabio Manganiello f3bdeaf418 Fixed Spotify URIs conversion 2018-06-27 08:56:25 +02:00
Fabio Manganiello b55c070e46 Fixed missed dependencies for RTD build 2018-06-26 23:19:35 +02:00
Fabio Manganiello 4163a414bf Caching switch.tplink devices and supporting lookup by alias 2018-06-26 22:59:33 +02:00
Fabio Manganiello 65f9610cce Added switch.tplink web widget 2018-06-26 22:14:11 +02:00
Fabio Manganiello 0f3895ad41 Added plugin to control a TP-Link HS100 and similar smart plugs/switches 2018-06-26 19:10:53 +02:00
Fabio Manganiello 7398107570 Completed documentation for backends 2018-06-26 00:36:01 +02:00
Fabio Manganiello b876f17f81 Completed documentation for plugins 2018-06-25 19:57:43 +02:00
Fabio Manganiello ad1c87b2be Adding more plugins documentation 2018-06-25 00:49:45 +02:00
Fabio Manganiello 54dcb2cba3 Documentation v0.1 2018-06-23 01:00:43 +02:00
Fabio Manganiello e70eb8bb42 typos 2018-06-19 20:32:19 +02:00
Fabio Manganiello 98c88ff8e5 Made serial.plugin more robust. It can now read a JSON even if it's not all on one line and if it comes with some bogus bytes at the beginning or the end 2018-06-19 20:05:24 +02:00
Fabio Manganiello 5f50b5c4f4 Support for color animations via web interface too 2018-06-19 00:37:33 +02:00
Fabio Manganiello dde0b579b2 typo 2018-06-16 04:54:27 +02:00
Fabio Manganiello 9fd86977c7 Don't pass stuff to set_light and set_group that we don't have to 2018-06-16 04:48:09 +02:00
Fabio Manganiello 31a2aa67e2 Always stop any running animation before resetting the lights to a static configuration 2018-06-16 04:20:13 +02:00
Fabio Manganiello 803aa68f11 Support for animation (so far color transition and blink) on Philips Hue plugin 2018-06-16 04:10:59 +02:00
Fabio Manganiello 2d6994c057 send_message over Redis for OMXPlayer plugin 2018-06-14 21:13:01 +02:00
Fabio Manganiello bd18d1cbc1 Using Redis backend as a fallback for send_message if a backend does not implement its own send_message 2018-06-14 20:42:57 +02:00
Fabio Manganiello d9b51c94c0 Added Pushbullet plugin to send pushes and files 2018-06-14 15:35:19 +00:00
Fabio Manganiello 81d29928b0 Pi Camera backend version 1.0, now properly controllable 2018-06-14 12:37:14 +02:00
Fabio Manganiello 2b73f71803 Improved logging traces names for backends and plugins 2018-06-14 02:19:55 +02:00
Fabio Manganiello 29a5cfa9c2 Refactored camera.pi backend. Support for start/stop recording control via plugin action. Introduced support for taking pictures too 2018-06-14 00:34:30 +02:00
Fabio Manganiello f9c0d83f79 Made variable.set less verbose and more flexible. Replace the syntax like {"action":"variable.set", "args": {"name":"foo", "value":"bar"}} with a more compact {"action":"variable.set", "args":{"foo":"bar"}} 2018-06-13 23:20:21 +02:00
Fabio Manganiello 9113ac0530 variable.set now returns output in the form name:value so the newly set variable is already available in the context of the task 2018-06-13 22:19:17 +02:00
Fabio Manganiello 7fd375da66 Added plugin for handling general-purpose session variables across tasks.
Supported methods: variable.get, variable.set, variable.unset
2018-06-13 22:09:28 +02:00
Fabio Manganiello ab02d7e79c Calendar events can also be all day - in such a case parse the 'date' field instead of 'dateTime' 2018-06-13 00:54:59 +02:00
Fabio Manganiello 464ff1ff57 A more robust way to handle JSON serialization/deserialization on MQTT backend 2018-06-12 10:33:30 +02:00
Fabio Manganiello bdf862e6d2 get_data alias for get_measuremnt 2018-06-12 00:46:51 +02:00
Fabio Manganiello f8506d6d25 Added comment to explain the reasons for sudo in the switchbot plugin 2018-06-11 22:41:23 +02:00
Fabio Manganiello 1bc4c47df7 Imported ZeroBorg library with scope constructor as global import fails for some reason 2018-06-08 17:10:49 +02:00
Fabio Manganiello bb21595678 Called parent constructor in ZeroBorg plugin to make sure that the logger instance is initialized 2018-06-07 09:31:12 +02:00
Fabio Manganiello 4da74b1096 Refactored logging submodule 2018-06-06 20:09:23 +02:00
Fabio Manganiello 4c1cb9ae6b Added mkv to the supported media extensions 2018-06-02 21:56:46 +02:00
Fabio Manganiello bc3e100217 New general-purpose plugin for managing multiple calendar + support for ICal format 2018-05-30 15:59:10 +02:00
Fabio Manganiello 3fe70dd184 Implemented MQTT backend and plugin, see issue #56 2018-05-27 12:21:41 +02:00
Fabio Manganiello 96e3acb20f Added MPD play_if_paused and pause_if_playing methods 2018-05-25 18:04:37 +02:00
Fabio Manganiello 27b97e584f Added support for MIDI real-time events 2018-05-23 19:49:54 +02:00
Fabio Manganiello a8015addbf Only take the first component of formatted_address 2018-05-23 08:06:52 +00:00
Fabio Manganiello 3ce6cf8b41 Just use formatted_address from the Google geocode response instead of considering all the cases of address formatting 2018-05-22 21:43:21 +00:00
Fabio Manganiello 2c7880874d Logging geocode response 2018-05-22 21:34:06 +00:00
Fabio Manganiello f4da6ebb1b Redis plugin added and Redis backend made more robust to work also with single-quoted JSON-like strings returned by the Redis lib 2018-05-22 14:44:17 +00:00
Fabio Manganiello 9923742e74 Prevent plugins from breaking in case of concatenations with None elements 2018-05-14 19:06:11 +02:00
Fabio Manganiello 21ac8d7899 Build the address as street + street_number if they are both available 2018-05-13 20:15:25 +00:00
Fabio Manganiello 6c0dc9a4dc Added GMaps geocode plugin and geo update event 2018-05-13 21:42:26 +02:00
Fabio Manganiello d0ca6b8e93 Replaced the YouTube search results parsing logic that relied on BeautifulSoup with a simpler logic that only uses regexes to parse video results. It greatly improves the performance of YouTube video search and removes the dependency on BeautifulSoul and lxml 2018-05-13 14:29:31 +02:00
Fabio Manganiello d75326bbe8 Added Switchbot web plugin 2018-05-08 17:07:01 +02:00
Fabio Manganiello 598c917eda Added Switchbot plugin 2018-05-08 15:51:47 +02:00
Fabio Manganiello b94764436d Added WeMo switch plugin for web panel 2018-05-08 09:59:43 +02:00
Fabio Manganiello 36c9437172 Added method to get WeMo available devices 2018-05-08 09:14:02 +02:00
Fabio Manganiello 27d5f674c5 Added __init__.py 2018-05-06 00:17:18 +02:00
Fabio Manganiello e1e4d824ad - Added web widget for Google Calendar integration
- UX improvements on the dashboard
2018-05-05 00:57:41 +02:00
Fabio Manganiello f6306c6015 Added Google Calendar plugin 2018-05-04 19:20:23 +02:00
Fabio Manganiello 2f8c74c8e3 - Added Pushbullet JS logic to show mirror notifications on web FE
- Added JS and CSS files for dashboard and widgets
2018-05-04 17:25:12 +02:00
Fabio Manganiello d83c2c903f - Added support for /dashboard page with customizable widgets under the web server
- Introduced Redis to pass messages between the Flask process and the
main application. It now syncs messages with the bus and connected websockets
- Added support to programmatically modify dashboard widgets through POST request like Dashing
- Added weather forecast plugin
2018-05-04 03:24:35 +02:00
Fabio Manganiello ef75339fef Fixed missing output= argument 2018-04-29 16:38:05 +02:00
Fabio Manganiello cfe78dfa23 Fixed name clash 2018-04-29 16:19:26 +02:00
Fabio Manganiello 4462f9590f Forgot an import 2018-04-29 16:18:27 +02:00
Fabio Manganiello a907c9ad63 Refactored serial, the entry point for querying serial devices should be the serial plugin, the backend should only be a client. Also, if the serial output is a JSON, parse it 2018-04-29 16:14:46 +02:00
Fabio Manganiello e9425236a9 Removed additional file_name parameter 2018-04-26 15:54:40 +02:00
Fabio Manganiello 7fb0a5bb55 Set download_dir only if specified 2018-04-25 12:03:15 +02:00
Fabio Manganiello efe4f32409 Implemented torrent search, download and streaming in OMXPlayer plugin 2018-04-25 11:29:03 +02:00
Fabio Manganiello acd06c2193 Implemented OMXPlayer file search and unified all searches under one method 2018-04-25 00:13:17 +02:00
Fabio Manganiello 77da94769e Implemented file search method in OMXPlayer plugin 2018-04-24 21:28:42 +02:00
Fabio Manganiello e5e1270380 Exposed a global context.get_bus() method to allow plugins to send events to the main bus 2018-04-24 20:07:16 +02:00
Fabio Manganiello 9052e18f9c Commented OMXPlayer handlers initialization part as the plugin object has no access to the bus 2018-04-24 14:56:31 +02:00
Fabio Manganiello 9492243fd5 Transform a [0,100] volume range in the volume range expected by the OMXPlayer API 2018-04-24 14:54:01 +02:00
Fabio Manganiello dd254b65cb Implemented YouTube videos search and controls web FE 2018-04-24 14:36:05 +02:00
Fabio Manganiello c4401b25be Reload logic on media.ctrl in case the connection with the media plugin has been reset 2018-04-22 23:39:23 +02:00
Fabio Manganiello 60c9c7476e Fixed a missing parenthesis 2018-04-20 15:20:23 +02:00
Fabio Manganiello a783efd0d7 Added status method to media.ctrl plugin 2018-04-20 15:18:20 +02:00
Fabio Manganiello ded4ac3b95 - Introduced a more consistent Enum for managing playing states across different players
- media.ctrl can now spot which player is playing and control only the right one
- Extended video.omxplayer plugin methods
2018-04-20 12:17:27 +02:00
Fabio Manganiello cc506b3340 Final (?) regex fix 2018-04-20 10:04:29 +02:00
Fabio Manganiello eaec9ac51f Final (?) regex fix 2018-04-20 10:00:01 +02:00
Fabio Manganiello 8e5a27d74c Regex fix 2018-04-20 09:52:55 +02:00
Fabio Manganiello 2459506964 Regex typo 2018-04-20 09:41:52 +02:00
Fabio Manganiello 7e119654f9 Retry with the next YouTube video until some of the ones from the search can be played without errors 2018-04-20 09:38:04 +02:00
Fabio Manganiello 4db2f62c17 typo #2 2018-04-20 09:30:19 +02:00
Fabio Manganiello 3f3ec08af2 typo 2018-04-20 09:27:57 +02:00
Fabio Manganiello 6135089d60 Encoding POST data as bytes 2018-04-19 23:46:47 +02:00
Fabio Manganiello 02f6e163bf Variable typo 2018-04-19 23:42:10 +02:00
Fabio Manganiello 51d6bec51c Forgot an import 2018-04-19 23:40:49 +02:00
Fabio Manganiello 14aa4f6454 Implemented torrent search 2018-04-19 23:35:19 +02:00
Fabio Manganiello 2fdb8c50da Added support for video events 2018-04-19 22:42:28 +02:00
Fabio Manganiello 84ab37e44e Added YouTube search only method 2018-04-19 10:18:46 +02:00
Fabio Manganiello 23095bc18d Log the YT videos being played/searched 2018-04-19 00:39:59 +02:00
Fabio Manganiello 61e851dd8e Fixes 2018-04-19 00:32:20 +02:00
Fabio Manganiello 12295f2f77 youtube_search_and_play moved back to video.omxplayer 2018-04-19 00:30:43 +02:00
Fabio Manganiello d2b881fee7 YouTube search and play code moved to media.ctrl plugin 2018-04-18 00:50:19 +02:00
Fabio Manganiello ab19e258bb Implemented YouTube videos search and play with support for queuse 2018-04-18 00:23:12 +02:00
Fabio Manganiello 2186336bbc Added plugin for supporting MCP3008 ADC for analog sensors 2018-04-17 01:03:02 +02:00
Fabio Manganiello f717315136 Added music.mpd.searchaddplaylist method 2018-04-15 16:31:23 +02:00
Fabio Manganiello 87fb8855b7 - Show Spotify results first from MPD search, if available
- More granular calculation of the match score
2018-04-15 11:15:43 +02:00
Fabio Manganiello 73c74654d1 - Better MPD filter management - you can now pass filters as arrays like
['artist', 'Led Zeppelin', 'title', 'Stairway To Heaven'] instead of
relying on one single type-filter pair

- Improved condition matching - don't skip the last condition token if
there are still event tokens to add
2018-04-14 23:58:48 +02:00
Fabio Manganiello e83b21ad33 No outline on the ZeroBorg div when focused 2018-04-13 23:45:29 +02:00
Fabio Manganiello b863213bd7 More rational management of ZeroBorg auto pilot mode together with sensor - no longer limited to gpio.sensor.distance alone, but including any kind of GpioSensorPlugin. Thresholds, timeouts and actions are configured in config.yaml instead of being hardcoded 2018-04-13 15:49:10 +02:00
Fabio Manganiello b597097be3 Better management of motor power settings in gpio.zerborg - no more offsets multiplied for max_power and hardcoded power coefficients, just pass the motor power in the configuration 2018-04-13 15:12:31 +02:00
Fabio Manganiello 25e601ca4d More granular control of the motors left/right directions 2018-04-12 17:18:32 +02:00
Fabio Manganiello decadee00a Implemented music search from web panel 2018-04-12 13:04:56 +02:00
Fabio Manganiello 248b1c37b2 typo 2018-04-09 02:04:07 +02:00
Fabio Manganiello a3fbce1082 Support for global and individual color and power switches on Philips Hue interface 2018-04-09 01:24:02 +02:00
Fabio Manganiello 2bf4ff136b Exposing serial data functionally through a plugin 2018-04-08 18:16:24 +02:00
Fabio Manganiello 10a78a1f21 Frontend plugin for Philips Hue 2018-03-27 23:13:47 +02:00
Fabio Manganiello b5567c289f - Added Pi camera stream over TCP backend
- More consistent event handling for the pushtotalk assistant
- Added general GPIO module
2018-03-24 03:05:46 +01:00
Fabio Manganiello a14d6fe652 - Stop assistant playback only if there was a user request. This
prevents a PortAudio write on input-only stream error in the Assistant
SDK, see https://github.com/googlesamples/assistant-sdk-python/issues/185

- Make sure that user_request is always defined before returning it

- Use assistant.google.pushtotalk as a fallback if assistant.google is
not configured/available
2018-03-21 23:21:41 +01:00
Fabio Manganiello d5f73023ea Support for custom hotword detection through Snowboy 2018-03-20 23:34:36 +01:00
Fabio Manganiello 6309f5301e - Power offsets now passed through conf instead of source code
- More robust handling of temporary sensor failures
2018-03-17 17:16:20 +01:00
Fabio Manganiello dcd4f9eddf Threshold obstacle distance increased to 40 cm 2018-03-06 02:44:44 +01:00
Fabio Manganiello 8674626934 - Implemented auto_toggle command for Zeroborg
- Recalibrated power offsets
2018-03-05 23:27:20 +01:00
Fabio Manganiello 8b733fb859 - Added IR sensor backend
- Fixed default power offsets
- Changed threshold distance for ultrasound sensor
- Fixed power multiplier coefficient
2018-03-04 17:55:48 +01:00
Fabio Manganiello 0f97678a78 Throttling power 2018-03-03 03:24:08 +01:00
Fabio Manganiello da0d715d49 Getting distance synchronously 2018-03-02 16:02:04 +01:00
Fabio Manganiello df6790cde9 Changed default distance 2018-03-02 14:37:14 +01:00
Fabio Manganiello cf83f07f79 Implemented auto pilot with distance sensors 2018-02-26 11:31:06 +01:00
Fabio Manganiello a8254181b2 Fixed ZeroBorg power offsets 2018-02-26 01:01:07 +01:00
Fabio Manganiello 6508f0baf3 Zeroborg plugin 2018-02-25 23:45:31 +01:00
Fabio Manganiello 779a907ebd Made the ZeroBorg module Python3-friendly 2018-02-20 20:41:56 +01:00
Fabio Manganiello f16719f575 Added ZeroBorg plugin draft 2018-02-20 20:09:29 +01:00
Fabio Manganiello 40efb3f9c7 Support for selecting and playing tracks and playlists in web interface 2018-02-05 09:45:35 +01:00
Fabio Manganiello 1cab75757b - Support for playlist update events handling on MPD
- Support for playlist updates on the web interface
- Support for selecting and playing tracks in the web interface
2018-02-05 00:55:19 +01:00
Fabio Manganiello de2e50fefa Implemented support for track random seek 2018-01-31 10:35:14 +01:00
Fabio Manganiello 7cd15d35e1 Return new status on random and repeat calls 2018-01-31 01:39:04 +01:00
Fabio Manganiello 968b71e946 - Implemented support for shuffle, random and set volume on the UI
- Reduced the websocket ping poll frequency to 1 second
2018-01-31 01:32:07 +01:00
Fabio Manganiello 28bc4c748e UI improvements + support for MPD playlists and folders 2018-01-30 00:54:46 +01:00
Fabio Manganiello 6aec6380d8 MIMEBase import is needed here 2018-01-28 03:08:19 +01:00
Fabio Manganiello 6bfb6d934d Support for multiple attachments and binary application attachments in GMail 2018-01-28 02:59:19 +01:00
Fabio Manganiello 55eb689121 Support for RSS digest generation either in HTML or PDF format 2018-01-28 02:01:54 +01:00
Fabio Manganiello 834b700d5f Added GMail actions support, solves #49 2018-01-17 03:16:59 +01:00
Fabio Manganiello ac15e581ce Added last.fm scrobbler plugin, solves #21 2018-01-15 02:40:22 +01:00
Fabio Manganiello 4fa7a08006 Added mpd backend 2018-01-13 02:52:06 +01:00
Fabio Manganiello 76f7bbc529 Refactored HTTP request plugin and fixed bug on the plugin name 2018-01-12 15:18:06 +01:00
Fabio Manganiello 3c13625e63 Better logic for db inserts 2018-01-07 01:35:27 +00:00
Fabio Manganiello 32dcb0c829 Added database plugin, #43 2018-01-06 22:52:24 +01:00
Fabio Manganiello 6b31ed3b1a Added __init__.py 2018-01-06 11:10:55 +01:00
Fabio Manganiello 1df10bc97e Added HTTP requests plugin, #42 2018-01-05 20:00:15 +01:00
Fabio Manganiello 4c62133378 Updated README 2018-01-03 02:23:25 +01:00
Fabio Manganiello 08189653bb s/playlistload/load/ 2017-12-29 12:48:14 +01:00
Fabio Manganiello b6733b3e6a Also start playback when adding a playlist 2017-12-29 12:44:49 +01:00
Fabio Manganiello 26c3afee68 Implemented play_or_stop in mpd 2017-12-28 13:13:09 +01:00
Fabio Manganiello c830988e09 Added __init__ 2017-12-27 12:09:59 +01:00
Fabio Manganiello d727b28acf Syntax error 2017-12-27 12:02:47 +01:00
Fabio Manganiello aa506b20e2 Should import logging 2017-12-27 11:29:33 +01:00
Fabio Manganiello ec6f1b1457 Prevent player loops in case of dbus errors 2017-12-27 11:27:06 +01:00
Fabio Manganiello 7c55848651 Forgot a couple of selfs 2017-12-27 11:01:07 +01:00
Fabio Manganiello c184356f67 Added __init__.py 2017-12-27 10:37:15 +01:00
Fabio Manganiello eff046f1d1 Added __init__.py 2017-12-27 10:30:33 +01:00
Fabio Manganiello 92b691041e Added more general media control plugin, #10 2017-12-27 10:19:35 +01:00
Fabio Manganiello c201d725b7 Google Assistant plugin to programmatically start/stop conversation 2017-12-26 15:06:59 +01:00
Fabio Manganiello 6928e440bc Support for Flic button events 2017-12-24 13:15:37 +01:00
Fabio Manganiello 7a0295675c #20 Added TTS plugin 2017-12-22 03:14:19 +01:00
Fabio Manganiello bd5c80175f - Major refactoring.
- More consistent naming for many methods, plus added a more extensive doc.

- Refactored the entry points for the daemon and the pusher into two
  classes, easier to encapsulate and wrap into tests.

- Removed the local backend - managing the concurrency of two processes
  reading and writing on the same socket at the same time was too much,
  and its utility outside of the tests (which can have mock backends as
  well) is quite modest.

- Managing stop events on the bus. Still some work to do tho.

- Fixed several bugs.
2017-12-20 20:25:08 +01:00
Fabio Manganiello 4a04e51da7 Major refactoring #2 2017-12-18 01:10:51 +01:00
Fabio Manganiello 1a6d726b19 Passing arguments to the plugin 2017-12-17 16:41:52 +01:00
Fabio Manganiello 33c4d9fb52 s/platypush.response/platypush.message.response/g 2017-12-13 04:21:26 +01:00
Fabio Manganiello 462dc2f1c9 * Sending responses back on the backend channel
* Version bump
2017-12-13 04:14:46 +01:00
Fabio Manganiello 491c2cd571 * More consistent management of responses
* Better per-plugin/per-backend logging management
2017-12-13 03:37:28 +01:00
Fabio Manganiello f7202fd205 * PushbulletBackend.send_msg method refactored and removed pushbullet.py dependency
* Management of optional dependencies moved to setup.py
2017-12-12 20:14:02 +01:00
Fabio Manganiello 6c2ea3767c s/runbullet/platypush/g 2017-12-11 20:30:57 +01:00