uiprotect 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uiprotect might be problematic. Click here for more details.

Files changed (36) hide show
  1. {uiprotect-1.2.0 → uiprotect-1.2.2}/PKG-INFO +1 -1
  2. {uiprotect-1.2.0 → uiprotect-1.2.2}/pyproject.toml +1 -1
  3. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/bootstrap.py +37 -36
  4. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/nvr.py +9 -10
  5. {uiprotect-1.2.0 → uiprotect-1.2.2}/LICENSE +0 -0
  6. {uiprotect-1.2.0 → uiprotect-1.2.2}/README.md +0 -0
  7. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/__init__.py +0 -0
  8. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/__main__.py +0 -0
  9. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/api.py +0 -0
  10. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/__init__.py +0 -0
  11. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/backup.py +0 -0
  12. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/base.py +0 -0
  13. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/cameras.py +0 -0
  14. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/chimes.py +0 -0
  15. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/doorlocks.py +0 -0
  16. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/events.py +0 -0
  17. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/lights.py +0 -0
  18. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/liveviews.py +0 -0
  19. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/nvr.py +0 -0
  20. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/sensors.py +0 -0
  21. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/cli/viewers.py +0 -0
  22. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/__init__.py +0 -0
  23. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/base.py +0 -0
  24. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/convert.py +0 -0
  25. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/devices.py +0 -0
  26. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/types.py +0 -0
  27. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/user.py +0 -0
  28. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/data/websocket.py +0 -0
  29. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/exceptions.py +0 -0
  30. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/py.typed +0 -0
  31. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/release_cache.json +0 -0
  32. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/stream.py +0 -0
  33. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/test_util/__init__.py +0 -0
  34. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/test_util/anonymize.py +0 -0
  35. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/utils.py +0 -0
  36. {uiprotect-1.2.0 → uiprotect-1.2.2}/src/uiprotect/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Home-page: https://github.com/uilibs/uiprotect
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uiprotect"
3
- version = "1.2.0"
3
+ version = "1.2.2"
4
4
  description = "Python API for Unifi Protect (Unofficial)"
5
5
  authors = ["UI Protect Maintainers <ui@koston.org>"]
6
6
  license = "MIT"
@@ -473,47 +473,48 @@ class Bootstrap(ProtectBaseObject):
473
473
  key = f"{model_type}s"
474
474
  devices: dict[str, ProtectModelWithId] = getattr(self, key)
475
475
  action_id: str = action["id"]
476
- if action_id in devices:
477
- if action_id not in devices:
478
- raise ValueError(f"Unknown device update for {model_type}: {action_id}")
479
- obj = devices[action_id]
480
- data = obj.unifi_dict_to_dict(data)
481
- old_obj = obj.copy()
482
- obj = obj.update_from_dict(deepcopy(data))
483
-
484
- if isinstance(obj, Event):
485
- self.process_event(obj)
486
- elif isinstance(obj, Camera):
487
- if "last_ring" in data and obj.last_ring:
488
- is_recent = obj.last_ring + RECENT_EVENT_MAX >= utc_now()
489
- _LOGGER.debug("last_ring for %s (%s)", obj.id, is_recent)
490
- if is_recent:
491
- obj.set_ring_timeout()
492
- elif (
493
- isinstance(obj, Sensor)
494
- and "alarm_triggered_at" in data
495
- and obj.alarm_triggered_at
496
- ):
476
+ if action_id not in devices:
477
+ # ignore updates to events that phase out
478
+ if model_type != _ModelType_Event_value:
479
+ _LOGGER.debug("Unexpected %s: %s", key, action_id)
480
+ return None
481
+
482
+ obj = devices[action_id]
483
+ model = obj.model
484
+ data = obj.unifi_dict_to_dict(data)
485
+ old_obj = obj.copy()
486
+ obj = obj.update_from_dict(deepcopy(data))
487
+
488
+ if model is ModelType.EVENT:
489
+ if TYPE_CHECKING:
490
+ assert isinstance(obj, Event)
491
+ self.process_event(obj)
492
+ elif model is ModelType.CAMERA:
493
+ if TYPE_CHECKING:
494
+ assert isinstance(obj, Camera)
495
+ if "last_ring" in data and obj.last_ring:
496
+ is_recent = obj.last_ring + RECENT_EVENT_MAX >= utc_now()
497
+ _LOGGER.debug("last_ring for %s (%s)", obj.id, is_recent)
498
+ if is_recent:
499
+ obj.set_ring_timeout()
500
+ elif model is ModelType.SENSOR:
501
+ if TYPE_CHECKING:
502
+ assert isinstance(obj, Sensor)
503
+ if "alarm_triggered_at" in data and obj.alarm_triggered_at:
497
504
  is_recent = obj.alarm_triggered_at + RECENT_EVENT_MAX >= utc_now()
498
505
  _LOGGER.debug("alarm_triggered_at for %s (%s)", obj.id, is_recent)
499
506
  if is_recent:
500
507
  obj.set_alarm_timeout()
501
508
 
502
- devices[action_id] = obj
503
-
504
- self._create_stat(packet, data, False)
505
- return WSSubscriptionMessage(
506
- action=WSAction.UPDATE,
507
- new_update_id=self.last_update_id,
508
- changed_data=data,
509
- new_obj=obj,
510
- old_obj=old_obj,
511
- )
512
-
513
- # ignore updates to events that phase out
514
- if model_type != _ModelType_Event_value:
515
- _LOGGER.debug("Unexpected %s: %s", key, action_id)
516
- return None
509
+ devices[action_id] = obj
510
+ self._create_stat(packet, data, False)
511
+ return WSSubscriptionMessage(
512
+ action=WSAction.UPDATE,
513
+ new_update_id=self.last_update_id,
514
+ changed_data=data,
515
+ new_obj=obj,
516
+ old_obj=old_obj,
517
+ )
517
518
 
518
519
  def process_ws_packet(
519
520
  self,
@@ -1198,16 +1198,15 @@ class NVR(ProtectDeviceModel):
1198
1198
 
1199
1199
  async def _read_cache_file(self, file_path: Path) -> set[Version] | None:
1200
1200
  versions: set[Version] | None = None
1201
-
1202
- if file_path.is_file():
1203
- try:
1204
- _LOGGER.debug("Reading release cache file: %s", file_path)
1205
- async with aiofiles.open(file_path, "rb") as cache_file:
1206
- versions = {
1207
- Version(v) for v in orjson.loads(await cache_file.read())
1208
- }
1209
- except Exception:
1210
- _LOGGER.warning("Failed to parse cache file: %s", file_path)
1201
+ try:
1202
+ _LOGGER.debug("Reading release cache file: %s", file_path)
1203
+ async with aiofiles.open(file_path, "rb") as cache_file:
1204
+ versions = {Version(v) for v in orjson.loads(await cache_file.read())}
1205
+ except FileNotFoundError:
1206
+ # ignore missing file
1207
+ pass
1208
+ except Exception:
1209
+ _LOGGER.warning("Failed to parse cache file: %s", file_path)
1211
1210
 
1212
1211
  return versions
1213
1212
 
File without changes
File without changes