Commit graph

2949 commits

Author SHA1 Message Date
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