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
41233138ff
Blackened `inspect` module and extracted model defs to adjacent module.
2023-05-09 21:58: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
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
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
c690230930
An `AssistantEvent` should not fail initialization if the assistant integration isn't found.
2023-05-04 00:28:50 +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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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