Compare commits

...

2590 Commits

Author SHA1 Message Date
Fabio Manganiello 32b8296244
[#400] Dynamic logic to infer procedures/hooks arguments.
This allows procedures and event hooks to have more flexible signatures.
Along the lines of:

```python
@when(SomeEvent)
def hook(event):
  ...

@when(SomeOtherEvent)
def hook2():
  ...
```

Instead of supporting only the full context spec:

```python
@when(SomeEvent)
def hook(event, **ctx):
  ...
```

Closes: #400
2024-05-19 02:17:42 +02:00
Fabio Manganiello 2ab1743bec
[Docs UI] Fix filter bar to the top while scrolling. 2024-05-19 02:17:42 +02:00
Fabio Manganiello 70ffe0ec04
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-17 00:23:06 +00:00
Fabio Manganiello 3d5c60e4f4
[UI docs] Added filter bar for integrations and events.
continuous-integration/drone/push Build is passing Details
2024-05-17 02:21:57 +02:00
Fabio Manganiello f06233801b
[#394] Dynamically generate setup extras.
Also, convert all code that relied on `manifest.yaml` to use
`manifest.json` instead.

Closes: #394
2024-05-17 02:21:57 +02:00
Fabio Manganiello 59c693d6a0
[#394] All `manifest.yaml` converted to `manifest.json`.
YAML isn't part of the Python standard library, while JSON is.

If we want `setup.py` to dynamically parse the available integration
manifest files in order to populate the extra dependencies, then it's
better to rely on a JSON format for manifest files - the parser is part
of the standard library and it doesn't require the user to install
`pyyaml` before `platypush`.
2024-05-17 02:21:57 +02:00
Fabio Manganiello 79a71d00b4
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-16 00:44:03 +00:00
Fabio Manganiello c77cf2c98b
[#372] Removed Google Fit plugin.
continuous-integration/drone/push Build is passing Details
The Fit API has (unfortunately) been deprecated by Google with no
alternatives - the new Health Connect API is only available on Android
devices.

Other Google APIs don't seem to be affected by the refresh token issue
either, so this should hopefully close that issue too.

Closes: #372
2024-05-16 02:42:54 +02:00
Fabio Manganiello f514f7ce1e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 07:57:10 +00:00
Fabio Manganiello 98a98ea1dc
[#398] Removed custom `Response` objects from Tensorflow and response docs generation logic.
continuous-integration/drone/push Build is passing Details
Closes: #398
2024-05-15 09:55:58 +02:00
Fabio Manganiello 77c91aa5e3
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 06:35:17 +00:00
Fabio Manganiello 0e11bbeb05
Fixed schema reference.
continuous-integration/drone/push Build is passing Details
2024-05-15 08:33:49 +02:00
Fabio Manganiello 20f3eaf375
[#398] Refactored `esp` plugin.
continuous-integration/drone/push Build was killed Details
- Converted `Response` objects into `Schema`s.

- Removed the last references to the deprecated `Mapping` object.

- Fixed all errors and warnings in the plugin.
2024-05-15 01:29:45 +02:00
Fabio Manganiello 55e230c361
Removed `wiimote` events associated to removed `wiimote` plugin. 2024-05-15 01:29:45 +02:00
Fabio Manganiello ad4d929c28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-13 00:23:15 +00:00
Fabio Manganiello 7ae99b4325
[#398] `cups` plugin refactor.
continuous-integration/drone/push Build is passing Details
1. Renamed plugin: `printer.cups` ➡️  `cups`.
2. Replaced `Response` objects with schemas.
2024-05-13 02:22:04 +02:00
Fabio Manganiello 2efffb8ebe
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-12 23:26:45 +00:00
Fabio Manganiello 15b1c1f3c0
[#398] Replaced `GoogleDriveFile` response with `GoogleDriveFileSchema`.
continuous-integration/drone/push Build is passing Details
2024-05-13 01:25:33 +02:00
Fabio Manganiello 6003b205c8
[#398] Removed `TranslateResponse`. 2024-05-13 01:25:33 +02:00
Fabio Manganiello 825f20ab77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 23:48:43 +00:00
Fabio Manganiello 7d87c5e92a
Merge pull request #424 from blacklight/snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.1 to 3.37.0
2024-05-10 01:46:32 +02:00
Fabio Manganiello 3b3f157086
Merge branch 'master' into snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0 2024-05-10 01:46:24 +02:00
Fabio Manganiello ad20345505
Merge pull request #423 from blacklight/snyk-upgrade-d36bc5586dd237b84d10196576744320
[Snyk] Upgrade cronstrue from 2.48.0 to 2.49.0
2024-05-10 01:45:09 +02:00
Fabio Manganiello fc4d006064
Merge pull request #422 from blacklight/snyk-upgrade-782bd84f2e24c5ffc88e43f1d25d5de4
[Snyk] Upgrade axios from 1.6.7 to 1.6.8
2024-05-10 01:44:51 +02:00
Fabio Manganiello e10fb4e549
Merge pull request #421 from blacklight/snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2
[Snyk] Upgrade vue-router from 4.3.0 to 4.3.2
2024-05-10 01:44:34 +02:00
Fabio Manganiello 404737dc24
Merge branch 'master' into snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2 2024-05-10 01:44:19 +02:00
Fabio Manganiello 2896bd64b6
Merge pull request #420 from blacklight/snyk-upgrade-9cd3716e8d2fdaf3c323b2566785c607
[Snyk] Upgrade vue-skycons from 4.2.0 to 4.3.4
2024-05-10 01:43:16 +02:00
Fabio Manganiello 7e8f8a35fc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:38:23 +00:00
Fabio Manganiello b662e98447
[#398] Removed `ssh` response objects.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:37:17 +02:00
Fabio Manganiello f978d708cb
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:02:32 +00:00
Fabio Manganiello 6f8c2085f2
[#398] Replaced `qrcode` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:01:22 +02:00
snyk-bot 6f0451b733
fix: upgrade core-js from 3.36.1 to 3.37.0
Snyk has created this PR to upgrade core-js from 3.36.1 to 3.37.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:23 +00:00
snyk-bot c80af03e8d
fix: upgrade cronstrue from 2.48.0 to 2.49.0
Snyk has created this PR to upgrade cronstrue from 2.48.0 to 2.49.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:18 +00:00
snyk-bot 186e85cc86
fix: upgrade axios from 1.6.7 to 1.6.8
Snyk has created this PR to upgrade axios from 1.6.7 to 1.6.8.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:14 +00:00
snyk-bot 83ca9fd8e5
fix: upgrade vue-router from 4.3.0 to 4.3.2
Snyk has created this PR to upgrade vue-router from 4.3.0 to 4.3.2.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:10 +00:00
snyk-bot 8437f05d6a
fix: upgrade vue-skycons from 4.2.0 to 4.3.4
Snyk has created this PR to upgrade vue-skycons from 4.2.0 to 4.3.4.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:06 +00:00
Fabio Manganiello 8d04eadd77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 12:17:46 +00:00
Fabio Manganiello e74137d4d1
Merge pull request #419 from blacklight/snyk-upgrade-83595b90e84b75cb5b628ea340bc6c3c
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.0 to 3.36.1
2024-05-09 14:15:26 +02:00
Fabio Manganiello 6b12d5ca0e
Merge pull request #418 from blacklight/snyk-upgrade-f5b9569657478ec13c79bc3064807f15
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
2024-05-09 14:15:10 +02:00
Fabio Manganiello e683912228
Merge pull request #417 from blacklight/snyk-upgrade-503e414934e3e9df4999abbd15eed244
[Snyk] Upgrade vue-router from 4.2.5 to 4.3.0
2024-05-09 14:14:52 +02:00
Fabio Manganiello 912dddd3da
Merge branch 'master' into snyk-upgrade-503e414934e3e9df4999abbd15eed244 2024-05-09 14:14:07 +02:00
Fabio Manganiello afbb61565b
Merge pull request #416 from blacklight/snyk-upgrade-eb696c7a079843109d9453f80144a956
[Snyk] Upgrade sass from 1.71.0 to 1.75.0
2024-05-09 14:12:35 +02:00
Fabio Manganiello df8299ab61
Merge pull request #415 from blacklight/snyk-upgrade-9b35134e9eafc25285fde220c6d0dc11
[Snyk] Upgrade vue from 3.4.19 to 3.4.23
2024-05-09 14:12:17 +02:00
Fabio Manganiello 741f1aef84
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 12:08:36 +00:00
Fabio Manganiello 3df76a4a9c
[#398] Replaced `pihole` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 14:06:54 +02:00
Fabio Manganiello 929ac09cae
[#398] Removed unused `stt` response module.
continuous-integration/drone/push Build is passing Details
2024-05-09 11:01:42 +02:00
Fabio Manganiello 3277c56b43
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-08 23:48:25 +00:00
Fabio Manganiello c906aab64d
[camera.android.ipcam UI] Adapted to the new plugin API.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:46:36 +02:00
Fabio Manganiello 2021e25752
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 23:42:25 +00:00
Fabio Manganiello 13bde4adba
[#398] Replaced `camera` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:41:15 +02:00
Fabio Manganiello 579faf63bc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 20:00:37 +00:00
Fabio Manganiello 7a849379f9
[#399] Added `@when` decorator as an alias for `@hook`.
continuous-integration/drone/push Build is passing Details
Closes: #399
2024-05-08 21:58:58 +02:00
snyk-bot 4a100b0dc0
fix: upgrade core-js from 3.36.0 to 3.36.1
Snyk has created this PR to upgrade core-js from 3.36.0 to 3.36.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=referral&page=upgrade-pr
2024-05-07 18:19:30 +00:00
snyk-bot 5a1bccac4d
fix: upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2.

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=referral&page=upgrade-pr
2024-05-07 18:19:26 +00:00
snyk-bot 499b3cd9c9
fix: upgrade vue-router from 4.2.5 to 4.3.0
Snyk has created this PR to upgrade vue-router from 4.2.5 to 4.3.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:22 +00:00
snyk-bot 8be6d80b45
fix: upgrade sass from 1.71.0 to 1.75.0
Snyk has created this PR to upgrade sass from 1.71.0 to 1.75.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:19 +00:00
snyk-bot fc621a27f3
fix: upgrade vue from 3.4.19 to 3.4.23
Snyk has created this PR to upgrade vue from 3.4.19 to 3.4.23.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:15 +00:00
Fabio Manganiello 85e44542e2
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-07 10:49:01 +00:00
Fabio Manganiello c094fac7dc
Merge pull request #407 from blacklight/snyk-upgrade-1d870abd0ad2c511fe65000600f02a14
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade cronstrue from 2.47.0 to 2.48.0
2024-05-07 12:42:38 +02:00
Fabio Manganiello 9dc0fbe6e7
Merge branch 'master' into snyk-upgrade-1d870abd0ad2c511fe65000600f02a14 2024-05-07 12:42:30 +02:00
Fabio Manganiello d6b1337c5a
Merge pull request #413 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/express-4.19.2
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
2024-05-07 12:40:57 +02:00
Fabio Manganiello 0adde5a107
Merge pull request #414 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/ejs-3.1.10
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
2024-05-07 12:40:41 +02:00
Fabio Manganiello 89ced918f1
Merge pull request #412 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/webpack-dev-middleware-5.3.4
Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /platypush/backend/http/webapp
2024-05-07 12:40:28 +02:00
Fabio Manganiello bf52f44f92
Merge pull request #411 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/follow-redirects-1.15.6
Bump follow-redirects from 1.15.4 to 1.15.6 in /platypush/backend/http/webapp
2024-05-07 12:40:08 +02:00
Fabio Manganiello e285009da3
Merge pull request #409 from blacklight/snyk-upgrade-f2aa58c6cb66ee05c32f925b535a8b1f
[Snyk] Upgrade core-js from 3.35.1 to 3.36.0
2024-05-07 12:39:56 +02:00
Fabio Manganiello 3edc8d1077
Merge pull request #408 from blacklight/snyk-upgrade-29d2bb6c813d352072249a6db7e3a805
[Snyk] Upgrade vue from 3.4.18 to 3.4.19
2024-05-07 12:39:36 +02:00
Fabio Manganiello cbaca5f303
Merge pull request #406 from blacklight/snyk-upgrade-bf6b4c595d14f755033e14807ed62fa7
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
2024-05-07 12:39:20 +02:00
Fabio Manganiello df79bb3ea6
Merge pull request #410 from blacklight/snyk-upgrade-73632136d273593f5bc9c7ffc6fd9c71
[Snyk] Upgrade sass from 1.70.0 to 1.71.0
2024-05-07 12:39:04 +02:00
Fabio Manganiello 228031c4ad
[#331] Automatically initialize __init__.py in script dirs.
continuous-integration/drone/push Build is passing Details
Closes: #331
2024-05-07 02:59:13 +02:00
Fabio Manganiello fdeba9e53c
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-06 00:28:09 +00:00
Fabio Manganiello 3c88593e9a
[#293] Merged `midi` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #293
2024-05-06 02:26:27 +02:00
Fabio Manganiello 6a8c83f99b
🐛 Don't add the new password salt/iterations columns if already present.
continuous-integration/drone/push Build is passing Details
And, similarly, don't remove them if they aren't on the user table.
2024-05-05 21:58:51 +02:00
Fabio Manganiello 901338e228
[#397] Replaced bcrypt dependency with native hashlib logic.
continuous-integration/drone/push Build is failing Details
Closes: #397
2024-05-05 21:38:27 +02:00
dependabot[bot] 9651354fbf
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-02 10:39:57 +00:00
Fabio Manganiello a5826892dd
[CI/CD] Added `python-setuptools` to build dependencies.
continuous-integration/drone/push Build is passing Details
It's apparently been extracted out of the core Python library on the
version 3.12 of the interpreter.
2024-05-02 03:31:41 +02:00
Fabio Manganiello 373d98fc6a
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2024-05-02 01:11:36 +00:00
Fabio Manganiello 61e466d8e2
[UI] Added `tts.picovoice` component and `assistant.picovoice` icon.
continuous-integration/drone/push Build is passing Details
2024-05-02 03:07:47 +02:00
Fabio Manganiello 4ac73837f6
[Automatic] Updated components cache
continuous-integration/drone/push Build is failing Details
2024-05-02 00:51:58 +00:00
Fabio Manganiello 72bc697122 [assistant.picovoice] Extended documentation. 2024-05-02 00:51:09 +00:00
Fabio Manganiello b2c07a31f2 Fixed tests 2024-05-02 00:51:09 +00:00
Fabio Manganiello d813356d9c [music.mopidy] Handle the case where `add` returns a list. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 1192782729 [tts.picovoice] Convert digits before replacing other substrings. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 4734909912 🐛 The `EventMatchResult` object shouldn't be initialized with `args` from the event.
If there's a good use-case for overriding `Event._matches_condition`
with a logic that also parses the event arguments, then those arguments
should be accessed directly from the event object, not from the match
result.

Initializing `EventMatchResult` with the arguments from the event means
that, if `EventMatchResult.parsed_args` are populated with custom
extracted arguments, then the upstream event arguments will also be
modified.

If the event is matched against multiple conditions, this will result in
the extracted tokens getting modified by each `matches_condition`
iteration.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 237fc58928 [tts.picovoice] A more robust logic for replacing unsupported characteres on the input. 2024-05-02 00:51:09 +00:00
Fabio Manganiello d8e24207c5 Added `openai` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello bd4b1d3e0f [assistant.picovoice] Sync between the speech and intent engines. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a373091c64 Prevent duplicate hook runs.
Instead of being a list, the hooks in the hook processor should be
backed by by-name and by-value maps.

Don't insert a hook if its exact backing method has already been
inserted. This is actually very common when hooks are defined as Python
snippets imported in other scripts too.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 632d98703b New architecture for the assistant speech detection logic.
The assistant object now runs in its own thread and leverages an
external `SpeechProcessor` that uses two threads to scan for both
intents and speech in parallel on audio frames.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 6f8816d23d Prevent a potential recursion error in `wait_for_either`.
We shouldn't overwrite `event._set` and `event._clear` if those values
have already been set.

Those attributes hold the original references to `Event.set` and
`Event.clear` respectively, and the `OrEvent` logic overwrites them with
a callback-based logic.

This shouldn't happen if those attributes are already present.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af1392b5b9 [assistant] Added `ResponseEndEvent` and `IntentMatchedEvent` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb9b6cd319 [assistant.picovoice] Various improvements.
- Added `intent_model_path` parameter.

- Always apply `expanduser` to configuration paths.

- Better logic to infer the fallback model path.

- The Picovoice Leonardo object should always be removed after
  `assistant.picovoice.transcribe` is called.
2024-05-02 00:51:09 +00:00
Fabio Manganiello f0a780b759 Added `assistant.picovoice.transcribe` and `assistant.picovoice.say`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f04f7ce9d7 [tts.picovoice] Better text pre-processing logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 37d70d67ac [assistant.picovoice] Implemented `assistant.picovoice.send_text_query`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello fa1d5eb672 [tts.picovoice] Added text pre-processing workaround.
This workaround is required until
https://github.com/Picovoice/orca/issues/10 is fixed.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a345b12244 [assistant.picovoice] Leverage upstream `_on_mute_changed`.
The plugin should leverage `AssistantPlugin._on_mute_changed` to handle
the boilerplate state managent on mute/unmute actions instead of
re-implementing the same logic.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 2c197c275e [assistant.picovoice] Implemented mic mute/unmute handling. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 9de49c71a1 [assistant.picovoice] Conversation flow improvements.
- The `Responding` state should be modelled as an extra event/binary
  flag, not as an assistant state. The assistant may be listening for
  hotwords even while the `tts` plugin is responding, and we don't want
  the two states to interfere with each either - neither to build a more
  complex state machine that also needs to take concurrent states into
  account.

- Stop any responses being rendered upon the `tts` plugin when a new
  hotword audio is detected. If e.g. I say "Ok Google", I should always
  be able to trigger the assistant and stop any concurrent audio
  process.

- `SpeechRecognizedEvent` should be emitted even if `cheetah`'s latest
  audio frame results weren't marked as final, and the speech detection
  window timed out. Cheetah's `is_final` detection seems to be quite
  buggy sometimes, and it may not properly detect the end of utterances,
  especially with non-native accents. The workaround is to flush out
  whatever text is available (if at least some speech was detected) into
  a `SpeechRecognizedEvent` upon timeout.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a6f7b6e790 Added more default imports under the `platypush` module root.
These objects can now also be imported in scripts through
`from platypush import <name>`:

- `Variable`
- `cron`
- `hook`
- `procedure`
2024-05-02 00:51:09 +00:00
Fabio Manganiello aa333db05c [assistant.picovoice] More features.
- Added wiring between `assistant.picovoice` and `tts.picovoice`.

- Added `RESPONDING` status to the assistant.

- Added ability to override the default speech model upon
  `start_conversation`.

- Better handling of conversation timeouts.

- Cache Cheetah objects in a `model -> object` map - at least the
  default model should be pre-loaded, since model loading at runtime
  seems to take a while, and that could impact the ability to detect the
  speech in the first seconds after a hotword is detected.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af875c996e Added `tts.picovoice` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a4c911a5d7 Added ffmpeg requirement for `assistant.picovoice`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8193c5702c s/partial_transcript/transcript/g 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8378bee7c6 Refactored `AssistantEvent`.
`AssistantEvent.assistant` is now modelled as an opaque object that
behaves the following way:

- The underlying plugin name is saved under `event.args['_assistant']`.

- `event.assistant` is a property that returns the assistant instance
  via `get_plugin`.

- `event.assistant` is reported as a string (plugin qualified name) upon
  event dump.

This allows event hooks to easily use `event.assistant` to interact with
the underlying assistant and easily modify the conversation flow, while
event hook conditions can still be easily modelled as equality
operations between strings.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a670f01647 [assistant.picovoice] Better partial transcript + flush handling logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 921025be0c `picovoice` -> `assistant.picovoice` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb38f2439c Better integration with the native base API of the assistant plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f7517eb321 [WIP] Added speech detection logic over Cheetah. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a9498ea191 [WIP] Added initial hotword integration. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 44f9c03bf3 [#304] Removed old Picovoice integrations 2024-05-02 00:51:09 +00:00
Fabio Manganiello 98c99c7888
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-17 02:09:18 +00:00
Fabio Manganiello e123463804
[media.chromecast] Refactored implementation.
continuous-integration/drone/push Build is passing Details
Explicitly use a `CastBrowser` object initialized at plugin boot instead
of relying on blocking calls to `pychromecast.get_chromecasts`.

1. It enables better event handling via callbacks instead of
   synchronously waiting for scan batches.

2. It optimizes resources - only one Zeroconf and one CastBrowser object
   will be created in the plugin, and destroyed upon stop.

3. No need for separate `get_chromecast`/`_refresh_chromecasts` methods:
   all the scanning is run continuously, so we can just return the
   results from the maps.
2024-04-17 03:56:45 +02:00
Fabio Manganiello f99f6bdab9
[media.chromecast] Resource clean up + new API adaptations.
continuous-integration/drone/push Build is passing Details
- `pychromecast.get_chromecasts` returns both a list of devices and a
  browser object. Since the Chromecast plugin is the most likely culprit
  of the excessive number of open MDNS sockets, it seems that we may
  need to explicitly stop discovery on the browser and close the
  ZeroConf object after the discovery is done.

- I was still using an ancient version of pychromecast on my RPi4, and I
  didn't notice that more recent versions implemented several breaking
  changes. Adapted the code to cope with those changes.
2024-04-17 02:49:31 +02:00
Fabio Manganiello 4972c8bdcf
Unregister a Zeroconf instance if it already exists before publishing a backend service.
continuous-integration/drone/push Build is passing Details
`mdns` connection are another culprit for the increasing number of open
files in the process.
2024-04-16 00:12:55 +02:00
Fabio Manganiello 33d4c8342d
[#389] Possible fix for "Too many open files" media issue.
continuous-integration/drone/push Build is passing Details
It seems that the process keeps a lot of open connections to Chromecast
devices during playback.

The most likely culprit is the `_refresh_chromecasts` logic.

We should start a `cast` object and register a status listener only if a
Chromecast with the same identifier isn't already registered in the
plugin.
2024-04-15 23:01:10 +02:00
Fabio Manganiello 027bcea612
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-08 21:05:46 +00:00
Fabio Manganiello b4d0716bc5
Added layer of compatibility with both paho.mqtt >= 2.0.0 and < 2.0.0.
See 28aa2e6b26/ChangeLog.txt (L6)
2024-04-08 23:01:54 +02:00
revil-O 584f226b62 mqtt CallbackAPIVersion fix for paho.mqtt >= 2.0.0
fix to work with paho.mqtt >= 2.0.0
2024-04-08 16:05:27 +02:00
Fabio Manganiello dba0acb82e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 18:57:53 +00:00
Fabio Manganiello a026a101cd
Removed `stt.deepspeech` integration.
continuous-integration/drone/push Build is passing Details
The project hasn't seen a commit in three years and it's probably been
abandoned by Mozilla.

New and better maintained speech-to-text integrations will be
investigated.
2024-04-05 20:56:45 +02:00
Fabio Manganiello b00623f655
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-05 02:00:03 +00:00
Fabio Manganiello 03765ad652
[UI] Better style for music widget.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:58:12 +02:00
Fabio Manganiello 96f3420c8e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:47:09 +00:00
Fabio Manganiello c31180dae8
[music.mopidy] Fixed parsing of `new_state` upon `playback_state_changed`.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:46:01 +02:00
Fabio Manganiello b1498bfc28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:41:38 +00:00
Fabio Manganiello 083c9e250e
[music.mopidy] Better handling of client events.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:40:27 +02:00
Fabio Manganiello 88ffc3b795
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-04-05 00:56:48 +00:00
Fabio Manganiello 5f6fd4aa54
Added `--db` CLI option and support for configuration over environment.
continuous-integration/drone/push Build is passing Details
Closes: #280
2024-04-05 02:54:45 +02:00
Fabio Manganiello c8361aa475
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-04 00:53:18 +00:00
Fabio Manganiello 496a3f4911 Updated docs 2024-04-04 00:52:30 +00:00
Fabio Manganiello d2ec93b798 [#297] Removed `music.spotify` backend.
1. I no longer I use a Spotify account (I switched to Tidal after
   Spotify deprecated libspotify), and I wouldn't like to create one
   just to test this integration.

2. After a couple of years, the libspotify open fork (Librespot) seems
   to be still in an unstable stage and it's already been discontinued
   once - I would avoid rebuilding the integration against a dependency
   that may change a lot in the near future.
2024-04-04 00:52:30 +00:00
Fabio Manganiello 73cc47b964
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:57:10 +00:00
Fabio Manganiello 787b6a6af6
[UI] A more consistent light style for the music widget.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:54:52 +02:00
Fabio Manganiello 6f24504cc4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:11:49 +00:00
Fabio Manganiello 5d9a201a5b
[#297] Mopidy/MPD refactor+migration, UI side.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:07:05 +02:00
Fabio Manganiello e2246c8d30
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-03 23:02:09 +00:00
Fabio Manganiello 58518a4d63 Better timeout management on mopidy status refresh. 2024-04-03 23:01:22 +00:00
Fabio Manganiello 5346833152 [WIP] API adaptations for `music.mpd` 2024-04-03 23:01:22 +00:00
Fabio Manganiello 89d618b35f [WIP] `music.mopidy` refactor, initial backend rewrite. 2024-04-03 23:01:22 +00:00
Fabio Manganiello d2e5e5230b [music.mpd] Removed deprecated actions.
- `setvol` ➡️  `set_volume`
- `seekcur` ➡️  `seek`
- `playlistinfo` ➡️  `get_tracks`
- `listplaylists` ➡️  `get_playlists`
- `listplaylist` ➡️  `get_playlist`
- `listplaylistinfo` ➡️  `get_playlist`
- `playlistadd` ➡️  `add_to_playlist`
- `playlistdelete` ➡️  `remove_from_playlist`
- `playlistmove` ➡️  `playlist_move`
- `playlistclear` ➡️  `playlist_clear`
- `rename` ➡️  `rename_playlist`
- `rm` ➡️  `delete_playlist`

stuff
2024-04-03 23:01:22 +00:00
Fabio Manganiello a3b6d411e4 [music.mpd] Adjust default poll_interval: 5 -> 20 seconds. 2024-04-03 23:01:22 +00:00
dependabot[bot] 749eda16b4
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-29 06:46:45 +00:00
dependabot[bot] 2d72ce9645
Bump webpack-dev-middleware in /platypush/backend/http/webapp
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-23 19:14:44 +00:00
dependabot[bot] 8ed358fcc8
Bump follow-redirects in /platypush/backend/http/webapp
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 23:30:25 +00:00
snyk-bot a30042e1eb
fix: upgrade sass from 1.70.0 to 1.71.0
Snyk has created this PR to upgrade sass from 1.70.0 to 1.71.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-08 18:50:38 +00:00
snyk-bot b9d637187c
fix: upgrade core-js from 3.35.1 to 3.36.0
Snyk has created this PR to upgrade core-js from 3.35.1 to 3.36.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 15:26:22 +00:00
snyk-bot 6a55527694
fix: upgrade vue from 3.4.18 to 3.4.19
Snyk has created this PR to upgrade vue from 3.4.18 to 3.4.19.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:43 +00:00
snyk-bot 5488c97f4b
fix: upgrade cronstrue from 2.47.0 to 2.48.0
Snyk has created this PR to upgrade cronstrue from 2.47.0 to 2.48.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:40 +00:00
snyk-bot e12054c484
fix: upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1.

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=referral&page=upgrade-pr
2024-03-06 02:09:36 +00:00
Fabio Manganiello 288344a348
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-05 10:19:13 +00:00
Fabio Manganiello 8f35fbed16
Merge pull request #404 from BlackLight/snyk-upgrade-66089ad9a01450eef161c7e7fac48843
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade axios from 1.6.4 to 1.6.7
2024-03-05 11:15:26 +01:00
Fabio Manganiello 0e8408a83f
Merge branch 'master' into snyk-upgrade-66089ad9a01450eef161c7e7fac48843 2024-03-05 11:15:09 +01:00
Fabio Manganiello 8c0939c308
Merge pull request #405 from BlackLight/snyk-upgrade-785cc8b707ebb00ef02379485bb64589
[Snyk] Upgrade sass-loader from 10.4.1 to 10.5.2
2024-03-05 11:14:19 +01:00
Fabio Manganiello 8c2abf5d9a
Merge branch 'master' into snyk-upgrade-785cc8b707ebb00ef02379485bb64589 2024-03-05 11:14:08 +01:00
Fabio Manganiello f7d651983a
Merge pull request #403 from BlackLight/snyk-upgrade-eaf91feb3c2e9502206ab6258f4f7a06
[Snyk] Upgrade sass from 1.69.3 to 1.70.0
2024-03-05 11:11:29 +01:00
Fabio Manganiello 57f269486c
Merge pull request #402 from BlackLight/snyk-upgrade-7bb8fbc94f3d6132decf153710b18875
[Snyk] Upgrade core-js from 3.33.0 to 3.35.1
2024-03-05 11:11:13 +01:00
Fabio Manganiello 82c8c79778
Merge pull request #401 from BlackLight/snyk-upgrade-6f8a6cdcfdde123a5d036b41986f9966
[Snyk] Upgrade vue from 3.3.6 to 3.4.18
2024-03-05 11:11:00 +01:00
snyk-bot 9de799f6a1
fix: upgrade sass-loader from 10.4.1 to 10.5.2
Snyk has created this PR to upgrade sass-loader from 10.4.1 to 10.5.2.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:51 +00:00
snyk-bot b21a27366c
fix: upgrade axios from 1.6.4 to 1.6.7
Snyk has created this PR to upgrade axios from 1.6.4 to 1.6.7.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:47 +00:00
snyk-bot 50b712a8d3
fix: upgrade sass from 1.69.3 to 1.70.0
Snyk has created this PR to upgrade sass from 1.69.3 to 1.70.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:44 +00:00
snyk-bot aaa38c0f2d
fix: upgrade core-js from 3.33.0 to 3.35.1
Snyk has created this PR to upgrade core-js from 3.33.0 to 3.35.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=referral&page=upgrade-pr
2024-03-04 23:22:40 +00:00
snyk-bot 31222b3f05
fix: upgrade vue from 3.3.6 to 3.4.18
Snyk has created this PR to upgrade vue from 3.3.6 to 3.4.18.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:36 +00:00
Fabio Manganiello 3ebb59ed26
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-04 00:07:15 +00:00
Fabio Manganiello 5c9c9f0a61
[Nav UI] Better alignment of items on the expanded menu.
continuous-integration/drone/push Build is passing Details
2024-03-04 01:05:07 +01:00
Fabio Manganiello 41cbe40362
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-03 22:15:59 +00:00
Fabio Manganiello 0c6d3a5074
Merge pull request #399 from BlackLight/snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad
continuous-integration/drone/push Build is passing Details
[Snyk] Security upgrade axios from 1.6.0 to 1.6.4
2024-03-03 23:13:32 +01:00
Fabio Manganiello f78823981b
Merge pull request #396 from BlackLight/snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9
[Snyk] Upgrade vue from 3.3.4 to 3.3.6
2024-03-03 23:11:29 +01:00
Fabio Manganiello 0dea8c3b44
Merge branch 'master' into snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad 2024-03-03 23:10:22 +01:00
Fabio Manganiello c06d97d9b7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:06:23 +01:00
Fabio Manganiello 0653bcf5b9
Merge pull request #395 from BlackLight/snyk-upgrade-87b37fbfcf86065d749fecde13c6979c
[Snyk] Upgrade vue-router from 4.2.4 to 4.2.5
2024-03-03 23:03:33 +01:00
Fabio Manganiello 085cb1031a
Merge pull request #394 from BlackLight/snyk-upgrade-225081273089712ac56cf6c7af77c223
[Snyk] Upgrade core-js from 3.32.0 to 3.33.0
2024-03-03 23:03:16 +01:00
Fabio Manganiello 27afa90f9d
Merge pull request #393 from BlackLight/snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45
[Snyk] Upgrade sass from 1.65.1 to 1.69.3
2024-03-03 23:02:43 +01:00
Fabio Manganiello 938b8761e7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:02:11 +01:00
Fabio Manganiello 3993a51aed
Merge branch 'master' into snyk-upgrade-87b37fbfcf86065d749fecde13c6979c 2024-03-03 23:00:23 +01:00
Fabio Manganiello 4a6f89582c
Merge branch 'master' into snyk-upgrade-225081273089712ac56cf6c7af77c223 2024-03-03 22:59:38 +01:00
Fabio Manganiello 3019ddfd0e
Merge branch 'master' into snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45 2024-03-03 22:58:06 +01:00
Fabio Manganiello 05213d9afc
Updated docs
continuous-integration/drone/push Build is passing Details
2024-03-03 22:50:57 +01:00
Fabio Manganiello 91943304e1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 21:38:37 +00:00
Fabio Manganiello 2066db463b
[#295] Merged `music.mpd` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #295
2024-03-03 22:37:26 +01:00
Fabio Manganiello e96eae73ec
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 14:41:00 +00:00
Fabio Manganiello 6bdc9e77ee
[#349] Refactored/rewritten `telegram` plugin.
continuous-integration/drone/push Build is passing Details
1. `chat.telegram` -> `telegram` plugin.

2. Merged `backend.chat.telegram` logic into `telegram` plugin.

3. Rewritten the architecture of the integration to adapt to the new
   asyncio API introduced in the latest versions of telegram-bot-api.

Closes: #349
2024-03-03 15:39:47 +01:00
Fabio Manganiello 7637890a54
[irc] Plugin rename/refactor.
The `chat.irc` plugin is now `irc`.
2024-03-03 15:39:47 +01:00
Fabio Manganiello 1ba85231d8
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-01 00:10:21 +00:00
Fabio Manganiello 66e19d608a
Fixed flic events module name and path
continuous-integration/drone/push Build is passing Details
2024-02-29 23:48:10 +01:00
Fabio Manganiello e462f3becf
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:51:02 +00:00
Fabio Manganiello d415d65bff
Removed legacy wiimote plugin
continuous-integration/drone/push Build is passing Details
2024-02-29 00:49:56 +01:00
Fabio Manganiello b30dc7ddb5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:28:39 +00:00
Fabio Manganiello c7b0440562
[#357] Migrated `backend.button.flic` to `flic` plugin.
continuous-integration/drone/push Build is passing Details
Closes: #357
2024-02-29 00:27:32 +01:00
Fabio Manganiello 765ac6143e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:57:12 +00:00
Fabio Manganiello d16daa3fdf
Removed `backend.sensor.ir.zeroborg`.
continuous-integration/drone/push Build is passing Details
That code is very old and broken, and it covers a very marginal feature
(events from the IR sensor of a Zeroborg board) that can be easily
covered by any general-purpose IR sensors.
2024-02-28 01:56:06 +01:00
Fabio Manganiello b46d3da5de
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:50:56 +00:00
Fabio Manganiello f1e568d6c8
FIX: Fixed refactored plugin name
continuous-integration/drone/push Build is passing Details
2024-02-28 01:49:52 +01:00
Fabio Manganiello ef5c65ff4d
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:45:11 +00:00
Fabio Manganiello ac9b82236e
Renamed `http.request` plugin as `http`.
continuous-integration/drone/push Build is passing Details
2024-02-28 01:44:04 +01:00
Fabio Manganiello d0d80c1edf
Removed old backend.http.request.* files 2024-02-28 01:44:04 +01:00
Fabio Manganiello 3e4b7ac1b5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:28:53 +00:00
Fabio Manganiello 553c4090b7
[#309] Remove `wiimote` integration.
continuous-integration/drone/push Build is passing Details
The `cwiid` library and the Python bindings haven't been updated in
years, the `cwiid-git` package on Arch Linux still targets Python 2, and
installing `cwiid` via `pip` breaks recent versions of Python 3.

Closes: #309
2024-02-28 01:25:49 +01:00
Fabio Manganiello 7ccbf9347f
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-27 22:19:30 +00:00
Fabio Manganiello ea4e293338 [#352] Migrated `backend.sensor.leap` to `leap` plugin.
Closes: #352
2024-02-27 22:18:41 +00:00
Fabio Manganiello fc45b606ab Removed (currently) incomplete paragraph from README 2024-02-27 21:41:39 +00:00
Fabio Manganiello d77aa0b167 Removed legacy `backend.scard`.
Closes: #303
2024-02-27 21:39:02 +00:00
Fabio Manganiello 07dfc19bf5 Added `nfc.status` action. 2024-02-27 21:39:02 +00:00
Fabio Manganiello 99f9737211
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 23:55:43 +00:00
Fabio Manganiello 850cbe4237
Updated docs
continuous-integration/drone/push Build is passing Details
2024-02-27 00:53:27 +01:00
Fabio Manganiello dfaa5447ac
[#299] Refactored NFC backend into a runnable plugin. 2024-02-27 00:53:26 +01:00
Fabio Manganiello bbf755eef2
[#299] Refactored NFC backend into a runnable plugin.
continuous-integration/drone/push Build is passing Details
2024-02-27 00:10:15 +01:00
Fabio Manganiello c7c31fb48d
Log the canonical name of plugins when starting them. 2024-02-27 00:02:30 +01:00
Fabio Manganiello 5ab66e6746
[UI] Render docs link on `ExtensionIcon` only on docs panel.
continuous-integration/drone/push Build was killed Details
2024-02-26 23:47:07 +01:00
Fabio Manganiello 8079b08a54
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 20:36:57 +00:00
Fabio Manganiello f8e0b5e17e
[#366] Context variables should be dynamically assigned through `locals()` instead of `exec()`.
continuous-integration/drone/push Build is passing Details
Closes: #366
2024-02-26 21:29:35 +01:00
Fabio Manganiello 6c2e9deda4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 20:11:46 +00:00
Fabio Manganiello 6de9f741f0
[UI] Use extension icons also for menu entries.
continuous-integration/drone/push Build is passing Details
2024-02-26 21:09:36 +01:00
Fabio Manganiello e7c1e2f44e
[UI] Added icons to plugins and backends. 2024-02-26 17:39:19 +01:00
Fabio Manganiello 2d8c34522f
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:57:55 +00:00
Fabio Manganiello 5961b08387
[Carousel UI] Removed margin
continuous-integration/drone/push Build is passing Details
2024-02-26 01:55:49 +01:00
Fabio Manganiello d6ea4a1c42
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 00:29:32 +00:00
Fabio Manganiello e58f5d2fa1
[Camera] The `wait_for_either` barrier should be enabled on streaming by default.
continuous-integration/drone/push Build is passing Details
`camera.pi*` plugins are an exception, as they handle the lifecycle of
the camera streaming process through the `picamera*` libraries.

Otherwise, the streaming thread should explicitly wait on either the
plugin stop or streaming stop events and exit accordingly, or the camera
thread may be streaming indefinitely.
2024-02-26 01:28:25 +01:00
Fabio Manganiello 56a04975ae
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:20:42 +00:00
Fabio Manganiello 9df08de24f
[Carousel UI] Replaced `blur` filter with `brightness` for background.
continuous-integration/drone/push Build is passing Details
It's much less expensive on the CPU side, and the effect is similar.

Closes: #359
2024-02-26 01:18:51 +01:00
Fabio Manganiello 18f2c26725
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:12:19 +00:00
Fabio Manganiello 195a4b58b9
[chore] Updated caniuse db
continuous-integration/drone/push Build is passing Details
2024-02-25 23:10:15 +01:00
Fabio Manganiello 4ebc29a151
[UI] Added icon for `camera.pi.legacy` web panel. 2024-02-25 23:10:14 +01:00
Fabio Manganiello b246fbe328
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:08:34 +00:00
Fabio Manganiello 31528e3c0e
[UI] Added `camera.pi.legacy` web panel.
continuous-integration/drone/push Build is passing Details
2024-02-25 23:06:24 +01:00
Fabio Manganiello b6bd86794b
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-25 20:42:51 +00:00
Fabio Manganiello 9445bd4dc4
Added `config.yaml` example/docs for camera streaming configuration.
continuous-integration/drone/push Build is passing Details
2024-02-25 21:39:12 +01:00
Fabio Manganiello 1c14450781 FIX: Remove `wait_for_either` barrier from the streaming thread.
continuous-integration/drone/push Build is passing Details
The `_accept_client` logic will be executed anyway at the next
iteration, unless the server socket is closed - in that case, the thread
will fail and exit anyway.

The `wait_for_either` barrier in the streaming thread may instead
prevent other connections from being established after the first one is
closed.
2024-02-25 16:02:52 +01:00
Fabio Manganiello 4c92bdd11c
FIX: Handle `stop_streaming` exceptions in the main loop of the camera plugin.
continuous-integration/drone/push Build is passing Details
Otherwise camera process teardown errors may bubble up and prevent the
plugin from restarting the streaming.
2024-02-24 21:36:08 +01:00
Fabio Manganiello 8999a226b1
[WIP] Updated documentation for `camera.pi`.
continuous-integration/drone/push Build is passing Details
2024-02-24 21:16:43 +01:00
Fabio Manganiello e46704010b
[WIP] Rewritten `camera.pi.legacy` plugin.
continuous-integration/drone/push Build is passing Details
2024-02-24 14:07:07 +01:00
Fabio Manganiello 9ad9bd20e4
Added `stream_on_start` argument to `camera` plugins.
continuous-integration/drone/push Build is passing Details
It replaces the functionalities of the deprecated `camera` backends.
2024-02-24 01:31:05 +01:00
Fabio Manganiello 9cf95125a6 [WIP] Added streaming support to camera.pi using new picamera2 API
continuous-integration/drone/push Build is passing Details
2024-02-22 22:52:52 +01:00
Fabio Manganiello 659c33837e [WIP] Using new picamera2 module for camera.pi, and moved old picamera integration to camera.pi.legacy
continuous-integration/drone/push Build is passing Details
2024-02-19 00:07:29 +00:00
Fabio Manganiello d0f1ee0582
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-16 23:03:08 +00:00
Fabio Manganiello c59446fdb1
Fixed setting of `output_file` on `FfmpegWriter`.
continuous-integration/drone/push Build is passing Details
Also, fixed parameters passed to camera
writer objects.
2024-02-17 00:01:47 +01:00
Fabio Manganiello a38ef6bc7a Workaround for possible `multiple camera parameter` error.
continuous-integration/drone/push Build was killed Details
2024-02-15 00:51:04 +00:00
Fabio Manganiello 191d7a75ea
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-06 22:29:48 +00:00
Fabio Manganiello 8f7aad2af7
google-assistant-sdk is no longer a dependency for the Google Assistant integration
continuous-integration/drone/push Build is passing Details
2024-02-06 20:08:57 +01:00
Fabio Manganiello 48756e6287
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-05 01:19:21 +00:00
Fabio Manganiello 2b595623b3
[#348] Converted `gps` backend into a plugin.
continuous-integration/drone/push Build is passing Details
Closes: #348
2024-02-05 02:16:02 +01:00
Fabio Manganiello 8351463a11
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:11:01 +00:00
Fabio Manganiello c8944feca4 [#348] Merge + refactor for the `mail` backend/plugin (#362)
continuous-integration/drone/push Build is passing Details
Closes: #348

Reviewed-on: #362
2024-02-03 22:09:40 +01:00
Fabio Manganiello 5badc935ac
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:08:07 +00:00
Fabio Manganiello 7d362cae1a
FIX: Redis pub/sub error can also raise a `ValueError` on close.
continuous-integration/drone/push Build is passing Details
2024-02-03 22:06:36 +01:00
Fabio Manganiello 39d5c48088
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 20:59:26 +00:00
Fabio Manganiello 746423a113 [#356] Merged `adafruit.io` plugin and backend. 2024-01-19 20:58:35 +00:00
Fabio Manganiello f21a1dd8e6
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 02:15:39 +00:00
Fabio Manganiello eb47f9ded0 [#351] Merged `google.pubsub` plugin and backend.
Closes: #351
2024-01-19 02:14:49 +00:00
Fabio Manganiello 2e9cb44caf
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 00:50:24 +00:00
Fabio Manganiello 1323156838
Fixed `google.credentials` script order of arguments in the docstring.
continuous-integration/drone/push Build is passing Details
2024-01-19 01:48:33 +01:00
Fabio Manganiello a5b7e2b52e
[CI/CD] Fixed version format for the `platypush-git` Arch package.
continuous-integration/drone/push Build is passing Details
The format should be `<MAJ>.<MIN>.<PATCH>.r<REVISION>.g<HEAD>`.

The `g` prefix was missing.
2024-01-19 01:06:47 +01:00
Fabio Manganiello aceb9b940a
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 23:32:23 +00:00
Fabio Manganiello 6775208b2e Fixed minor docstring typo. 2024-01-18 23:31:27 +00:00
Fabio Manganiello f9bd5b3abc [#350] Merge `google.fit` backend and plugin.
Closes: #350.
2024-01-18 23:31:27 +00:00
Fabio Manganiello e3c04d9316 Fixed bullet points indentation in Google plugins docstrings. 2024-01-18 23:31:27 +00:00
Fabio Manganiello e022712b7b [Google] Updated authorization flow for Google plugins.
The new authorization flow also requires the user to input a code
returned on the browser's authorization page.

Since the Google authentication libraries seem to use a simple `input()`
to read this code, things are likely to fail quite badly if Platypush is
run in non-interactive mode - e.g. through a systemd service or in a
Docker container.

Thus we need to go with Google's automatic flow only if `DISPLAY` or
`BROWSER` are set (thus the interactive flow can proceed), and throw an
`AssertionError` with the command to execute if no display/browser are
detected.
2024-01-18 23:31:27 +00:00
Fabio Manganiello 31de917631 [Google] Updated documentation of Google plugins.
Expanded explanation of the desktop vs. headless authentication process
and where the credential files are supposed to be copied if the user
opts for a non-automatic authentication flow.
2024-01-18 23:31:27 +00:00
Fabio Manganiello dec2a54740
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 23:29:13 +00:00
Fabio Manganiello 998b7be7b8
[media.vlc] Always add `--play-and-exit` to args.
continuous-integration/drone/push Build is passing Details
Without this option VLC seems to hang in the background, and it may
cause PulseAudio failures or memory issues after several videos have
been played - each in its own session.
2024-01-18 21:21:15 +01:00
Fabio Manganiello a47f9f1852
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 01:29:46 +00:00
Fabio Manganiello 95c15f3f5f [#347] Merge `kafka` backend and plugin.
Closes: #347
2024-01-18 01:28:56 +00:00
Fabio Manganiello a596ed80a2
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-17 23:27:34 +00:00
Fabio Manganiello 1c5956c38b
Fixed some docstring warnings.
continuous-integration/drone/push Build was killed Details
2024-01-18 00:26:22 +01:00
Fabio Manganiello 85db77bb7b
[#298] Merged `nextcloud` backend and plugin.
Closes: #298
2024-01-18 00:26:22 +01:00
Fabio Manganiello dd5bc7639b
Added `disable_monitor` flag to `RunnablePlugin`.
This is useful when users want to use a runnable plugin in a stateless
way. In some cases (for example systems with high latency or limited
quotas for API calls) the user may want to leverage the actions of a
plugin, but without running monitoring/polling logic nor generating
events.
2024-01-18 00:26:22 +01:00
Fabio Manganiello fb91be7628
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-15 23:56:02 +00:00
Fabio Manganiello e9d91471ce
[media.mplayer] Plugin rewrite.
continuous-integration/drone/push Build is passing Details
Too many things were falling apart, and many others of MPlayer's "API
smells" had never been addressed.

The plugin has now largely been rewritten, and some workarounds (like
accessory monitoring processes) have been added to deal with the fact
that events like end-of-file aren't published by the player, and some
polling is required.
2024-01-16 00:41:01 +01:00
Fabio Manganiello ca25b3a4e6
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-15 23:39:51 +00:00
Fabio Manganiello 3598253558
Reduced Docker images to a single layer.
continuous-integration/drone/push Build is passing Details
2024-01-15 21:54:22 +01:00
Fabio Manganiello bf1b8aaf70
Delete pubsub closure to `_pubsub_close()`.
The Redis channel may be closed, and in that case we need to handle the
exception instead of throwing it - which causes the upstream Tornado
worker to fail too.
2024-01-14 21:27:08 +01:00
Fabio Manganiello 6fe1ed44ad
[media] Fixed base interface of `media.seek` and `media.set_position`. 2024-01-13 22:39:33 +01:00
Fabio Manganiello cf314f2615
[mpv] Refactored plugin.
I hadn't paid attention to this plugin in a while and the newest mpv API
has diverged so much that it was entirely incompatible with recent mpv
versions.
2024-01-13 22:36:42 +01:00
Fabio Manganiello 641a2fd135
Renamed parameter of `volup`/`voldown` for music plugins.
To be consistent with all other media plugins, the parameter name should
be `step`, not `delta`.

A back-compatibility layer has however been introduced for plugins
(namely `music.mpd` and `music.spotify`) that already exposed the old
interface.
2024-01-13 22:35:18 +01:00
Fabio Manganiello f0dcb94862
[pushbullet] Fixed `on_error` callback on the listener.
The `Listener` class from the `pushbullet.py` library is a mess, and it
has two internal functions to handle errors.
2024-01-13 13:24:47 +01:00
Fabio Manganiello 18bba7e3bf
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-09 23:47:38 +00:00
Fabio Manganiello 9fa5989e21 [#302] Merged `pushbullet` backend and plugin.
Also, added support for more granular Pushbullet events.

Closes: #302
2024-01-09 23:46:07 +00:00
Fabio Manganiello 4e1943d197
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-08 22:04:48 +00:00
Fabio Manganiello 4505c46071
[Sound] Don't override device index if it's already defined in the info.
continuous-integration/drone/push Build is passing Details
2024-01-08 23:03:08 +01:00
Fabio Manganiello b097a4c1f4
Remove also the dist directory in the build-ui step before running npm run build
continuous-integration/drone/push Build is passing Details
2024-01-08 22:56:05 +01:00
Fabio Manganiello bb2f86f1a5
An empty commit to re-trigger the CI/CD pipelines
continuous-integration/drone/push Build is passing Details
2024-01-08 22:38:31 +01:00
Fabio Manganiello 314e1a98ef
Updated dist files
continuous-integration/drone/push Build is failing Details
2024-01-08 22:35:57 +01:00
Fabio Manganiello deaedf2462
[Media UI] Don't display the torrent menu entry if no torrent plugin is enabled.
continuous-integration/drone/push Build was killed Details
2024-01-08 22:25:10 +01:00
Fabio Manganiello 5ef7313bdc
[Music UI] Use the `Playlist` component also for playlist editors. 2024-01-08 22:17:04 +01:00
Fabio Manganiello e881fedc59
[Automatic] Updated UI files
continuous-integration/drone/push Build was killed Details
2024-01-08 01:46:55 +00:00
Fabio Manganiello 3282588c6e
[Music UI] Many improvements to the interface.
continuous-integration/drone/push Build was killed Details
2024-01-08 02:44:53 +01:00
Fabio Manganiello 80c2f0d8dd
[UI] Full restyle of `Slider` component.
The component has been rewritten using only CSS 3 and no JS.
2024-01-08 02:44:52 +01:00
Fabio Manganiello b785609eda
[Music UI] New music nav logic.
Don't display the vertical nav on mobile by default - same logic as the
generic media nav.
2024-01-08 02:44:52 +01:00
Fabio Manganiello f59a276e09
[Media UI] Set `overflow: auto` on the innermost grid div only.
If a parent object of the `grid` DOM element has `overflow: auto` as
well, then it will intercept the `@scroll` events, so `Results` won't be
able to render an infinite scroll.
2024-01-08 02:44:52 +01:00
Fabio Manganiello 9f6ac4acd1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:53:33 +00:00
Fabio Manganiello 3d2ee5d6bb
Replaced some new typing `|` notations with `Union`.
continuous-integration/drone/push Build is passing Details
The `|` notation breaks on Python < 3.10.
2024-01-07 00:52:24 +01:00
Fabio Manganiello 1cd328ef44
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:32:55 +00:00
Fabio Manganiello c64c28f7a8
(Re)-added `backend/sensor/__init__.py` file.
continuous-integration/drone/push Build is passing Details
If the empty file is missing then any remaining backends under that
package won't be indexed.
2024-01-07 00:31:45 +01:00
Fabio Manganiello f9e5117145
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:07:31 +00:00
Fabio Manganiello f733c6318f
Moved optional import in constructor block.
continuous-integration/drone/push Build is passing Details
2024-01-07 00:05:51 +01:00
Fabio Manganiello 1ff8cfd240
[CI/CD] A more robust logic to regenerate `components.json.gz`.
continuous-integration/drone/push Build is passing Details
We shouldn't rely on `git diff`. Even when the underlying source code
hasn't changed, and the cache is dumped with `sort_keys=True`, some of
the generated snippets of docstrings may change, leading the CI/CD
pipeline to get stuck in a push loop.

We should instead look for changes to the plugins, backends, events and
schemas folders before and after the CI/CD trigger to infer if we need
to regenerate the file.
2024-01-06 23:45:51 +01:00
Fabio Manganiello e803807b8d
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:51:43 +00:00
Fabio Manganiello edd92b8467
Fix: Ensure that components cache keys are ordered before dumping to file.
continuous-integration/drone/push Build is passing Details
Reason: The CI/CD automation regenerates the cache file, and commits
the changes if it differs from the previous version.

The only way to ensure semantic equivalence is to sort the keys upon
dump.
2024-01-06 22:50:34 +01:00
Fabio Manganiello 0f130235d3
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:46:12 +00:00
Fabio Manganiello 4926f28f24
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:45:04 +00:00
Fabio Manganiello bb6f859262
Fix: typo in git commit argument.
continuous-integration/drone/push Build is passing Details
2024-01-06 22:43:38 +01:00
Fabio Manganiello cce04ef729
Updated components file
continuous-integration/drone/push Build is failing Details
2024-01-06 22:41:25 +01:00
Fabio Manganiello f85fc02cce
Fix: git should be installed earlier in the update-components-cache step. 2024-01-06 22:41:25 +01:00
Fabio Manganiello 771ecd9a5b
Fixed typo in the package name of the Github manifest. 2024-01-06 22:41:24 +01:00
Fabio Manganiello 30bbc396fb
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2024-01-06 21:27:39 +00:00
Fabio Manganiello 6e1ab92298
New components cache management.
continuous-integration/drone/push Build is passing Details
The cache is no longer generated at runtime when the application runs -
which may take quite a while, especially on fresh installations.

A `components.json.gz` file is instead generated by the CI/CD process on
every commit to the main branch, and distributed with the package.

The application will read this file when the `inspect` plugin is first
initialized.

This also means that we can no longer cache the `install_cmds`, as they
change depending on the target OS. A new
`application.get_install_commands` action has now been made available to
the UI, so it can get the correct installation commands at runtime.
2024-01-06 22:21:59 +01:00
Fabio Manganiello ef885e096f
Added `inspect.get_pkg_managers` internal action.
It will be used by the UI to put together the installation commands.
2024-01-06 03:02:31 +01:00
snyk-bot c6593cfa06
fix: platypush/backend/http/webapp/package.json & platypush/backend/http/webapp/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-AXIOS-6144788
2024-01-05 14:12:29 +00:00
Fabio Manganiello e1b6be7673
Marshmallow has replaced `field.default` with `field.dump_default`.
continuous-integration/drone/push Build is passing Details
2024-01-05 02:56:10 +01:00
Fabio Manganiello 8fd5009553
[foursquare] Proper cast to number for db variables which may be strings. 2024-01-05 02:56:10 +01:00
Fabio Manganiello 5167597ace
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-05 01:27:29 +00:00
Fabio Manganiello afee6c5c85
[music UI] Implemented infinite scroll for playlist view.
continuous-integration/drone/push Build is passing Details
Instead of loading all the tracks in the DOM (very inefficient and slow
on slow devices and/or with big playlists), we should keep a window of
100 items in the screen and roll it over the playlists as the status
change or the user scrolls.
2024-01-05 02:19:38 +01:00
Fabio Manganiello dbae2ccc40
Added Redis db dump files to .gitignore 2024-01-04 23:32:03 +01:00
Fabio Manganiello 1e45aa5de9
A more robust logic to wait for the app to start in the tests.
continuous-integration/drone/push Build is passing Details
2024-01-04 23:24:25 +01:00
Fabio Manganiello 91a8fd3b56
[system] A more robust logic to parse cache size from `cpuinfo`.
continuous-integration/drone/push Build is passing Details
2024-01-04 13:55:08 +01:00
Fabio Manganiello 9c3da7a2a9
Several improvements for request/procedure execution.
continuous-integration/drone/push Build is passing Details
- Fixed regression introduced by incorrect format string in `exec`.

- LINT for the `procedure` module.

- Apply `Message.Encoder` when dumping values from the context.
2024-01-04 13:13:16 +01:00
Fabio Manganiello b72fb83d18
Merge branch '286/merge-foursquare-backend'
continuous-integration/drone/push Build is passing Details
2024-01-01 23:00:55 +01:00
Fabio Manganiello 4aeff10a5d
[#286] Merge Foursquare backend and plugin.
continuous-integration/drone/push Build is passing Details
Closes: #286
2024-01-01 22:54:18 +01:00
Fabio Manganiello efe46386f4
[Entities UI] Reverted `.extension-container` max-width.
continuous-integration/drone/push Build is passing Details
2024-01-01 14:27:18 +01:00
Fabio Manganiello b8f8236c28
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-01 13:24:56 +00:00
Fabio Manganiello 35772c0ae3 [Entities UI] Reverted `.extension-container` max-width. 2024-01-01 13:23:24 +00:00
Fabio Manganiello 3fbb0d289b Fixed docstring 2024-01-01 13:23:24 +00:00
Fabio Manganiello 7f13e02803
Fixed docstring 2023-12-31 04:34:42 +01:00
Fabio Manganiello 61d1abf6aa Merge pull request '287/github-backend-migration' (#342) from 287/github-backend-migration into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #342
2023-12-30 16:33:05 +01:00
Fabio Manganiello 1abf8c964a
Merge branch 'master' into 287/github-backend-migration
continuous-integration/drone/push Build is passing Details
2023-12-30 16:29:51 +01:00
Fabio Manganiello 5eb09eab1a [#287] Migrated `github` from a backend to a runnable plugin.
Closes: #287
2023-12-30 15:28:16 +00:00
Fabio Manganiello 2701f69d17
[#287] Migrated `github` from a backend to a runnable plugin.
Closes: #287
2023-12-30 16:28:12 +01:00
Fabio Manganiello a2a07afc05
[UI] Better default scrollbar width on Webkit.
continuous-integration/drone/push Build is passing Details
2023-12-30 13:41:45 +01:00
Fabio Manganiello 0fb1035331
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-30 12:38:57 +00:00
Fabio Manganiello 12a043d67e
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-30 03:39:44 +00:00
Fabio Manganiello 57737b1b72
[Entities UI] Don't disable/set loading=true on properties during initial refresh.
continuous-integration/drone/push Build is passing Details
2023-12-30 04:42:51 +01:00
Fabio Manganiello 5bec01a389
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-29 23:04:08 +00:00
Fabio Manganiello 2c429e9003
[Music UI] Fixed alignment of buttons in the playlist header.
continuous-integration/drone/push Build is passing Details
2023-12-30 00:06:56 +01:00
Fabio Manganiello e3ea315276
[CI/CD] Create a .skipci file on `build-ui`.
If new commits are pushed by the step then another pipeline will be
triggered. We shouldn't proceed with the following steps.
2023-12-30 00:04:35 +01:00
Fabio Manganiello 2575d6cbc5
[Extensions UI] Fix `hljs.highlight` call to match new API. 2023-12-30 00:04:31 +01:00
Fabio Manganiello 7e58044804
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-29 03:04:26 +00:00
Fabio Manganiello 171ed7f743
[Entities UI] Better refresh logic.
continuous-integration/drone/push Build is passing Details
2023-12-29 03:45:17 +01:00
Fabio Manganiello 6673bb4c19
[CI/CD] Always copy new apt repo root.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:53:54 +01:00
Fabio Manganiello 581fe6101f
[CI/CD] Debug pipeline by printing content of Packages file.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:45:34 +01:00
Fabio Manganiello 4b4a8c7aaa
[CI/CD] Another fix.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:40:56 +01:00
Fabio Manganiello a50ea8dd8e
[CI/CD] Change order of deb cleanup commands.
continuous-integration/drone/push Build was killed Details
2023-12-26 05:39:25 +01:00
Fabio Manganiello 15c1ac3823
[CI/CD] Clean up any existing *.deb packages before uploading new one.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:36:29 +01:00
Fabio Manganiello f3f1e96ad9
[CI/CD] Attempt to fix empty `branch_dir`.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:21:46 +01:00
Fabio Manganiello 89757d4366
[CI/CD] A more robust way of detecting the presence of a main version package.
continuous-integration/drone/push Build is passing Details
2023-12-26 05:08:21 +01:00
Fabio Manganiello 995077eea7
[CI/CD] Fixed off-by-one version number issue. 2023-12-26 04:37:05 +01:00
Fabio Manganiello e8a337752a
[CI/CD] Print names of generated deb packages.
continuous-integration/drone/push Build is passing Details
2023-12-25 15:14:18 +01:00
Fabio Manganiello 2546a582d2
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-25 12:44:31 +00:00
Fabio Manganiello ce1e8513d4 [music UI] Several UI improvements 2023-12-25 12:43:00 +00:00
Fabio Manganiello be54469df0 [music UI] Fixed search form. 2023-12-25 12:43:00 +00:00
Fabio Manganiello 290f98a74f Empty commit to trigger the build pipeline. 2023-12-25 13:31:10 +01:00
Fabio Manganiello 0de322fb95
[assistant.google] Propagate plugin name as a string to events.
continuous-integration/drone/push Build is passing Details
This also makes it easier to programmatically stop conversations on
`SpeechRecognizedEvent` with a matched phrase.
2023-12-21 00:28:27 +01:00
Fabio Manganiello 199b42584f
Updated reference configuration sample for `alarm`.
continuous-integration/drone/push Build is passing Details
2023-12-18 14:05:35 +01:00
Fabio Manganiello b107496fbd
[Automatic] Updated UI files
continuous-integration/drone/push Build was killed Details
2023-12-18 12:56:41 +00:00
Fabio Manganiello 9cad27335d
[UI] Attribute sort.
continuous-integration/drone/push Build was killed Details
2023-12-18 13:53:09 +01:00
Fabio Manganiello 2e1ed9b176
pip on Alpine now also requires --break-system-packages
continuous-integration/drone/push Build was killed Details
2023-12-18 13:50:02 +01:00
Fabio Manganiello cfc7a5a6a0
[alarm] Added `media_repeat` configuration.
continuous-integration/drone/push Build is failing Details
2023-12-18 13:46:45 +01:00
Fabio Manganiello 52fd64a162
[alarm] Added `dismiss_interval` configuration. 2023-12-18 03:01:27 +01:00
Fabio Manganiello 250858fe99
[Alarm UI] Added snooze/dismiss modal when alarm is running. 2023-12-18 01:36:58 +01:00
Fabio Manganiello aff02e0732
[alarm] Include `type='alarm'` in `Alarm.to_dict()`.
This is for compatibility with other backend/frontend components who
expect valid entities on events or responses, and hence may break if
`type` is not specified.
2023-12-18 01:13:46 +01:00
Fabio Manganiello 29f65371d8
[Alarm UI] Support for adding/removing alarms. 2023-12-18 00:12:16 +01:00
Fabio Manganiello e617a9fe82
[alarm] Added `alarm.delete`. 2023-12-18 00:05:34 +01:00
Fabio Manganiello b7423e1c34
Added `AlarmEditor` component. 2023-12-17 17:53:38 +01:00
Fabio Manganiello 430a111303
[alarm] Better default actions inference in `alarm.edit`. 2023-12-17 17:53:08 +01:00
Fabio Manganiello b0feb8ed8f
[UI] Fixed regex match for initSelectedPanel. 2023-12-17 17:52:43 +01:00
Fabio Manganiello 9d456281a6
[Entities UI] Removed unrequired z-index on header. 2023-12-17 17:52:15 +01:00
Fabio Manganiello 5972c728a4
[Chore] Upgraded `hljs.highlight` API.
The old API, (lang, code, ...args), is now deprecated.
2023-12-16 23:49:25 +01:00
Fabio Manganiello b916c98b70
[ProcedureEditor] Emit `input` upon action changes. 2023-12-16 23:29:57 +01:00
Fabio Manganiello 1bd2361a3d
[TimeInterval] Refresh value on `mounted`. 2023-12-16 23:27:22 +01:00
Fabio Manganiello d4543c2fb7
Added `ProcedureEditor` component. 2023-12-16 19:03:46 +01:00
Fabio Manganiello 07a144aadc
[ActionTile] Support for drag and drop. 2023-12-16 19:00:04 +01:00
Fabio Manganiello 837007132d
[FloatingButton] Better default colors. 2023-12-16 18:59:30 +01:00
Fabio Manganiello 3bc27a505f
[UI] setUrlArgs should remove args when value == null. 2023-12-16 18:58:31 +01:00
Fabio Manganiello 065f7d74a5
[ActionTile] Better hover style. 2023-12-16 14:23:46 +01:00
Fabio Manganiello 63767cb87c
[UI] Added `ActionTile` component. 2023-12-16 14:14:34 +01:00
Fabio Manganiello 7fcffe899e
[ActionEditor] Support for action save/input events. 2023-12-16 14:13:11 +01:00
Fabio Manganiello f9ba4564e7
[Tabs UI] Force height to `$tab-height`. 2023-12-16 14:12:30 +01:00
Fabio Manganiello 028f48ed49
[Autocomplete UI] Better handling of `blur` events. 2023-12-16 14:09:04 +01:00
Fabio Manganiello 1dfbe0c12d
Ability to specify a custom initial action for the `ActionEditor`. 2023-12-14 22:22:10 +01:00
Fabio Manganiello 8bbafd2f7d
Better logic on the UI to parse the current URL fragment arguments. 2023-12-13 21:56:34 +01:00
Fabio Manganiello 9beb10c373
Extracted `ActionEditor` from the `Execute` plugin.
So it can be reused in other components that need to handle actions.
2023-12-12 23:33:16 +01:00
Fabio Manganiello 4e85087c0f
Added `AlarmEditor` component to `Alarm`. 2023-12-12 22:52:11 +01:00
Fabio Manganiello d4f6d174c8
Added `FileSelector` UI component. 2023-12-12 21:13:55 +01:00
Fabio Manganiello bac06e9e7b
Added `TimeInterval` component. 2023-12-12 00:05:46 +01:00
Fabio Manganiello 6edb8c8318
[#340] s/datetime.fromisoformat/dateutil.parser.isoparse/
We may receive JavaScript timestamps with non-standard `Z` suffix too.
2023-12-11 22:24:55 +01:00
Fabio Manganiello 6e7c5def2f
`CronEditor` should contain the raw cron expression and a copy button. 2023-12-11 22:18:57 +01:00
Fabio Manganiello 00694f4e10
`CopyButton` events should have a `.prevent` clause. 2023-12-11 22:18:17 +01:00
Fabio Manganiello 61ef48119f
Apply default input rules to `time` and `datetime-local` elements. 2023-12-11 22:17:47 +01:00
Fabio Manganiello 627bb66957
Added `CronEditor` component. 2023-12-11 00:25:24 +01:00
Fabio Manganiello 894faaad1e
[#340] Force a refresh via `alarm.status` when `Alarm` view loads. 2023-12-10 21:53:19 +01:00
Fabio Manganiello b4be56ec2c
[#340] Added `condition_type` field to alarm objects. 2023-12-10 21:52:50 +01:00
Fabio Manganiello e6e4396e49
Enhanced `get_default_media_plugin` to filter by video/audio plugins. 2023-12-10 21:50:53 +01:00
Fabio Manganiello 03c167d6b7
[#340] Added `Alarm.is_cron` property. 2023-12-10 20:58:13 +01:00
Fabio Manganiello 2d8f6102c1
[#340] Added `alarm.edit` action. 2023-12-10 20:39:06 +01:00
Fabio Manganiello 8ddd9879f2
[#340] Alarm model enhancements.
- Allow initialization of alarm actions from `Procedure` objects too.

- Force `state=WAITING` when an alarm is disabled.
2023-12-10 17:56:47 +01:00
Fabio Manganiello 686085750f
[#340] Added configuration snippet for the new `alarm` integration. 2023-12-10 15:45:36 +01:00
Fabio Manganiello dfa0727289
[#340] Added `alarm` UI panel. 2023-12-10 15:33:19 +01:00
Fabio Manganiello 62054e83cc
Remaining entity modal style rules moved from `Entities` to `EntityModal`. 2023-12-10 15:32:42 +01:00
Fabio Manganiello 42574d054a
[#340] Ironed out some bugs in the `alarm` integration.
- The alarm ID should be randomly generated - auto-increment IDs are
  subject to race conditions when alarms are created in separate
  processes.

- Clean up alarms that are not static and have been removed from the db.

- Better alarm shut down detection logic.
2023-12-10 15:30:19 +01:00
Fabio Manganiello ca57d3d7b3
[#340] Initial implementation of the alarm entities UI. 2023-12-09 20:33:11 +01:00
Fabio Manganiello f27e7bb7e2
[#340] Better state management for alarms.
- Added `AlarmEnabledEvent` and `AlarmDisabledEvent`.
- Added `snooze_interval` configurable both at plugin level and alarm
  level.
2023-12-09 17:12:20 +01:00
Fabio Manganiello 34e2a59285
Added optional `id` attribute to `ToggleSwitch`. 2023-12-09 16:12:08 +01:00
Fabio Manganiello 4b578c38c8
[#340] Better state management for alarms. 2023-12-09 14:25:18 +01:00
Fabio Manganiello 9d5c755188
[#340] Alarm integration improvements.
- Emit `EntityDeleteEvent` when an alarm is expired and removed so
  clients can properly synchronize their state.

- `croniter.get_next()` should be timezone-aware.
2023-12-09 13:33:42 +01:00
Fabio Manganiello fcb6b621ab
[#340] Added persistence of alarm entities. 2023-12-09 01:25:12 +01:00
Fabio Manganiello 3ffaaa0eb9
Added `Procedure.to_dict` method.
Also, LINT+black for the `procedure` module.
2023-12-09 01:23:36 +01:00
Fabio Manganiello a6d6fd4067
`Message` objects enhancements.
- Support smart JSON serialization of `Message` objects.
- Added `Message.to_dict` method.
2023-12-09 01:20:20 +01:00
Fabio Manganiello 5ad1a62293
[#340] Merged `alarm` backend into the `alarm` plugin.
Closes: #340
2023-12-06 19:23:19 +01:00
Fabio Manganiello 2670d40094
Added `get_default_media_plugin` utility. 2023-12-06 01:31:05 +01:00
Fabio Manganiello 680de865c4
Minor docstring fix. 2023-12-04 03:09:02 +01:00
Fabio Manganiello 5823dd0e21
[#292] Converted `backend.log.http` to a runnable plugin.
continuous-integration/drone/push Build is passing Details
Closes: #292
2023-12-04 03:03:21 +01:00
Fabio Manganiello 1843ab224b
[#289] Converted `backend.file.monitor` into a runnable plugin.
Closes: #289
2023-12-04 03:03:20 +01:00
Fabio Manganiello d484a34c00
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-12-03 23:34:57 +00:00
Fabio Manganiello d048752184
[#301] Exposing hosts as entities in the `ping` plugin.
continuous-integration/drone/push Build was killed Details
Closes: #301
2023-12-04 00:36:45 +01:00
Fabio Manganiello 3bb7c02572
[#301] Merged `ping` backend and plugin.
Also, removed `ping` response types.
2023-11-24 02:06:53 +01:00
Fabio Manganiello 71ccffa698
[weather.buienradar] Implemented forecast support. 2023-11-23 01:35:58 +01:00
Fabio Manganiello b969afb1cf
Added support for weather forecast events and entities. 2023-11-23 01:35:58 +01:00
Fabio Manganiello 841a28066b
Added support for generic kwargs to `publish_entities`. 2023-11-23 01:35:57 +01:00
Fabio Manganiello ca7c89949b
Only react on `NewWeatherConditionEvent` if `plugin_name` is compatible. 2023-11-23 01:35:57 +01:00
Fabio Manganiello aca71c6bc7 [wallabag] Improved OAuth flow integration.
continuous-integration/drone/push Build is passing Details
If the user provided `username` and `password` in the plugin
configuration, then we should use those credentials to refresh the OAuth
token when expired.
2023-11-22 11:38:00 +01:00
Fabio Manganiello 7bb15b0a03
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-20 02:08:35 +00:00
Fabio Manganiello a0d8c522a2
[#308] Finalized `weather` integrations migration.
continuous-integration/drone/push Build was killed Details
- Migrated `weather.buienradar` integration.
- Removed last leftovers of the previous weather backends and responses.

Closes: #308
2023-11-20 03:10:00 +01:00
Fabio Manganiello 2dac98c56e
More rst fixes. 2023-11-20 03:09:59 +01:00
Fabio Manganiello a798cfa387
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-20 01:42:12 +00:00
Fabio Manganiello 80be79f5e8
Fixed link format.
continuous-integration/drone/push Build is failing Details
2023-11-20 02:43:18 +01:00
Fabio Manganiello bc8730d6f0
[#308] Removed `weather` backend. 2023-11-20 01:54:10 +01:00
Fabio Manganiello b8a4b9e4c5
Implemented support for weather entities. 2023-11-20 01:46:01 +01:00
Fabio Manganiello bf8f31545a
Fixed alignment of entity icon in modal. 2023-11-19 22:33:19 +01:00
Fabio Manganiello b800899859
[#308] Refactored `weather.openweathermap` plugin. 2023-11-19 00:10:10 +01:00
Fabio Manganiello 6108cbb621
Added `Config.get_device_id()` classmethod. 2023-11-18 23:04:19 +01:00
Fabio Manganiello eec2908cc2
Removed DarkSky integration.
The API has gone and it's been merged into Apple Weather.
2023-11-18 21:45:47 +01:00
Fabio Manganiello 674c1036c5
Fixed some plugin usages of `self._bus`.
continuous-integration/drone/push Build is passing Details
Now `_bus` is a common property shared by all the plugins, so it
shouldn't be overloaded.
2023-11-18 16:58:55 +01:00
Fabio Manganiello 8817581061
Removed `-U` option from pip command when installing deps.
continuous-integration/drone/push Build is passing Details
We don't need to forcefully upgrade packages that don't need to be
upgraded.
2023-11-18 16:07:16 +01:00
Fabio Manganiello 869ef38364
Removed explicit `numpy` pip dependency in `assistant.google`.
continuous-integration/drone/push Build is passing Details
It will be installed by the other dependencies anyway.
2023-11-18 16:01:24 +01:00
Fabio Manganiello 6b68fa607b
(Possible) fix for multi-line breaks in apt/index.txt.
continuous-integration/drone/push Build is passing Details
2023-11-18 15:37:17 +01:00
Fabio Manganiello c055edab8f
Moved all list files generation logic within the update-apt-repo step.
continuous-integration/drone/push Build is passing Details
2023-11-18 15:33:22 +01:00
Fabio Manganiello e5ca96e004
Fixed Drone CI command indentation.
continuous-integration/drone/push Build is passing Details
2023-11-18 15:27:34 +01:00
Fabio Manganiello fdaff32cd0
Fixed docstring for `chromecast.status`.
continuous-integration/drone/push Build is failing Details
2023-11-18 14:17:17 +01:00
Fabio Manganiello dcf9561ad1
[CI/CD] Regenerate the Debian repo list files when the repo is rebuilt. 2023-11-18 14:16:49 +01:00
Fabio Manganiello 1a777c6276
Removed Todoist backend and migrated responses to schemas.
continuous-integration/drone/push Build is passing Details
The Todoist Websocket interface is no longer working properly, and I'm
sick of reverse engineering it.

Closes: #305
2023-11-18 10:16:48 +01:00
Fabio Manganiello c2f53b7771
Added `_bus` property on `Plugin`. 2023-11-18 10:13:35 +01:00
Fabio Manganiello f12af08e73
Minor return type fix. 2023-11-17 22:30:30 +01:00
Fabio Manganiello 0f9614506b
[trello] Updated procedure to retrieve the frontend cloud token. 2023-11-17 10:28:27 +01:00
Fabio Manganiello c919cf0cd8
[trello] (Almost) complete plugin rewrite.
continuous-integration/drone/push Build is passing Details
- Merged `trello` plugin and backend into a single plugin.

- Removed legacy `Response` objects, replaced with data classes and
  schemas.

- Fixed the Websocket connection flow to reflect the new authentication
  protocol.

Closes: #307
2023-11-17 02:07:04 +01:00
Fabio Manganiello 39b4483401
Fixed `joystick` manifest.
continuous-integration/drone/push Build is passing Details
2023-11-16 22:08:00 +01:00
Fabio Manganiello e2c72ea24b
Updated docs
continuous-integration/drone/push Build is passing Details
2023-11-16 21:44:59 +01:00
Fabio Manganiello 7bb08bca07
[joystick] Rewritten `joystick` integration as a plugin.
continuous-integration/drone/push Build is passing Details
And removed legacy `joystick*` backends and `inputs` plugin.

Closes: #290
2023-11-16 21:43:56 +01:00
Fabio Manganiello 5e629990e6
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-15 02:04:50 +00:00
Fabio Manganiello d617443af6
[YouTube] Added subscriptions+channels support.
continuous-integration/drone/push Build is failing Details
Closes: #337
2023-11-15 03:05:58 +01:00
Fabio Manganiello 9ed7026aaf
[media UI] Propagate free text filter to all the views. 2023-11-15 03:05:58 +01:00
Fabio Manganiello ae017516c4
[YouTube UI] Support playlist navigation in the media nav. 2023-11-15 03:05:57 +01:00
Fabio Manganiello 4853f51c8b
[YouTube] Added (read-only) playlists support. 2023-11-15 03:05:57 +01:00
Fabio Manganiello b491f81cda
[media UI] Added loading spin overlay upon play. 2023-11-15 03:05:57 +01:00
Fabio Manganiello 9e5728f8ba
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-13 01:39:51 +00:00
Fabio Manganiello 96e69811fe
[#337] Initial YouTube UI with feed support.
continuous-integration/drone/push Build is failing Details
2023-11-13 02:40:50 +01:00
Fabio Manganiello f425e95e7e
[media UI] Show track image if available on desktop+ size. 2023-11-13 02:40:50 +01:00
Fabio Manganiello 60fb7bba5f
[media UI] Added support for generic media providers. 2023-11-13 02:40:50 +01:00
Fabio Manganiello be28965d84
[`youtube`] Added `youtube.get_feed` action. 2023-11-13 02:40:50 +01:00
Fabio Manganiello b63579b81c
[UI] Fixed some glitches of the Dropdown component. 2023-11-13 02:40:49 +01:00
Fabio Manganiello f6c752c80e
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-12 14:59:23 +00:00
Fabio Manganiello 50922cf149
[media UI] Fixed player selector style after Dropdown component changes.
continuous-integration/drone/push Build is failing Details
2023-11-12 15:55:28 +01:00
Fabio Manganiello ca72e22820
[UI] Proxy `/media/*` requests to upstream when Vue is in debug mode. 2023-11-12 15:55:03 +01:00
Fabio Manganiello d4b519a572
[media UI] Wrapped the file browser into a `MediaBrowser` component.
This will make it easier to support multiple media collection providers
other than local files.
2023-11-12 15:54:27 +01:00
Fabio Manganiello 6dfe2324c1
[UI] Added navigation crumbs to the file browser. 2023-11-12 15:53:46 +01:00
Fabio Manganiello 724f625963
[`media.chromecast`] Skip errors on `cast.wait`.
It may be that the cast thread has been recycled and it's already been
awaited. It's safe to skip the error in these cases.
2023-11-12 15:52:31 +01:00
Fabio Manganiello e416a70658
[UI] (Re)-added required `logo-256x256.png` image. 2023-11-12 15:52:07 +01:00
Fabio Manganiello cad36b7911
[UI] Watch the `connected` flag for changes to update the Nav indicator. 2023-11-12 14:00:18 +01:00
Fabio Manganiello 60b5f235a7
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-12 02:08:23 +00:00
Fabio Manganiello 1f321c32dc
[`media.chromecast`] Full plugin rewrite.
continuous-integration/drone/push Build is failing Details
2023-11-12 03:08:54 +01:00
Fabio Manganiello 20aeb0b72e
[`system`] Some versions of `cpuinfo` may return cache sizes in human-readable format.
continuous-integration/drone/push Build is passing Details
2023-11-10 21:55:41 +01:00
Fabio Manganiello 9a090d1b46
[`system`] Cache sizes can also be float, not necessarily int.
continuous-integration/drone/push Build is passing Details
2023-11-10 21:30:56 +01:00
snyk-bot d54970765e
fix: upgrade vue from 3.3.4 to 3.3.6
Snyk has created this PR to upgrade vue from 3.3.4 to 3.3.6.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-10 14:35:37 +00:00
Fabio Manganiello 3d62069775
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-10 01:48:45 +00:00
Fabio Manganiello 1d833d25ab
Updated integrations docs.
continuous-integration/drone/push Build is failing Details
2023-11-10 02:49:29 +01:00
Fabio Manganiello ceae310901
[`snapcast`] Merged backend logic into the plugin.
Closes: #283
2023-11-10 02:48:07 +01:00
Fabio Manganiello 6c3edb73f9
[`music.snapcast`] Fixed message serialization issue.
Closes: #338
2023-11-09 22:46:54 +01:00
Fabio Manganiello 1ec42e11fc
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-09 01:46:44 +00:00
Fabio Manganiello 52ee614ec4
[`media`] Added logic to parse local media metadata.
continuous-integration/drone/push Build is failing Details
2023-11-09 02:47:34 +01:00
Fabio Manganiello a83f4729a6
[UI] Extracted `grid` into `layout.scss`. 2023-11-09 02:47:34 +01:00
Fabio Manganiello 4814c56a2d
[`media` UI] Added resolution to media info. 2023-11-09 02:47:34 +01:00
Fabio Manganiello 90a9684404
[`media` UI] Added extra rating fields to the media info component. 2023-11-09 02:47:33 +01:00
Fabio Manganiello cd635ea69e
[`torrent`] Fixed duration and image for TV series results. 2023-11-09 02:47:33 +01:00
Fabio Manganiello e66ca105d7
[`jellyfin`] Added `duration` field to video results. 2023-11-09 02:47:33 +01:00
Fabio Manganiello d1b721dba5
[`torrent`] Added `image` to search results. 2023-11-09 02:47:33 +01:00
Fabio Manganiello eb7a96ee94
[`youtube`] Added more metadata fields to search results. 2023-11-09 02:47:32 +01:00
Fabio Manganiello d7093d18c5
[`media` UI] Major redesign of the search results. 2023-11-09 02:47:32 +01:00
Fabio Manganiello f7a25a478d
[UI] Dropdown component rewrite.
Dropdown components should always be rendered under the root element, or
nasty effects caused by absolute parenting may end up hiding dropdown
elements regardless of their `z-index`.

The new approach uses a single `<DropdownContainer>` element in the
main `App` file. Each `<Dropdown>` component will push updates to the
bus whenever it triggers open/close events, and the dropdown component
to be rendered will be pushed upstream and rendered in the root element.
2023-11-09 02:47:32 +01:00
Fabio Manganiello fafc1747d6
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-06 23:45:02 +00:00
Fabio Manganiello 3d2dc22ed3
[`media` UI] Improved media UI.
continuous-integration/drone/push Build was killed Details
2023-11-07 00:45:45 +01:00
Fabio Manganiello e7bd61e0d4
Black/LINT for Jellyfin plugin. 2023-11-07 00:45:45 +01:00
Fabio Manganiello a94ddd3f05
[`torrent`] duration * 60 for results returned by PopcornTime API. 2023-11-07 00:45:44 +01:00
Fabio Manganiello 1d41df51e7
[`media`] Extended current track with ytdl metadata if available. 2023-11-07 00:45:44 +01:00
Fabio Manganiello a939cb648c
[`media` UI] Extracted `PlayPauseButton` into its own component. 2023-11-07 00:45:44 +01:00
Fabio Manganiello 7889846cd6
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-06 01:29:16 +00:00
Fabio Manganiello 2caa171c6d
[`media` UI] Fixed alignment of the controls right handle.
continuous-integration/drone/push Build is failing Details
2023-11-06 02:25:54 +01:00
Fabio Manganiello 27da2becd7
[`media`] Added `media.get_info` action.
It combines the `-j` and `-g` options of ytdl* to get both the stream
URL and the track metadata.
2023-11-06 02:25:35 +01:00
Fabio Manganiello e0a9ccca24
[`media UI`] Component refactor.
- Fixed style of the floating control extensions panel.
- Extracted `ProgressBar` and `ExtraControls` into separate components.
2023-11-06 01:54:12 +01:00
Fabio Manganiello 8e8bd7fb9f
[`media UI`] Fixing/refactoring media UI.
- Fixed broken elements in the media control view.
- Fixed volume bar.
2023-11-05 23:45:37 +01:00
Fabio Manganiello 6411688e65
[`youtube`] Don't fail if some items in the response have missing attrs. 2023-11-05 22:12:21 +01:00
snyk-bot 9814292a2e
fix: upgrade vue-router from 4.2.4 to 4.2.5
Snyk has created this PR to upgrade vue-router from 4.2.4 to 4.2.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=referral&page=upgrade-pr
2023-11-05 15:30:06 +00:00
snyk-bot eff126052d
fix: upgrade core-js from 3.32.0 to 3.33.0
Snyk has created this PR to upgrade core-js from 3.32.0 to 3.33.0.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:30:02 +00:00
snyk-bot 3ddac09412
fix: upgrade sass from 1.65.1 to 1.69.3
Snyk has created this PR to upgrade sass from 1.65.1 to 1.69.3.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:29:57 +00:00
Fabio Manganiello daa93f5994
[`media` UI] Fixed style of the Play URL modal. 2023-11-05 12:19:36 +01:00
Fabio Manganiello 71bca662a1
`media.play` should support anything supported by a yt_dlp extractor.
continuous-integration/drone/push Build is passing Details
2023-11-05 02:40:38 +01:00
Fabio Manganiello e45fb9c8ac
Major rewrite of the `media` routes.
continuous-integration/drone/push Build is passing Details
- Streaming and media subtitles endpoints moved from Flask to Tornado
  routes - the old Flask streaming route no longer worked behind a
  Tornado server.

- Storing the streaming state on Redis rather than in a local variable,
  or different Tornado processes may end up with different copies of the
  registry.

Closes: #336
2023-11-05 01:33:36 +01:00
Fabio Manganiello 0e2738d849
Added `_on_error` handler to `StreamingRoute`. 2023-11-05 01:03:40 +01:00
Fabio Manganiello 7c780e6650
Refactored `utils.bus.send_request`.
It should return the response output and raise an error if the response
has errors.
2023-11-04 16:22:27 +01:00
Fabio Manganiello f7fe844296
Black/LINT pass for media handler routes. 2023-11-04 16:13:52 +01:00
Fabio Manganiello 11c3b7820d
[`torrent`] Create `download_dir` if it doesn't exist. 2023-11-04 15:48:05 +01:00
Fabio Manganiello 07e7f06c7a
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-04 11:12:51 +00:00
Fabio Manganiello 2b12984c81
[`youtube`] Full plugin rewrite.
continuous-integration/drone/push Build is failing Details
Instead of relying on the official Google YouTube API (limited, subject
to breaking changes with short/no notice depending on Google's strategy
against scrapers, and with an initial setup that has a high cost), we'll
just stick to Piped from now on.

It's free, it doesn't require API keys, it's unlikely to change, it's
not subject to Google's hostile practices against developers, and
anybody can run an instance.
2023-11-04 12:11:44 +01:00
Fabio Manganiello 44d4ae2a96
[`media`] Made the `youtube-dl` executable configurable.
`youtube-dl` is mostly dead and there are several forks available, thus
we need to give the user the ability to pick which `youtube-dl`
executable fork they want to use.

Among these, `yt-dlp` is probably the most maintained today and it's
also included in many default repos, so it's been added as an extra
requirement for all the media plugins.

Closes: #268
2023-11-04 11:57:09 +01:00
Fabio Manganiello 5478b90288
[Media UI] Start/stop streaming use the configured media plugin.
The base `media` plugin is abstract, hence the `Media` panel needs to
pass the current media plugin to the `Utils` mixins so it can pick the
right action.
2023-11-04 11:54:44 +01:00
Fabio Manganiello b4bf30945a
[`media`] Black/LINT for `MediaPlugin`. 2023-11-04 00:50:08 +01:00
Fabio Manganiello efdb63443d
Renamed the `youtube` plugin.
From `google.youtube` to `youtube`.
2023-11-04 00:07:29 +01:00
Fabio Manganiello 9ac25a7627
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-03 21:24:49 +00:00
Fabio Manganiello 3b335723a9
Merge pull request #387 from BlackLight/snyk-upgrade-7f1672a9074c3d844aa231ad5ba0e90d
continuous-integration/drone/push Build is failing Details
[Snyk] Upgrade core-js from 3.23.4 to 3.31.1
2023-11-03 22:18:22 +01:00
Fabio Manganiello 23bae8e31c
Merge pull request #388 from BlackLight/snyk-upgrade-ae486550d733dccfaf3fab04d0756007
[Snyk] Upgrade vue-router from 4.1.2 to 4.2.3
2023-11-03 22:18:06 +01:00
Fabio Manganiello 8acb4156e0
Merge branch 'master' into snyk-upgrade-7f1672a9074c3d844aa231ad5ba0e90d 2023-11-03 22:11:01 +01:00
Fabio Manganiello 4a43f5ebf6
Merge pull request #391 from BlackLight/snyk-fix-6906c0f651d59befdc6753ce60922592
[Snyk] Security upgrade werkzeug from 2.2.3 to 3.0.1
2023-11-03 22:08:47 +01:00
Fabio Manganiello 664ca7f9b5
Merge branch 'master' into snyk-upgrade-ae486550d733dccfaf3fab04d0756007 2023-11-03 22:07:35 +01:00
Fabio Manganiello 2bb7285c8a
Merge pull request #392 from BlackLight/snyk-fix-ccc0cd6dbbb455def4c5435b5511ae11
[Snyk] Security upgrade axios from 0.21.4 to 1.6.0
2023-11-03 22:06:22 +01:00
Fabio Manganiello 10ec4d39ea
Merge pull request #389 from BlackLight/snyk-upgrade-9420343b82254b8e287940baaf3881aa
[Snyk] Upgrade sass from 1.64.2 to 1.65.1
2023-11-03 22:06:03 +01:00
Fabio Manganiello f5af85ee65
Merge pull request #390 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/babel/traverse-7.23.2
Bump @babel/traverse from 7.22.8 to 7.23.2 in /platypush/backend/http/webapp
2023-11-03 22:03:12 +01:00
Fabio Manganiello f6952f1198
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-11-03 20:56:12 +00:00
Fabio Manganiello 170e37945e [UI] Make sure that a `Modal` never overflows its parent. 2023-11-03 20:54:46 +00:00
Fabio Manganiello 4c5366849d [`torrent`] Updated plugin.
- The default PopcornTime API host has changed, as popcorn-time.ga is no
  longer available.

- The iMDb API now requires a paid tier even for a basic query. The
  official iMDb API layer (and the API key requirement) has thus been
  replaced with a dear ol' scraping of the frontend endpoint.

- Pass of Black/LINT.
2023-11-03 20:54:46 +00:00
Fabio Manganiello 35571b8d13 [UI] Set `max-width` for the media info modal.
This modal can grow very large depending on the size of the media
metadata, thus it's wise to keep its width in check.
2023-11-03 20:54:46 +00:00
Fabio Manganiello 96f2a8f8fc [UI] Set a base `z-index` for the root content canvas.
This allows loading spinners, modals and other components with a real
fullscreen background to stretch over the required space, without being
covered by the navigator or other sibling components.

This also requires the collapsed navigator to have a 1px margin-right,
or its separation border won't be visible.
2023-11-03 20:54:46 +00:00
Fabio Manganiello 266ee3cadf Expose `run` on the base package level.
This enables a syntax like:

```
from platypush import run

run('application.restart')
```
2023-11-03 20:54:46 +00:00
Fabio Manganiello 5e2973dd5f [UI] Removed `<tt>` tag. 2023-11-03 20:54:46 +00:00
Fabio Manganiello ba5d505c9b [`youtube`] Black/LINT pass. 2023-11-03 20:54:46 +00:00
Fabio Manganiello f6cb1fa4a7 Added `utils.get_default_downloads_dir`. 2023-11-03 20:54:46 +00:00
Fabio Manganiello fd1f93799d [An empty commit to re-trigger the CI/CD pipeline] 2023-11-03 20:54:46 +00:00
Fabio Manganiello 81f7eca319 Better styling of the docs. 2023-11-01 02:30:25 +00:00
Fabio Manganiello 0e29e770fb Updated sample config snippet for `tts.mimic3`. 2023-11-01 02:30:25 +00:00
Fabio Manganiello f3fe249ae9 [An empty commit to re-trigger the CI/CD pipeline] 2023-11-01 02:30:25 +00:00
Fabio Manganiello d9c4634ce8 [`tts.mimic3`] Plugin rewrite.
The plugin now leverages the `sound` plugin for playback, like all other
`tts` plugins now do, instead of an external `media` plugin.

This also removes the need for the `/tts/mimic3/say` endpoint.
2023-10-31 00:44:05 +00:00
Fabio Manganiello f960ec4bf4 [`sound`] Plugin refactor.
- Added `input_format`/`output_format` options to both input and output
  audio streams.

- Replaced the previous (confusing) occurrences of `ffmpeg_format` and
  `format`.

- Added custom `dtype` option for `sound.play`.

- Added `join` flag (default: false) to `sound.play` to wait for the
  playback to finish.
2023-10-31 00:44:05 +00:00
Fabio Manganiello d5514d7f27 Added `utils.is_debug_enabled`. 2023-10-31 00:44:05 +00:00
Fabio Manganiello ef3b1d20f2 Updated `MediaPlugin` documentation snippet. 2023-10-31 00:44:05 +00:00
Fabio Manganiello 0cbd0a94d6 tts` plugins should leverage `sound`, not an external media player. 2023-10-31 00:44:05 +00:00
Fabio Manganiello 72b2625425 Updated `tts` plugin dependencies, as they now leverage the `sound` plugin. 2023-10-31 00:44:05 +00:00
Fabio Manganiello 68c73fa181 [`tts.mimic3`] Added timeout to `requests.post` proxy. 2023-10-31 00:44:05 +00:00
Fabio Manganiello faacbfd84f [An empty commit to re-trigger the CI/CD pipeline] 2023-10-31 00:44:05 +00:00
snyk-bot c9ac3e624f
fix: platypush/backend/http/webapp/package.json & platypush/backend/http/webapp/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-AXIOS-6032459
2023-10-27 14:35:27 +00:00
snyk-bot 51a956c607
fix: requirements.txt to reduce vulnerabilities
The following vulnerabilities are fixed by pinning transitive dependencies:
- https://snyk.io/vuln/SNYK-PYTHON-WERKZEUG-6035177
2023-10-26 14:36:06 +00:00
Fabio Manganiello 42912581f9 [Fix] Always initialize `AssistantPlugin._conversation_start_sound`. 2023-10-23 21:30:49 +00:00
Fabio Manganiello 4a881c33d0 [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 21:30:49 +00:00
Fabio Manganiello 23e53f13f0 Removed/commented references to `numpy.typing`.
That module isn't available yet on the numpy version installed on Debian
`oldstable`.
2023-10-23 20:23:57 +00:00
Fabio Manganiello 193314fcd0 [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 20:23:57 +00:00
Fabio Manganiello fc869bf5db [Fix] sounddevice arguments fix.
Different versions of the `sounddevice` dependency may or may not return
the `index` parameter when querying the available sound devices.

Thus, the code should be ready for both cases.
2023-10-23 20:11:14 +00:00
Fabio Manganiello b91d544b89 [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 20:11:14 +00:00
Fabio Manganiello 74ff0f8e33 [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 19:49:16 +00:00
Fabio Manganiello acf0e0f34f [CI/CD] Moved the chmod commands outside of the if. 2023-10-23 19:46:07 +00:00
Fabio Manganiello d7db55cf90 [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 19:46:06 +00:00
Fabio Manganiello 5c857038cf [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 19:40:45 +00:00
Fabio Manganiello f9ce5e3cd2 [CI/CD] chmod should always be the final step in `update-apt-repo`. 2023-10-23 19:38:51 +00:00
Fabio Manganiello 3a5be7211b [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 19:38:51 +00:00
Fabio Manganiello 905ca1855b [An empty commit to re-trigger the CI/CD pipeline] 2023-10-23 19:35:28 +00:00
Fabio Manganiello 532427eeb5 [CI/CD] The chmod section should be on the `update-apt-repo` step. 2023-10-23 19:30:26 +00:00
Fabio Manganiello 4afd1b68d0 [Fix] s/chown/chmod/g typo fix 2023-10-23 19:26:21 +00:00
Fabio Manganiello 8c0c551aa5 [CI/CD] Ensure that public repo dirs are always readable by everyone. 2023-10-23 19:23:23 +00:00
Fabio Manganiello cea3055369 Indent pre- and post-install shell scripts in docs. 2023-10-23 15:48:09 +00:00
Fabio Manganiello 6d694f02b4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-23 14:04:25 +00:00
Fabio Manganiello a005958317
[Assistant] Added `assistant` entity type.
continuous-integration/drone/push Build is passing Details
2023-10-23 16:02:05 +02:00
Fabio Manganiello fd26f7fef3
[UI Nav] Fixed position of the connected status dot. 2023-10-23 15:57:47 +02:00
Fabio Manganiello 5c22271e88
[UI] Expose the `connected` flag on the root element level. 2023-10-23 15:03:36 +02:00
Fabio Manganiello 4c0e3a16b6
Removed Alexa/AVS integration.
The integration was based on my old fork of the AVS service, which is no
longer functional given the changes the the Amazon's backend side.

A new `avs-device-sdk` is now available, but it seems that it requires
lengthy compilation processes which are RaspberryPi-specific.

Further investigation is needed for a new Alexa plugin - see #334.
2023-10-23 00:23:10 +02:00
Fabio Manganiello fb017a8b35
[`assistant.google`] Added doc on how to configure audio devices. 2023-10-22 22:49:41 +02:00
Fabio Manganiello 2c8b06e471
Remove Snowboy integration.
It hurts to see it go, as I really believed in this project.

But the website of the project went away in 2020, the Github project
hasn't seen any activity since 2021, and the fork that is supposed to be
used as a replacement for training .pmdl models hasn't been updated
since 2021 - and it only supports Python 2 on Ubuntu 16.04 or 18.04.

One day I may dedicate some efforts to bring Snowboy back to life, but
until then it's definitely not in a state where it's usable for a
Platypush integration.
2023-10-22 22:33:22 +02:00
Fabio Manganiello 645e8c8f77
Added updated configuration snippet for `assistant.google` plugin. 2023-10-22 21:53:15 +02:00
Fabio Manganiello b46c00f015
Removed deprecated `google.assistant.pushtotalk` plugin.
It only existed as a back-compatibility layer with armv6, since there
was no build of the assistant library that worked on Raspberry Pi Zero.

But that API layer has been discontinued by Google and it's no longer
functional, so only the `assistant.google` integration (on x86_64 and
armv7) is currently supported.
2023-10-22 19:57:55 +02:00
Fabio Manganiello cce6c4c5ad
[#284] Merged `assistant.google` plugin and backend.
This removes the deprecated `assistant.google` backend and also adds a
new `conversation_start_sound` parameter.
2023-10-22 19:55:11 +02:00
Fabio Manganiello debb4f6f36
[Docs] Wrap `generate_missing_docs` logic in `auto_mocks` block.
continuous-integration/drone/push Build is passing Details
It should be possible to synchronize the documented modules even on
installations that don't have all the custom dependencies installed.
2023-10-22 19:08:16 +02:00
Fabio Manganiello e24438980a
[`sound`] Better logic for default sound device auto-detection.
continuous-integration/drone/push Build is passing Details
2023-10-22 18:07:25 +02:00
Fabio Manganiello 4d582bb6bc
Ensure that the application always terminates on Ctrl+C.
continuous-integration/drone/push Build is passing Details
2023-10-22 02:33:15 +02:00
Fabio Manganiello f75a2159c7
[platyvenv] Add the venv bin directory to the PATH.
After creating the virtual environment, we should add `<VENV_DIR>/bin`
to the `PATH` variable, so any next `python`/`pip` commands will be
executed in the new environment.
2023-10-22 02:28:31 +02:00
Fabio Manganiello a909dc5f0f
[Fix] The base per-OS requirements filename is always lowercase. 2023-10-22 01:45:23 +02:00
Fabio Manganiello e65eef34d3
[`application`] `application.install` should redirect stderr->stdout. 2023-10-22 01:44:39 +02:00
Fabio Manganiello 8b5871af0e
[Fix] `platyvenv` should also execute the `before` and `after` blocks.
Before this fix, `platyvenv`, unlike `platydock`, didn't take into
account any extra before/after installation commands that individual
integrations may instruct to run in their manifest files.
2023-10-22 01:41:19 +02:00
Fabio Manganiello ea88ab7f6c
[Docs] Clone and build wiki pages on docs.platypush.tech.
continuous-integration/drone/push Build is passing Details
2023-10-21 22:54:49 +02:00
Fabio Manganiello b80a48ec80
[Docs] Added custom style to the main doc page.
Component lists are now displayed in a grid format, each accompained by
an icon.
2023-10-21 22:53:24 +02:00
Fabio Manganiello 02049030d0
`paho` module added to automocks. 2023-10-21 19:55:50 +02:00
Fabio Manganiello deecde1d72
Fixed module name in docs. 2023-10-21 19:55:00 +02:00
Fabio Manganiello 4883f49b19
Removed unused `travisci` events. 2023-10-21 19:15:34 +02:00
Fabio Manganiello cd87cc3e43
Minor docstring fixes. 2023-10-21 18:08:29 +02:00
Fabio Manganiello 8634572c34
Small docstring fix. 2023-10-20 01:41:30 +02:00
Fabio Manganiello 0eae6fd48d
Misc dependencies and mock fixes.
continuous-integration/drone/push Build is passing Details
- `iputils` should be an explicit system dependency for `ping`.
  Some minimal systems (like some Docker images) may not have the `ping`
  command installed out of the box.

- `hid` and `marshmallow_dataclass` should be among the auto-mocked
  modules.
2023-10-20 01:02:35 +02:00
Fabio Manganiello ed2a56de42
`paho.mqtt` should also be added to the mock modules
continuous-integration/drone/push Build is passing Details
2023-10-20 00:00:07 +02:00
Fabio Manganiello 1e2ffc121f
[CI/CD] Added `yum install platypush-git` line to `index.txt`.
continuous-integration/drone/push Build is passing Details
2023-10-19 23:56:48 +02:00
Fabio Manganiello a915dd1e1f
[CI/CD] Regenerate the full apt and rpm repos in Drone pipeline.
continuous-integration/drone/push Build is passing Details
This also includes:

- index.txt
- pubkey.txt
- RPM repo definition
2023-10-19 23:46:36 +02:00
Fabio Manganiello 5d3c7679b6
[Fix] Added mistakenly removed `PKG_NAME` variable.
continuous-integration/drone/push Build is passing Details
2023-10-19 21:54:03 +02:00
Fabio Manganiello 6fb432d7bb
[CI/CD] S3 bucket replaced with a local folder.
continuous-integration/drone/push Build is failing Details
Managing concurrent copies over s3fs through CI/CD is a hassle.
Input/output errors abound and the steps are also slow.
2023-10-19 21:48:59 +02:00
Fabio Manganiello 1f1eadf962
[CI/CD] Added `-o nomixupload` option to s3fs.
continuous-integration/drone/push Build is failing Details
2023-10-19 20:57:25 +02:00
Fabio Manganiello 2197ce7c78
Revert "[CI/CD] Trying to prevent race conditions on S3 access from Drone CI automation" 2023-10-19 20:11:42 +02:00
Fabio Manganiello 111cb5e62a
[CI/CD] Trying to prevent race conditions on S3 access from Drone CI automation
continuous-integration/drone/push Build is failing Details
2023-10-19 20:06:51 +02:00
Fabio Manganiello ff02d2a3c8
[CI/CD] Trying to prevent race conditions on S3 access from Drone CI automation
continuous-integration/drone/push Build encountered an error Details
2023-10-19 20:05:51 +02:00
Fabio Manganiello e1fc38e014
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2023-10-19 17:52:56 +00:00
Fabio Manganiello 2c37596478
Updated UI files
continuous-integration/drone/push Build is failing Details
2023-10-19 19:52:50 +02:00
Fabio Manganiello a00f034282
Added non-Python static files to `setup.cfg`.
As it's best practice for the latest versions of Python builders.
2023-10-19 19:48:20 +02:00
dependabot[bot] 569db13a9b
Bump @babel/traverse in /platypush/backend/http/webapp
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.8 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-19 11:30:24 +00:00
Fabio Manganiello 4c6d966038 [Doc fix] Fixed indent in the documentation of the `application.install` action.
continuous-integration/drone/push Build is passing Details
2023-10-19 12:13:08 +02:00
Fabio Manganiello 7eaf8dbdc0
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-18 22:53:48 +00:00
Fabio Manganiello 38c5172316
[UI] Show the connected/disconnected status in the `Nav` icon.
continuous-integration/drone/push Build is passing Details
2023-10-19 00:33:17 +02:00
Fabio Manganiello f3c5c2fdfa
[Extensions UI] Added `RestartButton` to the `Install` tab.
It should be possible to easily restart the service after installing the
dependencies for a new integration.
2023-10-18 23:52:49 +02:00
Fabio Manganiello b724e80ee2
[Settings UI] Added `Stop` and `Restart` application buttons. 2023-10-18 23:45:46 +02:00
Fabio Manganiello 2a76a6baa6
[Extensions UI] Added current config to extension panel.
If an extension is configured and enabled, then the UI will now include
a tick next to its name and the currently loaded configuration in the
`Configuration` tab.
2023-10-18 22:51:30 +02:00
Fabio Manganiello f0255549c8
[`utils`] Added `utils.to_yaml` action. 2023-10-18 22:50:52 +02:00
Fabio Manganiello c7acc03c8f
[`inspect`] Added `get_enabled_plugins` and `get_enabled_backends` actions. 2023-10-18 22:10:32 +02:00
Fabio Manganiello c05d887551
[`application`] Added `application.install` action.
continuous-integration/drone/push Build is passing Details
It can be used to programmatically install extensions.
2023-10-18 19:33:00 +02:00
Fabio Manganiello e2e349a2ad
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-18 01:01:06 +00:00
Fabio Manganiello 922297bf58
[Extensions UI] Support for initializing an extension from URL.
continuous-integration/drone/push Build was killed Details
2023-10-18 03:00:54 +02:00
Fabio Manganiello 137855b4fc
[Entities UI] Fixed collapse toggling logic. 2023-10-18 03:00:54 +02:00
Fabio Manganiello 26b912fae4
[Execute UI]
- If an action is passed over the URL, then initialize the UI with it.

- Added link from the actions back to their plugins.
2023-10-18 03:00:54 +02:00
Fabio Manganiello e5d84242bb
[Extensions UI] Action URLs now point to the `Execute` panel. 2023-10-18 03:00:53 +02:00
Fabio Manganiello 6f01c35a0f
[UI] Added utilities to get and set args on the URL fragment. 2023-10-18 03:00:53 +02:00
Fabio Manganiello a30c07fbb5
[Execute UI] Make sure that the list of arguments doesn't overflow. 2023-10-18 03:00:53 +02:00
Fabio Manganiello 0c54c8f885
[UI] Refresh the loaded panel when the URL fragment changes. 2023-10-18 03:00:53 +02:00
Fabio Manganiello 6289eb47ab
[Extensions UI] Added `Actions` and `Events` sections to `Doc`. 2023-10-18 03:00:53 +02:00
Fabio Manganiello 6383030e96
[Extensions UI] Added notifications in case of install errors. 2023-10-18 03:00:52 +02:00
Fabio Manganiello 3107df5eba
[UI Nav] Moved `Extensions` panel from the plugins list to the footer. 2023-10-18 03:00:52 +02:00
Fabio Manganiello 81e99a0e22
[`shell`] Better buffering for the output sent to websockets. 2023-10-18 03:00:52 +02:00
Fabio Manganiello a652bd9df8
[Extensions UI] Install extensions deps from the UI.
- Added `Install` button
- Added interactive output panel
2023-10-18 03:00:52 +02:00
Fabio Manganiello 033317e0a7
[Extensions UI] Passing `config_file` to the configuration tab. 2023-10-18 03:00:51 +02:00
Fabio Manganiello 66cba233e5
[`config`] Added `config.get_config_file` action. 2023-10-18 03:00:51 +02:00
Fabio Manganiello 20a2203e7e
[Shell plugin] Added support for async output over websockets. 2023-10-18 03:00:51 +02:00
Fabio Manganiello 2806e943c3
[Extensions UI] Added `Install` tab. 2023-10-18 03:00:51 +02:00
Fabio Manganiello e40a74f11c
Added `install_cmds` to the JSON representation of a manifest. 2023-10-18 03:00:50 +02:00
Fabio Manganiello 9769520e88
[UI] Use `.min.css` file for the Highlight.js styles. 2023-10-18 03:00:50 +02:00
Fabio Manganiello 3366732fa8
[UI] Expand `Tab` width on mobile. 2023-10-18 03:00:50 +02:00
Fabio Manganiello 12f7b190b9
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-16 00:30:42 +00:00
Fabio Manganiello 99e98f70f4
[Integrations UI] Added configuration tab.
continuous-integration/drone/push Build is passing Details
2023-10-16 02:30:30 +02:00
Fabio Manganiello b19725c72c
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-15 23:18:08 +00:00
Fabio Manganiello 398d64c53f
[Integrations UI] Added new `Integrations` panel.
continuous-integration/drone/push Build is passing Details
2023-10-16 01:16:10 +02:00
Fabio Manganiello 0055acad9d
[UI] Fixed `Autocomplete` behaviour on empty filter. 2023-10-16 01:12:56 +02:00
Fabio Manganiello c88a9da3e6
[UI] Refactored layout classes. 2023-10-16 01:12:05 +02:00
Fabio Manganiello d1afb88b80
[Reflection] Expand RST extensions from object docstrings too. 2023-10-16 00:21:49 +02:00
Fabio Manganiello 0fe1c2768b
[Fix] Some minor docstring indentation fixes. 2023-10-16 00:20:39 +02:00
Fabio Manganiello 3e00a05301
[CI/CD] Restored `awscli` process for `update-debian-oldstable-packages`.
continuous-integration/drone/push Build is passing Details
The `s3fs` flow seems to have problems on the Debian oldstable image.
2023-10-14 15:35:11 +02:00
Fabio Manganiello d4c790925b
[CI/CD] Changed order of the S3 bucket mount step in deb builds.
continuous-integration/drone/push Build is failing Details
It seems that s3fs may fail if two clients try to mount the same
resource with the same token at the same time.
2023-10-14 15:26:07 +02:00
Fabio Manganiello 1649808efc
[CI/CD] Do all the apt repo operations on a temporary folder.
continuous-integration/drone/push Build is failing Details
`update-apt-repo` should first copy the existing repo root on the S3
bucket to a local temporary directory, so we don't do expensive (and
very slow) file operations on the s3fs filesystem.

After everything is done, we should do a current->old, tmp->current, rm old
dance to update the repo on S3.
2023-10-14 15:16:41 +02:00
Fabio Manganiello 465ff87f15
[CI/CD] Replaced `awscli` with `s3fs`. 2023-10-14 15:16:40 +02:00
Fabio Manganiello e242b2134e
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-14 12:38:25 +00:00
Fabio Manganiello 3cfd72b649
[UI Nav] Ensure that `entities` and `execute` tabs are always on top.
continuous-integration/drone/push Build is passing Details
2023-10-14 14:38:08 +02:00
Fabio Manganiello 6d53a3f80f
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-14 12:09:13 +00:00
Fabio Manganiello a3643c285e
[UI] A friendlier representation of an integration's name.
continuous-integration/drone/push Build is passing Details
2023-10-14 14:02:17 +02:00
Fabio Manganiello 0aecb50590
[Entities UI] Don't hide variables with null values.
Otherwise, the `variables` panel will still appear, but empty, and
offering no way of actually removing or resetting those variables.
2023-10-14 14:02:17 +02:00
Fabio Manganiello 01c7d230f1
[Entities UI] Added `Expand`/`Collapse` and `Hide` actions to groups.
Also, replaced all the deprecated `::v-deep` SCSS notations with
`:deep`.
2023-10-14 14:02:17 +02:00
Fabio Manganiello dbe19042bc
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-13 21:13:00 +00:00
Fabio Manganiello 891e05a219
[Execute UI] Added syntax highlight to JSON and shell snippets.
continuous-integration/drone/push Build is passing Details
2023-10-13 23:12:04 +02:00
Fabio Manganiello 8b9ac59167
`parse_numpy` should also catch `AttributeError`.
continuous-integration/drone/push Build is passing Details
2023-10-12 03:24:03 +02:00
Fabio Manganiello 12f38281e1
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-10-12 00:58:53 +00:00
Fabio Manganiello e382ad7650 Invert `@ensure_initialized` and `@action` annotations.
Otherwise, we won't be able to access the wrapped function from the
inspection logic.
2023-10-12 00:57:31 +00:00
Fabio Manganiello 8ef67012ed [Drone CI] git push in the build-ui step needs a -f flag. 2023-10-12 00:57:31 +00:00
Fabio Manganiello 0a13b4605e
[Execute panel] Procedures merged into actions.
continuous-integration/drone/push Build is passing Details
Plus, a last big refactor/redesign for the panel's components.
2023-10-12 02:49:51 +02:00
Fabio Manganiello e760f8e23a
[Execute panel] Introduced a common `Response` component.
continuous-integration/drone/push Build is passing Details
2023-10-11 16:57:04 +02:00
Fabio Manganiello b47e729012
[Execute panel] Added cURL snippet modal.
continuous-integration/drone/push Build is passing Details
2023-10-11 16:38:38 +02:00
Fabio Manganiello fc21e9740b
[Execute panel] Better rendering of responses and errors.
continuous-integration/drone/push Build is failing Details
2023-10-11 15:28:49 +02:00
Fabio Manganiello 21820bb185
Big refactor of the `Execute` panel.
continuous-integration/drone/push Build is failing Details
2023-10-11 14:31:46 +02:00
Fabio Manganiello 1b6e9b4df9
Fixed a broken docstring reference. 2023-10-10 22:18:36 +02:00
Fabio Manganiello ff07623803
Auto-focus the first parameter after selecting an action. 2023-10-10 21:31:14 +02:00
Fabio Manganiello 07f0535504
Migrated `Execute` panel to the new `Autocomplete` widget. 2023-10-10 21:13:54 +02:00
Fabio Manganiello a717235453
Added `autofocus` support to `Autocomplete` element. 2023-10-10 20:51:09 +02:00
Fabio Manganiello 923eb7cadb
`Autocomplete` is now its own component. 2023-10-10 18:42:41 +02:00
Fabio Manganiello f6bf9438b9
Several improvements for the `Execute` panel. 2023-10-10 01:45:35 +02:00
Fabio Manganiello 434855ffdd
A better logic to process relative references in docstrings. 2023-10-10 01:35:37 +02:00
Fabio Manganiello 5726c6985f
Added utility function to get the defining class of a method. 2023-10-10 01:35:01 +02:00
Fabio Manganiello 2af304f478
Replaced radio buttons on the `Execute` panel with buttons. 2023-10-10 00:40:20 +02:00
Fabio Manganiello 84efef710e
Added `Tabs` and `Tab` UI elements. 2023-10-10 00:39:27 +02:00
Fabio Manganiello 0c818d3fe0
`.. schema::` JSON arguments should be comma-separated. 2023-10-10 00:38:23 +02:00
Fabio Manganiello b225b056b0
`ParseContext` should also process `kwonlyargs`. 2023-10-10 00:37:08 +02:00
Fabio Manganiello 52e353dc14
Expose the wrapped function in `@action`.
Added a `wrapped` "hidden" parameter to the function returned by the
`@action` decorator.

We need this to access the underlying decorated function when e.g. we
need to access its specs or decorators.
2023-10-09 22:35:08 +02:00
Fabio Manganiello 1e93af86f4
Fixed some broken docstring references.
continuous-integration/drone/push Build is passing Details
2023-10-09 01:33:45 +02:00
Fabio Manganiello 53bdcb9604
A major rewrite of the `inspect` plugin.
- The `inspect` plugin and the Sphinx inspection extensions now use the
  same underlying logic.

- Moved all the common inspection logic under
  `platypush.common.reflection`.

- Faster scanning of the available integrations and components through a
  pool of threads.

- Added `doc_url` parameters.

- Migrated events and responses metadata scanning logic.

- Now expanding some custom Sphinx tag instead of returning errors when
  running outside of the Sphinx context - it includes `:class:`,
  `:meth:` and `.. schema::`.
2023-10-09 01:33:45 +02:00
Fabio Manganiello 9acd71944c
Skip numpy types serialization errors on Message.Encoder. 2023-10-09 01:33:45 +02:00
Fabio Manganiello e5a5ac5ffb
Added `doc_url` parameter to integration metadata. 2023-10-09 01:33:45 +02:00
Fabio Manganiello d872835093
New API to check if a table class exists before defining it.
- Check if it's part of the metadata through a function call rather than
  checking `Base.metadata` in every single module.

- Make it possible to override them (mostly for doc generation logic
  that needs to be able to import those classes).

- Make it possible to extend them.
2023-10-09 01:33:44 +02:00
Fabio Manganiello 608844ca0c
[WIP] Large refactor of the inspection plugin and models. 2023-10-09 01:33:44 +02:00
Fabio Manganiello 841643f3ff
Added `cachedir` to configuration. 2023-10-09 01:33:44 +02:00
Fabio Manganiello 40557f5d5d
Replaced one more occurrence of `<type> | None` syntax. 2023-10-09 01:33:44 +02:00
Fabio Manganiello 4da3c13976
First WIP commit for the new Integrations panel. 2023-10-09 01:33:44 +02:00
Fabio Manganiello 4d52fd35b9
Skip `None` responses in the RSS plugin.
continuous-integration/drone/push Build is passing Details
2023-10-04 22:08:11 +02:00
Fabio Manganiello 40d3ad1150
Removed `<type> | None` type hints.
continuous-integration/drone/push Build is passing Details
They break on Python < 3.10.
2023-10-03 01:15:13 +02:00
Fabio Manganiello fd7037d048
Added git checkout and rebase commands to sync-stable-branch step.
continuous-integration/drone/push Build is passing Details
2023-10-01 23:31:46 +02:00
Fabio Manganiello ae66e9c205 Merge pull request '[#317] Added Drone step to sync the stable branch on tag' (#332) from 317-ci-cd-automation-for-stable-branch into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #332
2023-10-01 23:19:22 +02:00
Fabio Manganiello 98b51362e9
[#317] Added Drone step to sync the stable branch on tag.
continuous-integration/drone/push Build is passing Details
Closes: #317
2023-10-01 23:17:53 +02:00
Fabio Manganiello 3086dd86fc
LINT+Black+stability fixes for some plugins that hadn't been touched in a while.
continuous-integration/drone/push Build is passing Details
- media.mplayer
- media.omxplayer
- media.vlc
- music.mpd
- music.snapcast
2023-10-01 22:55:06 +02:00
Fabio Manganiello 2aefc4e5c8
Several improvements for the Google integrations.
1. Improved documentation. Every plugin now reports the exact steps to
   get the integration up and running with the right API scopes.

2. All Google plugins now have a standard process to get (and reuse) the
   client secret. Except for PubSub, Translate and Maps (which have
   their own flows), all the Google plugins now read the client secrets
   from `<WORKDIR>/credentials/google/client_secret.json` by default.

3. Black/LINT for some of those plugins, which hadn't been touched in a
   while.

4. The interface to pass API scopes is now leaner. It's now possible to
   pass a scope directly as e.g. `calendar.readonly` rather than
   `https://www.googleapis.com/auth/calendar.readonly`.

5. Improved the logic to retrieve the right scope tokens file. If e.g.
   an integration requires the role `A`, and a credentials file exists
   for the roles `A` and `B`, then this file will be used rather than
   prompting the user to authenticate again.
2023-10-01 15:37:20 +02:00
Fabio Manganiello 5ca3757834
A more readable configuration for the `calendar` plugin.
The old type configuration
(`platypush.plugins.calendar.name.CalendarNamePlugin`) is a bit clunky.

Instead, since the type will always be a plugin, we should encourage
the use of `calendar.name` directly to identify the type.
2023-10-01 01:09:15 +02:00
Fabio Manganiello 966a6ce29e
httplib2 should be an explicit dependency for Google integrations.
Plus, some misc LINT/Black chores.
2023-10-01 00:52:59 +02:00
Fabio Manganiello a7bb81553c
Regex fix.
continuous-integration/drone/push Build is passing Details
2023-09-30 15:11:09 +02:00
Fabio Manganiello 9e489bb5cf
Propagate the default/required properties of a parameter upon merge.
continuous-integration/drone/push Build is passing Details
2023-09-30 14:57:11 +02:00
Fabio Manganiello 1732bfa82c
Fixed _default_docstring regex. 2023-09-30 14:36:08 +02:00
Fabio Manganiello 532f5479b3
Added full YAML example for `chat.irc` configuration. 2023-09-30 14:34:54 +02:00
Fabio Manganiello ecffbf29bf
Skip vararg/varkw parameters from the config snippet.
continuous-integration/drone/push Build is passing Details
2023-09-30 13:53:33 +02:00
Fabio Manganiello acb40bd5fd
The `test` step should also install all dependencies via apk add.
continuous-integration/drone/push Build is failing Details
2023-09-30 13:36:28 +02:00
Fabio Manganiello 4f5ccda353
Better documentation for the `calendar` plugin. 2023-09-30 13:31:41 +02:00
Fabio Manganiello 7bd721e6a4
Added missing `pip install` parameter. 2023-09-30 13:31:04 +02:00
Fabio Manganiello c82f7bbfbe
Ignore the default docstring text for __init__.
If no docstring is specified for a constructor, Python usually pre-fills
a standard text - "Initialize self. See help(type(self))".

We don't need this default text in our plugins documentation.
2023-09-30 13:29:49 +02:00
Fabio Manganiello d030e2b8c7
Install all the deps via `apk add` on Alpine in the build-docs step. 2023-09-30 13:29:10 +02:00
Fabio Manganiello 15d06fa5c2
Improved docstring parser logic.
continuous-integration/drone/push Build is failing Details
2023-09-30 12:35:31 +02:00
Fabio Manganiello e6f05dfe07 Merge pull request '[#311] Logic to automatically generate the documentation for the dependencies of the integrations' (#330) from 311/auto-generate-deps-docs into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #330
2023-09-30 02:31:43 +02:00
Fabio Manganiello 343972b520
New `IntegrationMetadata` generic util class.
continuous-integration/drone/push Build is passing Details
This object is in charge of parsing all the metadata of a
plugin/backend.
2023-09-30 02:28:20 +02:00
Fabio Manganiello 905d6632e0
Misc documentation improvements. 2023-09-29 18:09:15 +02:00
Fabio Manganiello 0a3ec4b9f1
Merge branch 'master' into 311/auto-generate-deps-docs 2023-09-28 01:25:29 +02:00
Fabio Manganiello 5025d892be
Added install/ subfolders to package_data
continuous-integration/drone/push Build is passing Details
2023-09-28 01:25:01 +02:00
Fabio Manganiello b76f141b61
Catch response write errors in the MQTT callback.
continuous-integration/drone/push Build is passing Details
If the client that forwarded the request is no longer available (either
because an exception or a timeout was raised) then its I/O buffer and
event loop may be closed.

In this case, the response callback should handle and report the
exception, and still set the event, so that any other threads waiting
for the response can move on.
2023-09-27 11:23:55 +02:00
Fabio Manganiello ca7f042ccc
We shouldn't call dateutil.parser if t has already been deserialized to a datetime. 2023-09-27 11:20:10 +02:00
Fabio Manganiello c311987741
Removed `typing.Final` from some of the most commonly used modules.
continuous-integration/drone/push Build is passing Details
`typing.Final` is not defined on Python < 3.8.
2023-09-26 23:50:10 +02:00
Fabio Manganiello 9298f52443
Moved `BluetoothPlugin` to `__init__.py`.
continuous-integration/drone/push Build is passing Details
This is for consistency with other plugins, that all have their main
plugin class definition inside of `__init__.py`.
2023-09-24 19:21:53 +02:00
Fabio Manganiello c3337ccc6c
[#311] Docs deps autogen sphinx plugin.
continuous-integration/drone/push Build is passing Details
Added an `add_dependencies` plugin to the Sphinx build process that
parses the manifest files of the scanned backends and plugins and
automatically generates the documentation for the required dependencies
and triggered events.

This means that those dependencies are no longer required to be listed
in the docstring of the class itself.

Also in this commit:

- Black/LINT for some integrations that hadn't been touched in a long
  time.

- Deleted some leftovers from previous refactors (deprecated
  `backend.mqtt`, `backend.zwave.mqtt`, `backend.http.request.rss`).

- Deleted deprecated `inotify` backend - replaced by `file.monitor` (see
  #289).
2023-09-24 17:00:08 +02:00
Fabio Manganiello 27340f2889
Fixed a variable name in the Drone RPM step.
continuous-integration/drone/push Build is passing Details
2023-09-23 16:48:49 +02:00
Fabio Manganiello 33b26fa8dd
fuse doesn't like inter-device move operations.
continuous-integration/drone/push Build is failing Details
So the Drone pipeline has to resort to the cp+rm dance instead.
2023-09-23 16:42:15 +02:00
Fabio Manganiello b9e68d69a9
Merge branch '316/rpm-support'
continuous-integration/drone/push Build is failing Details
2023-09-23 16:38:20 +02:00
Fabio Manganiello bbd8e939e6
Fixed a multiline expression 2023-09-23 16:37:52 +02:00
Fabio Manganiello fe5158d0ca Merge pull request '[#316] RPM support' (#328) from 316/rpm-support into master
continuous-integration/drone/push Build is failing Details
Reviewed-on: #328
2023-09-23 16:25:34 +02:00
Fabio Manganiello ad2ee75c99
Updated docs
continuous-integration/drone/push Build is passing Details
2023-09-23 16:24:18 +02:00
Fabio Manganiello 059f7a4b11 Merge branch 'master' into 316/rpm-support
continuous-integration/drone/push Build is passing Details
2023-09-23 16:21:48 +02:00
Fabio Manganiello f6dea0b4d4
Added RPM update step to Drone CI pipeline.
continuous-integration/drone/push Build is passing Details
Closes: #316.
2023-09-23 16:21:00 +02:00
Fabio Manganiello 2b981f6b68
Added python-croniter dependency to Fedora.
Plus, some clean up of the variables on .drone.yaml.
2023-09-23 16:20:28 +02:00
Fabio Manganiello b797add90d
Modify shebang header for Mercury JS script.
The RPM build process wants an absolute path.
2023-09-23 16:16:13 +02:00
Fabio Manganiello a872d6f554
Added Fedora to the available Docker base images. 2023-09-22 19:02:13 +02:00
Fabio Manganiello 79e24461cb
Coalesce to empty list if `zigbee.mqtt.devices` returns null.
continuous-integration/drone/push Build is passing Details
2023-09-22 17:00:53 +02:00
Fabio Manganiello 55965e962c
Store the Philips Hue bridge configuration under our workdir.
By default, the `phue` library will store the file containing the token
and the bridge configuration under `~/.python_hue`.

That's outside of our application folder, and it can't easily be copied
around or added to Docker volumes.

We should instead have it under `<WORKDIR>/light.hue/config.json`, in
line with what the other plugins do, and if `~/.python_hue` is available
but `<WORKDIR>/light.hue/config.json` isn't then we should copy the
legacy file to the new one.
2023-09-22 16:58:44 +02:00
Fabio Manganiello 761f2768cb
[#316] Added RPM dependencies.
continuous-integration/drone/push Build is passing Details
2023-09-21 23:20:06 +02:00
Fabio Manganiello 453b6becae
FIX: We shouldn't expand `cfgfile` if it's empty.
continuous-integration/drone/push Build is passing Details
2023-09-21 01:18:15 +02:00
Fabio Manganiello bdbe263905
Added croniter to system dependencies.
The python-croniter package has now been added both to Arch's and
Debian's official repos, so we can install it via pacman or apt rather
than pip.
2023-09-21 01:07:49 +02:00
Fabio Manganiello dfc876c411 Merge pull request '[#285] Removed old covid19 backend' (#327) from 285/remove-old-covid19-backend into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #327
2023-09-21 00:28:20 +02:00
Fabio Manganiello 648b4224bb
[#285] Removed old covid19 backend.
continuous-integration/drone/push Build is passing Details
Those endpoints aren't even working anymore.

Closes: #285
2023-09-21 00:26:35 +02:00
Fabio Manganiello 4aa23d9309 Merge pull request '[#288] Removed legacy `http.poll` backend' (#326) from 288/remove-http-poll-backend into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #326
2023-09-20 23:55:39 +02:00
Fabio Manganiello 5d6d37785e
[#288] Removed legacy `http.poll` backend.
continuous-integration/drone/push Build is passing Details
Closes: #288
2023-09-20 23:53:12 +02:00
Fabio Manganiello 18375dde40 Merge pull request '[#291] Removed deprecated `light.hue` backend' (#325) from 291/remove-light-hue-backend into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #325
2023-09-20 23:49:02 +02:00
Fabio Manganiello 7ba9a8930a
[#291] Removed deprecated `light.hue` backend.
continuous-integration/drone/push Build is passing Details
Closes: #291
2023-09-20 23:46:40 +02:00
Fabio Manganiello 8925405788
Added `| head -1` to `git log` commands that fetch the current head.
continuous-integration/drone/push Build is passing Details
The reason is that `git log HEAD...HEAD~1` will return two or more
commits if we're dealing with merge commits, so we must be explicit that
we only need the latest one.
2023-09-20 23:42:34 +02:00
Fabio Manganiello 4fa3d7b311 Merge pull request '[#306] Removed Travis CI integration' (#324) from 306/remove-travisci into master
continuous-integration/drone/push Build is failing Details
Reviewed-on: #324
2023-09-20 23:35:38 +02:00
Fabio Manganiello a6efaad26d
[#306] Removed Travis CI integration.
continuous-integration/drone/push Build is passing Details
I've tried my best to keep it around, but the endpoints seem to be
broken, they no longer have a link to their API v3 documentation, and
the API Explorer that was supposed to be in the dashboard is gone.
2023-09-20 23:31:58 +02:00
Fabio Manganiello 9926aefed0
Added curl dependency to the deb pkg build steps.
continuous-integration/drone/push Build is passing Details
2023-09-20 01:48:35 +02:00
Fabio Manganiello 3931a3cbf2
Added main deb release logic.
continuous-integration/drone/push Build is passing Details
2023-09-20 01:42:25 +02:00
Fabio Manganiello af4a586014
Added Release files signing logic to update-apt-repo.
continuous-integration/drone/push Build is passing Details
2023-09-20 00:03:49 +02:00
Fabio Manganiello e3fb0eeb11
Fixed typo
continuous-integration/drone/push Build is passing Details
2023-09-19 14:34:02 +02:00
Fabio Manganiello f6517059f6
Generate hashes for all the architectures in the Release files.
continuous-integration/drone/push Build is passing Details
2023-09-19 14:29:34 +02:00
Fabio Manganiello eb398f24d7
Removed Version reference from Release files.
continuous-integration/drone/push Build is passing Details
2023-09-19 14:22:36 +02:00
Fabio Manganiello 35c2b69ece
Added all supported architectures to generated Release files.
continuous-integration/drone/push Build is passing Details
2023-09-19 14:13:31 +02:00
Fabio Manganiello 87cf90eb6b
Changed format of the Debian git versions.
continuous-integration/drone/push Build is passing Details
Comply with <maj>.<min>.<patch>-<rel> versioning convention.
2023-09-19 13:21:28 +02:00
Fabio Manganiello 9150b2cae5
Refactored logic to rewrite the Release file.
continuous-integration/drone/push Build is passing Details
2023-09-19 13:01:06 +02:00
Fabio Manganiello e0da41e6ff
Fixed upload path for the deb packages.
continuous-integration/drone/push Build is passing Details
2023-09-19 11:52:47 +02:00
Fabio Manganiello 945fa9bd74
Added logic to regenerate the Packages and Release files from CI/CD.
continuous-integration/drone/push Build is passing Details
2023-09-19 11:46:04 +02:00
Fabio Manganiello 76d4dcfcf8
Replaced occurrence of `let` with arithmetic expansion.
continuous-integration/drone/push Build is passing Details
drone-ci uses /bin/sh instead of bash, so let is not available.
2023-09-19 01:23:24 +02:00
Fabio Manganiello 92d7ce8305
(Possible?) fix for a weird bash syntax error.
continuous-integration/drone/push Build is failing Details
2023-09-19 01:16:35 +02:00
Fabio Manganiello 739777271d
(Forgot an apt update)
continuous-integration/drone/push Build is failing Details
2023-09-19 01:05:38 +02:00
Fabio Manganiello 2b9d8f1a55
Added AWS_DEFAULT_REGION variable
continuous-integration/drone/push Build is failing Details
2023-09-19 01:02:09 +02:00
Fabio Manganiello b566d87dac
Added retention logic to the packages stored on the apt repo.
continuous-integration/drone/push Build is failing Details
2023-09-19 00:36:16 +02:00
Fabio Manganiello 6af02804d5
Parametrized the Debian build steps. 2023-09-18 21:31:42 +02:00
Fabio Manganiello 1f2e5b1e7a
`update-debian-*-packages` steps can now go in parallel.
continuous-integration/drone/push Build is passing Details
We should copy the source directory at the beginning of each step into a
temporary directory, so the build steps can go in parallel without
conflicts while accessing the same files.
2023-09-18 21:15:48 +02:00
Fabio Manganiello 9aad1a2c58
S3 directory structure now compatible with that of an apt repo.
continuous-integration/drone/push Build is passing Details
2023-09-18 20:59:48 +02:00
Fabio Manganiello 2676d7babe A more resilient way of renaming site-packages to dist-packages.
continuous-integration/drone/push Build is passing Details
2023-09-18 15:49:11 +02:00
Fabio Manganiello d969119f60 Fixed sed expression
continuous-integration/drone/push Build is failing Details
2023-09-18 15:39:05 +02:00
Fabio Manganiello 7a85f13f23 Workaround to ensure that the pkg is installed under dist-packages.
continuous-integration/drone/push Build is failing Details
2023-09-18 15:31:40 +02:00
Fabio Manganiello a5a780060b Install everything under <prefix>/usr when building the .deb pkg.
continuous-integration/drone/push Build is passing Details
2023-09-18 15:23:53 +02:00
Fabio Manganiello b8ba9c36b6 Do a barrel roll to make sure that the installed package sticks to Debian's naming conventions.
continuous-integration/drone/push Build is failing Details
2023-09-18 15:08:03 +02:00
Fabio Manganiello 67d45997ed Fixed Python bin path name for Debian builds.
continuous-integration/drone/push Build is passing Details
2023-09-18 14:53:21 +02:00
Fabio Manganiello 4bb3bcff8b (We actually do need git here)
continuous-integration/drone/push Build is failing Details
2023-09-18 14:46:30 +02:00
Fabio Manganiello 9576141a3f We don't need git commands when building .deb pkgs.
continuous-integration/drone/push Build is failing Details
2023-09-18 14:43:59 +02:00
Fabio Manganiello 55d4523ea3 The latest version of pip wants --break-system-packages in Docker.
continuous-integration/drone/push Build is failing Details
2023-09-18 14:38:04 +02:00
Fabio Manganiello e16cfdfb44 Use vanilla Debian images to build .deb.
continuous-integration/drone/push Build is failing Details
Instead of `python:<python_ver>-<debian_ver>` images.

The official Python Debian images install the interpreter under
/usr/local/bin/python, while standard Debian distros do under
/usr/bin/python3, leading to package incompatibility.

Also, using the vanilla Debian images makes sure that we are always
using the version of Python installed on that Debian version.
2023-09-18 14:34:21 +02:00
Fabio Manganiello 3970470e17 Removed typing-inspect dependenccy
continuous-integration/drone/push Build is passing Details
2023-09-18 14:25:50 +02:00
Fabio Manganiello 3acbde38c1 Run the Debian package updates sequentially to prevent builds to step on one another's toes
continuous-integration/drone/push Build is passing Details
2023-09-18 14:15:29 +02:00
Fabio Manganiello 3e8d6bb01e Removed `typing-extensions` dependency.
continuous-integration/drone/push Build is failing Details
The package isn't present on older versions of Debian.
2023-09-18 14:05:39 +02:00
Fabio Manganiello 10bf617261 main/ should have a trailing slash.
continuous-integration/drone/push Build is passing Details
2023-09-18 13:40:17 +02:00
Fabio Manganiello ed9548a476 Release .deb packages both for stable and oldstable.
continuous-integration/drone/push Build is passing Details
2023-09-18 13:36:59 +02:00
Fabio Manganiello 9702612fd5 Added s3 region settings and changed destination bucket.
continuous-integration/drone/push Build is passing Details
2023-09-18 13:20:14 +02:00
Fabio Manganiello bfb4b78172
The target deb name has `_all.deb` prefix.
continuous-integration/drone/push Build is failing Details
2023-09-18 12:05:27 +02:00
Fabio Manganiello 85febac2ae
Fixed the location of the target .deb file in the Drone CI script.
continuous-integration/drone/push Build is failing Details
2023-09-18 12:03:16 +02:00
Fabio Manganiello 868bec8ba5
One more fix for variable names in Drone CI script.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:59:03 +02:00
Fabio Manganiello 82e3f317bc
Drone CI doesn't support `${}` syntax for bash variables.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:54:32 +02:00
Fabio Manganiello 83ffa9f4a8
Added missing AWS_SECRET_ACCESS_KEY configuration secret.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:47:36 +02:00
Fabio Manganiello b955a1490d
"Depends" requires the dependencies to be comma-separated.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:44:59 +02:00
Fabio Manganiello 73609c7f0b
Make sure that the __all/DEBIAN directory exists.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:39:34 +02:00
Fabio Manganiello 295e202fc9
dpkg wants the control file under the `__all` directory.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:37:39 +02:00
Fabio Manganiello bc519d4b09
EOF required in the cat command.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:34:57 +02:00
Fabio Manganiello 949e5de070
Need to add `.` to pip install.
continuous-integration/drone/push Build was killed Details
2023-09-18 11:34:00 +02:00
Fabio Manganiello 9bcadcb3c9
Use pip install --prefix to prepare the Debian package.
continuous-integration/drone/push Build is failing Details
2023-09-18 11:32:21 +02:00
Fabio Manganiello 2c74868315
[#323] Added logic to create deb package
continuous-integration/drone/push Build is failing Details
2023-09-18 11:00:46 +02:00
Fabio Manganiello 07c88c9530
Added logic to prevent socket leakage from paho-mqtt upon client stop.
continuous-integration/drone/push Build is passing Details
2023-09-17 23:43:56 +02:00
Fabio Manganiello 3f4168eb69
Support for new `Quality` enumeration constants on `tidalapi`.
continuous-integration/drone/push Build is passing Details
2023-09-17 22:40:26 +02:00
Fabio Manganiello c6cda86b1c
LINT/regex fix for ESP plugin. 2023-09-17 17:10:40 +02:00
Fabio Manganiello ecba2e49ac
Do not remove the existing webapp's dist folder in build-ui.
continuous-integration/drone/push Build is passing Details
2023-09-17 12:56:54 +02:00
Fabio Manganiello 4c4a33dc7c
Added Bluetooth example configuration to sample config.yaml.
continuous-integration/drone/push Build is passing Details
2023-09-17 03:25:21 +02:00
Fabio Manganiello 9e7b95583b Merge pull request 'Merge `mqtt` backend and plugin' (#320) from 315/merge-mqtt-backend-and-plugin into master
continuous-integration/drone/push Build is failing Details
Reviewed-on: #320
2023-09-17 02:51:47 +02:00
Fabio Manganiello c4352660a4
Documentation update.
continuous-integration/drone/push Build is passing Details
Removed references to the legacy zwave plugin and backend.
2023-09-17 02:47:04 +02:00
Fabio Manganiello 46167a6c2a
Removed legacy zwave backend. 2023-09-17 02:46:24 +02:00
Fabio Manganiello 190cfa21b5
Fixed documentation references to some non-existing events. 2023-09-17 02:41:55 +02:00
Fabio Manganiello 0421325b26
Support to register/unregister custom handlers on the bus. 2023-09-17 02:29:11 +02:00
Fabio Manganiello 2e004c1a1e
`get_all_plugins` should use `Message.Encoder` for encoding the response.
continuous-integration/drone/push Build is passing Details
Some plugin information may include enums, tuples and other types that
aren't serializable by the default JSON serializer.
2023-09-17 02:11:52 +02:00
Fabio Manganiello fa2b84a269
Updated example configuration for mqtt and mqtt-based plugins.
continuous-integration/drone/push Build is passing Details
2023-09-16 15:26:07 +02:00
Fabio Manganiello 2fcd623c51
Migrated zwave.mqtt integration.
continuous-integration/drone/push Build is passing Details
Merged the zwave.mqtt plugin with the listener and removed the
leftovers of the legacy zwave plugin.
2023-09-16 03:58:19 +02:00
Fabio Manganiello 52cb1afb4b
Don't break words in entity value frames. 2023-09-16 02:58:17 +02:00
Fabio Manganiello e947cb1e67
Updated web dist files 2023-09-15 16:22:40 +02:00
Fabio Manganiello 4223576016
We should always update the entities cache on addEntity.
continuous-integration/drone/push Build is passing Details
Updating the entity cache only when we receive an event from a root
entity means that we lose events sent by individual child entities.
2023-09-15 00:45:38 +02:00
Fabio Manganiello 1020b63da7
All EntityMixin components should be allowed to emit `loading` events. 2023-09-15 00:34:29 +02:00
Fabio Manganiello 2c93049ee5
Catch all the exceptions in a plugin action wrapper.
The @action decorator should capture all the exceptions,
log them and return them on `Response.errors`.

This ensures that uncaught exceptions from plugin
actions won't unwind out of control, and also that they
are logged and treated consistently across all the
integrations.
2023-09-14 23:08:23 +02:00
Fabio Manganiello ac72b2f7a8
Fixed management of state on `zigbee.mqtt`.
Before the merge of the plugin and the listener those components
used to have their own separate state, which led to inconsistencies.
2023-09-14 23:05:27 +02:00
Fabio Manganiello 5a514fdcce
Only support the `run_topic` logic on the MQTT plugin.
Plugins that extend `MqttPlugin` shouldn't run messages as
requests, even if the parent MQTT plugin is configured to
do so.
2023-09-14 01:09:03 +02:00
Fabio Manganiello 4cb5aa7acb
Prepend the class name to the string used to generate the MQTT client_id hash.
If we include the class name by default then we won't have to
explicitly modify the client_id in the implementation classes
in order to prevent clashes.
2023-09-14 01:06:53 +02:00
Fabio Manganiello 3104a59f44
Better processing of configuration file parameters.
- Do `abspath`+`expanduser` on the configuration file path before
  checking if it exists.

- If the path doesn't exist, but the user explicitly passed a
  configuration file, then copy/create the default configuration
  under the specified directory.
2023-09-14 00:24:52 +02:00
Fabio Manganiello ddd8f1afdc
`base_topic` param in `zigbee.mqtt` renamed to `topic_prefix`.
This is for sake of consistency with other integrations (like
`zwave.mqtt`) that also use the same parameter name for the MQTT topic
prefix.
2023-09-07 21:32:56 +02:00
Fabio Manganiello 8ab7b6bebc
Removed deprecated `zigbee.mqtt` backend.
continuous-integration/drone/push Build is passing Details
Closes: #322
2023-09-06 02:54:48 +02:00
Fabio Manganiello 3de510da68
Migrated `zigbee.mqtt` integration.
continuous-integration/drone/push Build is passing Details
The plugin has been migrated to the new `mqtt` API and the legacy
listener that extended `MqttBackend` has been removed and merged into
the plugin.
2023-09-06 02:44:56 +02:00
Fabio Manganiello 33a1ef39e4
Refactored and merged `backend.mqtt` logic into `mqtt` plugin. 2023-09-06 02:43:45 +02:00
Fabio Manganiello b746d0b402
Moved `get_message_response` to `platypush.utils`.
continuous-integration/drone/push Build is passing Details
It is general-purpose enough to be used by all the integrations, not
only by the HTTP backend.
2023-09-05 13:03:30 +02:00
Fabio Manganiello f1acff00e9
Put the join back on `CommandStream.__exit__`.
continuous-integration/drone/push Build is passing Details
We want to give the process a bit of slack between the terminate and the
close, or we'll be guaranteed to get race conditions upon close.
2023-09-04 11:01:34 +02:00
Fabio Manganiello 6ee064cb89
Always rebase on pull in .drone.yml.
continuous-integration/drone/push Build is passing Details
2023-09-04 02:53:20 +02:00
Fabio Manganiello 82ef928d5b Merge pull request 'Better Docker support' (#277) from 276/better-docker into master
continuous-integration/drone/push Build is failing Details
Reviewed-on: #277
2023-09-04 02:49:14 +02:00
Fabio Manganiello b3c82fe0d1
More resilient termination logic for `CommandStream`.
continuous-integration/drone/push Build is passing Details
2023-09-04 02:47:18 +02:00
Fabio Manganiello c69f97c0a5
Updated default config.yaml.
continuous-integration/drone/push Build is passing Details
The new configuration:

- Enables `backend.http` by default
- Removes the extra `config.auto.yaml` dependency
- Includes many more examples, lots of updates for existing examples,
  and extensive comments.
2023-09-04 02:22:46 +02:00
Fabio Manganiello 07c2eee890
Changed (fixed) default location for config dir if not existing.
Following some common UNIX conventions, if no configuration file is
specified and none exists under the default locations, then a new
configuration directory should be created under:

```
- if root: /etc/platypush
- else:
  - if XDG_CONFIG_HOME:
    - $XDG_CONFIG_HOME/platypush
  - else:
    - ~/.config/platypush
```
2023-09-04 02:19:13 +02:00
Fabio Manganiello b6c0ff799b
Rewritten the `http.webpage` plugin. 2023-09-03 17:33:25 +02:00
Fabio Manganiello 669f2eb2d2
LINT/black for `tts.mimic3` plugin. 2023-09-02 12:40:34 +02:00
snyk-bot 46c40f6fa6
fix: upgrade sass from 1.64.2 to 1.65.1
Snyk has created this PR to upgrade sass from 1.64.2 to 1.65.1.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-09-01 23:15:47 +00:00
Fabio Manganiello 35416f3ee3
Some LINT on the old `http.request.rss` plugin. 2023-09-02 01:01:16 +02:00
Fabio Manganiello 759075f1d9
Updated sample nginx configuration. 2023-09-01 01:09:38 +02:00
Fabio Manganiello 5481ae753d
gitignore should only skip /config, not any config directories. 2023-08-31 23:56:57 +02:00
Fabio Manganiello 9aaf2559fa
Added `utils.is_root` method. 2023-08-31 23:21:32 +02:00
Fabio Manganiello 1be40f30d6
Merge branch 'master' into 276/better-docker
continuous-integration/drone/push Build is passing Details
2023-08-31 02:34:17 +02:00
Fabio Manganiello 011f6d3a66
(Try and) pull the current branch from Github instead of master.
continuous-integration/drone/push Build is passing Details
2023-08-31 02:32:42 +02:00
Fabio Manganiello 86ce2647e4
Removed the -f flag from git push.
continuous-integration/drone/push Build is failing Details
2023-08-31 02:23:13 +02:00
Fabio Manganiello 867198a092
Try and force push the commits to Github.
continuous-integration/drone/push Build is passing Details
2023-08-31 02:22:01 +02:00
Fabio Manganiello a87a713f5e
Ignore the Dockerfile in the root folder
continuous-integration/drone/push Build is failing Details
2023-08-31 02:15:59 +02:00
Fabio Manganiello a88b57fff2
Dockerfile moved to application root 2023-08-31 02:15:59 +02:00
Fabio Manganiello 91fde717c9
Dockerfile moved to application root 2023-08-31 02:15:59 +02:00
Fabio Manganiello 0e02e617b3
Skip checksum in platypush-git AUR package.
The master branch can move fast and easily get out of sync with the
released version.
2023-08-31 02:15:58 +02:00
Fabio Manganiello ee955882bf
Always rebase when pulling from the Github remote.
continuous-integration/drone/push Build is failing Details
2023-08-31 02:11:50 +02:00
Fabio Manganiello e6b5abe909
Added SIGTERM handler for clean termination in Docker contexts.
continuous-integration/drone/push Build is failing Details
2023-08-31 02:09:23 +02:00
Fabio Manganiello 4dd713ffd2
Refactored Platydock and Platyvenv.
The two scripts now share the same command interface, behaviour and base
class.

Also, Platydock now builds a Docker image instead of just printing a
Dockerfile, unless the `--print` option is passed.
2023-08-31 01:16:56 +02:00
Fabio Manganiello 446bc2f674
Skip checksum in platypush-git AUR package.
continuous-integration/drone/push Build is passing Details
The master branch can move fast and easily get out of sync with the
released version.
2023-08-30 00:05:38 +02:00
Fabio Manganiello 429658e7c8
Refactored `PackageManager` classes.
continuous-integration/drone/push Build is passing Details
Instead of having a custom `get_installed` callable field, with
replicated code for each package manager, the field has now been
promoted to a class method containing the common logic, and the
instances now expect a `list` field (base command to list the installed
packages using the specified package manager) and a `parse_list_line`
callback field (to extract the base package name given a raw line from
the command above).

Also, we shouldn't run the list command if we're running within a Docker
context - the host and container environments will be different.
2023-08-28 01:26:19 +02:00
Fabio Manganiello 86e5f74645
platyvenv should generate (and document) a run.sh helper script. 2023-08-27 23:20:03 +02:00
Fabio Manganiello 9e6430a9ac Clone git repo if platyvenv is not running from a srcdir 2023-08-23 20:02:04 +02:00
Fabio Manganiello dafd65dc21
Added new platyvenv Python script. 2023-08-23 11:55:25 +02:00
Fabio Manganiello f230fa79bb
`to_pkg_install_commands` should skip already installed sys packages. 2023-08-23 11:51:53 +02:00
Fabio Manganiello 449821673c
Added `PackageManager.get_installed`. 2023-08-23 10:50:29 +02:00
Fabio Manganiello b10ccdb313
Added get_src_root utility function. 2023-08-23 02:53:31 +02:00
Fabio Manganiello 1ef0d804db
Added `full_command` argument to `to_pip_install_commands`.
This is useful if we just want to get the list of pip dependencies and
create our own pip command.
2023-08-23 02:19:54 +02:00
Fabio Manganiello 2bff4c9cf1
Exclude python-* system packages when installing in a venv. 2023-08-23 02:17:19 +02:00
Fabio Manganiello cddf318fa7
Dependencies.from_config should include the base system deps. 2023-08-23 02:16:33 +02:00
Fabio Manganiello 8f39231d31
Added new utility methods to the Dependencies class. 2023-08-23 02:15:50 +02:00
Fabio Manganiello 782ddf5097
Removed legacy platyvenv bash script.
The script is being migrated to a Python implementation.
2023-08-23 02:08:51 +02:00
Fabio Manganiello ce68250b4d
Refactor/documentation round for platydock. 2023-08-22 02:49:05 +02:00
Fabio Manganiello 10c0e5fcad
Added default_os field to PackageManagers enum elements.
This is useful to determine which is the default set of scripts that
should be used by the installer depending on the detected installed
package manager.
2023-08-20 21:21:37 +02:00
Fabio Manganiello 2c46b6fe14
Added git a required manifest dependency when needed.
It is needed for packages that install pip packages via git.
2023-08-20 21:19:15 +02:00
Fabio Manganiello a28dcb7a8d
Remove /var/cache/apk from container image after installation. 2023-08-20 14:19:04 +02:00
Fabio Manganiello a6752ed034
Fixed wrong event path in a manifest file. 2023-08-20 14:08:22 +02:00
Fabio Manganiello 700b8e1d16
Added header and footer to generated Dockerfile. 2023-08-20 14:05:22 +02:00
Fabio Manganiello f66c4aa071
Ignore the Dockerfile in the root folder
continuous-integration/drone/push Build is passing Details
2023-08-20 13:48:55 +02:00
Fabio Manganiello a6f8021150
`PackageManager` has both `install` and `uninstall`.
continuous-integration/drone/push Build is passing Details
2023-08-20 13:33:49 +02:00
Fabio Manganiello 5efcae64c1
Better Dockerfile logic to retrieve sources.
If the /install folder on the container doesn't contain a copy of the
source files, then the git repository will be cloned under that folder.

The user can specify via `-r/--ref` option which tag/branch/commit they
want to install.
2023-08-20 13:31:13 +02:00
Fabio Manganiello 28ba042810
If no configuration file is passed to platydock generate a minimal Dockerfile.
continuous-integration/drone/push Build was killed Details
2023-08-20 03:36:34 +02:00
Fabio Manganiello 199ac5f0f7
New way of managing installation scripts and dependencies.
Created `platypush/install` folder that contains:

- Dockerfiles for the supported distros
- Lists of required base dependencies for the supported distros
- Install and run scripts
- Added Debian to supported base images
2023-08-20 02:28:10 +02:00
Fabio Manganiello 71c5291190
Refactored the interface of Platydock and manifest utils. 2023-08-19 22:46:37 +02:00
Fabio Manganiello a99ffea37c
Fixed apt dependencies for `mpd` plugin. 2023-08-19 21:46:08 +02:00
Fabio Manganiello 7889b2f1db
Updated `generate_missing_docs` to use the new manifest API. 2023-08-19 13:49:31 +02:00
Fabio Manganiello 980af16984
Rewritten platydock utility.
Platydock now will only print out a Dockerfile given a configuration
file.

No more maintaining the state of containers, storing separate workdirs
and configuration directories etc. - that introduced way too much
overhead over Docker.
2023-08-19 13:47:43 +02:00
Fabio Manganiello 9002f3034a
Tweaked package managers install command arguments. 2023-08-19 13:46:08 +02:00
Fabio Manganiello 69706eaabe
`s/logger/_logger/` in the `plugins` module.
The `logger` name may clash with the context of an action, where
`logger` may have been set to something else.
2023-08-19 13:32:19 +02:00
Fabio Manganiello 1cb686bdab
Updated the `inspect` plugin to the new manifest utils interface. 2023-08-19 13:31:48 +02:00
Fabio Manganiello 043f303761
`s/HttpBackend._DEFAULT_HTTP_PORT/HttpBackend.DEFAULT_HTTP_PORT/g` 2023-08-19 13:30:51 +02:00
Fabio Manganiello dd3a701a2e
Full rewrite of `platypush.utils.manifest`.
The new version encapsulates all the utility functions into three
classes - `Manifest`, `Manifests` and `Dependencies`.
2023-08-19 13:28:40 +02:00
Fabio Manganiello a8255f3621
Pass the configuration file used by the application to the Alembic process.
The database settings could also be overridden in the configuration file
besides the command line.

We should therefore pass the path to the runtime configuration file, so
the Alembic process can initialize its configuration from the same file
and use the same settings.
2023-08-19 13:23:20 +02:00
Fabio Manganiello 1825b492b3
Replaced `Config.workdir` with `Config.get_workdir()`.
Again, Python < 3.9 doesn't like class properties.
2023-08-19 13:21:24 +02:00
Fabio Manganiello a8836f95f5
Support explicit `workdir` parameter override in `Config` constructor. 2023-08-19 13:15:29 +02:00
Fabio Manganiello 5bc82dfe64
s/Config._cfgfile/Config.config_file/g 2023-08-19 13:13:36 +02:00
Fabio Manganiello 181da63c89
Pass the database engine to the Alembic process as an extra argument.
If the path of the default database engine is overridden via `--workdir`
option then it won't be visible to the new `python` subprocess spawned
for Alembic.
2023-08-19 13:02:05 +02:00
Fabio Manganiello c2b3ec8ce3
Fixed manifest files with outdated formats. 2023-08-19 12:54:33 +02:00
Fabio Manganiello e463a52435
Use `sys.executable` rather than `'python'` to launch the application. 2023-08-19 12:40:57 +02:00
Fabio Manganiello 0a5fc40dc5
Merge branch 'master' into 276/better-docker 2023-08-18 17:34:56 +02:00
Fabio Manganiello 3236e235ef Merge pull request '278/fix-variable-errors-on-python-3-8' (#279) from 278/fix-variable-errors-on-python-3-8 into master
continuous-integration/drone/push Build is failing Details
continuous-integration/drone Build is running Details
Reviewed-on: #279
2023-08-18 17:25:08 +02:00
Fabio Manganiello 2cab836bdf
`Entity.columns` class property replaced by `Entity.get_columns` method.
continuous-integration/drone/push Build is passing Details
Again, Python < 3.9 doesn't like the combination of `@property` +
`@classmethod`.
2023-08-18 17:20:53 +02:00
Fabio Manganiello a9cdff900e
_variable should be an external global function rather than a class property.
The combination of `@property` + `@classmethod` isn't supported on
Python < 3.9.
2023-08-18 16:16:47 +02:00
Fabio Manganiello d0c89f88a8
Fixed parenthesised multi-with statement.
This syntax is not supported on Python < 3.9, and therefore it should be
broken down as a multi-line statement.
2023-08-18 16:10:31 +02:00
Fabio Manganiello ca95490412
Added timeout parameter to requests.get in the rss plugin.
continuous-integration/drone/push Build is passing Details
2023-08-18 15:53:30 +02:00
Fabio Manganiello 5dd7345c0b
Sync the latest parse timestamps in main instead of __init__ in rss.
We should load the latest timestamps from the db when the thread starts
instead of doing it in the constructor.

The constructor may be invoked when the entities engine hasn't been
initialized yet, and result in deadlocks.
2023-08-18 15:51:11 +02:00
Fabio Manganiello ec64b0ef8b
Added `--device_id` command line option.
continuous-integration/drone/push Build is failing Details
2023-08-17 23:16:24 +02:00
Fabio Manganiello ac83b43f98
Support for custom key-value overrides on `Config.init`. 2023-08-17 22:03:39 +02:00
Fabio Manganiello 657b2cc87d
Create the default configuration file even if --config is supplied but the file doesn't exist.
continuous-integration/drone/push Build is failing Details
2023-08-17 11:25:49 +02:00
Fabio Manganiello afa4de5673
Dockerfile moved to application root
continuous-integration/drone/push Build is passing Details
2023-08-17 10:38:21 +02:00
Fabio Manganiello 24b04d9103
s/--config-file/--config/ option in Dockerfile.
continuous-integration/drone/push Build is failing Details
2023-08-17 10:35:40 +02:00
Fabio Manganiello f07b774e75
A better Dockerfile.
continuous-integration/drone/push Build is passing Details
2023-08-17 03:04:34 +02:00
Fabio Manganiello bf7d060b81
Added `@ensure_initialized` decorator to actions in `variable`.
continuous-integration/drone/push Build is passing Details
The `variable` plugin may break in the constructor the first time the
application is started.

That's because it tries to initialize the cache of stored variables, but
the local database hasn't yet been initialized.

That's because plugins are registered _before_ the entities engine is
initialized, as the entities engine assumes that it already has plugins
to scan for entities.

Therefore, the initialization of the `variable` plugin's cache should be
lazy (only done upon the first call to `get`/`set` etc.), in order to
prevent deadlock situations where the plugin waits for the engine to
start, but the engine will be initialized only after the plugin is
ready.

And the lazy initialization logic should also ensure that the entities
engine has been properly started (and emit a `TimeoutError` if that's
not the case), in order to prevent race conditions.
2023-08-17 02:47:30 +02:00
Fabio Manganiello adfedfa2dd
s/TimeoutError/AssertionError/ if get_entities_engine times out. 2023-08-17 02:36:40 +02:00
Fabio Manganiello ec2b8da983
Ignore Redis errors when a backend sends an unregister notify event.
When that happens, it's most likely that the application is already
stopping and the Redis service has already been terminated.
2023-08-17 01:49:41 +02:00
Fabio Manganiello 3bf068e0b2
The __main__ function should take no arguments.
setup.py won't pass any arguments to `main()`, so the default entry
point should get them itself from `sys.argv`.
2023-08-17 01:35:39 +02:00
Fabio Manganiello a52de0e086
Removed tz dependency. 2023-08-17 00:35:39 +02:00
Fabio Manganiello e9dbcff1a8
Removed old `bin/platypush` script.
It's already been replaced by the setup.py entry point.
2023-08-16 23:52:54 +02:00
Fabio Manganiello 98e9abde18
Extended manifest files with Python system packages (if available).
continuous-integration/drone/push Build is passing Details
- If a Python optional dependency is available as a system package on
  the target system, try and install it that route rather than pip. It's
  usually faster and it decreases the risk of breaking system packages.

- Added support for apk dependencies in manifest files. This brings the
  number of distros officially supported by all the extensions to four:

  - Alpine
  - Arch
  - Debian
  - Ubuntu
2023-08-16 22:43:51 +02:00
Fabio Manganiello c2a17f0d75 Merge pull request '[#272] Support for external stop/restart control on the application' (#273) from 272/external-proc-controller into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: #273
2023-08-15 21:34:43 +02:00
Fabio Manganiello fef6513cc8
Alpine Linux requires the linux-headers package to build psutil.
continuous-integration/drone/push Build is passing Details
2023-08-15 11:40:02 +02:00
Fabio Manganiello 00863a176e
Added `application` plugin.
continuous-integration/drone/push Build is failing Details
2023-08-15 11:20:24 +02:00
Fabio Manganiello f51beb271e
Large refactor + stability fixes for the external process control logic. 2023-08-15 11:12:21 +02:00
Fabio Manganiello 46245e851f
Synchronize with the currently running stop thread (if any) in `Backend.wait_stop`. 2023-08-15 02:08:47 +02:00
Fabio Manganiello a8a7ceb2ac
Implemented `HttpBackend._stop_workers`.
The Tornado WSGI container won't guarantee the termination of the
spawned workers upon termination, so the code of the backend has to take
care of it and terminate all the children processes of the server
process when it terminates.

This also means that `psutil` is now a required base dependency, as we
need to expand the process subtree under the webserver launcher.
2023-08-15 00:13:34 +02:00
Fabio Manganiello 04921c759f
Added `wait_stop` method to the entities engine and cron scheduler. 2023-08-14 23:49:47 +02:00
Fabio Manganiello ceb9d6d1ba
Removed redundant `Backend._get_redis()` method.
It was used only once, and it could easily be replaced by
`platypush.utils.get_redis()`.
2023-08-14 23:37:38 +02:00
Fabio Manganiello 7157936b87
Added get_remaining_timeout utility function. 2023-08-14 23:17:50 +02:00
Fabio Manganiello dc1a152433
Added `get_default_pid_file` utility method. 2023-08-14 10:47:25 +02:00
Fabio Manganiello c11bc69a66
Handle `KeyboardInterrupt` and process return code in the main. 2023-08-13 23:55:40 +02:00
Fabio Manganiello 8819a0ed4c
Added `CommandStream` to the main `Application`.
The stream will be used to communicate command messages from the
application to its runner.
2023-08-13 23:51:21 +02:00
Fabio Manganiello 06111587f7
Added `CommandStream` class.
This abstraction is used to write and read commands over a UNIX socket.
2023-08-13 23:37:51 +02:00
Fabio Manganiello c89f992867
Added `StopCommand` and `RestartCommand`. 2023-08-13 23:36:36 +02:00
Fabio Manganiello b1f244a812
Added `ControllableProcess` class.
This class can be used to easily control the execution of underlying
processes.
2023-08-13 23:33:08 +02:00
Fabio Manganiello efef9d7bc0
Added `commands` module. 2023-08-13 23:21:36 +02:00
Fabio Manganiello 97adc3f775
Moved application argument parser to an external `platypush.cli` module. 2023-08-13 22:27:16 +02:00
Fabio Manganiello 1819ee75ef
`s/Application.stop_app/Application.stop/g` 2023-08-13 22:23:15 +02:00
Fabio Manganiello 827b564006
Using a single constant for DEFAULT_REDIS_QUEUE.
Also, catch `AttributeError` on `self._proc.terminate` in the
`HttpBackend`, since the process may already have been terminated and
set to null by another worker process.
2023-08-13 22:20:16 +02:00
Fabio Manganiello 4062ddbcf0
More improvements to the `inspect` plugin.
continuous-integration/drone/push Build is passing Details
- Support for distinct `type` field on constructor and method arguments.

- Added `has_varargs` field.

- Added `required` field.

- Better logic for parsing arguments `default` values.
2023-08-08 20:47:27 +02:00
Fabio Manganiello 9beb0a7af3
Skip `:type:` annotations from docstring args documentation. 2023-08-08 20:47:27 +02:00
Fabio Manganiello 2a30f060b4
Parse the arguments list from `obj_type.__init__.__doc__` too. 2023-08-08 20:47:27 +02:00
Fabio Manganiello 1474685cc0
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2023-08-06 22:51:57 +00:00
Fabio Manganiello 26b4dcba46
Reduced padding of ConfirmDialog body element.
continuous-integration/drone/push Build is passing Details
2023-08-07 00:50:10 +02:00
Fabio Manganiello 435cbe7b1f
Keep track of the original .git/config path before running cd. 2023-08-07 00:45:51 +02:00
Fabio Manganiello 5184543a3e
Normalize the size of the camera frame container from window size.
continuous-integration/drone/push Build is failing Details
If the window is smaller than the camera resolution, then we should
scale down the container size accordingly.
2023-08-07 00:38:19 +02:00
Fabio Manganiello 8b245a1618
Backup/restore the git configuration in the build-ui step.
continuous-integration/drone/push Build is passing Details
This is to ensure that following steps that depend on the default
username and email (e.g. the AUR release step) won't fail because of
mismatching identities.
2023-08-07 00:19:02 +02:00
Fabio Manganiello 39fb3026bf
Prevent push loops in build-ui pipeline.
The pipeline should check if the latest commit is an automated UI build
commit before proceeding with a new build.

We need this check in place to prevent pipelines triggered by a push in
another pipeline that end up triggering other pipelines until a manual
cancel.
2023-08-07 00:10:46 +02:00
Fabio Manganiello 2005bc9f62
Always run notify-build-status - including on failure. 2023-08-07 00:05:13 +02:00
Fabio Manganiello dd313c6371
[Automatic] Updated UI files
continuous-integration/drone/push Build was killed Details
2023-08-06 21:50:25 +00:00
Fabio Manganiello 2f007888fc
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2023-08-06 21:48:33 +00:00
Fabio Manganiello 609a8c6052
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2023-08-06 21:46:44 +00:00
Fabio Manganiello 276a9a7421
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2023-08-06 21:44:51 +00:00
Fabio Manganiello 715cdcfcff
More consistent style for the buttons on the tokens settings page.
continuous-integration/drone/push Build is failing Details
2023-08-06 23:42:50 +02:00
Fabio Manganiello 6453b7d391
Explicitly re-add the repo SSH origin and push.
Committing alone doesn't seem to suffice in the build-ui Drone CI step.
2023-08-06 23:40:35 +02:00
Fabio Manganiello bd49e460d5
More style improvements for the user settings panel.
continuous-integration/drone/push Build is passing Details
2023-08-06 23:36:06 +02:00
Fabio Manganiello 51f907e1b5
Make sure that neither dist nor node_modules are present before building the UI.
continuous-integration/drone/push Build is passing Details
2023-08-06 23:19:43 +02:00
Fabio Manganiello 6eed558342
More improvements on the users settings panel.
continuous-integration/drone/push Build was killed Details
2023-08-06 23:14:54 +02:00
Fabio Manganiello d92da5fe6f
Simplified Drone CI DAG.
Removed redundant `depends_on` steps in the pipeline.
2023-08-06 22:36:04 +02:00
Fabio Manganiello 2d999c471a
Removed git push from build-ui pipeline.
continuous-integration/drone/push Build is passing Details
If my understanding of Drone CI pipelines is correct, the steps are
executed before the push, so any new commits should be pushed too.
2023-08-06 22:31:05 +02:00
Fabio Manganiello a739303041
Added build-ui step to the Drone pipeline.
continuous-integration/drone/push Build is failing Details
2023-08-06 22:21:22 +02:00
Fabio Manganiello 1d47b35219
Updated UI dependencies 2023-08-06 20:38:46 +02:00
Fabio Manganiello 237e0c47cb
Redesigned config panel UI. 2023-08-06 18:49:03 +02:00
Fabio Manganiello d3fce6d922
Added notify-build-status step to Drone pipeline.
continuous-integration/drone/push Build is passing Details
2023-08-06 11:14:12 +02:00
Fabio Manganiello ed192faab2
Added notify-release step to Drone pipeline. 2023-08-06 11:08:01 +02:00
Fabio Manganiello 7a15c7c749
Added update-pip-package step in Drone pipeline. 2023-08-06 10:49:44 +02:00
Fabio Manganiello 063697c824
Remote and branch should be specified in git pull --tags
continuous-integration/drone/push Build is passing Details
2023-08-06 00:57:00 +02:00
Fabio Manganiello f9c74a3c98
Git tags lookup only works in Drone pipelines if tags have been pulled.
continuous-integration/drone/push Build is failing Details
2023-08-06 00:55:04 +02:00
Fabio Manganiello d887553211
Use `HEAD...v${VERSION}` to infer the git release number.
continuous-integration/drone/push Build is passing Details
2023-08-06 00:48:20 +02:00
Fabio Manganiello cd5c9fd046
Included Arch packages automation in .drone.yml
continuous-integration/drone/push Build is passing Details
2023-08-06 00:44:03 +02:00
Fabio Manganiello 1a2ab13197
Only rebuild docs when a new version is released.
continuous-integration/drone/push Build is passing Details
Also removed the docs build status badge from README, as it is now part
of the standard Drone build process.
2023-08-05 14:43:10 +02:00
Fabio Manganiello 69f5bee397
Added docs rebuild step in Drone CI pipeline
continuous-integration/drone/push Build is passing Details
2023-08-04 11:18:42 +02:00
Fabio Manganiello 53aeb0b3b1
Better documentation for the Redis server + LINT fixes.
continuous-integration/drone/push Build is passing Details
1. Added documentation to the README on the possible options to run the
   Redis service.

2. Show a relevant message to the user if the application is run with
   `--start-redis` and Redis couldn't start.

3. Some LINT/black chores on some files that hadn't been touched in a
   while.
2023-08-02 22:17:11 +02:00
snyk-bot 7cda9954d4
fix: upgrade vue-router from 4.1.2 to 4.2.3
Snyk has created this PR to upgrade vue-router from 4.1.2 to 4.2.3.

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

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-07-27 02:01:02 +00:00
snyk-bot 26c9694664
fix: upgrade core-js from 3.23.4 to 3.31.1
Snyk has created this PR to upgrade core-js from 3.23.4 to 3.31.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=referral&page=upgrade-pr
2023-07-27 02:00:57 +00:00
Fabio Manganiello 99018598a5
Added reference to the IRC channel to the README.
continuous-integration/drone/push Build is passing Details
2023-07-25 00:29:03 +02:00
Fabio Manganiello e4756eb639
Replaced deprecated `flask.escape` with `markupsafe.escape`.
continuous-integration/drone/push Build is passing Details
continuous-integration/drone Build is passing Details
2023-07-25 00:26:15 +02:00
Fabio Manganiello 82811a11a6
Replaced `git push --mirror` with `git push --all` in drone.yml.
continuous-integration/drone/push Build is passing Details
If the local clone doesn't have the tags or branches for some reason, we
don't want to lose that information on the Github repo.
2023-07-25 00:21:56 +02:00
Fabio Manganiello e240a8d3dc
Removed .gitlab-ci.yml
continuous-integration/drone/push Build is passing Details
2023-07-25 00:01:46 +02:00
Fabio Manganiello eadcfe345a
Added github-mirror step to .drone.yml 2023-07-25 00:00:47 +02:00
Fabio Manganiello 8f8e609231
Replaced Reddit link in the README with the local Lemmy instance
continuous-integration/drone/push Build is passing Details
2023-07-24 12:34:02 +02:00
Fabio Manganiello 7646d00b2a
Build status badge on README moved from my self-made txt-based framework to the Drone page at ci-cd.platypush.tech 2023-07-24 12:29:24 +02:00
Fabio Manganiello bfd5959735
(Fixed?) .drone.yml format
continuous-integration/drone Build is passing Details
2023-07-24 12:12:13 +02:00
Fabio Manganiello 27705f7bdf Test pipelines migrated to Drone CI
continuous-integration/drone Build was killed Details
2023-07-24 11:05:41 +02:00
Fabio Manganiello 9788c642f9
Fixed Dockerfile 2023-07-24 11:04:17 +02:00
Fabio Manganiello 1586484e84
Upgraded Dockerfile 2023-07-24 10:37:51 +02:00
Fabio Manganiello 91cd08cdff
Adapted tests to use a locally started Redis instance. 2023-07-24 10:37:07 +02:00
Fabio Manganiello 7a20fec52f
[#60] Added `--workdir` and `--logsdir` command-line options.
Also, the application is now using `XDG_CONFIG_HOME` and
`XDG_DATA_HOME` if available to lookup the configuration file and
working directory.

Closes: #60
2023-07-24 03:29:08 +02:00
Fabio Manganiello c1d66abb89
[#60] Added `--workdir` and `--logsdir` command-line options.
Closes: #60
2023-07-24 03:20:18 +02:00
Fabio Manganiello 5fd40af285 Revert "Added explicit --help option."
This reverts commit 1304be0718.
2023-07-24 02:38:12 +02:00
Fabio Manganiello 1304be0718 Added explicit --help option.
argparse.ArgumentParser doesn't seem to add the option automatically
anymore.
2023-07-24 02:11:42 +02:00
Fabio Manganiello e9a568fdd2
Unified interface to retrieve the Redis bus configuration.
A common `utils.get_redis_conf` has been created to handle the cascade
fallback logic used to retrive the default Redis configuration.
2023-07-24 01:04:13 +02:00
Fabio Manganiello 77ffefdccb
Added a `Config.set` method.
A useful interface to change configuration values at runtime.
2023-07-24 00:48:07 +02:00
Fabio Manganiello dd862db29a
[chore] LINT fixes 2023-07-24 00:35:03 +02:00
Fabio Manganiello 3e3d47aa44
Check first the configuration of the Redis plugin and then that of the backend. 2023-07-24 00:26:49 +02:00
Fabio Manganiello 315a89fb65
Added a `default` parameter to `Config.get`. 2023-07-23 23:31:57 +02:00
Fabio Manganiello 37dcaba7a1
Refactored structure of main application and startup scripts.
The main application class has been moved from __init__ to the app
module.

__init__ will contain instead the relevant global variables and the
modules and objects exposed to external integrations - such as
`get_plugin` and `get_backend`, or the `main` itself.

This will make future integrations much easier - the global __init__
doesn't contain any business logic now, it can import anything without
fearing circular dependencies, and it can limit its exposed objects to
those that we want to expose to 3rd-party integrations and scripts.

It will also make it easier to extend the main entry point with
additional logic - such as a supervisor or an embedded Redis server.
2023-07-23 23:12:36 +02:00
Fabio Manganiello 0dc380fa94
Removed dependency from prctl.
Also, black'd and LINT-fixed some files that hadn't been touched in a
while.
2023-07-23 19:17:30 +02:00
Fabio Manganiello 04b759e4d5
Upgraded base Python image in example Dockerfile.
3.7 -> 3.11
2023-07-23 17:27:48 +02:00
Fabio Manganiello 15a34ebac9
Upgraded Docker base image.
Debian base image bumped from Bullseye -> Bookworm.
2023-07-23 17:25:52 +02:00
Fabio Manganiello cfdecd5703
[#267] Don't show the PWA popup again after the user dismisses it.
Plus, upgraded a bunch of frontend libraries.

Closes: #267
2023-07-23 02:44:17 +02:00
Fabio Manganiello 454228c56e
Upgraded UI dependencies 2023-07-23 02:42:14 +02:00
Fabio Manganiello 11f336b9b5
Merge pull request #386 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/word-wrap-1.2.5
Bump word-wrap from 1.2.3 to 1.2.5 in /platypush/backend/http/webapp
2023-07-22 23:49:40 +02:00
dependabot[bot] 33699fcac8
Bump word-wrap from 1.2.3 to 1.2.5 in /platypush/backend/http/webapp
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-22 21:48:53 +00:00
Fabio Manganiello ac9950a441
Merge pull request #385 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/webpack-5.88.2
Bump webpack from 5.70.0 to 5.88.2 in /platypush/backend/http/webapp
2023-07-22 23:47:50 +02:00
dependabot[bot] 505cba44b8
Bump webpack from 5.70.0 to 5.88.2 in /platypush/backend/http/webapp
Bumps [webpack](https://github.com/webpack/webpack) from 5.70.0 to 5.88.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.70.0...v5.88.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-22 21:46:59 +00:00
Fabio Manganiello 1d98f54c54
Bump version: 0.50.2 → 0.50.3 2023-07-22 23:36:04 +02:00
Fabio Manganiello a65988546b
Updated CHANGELOG 2023-07-22 23:35:58 +02:00
Fabio Manganiello 66981bd00b
Updated email addresses and black'd some old source files. 2023-07-22 23:02:44 +02:00
Fabio Manganiello cf8ecf349b Merge pull request '[#266] XMPP integration implementation' (#269) from 266-xmpp-integration into master
Reviewed-on: #269
2023-07-22 22:40:35 +02:00
Fabio Manganiello 3eda0c6f17
[#268] Implemented XMPP integration. 2023-07-22 22:36:36 +02:00
Fabio Manganiello 63afd90701
Serialize exceptions in the default JSON serializers.
This allows us to easily pass errors in internal JSON payloads, and
ensure that these are serialized consistently across all the
integrations.
2023-07-22 15:14:05 +02:00
Fabio Manganiello cef9d0e007
Always serialize exception names when logging/returning request exceptions. 2023-07-22 15:13:17 +02:00
Fabio Manganiello d49e5b1f6a
Expose `Config.workdir` property.
This is a useful proxy to avoid using `Config.get('workdir')` string
lookup.
2023-07-22 15:11:58 +02:00
Fabio Manganiello c846c61493
Refactored `Config.__init__`.
The constructor of the `Config` class had grown too big. It's much more
manageable if split into multiple sub-constructor helpers.
2023-07-15 13:38:07 +02:00
Fabio Manganiello 0a3d6add83
Support `./config.yaml` as a config file location. 2023-07-15 01:29:41 +02:00
Fabio Manganiello fa1364d854
Improved logging for requests, responses and events.
- The following logging namespaces are now used, to make it easier to
  filter only log lines related to the logged application message:

  - `platypush:events`
  - `platypush:requests`
  - `platypush:responses`

- Those messages are always logged as JSON, with no prefixes nor
  suffixes.

- Requests are always logged when executed - no more delegation to the
  upstream backend.

- Responses are always logged when fully populated (including `id`,
  `origin`, `target` etc.), instead of being logged when still partially
  populated. This makes it particularly easy to link request/response
  IDs directly from the logs.
2023-07-15 01:11:45 +02:00
Fabio Manganiello cb04af0bbd
Catch TypeError when execution an action.
Most of TypeError are due to the user passing wrong data. It usually
doesn't mean that we have to fail hard and reload the plugin, nor retry
the call with the same parameters.
2023-07-14 22:20:27 +02:00
Fabio Manganiello 27cf1bec52
Removed some optional top-level imports.
Optional top-level imports in Tornado route declarations will trigger
`ImportError`. While this will just mean that those routes will be
skipped, it will also generate a lot of noise on the logs.
2023-07-01 03:13:38 +02:00
Fabio Manganiello e0af2daaff
Bump version: 0.50.1 → 0.50.2 2023-06-30 23:12:40 +02:00
Fabio Manganiello 8c063e2d03
Updated CHANGELOG 2023-06-30 23:12:13 +02:00
Fabio Manganiello 42a990a132
Format string typo fix 2023-06-30 23:07:00 +02:00
Fabio Manganiello 9a7fc031d9
A more robust logic to detect plugins by class type in get_plugin. 2023-06-30 23:01:09 +02:00
Fabio Manganiello f3b2386ed6
Bump version: 0.50.0 → 0.50.1 2023-06-28 02:44:13 +02:00
Fabio Manganiello 17044ebf6b
Updated setup.py version 2023-06-28 02:43:40 +02:00
Fabio Manganiello 08c3a1e11a
Bump version: 0.24.5 → 0.50.0 2023-06-28 02:23:09 +02:00
Fabio Manganiello f5f0a2f5ab
Updated version number in the CHANGELOG 2023-06-28 02:20:27 +02:00
Fabio Manganiello 2f441e1aaa
Updated README.
- Added web panels screenshots.
- Added documentation for event hooks with structured/relational
  filters.
- Added documentation for the nginx configuration and the PWA support.
2023-06-28 02:18:35 +02:00
Fabio Manganiello 5e5403287e
The `inspect` plugin should not fail hard if the cache couldn't be loaded.
This can happen for many reasons - not only if the cache file is not
accessible, but also if the structure/signature of some pickled objects
has changed. In that case, we should invalidate the current cache and
re-initialize it instead of failing.
2023-06-28 01:33:12 +02:00
Fabio Manganiello c5059f6908
Updated CHANGELOG 2023-06-28 00:12:03 +02:00
Fabio Manganiello ba827b0248
Added `sound` plugin documentation.
- Added example of how to stream audio over HTTP.

- Added Portaudio to the apt/pacman dependencies.
2023-06-28 00:10:36 +02:00
Fabio Manganiello a103ea49f1
Fixed ffmpeg/audio consumer synchronization upon timeout. 2023-06-27 15:12:15 +02:00
Fabio Manganiello 77f7cd8b90
Don't use typing.Self (yet).
typing.Self has only been introduced in Python 3.10.
2023-06-27 14:17:04 +02:00
Fabio Manganiello b01bf43552 Merge pull request 'New streaming endpoints' (#265) from 264-streaming-endpoints into master
Reviewed-on: #265
2023-06-27 13:38:12 +02:00
Fabio Manganiello f2540437b7
Sound plugin rewritten almost from scratch. 2023-06-27 13:31:38 +02:00
Fabio Manganiello 2fb6e4d7d0
Updated webapp dist files 2023-06-16 15:48:23 +02:00
Fabio Manganiello 2f4229d7b1
pylint fixes for the camera plugin. 2023-06-16 15:40:05 +02:00
Fabio Manganiello 9aa8e4538a
Better termination logic for the ffmpeg audio converter. 2023-06-16 11:47:37 +02:00
Fabio Manganiello a6351dddd4
Extracted `AudioRecorder` out of `SoundPlugin`. 2023-06-16 03:12:55 +02:00
Fabio Manganiello da93f1b3b0
[Chore] pylint 2023-06-14 01:44:36 +02:00
Fabio Manganiello c8786b75de
`sound.recordplay` merged into `sound.record`. 2023-06-12 22:15:02 +02:00
Fabio Manganiello be794316a8
Merged `sound.stream_recording` and `sound.record`. 2023-06-12 13:06:02 +02:00
Fabio Manganiello a415c5b231
Merged outfile/fifo logic in `sound.stream_recording`. 2023-06-12 12:33:14 +02:00
Fabio Manganiello e238fcb6e4
Refactoring the `sound` plugin to use ffmpeg as a stream converter. 2023-06-11 12:48:49 +02:00
Fabio Manganiello 4587b262b0
Stream camera frames over HTTP using a Redis pub/sub mechanism. 2023-06-05 20:40:12 +02:00
Fabio Manganiello d7208c6bbc
Refactored Tornado routes for native pub/sub support.
The Redis pub/sub mechanism is now a native feature for Tornado routes
through the `PubSubMixin`.

(Plus, lint/black chore for the sound plugin)
2023-05-30 21:58:27 +02:00
Fabio Manganiello 8b5eb82497
Camera stream writer fixes.
- The readiness condition should be `multiprocessing.Condition`, not
  `threading.Condition` - in most of the cases it will be checked in a
  multiprocess environment.

- Fixed parameter name for `write`.
2023-05-30 11:06:48 +02:00
Fabio Manganiello 4fffabd82a
Revert "Removed `camera.gstreamer`."
This reverts commit b4d714df8a.
2023-05-29 22:13:24 +02:00
Fabio Manganiello 4bf9c01ac9
Moved camera routes.
Camera routes migrated from Flask blueprints to Tornado handlers.
2023-05-27 22:24:45 +02:00
Fabio Manganiello b4d714df8a
Removed `camera.gstreamer`.
Too much of a pain in the ass to handle, too many format options to
think of, too many combinations of pipelines to support, and if I don't
think of those beforehand then I'll have to offload all of that
complexity on the user.
2023-05-27 22:19:50 +02:00
Fabio Manganiello 1c40e5e843
Black'd the camera plugin and writer.
Also, proper fix for the multi-inheritance problem of
the ffmpeg writers.
2023-05-23 20:42:59 +02:00
Fabio Manganiello a2f8e2f0d2
Fixed bottom margin for ConfirmDialog buttons 2023-05-22 16:44:53 +02:00
Fabio Manganiello a7aabd7c52
Fixed handling of `:meth:` docstring annotations with relative paths. 2023-05-22 16:32:30 +02:00
Fabio Manganiello 7eca1c27c9
Blackened the qrcode and pushbullet plugins 2023-05-22 02:33:54 +02:00
Fabio Manganiello aaac6488d6
Updated webapp dist files 2023-05-22 02:24:24 +02:00
Fabio Manganiello d7405ad05d
Added multiple parsers for the entities referenced in docstrings.
The `inspect` plugin can now detect references to plugins, backends,
events, responses and schemas in docstrings and replace them either with
links to the documentation or auto-generated examples.
2023-05-22 02:20:58 +02:00
Fabio Manganiello 4f11d7cf74
Updated webapp dist files 2023-05-21 03:15:16 +02:00
Fabio Manganiello b91c1eba6d
Parse `:return:` definitions from action docstrings too. 2023-05-21 03:05:19 +02:00
Fabio Manganiello 229b8f2985
Many improvements for the `execute` panel. 2023-05-21 03:04:52 +02:00
Fabio Manganiello edf1dbee1d
Updated webapp dist files 2023-05-20 15:54:18 +02:00
Fabio Manganiello 5efc90ca17
Better PWA installation prompt.
Display a popup modal instead of a confirm box to prompt the user to
install the PWA app.

`confirm` blocks the JavaScript engine when run in `beforeMount` and
therefore the browser won't be able to proceed with `event.prompt()`.
2023-05-20 15:52:37 +02:00
Fabio Manganiello 666ea9ea6b
Added `use_werkzeug_server` option to `backend.http`.
There are situations where you may not want to run the HTTP server in a
full blown WSGI-over-Tornado container - unit/integration tests and
embedded single-core devices are among those cases.

In those scenarios, we should allow the user to be able to run the
backend using the built-in Werkzeug server provided by Flask.
2023-05-20 15:26:58 +02:00
Fabio Manganiello 013274bcbc [#259] Proper support for the progressive webapp (#262)
Closes: 259
Reviewed-on: #262
2023-05-20 02:42:33 +02:00
Fabio Manganiello 27d4a20418
Use reflection to infer the arguments of a Python user procedure 2023-05-17 17:17:59 +02:00
Fabio Manganiello 0a1209fe6e
Updated webapp dist files 2023-05-17 10:56:37 +02:00
Fabio Manganiello 33e2879413
Various UI improvements for the execute tab. 2023-05-17 10:41:02 +02:00
Fabio Manganiello 91daec579d
Reverted to the previous style for entities on mobile.
Better to use screen width wisely and avoid unnecessary padding.
2023-05-17 01:13:09 +02:00
Fabio Manganiello 61ea3d79e4
Large refactor for the `inspect` plugin.
More common logic has been extracted and all the methods and classes
have been documented and black'd.
2023-05-17 00:05:22 +02:00
Fabio Manganiello 2cba504e3b
Improvements for the autocomplete component. 2023-05-14 15:07:54 +02:00
Fabio Manganiello 8447f9a854
Improved rendering of actions/arguments documentation.
The frontend now calls `utils.rst_to_html` to render the docstrings as
HTML instead of dumping them as raw text.

Also, actions and arguments are now cached to improve performance.
2023-05-14 15:06:34 +02:00
Fabio Manganiello 5f2d6dfeb5
Added `utils.rst_to_html` action. 2023-05-14 15:05:24 +02:00
Fabio Manganiello 3c83e7f412
A faster implementation for the `inspect.get_*` methods.
Plugin/backend lookup is now done by inspecting the manifest files
instead of searching all the subpackages.
2023-05-13 13:44:46 +02:00
Fabio Manganiello 72797e73ff
Changed the Tornado paradigm to start the WSGI workers.
Use `bind_sockets`/`fork_processes` instead of reinventing the wheel
with our own multiprocessing handling.
2023-05-13 12:35:20 +02:00
Fabio Manganiello ac4fe4447e
Revert "Added a multi-worker approach to the Tornado WSGI container."
This reverts commit 71401a4936.

Temporarily reverted this commit because the `reuse_address` on the
application's `listen` method has only been implemented in Tornado 6.2 -
and Debian stable still shipts Tornado 6.1.
2023-05-13 02:36:20 +02:00
Fabio Manganiello 71401a4936
Added a multi-worker approach to the Tornado WSGI container.
The WSGI container is a good option to wrap a multi-modal webapp
(Flask + websocket routes), but it's constrained to a single-process
approach and queued/pre-buffered requests. That makes performance poor
when handling requests that may take a few seconds to complete.
2023-05-13 01:26:18 +02:00
Fabio Manganiello b7b93edbae
Updated dist files 2023-05-12 03:52:33 +02:00
Fabio Manganiello a15191d4ca
Updated dist files 2023-05-12 03:51:59 +02:00
Fabio Manganiello d4f8e51caf
A less blocking implementation of the entities loading UI logic. 2023-05-12 03:49:20 +02:00
Fabio Manganiello 62d846ddda
Updated dist files 2023-05-12 03:42:17 +02:00
Fabio Manganiello 23a5e90e2e
Updated dist files 2023-05-12 03:26:55 +02:00
Fabio Manganiello 6cd9cb6e76
Better entities caching on the frontend. 2023-05-12 03:18:22 +02:00
Fabio Manganiello 79871e0fa1
Fixed devServer routes in vue.config.js.
Use `127.0.0.1` instead of `localhost` for the Vue proxy.
2023-05-12 02:57:14 +02:00
Fabio Manganiello cfedcd701e
Performance improvements when loading the Tensorflow plugin.
The Tensorflow module may take a few seconds to load the first time and
slow down the first scan of the plugins.

All the Tensorflow imports should therefore be placed close to where
they are used instead of being defined at the top of the module.
2023-05-11 19:48:22 +02:00
Fabio Manganiello f49ad4c349
Updated dist files 2023-05-10 02:52:24 +02:00
Fabio Manganiello 6b0f0883ee
A proper way to proxy websocket calls using the Vue devServer. 2023-05-10 02:27:01 +02:00
Fabio Manganiello 78c12212c6
[#260] A simple entities caching mechanism using the browser storage. 2023-05-10 02:26:06 +02:00
Fabio Manganiello 74ab884b7a
Proper redirects upon `/execute` failure.
If a call to `/execute` fails with a 401 or 412 status, then redirect
the user to `/register` or `/login`.
2023-05-10 02:24:50 +02:00
Fabio Manganiello 0de56ad52e
Added nginx sample configuration. 2023-05-10 00:59:41 +02:00
Fabio Manganiello 1395c472c0
`docutils` moved to required dependencies. 2023-05-09 21:59:36 +02:00
Fabio Manganiello 41233138ff
Blackened `inspect` module and extracted model defs to adjacent module. 2023-05-09 21:58:02 +02:00
Fabio Manganiello b91aedc553
Updated README toc format 2023-05-09 02:56:44 +02:00
Fabio Manganiello 5415f0ccf3
Updated README 2023-05-09 02:54:02 +02:00
Fabio Manganiello ab2425ebd0
[#260] Removed legacy `backend.websocket`.
It has now been replaced by the `/ws/events` and `/ws/requests`
websocket routes under `backend.http`.
2023-05-09 02:46:43 +02:00
Fabio Manganiello a069d23bb7
[#260] Added ``/ws/requests`` websocket route. 2023-05-09 02:40:32 +02:00
Fabio Manganiello 7716a416e9
[#260] Support for sending events via websocket over `/ws/events`. 2023-05-09 02:18:58 +02:00
Fabio Manganiello edb7197f71
[#260] Implemented authentication for websocket routes.
Plus, refactored the `backend.http.app.utils` module by breaking it down
into multiple components, as the module was starting to get too large.
2023-05-09 00:03:11 +02:00
Fabio Manganiello 2d4b179879
Include the path info in the logging messages in WSRoute. 2023-05-08 12:35:54 +02:00
Fabio Manganiello 3fc622e296
Remove legacy references to the websocket HTTP port and backend in platydock. 2023-05-08 12:25:09 +02:00
Fabio Manganiello f5fcccb0bd
Refactored the new websocket routes.
Defined a `platypush.backend.http.ws` package with all the routes, a
base `WSRoute` class that all the websocket routes can extend, and a
logic in the HTTP backend to automatically scan the package to register
exposed websocket routes.
2023-05-08 11:45:14 +02:00
Fabio Manganiello 56dc8d0972
Migrated the webapp to Tornado.
It was just too painful to find a combination of versions of  gunicorn,
gevent, eventlet, pyuwsgi etc. that could work on all of my systems.

On the other hand, Tornado works out of the box with no headaches.

Also in this commit:

- Updated a bunch of outdated/required integration dependencies.
- Black'd and LINTed a couple of old plugins.
2023-05-08 02:06:45 +02:00
Fabio Manganiello f81e9061a3
`lifespan=on` is actually not required on Flask config level. 2023-05-07 16:30:41 +02:00
Fabio Manganiello 692180c653
Back to uvicorn workers from eventlet.
The eventlet API has way too many dependency issues with gunicorn.

Still TODO: Fix or at least mitigate the WSGI workers timeout issue when
they handle websocket connections.
2023-05-07 15:37:58 +02:00
Fabio Manganiello 8102178ba4
Updated dist files 2023-05-07 13:00:48 +02:00
Fabio Manganiello 29c0a11c37
Forced to use the gunicorn version on Github.
Reason: gunicorn maintainers no longer give a fuck about their project
and they aren't letting anybody take over either - see
https://github.com/benoitc/gunicorn/pull/2581

This is not how a FOSS project should be run. A project with 9k stars
and countless usages shouldn't end up in a situation where users beg for
two years for a new release that fixes a bad regression and a bad
security vulnerability. The way gunicorn is maintained and run is an
insult to the whole FOSS community.
2023-05-07 12:54:50 +02:00
Fabio Manganiello c0a948f8ce
Removed remaining references to websocket port. 2023-05-07 12:54:13 +02:00
Fabio Manganiello bdbbd24e6f
Only include /ws/events as a proxied websocket, without messing with the /ws route exposed by the Vue debugger 2023-05-07 12:22:51 +02:00
Fabio Manganiello 059fff8558
Updated dist files 2023-05-07 12:19:13 +02:00
Fabio Manganiello f9b0bc905e
Migrated websocket service.
The websocket service is no longer provided by a different service,
controlled by a different thread running on another port.

Instead, it's now exposed directly over Flask routes, using
WSGI+eventlet+simple_websocket.

Also, the SSL context options have been removed from `backend.http`, for
sake of simplicity. If you want to enable SSL, you can serve Platypush
through a reverse proxy like nginx.
2023-05-07 12:08:28 +02:00
Fabio Manganiello 3aefc9607d
Migrated from waitress to gunicorn.
`waitress`, unlike `gunicorn`, doesn't provide an easy way to plug into
a WSGI socket that can be used for the websocket interface.
2023-05-07 00:42:57 +02:00
Fabio Manganiello ca65db016e
Added description line to `conf.py`. 2023-05-06 23:26:07 +02:00
Fabio Manganiello 9951d62511
Added logic to automatically generate the secret key for Flask. 2023-05-06 22:04:48 +02:00
Fabio Manganiello d1f0e1976c
Exclude squashfs/loopback mounts from `system.disk_info`. 2023-05-06 18:53:16 +02:00
Fabio Manganiello e33a391d25
Updated dist files 2023-05-06 12:37:00 +02:00
Fabio Manganiello 4f78d61223
Improved UI on mobile. 2023-05-06 12:34:27 +02:00
Fabio Manganiello 6e939bbe62
Close modals and dropdown when ESC is pressed. 2023-05-05 20:46:42 +02:00
Fabio Manganiello e9e59c857a
Updated dist files 2023-05-05 02:51:33 +02:00
Fabio Manganiello 59bf1c2aa0
Added close button to the modal's header. 2023-05-05 02:48:41 +02:00
Fabio Manganiello 8af3ae17b8
A more efficient way of detecting the entity groups to display.
Instead of iterating over each of the entities in a grouping to find out
which groups should be displayed based on the selector's policy, the
selector can directly keep its `selectedGroups` attribute in sync with
the index.
2023-05-05 02:33:34 +02:00
Fabio Manganiello 373788377b
Created two separate actions under `variable` to delete/unset.
`delete` will actually remove the record from the database (same as
`unset`'s new behaviour), while `unset` will set it to null without
deleting it (same as the `unset`'s previous behaviour).
2023-05-05 02:21:18 +02:00
Fabio Manganiello 98b9d31dd4
Updated dist files 2023-05-05 01:10:24 +02:00
Fabio Manganiello 4383dbb2b4
Bluetooth UI toggle aligned to the right - like all other toggles. 2023-05-05 01:04:39 +02:00
Fabio Manganiello 285f3941d9
Always use an external uWSGI server to run the web service.
Added `waitress` dependency. For performance and security reasons, it's
better to always run the Flask application inside of a uWSGI server.

`waitress` also makes things easier by avoiding to ask the user to
manually provide the external executable arguments, as it was the case
with `uwsgi` and `gunicorn`.
2023-05-05 00:07:13 +02:00
Fabio Manganiello 2c254e8eb9
numpy and PIL should be required dependencies for all camera plugins. 2023-05-04 23:44:42 +02:00
Fabio Manganiello 99311a6e71
Updated dist files 2023-05-04 02:23:24 +02:00
Fabio Manganiello 7db09276ca
Some small style improvements. 2023-05-04 02:20:40 +02:00
Fabio Manganiello 2398cac572
A more efficient and clean logic for `selectedEntities` calculation. 2023-05-04 02:19:55 +02:00
Fabio Manganiello 394e27eaf2
Refactored style for UI dropdowns. 2023-05-04 02:19:09 +02:00
Fabio Manganiello 9fd7f7db04 Fixed compatibility with new Sphinx version 2023-05-04 01:05:27 +02:00
Fabio Manganiello c690230930
An `AssistantEvent` should not fail initialization if the assistant integration isn't found. 2023-05-04 00:28:50 +02:00
Fabio Manganiello 04b1dad6d8
Removed `test_cron_execution_upon_system_clock_change`.
The test is too brittle as it depends on small mocked clock skews and it
can easily fail.
2023-05-04 00:11:11 +02:00
Fabio Manganiello 91d1d33ab6
Exclude `tests` from pip installation. 2023-05-03 21:45:02 +02:00
Fabio Manganiello 5d1c8cf8e9
Additional null check on this.searchTerm 2023-05-03 03:33:34 +02:00
Fabio Manganiello 3482c29679
Updated dist files 2023-05-03 03:18:44 +02:00
Fabio Manganiello a06d0ef6a1
Merged all the items in the entities panel's header in the Selector component. 2023-05-03 03:14:46 +02:00
Fabio Manganiello 7c7818dd76
Fixed entity search.
It was broken by the previous refactor of the entities panel, which no
longer triggers the `watch` callback on the upstream `entityGroups`.

The new approach listens for entity updates on the frontend bus and
dynamically creates the entity groupings in `selectedGroups` if they are
missing.
2023-05-03 02:12:14 +02:00
Fabio Manganiello 9922305ac5
Fixed grouping for `entityGroups.id`.
Unlike the other entity groupings, which are 4-layered (`grouping ->
group -> entity_id -> entity`), the grouping by ID only needs 3 layers
(`grouping -> entity_id -> entity`).
2023-05-03 02:09:51 +02:00
Fabio Manganiello cc2ec1db7f
The HTTP Zeroconf service should be registered before the server starts. 2023-05-02 21:24:50 +02:00
Fabio Manganiello 55cb87d14f
Updated dist files 2023-05-02 10:24:11 +02:00
Fabio Manganiello 68359b88a9
More performance improvements for the entities page.
- Don't recalculate entity groups every time. Instead, keep them in sync
  every time an entity is added or removed.

- Removed `computedChildren` from the entity component - no null nodes
  are guaranteed to be passed now, so there's no need for another
  iteration on the list of children.

- `childrenByParentId` now only looks in the scope of the entity's
  children instead of searching all the entities.
2023-05-02 10:14:03 +02:00
Fabio Manganiello 0fc0a22cd7
Reintroduced loading icon spin animation. 2023-05-02 10:08:36 +02:00
Fabio Manganiello 3febfabdd7
Bluetooth LE blacklisted device notices moved `info -> debug`. 2023-05-01 22:10:06 +02:00
Fabio Manganiello 998990aabc
Made `Entity.children_ids` resilient against deleted objects. 2023-05-01 22:09:16 +02:00
Fabio Manganiello 9d82ce6ea9
Noisy beacons notice back to debug level.
There's just too many of them and it ends up polluting the logs.
2023-05-01 21:25:42 +02:00
Fabio Manganiello ce248ccfbb
Added `children_ids` to the entity attributes serialized in `to_json`. 2023-05-01 19:59:13 +02:00
Fabio Manganiello de76c2b6a8
Updated dist files 2023-05-01 10:12:43 +02:00
Fabio Manganiello 835ad9f2dc
Use plugin as a default entity grouping instead of category 2023-05-01 10:06:11 +02:00
Fabio Manganiello 85ecdcb0cb
Removed entity icon loading animation.
The animation has a big impact on page loading performance when the
system includes a high number of entities that all need their loading
animation to be render.
2023-05-01 09:49:34 +02:00
Fabio Manganiello 24c6b7b377
Updated dist files 2023-05-01 01:25:27 +02:00
Fabio Manganiello b7cf1a42de
Use a proxy value in the `variable` component for the textbox.
Otherwise the value may keep being overwritten while the user is typing
a new one.
2023-05-01 01:22:20 +02:00
Fabio Manganiello a3839e637d
Set a max-width: 600px for group containers. 2023-05-01 01:22:02 +02:00
Fabio Manganiello 1e43866978
Moved more entity common CSS out of the Vue component. 2023-05-01 01:21:18 +02:00
Fabio Manganiello de84a65a22
Show prettified entity type when hover the entity icon. 2023-05-01 01:20:31 +02:00
Fabio Manganiello 7906ee2c49
Entity components style improvements.
Multiple style improvements for the entity components. Among these:

- A more consistent style for entity values and toggler buttons.
- Fixed overflowing/underflowing entities on smaller/larger screen
  sizes.
- Simplified the stylesheets for many entities as many component classes
  have now been moved to `common.scss`.
2023-04-30 22:32:50 +02:00
Fabio Manganiello d1066ba624
Use Math.round instead of parseInt when parsing durations. 2023-04-30 16:22:37 +02:00
Fabio Manganiello 5d4bffa119
Fixed retrieval of `entities` plugin. 2023-04-30 10:42:05 +02:00
Fabio Manganiello 94a493580c
Updated dist files 2023-04-30 01:36:13 +02:00
Fabio Manganiello 0b853e0a54
Apply `word-break: break-all` to entities' names and values.
The entity name and value in the component header may be arbitrarily
long and rendered on small screens.

We therefore need to ensure that the text won't overflow the screen
width.
2023-04-30 01:17:54 +02:00
Fabio Manganiello 3d7755159f
Improved compatibility for `traceback.format_exception`.
The new syntax, that only requires an `Exception` instance to be passed
to the function, is only compatible with Python >= 3.10.
2023-04-30 00:38:17 +02:00
Fabio Manganiello 12cca4991a
Fixed paths for Alembic's `package_data`. 2023-04-29 23:48:06 +02:00
Fabio Manganiello 6b28d16ccf
Exclude more noisy Bluetooth beacons.
Exclude any beacons from devices with no name, no children other than
services, and with none of those services being public/known.
2023-04-29 23:34:24 +02:00
Fabio Manganiello f764d1b4fb
Noisy Bluetooth beacons notices should be logged on info level. 2023-04-29 23:18:12 +02:00
Fabio Manganiello 52f036dc1d
Updated dist files 2023-04-29 22:49:35 +02:00
Fabio Manganiello cbf0ea8a19
Style fixes for mobile screens. 2023-04-29 22:45:10 +02:00
Fabio Manganiello 9ebdaf620e Merge pull request '[#255] Model variables as entities' (#256) from 255-model-variables-as-entities into master
Reviewed-on: #256
Closes: #255
2023-04-29 18:24:24 +02:00
Fabio Manganiello e96885a805
Delete the entity on `variable.unset` instead of setting it to null. 2023-04-29 18:21:57 +02:00
Fabio Manganiello b4048002b9
Updated dist files 2023-04-29 18:21:32 +02:00
Fabio Manganiello 6d9c34f06f
Added VariableModal to set variables from the dashboard. 2023-04-29 18:20:41 +02:00
Fabio Manganiello a3888be216
The robustness check in case of missing fields should also apply to other system entities. 2023-04-29 16:08:38 +02:00
Fabio Manganiello 8c9768b05e
Robustness check for system disk entities.
When the system information is still loading it may happen that the
device associated to the disk hasn't been loaded yet.
2023-04-29 16:04:57 +02:00
Fabio Manganiello a20065c649
Exposed `_entities` utility property in `Plugin`.
It can be used by other plugins to easily access the `entities` plugin,
along the lines of `db` and `redis`.
2023-04-29 15:50:31 +02:00
Fabio Manganiello 68d8befa34
Removed some vestigial commented code. 2023-04-29 15:28:44 +02:00
Fabio Manganiello 23b851e9d7
`variable.status` robustness fix.
`entities.transform_entities` will pass back an empty list instead of an
empty dict if no entities were found, and the function should be able to
handle it.
2023-04-29 15:24:58 +02:00
Fabio Manganiello e919bf95ad
Print the full stack trace if a plugin failed in `entities.scan` 2023-04-29 15:14:13 +02:00
Fabio Manganiello 38c87ef39f
Added frontend component for the `Variable` entity. 2023-04-29 11:37:21 +02:00
Fabio Manganiello f40f956507
Migrated `variable` table to the new entities framework. 2023-04-29 11:36:55 +02:00
Fabio Manganiello 8fe61217ce
Added `_db` and `_redis` properties to the Plugin class.
Plugins can now access the database and Redis APIs directly without
having to run their own `get_plugin` validation logic.
2023-04-29 11:35:57 +02:00
Fabio Manganiello a8d2261f32
Added `core_plugins` to the configuration.
These plugins (only including `variable` for now) are a core part of the
application and should always be explicitly enabled.
2023-04-29 11:34:34 +02:00
Fabio Manganiello 78cee5d9b0
Added support for automatic database migrations.
Added Alembic environment and `run_db_migrations` logic to the entities
engine so database schema changes can be processed as soon as the
application is started.
2023-04-29 11:32:31 +02:00
Fabio Manganiello ff9b76477d
Fixed arguments naming. 2023-04-28 11:04:33 +02:00
Fabio Manganiello 38262e245e Merge pull request '[#253] Support for relational filters on event hooks' (#254) from 253-support-for-relational-filters-on-event-hooks into master
Reviewed-on: #254
Closes: #253
2023-04-27 22:08:37 +02:00
Fabio Manganiello 162904f281
[#253] Added support for relational filters on event hooks. 2023-04-27 22:07:02 +02:00
Fabio Manganiello 87db5ca5f3 Exclude all iBeacon devices by default (it's not only Apple, it's everyone) 2023-04-26 14:17:59 +02:00
Fabio Manganiello 7685521e2b
Always use the default configuration values for MQTT listeners if not specified 2023-04-26 03:30:05 +02:00
Fabio Manganiello 10d587efd0
FIX: Possible assert evaluation error.
Some versions/configurations of Python may throw `Boolean value of this
clause is not defined` here.
2023-04-26 02:25:28 +02:00
Fabio Manganiello 339786b123 Merge pull request 'Support for nested/partial event hook filters' (#252) from 251-nested-filters-on-event-hooks into master
Reviewed-on: #252
Closes: #251
2023-04-26 01:55:27 +02:00
Fabio Manganiello 245472a4c5
Better event hooks filters.
- Support for nested attributes on event hook conditions. Things like
  these are now possible:

```
from platypush.event.hook import hook
from platypush.message.event.entities import EntityUpdateEvent

@hook(EntityUpdateEvent, entity={"external_id": "system:cpu"})
def on_cpu_update_event(event: EntityUpdateEvent, **_):
    print(event.args["entity"]["percent"])
```

- The scoring/regex extraction/partial string match logic in
  `_matches_argument` is actually only needed for
  `SpeechRecognizedEvent`. Other events don't need these features, and
  event hooks may be actually triggered unexpectedly in case of partial
  matches. Therefore, the "complex" `_matches_argument` has been moved
  as an override only for `SpeechRecognizedEvent`, and all the other
  events will perform simple key-value matching.
2023-04-26 01:45:58 +02:00
Fabio Manganiello ee54e0edbf
Use a font-awesome spinner instead of an animated gif when loading entities 2023-04-25 16:42:01 +02:00
Fabio Manganiello cb288deb71
Exclude more noisy BLE beacons.
Excluding Apple iBeacons and devices with no name and no services.
2023-04-25 16:19:11 +02:00
Fabio Manganiello 99382e4505 Merge pull request 'Fixed compatibility with SQLAlchemy >= 2.0' (#250) from 239-sqlalchemy-2-compatibility into master
Reviewed-on: #250
Closes: #239
2023-04-25 10:47:27 +02:00
Fabio Manganiello 9c93b793e3
Merge branch 'master' into 239-sqlalchemy-2-compatibility 2023-04-25 10:44:31 +02:00
Fabio Manganiello dd60b8924d
Wrap the `PRAGMA` statement in `sqlalchemy.text`.
SQLAlchemy 2 no longer supports raw strings passed to `.execute()`
methods.
2023-04-25 10:41:37 +02:00
Fabio Manganiello 440d70d9cf
LINT/format fixes. 2023-04-25 10:36:27 +02:00
Fabio Manganiello 4cc88fcf5f
Rewritten the `variable` plugin to use SQLAlchemy's ORM.
This removes the need for raw SQL statements and CREATE TABLE statements
that may be engine-specific.
2023-04-25 10:35:12 +02:00
Fabio Manganiello e1cd22121a
Removed `connection.begin()` pattern from the `db` plugin.
SQLAlchemy should automatically begin a transaction on
connection/session creation. Plus, `.begin()` messes up things with
SQLAlchemy 2, which has `autobegin` enabled with no easy way of
disabling it.
2023-04-25 10:31:49 +02:00
Fabio Manganiello f4e13d0cb0
No need for `session.begin` in `db.create_all`. 2023-04-24 23:57:47 +02:00
Fabio Manganiello 37722d12cd
No need for `session.begin` in `db.create_all`. 2023-04-24 23:55:50 +02:00
Fabio Manganiello 6fa179e769
LINT fixes 2023-04-24 23:49:31 +02:00
Fabio Manganiello d33d760361
Better way to import `declarative_base` from SQLAlchemy.
Import `declarative_base` in a way that is compatible with any
SQLAlchemy version between 1.3 and 2.x.
2023-04-24 23:23:55 +02:00
Fabio Manganiello 91df18f7b5
Better way to import `declarative_base` from SQLAlchemy.
Import `declarative_base` in a way that is compatible with any
SQLAlchemy version between 1.3 and 2.x.
2023-04-24 23:21:39 +02:00
Fabio Manganiello 87889142e0
Fixed compatibility with SQLAlchemy >= 2.0 in the `db` plugin. 2023-04-24 22:52:17 +02:00
Fabio Manganiello 8478245cde
Removed `Mapped[Entity]` type annotation.
`Mapped` has been introduced only in SQLAlchemy 1.4, while Debian stable
still ships 1.3.

Removing the type annotation doesn't come with a big cost, but it keeps
Platypush compatible with Debian stable.
2023-04-24 21:48:52 +02:00
Fabio Manganiello e955ffc018
Be more resilient in DateTimeWeather widget about custom temperature/humidity names or non-numeric data 2023-04-24 12:48:51 +02:00
Fabio Manganiello 5638c567ff
Show temperature and humidity on the DateTimeWeather widget upon sensor events only if the sensor data is numeric. 2023-04-24 10:59:45 +02:00
Fabio Manganiello bfa296e7c5
Fixed dataclass JSON serialization 2023-04-24 01:18:33 +02:00
Fabio Manganiello 9c03b028d7 Be a bit more resilient if an upstream integration sent some empty entities 2023-04-24 00:44:16 +02:00
Fabio Manganiello 6711b26137
Support dataclass serialization in the standard message serializer. 2023-04-24 00:43:06 +02:00
Fabio Manganiello dc3392c11d
Disk I/O stats are not always available and should therefore be optional. 2023-04-23 22:25:24 +02:00
Fabio Manganiello 8e7d444c02
Updated CHANGELOG 2023-04-23 21:19:31 +02:00
Fabio Manganiello 0cd28f1040
libbluetooth-dev is a required dependency to build pybluez on Debian-derived distros 2023-04-23 18:59:37 +02:00
Fabio Manganiello 9c1855e4c0
Fixed docstring for `zigbee.mqtt` plugin. 2023-04-23 13:03:10 +02:00
Fabio Manganiello 0fc05135df
Updated docs 2023-04-23 02:14:57 +02:00
Fabio Manganiello 512ced3e94
Updated dist files 2023-04-23 02:13:48 +02:00
Fabio Manganiello 6439e235d2
Updated caniuse dependency 2023-04-23 02:11:21 +02:00
Fabio Manganiello 27b1048789
Converted `system.processes` to the new data model. 2023-04-23 02:08:43 +02:00
Fabio Manganiello 387616ea96
Convert `system.connected_users` to the new data model. 2023-04-23 01:12:07 +02:00
Fabio Manganiello 259b42bdd6
Removed legacy `backend.sensor.battery`. 2023-04-23 00:44:03 +02:00
Fabio Manganiello 763d9e06ec
Increased default `poll_interval` for `system` plugin to 60 seconds. 2023-04-23 00:42:44 +02:00
Fabio Manganiello a72c32cb00
Added battery entity support to `system` plugin. 2023-04-23 00:41:21 +02:00
Fabio Manganiello b3440ab96b
Added support for fan sensors on the `system` plugin. 2023-04-23 00:08:27 +02:00
Fabio Manganiello 45d5f439be
Added support for system temperature sensor entities. 2023-04-22 22:42:11 +02:00
Fabio Manganiello 1b048e1952
s/net_connections/network_connections/g 2023-04-22 17:19:24 +02:00
Fabio Manganiello 374f936c1f
Merged `network_stats` into `NetworkInterface` model. 2023-04-22 17:19:24 +02:00
Fabio Manganiello f4036be52b
Extracted and refactored more common elements of the Entity components. 2023-04-22 17:19:23 +02:00
Fabio Manganiello e213941791
s/net_io_counters/network_info/g 2023-04-22 17:19:23 +02:00
Fabio Manganiello 977b55dea9
Merged network addresses into `NetworkInterface` model. 2023-04-22 17:19:23 +02:00
Fabio Manganiello ebe79ac29a
Refactored system schema dataclasses.
- `percent_field` should be declared on `platypush.schemas.dataclasses`
  level, since it's not specific to the `system` plugin.
- Added a common `SystemBaseSchema` that takes care of calling
  `_asdict()` if the object is passed as a `psutil` object instead of a
  dict.
2023-04-22 17:19:23 +02:00
Fabio Manganiello 2d618188c8
Print the full exception stack trace if `.status` fails. 2023-04-22 17:19:23 +02:00
Fabio Manganiello b3a0896485
Converted `NetworkConnection` schema/response. 2023-04-22 17:19:22 +02:00
Fabio Manganiello d473b5d836 Make the recursive entity merger/column set logic more resilient against ObjectDeletedError 2023-04-22 10:40:30 +02:00
Fabio Manganiello 98a300c4b1
Added `NetworkInterface` entities to `system` plugin.
Plus, `platypush.schemas.system` has now been split into multiple
submodules to avoid a single-file mega-module with all the system
schemas definitions.
2023-04-21 00:45:15 +02:00
Fabio Manganiello 44b8fd4b34
Support for `disk` entities in the `system` integration. 2023-04-20 16:26:51 +02:00
Fabio Manganiello 6b03451386
Better responsive alignment for the collapse toggler. 2023-04-20 16:26:05 +02:00
Fabio Manganiello e8c96ad35d
Added `convertTime` utility function 2023-04-20 02:27:58 +02:00
Fabio Manganiello 153d03d43f
Moved CPU percentage on the level of the CPU entity instead of a child entity. 2023-04-19 01:48:05 +02:00
Fabio Manganiello 4ebfbf3851
Added memory stats entities. 2023-04-19 01:31:11 +02:00
Fabio Manganiello 0073239a40
Support for CPU `load_average` entity. 2023-04-18 18:26:02 +02:00
Fabio Manganiello 1cee0459cf
Added `CpuFrequency` entity to `system`. 2023-04-18 01:49:36 +02:00
Fabio Manganiello a5b0a524f6
Added `CpuStats` entity to `system`. 2023-04-18 01:19:06 +02:00
Fabio Manganiello b4fbd3e915
Added `percent` entity to `cpu`. 2023-04-17 02:25:04 +02:00
Fabio Manganiello 711cc2b239
Removed (now unused) `CpuTimesResponse`. 2023-04-17 02:25:03 +02:00
Fabio Manganiello b9286f50b0
Added support for `CpuTimes` as an entity of the `system` plugin.
Also, there is now a single `Cpu` entity being exported, with a nested
hierarchy structured like:

```
cpu
  -> cpu_info
  -> cpu_times
    -> idle
    -> user
    -> system
    -> ...
  -> cpu_load
    -> ...
```
2023-04-17 02:25:03 +02:00
Fabio Manganiello 4842c1911b
Frontend entities should have a reference to `allEntities`.
There are probably more optimal ways of achieving this other than
passing a reference to the full list of entities to each of the
entities, such as running a BFS to recursively expand all the entities
within the child hierarchy of an entity.

This is needed because the entity needs to know which entities aren't
direct children, but are two or more layers down in the hierarchy, so
they should be passed to their own child entities.
2023-04-17 02:25:03 +02:00
Fabio Manganiello 6e65783feb
Added schemas for `CpuTimes`. 2023-04-17 02:25:03 +02:00
Fabio Manganiello e810025a6d
Added `Cpu` and `CpuTimes` entities. 2023-04-17 02:25:03 +02:00
Fabio Manganiello 65481dc6b4
Added `PercentSensor` entity type. 2023-04-17 02:25:02 +02:00
Fabio Manganiello e7f64843a5
Added `include_children` parameter to `_merge_columns`.
We need to recursively merge the columns of children entities if a child
entity isn't a leaf node.
2023-04-17 02:25:02 +02:00
Fabio Manganiello b43017ef01
Refactoring the `system` plugin to support entities. 2023-04-17 02:25:02 +02:00
Fabio Manganiello 3e3c48d779
Defined new entity and schema for CpuInfo. 2023-04-17 02:25:02 +02:00
Fabio Manganiello 186a21f715
Added CpuInfo entity frontend components. 2023-04-17 02:25:01 +02:00
Fabio Manganiello 74aeca5c34
Trigger a sensor event only if abs(old_data - new_data) > tolerance
Not if abs(old_data - new_data) >= tolerance, otherwise events will
always be triggered when tolerance=0, even if the data hasn't changed.
2023-04-17 02:25:01 +02:00
Fabio Manganiello 4c19535612 A more resilient logic on entity copy/serialization to prevent ObjectDeletedError 2023-04-13 17:16:21 +02:00
Fabio Manganiello a499b7bc2f
Deprecated `poll_seconds` in `light.hue`.
For sake of naming consistency with other plugins, we should use
`poll_interval` instead.
2023-04-03 01:36:12 +02:00
Fabio Manganiello 10955dad72
Fixed some documentation glitches in `switchbot`. 2023-04-03 01:36:12 +02:00
Fabio Manganiello f9ce4b75e8
Updated docs 2023-04-03 01:36:12 +02:00
Fabio Manganiello d5de38975d
generate_missing_docs 2.0 2023-04-03 01:36:12 +02:00
Fabio Manganiello 6e5f746dbe
Removed deprecated `gpio.sensor` base plugin.
Now all the plugins that used to implement it have been moved to
`SensorPlugin`.
2023-04-03 01:36:12 +02:00
Fabio Manganiello 8852cb8db4
Fixed new class name for `sensor.mcp3008` plugin. 2023-04-03 01:36:12 +02:00
Fabio Manganiello d5ddc0c65e
Migrated `arduino` integration to the new `SensorPlugin` API. 2023-04-03 01:36:12 +02:00
Fabio Manganiello cf16076bce
Added icons for new entity sensor sources. 2023-04-03 01:36:11 +02:00
Fabio Manganiello ac2ec58f89
Migrated `mcp3008` integration to the new `SensorPlugin` API. 2023-04-03 01:36:11 +02:00
Fabio Manganiello 45e5ca47e7 Fallback for sensor._has_changes 2023-04-02 15:38:49 +02:00
Fabio Manganiello 962c55937d
Migrated `sensor.distance` integration.
Remove `backend.sensor.distance` and `gpio.sensor.distance`. They are
now replaced by the `sensor.hcsr04` integration, which is compatible
with the new `SensorPlugin` API.
2023-04-02 14:20:12 +02:00
Fabio Manganiello 92578a17c9
Added small docstring portion 2023-04-02 13:55:00 +02:00
Fabio Manganiello beff88986a
Migrated `dht` integration.
Removed `backend.sensor.dht` and `gpio.sensor.dht`. They have been
merged into the new `sensor.dht` integration, which supports the new
`SensorPlugin` API.
2023-04-02 13:38:53 +02:00
Fabio Manganiello 8f604445a2
Migrated old `sensor.accelerometer` integration.
Removed `backend.sensor.accelerometer` and `gpio.sensor.accelerometer`.
The logic has now been merged in the new `sensor.lis3dh` integration,
which is compatible with the new `SensorPlugin` API.
2023-04-02 13:22:28 +02:00
Fabio Manganiello 44cf25271c
Migrated `pmw3901` integration.
Removed legacy `backend.sensor.motion.pmw3901` and
`gpio.sensor.motion.pmw3901`. They have been merged in the new
`sensor.pmw3901` integration, compatible with the new `SensorPlugin`
API.
2023-04-02 12:36:08 +02:00
Fabio Manganiello fcdda40c4a
Update the `_last_measurement` only if some events were processed from the new data. 2023-04-02 12:09:45 +02:00
Fabio Manganiello 88784985e1
Should be `abs(old_data - new_data) >= tolerance`.
Not `abs(old_data - new_data) > tolerance`.
2023-04-02 12:08:40 +02:00
Fabio Manganiello a3f4b21478
Updated dist files 2023-04-02 03:24:11 +02:00
Fabio Manganiello e6e5dec088
Updated dist files 2023-04-02 02:56:09 +02:00
Fabio Manganiello 7697c1c6ad
Migrated `envirophat` to the new `SensorPlugin` API.
Removed `backend.sensor.envirophat` and `gpio.sensor.envirophat` plugin.
They have now been merged into the new `sensor.envirophat` plugin.
2023-04-02 02:49:08 +02:00
Fabio Manganiello 3cd42c9e45
`Entity` should use `Message.Encoder` as a JSON serializer. 2023-04-02 02:44:19 +02:00
Fabio Manganiello 31f411868c
`Message.Encoder` should serialize binary data to `0x`-led hex strings. 2023-04-02 02:43:06 +02:00
Fabio Manganiello 9e5ad0e0b1
`Entity.to_dict` now takes into account columns mapped to properties.
No more `_value` in the JSON output instead of the `value` property.

If a column is marked as private, and there's an associated property
mapped to its public name, then we should use and serialize that value.
2023-04-02 02:22:40 +02:00
Fabio Manganiello 8d4aa310f4
Support for values passed in dict format to `ThreeAxisSensor` 2023-04-02 02:02:08 +02:00
Fabio Manganiello 5a6f4bcf57
Added 3-axis sensor, accelerometer and magnetometer entities 2023-04-02 01:13:22 +02:00
Fabio Manganiello d964167631
`s/TimeDurationSensor/TimeDuration/g` 2023-04-02 00:57:48 +02:00
Fabio Manganiello 839c6108a0
Added `sensor.*` icon classes 2023-04-02 00:40:50 +02:00
Fabio Manganiello 429893ddbf
Updated dist files 2023-04-01 23:58:28 +02:00
Fabio Manganiello f24d0773d1
No need for `sensor.vl53l1x.transform_entities` to call the parent. 2023-04-01 23:54:43 +02:00
Fabio Manganiello 99572f9731
Sanity check to prevent empty objects from being propagated to `sensor.transform_entities` 2023-04-01 23:41:28 +02:00
Fabio Manganiello 3f3726c50a
Fixed another occurrence of "Subscripted generics cannot be used" etc. error 2023-04-01 23:34:22 +02:00
Fabio Manganiello e2e73d0fdb
Fix another Python < 3.10 subscripted generic issue. 2023-04-01 23:23:51 +02:00
Fabio Manganiello c1d0f21ead
Migrated `ltr559` integration to the new API.
Merged `backend.sensor.ltr559` and `gpio.sensor.ltr559` into the new
`sensor.ltr559` plugin, which extends the new `SensorPlugin` API.
2023-04-01 23:16:03 +02:00
Fabio Manganiello 8e0f88ea16
Don't swap the argument of `SensorPlugin.publish_entities` with a list if not required 2023-04-01 23:06:37 +02:00
Fabio Manganiello 0047d85b9d
Dirty fix for "Subscripted generics cannot be used with class and instance checks" on Python < 3.10 2023-04-01 22:52:24 +02:00
Fabio Manganiello 98ec018292
Replaced `NoneType` reference.
`types.NoneType` is not always available on all Python versions, so we
have to make our own type for it.
2023-04-01 22:42:13 +02:00
Fabio Manganiello 5dabfed365
Migrated `sensor.bme280` to the new `SensorPlugin` interface.
Removed the old `backend.sensor.bme280` and the old `gpio.sensor.bme280`
plugin. They have now been merged into the new `sensor.bme280` runnable
plugin, which extends the `SensorPlugin` API and supports entities.
2023-04-01 22:31:24 +02:00
Fabio Manganiello 6f237a1500
Support the deprecated `poll_seconds` option on `RunnablePlugin` 2023-04-01 22:02:59 +02:00
Fabio Manganiello c23e8867e2
Added `enabled_sensors` to the `sensor` plugin 2023-04-01 21:56:56 +02:00
Fabio Manganiello 7912a59ff8
`vl53l1x` plugin migrated to the new `SensorPlugin` interface. 2023-04-01 19:31:13 +02:00
Fabio Manganiello 6a5a5de03e
`serial` plugin migrated to the new `SensorPlugin` interface. 2023-04-01 19:29:56 +02:00
Fabio Manganiello bf4db76830
Legacy `sensor` backend replaced by an extended `sensor` runnable plugin. 2023-04-01 19:24:35 +02:00
Fabio Manganiello bf75eb73ac
Added an abstract base `SensorDataEvent` for sensor events. 2023-03-31 22:51:35 +02:00
Fabio Manganiello 6a3ade3304
Added `common.sensors` package.
The package contains the base types and constants shared across
sensor-based integrations.
2023-03-31 22:50:47 +02:00
Fabio Manganiello 42d468c895
`get_lock` should raise a TimeoutError if `lock.acquire` is False 2023-03-31 22:31:32 +02:00
Fabio Manganiello 9693becb9e
Removed LGTM badges from the README.
LGTM is now merged into Github and the badges are no longer available.
2023-03-31 14:31:45 +02:00
Fabio Manganiello 7bdd877e49
Support the `binary` flag both on `serial.read` and `serial.write`. 2023-03-31 14:31:45 +02:00
Fabio Manganiello 1efaff878e
Rewritten `serial` plugin.
`backend.serial` has been removed and the polling logic merged into the
`serial` plugin.

The `serial` plugin now supports the new entity engine as well.
2023-03-31 14:31:45 +02:00
Fabio Manganiello 4f15758de9
black fixes 2023-03-31 14:31:38 +02:00
Fabio Manganiello 2a8a3f4394 Removed legacy sensor.distance.vl53l1x backend 2023-03-31 14:26:14 +02:00
Fabio Manganiello a3e8c7c155 Rewritten vl53l1x integration as a runnable plugin with entity support 2023-03-31 14:25:05 +02:00
Fabio Manganiello 226034946f Added `distance_sensor` entity 2023-03-31 14:22:28 +02:00
Fabio Manganiello 6fb362a6fb gpio.sensor.distance.vl53l1x -> sensor.distance.vl53l1x 2023-03-31 14:21:48 +02:00
Fabio Manganiello e198f2a175 Replaced `.title` in `get_plugin` with `.upper` on the first character.
`str.title` capitalizes any alphabetic letter after any non-alphabetic
letter. That's a problem for Platypush plugins' naming convention,
because plugins like `sensor.distance.vl53l1x` may be broken into
`sensor.distance.vl53.l1.x`.
2023-03-31 14:09:43 +02:00
Fabio Manganiello c2f9ebf4ed
Updated dist files 2023-03-27 01:47:29 +02:00
Fabio Manganiello 2781eb1fb1
Merge branch 'master' into 29-generic-entities-support 2023-03-27 00:36:50 +02:00
Fabio Manganiello 792a65df8b Merge pull request '[#240] Migrated `clipboard` plugin from `pyperclip` to `pyclip`' (#241) from 240-migrate-clipboard-integration-to-pyclip into master
Reviewed-on: #241
2023-03-26 23:56:51 +02:00
Fabio Manganiello 7a368ebbb8
[#240] Migrated `clipboard` plugin from `pyperclip` to `pyclip`.
Closes: #240
2023-03-26 23:52:15 +02:00
Fabio Manganiello bce2fdee25
Replaced deprecated `asyncio.wait([])` with `asyncio.gather(*[])`. 2023-03-26 23:15:53 +02:00
Fabio Manganiello cf91ab90df
Increased default width of `nav` on desktop+ 2023-03-26 23:10:46 +02:00
Fabio Manganiello c0251ef2f7
`s/instance/instance_name/g` in `LinodeInstanceStatusChanged`.
For sake of consistency - we also have `instance_id` and having the
instance name assigned to the `instance` attribute is quite ambiguous.
2023-03-26 22:58:20 +02:00
Fabio Manganiello efe400f921
Fixed `maxdepth` attribute in generate docs. 2023-03-26 22:55:22 +02:00
Fabio Manganiello 6d674fef21
Fixed small JSON syntax error in the docstring of `ntfy.send_message`. 2023-03-26 22:53:42 +02:00
Fabio Manganiello 30124e7cef
Fixed docstring of `Event.__init__`. 2023-03-26 22:53:11 +02:00
Fabio Manganiello 276aff757b
Removed circular dependency.
Workaround for the circular dependency between
`platypush.entities.bluetooth` and `platypush.plugins.bluetooth.model`.

Unentangling the circular dependency would require way too much work,
since the entity model provides several helpers and properties that
depend on the plugin's model.

The workaround in this commit is to simply push those imports down in
the methods that use them, so they won't be imported until those methods
are called, as well as removing some type annotations that depended on
those objects.
2023-03-26 15:30:57 +02:00
Fabio Manganiello 3bb2336b3a
Updated docs 2023-03-26 15:13:48 +02:00
Fabio Manganiello 89bc54da22
Updated dist files 2023-03-26 12:30:46 +02:00
Fabio Manganiello 295758bb20
Added frontend components for cloud instances. 2023-03-26 12:27:17 +02:00
Fabio Manganiello bc2730c841
Rewritten `linode` integration.
- Support for cloud instances as native entities.
- Using Marshmallow dataclasses+schemas instead of custom `Response`
  objects.
- Merge `linode` backend into `linode` plugin.
2023-03-26 11:23:33 +02:00
Fabio Manganiello 4b9c5a0203
Support for schema `EnumField`. 2023-03-26 03:48:32 +02:00
Fabio Manganiello 026662f6b6
Added base schema for Marshmallow dataclasses. 2023-03-26 03:47:44 +02:00
Fabio Manganiello 7bbae55e44
`platypush.entities._managers` -> `platypush.entities.managers`.
It's better for entity managers to be stored in their own public
package, instead of cluttering too much the namespace of their parent
package.
2023-03-26 03:46:06 +02:00
Fabio Manganiello f5d9895521
Added `marshmallow_dataclass` to the requirements. 2023-03-26 03:44:57 +02:00
Fabio Manganiello 89d85baa6d
Support for implicit serialization of Enum values in JSONAble. 2023-03-26 03:43:04 +02:00
Fabio Manganiello a71017df33
Updated web app files 2023-03-24 16:45:55 +01:00
Fabio Manganiello 567e9d4e21
Removed legacy `bluetooth` backends.
No replacements have been made for the OBEX backends (push and file
services). PyOBEX is too broken and unmaintained, and there are too many
poorly documented steps required to get an unprivileged user to run an
SDP service.
2023-03-24 16:41:30 +01:00
Fabio Manganiello 3c355352c5
Using the new `StoppableThread` API. 2023-03-24 16:39:30 +01:00
Fabio Manganiello 5ebf4e912e
Added `wait_stop` and `shoud_stop` methods to `StoppableThread`. 2023-03-24 16:05:18 +01:00
Fabio Manganiello 998793e94f
Added `OBEX_FILE_TRANSFER` constant to `directory` stub. 2023-03-24 15:41:20 +01:00
Fabio Manganiello 4b4db5b3c7
Added `StoppableThread` common interface. 2023-03-24 15:40:16 +01:00
Fabio Manganiello 2f49ddf33a
Fallback logic that uses DBus to disconnect from a BT device.
This logic will be used if the connection wasn't opened by the current
process and therefore a call to DBus is required to terminate it.
2023-03-24 01:57:05 +01:00
Fabio Manganiello 913ef6f8cd
Refresh `BluetoothDevice.reachable` when a device is found/lost. 2023-03-24 01:56:19 +01:00
Fabio Manganiello d46d4e2300
Added support for Bluetooth devices blacklist.
Based on device address, name or manufacturer.
2023-03-24 01:52:39 +01:00
Fabio Manganiello 0cebcf4f9b
`switchbot.bluetooth` integration migrated to a `bluetooth` plugin. 2023-03-23 17:46:54 +01:00
Fabio Manganiello 4fac110bb8
Added `bluetooth.set` method, whose execution is delegated to the plugins. 2023-03-23 17:45:02 +01:00
Fabio Manganiello cd219f44c4
Pass the list of plugins when creating Bluetooth managers. 2023-03-23 17:42:16 +01:00
Fabio Manganiello 43289a3b55
Scan always at least for 10 seconds before failing on `get_device`. 2023-03-23 17:41:37 +01:00
Fabio Manganiello 6267943786
Wrap `BleakError` exceptions into `AssertionError`. 2023-03-23 17:40:30 +01:00
Fabio Manganiello d6805a8b18
Added support for custom Bluetooth device plugins. 2023-03-23 17:10:37 +01:00
Fabio Manganiello af125347d6
If no matching services are found when connecting to a device, default to BLEManager.
GATT characteristics are not necessarily exposed as services.
2023-03-23 13:00:26 +01:00
Fabio Manganiello d1cd6dd2af
get_plugin with reload=True should stop the existing plugin if it's running 2023-03-23 01:11:54 +01:00
Fabio Manganiello a2a5fce6cb
Added `Apple Continuity` to the list of blacklisted manufacturers/models 2023-03-22 22:55:19 +01:00
Fabio Manganiello e71c312133
Always read an entity's parent through get_parent when climbing up.
This should avoid the risk of `DetachedInstanceError` by retrieving the
object into the session if it's not available.
2023-03-22 22:41:09 +01:00
Fabio Manganiello 5c23d3aa87
metadata and rssi fields on BLEDevice have been deprecated.
Changed the BLE beacon parsing logic to read those fields from
`AdvertisementData` instead of `BLEDevice`.
2023-03-22 22:39:01 +01:00
Fabio Manganiello 65bc3ae06d
Noisy beacons device configuration should look both at manufacturer and model. 2023-03-22 22:37:46 +01:00
Fabio Manganiello f49b866a51
Focus the <input> element when a <NameEditor> element is created. 2023-03-22 21:28:21 +01:00
Fabio Manganiello dd80dc998c
Show entity icon and type in the list of children entities on EntityModal. 2023-03-22 21:26:59 +01:00
Fabio Manganiello 239dd17f23
Exclude from the list of display children on EntityModal those with no name or that are configuration values. 2023-03-22 16:38:38 +01:00
Fabio Manganiello e10bec88c0
Noisy beacons logging trace moved from info to debug. 2023-03-22 16:31:57 +01:00
Fabio Manganiello 5dd95362a1
Include links both to the parent and children entities in EntityModal. 2023-03-22 16:20:29 +01:00
Fabio Manganiello 99cfd247a5
A more effective logic to exclude noisy BLE beacons.
This includes BLE beacons sent from all Google/Apple/Microsoft/Samsung
beacon networks in all of their variants.
2023-03-22 15:35:02 +01:00
Fabio Manganiello 01d323fad0
Passing a boolean `exclude_known_noisy_beacons` to `bluetooth` plugin.
The logic to exclude BLE beacons from randomized devices needs to be a
bit more granular and not limited only to the reported device
manufacturer.
2023-03-22 15:29:19 +01:00
Fabio Manganiello f6e09d34e4
A more clever logic of parsing the manufacturer for BLE devices.
1. Check the manufacturer parsed via Bleak/Theengs
2. Check the MAC address prefix in the oui numbers table
3. Check from the reported `manufacturer_data`
2023-03-22 14:16:00 +01:00
Fabio Manganiello f7e8cfe5a7
Don't include `unit` in BLE sensors when they are matched against the native type.
It's likely to just include the native type name anyway.
2023-03-22 14:14:59 +01:00
Fabio Manganiello 486f37a45e
Support sensor value reported both on `value` as well as `_value` fields. 2023-03-22 14:11:13 +01:00
Fabio Manganiello bfc87e0f7b
Display arrays and objects in the entity modal as prettified JSON. 2023-03-22 13:50:35 +01:00
Fabio Manganiello c750d83188
Prevent name collisions on `bluetooth.ServiceClass`. 2023-03-22 03:27:25 +01:00
Fabio Manganiello 174b1ee6a9
Use a default list of excluded Bluetooth manufacturers. 2023-03-21 16:03:01 +01:00
Fabio Manganiello e9abb5cb9a
Implemented support for child entities in entity modals. 2023-03-21 16:02:02 +01:00
Fabio Manganiello b1cb7ef847
Added a list of `excluded_manufacturers` to `BluetoothPlugin`. 2023-03-21 14:32:45 +01:00
Fabio Manganiello 718e0434ba
Display all available entity attributes on EntityModal. 2023-03-20 14:32:03 +01:00
Fabio Manganiello 78bbe71be1
Another .pull-right fix. 2023-03-20 02:04:32 +01:00
Fabio Manganiello 3743ee4f00
s/TheengsGateway/TheengsDecoder/g now that the pip package has been published. 2023-03-20 01:41:21 +01:00
Fabio Manganiello 431dedf3eb
BluetoothDevice moved to its own component, with device connect support. 2023-03-20 01:28:12 +01:00
Fabio Manganiello 0a4b22c12e
Implemented connect/disconnect call on BluetoothService component. 2023-03-20 01:27:47 +01:00
Fabio Manganiello 714f853751
Pass the list of children to the entity component. 2023-03-20 01:27:21 +01:00
Fabio Manganiello a011de890b
Better .pull-right class implementation. 2023-03-20 01:26:48 +01:00
Fabio Manganiello 2b5596820b
Made Types.objectsEqual method more robust against null input 2023-03-19 22:50:23 +01:00
Fabio Manganiello 71a3481560
Better style for the sidebar/nav 2023-03-19 22:23:37 +01:00
Fabio Manganiello 12096f2dbe
Don't fail hard when device disconnection fails. 2023-03-19 12:56:53 +01:00
Fabio Manganiello 40f81b105f
Set the connected flag when connecting/disconnecting from a service. 2023-03-19 12:56:31 +01:00
Fabio Manganiello 9d66b63266
BluetoothService attributes fixes.
BluetoothService IDs should always be in the format `address::uuid` and
the name should always be in title format.
2023-03-19 12:55:14 +01:00
Fabio Manganiello 6e9263c4e4
A more elegant logic to infer the manufacturer name. 2023-03-19 12:54:52 +01:00
Fabio Manganiello b568876474
Use a service's UUID as a name instead of Unknown if the service is unknown. 2023-03-19 12:54:09 +01:00
Fabio Manganiello aa04741daa
Added BluetoothService UI component 2023-03-19 12:53:23 +01:00
Fabio Manganiello f74fab795d
Added `parent` component value to `Entity`. 2023-03-19 12:50:45 +01:00
Fabio Manganiello 243de15813
Added `connected` flag to `BluetoothService`. 2023-03-19 12:49:38 +01:00
Fabio Manganiello 256d9adbf2
Removed `children` from `BluetoothDevice.to_json` - it makes events too verbose 2023-03-19 12:48:11 +01:00
Fabio Manganiello 4144e4f842
Fixed self._ip_to_dev expansion 2023-03-19 12:47:07 +01:00
Fabio Manganiello 878fe91155
Big rewrite/refactor of the entities merger 2023-03-19 12:40:48 +01:00
Fabio Manganiello 2411b961e8
[WIP] Big, big refactor of the Bluetooth integration.
- Merged together Bluetooth legacy and BLE plugins and scanners.
- Introduced Theengs as a dependency to infer BLE device types and
  create sub-entities appropriately.
- Using `BluetoothDevice` and `BluetoothService` entities as the bread
  and butter for all the Bluetooth plugin's components.
- Using a shared cache of devices and services between the legacy and
  BLE integrations, with merging/coalescing logic included.
- Extended list of discoverable services to include all those officially
  supported by the Bluetooth specs.
- Instantiate a separate pool of workers to discover services.
- Refactor of the Bluetooth events - all of them are now instantiated
  from a single `BluetoothDevice` object.
2023-03-13 02:31:21 +01:00
Fabio Manganiello 4bc61133c5
The Entity object should also have a `to_json` method. 2023-03-12 23:01:51 +01:00
Fabio Manganiello 4a8da80c7c
Don't join self._thread on stop in RunnablePlugin if self._thread = current_thread 2023-03-11 23:45:46 +01:00
Fabio Manganiello 31552963c4
`EntitiesDb.upsert` should return a deep copy of the upserted entities.
Not the upserted entities themselves, no matter if expunged or made transient.

Reminder to my future self: returning the flushed entities and then using them
outside of the session or in another thread opens a big can of worms when using
SQLAlchemy.
2023-03-10 12:06:36 +01:00
Fabio Manganiello f45e47363d
Use lazy='joined' instead of lazy='selectin' on Entity.parent.
That's the best way to ensure that all the columns are fetched eagerly and
prevent errors later when trying to access lazily loaded attributes outside
of the session/thread.
2023-03-10 12:01:23 +01:00
Fabio Manganiello 8ccf3e804d
Added utility get_entities_engine() function. 2023-03-10 11:49:23 +01:00
Fabio Manganiello 60da930e4b
Added support for get_plugin(MyPlugin) besides get_plugin('my'). 2023-03-10 11:47:39 +01:00
Fabio Manganiello 3fcc9957d1
A dirty fix to prevent DetachedInstanceError when accessing the parent entity. 2023-03-10 11:45:44 +01:00
Fabio Manganiello ceb7a2f098
EntitiesEngine synchronization improvements.
- Added `wait_start()` method that other threads can use to synchronize
  with the engine and wait before performing db operations.

- Callback logic wrapped in a try/except block to prevent custom
  integrations with buggy callbacks from crashing the engine.
2023-03-10 00:57:24 +01:00
Fabio Manganiello 73dc2463f1
Added auto_commit=False to entities.save() 2023-03-10 00:40:51 +01:00
Fabio Manganiello 7e92d5f244
Added recursive `.copy()` method to `Entity`. 2023-03-09 22:35:31 +01:00
Fabio Manganiello 9f9ee575f1
Added _import_error_ignored_modules.
ImportErrors on these entity modules will be ignored when dynamically
loading them, since they have optional external dependencies and we
shouldn't throw an error if we can't import them.
2023-03-09 01:40:35 +01:00
Fabio Manganiello c4efec6832
Several fixes and improvements on the entities engine.
- Support for an optional callback on `publish_entities` to get notified
  when the published object are flushed to the db.

- Use `lazy='selectin'` for the entity parent -> children relationship -
  it is more efficient and it ensures that all the data the application
  needs is loaded upfront.

- `Entity.entity_key` rolled back to `<external_id, plugin>`. The
  fallback logic on `<id, plugin>` created more problems than those it
  as supposed to solve.

- Added `expire_on_commit=False` to the entities engine session to make
  sure that we don't get errors on detached/expired instances.
2023-03-09 01:16:04 +01:00
Fabio Manganiello 1781a19a79
s/Entity.to_json/Entity.to_dict/g
stuff
2023-03-06 23:46:33 +01:00
Fabio Manganiello b9efa9fa30
entity_key should coalesce (entity.external_id or entity.id) 2023-03-06 16:54:02 +01:00
Fabio Manganiello 72c55c03f2
[WIP] Refactoring/extending models and parsers for Bluetooth entities. 2023-03-03 02:10:11 +01:00
Fabio Manganiello a688e7102e
Changed default `poll_interval` for `RunnablePlugin`.
30 -> 15 seconds.
2023-03-03 02:00:48 +01:00
Fabio Manganiello ead4513915
Added optional `unit` column to `RawSensor` entity. 2023-03-03 01:59:27 +01:00
Fabio Manganiello 94c4e52154
Mock PyOBEX.client in readthedocs conf.py 2023-03-03 01:58:32 +01:00
Fabio Manganiello 7be55e446f
Convert UUID objects to strings when serializing to JSON. 2023-03-02 21:58:26 +01:00
Fabio Manganiello 15fadb93bb
Added stand-alone `connect` and `disconnect` actions to `bluetooth`. 2023-02-25 01:59:35 +01:00
Fabio Manganiello 70d1bb893c
A cleaner way of calculating the `success` response attribute. 2023-02-25 01:58:09 +01:00
Fabio Manganiello 2dfb389630
Added remaining `bluetooth` entity types in `_mappers.py`. 2023-02-23 21:20:41 +01:00
Fabio Manganiello a0556d3a42
Added `PresenceSensor` entities. 2023-02-23 01:42:26 +01:00
Fabio Manganiello 886b930e2f
Support for `bluetooth` devices with multiple temperature sensors. 2023-02-23 01:27:31 +01:00
Fabio Manganiello 56d693032a
Added `DewPointSensor` entities. 2023-02-23 01:23:04 +01:00
Fabio Manganiello d212276247
Added `PressureSensor` entities. 2023-02-23 01:12:27 +01:00
Fabio Manganiello dd3f683006
Added `unit` to `bluetooth` mappers whenever available. 2023-02-23 01:04:33 +01:00
Fabio Manganiello d961e2a997
Added `TimeDurationSensor` entity. 2023-02-23 01:02:13 +01:00
Fabio Manganiello c3e16f9f9d
Added support for heart rate sensor entities. 2023-02-23 00:55:55 +01:00
Fabio Manganiello 3dab94c346
Added `StepsSensor` detection to `bluetooth`. 2023-02-23 00:50:06 +01:00
Fabio Manganiello e1b3d52706
Added `StepsSensor` entity. 2023-02-23 00:45:58 +01:00
Fabio Manganiello dcab766cef
Only scan for the configured Bluetooth service UUIDs. 2023-02-22 03:36:16 +01:00
Fabio Manganiello d8c429f4a8
Major improvements on the entities engine.
- Better logic to recursively link parent/children entities, so partial
  updates won't get lost.

- Removed `EntitiesCache` - it was too much to maintain while keeping
  consistent with the ORM, and it was a perennial fight against
  SQLAlchemy's own cache.

- Removed `EntityNotifier` - with no need to merge cached entities, the
  `notify` method has become much simpler and it's simply been merged
  in the `EntitiesRepository`.
2023-02-22 02:53:45 +01:00
Fabio Manganiello 9776921836
Better way of handling with `RawSensor` in `bluetooth` integration. 2023-02-22 02:26:51 +01:00
Fabio Manganiello a5a923a752
Added `BluetoothDeviceNewDataEvent`.
These events handle the case where a Bluetooth device only publishes new
service data without advertising any additional updated properties.
2023-02-22 02:23:11 +01:00
Fabio Manganiello dc7cbe743d
Refactored/improved `RawSensor` entity.
It will now automatically deal with most of the native types and convert
them to strings on the db.
2023-02-22 02:19:19 +01:00
Fabio Manganiello b2ffc08c89
s/MultiValueSensor/CompositeSensor/g on `smartthings` 2023-02-22 02:18:12 +01:00
Fabio Manganiello 340fd08064
Removed some old `type: ignore` comments. 2023-02-22 01:29:51 +01:00
Fabio Manganiello cf219d5a48
Added some more docstrings to entities. 2023-02-22 01:02:26 +01:00
Fabio Manganiello 7fa545d7f8
Merge branch 'master' into 29-generic-entities-support 2023-02-22 00:46:33 +01:00
Fabio Manganiello c645ce6bb8
Bump version: 0.24.4 → 0.24.5 2023-02-22 00:32:57 +01:00
Fabio Manganiello 2b8a5fee88
Updated CHANGELOG 2023-02-22 00:32:39 +01:00
Fabio Manganiello 26d9aaa5b1
(Temporarily) specify `sqlalchemy<2.0.0`.
SQLAlchemy 2 has introduced several breaking changes that can break
several things in the application - especially where the code uses
`connection.execute()` with raw SQL statements.

We need to temporarily force the installation of versions from the 1.x
branch, while migrating the existing code to the new version.
2023-02-22 00:25:57 +01:00
Fabio Manganiello bbc9647cb0
s/MultiValueSensor/CompositeSensor/g 2023-02-21 23:14:10 +01:00
Fabio Manganiello 2fa45fc5a3
Documentation and LINT fixes for sensor entities. 2023-02-21 23:10:05 +01:00
Fabio Manganiello b4627ecd04 Removed deprecated use_unicode parameter from MPDClient 2023-02-20 20:35:33 +01:00
Fabio Manganiello aa0b909fff
Use the TheengsDecoder to parse Bluetooth packets and map services to native entities. 2023-02-20 20:27:17 +01:00
Fabio Manganiello 73bf2446bd
Wrap `bluetooth.connect` in a per-device locked section. 2023-02-19 23:11:19 +01:00
Fabio Manganiello 9112239ac3
Better exception management in `AsyncRunnablePlugin`.
Exceptions that cause the termination of the plugin's loop should always
be logged as such, unless the plugin is supposed to stop and various
exceptions may occur upon teardown.
2023-02-19 23:03:27 +01:00
Fabio Manganiello a6c36fa1c1
Added brand, model and model_id columns to `BluetoothDevice`. 2023-02-19 23:02:04 +01:00
Fabio Manganiello 68e6b271c1
Updated dist files 2023-02-19 22:58:20 +01:00
Fabio Manganiello cb9b01c89f
Added raw_sensor metadata 2023-02-19 22:57:50 +01:00
Fabio Manganiello 72a9a9dfcf
LINT/type fixes 2023-02-19 22:56:45 +01:00
Fabio Manganiello 8aedc3c233
Recursively normalize child entities in `EntityManager._normalize_entities` 2023-02-18 17:51:57 +01:00
Fabio Manganiello 613e32e7c1
Extended number of supported events and data fields in Bluetooth integration. 2023-02-18 01:15:10 +01:00
Fabio Manganiello 7adae272a4
Merge branch 'master' into 29-generic-entities-support 2023-02-15 22:24:41 +01:00
Fabio Manganiello 08553f84b9
Added `timeout` parameter to `websocket.send`. 2023-02-15 22:23:15 +01:00
Fabio Manganiello 45664be44b
Removed deprecated `backend.bluetooth.scanner`.
Scan capabilities are now implemented on the `bluetooth` plugin itself.
2023-02-13 23:13:51 +01:00
Fabio Manganiello 471bc1fd3d
Updated dist files 2023-02-13 23:13:32 +01:00
Fabio Manganiello a3aa186ddf
- Added support for `scan_pause`/`scan_resume` on `bluetooth` integration.
- Added `BluetoothDevice` as its own entity type.
2023-02-13 23:12:25 +01:00
Fabio Manganiello 1d0be5c929
- Simplified prototype for `EntityManager.set`
- Added small documentation/annotations notes to the `Plugin` module.

- Small LINT fixes
2023-02-11 21:35:00 +01:00
Fabio Manganiello 575635fd6b
Defined `set` as a base method for all plugins that implement writeable entities 2023-02-11 04:04:21 +01:00
Fabio Manganiello 4365352331
[WIP] s/set_value/set/g for entities 2023-02-11 03:57:23 +01:00
Fabio Manganiello b0cc80ceb0
Rewriting `bluetooth.ble` plugin to use `bleak` instead of `gattlib`. 2023-02-10 17:40:20 +01:00
Fabio Manganiello f30e077a5a
Support for custom Bluetooth adapter on `switchbot.bluetooth`. 2023-02-08 23:01:05 +01:00
Fabio Manganiello 8469a1027f
Migrated/refactored `switchbot.bluetooth` integration.
- Out `gattlib` + `pybluez`, in `bleak`. It's not platform-dependent, it doesn't
  require libboost and other heavy build dependencies, and it doesn't require the
  user that runs the service from having special privileges to access raw
  Bluetooth sockets.

- Better integration with Platypush native entities. The devices are now mapped
  to write-only `EnumSwitch` entities, and the status returns the serialized
  representation of those entities instead of the previous intermediate
  representation.
2023-02-08 22:42:00 +01:00
Fabio Manganiello 35719b0da9
Let `publish_entities` return the list of transformed_entities 2023-02-08 02:09:34 +01:00
Fabio Manganiello e04870209e
More LINT fixes 2023-02-08 01:50:54 +01:00
Fabio Manganiello a98a5f0980
typo fix 2023-02-08 01:09:25 +01:00
Fabio Manganiello e49a0aec4d
Various improvements.
- Better synchronization logic on stop for `AsyncRunnablePlugin`.
- Fixed several thread names by dropping `prctl.set_name` in favour of
  specifying the name directly on thread creation.
- Several LINT fixes.
2023-02-08 00:46:50 +01:00
Fabio Manganiello 9d028af524
Removed last reference of `SwitchPlugin` 2023-02-05 23:10:35 +01:00
Fabio Manganiello 419a0cec61
More LINTing
Better prototype for `MultiLevelSwitchEntityManager.set_value`
2023-02-05 23:07:43 +01:00
Fabio Manganiello fde834c1b1
More LINT fixes + refactors 2023-02-05 22:00:50 +01:00
Fabio Manganiello 4849e14414
LINT fixes for the `utils` module + additional documentation 2023-02-05 18:05:41 +01:00
Fabio Manganiello b8fca97891
Default poll_interval for `RunnablePlugin` set to 30 seconds 2023-02-05 17:31:43 +01:00
Fabio Manganiello 06dfd1a152
Added support for more entities in `switchbot` 2023-02-05 15:34:50 +01:00
Fabio Manganiello 64e9bf17cf
Updated dist files 2023-02-05 14:53:36 +01:00
Fabio Manganiello 2047b9b76c
[WIP] Refactoring `switchbot` plugin as a runnable plugin + entity manager 2023-02-04 22:22:51 +01:00
Fabio Manganiello 65827aa0cd
Updated dist files 2023-02-04 17:36:46 +01:00
Fabio Manganiello b96838a856
Major LINT fixes/refactor for the `Config` class 2023-02-04 17:35:48 +01:00
Fabio Manganiello db5846d296
Add the unit to the `Dimmer` display value if it's available 2023-02-04 17:28:54 +01:00
Fabio Manganiello 0311d87bc3
The `switch.wemo` integration now extends `SwitchEntityManager` 2023-02-04 00:58:28 +01:00
Fabio Manganiello de2849546a
LINT fixes 2023-02-04 00:26:48 +01:00
Fabio Manganiello a160d3217e
Removed legacy `get_sensor_plugins` and `get_switch_plugins` actions 2023-02-03 22:54:42 +01:00
Fabio Manganiello a8fcbef1b5
gitignore 2023-02-03 22:49:50 +01:00
Fabio Manganiello b6814b4f16
Removed legacy Switches integration [frontend] 2023-02-03 22:49:09 +01:00
Fabio Manganiello 6ef2feea71
LINT fixes for `utils` plugin 2023-02-03 18:08:19 +01:00
Fabio Manganiello 3db9c58d31
[WIP] Converted `switch.tplink` plugin.
`switch.tplink` converted to a `RunnablePlugin` that implements
`SwitchEntityManager`.
2023-02-03 02:20:20 +01:00
Fabio Manganiello be3b99326f
[WIP] Refactoring `@manages` annotation into a proper `EntityManager` hierarchy 2023-02-02 23:21:12 +01:00
Fabio Manganiello 63d6920716
Updated dist files 2023-02-02 18:07:44 +01:00
Fabio Manganiello 59eb0742a1
s/warnings/logger.debug/ if publish_entities is called with no engine registered 2023-01-29 21:52:12 +01:00
Fabio Manganiello 8aff181956
Merged `zwave.mqtt` backend into the `zwave.mqtt` plugin 2023-01-29 02:34:48 +01:00
Fabio Manganiello 0e56d0fff6
Double-check if self._thread != None on stop on the ntfy thread
Race conditions may occur here
2023-01-27 22:12:34 +01:00
Fabio Manganiello 341e749d23
Merged the `zigbee.mqtt` backend into the plugin.
- Deprecated the old `zigbee.mqtt` backend
- Black style for the `mqtt` backend
2023-01-27 01:59:57 +01:00
Fabio Manganiello afdeb91f66
Implemented remaining supported entities for the `smartthings` integration 2023-01-26 22:10:02 +01:00
Fabio Manganiello 334ccc35a2
Don't serialize I/O wrappers
This removes warnings on `config.get`, where the `logging` configuration
key may also contain the current logging stream and we end up with a
JSONDecodeError when trying to serialize it.
2023-01-25 00:52:37 +01:00
Fabio Manganiello ba31dff06a
Major refactor + fixes for `smartthings` 2023-01-24 23:56:28 +01:00
Fabio Manganiello 147f36c86c
All `Sensor` instances should have `is_read_only=True` by default 2023-01-22 21:05:14 +01:00
Fabio Manganiello fd76642082
Added `Volume` and `Muted` entities 2023-01-22 21:04:46 +01:00
Fabio Manganiello bb637a1411
Defined a unique `stop_timeout` (default=5) for RunnablePlugin 2023-01-22 14:28:16 +01:00
Fabio Manganiello 6d4cf64253
More work on `smartthings`.
- Added support for `Battery` entities
- Fixed saturation range for `Light` entities
- Parsing `min`/`max`/`unit` from the status attributes, if available
2023-01-22 01:01:47 +01:00
Fabio Manganiello ddd516a677
Added polling/RunnablePlugin logic to `smartthings` 2023-01-22 00:09:10 +01:00
Fabio Manganiello dabbe031ab
Don't show the entity modal unless the user clicks on the name or icon 2023-01-21 23:46:38 +01:00
Fabio Manganiello 32e4e60579
A more robust handling of events in the `zwave.mqtt` backend 2023-01-21 23:44:51 +01:00
Fabio Manganiello 3940288396
Use the new bus notification helpers 2023-01-21 16:59:18 +01:00
Fabio Manganiello 241670c9d0
Handle parent/child update events through broadcast bus events 2023-01-21 16:58:28 +01:00
Fabio Manganiello 3923a09831
- Expose methods on the bus module to publish/subscribe to notifications and entity updates
- Removed some redundant `pass` statements in Z-Wave derived event classes
2023-01-21 16:56:27 +01:00
Fabio Manganiello fb562bb415
Propagate the @update event to the parent entities 2023-01-21 14:55:06 +01:00
Fabio Manganiello 4d762b81dc
EntityUpdateEvent traces can now be logged on INFO level
The EntityUpdateEvents generated by light.hue are now less noisy.
2023-01-21 14:50:05 +01:00
Fabio Manganiello 247912799f
Refactored light.hue integration so EntityUpdateEvents won't be triggered on every call to _get_lights 2023-01-21 14:48:33 +01:00
Fabio Manganiello dfb13127ee
Added MotionSensor entities 2023-01-21 14:47:18 +01:00
Fabio Manganiello a892bad34c
Refactoring smartthings plugin to support more entity types 2023-01-21 14:09:26 +01:00
Fabio Manganiello 22b8b03cb2
Refactored EntityIcon component 2023-01-15 20:02:50 +01:00
Fabio Manganiello 9a5e2899e8
Support for external_url and image_url on entities 2023-01-15 20:01:47 +01:00
Fabio Manganiello 2cc5e3f726
UI tweaks 2023-01-15 15:46:25 +01:00
Fabio Manganiello 9e4fbc6a21
Defined the collapsed data property on EntityMixin level 2023-01-15 15:29:26 +01:00
Fabio Manganiello 78e250186b
Deallocate the color converter when the light component is unmounted 2023-01-15 15:25:04 +01:00
Fabio Manganiello e9371ac5d0
Improved entity collapse logic
- Toggle collapsed state also if clicked on the gap between the entity
  name and the right edge, instead of opening the entity modal. The
  entity configuration modal should open only when clicking on the
  entity name or icon (and these should be highlighted on hover as links
  as well).

- The collapsed state update should be propagated to the wrapped
  component as well, if applicable.
2023-01-15 15:03:53 +01:00
Fabio Manganiello dbf5ed3b85
s/expanded/collapsed/g (for naming consistency) 2023-01-15 14:26:44 +01:00
Fabio Manganiello bb483fd1b1
Using a nice gradient for hover-bg 2023-01-15 12:34:18 +01:00
Fabio Manganiello cda03887d4
Updated dist files 2023-01-15 12:34:02 +01:00
Fabio Manganiello 9df4d5b5b8
Zigbee entities should be marked as unreachable also if they are currently being interviewed 2023-01-14 22:35:17 +01:00
Fabio Manganiello afd9a1d6bf
Don't load entities that only have non-queriable children 2023-01-14 22:33:53 +01:00
Fabio Manganiello 2778357a9e
Wrapped dynamic Vue components in shallowRef.
The performance of the page is heavily degraded by components loaded
dynamically via defineAsyncComponent that recursively carry behind the
whole Vue machinery.

By wrapping defineAsyncComponent calls in shallowRef we make sure that
we only wire the root level of the newly created dynamic component.
2023-01-14 22:31:48 +01:00
Fabio Manganiello fd2d83c80b
Renamed Notification mixin's warn and error methods.
Renamed to `notifyWarning` and `notifyError` respectively.

Those names can often clash with other properties defined on components
that extend the mixin (like entities).
2023-01-14 22:27:43 +01:00
Fabio Manganiello aa22507f50
DropdownItem.className should not be enforced to be a string.
It can also be a class -> boolean object.
2023-01-14 22:11:05 +01:00
Fabio Manganiello a58caa17e2
Decreased time of EventQueue (2 -> 1 second) to make entity events more responsive 2023-01-13 23:28:58 +01:00
Fabio Manganiello 68497e6388
Normalize the light devices' IEEE addresses before retrieving the associated devices 2023-01-13 23:28:12 +01:00
Fabio Manganiello 22a566a88b
More refactors and fixes for `zigbee.mqtt` 2023-01-13 02:58:47 +01:00
Fabio Manganiello 38438230d7
The batch of entities currently being processed should have no duplicate keys 2023-01-11 01:22:56 +01:00
Fabio Manganiello 4a2851231c
Large refactor of `zigbee.mqtt`
- Support for device options as children configuration entities
- Refactored switches management, removed legacy `switches` plugin
  integration, and supporting multiple binary switches for one device
2023-01-09 01:02:49 +01:00
Fabio Manganiello 27b23b7fae
Normalize array/dict options for values on EnumSwitch 2023-01-09 01:01:35 +01:00
Fabio Manganiello e9c84ff5d4
Support units on dimmer entities 2023-01-09 01:01:05 +01:00
Fabio Manganiello 32330ca7a8
Merge branch 'master' into 29-generic-entities-support 2023-01-08 23:26:08 +01:00
Fabio Manganiello a7a107e5fb
Merge pull request #343 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/minimatch-3.1.2
Bump minimatch from 3.0.4 to 3.1.2 in /platypush/backend/http/webapp
2023-01-08 23:25:17 +01:00
dependabot[bot] a0e45c38a5
Bump minimatch from 3.0.4 to 3.1.2 in /platypush/backend/http/webapp
Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2.
- [Release notes](https://github.com/isaacs/minimatch/releases)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-08 22:24:41 +00:00
Fabio Manganiello 1ae92dca92
Merge pull request #357 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/json5-1.0.2
Bump json5 from 1.0.1 to 1.0.2 in /platypush/backend/http/webapp
2023-01-08 23:23:16 +01:00
dependabot[bot] 379c822588
Bump json5 from 1.0.1 to 1.0.2 in /platypush/backend/http/webapp
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-08 22:22:52 +00:00
Fabio Manganiello 309643dcc6
Merge pull request #345 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/loader-utils-1.4.2
Bump loader-utils from 1.4.0 to 1.4.2 in /platypush/backend/http/webapp
2023-01-08 23:21:54 +01:00
dependabot[bot] 47c3a24def
Bump loader-utils from 1.4.0 to 1.4.2 in /platypush/backend/http/webapp
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-08 15:53:12 +00:00
Fabio Manganiello 66000a0774
Merge branch 'master' into 29-generic-entities-support 2023-01-08 00:23:57 +01:00
Fabio Manganiello 2893cb1cc4
Replaced deprecated `missing` marshmallow parameter with `load_default` 2023-01-08 00:15:24 +01:00
Fabio Manganiello 7d90b274ae
Make sure that any existing device monitor is terminated upon disconnection 2023-01-07 23:48:02 +01:00
Fabio Manganiello 72454a6583
Merge branch 'master' into 29-generic-entities-support 2023-01-07 23:31:31 +01:00
Fabio Manganiello 40bdc3b7f3
Always wait 5 seconds (regardless of the poll interval) in case of errors.
Also, print the error only on the first occurrence, to prevent log
spamming.
2023-01-07 23:21:59 +01:00
Fabio Manganiello e8f767d819
Take into account the notify_only_if_changed parameter 2023-01-07 23:11:34 +01:00
Fabio Manganiello c5cf9803ff
Take into account the notify_only_if_changed parameter 2023-01-07 23:09:42 +01:00
Fabio Manganiello 6630873e2c
Merge branch 'master' into 29-generic-entities-support 2023-01-07 22:39:46 +01:00
Fabio Manganiello 2ee810bdc4
Added missing event to documentation 2023-01-07 22:39:23 +01:00
Fabio Manganiello b7f266cd92
Merge branch 'master' into 29-generic-entities-support 2023-01-07 22:31:36 +01:00
Fabio Manganiello a77206800d
Added HID plugin to support interaction with generic HID devices 2023-01-07 22:30:32 +01:00
Fabio Manganiello c215c693f5
Only pass children that aren't configuration values to the entities 2023-01-03 23:25:43 +01:00
Fabio Manganiello 7868d6fe37
Support for nested configuration objects on entity modals 2023-01-03 23:16:14 +01:00
Fabio Manganiello 13eb515f87
Select current display value by default on EnumSwitch 2023-01-03 23:14:57 +01:00
Fabio Manganiello 01727f53bc
Support for is_configuration flag on `zwave` entities 2023-01-03 23:13:34 +01:00
Fabio Manganiello c32aecece3
Added is_configuration flag to entities 2023-01-03 23:12:27 +01:00
Fabio Manganiello 81fee3ea2a
Style tweaks 2023-01-03 23:11:39 +01:00
Fabio Manganiello 71ed545cc7
Fancier gradient background for the navigator header 2023-01-02 23:28:53 +01:00
Fabio Manganiello 0f60bc2131
Don't delete external_id and data attributes unless they are set 2023-01-02 21:01:46 +01:00
Fabio Manganiello b0671354ea
(Tentative) support for zwave light colors 2023-01-02 12:50:01 +01:00
Fabio Manganiello 4f75cbc8b4
Updated frontend dist files 2023-01-01 23:23:18 +01:00
Fabio Manganiello 80c2c77272
Support for entities with children on the frontend 2023-01-01 23:06:40 +01:00
Fabio Manganiello 772ba6adb0
Merge branch 'master' into 29-generic-entities-support 2023-01-01 13:19:31 +01:00
Fabio Manganiello dd3c4b10c7
Run register_service in a separate thread in `backend.http`.
The Zeroconf registration part may randomly get stuck, resulting in the
web server not being properly started.

It's therefore better to run the Zeroconf registration process
asynchronously, for it's not strictly required for the web server to
execute.
2023-01-01 13:19:11 +01:00
Fabio Manganiello edddc90d73
Run register_service in a separate thread in `backend.http`.
The Zeroconf registration part may randomly get stuck, resulting in the
web server not being properly started.

It's therefore better to run the Zeroconf registration process
asynchronously, for it's not strictly required for the web server to
execute.
2023-01-01 13:16:46 +01:00
Fabio Manganiello 1c811a490f
Don't serialize children_ids in Entity.to_json()
Serializing both children_ids and parent_id can result in nasty
SQLAlchemy bugs, especially when handling objects that haven't been
flushed yet.
2023-01-01 12:47:15 +01:00
Fabio Manganiello f9b6799a18
A more robust and scalable way of merging/handling the currentValue/targetValue duality in zwave.mqtt 2023-01-01 12:45:41 +01:00
Fabio Manganiello 0513339be7
Merge branch 'master' into 29-generic-entities-support 2022-12-20 23:06:19 +01:00
Fabio Manganiello 84ce31cab0
Bump version: 0.24.3 → 0.24.4 2022-12-20 23:05:42 +01:00
Fabio Manganiello d0d333e8f4
FIX: Clear the cronjob event after receiving a TIME_SYNC.
When a cronjob receives a TIME_SYNC event (because the system clock has
changed/drifted and the cronjobs are expected to recalculate their next
run slot) it should also clear the event.

Otherwise, the next `wait` will be skipped and the cronjob will be
executed even if it wasn't scheduled.
2022-12-20 23:01:03 +01:00
Fabio Manganiello 2feaba7bf4
Add children_ids attribute to entities when converted to JSON 2022-12-18 21:03:12 +01:00
Fabio Manganiello 3615a269fe
Use Float instead of Numeric on NumericSensor table.
The Numeric type may have casting/rounding issues with SQLite.
2022-12-18 15:25:22 +01:00
Fabio Manganiello 5763c5e0ba
Don't use the entities cache when upserting entities.
This may make things a bit less optimal, but it's probably the only
possible solution that preserves my sanity.

Managing upserts of cached instances that were previously made transient
and expunged from the session is far from easy, and the management of
recursive parent/children relationships only add one more layer of
complexity (and that management is already complex enough in its current
implementation).
2022-12-18 15:13:21 +01:00
Fabio Manganiello b0464219d3
Large refactor of the entities engine. 2022-12-17 21:41:23 +01:00
Fabio Manganiello 9ddebb920f
Merge branch 'master' into 29-generic-entities-support 2022-12-17 00:51:51 +01:00
Fabio Manganiello 6666f5581c
Bump version: 0.24.2 → 0.24.3 2022-12-17 00:31:22 +01:00
Fabio Manganiello 3279a6ca53 Merge pull request 'Add author and tags attributes to RSS feed entries' (#238) from 236-add-author-and-tags-columns-to-feeds into master
Reviewed-on: #238
2022-12-17 00:25:09 +01:00
Fabio Manganiello 152ebdf737
[#236] Added `author` and `tags` attributes to new feed entry event and schema objects. 2022-12-17 00:21:32 +01:00
Fabio Manganiello cd569c76aa
Changed deprecated format of description_file in setup.cfg 2022-12-16 23:20:26 +01:00
Fabio Manganiello b044fa4acf
s/disable_logging/logging_level/g on entity events. 2022-12-11 11:58:49 +01:00
Fabio Manganiello 3e41418742
Merge branch 'master' into 29-generic-entities-support 2022-12-11 11:47:12 +01:00
Fabio Manganiello 2ee2a1d7b5
Replaced `disable_logging` with a more generic `logging_level`.
The `disable_logging` attribute was only available on events and
responses, and it could only either entirely disable or enable logging
for all the events of a certain type.

The new flag allows more customization by setting the default logging
level used for any message of a certain type (or `None` to disable
logging). This makes it possible to e.g. set some verbose events to
debug level, and the user can see them if they configure the application
in debug mode.

It also delegates the logging logic to the message itself, instead of
having different parts of the application handling their own logic.
2022-12-11 11:46:37 +01:00
Fabio Manganiello d4b540dd67
Replaced `disable_logging` with a more generic `logging_level`.
The `disable_logging` attribute was only available on events and
responses, and it could only either entirely disable or enable logging
for all the events of a certain type.

The new flag allows more customization by setting the default logging
level used for any message of a certain type (or `None` to disable
logging). This makes it possible to e.g. set some verbose events to
debug level, and the user can see them if they configure the application
in debug mode.

It also delegates the logging logic to the message itself, instead of
having different parts of the application handling their own logic.
2022-12-11 11:39:38 +01:00
Fabio Manganiello dff54a5246
Merge branch 'master' into 29-generic-entities-support 2022-12-11 10:59:58 +01:00
Fabio Manganiello aa3479abeb
Added [-v|--verbose] and --version options to the command line. 2022-12-11 10:59:12 +01:00
Fabio Manganiello a1d3724b8d
Added [-v|--verbose] and --version options to the command line. 2022-12-11 10:54:03 +01:00
Fabio Manganiello cf9d34d38e
A more robust logic to parse `zwave.mqtt` value attributes. 2022-12-10 16:21:29 +01:00
Fabio Manganiello c4f649a0d5
`autoflush` should be passed as an option to `db.get_session`. 2022-12-10 16:20:14 +01:00
Fabio Manganiello 6a2a3100f8
LINT fixes for `zwave.mqtt` backend 2022-12-10 16:16:23 +01:00
Fabio Manganiello 5a47308516
Merge branch 'master' into 29-generic-entities-support 2022-12-10 15:57:28 +01:00
Fabio Manganiello 4c8190ac14
Bump version: 0.24.1 → 0.24.2 2022-12-10 15:37:49 +01:00
Fabio Manganiello 6713bf6994
Fixed `backend.zwave` event logic dispatch for recent versions of ZWaveJS.
ZWaveJS has broken back-compatibility with zwavejs2mqtt when it comes to
events format.

Only a partial representation of the node and value objects is
forwarded, and that's often not sufficient to infer the full state of
the node with its values.

The `_dispatch_event` logic has therefore been modified to accommodate
both the implementation.

This means that we have to go conservative in order to preserve
back-compatibility and not over-complicate things, even if it (slightly)
comes at the expense of performance.
2022-12-10 15:35:09 +01:00
Fabio Manganiello 313105f014
Fixed `backend.zwave` event logic dispatch for recent versions of ZWaveJS.
ZWaveJS has broken back-compatibility with zwavejs2mqtt when it comes to
events format.

Only a partial representation of the node and value objects is
forwarded, and that's often not sufficient to infer the full state of
the node with its values.

The `_dispatch_event` logic has therefore been modified to accommodate
both the implementation.

This means that we have to go conservative in order to preserve
back-compatibility and not over-complicate things, even if it (slightly)
comes at the expense of performance.
2022-12-10 14:52:10 +01:00
Fabio Manganiello a17bc3c474 `main.db` should use the configured `workdir` when not specified.' (#235)
Reviewed-on: #235
Closes: #234
2022-12-09 23:41:07 +01:00
Fabio Manganiello 219a0a99ca `main.db` should use the configured `workdir` when not specified.
Closes: #234
Reviewed-On: #234
2022-12-09 23:37:10 +01:00
Fabio Manganiello 3b1147eaae Bump version: 0.24.0 → 0.24.1 2022-12-08 12:33:34 +01:00
Fabio Manganiello 5ba3fa1b5b FIX: Parenthesized context managers are only available in Python >= 3.10
Since Parenthesized context managers are only supported on very recent
versions of Python (thanks black for breaking back-compatibility), we
should still use the old multiline syntax - it's not worth breaking
compatibility with Python >= 3.6 and < 3.10 just to avoid typing a
backslash.
2022-12-08 12:28:36 +01:00
Fabio Manganiello 00fca6b187
Merge branch 'master' into 29-generic-entities-support 2022-12-04 20:58:06 +01:00
Fabio Manganiello 00a918dd20
Support for the new way of reporting events on ZWaveJS-UI.
The most recent versions of ZwaveJS-UI don't send the `hexId` of the
node on node change events. We have therefore to infer it from the
reported `dbLink`.
2022-12-04 20:56:52 +01:00
Fabio Manganiello 3a92bf59ca
Support for the new way of reporting events on ZWaveJS-UI.
The most recent versions of ZwaveJS-UI don't send the `hexId` of the
node on node change events. We have therefore to infer it from the
reported `dbLink`.
2022-12-04 20:48:42 +01:00
Fabio Manganiello ecba72935f
Check for table metadata existance in `Base.metadata` instead of having a separate entity registry 2022-12-04 16:28:46 +01:00
Fabio Manganiello 1ab85f99d9
Support for illuminance sensor entities on `zigbee.mqtt` 2022-11-30 02:16:56 +01:00
Fabio Manganiello 09d70e2ff1
The `zwavejs2mqtt` project has been renamed `zwave-js-ui`
Change the documentation accordingly
2022-11-30 02:04:48 +01:00
Fabio Manganiello b6370b51da
Extended humidity sensors detection for zigbee.mqtt 2022-11-30 01:24:35 +01:00
Fabio Manganiello 16c24d799d
Removed custom formatting for child zigbee/zwave entity names
The parent->child relationship is now modelled on the database itself,
so we no longer need value names specifically formatted as
`[DeviceName] ValueName` - the UI will take care of it.
2022-11-30 01:02:25 +01:00
Fabio Manganiello 080b21ab70
Added support for reachable flag on zwave.mqtt child entities 2022-11-30 01:01:45 +01:00
Fabio Manganiello 2b532c1947
Implemented parent/child support for zigbee.mqtt entities 2022-11-30 00:55:04 +01:00
Fabio Manganiello abaeabea22
Implemented recursive merges of parent/child relationships in entities 2022-11-30 00:50:53 +01:00
Fabio Manganiello cc156a53a1
Support for parent/children relationships on `zwave.mqtt` entities 2022-11-28 21:42:11 +01:00
Fabio Manganiello 0edd73690b
Modelling of parent/children relationships on entity level 2022-11-28 21:36:00 +01:00
Fabio Manganiello 0e0c90f0f2
zwave.mqtt additions
- Infer entity types on the basis of their semantic type (bool, decimal,
  list) and read-only attribute (read-only bool is `BinarySensor`,
  read-write bool is `Switch`, read-only decimal is `NumericSensor`,
  read-write decimal is `Dimmer`, etc.) instead of trying to infer it
  from the command class. Only a small set of command classes (like
  configurations, vendor-specific or internal values) will be excluded.
  This should greatly increase the number of supported values.

- Added support for `EnumSwitch` entities.

- Added inference for illuminance and humidity sensors.
2022-11-27 22:53:53 +01:00
Fabio Manganiello 78c59f437a
Added support for illuminance sensor entities 2022-11-27 22:38:58 +01:00
Fabio Manganiello 03d1c554ea
Updated webapp dist files 2022-11-27 14:23:30 +01:00
Fabio Manganiello b1a7a7d915
Fixed little overlap between the entities' header and the navigator 2022-11-27 12:56:39 +01:00
Fabio Manganiello b5653e070e
Style improvements for the main navigator 2022-11-27 12:56:17 +01:00
Fabio Manganiello 681f307d04
A more self-explanatory icon for entity grouping selections 2022-11-27 00:56:47 +01:00
Fabio Manganiello bba582875a
The `data` attribute on `EntityUpdateEvent` shouldn't be taken into account for flashing updates 2022-11-27 00:56:23 +01:00
Fabio Manganiello e8d6717fcb
Added input box for <Dimmer> entities 2022-11-27 00:56:01 +01:00
Fabio Manganiello bd59a5eefd
Support for range labels on <Slider> 2022-11-27 00:55:19 +01:00
Fabio Manganiello f8aaab20f5
Updated webapp dist files 2022-11-27 00:53:58 +01:00
Fabio Manganiello faa8295469
White background for main nav 2022-11-26 01:52:42 +01:00
Fabio Manganiello d29723ea41
Keep the main menu items vertically aligned to the center also on tablets 2022-11-26 01:28:20 +01:00
Fabio Manganiello d0c8a8edf9
A bit of padding for LightHue on mobile 2022-11-26 01:19:52 +01:00
Fabio Manganiello 37254cad1a
Mobile UI improvements 2022-11-26 01:16:07 +01:00
Fabio Manganiello f28f08dd1a
Keep the main menu open on page load by default on >= desktop 2022-11-26 01:15:03 +01:00
Fabio Manganiello fecd96f64c
Solved issue with main menu shrinking a bit when the main panel has too much wide content 2022-11-26 00:32:11 +01:00
Fabio Manganiello 33cc055249
Switched expanded main menu to light colors 2022-11-26 00:31:36 +01:00
Fabio Manganiello a57e67b96f
Better style for the settings' users and token panels 2022-11-25 23:16:16 +01:00
Fabio Manganiello 21c1c96f2e
Use Dropdown for the settings menu 2022-11-25 23:15:41 +01:00
Fabio Manganiello 292ed2abff
Better style for dropdown items.
- Larger icon div to prevent text overlapping with icons
- Support for `selected` class
2022-11-25 23:14:28 +01:00
Fabio Manganiello 73f6712f7a
Bump version: 0.23.6 → 0.24.0 2022-11-22 00:12:25 +01:00
Fabio Manganiello c0dd91838b
Merge branch 'master' into 29-generic-entities-support 2022-11-21 22:13:47 +01:00
Fabio Manganiello d95baac74e Add user credentials on the encrypted JWT token.
Adding the credentials ensures that tokens associated to non-existing
users, or users with an invalid password, won't be accepted, even if
they were correctly encrypted using the host's keypair.

This adds an additional layer of security in case the host's keypair
gets compromised.
2022-11-21 13:16:09 +01:00
Fabio Manganiello 98d7c95aa7 Removed two unrequired `return` statements 2022-11-21 13:04:48 +01:00
Fabio Manganiello ba1681fc22 Merge branch 'master' into 29-generic-entities-support 2022-11-21 12:36:01 +01:00
Fabio Manganiello a2c8e27bd8 Removed PyJWT dependency.
PyJWT is a very brittle and cumbersome dependency that expects several
cryptography libraries to be already installed on the system, and it can
lead to hard-to-debug errors when ported to different systems.

Moreover, it installs the whole `cryptography` package, which is several
MBs in size, takes time to compile, and it requires a Rust compiler to
be present on the target machine.

Platypush will now use the Python-native `rsa` module to handle JWT
tokens.
2022-11-21 12:30:38 +01:00
Fabio Manganiello 02f89258b8
FIX: Task.set_name only works on Python >= 3.8 2022-11-21 09:49:57 +01:00
Fabio Manganiello ae17a12c12
FIX: `UserManager.get_users`
`UserManager.get_users` should not return a reference to the query
object, since the query object will be invalidated as soon as the
connection is closed.

Instead, it should return directly the list of `User` objects.
2022-11-21 00:57:00 +01:00
Fabio Manganiello e579fb3417
Don't display sensors with null value 2022-11-21 00:05:19 +01:00
Fabio Manganiello b9e6614b04
Added support for `EnumSensor` entities 2022-11-21 00:04:07 +01:00
Fabio Manganiello d171000a0e
Initial support for sensor entities in `zwave.mqtt` 2022-11-14 22:08:15 +01:00
Fabio Manganiello a7bc4f443c
Imports order 2022-11-14 21:30:43 +01:00
Fabio Manganiello 45d0e4445b
Sorted entity type names 2022-11-14 00:46:58 +01:00
Fabio Manganiello 96ce4729f9
Updated webapp dist files 2022-11-14 00:46:40 +01:00
Fabio Manganiello b7757d17cc
Updated webapp dist files 2022-11-14 00:06:41 +01:00
Fabio Manganiello 7fac5392b8
Blink entities only if their values have actually changed 2022-11-13 23:52:21 +01:00
Fabio Manganiello 211372e472
Added support for dimmers on `zigbee.mqtt` 2022-11-13 18:48:36 +01:00
Fabio Manganiello 833d908a32
Blink entities body upon update 2022-11-13 01:39:40 +01:00
Fabio Manganiello 24f5a8283c
Added `PRAGMA foreign_keys = ON` before deleting entities on SQLite
SQLite doesn't enable foreign keys cascade on delete by default.
2022-11-13 01:18:45 +01:00
Fabio Manganiello f90d84a3d4
Don't wait for UI updates for entities that are not queriable 2022-11-13 00:54:37 +01:00
Fabio Manganiello fb594cb8b1
Updated webapp dist files 2022-11-12 16:31:35 +01:00
Fabio Manganiello 69e097707d
Don't lock read session from the main database 2022-11-12 16:10:57 +01:00
Fabio Manganiello 86edd70d93
Fixed session/concurrency management on the main SQLite db
- The `declarative_base` instance should be shared
- Database `session_locks` should be stored at module, not instance
  level
- Better isolation of scoped sessions
- Enclapsulated `get_session` method in `UserManager`
2022-11-12 15:36:17 +01:00
Fabio Manganiello bfeb0a08c4
Encapsulate `_get_session` in `EntityManager` 2022-11-12 15:14:10 +01:00
Fabio Manganiello 8450129858
LINT fixes 2022-11-12 11:39:12 +01:00
Fabio Manganiello 8a894d0989
`user_manager` should be a global object instead of being initialized on-demand 2022-11-12 11:38:40 +01:00
Fabio Manganiello 6b7933cd33
Using a different SQLite database for entities
This prevents multiprocessing/concurrency issues when modifying the same
database file both from the main process and from the web server process
2022-11-12 02:00:55 +01:00
Fabio Manganiello 3fc94181b7
LINT fixes 2022-11-11 22:02:36 +01:00
Fabio Manganiello 26f869b6e4
LINT fixes 2022-11-11 21:49:38 +01:00
Fabio Manganiello 02a4c9f667
Added is_query_disabled attribute to entities 2022-11-11 20:40:36 +01:00
Fabio Manganiello 84bb77bd5b
Replaced ambiguous logger variable name 2022-11-11 20:37:39 +01:00
Fabio Manganiello 00a43dd1f8
Implemented `EnumSwitch` entity type
Done for `zigbee.mqtt`, other plugins will follow
2022-11-11 01:46:38 +01:00
Fabio Manganiello 801ed05684
Added support for binary sensors (in zigbee.mqtt for now) 2022-11-05 01:47:50 +01:00
Fabio Manganiello 6454f9d018
Propert snake case -> camel case conversion for backend entities -> frontend components 2022-11-04 22:53:24 +01:00
Fabio Manganiello 0f19104512
Improved zigbee.mqtt node property queries.
Now handling cases of nodes with values having multiple levels (> 1) of
nested properties.
2022-11-04 22:51:40 +01:00
Fabio Manganiello 5ca3c06f96
Normalize device names in set_lights 2022-11-02 23:32:21 +01:00
Fabio Manganiello d5f8d55b4b
Fixed zigbee.mqtt light entity conversion 2022-11-02 23:07:12 +01:00
Fabio Manganiello 636d1ced3a
A more robust way of splitting devices provided in the <ieee_address:value> format 2022-11-02 22:49:19 +01:00
Fabio Manganiello 7db84acd34
Notify of entity scan timeouts on the console instead of creating tons of notifications 2022-11-02 22:24:06 +01:00
Fabio Manganiello 02abef71e3
Fixes for zigbee devices polling
- Don't publish a `get` request if the device has no exposed queriable
  attributes.

- Perform the recursive build of the `get` request payload before
  checking for the `access` attribute.
2022-11-02 21:54:47 +01:00
Fabio Manganiello 64513be6b8
Initial implementation of sensor entities.
Implemented (at least in `zigbee.mqtt`, for now):

- `TemperatureSensor`
- `HumiditySensor`
- `VoltageSensor`
- `CurrentSensor`
- `EnergySensor`
- `PowerSensor`
- `NumericSensor` (generic fallback 1)
- `RawSensor` (generic fallback 2)
- `Sensor` (root class)
2022-11-02 16:38:17 +01:00
Fabio Manganiello 440cd60d6e
A (slightly) smarter way to infer the plural spelling of singular entity names 2022-11-02 16:35:20 +01:00
Fabio Manganiello 3d1a08f7af
Changed default entity grouping on the frontend.
Changed from `type` to `category`, which is basically the `name_plural`
attribute of the associated entity type metadata.

This allows us to define distinct entity metadata entries that we still
want to share the same grouping - for instance, `temperature_sensor`,
`humidity_sensor` and `battery` should all be grouped under `Sensors` on
the frontend.
2022-11-02 16:33:12 +01:00
Fabio Manganiello 68dd09e8ae
Removed unused `expanded` data attribute 2022-11-02 16:31:50 +01:00
Fabio Manganiello d7214c4c83
Fix for `No converter available` warnings on zigbee2mqtt
Only include readable (not state-only) properties on the payload sent to
to `zigbee2mqtt/<device>/get`.
2022-10-31 00:51:26 +01:00
Fabio Manganiello a1cf671334
Added support for link_quality entities to `zigbee.mqtt` 2022-10-30 11:03:22 +01:00
Fabio Manganiello 78dc8416fb
Snake case -> camel case for backend -> frontend entity types conversion 2022-10-30 11:01:46 +01:00
Fabio Manganiello 691d109fb7
Expunge entities after session commit to ensure that the ORM objects can be reused 2022-10-30 11:00:09 +01:00
Fabio Manganiello 71ccf6d04a
Support for battery sensors on zigbee.mqtt 2022-10-29 18:16:38 +02:00
Fabio Manganiello 42651e937b
LINT fixes on zigbee.mqtt plugin 2022-10-29 14:09:44 +02:00
Fabio Manganiello d61b053f72
Support for battery entities 2022-10-29 13:38:42 +02:00
Fabio Manganiello cdacf50fc7
Support for decimal.Decimal type JSON serialization 2022-10-29 13:35:52 +02:00
Fabio Manganiello b8215d2736 A more robust cron start logic
If may happen (usually because of a race condition) that a cronjob has
already been started, but it hasn't yet changed its status from IDLE to
RUNNING when the scheduler checks it.

This fix guards the application against such events. If they occur, we
should just report them and move on, not terminate the whole scheduler.
2022-10-27 10:45:59 +02:00
Fabio Manganiello 486cd66885
More LINTs 2022-10-23 21:23:19 +02:00
Fabio Manganiello 72c7444a45
LINT 2022-10-23 18:23:20 +02:00
Fabio Manganiello 951950c864
Added dimmer entities 2022-10-23 00:30:32 +02:00
Fabio Manganiello d7278857e5
Ensure that no records with duplicate key exist within an SQLAlchemy session before flushing 2022-10-23 00:28:42 +02:00
Fabio Manganiello 3e6ebdd23b
Don't store/show the state of write-only toggle switches 2022-10-23 00:28:01 +02:00
Fabio Manganiello 8cd5cb3338
The Slider should only react to @input events 2022-10-23 00:26:59 +02:00
Fabio Manganiello 1af7ece881
Added deprecation notice for `zwave` plugin and backend (use `zwave.mqtt` instead) 2022-10-22 19:17:58 +02:00
Fabio Manganiello 5c68365188
Better management for entity error icons 2022-10-14 23:37:36 +02:00
Fabio Manganiello 7f575bacaa
Implemented the new zwavejs2mqtt features for adding and removing nodes 2022-10-14 23:28:02 +02:00
Fabio Manganiello 5995d045e1
Merge branch 'master' into 29-generic-entities-support 2022-10-14 20:57:13 +02:00
Fabio Manganiello a5db599268
FIX: Skip empty lines on `config.include` 2022-10-14 20:56:18 +02:00
Fabio Manganiello c89ed24f4b
Updated webapp dist files 2022-10-12 03:07:17 +02:00
Fabio Manganiello 1b791156bd
Proper support for color zigbee lights 2022-10-12 03:00:42 +02:00
Fabio Manganiello e617fc75d4
Fixed slider ranges and label 2022-10-12 02:59:50 +02:00
Fabio Manganiello 041f64c80f
Dirty workaround to prevent redefinition of SQLAlchemy ORM model classes 2022-10-10 01:38:15 +02:00
Fabio Manganiello aa5b52db2f
FIX: Still redirect to /register by default if no users have been created 2022-10-10 01:36:28 +02:00
Fabio Manganiello 5f09d449f4
`extend_existing=True` for entity tables 2022-10-09 23:15:50 +02:00
Fabio Manganiello 6ec8a991df
Fixed tests 2022-10-08 15:18:26 +02:00
Fabio Manganiello 958ef6b987
Better entity modal padding 2022-10-07 11:12:30 +02:00
Fabio Manganiello 16c55b45f6
updated dist files 2022-10-07 11:12:13 +02:00
Fabio Manganiello b9b7404230
Web panel improvements.
- Don't return a redirect to the login page if an authentication failed
  over a JSON endpoint - instead, return a JSON payload with the error.

- Added support for additional fonts.

- Re-designed the login/registration page.

- Updated caniuse database.
2022-10-07 02:24:29 +02:00
Fabio Manganiello c0ffea681f
updated dist files 2022-10-07 02:23:12 +02:00
Fabio Manganiello 2aab1d090d
Increased maxkb limit 2022-10-07 02:23:04 +02:00
Fabio Manganiello 2cc80e7f16
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin 2022-10-07 00:05:54 +02:00
Fabio Manganiello b88983f055
Added `qos` argument to `mqtt.publish`. 2022-10-05 01:13:47 +02:00
Fabio Manganiello 85f583a0ad
Reduced :maxdepth: of toctree in documentation.
Recent versions of Sphinx get a bit too zealous about generating deeply
nested toctrees.
2022-09-30 11:47:19 +02:00
Fabio Manganiello fed7c2c6ff
Fixed typo in schema path 2022-09-30 11:30:57 +02:00
Fabio Manganiello 1d78c3e753
FIX: Broken docstring 2022-09-30 10:56:08 +02:00
Fabio Manganiello 00d47731c5 Merge pull request 'Mimic3 integration' (#227) from 226-mimic3-integration into master
Reviewed-on: #227
2022-09-30 10:52:53 +02:00
Fabio Manganiello ae226a5b01
Added `tts.mimic3` integration.
Closes: #226
2022-09-30 10:51:17 +02:00
Fabio Manganiello fef7aff245
LINT fixes for mpv plugin 2022-09-30 10:41:56 +02:00
Fabio Manganiello 82ab7face2
A more robust logic to detect the webserver local bind address 2022-09-30 03:10:37 +02:00
Fabio Manganiello 3ed10092ae Merge pull request 'Wallabag integration' (#225) from 222-wallabag-integration into master
Reviewed-on: #225
2022-09-29 10:52:16 +02:00
Fabio Manganiello 4bab9d2607
[#224] Implemented Wallabag integration 2022-09-29 10:51:16 +02:00
Fabio Manganiello deb25196d2
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin 2022-09-28 02:17:10 +02:00
Fabio Manganiello a0575ed6de
Bump version: 0.23.5 → 0.23.6 2022-09-19 20:41:02 +02:00
Fabio Manganiello 3d74f0a11f
Updated CHANGELOG 2022-09-19 20:40:54 +02:00
Fabio Manganiello 09baceab4b
Include album_id and the list of tracks in music.tidal.get_album 2022-09-19 20:39:21 +02:00
Fabio Manganiello c2a3f2f4f3
Bump version: 0.23.4 → 0.23.5 2022-09-18 19:55:05 +02:00
Fabio Manganiello 36dd645209
Use session.playlist instead of session.user.playlist to query playlists 2022-09-18 06:04:53 +02:00
Fabio Manganiello 61cda60751
Proper implementation for Tidal's add_to_playlist and remove_from_playlist methods
- Using tidalapi's `UserPlaylist.add` and `UserPlaylist.delete` methods
  instead of defining my own through `_api_request`, so we won't have to
  deal with the logic to set the ETag header.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Closes #219

See merge request platypush/platypush!14
2022-06-01 23:07:37 +02:00
Fabio Manganiello 8be515c17b
[closes #219] Added ntfy integration 2022-06-01 23:01:29 +02:00
Fabio Manganiello 5b3e1317f4
Only refresh entities that are visible on the interface 2022-05-30 09:23:25 +02:00
Fabio Manganiello 1df71cb54a
Proper support for light entities on smartthings 2022-05-30 09:23:05 +02:00
Fabio Manganiello 0689e05e96
Apply the light color to the icon fill instead of the bulb icon itself 2022-05-30 09:18:19 +02:00
Fabio Manganiello 89560e7c38
Only include entities associated to enabled plugins or with no plugins in `entities.get` 2022-05-29 23:59:46 +02:00
Fabio Manganiello 30dfdeecb0
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin 2022-05-25 10:11:57 +02:00
Fabio Manganiello 239025290d
--redis-queue argument should be a string 2022-05-25 10:11:29 +02:00
Fabio Manganiello 2e2169544d
Added Matrix chat badge and instructions for installation on Arch Linux 2022-05-23 00:09:23 +02:00
Fabio Manganiello 7a0e39111d FIX: A feed entry may not necessarily have an `id` attribute 2022-05-06 14:38:25 +02:00
Fabio Manganiello f57f940d57
Made _is_switch more resilient against rogue Z-Wave values 2022-05-01 22:18:46 +02:00
Fabio Manganiello 117f92e5b4
Deprecated the `light.hue` backend
The polling logic has been moved to the `light.hue` plugin itself
instead, so it's no longer required to have both a plugin and a backend
enabled in order to fully manage a Hue bridge.
2022-05-01 21:55:35 +02:00
Fabio Manganiello a5541c33b0
Added support for light entities in zigbee.mqtt
TODO: Support for colors (I don't have a color Zigbee bulb to test it on yet)
2022-05-01 21:10:54 +02:00
Fabio Manganiello b23f45f45e
Process a zigbee entity update event with all the properties, not only the ones that have been changed 2022-05-01 21:09:13 +02:00
Fabio Manganiello 088cf23958
Do not emit input event from the light component upon update
It may be an incomplete update that breaks the UI, and it will be
overwritten by the backend event anyway
2022-05-01 21:08:02 +02:00
Fabio Manganiello e8f4b7c10e
CSS adjustments 2022-05-01 15:44:57 +02:00
Fabio Manganiello dd12d57552
Added light UI entity component 2022-05-01 15:35:20 +02:00
Fabio Manganiello 5aa3750807
Re-sync the list of entities when the entities component is mounted 2022-05-01 15:34:45 +02:00
Fabio Manganiello f760d44224
Refactored/simplified UI code for entities management 2022-05-01 15:34:15 +02:00
Fabio Manganiello 8d91fec771
Better implementation for light.hue.set_lights 2022-05-01 15:33:12 +02:00
Fabio Manganiello c22c17a55d
More flexible implementation for LightPlugin abstract methods 2022-05-01 15:31:45 +02:00
Fabio Manganiello 46df3a6a98
FIX: `reachable` is an attribute of `state` 2022-05-01 01:58:05 +02:00
Fabio Manganiello 8e06b8c727
Fixed range scaling on Slider component 2022-04-30 23:40:14 +02:00
Fabio Manganiello 30a024befb
Manage hue/sat/bri/ct light ranges on the light entity object itself 2022-04-30 19:38:50 +02:00
Fabio Manganiello b16af0a97f
Include entity `data` attributes in the entity info modal 2022-04-30 16:39:37 +02:00
Fabio Manganiello c7970842d7
Disable logging by default for entity events (they can be quite spammy) 2022-04-30 02:13:20 +02:00
Fabio Manganiello 7df67aca82
updated_at should have utcnow() onupdate, not now() 2022-04-30 01:48:55 +02:00
Fabio Manganiello d29b377cf1
Exclude deleted lights/groups/scenes from the returned lists 2022-04-30 01:39:39 +02:00
Fabio Manganiello 8d57cf06c2
Major refactor for the `light.hue` plugin.
- Added support for lights as native platform entities.
- Improved performance by using the JSON API objects whenever possible
  to interact with the bridge instead of the native Python objects,
  which perform a bunch of lazy API calls under the hood resulting in
  degraded performance.
- Fixed lights animation attributes by setting only the ones actually
  supported by a light.
- Several LINT fixes.
2022-04-30 01:07:00 +02:00
Fabio Manganiello 975d37c562
Added relevant attributes to `light` entities 2022-04-29 23:29:04 +02:00
Fabio Manganiello 90f067de61
Added `reachable` flag to device entities 2022-04-29 23:27:35 +02:00
Fabio Manganiello f45df5d4d3
Explictly cast entity IDs to strings when coalescing entity updates
Some plugins may represent entity IDs as integers, while the database
maps external IDs to strings. This may result in entities being
incorrectly mapped during merging. Casting to string prevents these
type-related ambiguities.
2022-04-29 23:24:28 +02:00
Fabio Manganiello 975991ba69
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin 2022-04-29 16:53:41 +02:00
Fabio Manganiello 2cd7ae9513
Merge pull request #288 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/async-2.6.4
Bump async from 2.6.3 to 2.6.4 in /platypush/backend/http/webapp
2022-04-29 16:52:07 +02:00
Fabio Manganiello 55958c1b57
[#217] Casting `get_next` to `datetime` to prevent DST issues 2022-04-28 23:29:45 +02:00
Fabio Manganiello d22fbcd9db
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin 2022-04-28 01:58:24 +02:00
Fabio Manganiello e9454b0c0f Merge branch '217-cron-decorated-function-are-off-after-dst-change' into 'master'
Resolve "@cron decorated function are off after DST change"

Closes #217

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-27 12:55:03 +00:00
Fabio Manganiello fee5fc4ae0
HTTP backend dependencies moved from optional to required
If Platypush is supposed to work also without a manually created
`config.yaml`, and the HTTP backend is enabled by default in that
configuration, then Flask and companions should be among the required
dependencies.
2022-04-27 14:52:41 +02:00
Fabio Manganiello 371fd7e46b
Generate a default config.yaml if none is present instead of failing 2022-04-27 13:57:42 +02:00
Fabio Manganiello da73a5f1b9
Replaced deprecated json_output arg in NextCloud client with response.json_data 2022-04-26 19:30:26 +02:00
Fabio Manganiello a80adc996f [WIP] Default config.yaml in case a configuration file is missing in the default locations 2022-04-25 16:54:26 +02:00
Fabio Manganiello 12887b61fe Don't fail hard if the Linode API doesn't return a list of instances 2022-04-25 14:02:40 +02:00
Fabio Manganiello 47f8520f3b
Added support for description/read_only/write_only on entity level 2022-04-24 22:18:29 +02:00
Fabio Manganiello d261b9bb9b
Frontend support for entities deletion 2022-04-24 21:40:10 +02:00
Fabio Manganiello 9981cc4746
Backend support for entities deletion 2022-04-24 21:38:45 +02:00
Fabio Manganiello 3e4b13d20f
Added standard Vue component for confirm dialogs 2022-04-24 21:34:39 +02:00
Fabio Manganiello 321a61d06d
Align .section.right content to the right 2022-04-24 11:30:52 +02:00
Fabio Manganiello b22df768eb
Fixed entity icon alignment on mobile 2022-04-24 01:42:14 +02:00
Fabio Manganiello 8e2154f2b5
Do not overwrite an entity's state from an event if the state was not sampled 2022-04-24 01:41:45 +02:00
Fabio Manganiello a9751f21f1
`entities` should be the default view when the web panel is opened 2022-04-24 01:40:34 +02:00
Fabio Manganiello 135965176d
Support for entity icon color change 2022-04-23 17:52:21 +02:00
Fabio Manganiello ef6b57df31
Added entity info modal and (partial) support for renaming entities 2022-04-23 01:01:14 +02:00
Fabio Manganiello 7d4bd20df0
Support for individual entity group refresh 2022-04-19 23:56:49 +02:00
Fabio Manganiello e6bfa1c50f
Better dynamic entities discovery 2022-04-13 11:25:14 +02:00
Fabio Manganiello 332c91252c
zwave.mqtt.status renamed to controller_status, while status should return the current state of the values 2022-04-12 23:44:14 +02:00
Fabio Manganiello b35c761a43
Fixed entities panel mobile layout 2022-04-12 22:24:19 +02:00
Fabio Manganiello 08c0779347
<style> on entity components should be scoped 2022-04-12 16:00:31 +02:00
Fabio Manganiello 595ebe49ca
Support for entity scan timeout errors and visual error handling 2022-04-12 15:58:19 +02:00
Fabio Manganiello 548d487e73
Publish a switch entity from zigbee.mqtt only if the update includes its state 2022-04-12 14:41:21 +02:00
Fabio Manganiello 20530c2b6d
Loading events are now synchronized both ways upon entity action/refresh 2022-04-12 01:10:09 +02:00
Fabio Manganiello 9ddcf5eaeb
Implemented entities refresh on the UI 2022-04-12 00:43:22 +02:00
Fabio Manganiello 2aa8778078
Do not process EntityUpdateEvents only in case of payload changes
The UI relies on these events upon refresh to detect if a device is
still reacheable. Therefore, we shouldn't mask them if we don't detect
any changes with the current entity configuration/state.
2022-04-12 00:41:20 +02:00
Fabio Manganiello 72617b4b75
Handle EntityUpdateEvents on the UI 2022-04-11 23:16:29 +02:00
Fabio Manganiello be4d1e8e01
Proper support for native entities in zigbee.mqtt integration 2022-04-11 21:16:45 +02:00
Fabio Manganiello db4ad5825e
Fire an EntityUpdateEvent when the zwave.mqtt backend gets a value changed message 2022-04-11 01:40:49 +02:00
Fabio Manganiello 4471001110
smartthings.toggle should properly publish the updated entity 2022-04-11 00:43:31 +02:00
Fabio Manganiello f17245e8c7
Send an EntityUpdateEvent only if an entity has already been persisted
If an event comes from an entity that hasn't been persisted yet on the
internal storage then we wait for the entity record to be committed
before firing an event. It's better to wait a couple of seconds for the
database to synchronize rather than dealing with entity events with
incomplete objects.
2022-04-11 00:38:11 +02:00
Fabio Manganiello 67ff585f6c
Entities engine improvements
- Added cache support to prevent duplicate EntityUpdateEvents
- The cache is smartly pre-populated and kept up-to-date, so it's
  possible to trigger events as soon as the entities are published by
  the plugin (not only when the records are flushed to the internal db)
2022-04-11 00:01:21 +02:00
Fabio Manganiello 17615ff028
Support for multiple entity types/plugins filter on entities.get 2022-04-10 21:23:03 +02:00
Fabio Manganiello 532217be12
Support for filtering entities by search string 2022-04-10 17:57:51 +02:00
Fabio Manganiello f301fd7e69
Added standard NoItems component to handle visualization of no-results divs 2022-04-10 14:27:32 +02:00
Fabio Manganiello 58861afb1c
Added entities panel 2022-04-10 13:07:36 +02:00
Fabio Manganiello 8ec9c8f203
Added standard component for icons 2022-04-10 13:07:01 +02:00
Fabio Manganiello 3435f591eb
Support for keep-open-on-item-click and icon URLs on dropdown elements 2022-04-10 01:57:39 +02:00
Fabio Manganiello 19223bbbe1
Added SmartThings icon 2022-04-10 01:56:47 +02:00
Fabio Manganiello 453652ef76
Updated plugin icons 2022-04-10 01:50:45 +02:00
Fabio Manganiello b2ff66aa62
Added mixins to capitalize/prettify text 2022-04-10 01:50:13 +02:00
Fabio Manganiello 655d56f4da
Upgraded font-awesome to 6.x 2022-04-10 01:49:14 +02:00
Fabio Manganiello f52b556219
- icon_class should not be part of the backend model
- Interaction with entities should occur through the `entities.action`
  method, not by implementing native methods on each of the model
  objects
2022-04-08 16:49:47 +02:00
Fabio Manganiello 947b50b937
Added meta as a JSON field on the Entity table
Metadata attributes can now be defined and overridden on the object
itself, as well as on the database. Note that db settings will always
take priority in case of value conflicts.
2022-04-07 22:11:31 +02:00
Fabio Manganiello db7c2095ea
Implemented meta property for entities (for now it only include `icon_class`) 2022-04-07 18:09:25 +02:00
Fabio Manganiello e40b668380
Added missing docs 2022-04-07 01:49:13 +02:00
Fabio Manganiello d3dc86a5e2
Added documentation for plugin/entity type registry 2022-04-07 01:47:42 +02:00
Fabio Manganiello 28026b0428
Trigger an EntityUpdateEvent when an entity state changes 2022-04-07 01:46:37 +02:00
Fabio Manganiello 44707731a8
Normalize UTC timezone on all the entity timestamps 2022-04-07 01:13:29 +02:00
Fabio Manganiello 948f37afd4
Filter by configured/enabled plugins when returning the entity/plugin registry 2022-04-07 01:04:06 +02:00
Fabio Manganiello 3b4f7d3dad
Added entities plugin to query/action entities 2022-04-07 00:22:54 +02:00
Fabio Manganiello 2eeb1d4fea
Entity objects are now JSON-able 2022-04-07 00:21:54 +02:00
Fabio Manganiello 26ffc0b0e1
Use Redis instead of an in-process map to store the entity/plugin registry
This is particularly useful when we want to access the registry from
another process, like the web server or an external script.
2022-04-07 00:18:11 +02:00
Fabio Manganiello 7b1a63e287
Make sure that flake8 and black don't step on each other's toes 2022-04-07 00:17:39 +02:00
Fabio Manganiello 1c6ff2fa49
(actually, the other way around is better) 2022-04-06 23:56:10 +02:00
Fabio Manganiello d311629403
black validation should run before flake8 2022-04-06 23:48:27 +02:00
Fabio Manganiello d52ae2fb80
Implemented RunnablePlugin.wait_stop() utility method 2022-04-05 23:33:02 +02:00
Fabio Manganiello 061268cdaf
Support for direct actions on native entities [WIP] 2022-04-05 23:22:54 +02:00
Fabio Manganiello 91ff47167b
Don't terminate the entities engine thread if a batch of entity records fails 2022-04-05 23:04:57 +02:00
Fabio Manganiello fe0f3202fe
columns should be a property of the Entity object 2022-04-05 23:04:19 +02:00
Fabio Manganiello 8a70f1d38e
Replaced deprecated sqlalchemy.ext.declarative with sqlalchemy.orm 2022-04-05 22:47:44 +02:00
Fabio Manganiello 4b7eeaa4ed
Smarter merging of entities with the same key before they are committed 2022-04-05 21:17:58 +02:00
Fabio Manganiello b43ed169c7
Added support for switches as native entities to zwave.mqtt plugin 2022-04-05 20:22:47 +02:00
Fabio Manganiello 0dac2c0e92
Fixed handling of possible null device definition in zigbee.mqtt 2022-04-05 00:31:04 +02:00
Fabio Manganiello 28b3672432
Added native support for switch entities to the zigbee.mqtt plugin. 2022-04-05 00:07:55 +02:00
Fabio Manganiello 9f2793118b
black fix 2022-04-04 22:43:04 +02:00
Fabio Manganiello 9d9ec1dc59
Added native support for switch entities to the smartthings plugin 2022-04-04 22:41:04 +02:00
Fabio Manganiello b9c78ad913
Added native support for switch entities to switchbot.bluetooth plugin 2022-04-04 21:12:59 +02:00
Fabio Manganiello 91ff8d811f
Added native entities support in switchbot plugin 2022-04-04 20:56:28 +02:00
Fabio Manganiello 783238642d
Skip string and underscore normalization in black 2022-04-04 20:56:28 +02:00
Fabio Manganiello ca25607262
Skip string and underscore normalization in black 2022-04-04 20:55:10 +02:00
Fabio Manganiello 53da19b638
Added entities engine support to WeMo switch plugin 2022-04-04 17:22:55 +02:00
Fabio Manganiello 7459f0115b
Added more pre-commit hooks 2022-04-04 17:22:54 +02:00
Fabio Manganiello 2c4c27855d
Added `.exception` action to logger plugin 2022-04-04 17:22:54 +02:00
Fabio Manganiello 9c25a131fa
get_bus() should return a default RedisBus() instance if the main bus is not registered 2022-04-04 17:22:54 +02:00
Fabio Manganiello 1b30bfc454
Added more pre-commit hooks 2022-04-04 17:21:47 +02:00
Fabio Manganiello 4ee7e4db29
Basic support for entities on the local db and implemented support for switch entities on the tplink plugin 2022-04-04 16:50:17 +02:00
Fabio Manganiello 486801653a
Added `.exception` action to logger plugin 2022-04-03 00:26:39 +02:00
Fabio Manganiello f7c594cc3f
get_bus() should return a default RedisBus() instance if the main bus is not registered 2022-04-02 22:47:23 +02:00
Fabio Manganiello b1491b8048
Better style for scrollbars 2022-03-30 17:42:09 +02:00
Fabio Manganiello 96a2d8bef0
Fixed size for nav icons with static images 2022-03-30 13:53:10 +02:00
Fabio Manganiello e261dcc27a
More UI fixes 2022-03-30 01:43:59 +02:00
Fabio Manganiello d0790aaba3
Better style for toggle switches 2022-03-29 23:45:57 +02:00
Fabio Manganiello bb28617cc9
Refactored slider and range-slider components 2022-03-29 14:36:17 +02:00
Fabio Manganiello e1e6da9307
Fixed icon size for img tags in nav bar 2022-03-28 16:00:18 +02:00
Fabio Manganiello f6ce0d7200
Fixed broken paddings after bulma removal 2022-03-28 13:13:31 +02:00
Fabio Manganiello ed5f7070a2
Removed bulma dependency from frontend
The UI is now much faster, the build process completes within one minute
(it used to take >15 minutes), and the size of the bundles has been
reduced by ~70%.
2022-03-28 12:54:36 +02:00
Fabio Manganiello 5ee47902f4
Refactored camera stream route 2022-03-28 12:44:04 +02:00
Fabio Manganiello 128b45686a
Updated Vue dependencies for the webapp 2022-03-28 01:19:21 +02:00
Fabio Manganiello 3d192a9733
Removed unused import 2022-03-27 22:01:25 +02:00
Fabio Manganiello 08acaad218
Merge pull request #284 from BlackLight/dependabot/npm_and_yarn/platypush/backend/http/webapp/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6 in /platypush/backend/http/webapp
2022-03-27 18:36:51 +02:00
Fabio Manganiello 385914c04a
Added missing docs for gpio events 2022-03-27 18:30:46 +02:00
dependabot[bot] b72c9a19ae
Bump minimist from 1.2.5 to 1.2.6 in /platypush/backend/http/webapp
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

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

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

Closes #212

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

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

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

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

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

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

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

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

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

Closes #201

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

Closes #203

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

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

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

Closes #202

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

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

- Fixed RST warnings in Slack plugin

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

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

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

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

Closes #115

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

Closes #198

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

Closes #196

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

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

See merge request platypush/platypush!2
2021-09-16 17:53:41 +02:00
Fabio Manganiello 3bfc5b83ef Moved to manifest files for describing plugins and backends and their dependencies 2021-09-16 17:53:40 +02:00
Fabio Manganiello ac0dd95bcc Bump version: 0.21.3 → 0.21.4 2021-08-24 23:01:45 +02:00
Fabio Manganiello 87b70716c1 Logic for supporting JWT tokens both as bytes and strings [closes #197] 2021-08-24 22:55:42 +02:00
Fabio Manganiello a8064d2add parse_magnet_uri can return either a metadata object or a dict depending on the libtorrent version 2021-08-05 20:23:54 +02:00
Fabio Manganiello d086da64f6 Bump version: 0.21.2 → 0.21.3 2021-07-28 01:09:27 +02:00
Fabio Manganiello 90ec108580 Added Slack integration 2021-07-28 01:09:09 +02:00
Fabio Manganiello 286bab7489 typo 2021-07-27 00:11:57 +02:00
Fabio Manganiello 0f37102ce4 Close Redis connection upon backend stop 2021-07-26 01:06:35 +02:00
Fabio Manganiello 8e2d4d0bce Make sure that the accept() in backend.tcp does not block the process 2021-07-25 11:33:48 +02:00
Fabio Manganiello 550fd3abe9 Don't fail on the Pushbullet close handler 2021-07-25 01:17:25 +02:00
Fabio Manganiello 2fc7327788 Missing import 2021-07-24 23:49:23 +02:00
Fabio Manganiello 371dd6da0a Added `sun` plugin [closes #194] 2021-07-22 01:02:15 +02:00
Fabio Manganiello 47228f2432 Bump version: 0.21.1 → 0.21.2 2021-07-20 01:36:59 +02:00
Fabio Manganiello 1483d602f8 Added music.spotify UI integration 2021-07-20 01:35:21 +02:00
Fabio Manganiello 00e744e93e Added type field metadata 2021-07-17 22:28:48 +02:00
Fabio Manganiello 35c4a30a63 Added music.spotify plugin and refactored MusicPlugin 2021-07-17 22:14:15 +02:00
Fabio Manganiello f250681a78 Refactored documentation and changed theme 2021-07-17 14:41:35 +02:00
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
3473 changed files with 236705 additions and 59226 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
**/.git
**/node_modules
**/__pycache__
**/venv
**/.mypy_cache
**/build

1175
.drone.yml Normal file

File diff suppressed because it is too large Load Diff

15
.gitignore vendored
View File

@ -3,17 +3,28 @@
*.pyc
__pycache__
build/
dist/
/dist/
*.egg-info/
package.sh
.pypirc
platypush/backend/http/static/resources/*
docs/build
.idea/
config
/config
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
.coverage
coverage.xml
Session.vim
/jsconfig.json
/package.json
/Dockerfile
/docs/source/wiki
/.skipci
dump.rdb

3
.gitmodules vendored
View File

@ -1,6 +1,3 @@
[submodule "docs/wiki"]
path = docs/wiki
url = https://github.com/BlackLight/platypush.wiki.git
[submodule "platypush/plugins/gpio/sensor/ir/mlx90640/lib"]
path = platypush/plugins/camera/ir/mlx90640/lib
url = https://github.com/pimoroni/mlx90640-library

33
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,33 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0
hooks:
# - id: trailing-whitespace
# - id: end-of-file-fixer
- id: check-yaml
- id: check-json
- id: check-xml
- id: check-symlinks
- id: check-added-large-files
args: ['--maxkb=1500']
- repo: https://github.com/Lucas-C/pre-commit-hooks-nodejs
rev: v1.1.2
hooks:
- id: markdown-toc
- repo: https://github.com/pycqa/flake8
rev: 4.0.1
hooks:
- id: flake8
additional_dependencies:
- flake8-bugbear
- flake8-comprehensions
- flake8-simplify
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black

View File

@ -1,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

749
CHANGELOG.md Normal file
View File

@ -0,0 +1,749 @@
# 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.
## [0.50.3] - 2023-07-22
### Added
- Added [XMPP plugin](https://git.platypush.tech/platypush/platypush/pulls/269).
## [0.50.2] - 2023-06-30
### Fixed
- A fix for the new `get_plugin` supported syntax. `get_plugin` now also
accepts a plugin class/type as an argument rather than a string, but the
previous logic didn't properly inspect the parent module.
## [0.50.0] - 2023-06-28
This should actually be a new big major release, but I'm holding on implementing
more features before a 1.0 tag.
### Added
- Migrated many integrations to the new [entities
framework](https://git.platypush.tech/platypush/platypush/pulls/230).
This is a very large change to the foundations of the platform. Many plugins
(and many others will follow) now publish and store their *entities* in a
standard format, so e.g. all the lights, switches, Bluetooth devices, cameras,
audio devices, media players and sensors are now supposed to expose the same
attributes and API regardless of the type of integration. This refactor also
includes a new default home panel, which includes all the entities detected by
the registered integrations. Many integrations have already been migrated to
the new framework. Among them (and many others are on their way):
- `arduino`
- `bluetooth`
- `light.hue`
- `linode`
- All the `sensor.*` plugins
- `serial`
- `smartthings`
- `switchbot`
- `system`
- `variable`
- `zigbee.mqtt`
- `zwave.mqtt`
- Added support for more complex filters on event hooks. Earlier filters could
only model key-value pair matches. The interface now supports more
sophisticated filters - among these, structured filters with partial matches
and relational filters. For example:
```python
from platypush.event.hook import hook
from platypush.message.event.sensor import SensorDataChangeEvent
@hook(SensorDataChangeEvent, data=1):
def hook_1(event):
"""
Triggered when event.data == 1
"""
@hook(SensorDataChangeEvent, data={'state': 1}):
def hook_2(event):
"""
Triggered when event.data['state'] == 1
"""
@hook(SensorDataChangeEvent, data={
'temperature': {'$gt': 25},
'humidity': {'$le': 15}
}):
def hook_3(event):
"""
Triggered when event.data['temperature'] > 25 and
event.data['humidity'] <= 15.
"""
```
The supported relational fields are the same supported by ElasticSearch - `$gt`
for greater than, `$lt` for lesser than, `$ge` for greater or equal, `$ne` for
not equal, etc.
This also means that the previous `SensorDataAboveThresholdEvent` and
`SensorDataBelowThresholdEvent` events are now deprecated, as the new hook API
makes it much easier and flexible to define custom threshold logic on any events
without having to pre-define thresholds in each backend's configuration.
- Added a Progressive WebApp (PWA) framework to the Vue webapp. It is now
possible to install Platypush as a stand-alone webapp directly from the web
panel if the panel is served over HTTPS. For now this only improves the user
experience, performance and it provides a more native-like experience on
mobile, but in the future the PWA background worker could be used to e.g.
deliver asynchronous events and notifications to the clients without keeping
the browser open.
- Added support for application database automatic migrations after an update by
using Alembic.
### Changed
- Tornado is now used as an HTTP engine by `backend.http`, instead of using
bare bone Flask with its inefficient Werkzeug server and an optional uwsgi
that required extra configuration (and an extra external service).
- All the streaming endpoints have been rewritten and adapted to work with
Tornado. This greatly improves performance, stability and ease of
configuration, while remaining back-compatible with the previous URL formats.
As a side note, all the streaming endpoints are now using Redis to stream
information across multiple worker processes, so make sure that you have a
version of Redis that supports pub/sub (most of the recent ones should do).
- The `bluetooth` plugin has been completely rewritten, merged with the (now
deprecated) `backend.bluetooth`. The previously separated low-energy/legacy
integrations have now been merged too. It now supports much more than passive
scanning, as it can recognize the information published by most of the device,
supports both legacy and low-energy connection/disconnection actions, and it
can detect most of the device classes, services and manufacturers. It also
supports parsing some standard features (like battery level, temperature,
state etc.) if they are published according to some convention supported by
*TheengsGateway*. The `switchbot.bluetooth` integration has now also been
merged into `bluetooth`.
- The `sound` plugin has been completely rewritten. While it should still be
largely back-compatible with the previous implementation, you should probably
go and take a look at the new documentation to get a grasp of the new
features.
- The `camera.ffmpeg` plugin has received a big rewrite that has improved its
stability and robustness against several types of cameras. It is now the
recommended way of interfacing with general-purpose cameras, even for
PiCameras - the `camera.pi` integration is now largely deprecated, as the old
PiCamera API is deprecated as well, and `camera.ffmpeg` should now work out of
the box with a PiCamera if a reasonably recent version of ffmpeg is installed.
- `backend.websocket` has been **removed** and replaced by Tornado asynchronous
websocket URLs registered on the HTTP backend. The two new routes that
replace the websocket backend are:
- `/ws/events`: subscribe to this websocket to receive any asynchronous
events forwarded by the application.
- `/ws/requests`: you can send request messages to this endpoints, and the
responses will be received asynchronously on the same channel.
- The `inspect` plugin has been largely improved.
- Its performance is now much snappier, as it scans for all the available
integrations by searching for manifest files instead of scanning each
single source file. Documentation about specific plugins and actions is
fetched lazily when requested by the user.
- It now also caches results by looking at the last modified date of the
source file, so it won't have to re-scan source files that haven't been
modified.
- Its detection of RST constructs has also been improved, so most of the code
blocks, schemas, return types and references to other objects are now
rendered in the plugin UI.
- Added `variable.delete` action. The existing `variable.unset` action will now
only set a variable to null if it exists, while `variable.delete` will
actually remove it from the database.
- `backend.sensor.distance` and `gpio.sensor.distance` have been removed and
migrated instead to a new `sensor.hcsr04` plugin, since the existing logic
actually only applies to HC-SR04-like distance sensors.
- `backend.sensor.dht` and `gpio.sensor.dht` have been removed and
migrated to a new `sensor.dht` plugin.
- `backend.sensor.accelerometer` and `gpio.sensor.accelerometer` have been
removed and migrated to a new `sensor.lis3dh` plugin, since the existing
accelerometer logic only works with these sensors.
- `backend.sensor.motion.pwm3901` and `gpio.sensor.motion.pwm3901` have been
removed and migrated to a new `sensor.pwm3901` plugin.
accelerometer logic only works with these sensors.
- `backend.sensor.envirophat` and `gpio.sensor.envirophat` have been removed and
migrated to a new `sensor.envirophat` plugin.
- `backend.sensor.ltr559` and `gpio.sensor.ltr559` have been removed and
migrated to a new `sensor.ltr559` plugin.
- `backend.sensor.bme280` and `gpio.sensor.bme280` have been removed and
migrated to a new `sensor.bme280` plugin.
- `backend.sensor.distance.vl53l1x` and `gpio.sensor.distance.vl53l1x` have been
removed and migrated to a new `sensor.vl53l1x` plugin.
- `backend.serial` has been removed and merged into the `serial` plugin.
- `backend.switch.wemo` has been removed and merged into the `switch.wemo`
plugin.
- `backend.switch.tplink` has been removed and merged into the `switch.tplink`
plugin.
- `backend.zigbee.mqtt` has been removed and merged into the `zigbee.mqtt`
plugin.
- `backend.zwave.mqtt` has been removed and merged into the `zwave.mqtt` plugin.
### Fixed
- Notable performance improvements for the UI (like -50% on the load time and
memory usage in some cases). Recursive/reflective Vue components now use
`shallowRef`, so complex UI models won't have to be fully loaded at page
start.
- Fixed compatibility with SQLAlchemy 2.
- Migrated the `clipboard` integration from `pyperclip` to `pyclip` (see
[#240](https://git.platypush.tech/platypush/platypush/issues/240)).
`pyperclip` is unmaintained and largely broken, and `pyclip` seems to be a
viable drop-in alternative.
- Better implementation of the UI modals - added close buttons and trigger
closure when Esc is pressed.
### Removed
- Removed SSL configuration from `backend.http`. Configuring SSL on
Flask+Tornado is messy, and it won't end up with a good user experience.
Instead, you should consider using a reverse proxy (e.g. nginx or Apache) if
you want to make the Platypush web interface available over HTTPS. A sample
nginx configuration has been added under `examples/nginx`. Note that running
the web panel over HTTPS is a requirement if you want to leverage the PWA
features, as a PWA can only be served over HTTPS.
- Removed the Bluetooth file server integration. It is still possible to send
files over Bluetooth (the feature has now been merged into the `bluetooth`
plugin, under `bluetooth.send_file`), but all the server features rely on
features of PyOBEX that are now very broken on recent versions of Python (the
project itself hasn't been updated in years).
- Removed or deprecated all the `backend.sensor.*` backends. Their logic has now
been merged into their associated plugins, and the plugins will have the
ability to run in the background too.
- Removed `backend.sensor.battery`. It has now been merged into the `system`
plugin.
- Removed `gpio.sensor` plugin. It was never really fully implemented, and it
was probably impossible to implement with an interface that could work with
any sensor-like device connected over GPIO.
## [0.24.5] - 2023-02-22
### Added
- Added `hid` plugin to support discoverability and data interaction with
generic HID devices - like Bluetooth/USB peripherals, joysticks, dongles and
any other type of devices that supports the HID interface.
- Added `timeout` parameter to `websocket.send` to prevent messages sent on a
non-responsive websocket from getting the websocket loop stuck
### Fixed
- Running the Zeroconf registration logic in another thread in `backend.http`,
so failures in the Zeroconf logic don't affect the startup of the web server.
- (Temporarily) introduced `sqlalchemy < 2.0.0` as a requirement - a PR with a
migration to the new stable version of SQLAlchemy is in TODO.
## [0.24.4] - 2022-12-20
### Fixed
- Fixed cronjobs potentially being triggered even if it wasn't their slot in
case of clock synchronization events.
## [0.24.3] - 2022-12-17
### Added
- Added `[-v|--verbose]` command-line option to override the default logging
configuration and enable debug logging.
- Added `--version` command-line option to print the current version and exit.
- [[#236](https://git.platypush.tech/platypush/platypush/issues/236)] Added
support for `author` and `tags` attributes on feed entries.
## [0.24.2] - 2022-12-10
### Fixed
- The `main.db` configuration should use the configured `workdir` when no
values are specified.
- The `zwave.mqtt` is now compatible both with older (i.e. `zwavejs2mqtt`) and
newer (i.e. `ZwaveJS`) versions of the backend.
## [0.24.1] - 2022-12-08
### Fixed
- Removed a parenthesized context manager that broke compatibility with
Python &lt; 3.10.
## [0.24.0] - 2022-11-22
### Added
- Added [Wallabag integration](https://git.platypush.tech/platypush/platypush/issues/224).
- Added [Mimic3 TTS integration](https://git.platypush.tech/platypush/platypush/issues/226).
- Added `qos` attribute to `mqtt.publish` and all the plugins derived from `mqtt`.
### Changed
- Replaced PyJWT dependency with the Python-native `rsa` package. This will
make the installation much lighter, compatible with more systems and less
dependent on the platform-specific libraries required by `cryptography`.
> **NOTE**: This is a breaking change for those who use the `backend.http` API
> with JWT tokens. The new logic encrypts and encodes the payload in a
> different format, therefore previously generated tokens are no longer
> compatible.
## [0.23.6] - 2022-09-19
### Fixed
- Fixed album_id and list of tracks on `music.tidal.get_album`.
## [0.23.5] - 2022-09-18
### Added
- Added support for web hooks returning their hook method responses back to the
HTTP client.
- Added [Tidal integration](https://git.platypush.tech/platypush/platypush/pulls/223)
- Added support for [OPML
subscriptions](https://git.platypush.tech/platypush/platypush/pulls/220) to
the `rss` plugin.
- Better support for bulk database operations on the `db` plugin.
### Fixed
- Now supporting YAML sections with empty configurations.
## [0.23.4] - 2022-08-28
### Added
- Added `matrix` integration
([issue](https://git.platypush.tech/platypush/platypush/issues/2),
[PR](https://git.platypush.tech/platypush/platypush/pulls/217)).
### Changed
- Removed `clipboard` backend. Enabling the `clipboard` plugin will also enable
clipboard monitoring, with no need for an additional backend.
## [0.23.3] - 2022-06-01
### Added
- Added `ntfy` integration (see #219).
- Support for a default `config.yaml` if one isn't specified in the default
locations.
### Changed
- The HTTP server dependencies are now marked as required, since the default
`config.yaml` will have the HTTP backend enabled by default in order to allow
the creation of a first user.
- Updated Vue.js frontend dependencies to the latest version.
- Removed bulma from the frontend dependencies, making the frontend much
lighter and loading times much faster.
- Other UI improvements.
### Fixed
- More reliable cronjobs in case of DST change or any clock changes in general
(see #217).
- Fixed `--redis-queue` argument.
## [0.23.2] - 2022-03-27
### Added
- Support for asynchronous events over GPIO PINs. It is now possible to specify
a list of `monitored_pins` in the [`gpio`
plugin](https://git.platypush.tech/platypush/platypush/-/blob/master/platypush/plugins/gpio/__init__.py)
configuration. A change in the value on those GPIO PINs (caused by e.g. a
button, a binary sensor or a probe) will trigger a
`platypush.message.event.gpio.GPIOEvent` that you can use in your automation
scripts.
- Simplified script API to interact with platform variables
(closes [#206](https://git.platypush.tech/platypush/platypush/-/issues/206)).
You can now read and write stored variables in your Platypush scripts through
a much more intuitive interface compared to explicitly using the `variable`
plugin explicitly:
```python
from platypush.context import Variable
# ...
my_var = Variable.get('my_var')
my_var = int(my_var) + 1
Variable.set(my_var=my_var)
```
## [0.23.0] - 2022-03-01
### Added
- Added [Jellyfin integration](https://git.platypush.tech/platypush/platypush/-/issues/208).
### Fixed
- Merged several PRs from `dependabot`.
- Fixed management of the `CN` field in the `calendar.ical` plugin.
## [0.22.10] - 2022-02-07
### Added
- Refactored the `dbus` integration. The plugin and backend have been merged into a
single plugin component, and the ability to subscribe to custom signals has been
added.
### Fixed
- Proper support for empty payloads on the integrations that trigger a `SensorDataChangeEvent`.
- Fixed possible infinite recursion on the Pushbullet integration in case of errors where the
error and close handlers keep calling each other in a loop.
## [0.22.9] - 2022-01-06
### Added
- Added `rss` integration (replaces the cumbersome and deprecated `backend.http.poll`).
### Fixed
- Fixed timezone handling in calendar integrations.
- Fixed handling of ignored directories in the `file.monitor` backend.
## [0.22.8] - 2021-12-13
### Added
- Added support for audio tracks in Plex integration.
### Changed
- Web server uWSGI wrapper changed from `uwsgi` to `gunicorn`.
### Fixed
- Fixed client ID assignment logic in MQTT backends to prevent client ID clashes and reconnections
(closes #205).
- Updated LTR559 integration to be compatible with the new API.
- Updated Chromecast integration to be compatible with `pychromecast >= 10`.
- Better handling of media errors.
## [0.22.6] - 2021-11-27
### Added
- Added support for converting webpages to markdown in `http.webpage.simplify`
even if no `outfile` is specified.
### Fixed
- Improved robustness of the ICal calendar parser in case some fields (e.g. `*status`)
are not defined.
## [0.22.5] - 2021-11-15
### Added
- Added `mastodon` plugin.
- Added `chat.irc` plugin.
- Added `mailgun` plugin.
### Fixed
- Fixed `switchbot.status` method in case of virtual devices.
- Fixed `platypush[alexa]` optional package installation.
## [0.22.4] - 2021-10-19
### Added
- Support for IR virtual devices in Switchbot plugin.
- Added [`google.maps.get_travel_time`](https://docs.platypush.tech/platypush/plugins/google.maps.html#platypush.plugins.google.maps.GoogleMapsPlugin.get_travel_time)
method (closes #115).
- Support for custom YouTube video/audio formats on media plugins.
### Fixed
- Responses for requests received over an MQTT backend are now delivered to the right topic
(`<device_base_topic>/responses/<msg_id>`).
- Various fixes on media plugins.
## [0.22.3] - 2021-10-01
### Added
- `gotify` integration (see #198).
## [0.22.2] - 2021-09-25
### Added
- `ngrok` integration (see #196).
## [0.22.1] - 2021-09-22
### Fixed
- `zigbee.mqtt` backend now no longer requires the MQTT backend/plugin to be enabled.
- Fixed bug on empty popcorn API responses.
### Changed
- Created CI Gitlab pipeline to replace the Platypush event-based pre-existing pipeline.
### Removed
- Removed docs references to removed/abstract integrations.
## [0.22.0] - 2021-09-16
### Changed
- Platypush now uses manifest files to describe plugins and backends. Each extension is now
expected to provide a `manifest.yaml` file in its folder, reporting its package name, pip
dependencies, required system packages and optional extra installation commands.
- Refactored `platyvenv`, `platydock`, documentation generation and plugin management engine.
They are now both faster and more robust, since they can rely on the manifest definition to
operate instead of pydoc strings conventions or `config.yaml` conventions.
- `platyvenv start` now starts the environment process synchronously and it prints
stdout/stderr instead of redirecting it to the logs dir (previous behaviour:
`platyvenv start` used to start the process asynchronously and the logs were stored
to `~/.local/share/platypush/venv/<env>/logs/<stdout|stderr>.log`).
### Removed
- Removed `Homeseer` integration - it was based on a Python integration that has now been
pulled out of PyPI and GitHub. A new integration may come in the future if there is enough
demand for it.
## [0.21.4] - 2021-08-24
### Fixed
- Fixed JWT token generation, since python-jwt >= 2.0 always returns strings (not bytes) upon `jwt.encode`.
## [0.21.3] - 2021-07-28
### Added
- Added `sun` plugin for sunrise/sunset events.
- Added `slack` integration.
## [0.21.2] - 2021-07-20
### Added
- Added `music.spotify` backend to emulate a Spotify Connect receiver through Platypush.
- Added `music.spotify` plugin.
- Added `music.spotify` UI integration.
## [0.21.1] - 2021-06-22
### Added
- Added `switchbot` plugin to interact with Switchbot devices over the cloud API instead of
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/wiki/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.

35
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,35 @@
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 `manifest.json` - refer to the Wiki (how to write
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
and
[backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
for examples on how to write an extension manifest file.

View File

@ -1,22 +0,0 @@
# Sample Dockerfile. Use platydock -c /path/to/custom/config.yamlr
# to generate your custom Dockerfile.
FROM python:alpine3.7
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN apk add --update --no-cache --virtual build-base \
&& apk add --update --no-cache libffi-dev \
&& apk add --update --no-cache zlib-dev \
&& apk add --update --no-cache libjpeg-turbo-dev \
&& pip install -r requirements.txt \
&& apk del build-base \
&& apk del libffi-dev \
&& apk del libjpeg-turbo-dev \
&& apk del zlib-dev
RUN cd /app && python setup.py build install
CMD python -m platypush

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,6 @@
recursive-include platypush/backend/http/static *
recursive-include platypush/backend/http/templates *
recursive-include platypush/backend/http/webapp/dist *
recursive-include platypush/install *
include platypush/plugins/http/webpage/mercury-parser.js
include platypush/config/*.yaml
global-include manifest.json
global-include components.json.gz

864
README.md
View File

@ -1,68 +1,832 @@
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-cd.platypush.tech/api/badges/platypush/platypush/status.svg)](https://ci-cd.platypush.tech/platypush/platypush)
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/src/branch/master/LICENSE.txt)
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/commits/branch/master)
[![Join chat on Matrix](https://img.shields.io/matrix/:platypush?server_fqdn=matrix.platypush.tech)](https://matrix.to/#/#platypush:matrix.platypush.tech)
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/src/branch/master/CONTRIBUTING.md)
Advised read: [**Getting started with Platypush**](https://medium.com/@automationguru/automate-your-house-your-life-and-everything-else-around-with-platypush-dba1cd13e3f6) (Medium article).
[Reddit channel](https://www.reddit.com/r/platypush)
<!-- toc -->
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.
- [Introduction](#introduction)
+ [What it can do](#what-it-can-do)
- [Installation](#installation)
* [Prerequisites](#prerequisites)
+ [Docker installation](#docker-installation)
+ [Use an external service](#use-an-external-service)
+ [Manual installation](#manual-installation)
* [Install through `pip`](#install-through-pip)
* [Install through a system package manager](#install-through-a-system-package-manager)
* [Install from sources](#install-from-sources)
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
+ [Install via `extras` name](#install-via-extras-name)
+ [Install via `manifest.json`](#install-via-manifestjson)
+ [Check the instructions reported in the documentation](#check-the-instructions-reported-in-the-documentation)
* [Virtual environment installation](#virtual-environment-installation)
* [Docker installation](#docker-installation-1)
- [Architecture](#architecture)
* [Plugins](#plugins)
* [Actions](#actions)
* [Backends](#backends)
* [Events](#events)
* [Hooks](#hooks)
+ [More complex filters](#more-complex-filters)
* [Procedures](#procedures)
* [Cronjobs](#cronjobs)
* [Entities](#entities)
* [The web interface](#the-web-interface)
+ [The main web panel](#the-main-web-panel)
+ [The execution panel](#the-execution-panel)
+ [Other web panels](#other-web-panels)
+ [Dashboards](#dashboards)
* [Running in production mode](#running-in-production-mode)
+ [PWA support](#pwa-support)
- [Mobile app](#mobile-app)
- [Tests](#tests)
- [Useful links](#useful-links)
- [Funding](#funding)
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.
<!-- tocstop -->
## Introduction
Platypush is a general-purpose extensible platform for automation 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) and [Home
Assistant](https://www.home-assistant.io/) to provide an environment where the
user can easily connect things together.
It's built with compatibility and flexibility in mind, and it can easily run on
any device that can run a Python interpreter - from a Raspberry Pi zero, to an
old smartphone, to a beefy server.
#### What it can do
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
- 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))
- [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://docs.platypush.tech))
Imagine the ability of executing all the actions above through messages delivered through:
## Installation
- 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))
### Prerequisites
Imagine the ability of building custom event hooks to automatically trigger any actions:
Platypush uses [Redis](https://redis.io/) to dispatch requests, responses,
events and custom messages across several processes and integrations.
- 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)
#### Docker installation
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.
You can run Redis on the fly on your local machine using a Docker image:
To get started:
```bash
# Expose a Redis server on port 6379 (default)
docker run --rm -p 6379:6379 --name redis redis
```
- [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
#### Use an external service
You can let Platypush use an external Redis service, if you wish to avoid
running one on the same machine.
In such scenario, simply start the application by passing custom values for
`--redis-host` and `--redis-port`, or configure these values in its
configuration file:
```yaml
redis:
host: some-ip
port: some-port
```
If you wish to run multiple instances that use the same Redis server, you may
also want to customize the name of the default queue that they use
(`--redis-queue` command-line option) in order to avoid conflicts.
#### Manual installation
Unless you are running Platypush in a Docker container, or you are running
Redis in a Docker container, or you want to use a remote Redis service, the
Redis server should be installed on the same machine where Platypush runs:
```bash
# On Debian-based distributions
sudo apt install redis-server
# On Arch-based distributions
# The hiredis package is also advised
sudo pacman -S redis
# On MacOS
brew install redis
```
Once Redis is installed, you have two options:
1. Run it a separate service. This depends on your operating system and
supervisor/service controller. For example, on systemd:
```bash
# Enable and start the service
sudo systemctl enable redis
sudo systemctl start redis
```
2. Let Platypush run and control the Redis service. This is a good option if
you want Platypush to run its own service, separate from any other one
running on the same machine, and terminate it as soon as the application
ends. In this case, simply launch the application with the `--start-redis`
option (and optionally `--redis-port <any-num>` to customize the listen
port).
### Install through `pip`
```bash
[sudo] pip install platypush
```
### Install through a system package manager
Note: currently only Arch Linux and derived distributions are supported.
You can either install the
[`platypush`](https://aur.archlinux.org/packages/platypush) package (for the
latest stable version) or the
[`platypush-git`](https://aur.archlinux.org/packages/platypush-git) package
(for the latest git version) through your favourite AUR package manager. For
example, using `yay`:
```bash
yay platypush
# Or
yay platypush-git
```
The Arch Linux packages on AUR are automatically updated upon new git commits
or tags.
### Install from sources
```shell
git clone https://git.platypush.tech/platypush/platypush.git
cd platypush
[sudo] pip install .
```
### Installing the dependencies for your extensions
After installing the base platform, you may want to check the dependencies and
configuration required by the extensions that you wish to use. There are a few
ways to check the dependencies required by an extension:
#### Install via `extras` name
You can install extra dependencies via pip extras:
```shell
pip install 'platypush[plugin1,plugin2,...]'
```
For example:
```shell
pip install 'platypush[light.hue,music.mpd,rss]'
```
Will install Platypush with the dependencies for the `light.hue`, `music.mpd`
and `rss` plugins.
#### Install via `manifest.json`
All the plugins and backends have a `manifest.json` file in their source folder.
Any extra dependencies are listed there
If you followed the `extras` or `manifest.json` way to discover the
dependencies, then you can install them in two 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 instructions reported in the documentation
If you follow this route then simply run the commands listed in the
[plugin/backend documentation](https://docs.platypush.tech) to get the
dependencies installed.
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
```
See `platypush --help` for a full list of options.
It's advised to run it as a systemd service though - simply copy the provided
[`.service`
file](https://git.platypush.tech/platypush/platypush/src/branch/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
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
```
[Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-virtual-environment)
### Docker installation
You can also install Platypush in a container - the application provides a
script named `platydock` that automatically creates a container instance from a
`config.yaml`:
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
```
Note that both the virtual environment and Docker container option offer the
possibility to include extra YAML configuration files in the main `config.yaml`
through the `include` directive (as long as they are in the same folder as the
main `config.yaml`), as well as external Python scripts in a `scripts`
directory in the same folder as the `config.yaml`.
[Wiki instructions](https://git.platypush.tech/platypush/platypush/wiki/Run-platypush-in-a-container)
## Architecture
The architecture of Platypush consists of a few simple pieces, orchestrated by
a configuration file stored by default under
[`~/.config/platypush/config.yaml`](https://git.platypush.tech/platypush/platypush/src/branch/master/examples/conf/config.yaml):
### Plugins
[Full list](https://docs.platypush.tech/en/latest/plugins.html)
Plugins are integrations that do things - like [modify
files](https://docs.platypush.tech/en/latest/platypush/plugins/file.html),
[train and evaluate machine learning
models](https://docs.platypush.tech/en/latest/platypush/plugins/tensorflow.html),
[control
cameras](https://docs.platypush.tech/en/latest/platypush/plugins/camera.pi.html),
[read
sensors](https://docs.platypush.tech/en/latest/platypush/plugins/gpio.sensor.dht.html),
[parse a web
page](https://docs.platypush.tech/en/latest/platypush/plugins/http.webpage.html),
[control
lights](https://docs.platypush.tech/en/latest/platypush/plugins/light.hue.html),
[send
emails](https://docs.platypush.tech/en/latest/platypush/plugins/mail.smtp.html),
[control
Chromecasts](https://docs.platypush.tech/en/latest/platypush/plugins/media.chromecast.html),
[run voice
queries](https://docs.platypush.tech/en/latest/platypush/plugins/assistant.google.html),
[handle torrent
transfers](https://docs.platypush.tech/en/latest/platypush/plugins/torrent.html)
or control
[Zigbee](https://docs.platypush.tech/en/latest/platypush/plugins/zigbee.mqtt.html)
or [Z-Wave](https://docs.platypush.tech/en/latest/platypush/plugins/zwave.html)
devices.
The configuration of a plugin matches one-on-one that of its documented class
constructor, so it's very straightforward to write a configuration for a plugin
by reading its documentation:
```yaml
light.hue:
# Groups that will be controlled by default
groups:
- Living Room
- Hall
```
### 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
[Full list](https://docs.platypush.tech/en/latest/backends.html)
They are background services that 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).
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
[Full list](https://docs.platypush.tech/en/latest/events.html)
When a certain event occurs (e.g. a JSON request is received, or a [Bluetooth
device is
connected](https://docs.platypush.tech/en/latest/platypush/events/bluetooth.html#platypush.message.event.bluetooth.BluetoothDeviceConnectedEvent),
or a [Flic button is
pressed](https://docs.platypush.tech/en/latest/platypush/events/button.flic.html#platypush.message.event.button.flic.FlicButtonEvent),
or some [speech is detected on the voice assistant
service](https://docs.platypush.tech/en/latest/platypush/events/assistant.html#platypush.message.event.assistant.SpeechRecognizedEvent),
or an [RSS feed has new
items](https://docs.platypush.tech/en/latest/platypush/events/http.rss.html#platypush.message.event.http.rss.NewFeedEvent),
or a [new email is
received](https://docs.platypush.tech/en/latest/platypush/events/mail.html#platypush.message.event.mail.MailReceivedEvent),
or a [new track is
played](https://docs.platypush.tech/en/latest/platypush/events/music.html#platypush.message.event.music.NewPlayingTrackEvent),
or an [NFC tag is
detected](https://docs.platypush.tech/en/latest/platypush/events/nfc.html#platypush.message.event.nfc.NFCTagDetectedEvent),
or [new sensor data is
available](https://docs.platypush.tech/en/latest/platypush/events/sensor.html#platypush.message.event.sensor.SensorDataChangeEvent),
or [a value of a Zigbee device
changes](https://docs.platypush.tech/en/latest/platypush/events/zigbee.mqtt.html#platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent),
etc.), the associated backend will trigger an
[event](https://docs.platypush.tech/en/latest/events.html).
### 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/src/branch/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/src/branch/master/examples/conf/hook.py):
```python
from platypush import run, when
from platypush.message.event.assistant import SpeechRecognizedEvent
@when(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'])
```
#### More complex filters
Your event hooks can include more complex filters too. Structured filters
against partial event arguments are also possible, and relational operators are
supported as well. For example:
```python
from platypush import when
from platypush.message.event.sensor import SensorDataChangeEvent
@when(SensorDataChangeEvent, data=1):
def hook_1(event):
"""
Triggered when event.data == 1
"""
@when(SensorDataChangeEvent, data={'state': 1}):
def hook_2(event):
"""
Triggered when event.data['state'] == 1
"""
@when(SensorDataChangeEvent, data={
'temperature': {'$gt': 25},
'humidity': {'$le': 15}
}):
def hook_3(event):
"""
Triggered when event.data['temperature'] > 25 and
event.data['humidity'] <= 15.
"""
```
The supported relational fields are the same supported by ElasticSearch - `$gt`
for greater than, `$lt` for lesser than, `$ge` for greater or equal, `$ne` for
not equal, etc.
### 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`.
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
```
### Entities
Entities are a fundamental building block of Platypush. Most of the
integrations will store their state or connected devices in the form of
entities - e.g. the sensors detected by the Z-Wave/Zigbee/Bluetooth
integration, or the lights connected to a Hue bridge, or your cloud nodes, or
your custom Arduino/ESP machinery, and so on.
Entities provide a consistent interface to interact with your integrations
regardless of their type and the plugin that handles them. For instance, all
temperature sensors will expose the same interface, regardless if they are
Bluetooth or Zigbee sensors, and all the media plugins will expose the same
interface, regardless if they manage Chromecasts, Kodi, Plex, Jellyfin or a
local VLC player.
Once you enable the HTTP backend and a few integrations that export entities
and register a user, you can query the detected entities via:
```shell
curl -XPOST -H 'Content-Type: application/json' \
-H "Authorization: Bearer $YOUR_TOKEN" \
-d '{"type":"request", "action":"entities.get"}' \
http://localhost:8008/execute
```
All the entities expose the same interface and can be manipulated through the
same API. Also, when an entity is updated it always emits an
[`EntityUpdateEvent`](https://docs.platypush.tech/platypush/events/entities.html#platypush.message.event.entities.EntityUpdateEvent),
so you can easily create hooks that react to these events and act on multiple
types of entities.
### 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 main web panel
This is the default panel available at `http://<host>:<port>` after
registration/login. It provides all the entities published by the integrations
under one view, with custom grouping and filtering options.
![Screenshot of the application main
panel, showing the Bluetooth, Serial, SmartThings and System integrations](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/main-panel-screenshot-1.png)
![Screenshot of the application main
panel, showing the Philips Hue, Zigbee, SmartThings and some sensors integrations](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/main-panel-screenshot-2.png)
#### The execution panel
The web interface provides an `execute` panel as well. You can use this panel to
interactively inspect the available integrations and their actions, together
with their documentation and parameters, run requests directly from the web
interface, and inspect the JSON responses.
![Screenshot of the execution panel, showing the actions autocomplete
form](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/execute-panel-screenshot-1.png)
![Screenshot of the execution panel, showing an action's automatically generated
documentation and its parsed attributes](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/execute-panel-screenshot-2.png)
#### Other web panels
Several integrations add their own feature-rich panels to the web view, turning
Platypush into a gateway to all of your services - from Zigbee sensors, to media
players and services, to your music cloud, and more.
![Screenshot of the media panel, showing search results from multiple sources
and several supported types of streaming services](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/media-panel-screenshot-1.png)
![Screenshot of one of the music
panels](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/music-panel-screenshot-1.png)
![Screenshot of the Snapcast panel, which can be used to synchronize your music
streams across multiple
devices](https://platypush-static.s3.nl-ams.scw.cloud/screenshots/snapcast-panel-screenshot-1.png)
#### Dashboards
The web service also provides means for the user to create [custom
dashboards](https://git.platypush.tech/platypush/platypush/src/branch/master/examples/conf/dashboard.xml)
that can be used to show information from multiple sources on a large screen.
![Screenshot of a Platypush dashboard, showing a calendar widget, the current
music state, weather, news from the RSS integration, and a carousel of custom
pictures.](https://blog.platypush.tech/img/dashboard-1.png)
### Running in production mode
If you want to access your Platypush web panel outside your home network, it may
be a good idea to use an nginx/Apache reverse proxy with a valid SSL certificate
(e.g. managed by certbot). A [sample an nginx
configuration](https://git.platypush.tech/platypush/platypush/src/branch/master/examples/nginx/nginx.sample.conf)
is provided in the repository.
#### PWA support
Note that having the web application served over SSL is a requirement for the
PWA (progressive web app) to work. The Platypush PWA allows you to install a
Platypush native-like client on your mobile devices if you don't want to use the
full Android app.
## 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.
## Useful links
- Recommended read: [**Getting started with Platypush**](https://blog.platypush.tech/article/Ultimate-self-hosted-automation-with-Platypush).
- The [blog](https://blog.platypush.tech) is a good place to get more insights
and inspiration on what you can build.
- The [wiki](https://git.platypush.tech/platypush/platypush/wiki) also
contains many resources on getting started.
- Extensive documentation for all the available integrations and messages [is
available](https://docs.platypush.tech/).
- If you have issues/feature requests/enhancements please [create an
issue](https://git.platypush.tech/platypush/platypush/issues).
- A [Matrix instance](https://matrix.to/#/#platypush:matrix.platypush.tech) is
available if you are looking for interactive support.
- An IRC channel is also available at `#platypush@irc.platypush.tech:6697` (SSL
only).
- A [Lemmy instance](https://lemmy.platypush.tech/c/platypush) is available for
general questions.
---
## 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.

BIN
assets/logo-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
assets/logo-256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
assets/logo-64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -1,9 +0,0 @@
#!python3
from platypush import main
if __name__ == '__main__':
main()
# vim:sw=4:ts=4:et:

View File

@ -1,259 +0,0 @@
#!/bin/bash
##############################################################################
# This script allows you to easily manage Platypush instances through Python #
# virtual environment. You can build environments from a config.yaml file #
# and automatically managed the required dependencies, as well as start, #
# stop and remove them #
# #
# @author: Fabio Manganiello <blacklight86@gmail.com> #
# @licence: MIT #
##############################################################################
workdir=$HOME/.local/share/platypush/venv
function build {
cfgfile=
while getopts ':c:' opt; do
case ${opt} in
c)
cfgfile=$OPTARG;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1;;
:)
echo "Option -$OPTARG requires the path to a Platypush configuration file" >&2
exit 1;;
esac
done
if [[ -z "$cfgfile" ]]; then
echo "Usage: $0 build -c <path-to-platypush-config-file>" >&2
exit 1
fi
echo "Parsing configuration file"
deps=()
includes=()
while read -r line; do
echo ${line} | egrep '``pip install .+?``' > /dev/null 2>&1
if (( $? != 0 )); then
continue
fi
dep=$(echo ${line} | sed -r -e 's/.*``pip install (.+?)``.*/\1/')
deps+=("$dep")
done <<< $(python <<EOF
from platypush.config import Config
from platypush.context import get_plugin, get_backend, register_backends
Config.init('`realpath ${cfgfile}`')
register_backends()
backend_config = Config.get_backends()
for name in Config.get_backends().keys():
backend = get_backend(name)
print(backend.__doc__)
for name in Config.get_plugins().keys():
try:
plugin = get_plugin(name)
print(plugin.__doc__)
except:
pass
EOF
)
while read -r include; do
includes+=(${include})
done <<< $(python <<EOF
from platypush.config import Config
from platypush.context import get_plugin, get_backend, register_backends
Config.init('`realpath ${cfgfile}`')
for include in Config._included_files:
print(include)
EOF
)
device_id=$(python <<EOF
from platypush.config import Config
Config.init('`realpath ${cfgfile}`')
print(Config.get('device_id'))
EOF
)
envdir=${workdir}/${device_id}
etcdir=${envdir}/etc/platypush
echo "Preparing virtual environment for device $device_id"
mkdir -p "$envdir"
mkdir -p "$etcdir"
srcdir=`dirname "$cfgfile"`
for ((i=0; $i < ${#includes[@]}; i++)); do
incdir=`dirname "${includes[$i]}"`
incdir=`realpath --relative-to="$srcdir" "$incdir"`
destdir="$etcdir/$incdir"
mkdir -p "$destdir"
cp "${includes[$i]}" "$destdir"
done
cp "$cfgfile" "$etcdir/config.yaml"
cfgfile=${etcdir}/config.yaml
python3 -m venv ${envdir}
cd ${envdir}
source ${envdir}/bin/activate
echo "Installing required dependencies"
for ((i=0; $i < ${#deps[@]}; i++)); do
echo ${deps[$i]}
done | sort -u | while read dep; do
pip install ${dep}
done
pip install --upgrade git+https://github.com/BlackLight/platypush.git
echo "Platypush virtual environment prepared under $envdir"
}
function start {
if [[ -z "$1" ]]; then
echo "Usage: $0 start <env-name>" >&2
exit 1
fi
env=$1
envdir=${workdir}/${env}
logsdir=${envdir}/var/log/platypush
rundir=${envdir}/var/run
pidfile=${rundir}/platypush.pid
cfgfile=${envdir}/etc/platypush/config.yaml
if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2
exit 1
fi
mkdir -p ${logsdir}
mkdir -p ${rundir}
if [[ -f "$pidfile" ]]; then
pid=`cat "$pidfile"`
if ps -p ${pid} | grep platypush; then
echo "Another instance (PID $pid) is running, please stop that instance first"
exit 1
fi
echo "A PID file was found but the process doesn't seem to be running, starting anyway"
rm -f "$pidfile"
fi
python3 -m venv ${envdir}
cd ${envdir}
source bin/activate
bin/platypush -c "$cfgfile" -P "$pidfile" > ${logsdir}/stdout.log 2> ${logsdir}/stderr.log &
start_time=`date +'%s'`
timeout=30
while :; do
[[ -f "$pidfile" ]] && break
now=`date +'%s'`
let elapsed=$now-$start_time
if (( ${elapsed} >= ${timeout} )); then
echo "Platypush instance '$env' didn't start within $timeout seconds" >&2
exit 1
fi
echo -n '.'
sleep 1
done
pid=`cat "$pidfile"`
echo
echo "Platypush environment $env started with PID $pid, logs dir: $logsdir"
}
function stop {
if [[ -z "$1" ]]; then
echo "Usage: $0 stop <env-name>" >&2
exit 1
fi
env=$1
envdir=${workdir}/${env}
rundir=${envdir}/var/run
pidfile=${rundir}/platypush.pid
if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2
exit 1
fi
if [[ ! -f "$pidfile" ]]; then
echo "No pidfile found for instance "${env}""
exit 1
fi
pid=`cat "$pidfile"`
pids="$pid `ps --no-headers -o pid= --ppid $pid`"
kill -9 ${pids}
rm -f "$pidfile"
echo "Instance '$env' with PID $pid stopped"
}
function rme {
if [[ -z "$1" ]]; then
echo "Usage: $0 rm <env-name>" >&2
exit 1
fi
envdir=${workdir}/$1
rundir=${envdir}/var/run
pidfile=${rundir}/platypush.pid
if [[ ! -d "$envdir" ]]; then
echo "No such directory: $envdir" >&2
exit 1
fi
if [[ -f "$pidfile" ]]; then
if ps -p `cat "$pidfile"` | grep platypush; then
echo "Another instance (PID $pidfile) is running, please stop that instance first"
exit 1
fi
echo "A PID file was found but the process doesn't seem to be running, removing anyway"
fi
rm -rf "$envdir"
echo "$envdir removed"
}
function usage {
echo "Usage: $0 <build|start|stop|rm> [options]" >&2
exit 1
}
if (( $# < 1 )); then
usage
fi
action=$1
shift
mkdir -p ${workdir}
case ${action} in
'build') build;;
'start') start $*;;
'stop') stop $*;;
'rm') rme $*;;
*) usage;;
esac

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,186 @@
import inspect
import os
import re
import sys
import textwrap as tw
from sphinx.application import Sphinx
base_path = os.path.abspath(
os.path.join(os.path.dirname(os.path.relpath(__file__)), '..', '..', '..')
)
sys.path.insert(0, base_path)
from platypush.common.reflection import Integration # noqa: E402
from platypush.utils import get_plugin_name_by_class # noqa: E402
from platypush.utils.mock import auto_mocks # noqa: E402
class IntegrationEnricher:
@staticmethod
def add_events(source: list[str], manifest: Integration, idx: int) -> int:
if not manifest.events:
return idx
source.insert(
idx,
'Triggered events\n----------------\n\n'
+ '\n'.join(
f'\t- :class:`{event.__module__}.{event.__qualname__}`'
for event in manifest.events
)
+ '\n\n',
)
return idx + 1
@staticmethod
def add_actions(source: list[str], manifest: Integration, idx: int) -> int:
if not (manifest.actions and manifest.cls):
return idx
source.insert(
idx,
'Actions\n-------\n\n'
+ '\n'.join(
f'\t- `{get_plugin_name_by_class(manifest.cls)}.{action} '
+ f'<#{manifest.cls.__module__}.{manifest.cls.__qualname__}.{action}>`_'
for action in sorted(manifest.actions.keys())
)
+ '\n\n',
)
return idx + 1
@staticmethod
def _shellify(title: str, cmd: str) -> str:
return (
f'**{title}**\n\n'
+ '.. code-block:: bash\n\n'
+ tw.indent(cmd, '\t')
+ '\n\n'
)
@classmethod
def add_install_deps(
cls, source: list[str], manifest: Integration, idx: int
) -> int:
deps = manifest.deps
parsed_deps = {
'before': deps.before,
'pip': deps.pip,
'after': deps.after,
}
if not (any(parsed_deps.values()) or deps.by_pkg_manager):
return idx
source.insert(idx, 'Dependencies\n------------\n\n')
idx += 1
if parsed_deps['before']:
source.insert(idx, cls._shellify('Pre-install', '\n'.join(deps.before)))
idx += 1
if parsed_deps['pip']:
source.insert(
idx, cls._shellify('pip', 'pip install ' + ' '.join(deps.pip))
)
idx += 1
for pkg_manager, sys_deps in deps.by_pkg_manager.items():
if not sys_deps:
continue
source.insert(
idx,
cls._shellify(
pkg_manager.value.default_os.value.description,
pkg_manager.value.install_doc + ' ' + ' '.join(sys_deps),
),
)
idx += 1
if parsed_deps['after']:
source.insert(idx, cls._shellify('Post-install', '\n'.join(deps.after)))
idx += 1
return idx
@classmethod
def add_description(cls, source: list[str], manifest: Integration, idx: int) -> int:
docs = (
doc
for doc in (
inspect.getdoc(manifest.cls) or '',
manifest.constructor.doc if manifest.constructor else '',
)
if doc
)
if not docs:
return idx
docstring = '\n\n'.join(docs)
source.insert(idx, f"Description\n-----------\n\n{docstring}\n\n")
return idx + 1
@classmethod
def add_conf_snippet(
cls, source: list[str], manifest: Integration, idx: int
) -> int:
source.insert(
idx,
tw.dedent(
f"""
Configuration
-------------
.. code-block:: yaml
{tw.indent(manifest.config_snippet, ' ')}
"""
),
)
return idx + 1
def __call__(self, _: Sphinx, doc: str, source: list[str]):
if not (source and re.match(r'^platypush/(backend|plugins)/.*', doc)):
return
src = [src.split('\n') for src in source][0]
if len(src) < 3:
return
manifest_file = os.path.join(
base_path,
*doc.split(os.sep)[:-1],
*doc.split(os.sep)[-1].split('.'),
'manifest.json',
)
if not os.path.isfile(manifest_file):
return
with auto_mocks():
manifest = Integration.from_manifest(manifest_file)
idx = self.add_description(src, manifest, idx=3)
idx = self.add_conf_snippet(src, manifest, idx=idx)
idx = self.add_install_deps(src, manifest, idx=idx)
idx = self.add_events(src, manifest, idx=idx)
idx = self.add_actions(src, manifest, idx=idx)
src.insert(idx, '\n\nModule reference\n----------------\n\n')
source[0] = '\n'.join(src)
def setup(app: Sphinx):
app.connect('source-read', IntegrationEnricher())
return {
'version': '0.1',
'parallel_read_safe': True,
'parallel_write_safe': True,
}

View File

@ -0,0 +1,87 @@
import importlib
import json
import os
import re
import sys
from random import randint
from typing import Union, List
from docutils import nodes
from docutils.parsers.rst import Directive
from marshmallow import fields
class SchemaDirective(Directive):
"""
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)
@classmethod
def _get_field_value(cls, field):
metadata = getattr(field, 'metadata', {})
if metadata.get('example'):
return metadata['example']
if metadata.get('description'):
return metadata['description']
if isinstance(field, fields.Number):
return randint(1, 99)
if isinstance(field, fields.Boolean):
return bool(randint(0, 1))
if isinstance(field, fields.URL):
return 'https://example.org'
if isinstance(field, fields.List):
return [cls._get_field_value(field.inner)]
if isinstance(field, fields.Dict):
return {
cls._get_field_value(field.key_field) if field.key_field else 'key':
cls._get_field_value(field.value_field) if field.value_field else 'value'
}
if isinstance(field, fields.Nested):
ret = {
name: cls._get_field_value(f)
for name, f in field.nested().fields.items()
}
return [ret] if field.many else ret
return str(field.__class__.__name__).lower()
def _parse_schema(self) -> Union[dict, List[dict]]:
m = self._schema_regex.match('\n'.join(self.content))
schema_module_name = '.'.join(['platypush.schemas', *(m.group(1).split('.')[:-1])])
schema_module = importlib.import_module(schema_module_name)
schema_class = getattr(schema_module, m.group(1).split('.')[-1])
schema_args = eval(f'dict({m.group(3)})') if m.group(3) else {}
schema = 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

@ -0,0 +1,249 @@
const processList = (list, level, addTitle) => {
const title = list.parentElement.querySelector('a')
list.classList.add('grid')
if (addTitle)
title.classList.add('grid-title')
list.querySelectorAll(`li.toctree-l${level}`).forEach((item) => {
const link = item.querySelector('a')
if (link) {
item.style.cursor = 'pointer'
item.addEventListener('click', () => link.click())
}
const name = item.querySelector('a').innerText
const img = document.createElement('img')
img.src = `https://static.platypush.tech/icons/${name.toLowerCase()}-64.png`
img.alt = ' '
item.prepend(img)
})
}
const addClipboard = (parent) => {
const pre = parent.tagName === 'PRE' ? parent : parent.querySelector('pre')
if (!pre)
return
const clipboard = document.createElement('i')
const setClipboard = (img, text) => {
clipboard.innerHTML = `<img src="https://static.platypush.tech/icons/${img}-64.png" alt="${text}">`
}
clipboard.classList.add('clipboard')
setClipboard('clipboard-bw', 'Copy')
clipboard.onclick = () => {
if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
setClipboard('ok', 'Copied!')
setTimeout(() => setClipboard('clipboard-bw', 'Copy'), 2000)
return navigator.clipboard.writeText(pre.innerText.trim())
}
return Promise.reject('The Clipboard API is not available.');
}
pre.style.position = 'relative'
pre.appendChild(clipboard)
}
const Tabs = () => {
let selectedTab = null
let parent = null
let data = {}
const init = (obj) => {
data = obj
if (Object.keys(data).length && selectedTab == null)
selectedTab = Object.keys(data)[0]
}
const select = (name) => {
if (!parent) {
console.warn('Cannot select tab: parent not set')
return
}
if (!data[name]) {
console.warn(`Cannot select tab: invalid name: ${name}`)
return
}
const tabsBody = parent.querySelector('.body')
selectedTab = name
tabsBody.innerHTML = data[selectedTab]
parent.querySelectorAll('.tabs li').forEach(
(tab) => tab.classList.remove('selected')
)
const tab = [...parent.querySelectorAll('.tabs li')].find(
(t) => t.innerText === name
)
if (!tab) {
console.warn(`Cannot select tab: invalid name: ${name}`)
return
}
addClipboard(tabsBody)
tab.classList.add('selected')
}
const mount = (p) => {
const tabs = document.createElement('div')
tabs.classList.add('tabs')
parent = p
const tabsList = document.createElement('ul')
Object.keys(data).forEach((title) => {
const tab = document.createElement('li')
tab.innerText = title
tab.onclick = (event) => {
event.stopPropagation()
select(title)
},
tabsList.appendChild(tab)
})
const tabsBody = document.createElement('div')
tabsBody.classList.add('body')
tabs.appendChild(tabsList)
tabs.appendChild(tabsBody)
parent.innerHTML = ''
parent.appendChild(tabs)
select(selectedTab)
}
return {
init,
select,
mount,
}
}
const depsTabs = Tabs()
const convertDepsToTabs = () => {
const depsContainer = document.getElementById('dependencies')
if (!depsContainer)
return
const blocks = [...depsContainer.querySelectorAll('.highlight-bash')].map((block) => block.outerHTML)
const titles = [...depsContainer.querySelectorAll('p strong')].map((title) => title.innerText)
if (!(blocks.length && titles.length && blocks.length === titles.length))
return
const title = depsContainer.querySelector('h2')
const tabsData = titles.reduce((obj, title, i) => {
obj[title] = blocks[i]
return obj
}, {})
depsTabs.init(tabsData)
depsTabs.mount(depsContainer)
depsContainer.prepend(title)
}
const generateComponentsGrid = () => {
const tocWrappers = document.querySelectorAll('.toctree-wrapper.compound')
if (!tocWrappers.length) {
return
}
if (window.location.pathname.endsWith('/index.html')) {
if (tocWrappers.length < 2) {
return
}
const referenceLists = [
...tocWrappers[1].querySelectorAll('ul li.toctree-l1 ul')
].slice(0, 4)
referenceLists.forEach((list) => processList(list, 2, true))
} else if (window.location.pathname.endsWith('/plugins.html') || window.location.pathname.endsWith('/backends.html')) {
if (tocWrappers.length < 1) {
return
}
const list = tocWrappers[0].querySelector('ul')
if (list)
processList(list, 1, false)
}
}
const addClipboardToCodeBlocks = () => {
document.querySelectorAll('pre').forEach((pre) => addClipboard(pre))
}
const renderActionsList = () => {
const actionsList = document.getElementById('actions')?.querySelector('ul')
if (!actionsList)
return
[...actionsList.querySelectorAll('li')].forEach((li) => {
const link = li.querySelector('a')
link.innerHTML = `<code class="docutils literal notranslate"><span class="pre">${link.innerText}</span></code>`
})
}
const createFilterBar = () => {
const input = document.createElement('input')
const referenceSection = document.getElementById('reference')
input.type = 'text'
input.placeholder = 'Filter'
input.classList.add('filter-bar')
input.addEventListener('input', (event) => {
const filter = event.target.value.toLowerCase()
referenceSection.querySelectorAll('ul.grid li').forEach((li) => {
if (li.innerText.toLowerCase().includes(filter)) {
li.style.display = 'flex'
} else {
li.style.display = 'none'
}
})
})
return input
}
const addFilterBar = () => {
const container = document.querySelector('.bd-main')
if (!container)
return
const referenceSection = document.getElementById('reference')
if (!referenceSection)
return
const header = referenceSection.querySelector('h2')
if (!header)
return
const origInnerHTML = header.innerHTML
header.innerHTML = '<span class="header-content">' + origInnerHTML + '</span>'
const input = createFilterBar()
header.appendChild(input)
const headerOffsetTop = header.offsetTop
// Apply the fixed class if the header is above the viewport
document.addEventListener('scroll', () => {
if (headerOffsetTop < window.scrollY) {
header.classList.add('fixed')
} else {
header.classList.remove('fixed')
}
})
}
document.addEventListener("DOMContentLoaded", function() {
generateComponentsGrid()
convertDepsToTabs()
addClipboardToCodeBlocks()
renderActionsList()
addFilterBar()
})

View File

@ -0,0 +1,187 @@
a, a:visited {
/* Don't change the color for visited links */
color: var(--pst-color-link) !important;
}
ul.grid {
display: grid;
@media screen and (max-width: 500px) {
grid-template-columns: repeat(1, 1fr);
}
@media screen and (min-width: 501px) and (max-width: 699px) {
grid-template-columns: repeat(2, 1fr);
}
@media screen and (min-width: 700px) {
grid-template-columns: repeat(3, 1fr);
}
}
a.grid-title {
width: 100%;
display: block;
margin: 1.5em 0;
font-size: 1.5em !important;
border-bottom: 1px solid #ccc;
}
ul.grid li {
display: flex;
background: linear-gradient(0deg, #fff, #f9f9f9);
align-items: center;
justify-content: space-between;
margin: 0 10px 10px 0;
padding: 20px;
border: 1px solid #ccc;
border-radius: 15px;
flex-direction: column;
}
ul.grid img {
width: 48px;
margin-right: 5px;
}
ul.grid li code {
width: 100%;
}
ul.grid li code .pre {
width: 100%;
display: block;
white-space: pre-wrap;
}
ul.grid li:hover {
background: linear-gradient(0deg, #157765, #cbffd8) !important;
}
ul.grid li a {
width: 100%;
display: flex;
justify-content: center;
text-align: center;
margin-top: 0.5em;
}
ul.grid li:hover a {
color: white !important;
}
ul.grid li a code {
background: none;
border: none;
}
ul.grid .icon {
width: 32px;
}
/* Clipboard button */
.clipboard {
position: absolute;
display: inline-block;
width: 32px;
top: 0.5em;
right: 0.5em;
cursor: pointer;
}
/* Tabs */
.tabs {
margin: 0 0 1em 0;
padding: 0;
list-style: none;
}
.tabs ul {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
margin: 0 0 1em 0;
padding: 0;
list-style: none;
border-bottom: 1px solid #ccc;
}
.tabs ul li {
display: inline-flex;
max-width: 25%;
margin: 0;
padding: 0.25em 0.5em;
list-style: none;
cursor: pointer;
flex-grow: 1;
justify-content: center;
align-items: center;
border-radius: 0.75em 0.75em 0 0;
border: 1px solid #ddd;
}
.tabs ul li.selected {
background: rgb(200,255,208);
}
.tabs ul li:hover {
background: rgb(190,246,218);
}
.tabs .body {
margin-top: -1em;
padding: 1em;
border: 1px solid #ccc;
border-top: none;
border-radius: 0 0 0.75em 0.75em;
}
.bd-article-container {
position: relative;
}
.filter-bar {
width: 100%;
display: block;
font-size: 0.6em;
border: 1px solid #ccc;
border-radius: 0.75em;
margin: 0.5em 0;
padding: 0.25em;
}
#reference h2.fixed {
position: fixed;
top: 0;
background: white;
z-index: 1;
}
#reference h2.fixed .header-content {
display: none;
}
@media screen and (max-width: 768px) {
#reference h2.fixed {
width: 100%;
margin-left: -0.5em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (max-width: 959px) {
#reference h2.fixed {
width: 100%;
margin-left: -1em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (min-width: 960px) {
#reference h2.fixed {
width: 75%;
max-width: 800px;
padding-top: 0.5em;
}
}

View File

@ -3,70 +3,10 @@ Backends
========
.. toctree::
:maxdepth: 2
:maxdepth: 1
: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/foursquare.rst
platypush/backend/google.fit.rst
platypush/backend/google.pubsub.rst
platypush/backend/gps.rst
platypush/backend/http.rst
platypush/backend/http.poll.rst
platypush/backend/inotify.rst
platypush/backend/joystick.rst
platypush/backend/kafka.rst
platypush/backend/light.hue.rst
platypush/backend/linode.rst
platypush/backend/local.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/nfc.rst
platypush/backend/nodered.rst
platypush/backend/ping.rst
platypush/backend/pushbullet.rst
platypush/backend/redis.rst
platypush/backend/scard.rst
platypush/backend/sensor.rst
platypush/backend/sensor.accelerometer.rst
platypush/backend/sensor.arduino.rst
platypush/backend/sensor.battery.rst
platypush/backend/sensor.bme280.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.buienradar.rst
platypush/backend/weather.darksky.rst
platypush/backend/websocket.rst
platypush/backend/wiimote.rst
platypush/backend/zigbee.mqtt.rst
platypush/backend/zwave.rst

View File

@ -15,16 +15,14 @@ import sys
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath("./_ext"))
# -- Project information -----------------------------------------------------
project = 'platypush'
copyright = '2017-2019, Fabio Manganiello'
author = 'Fabio Manganiello'
project = 'Platypush'
copyright = '2017-2023, Fabio Manganiello'
author = 'Fabio Manganiello <fabio@manganiello.tech>'
# The short X.Y version
version = ''
@ -42,6 +40,7 @@ release = ''
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'myst_parser',
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
@ -50,6 +49,8 @@ extensions = [
'sphinx.ext.viewcode',
'sphinx.ext.githubpages',
'sphinx_rtd_theme',
'sphinx_marshmallow',
'add_dependencies',
]
# Add any paths that contain templates here, relative to this directory.
@ -58,8 +59,8 @@ templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
source_suffix = ['.rst', '.md']
# source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
@ -69,7 +70,7 @@ master_doc = 'index'
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
language = 'en'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
@ -86,20 +87,39 @@ pygments_style = 'sphinx'
# a list of builtin themes.
#
# html_theme = 'haiku'
html_theme = 'sphinx_rtd_theme'
# html_theme = 'sphinx_rtd_theme'
html_theme = 'sphinx_book_theme'
html_title = 'Platypush Documentation'
html_logo = '../../assets/logo-64.png'
html_favicon = '../../platypush/backend/http/webapp/public/favicon.ico'
html_domain_indices = True
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
html_theme_options = {
'toc_title': 'Platypush documentation',
'repository_url': 'https://git.platypush.tech/platypush/platypush',
'repository_provider': 'github',
'use_repository_button': True,
'use_issues_button': True,
'use_fullscreen_button': True,
'home_page_in_toc': True,
}
# 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']
html_css_files = [
'styles/custom.css',
]
html_js_files = [
'scripts/custom.js',
]
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
@ -109,8 +129,9 @@ html_domain_indices = True
# 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 ---------------------------------------------
@ -124,15 +145,12 @@ latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
@ -142,8 +160,7 @@ latex_elements = {
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'platypush.tex', 'platypush Documentation',
'BlackLight', 'manual'),
(master_doc, 'platypush.tex', 'platypush Documentation', 'BlackLight', 'manual'),
]
@ -151,21 +168,24 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'platypush', 'platypush Documentation',
[author], 1)
]
man_pages = [(master_doc, 'platypush', 'platypush Documentation', [author], 1)]
# -- Options for Texinfo output ----------------------------------------------
# -- Options for TexInfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# Grouping the document tree into TexInfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'platypush', 'platypush Documentation',
author, 'platypush', 'One line description of project.',
'Miscellaneous'),
(
master_doc,
'platypush',
'platypush Documentation',
author,
'platypush',
'A general-purpose platform for automation.',
'Miscellaneous',
),
]
@ -174,91 +194,32 @@ texinfo_documents = [
# -- Options for intersphinx extension ---------------------------------------
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'https://docs.python.org/': None}
intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
# -- Options for todo extension ----------------------------------------------
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
autodoc_mock_imports = ['googlesamples.assistant.grpc.audio_helpers',
'google.assistant.embedded',
'google.assistant.library',
'google.assistant.library.event',
'google.assistant.library.file_helpers',
'google.oauth2.credentials',
'oauth2client',
'apiclient',
'tenacity',
'smartcard',
'Leap',
'oauth2client',
'rtmidi',
'bluetooth',
'gevent.wsgi',
'Adafruit_IO',
'pyperclip',
'dbus',
'inputs',
'inotify',
'omxplayer',
'plexapi',
'cwiid',
'sounddevice',
'soundfile',
'numpy',
'cv2',
'nfc',
'ndef',
'bcrypt',
'google',
'feedparser',
'kafka',
'googlesamples',
'icalendar',
'httplib2',
'mpd',
'serial',
'pyHS100',
'grpc',
'envirophat',
'gps',
'picamera',
'pwm3901',
'PIL',
'croniter',
'pyaudio',
'avs',
'PyOBEX',
'todoist',
'trello',
'telegram',
'telegram.ext',
'pyfirmata2',
'cups',
'graphyte',
'cpuinfo',
'psutil',
'openzwave',
'deepspeech',
'wave',
'pvporcupine ',
'pvcheetah',
'pyotp',
'linode_api4',
'pyzbar',
'tensorflow',
'keras',
'pandas',
]
autodoc_default_options = {
'members': True,
'show-inheritance': True,
}
sys.path.insert(0, os.path.abspath('../..'))
def skip(app, what, name, obj, skip, options):
from platypush.utils.mock.modules import mock_imports # noqa
autodoc_mock_imports = [*mock_imports]
# _ = app
# __ = what
# ___ = obj
# ____ = options
def _skip(_, __, name, ___, skip, ____):
if name == "__init__":
return False
return skip
def setup(app):
app.connect("autodoc-skip-member", skip)
def setup(app):
app.connect("autodoc-skip-member", _skip)
# vim:sw=4:ts=4:et:

View File

@ -3,43 +3,58 @@ Events
======
.. toctree::
:maxdepth: 2
:maxdepth: 1
: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/chat.slack.rst
platypush/events/clipboard.rst
platypush/events/custom.rst
platypush/events/dbus.rst
platypush/events/distance.rst
platypush/events/entities.rst
platypush/events/file.rst
platypush/events/flic.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/gotify.rst
platypush/events/gpio.rst
platypush/events/gps.rst
platypush/events/hid.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/irc.rst
platypush/events/joystick.rst
platypush/events/kafka.rst
platypush/events/light.rst
platypush/events/linode.rst
platypush/events/log.http.rst
platypush/events/mail.rst
platypush/events/matrix.rst
platypush/events/media.rst
platypush/events/midi.rst
platypush/events/mqtt.rst
platypush/events/music.rst
platypush/events/music.snapcast.rst
platypush/events/music.tidal.rst
platypush/events/nextcloud.rst
platypush/events/nfc.rst
platypush/events/path.rst
platypush/events/ngrok.rst
platypush/events/ntfy.rst
platypush/events/ping.rst
platypush/events/pushbullet.rst
platypush/events/qrcode.rst
platypush/events/rss.rst
platypush/events/scard.rst
platypush/events/sensor.rst
platypush/events/sensor.ir.rst
@ -48,16 +63,18 @@ Events
platypush/events/serial.rst
platypush/events/sound.rst
platypush/events/stt.rst
platypush/events/sun.rst
platypush/events/telegram.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/websocket.rst
platypush/events/xmpp.rst
platypush/events/zeroborg.rst
platypush/events/zeroconf.rst
platypush/events/zigbee.mqtt.rst
platypush/events/zwave.rst

View File

@ -1,26 +1,55 @@
Platypush
#########
Welcome to the Platypush reference of available plugins, backends and event types.
Description
===========
For more information on Platypush please check out:
This is the main documentation hub for Platypush. It includes both the wiki and
the complete reference of the available integrations.
* The `GitHub page`_ of the project
* The `online wiki`_ for quickstart and examples
* The `Medium stories`_ for inspiration about possible projects
Platypush is a general-purpose automation framework that can be used to cover
all the cases where you'd use a home automation hub, a media center, a smart
assistant, some IFTTT recipes, and a variety of other products and services.
.. _GitHub page: https://github.com/BlackLight/platypush
.. _online wiki: https://github.com/BlackLight/platypush/wiki
.. _Medium stories: https://medium.com/tag/platypush/archive
It draws inspiration from the following projects, and it aims to cover all of
their use-cases:
* `Home Assistant <https://www.home-assistant.io/>`_
* `Homebridge <https://homebridge.io/>`_
* `OpenHAB <https://www.openhab.org/>`_
* `IFTTT <https://ifttt.com/>`_
* `Tasker <https://tasker.joaoapps.com/>`_
Useful links
============
* The `main page <https://platypush.tech>`_ of the project.
* The `Gitea page <https://git.platypush.tech/platypush/platypush>`_.
* The `blog <https://blog.platypush.tech>`_, for articles showing how to use
Platypush in real-world scenarios.
Wiki
====
.. toctree::
:maxdepth: 3
:caption: Contents:
wiki/index
wiki/Installation
wiki/Configuration
wiki/Installing-extensions
wiki/A-configuration-example
wiki/The-Web-interface
Reference
=========
.. toctree::
:maxdepth: 2
backends
plugins
events
responses
Indices and tables
==================
@ -28,4 +57,3 @@ Indices and tables
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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