uiprotect 1.2.1__py3-none-any.whl → 1.3.0__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.
- uiprotect/data/bootstrap.py +58 -64
- {uiprotect-1.2.1.dist-info → uiprotect-1.3.0.dist-info}/METADATA +1 -1
- {uiprotect-1.2.1.dist-info → uiprotect-1.3.0.dist-info}/RECORD +6 -6
- {uiprotect-1.2.1.dist-info → uiprotect-1.3.0.dist-info}/LICENSE +0 -0
- {uiprotect-1.2.1.dist-info → uiprotect-1.3.0.dist-info}/WHEEL +0 -0
- {uiprotect-1.2.1.dist-info → uiprotect-1.3.0.dist-info}/entry_points.txt +0 -0
uiprotect/data/bootstrap.py
CHANGED
|
@@ -80,12 +80,9 @@ CAMERA_EVENT_ATTR_MAP: dict[EventType, tuple[str, str]] = {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
def _process_light_event(event: Event) -> None:
|
|
84
|
-
if event.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if _event_is_in_range(event, event.light.last_motion):
|
|
88
|
-
event.light.last_motion_event_id = event.id
|
|
83
|
+
def _process_light_event(event: Event, light: Light) -> None:
|
|
84
|
+
if _event_is_in_range(event, light.last_motion):
|
|
85
|
+
light.last_motion_event_id = event.id
|
|
89
86
|
|
|
90
87
|
|
|
91
88
|
def _event_is_in_range(event: Event, dt: datetime | None) -> bool:
|
|
@@ -95,22 +92,20 @@ def _event_is_in_range(event: Event, dt: datetime | None) -> bool:
|
|
|
95
92
|
)
|
|
96
93
|
|
|
97
94
|
|
|
98
|
-
def _process_sensor_event(event: Event) -> None:
|
|
99
|
-
if event.sensor is None:
|
|
100
|
-
return
|
|
95
|
+
def _process_sensor_event(event: Event, sensor: Sensor) -> None:
|
|
101
96
|
if event.type is EventType.MOTION_SENSOR:
|
|
102
|
-
if _event_is_in_range(event,
|
|
103
|
-
|
|
97
|
+
if _event_is_in_range(event, sensor.motion_detected_at):
|
|
98
|
+
sensor.last_motion_event_id = event.id
|
|
104
99
|
elif event.type in {EventType.SENSOR_CLOSED, EventType.SENSOR_OPENED}:
|
|
105
|
-
if _event_is_in_range(event,
|
|
106
|
-
|
|
100
|
+
if _event_is_in_range(event, sensor.open_status_changed_at):
|
|
101
|
+
sensor.last_contact_event_id = event.id
|
|
107
102
|
elif event.type is EventType.SENSOR_EXTREME_VALUE:
|
|
108
|
-
if _event_is_in_range(event,
|
|
109
|
-
|
|
110
|
-
|
|
103
|
+
if _event_is_in_range(event, sensor.extreme_value_detected_at):
|
|
104
|
+
sensor.extreme_value_detected_at = event.end
|
|
105
|
+
sensor.last_value_event_id = event.id
|
|
111
106
|
elif event.type is EventType.SENSOR_ALARM:
|
|
112
|
-
if _event_is_in_range(event,
|
|
113
|
-
|
|
107
|
+
if _event_is_in_range(event, sensor.alarm_triggered_at):
|
|
108
|
+
sensor.last_value_event_id = event.id
|
|
114
109
|
|
|
115
110
|
|
|
116
111
|
_CAMERA_SMART_AND_LINE_EVENTS = {
|
|
@@ -120,10 +115,7 @@ _CAMERA_SMART_AND_LINE_EVENTS = {
|
|
|
120
115
|
_CAMERA_SMART_AUDIO_EVENT = EventType.SMART_AUDIO_DETECT
|
|
121
116
|
|
|
122
117
|
|
|
123
|
-
def _process_camera_event(event: Event) -> None:
|
|
124
|
-
if (camera := event.camera) is None:
|
|
125
|
-
return
|
|
126
|
-
|
|
118
|
+
def _process_camera_event(event: Event, camera: Camera) -> None:
|
|
127
119
|
event_type = event.type
|
|
128
120
|
dt_attr, event_attr = CAMERA_EVENT_ATTR_MAP[event_type]
|
|
129
121
|
dt: datetime | None = getattr(camera, dt_attr)
|
|
@@ -322,12 +314,13 @@ class Bootstrap(ProtectBaseObject):
|
|
|
322
314
|
return cast(ProtectAdoptableDeviceModel, devices.get(ref.id))
|
|
323
315
|
|
|
324
316
|
def process_event(self, event: Event) -> None:
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
317
|
+
event_type = event.type
|
|
318
|
+
if event_type in CAMERA_EVENT_ATTR_MAP and (camera := event.camera):
|
|
319
|
+
_process_camera_event(event, camera)
|
|
320
|
+
elif event_type is EventType.MOTION_LIGHT and (light := event.light):
|
|
321
|
+
_process_light_event(event, light)
|
|
322
|
+
elif event_type is EventType.MOTION_SENSOR and (sensor := event.sensor):
|
|
323
|
+
_process_sensor_event(event, sensor)
|
|
331
324
|
|
|
332
325
|
self.events[event.id] = event
|
|
333
326
|
|
|
@@ -473,47 +466,48 @@ class Bootstrap(ProtectBaseObject):
|
|
|
473
466
|
key = f"{model_type}s"
|
|
474
467
|
devices: dict[str, ProtectModelWithId] = getattr(self, key)
|
|
475
468
|
action_id: str = action["id"]
|
|
476
|
-
if action_id in devices:
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
469
|
+
if action_id not in devices:
|
|
470
|
+
# ignore updates to events that phase out
|
|
471
|
+
if model_type != _ModelType_Event_value:
|
|
472
|
+
_LOGGER.debug("Unexpected %s: %s", key, action_id)
|
|
473
|
+
return None
|
|
474
|
+
|
|
475
|
+
obj = devices[action_id]
|
|
476
|
+
model = obj.model
|
|
477
|
+
data = obj.unifi_dict_to_dict(data)
|
|
478
|
+
old_obj = obj.copy()
|
|
479
|
+
obj = obj.update_from_dict(deepcopy(data))
|
|
480
|
+
|
|
481
|
+
if model is ModelType.EVENT:
|
|
482
|
+
if TYPE_CHECKING:
|
|
483
|
+
assert isinstance(obj, Event)
|
|
484
|
+
self.process_event(obj)
|
|
485
|
+
elif model is ModelType.CAMERA:
|
|
486
|
+
if TYPE_CHECKING:
|
|
487
|
+
assert isinstance(obj, Camera)
|
|
488
|
+
if "last_ring" in data and obj.last_ring:
|
|
489
|
+
is_recent = obj.last_ring + RECENT_EVENT_MAX >= utc_now()
|
|
490
|
+
_LOGGER.debug("last_ring for %s (%s)", obj.id, is_recent)
|
|
491
|
+
if is_recent:
|
|
492
|
+
obj.set_ring_timeout()
|
|
493
|
+
elif model is ModelType.SENSOR:
|
|
494
|
+
if TYPE_CHECKING:
|
|
495
|
+
assert isinstance(obj, Sensor)
|
|
496
|
+
if "alarm_triggered_at" in data and obj.alarm_triggered_at:
|
|
497
497
|
is_recent = obj.alarm_triggered_at + RECENT_EVENT_MAX >= utc_now()
|
|
498
498
|
_LOGGER.debug("alarm_triggered_at for %s (%s)", obj.id, is_recent)
|
|
499
499
|
if is_recent:
|
|
500
500
|
obj.set_alarm_timeout()
|
|
501
501
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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
|
|
502
|
+
devices[action_id] = obj
|
|
503
|
+
self._create_stat(packet, data, False)
|
|
504
|
+
return WSSubscriptionMessage(
|
|
505
|
+
action=WSAction.UPDATE,
|
|
506
|
+
new_update_id=self.last_update_id,
|
|
507
|
+
changed_data=data,
|
|
508
|
+
new_obj=obj,
|
|
509
|
+
old_obj=old_obj,
|
|
510
|
+
)
|
|
517
511
|
|
|
518
512
|
def process_ws_packet(
|
|
519
513
|
self,
|
|
@@ -15,7 +15,7 @@ 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=
|
|
18
|
+
uiprotect/data/bootstrap.py,sha256=D8qyR4fMp9TfVUIYbbn788hTKYxuzifdHax4qRYW1Gw,21185
|
|
19
19
|
uiprotect/data/convert.py,sha256=rOQplUMIdTMD2SbAx_iI9BNPDscnhDvyRVLEMDhtADg,2047
|
|
20
20
|
uiprotect/data/devices.py,sha256=Nq3bOko5PFf5LvEBoD4JV8kmbq50laRdh3VHMWX7t-0,111809
|
|
21
21
|
uiprotect/data/nvr.py,sha256=jwJEl4o2kbvoYFB9wSJPghNj0905847-86ElT51nNs0,47580
|
|
@@ -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.
|
|
34
|
-
uiprotect-1.
|
|
35
|
-
uiprotect-1.
|
|
36
|
-
uiprotect-1.
|
|
37
|
-
uiprotect-1.
|
|
33
|
+
uiprotect-1.3.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
|
|
34
|
+
uiprotect-1.3.0.dist-info/METADATA,sha256=uFhgPqZREr1J8zj0PfD7twZl98ueL46-biEodcR5jZk,10984
|
|
35
|
+
uiprotect-1.3.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
36
|
+
uiprotect-1.3.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
|
|
37
|
+
uiprotect-1.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|