uiprotect 1.2.0__py3-none-any.whl → 1.2.2__py3-none-any.whl

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.

@@ -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,
uiprotect/data/nvr.py CHANGED
@@ -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
 
@@ -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
@@ -15,10 +15,10 @@ uiprotect/cli/sensors.py,sha256=fQtcDJCVxs4VbAqcavgBy2ABiVxAW3GXtna6_XFBp2k,8153
15
15
  uiprotect/cli/viewers.py,sha256=2cyrp104ffIvgT0wYGIO0G35QMkEbFe7fSVqLwDXQYQ,2171
16
16
  uiprotect/data/__init__.py,sha256=OcfuJl2qXfHcj_mdnrHhzZ5tEIZrw8auziX5IE7dn-I,2938
17
17
  uiprotect/data/base.py,sha256=kkPrRhvJV7igGyB3wv1fDvWH26Xzlbz94BjJkDiTvU4,38375
18
- uiprotect/data/bootstrap.py,sha256=NH4jSEm44M0aijmViLHip2PKhVchuZJEeqWI3bcZwq0,21285
18
+ uiprotect/data/bootstrap.py,sha256=JsbdZQAdlmLNg7dSv02pAhx1n3_wtFfLqSoj7kd8A-0,21296
19
19
  uiprotect/data/convert.py,sha256=rOQplUMIdTMD2SbAx_iI9BNPDscnhDvyRVLEMDhtADg,2047
20
20
  uiprotect/data/devices.py,sha256=Nq3bOko5PFf5LvEBoD4JV8kmbq50laRdh3VHMWX7t-0,111809
21
- uiprotect/data/nvr.py,sha256=aIi4d0KCJ55r1EP-33sBhvEa8lx-41jDGrDpAq5VnOE,47598
21
+ uiprotect/data/nvr.py,sha256=jwJEl4o2kbvoYFB9wSJPghNj0905847-86ElT51nNs0,47580
22
22
  uiprotect/data/types.py,sha256=6Z5ZqWTbH4Igy0l4QJShqQZ_zvrJKD0G-hZLjoBNP-U,16193
23
23
  uiprotect/data/user.py,sha256=Y7DnnxwUOJRJYw5FntztAtwN-o-Fs48SNS3mHi4Y5To,7071
24
24
  uiprotect/data/websocket.py,sha256=WZJVA7EfYuKYMv-9jmvGgMWXKzE9ES25SKv1NQ2eHjc,6281
@@ -30,8 +30,8 @@ uiprotect/test_util/__init__.py,sha256=d2g7afa0LSdixQ0kjEDYwafDFME_UlW2LzxpamZ2B
30
30
  uiprotect/test_util/anonymize.py,sha256=f-8ijU-_y9r-uAbhIPn0f0I6hzJpAkvJzc8UpWihObI,8478
31
31
  uiprotect/utils.py,sha256=6OLY8hNiCzk418PjJJIlFW7jjPzVt1vxBKEzBSqMeTk,18418
32
32
  uiprotect/websocket.py,sha256=IzDPyqbzrkOMREvahN-e2zdvVD0VABSCWy6jSoCwOT0,7299
33
- uiprotect-1.2.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
- uiprotect-1.2.0.dist-info/METADATA,sha256=N0K6ocu5Xe5y1qvGrBIqu00xfu0ZseOmTMTXccG3cnQ,10984
35
- uiprotect-1.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
- uiprotect-1.2.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
- uiprotect-1.2.0.dist-info/RECORD,,
33
+ uiprotect-1.2.2.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
+ uiprotect-1.2.2.dist-info/METADATA,sha256=pU-rmbBF_iFXCpjNQkujk-qjuiJBH1zMDw5ALwnlhQ4,10984
35
+ uiprotect-1.2.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
+ uiprotect-1.2.2.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
+ uiprotect-1.2.2.dist-info/RECORD,,