Home Assistant Unofficial Reference 2024.12.1
parsers.py
Go to the documentation of this file.
1 """ONVIF event parsers."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 import datetime
7 from typing import Any
8 
9 from homeassistant.const import EntityCategory
10 from homeassistant.util import dt as dt_util
11 from homeassistant.util.decorator import Registry
12 
13 from .models import Event
14 
15 PARSERS: Registry[str, Callable[[str, Any], Coroutine[Any, Any, Event | None]]] = (
16  Registry()
17 )
18 
19 VIDEO_SOURCE_MAPPING = {
20  "vsconf": "VideoSourceToken",
21 }
22 
23 
24 def extract_message(msg: Any) -> tuple[str, Any]:
25  """Extract the message content and the topic."""
26  return msg.Topic._value_1, msg.Message._value_1 # noqa: SLF001
27 
28 
29 def _normalize_video_source(source: str) -> str:
30  """Normalize video source.
31 
32  Some cameras do not set the VideoSourceToken correctly so we get duplicate
33  sensors, so we need to normalize it to the correct value.
34  """
35  return VIDEO_SOURCE_MAPPING.get(source, source)
36 
37 
38 def local_datetime_or_none(value: str) -> datetime.datetime | None:
39  """Convert strings to datetimes, if invalid, return None."""
40  # To handle cameras that return times like '0000-00-00T00:00:00Z' (e.g. hikvision)
41  try:
42  ret = dt_util.parse_datetime(value)
43  except ValueError:
44  return None
45  if ret is not None:
46  return dt_util.as_local(ret)
47  return None
48 
49 
50 @PARSERS.register("tns1:VideoSource/MotionAlarm")
51 async def async_parse_motion_alarm(uid: str, msg) -> Event | None:
52  """Handle parsing event message.
53 
54  Topic: tns1:VideoSource/MotionAlarm
55  """
56  try:
57  topic, payload = extract_message(msg)
58  source = payload.Source.SimpleItem[0].Value
59  return Event(
60  f"{uid}_{topic}_{source}",
61  "Motion Alarm",
62  "binary_sensor",
63  "motion",
64  None,
65  payload.Data.SimpleItem[0].Value == "true",
66  )
67  except (AttributeError, KeyError):
68  return None
69 
70 
71 @PARSERS.register("tns1:VideoSource/ImageTooBlurry/AnalyticsService")
72 @PARSERS.register("tns1:VideoSource/ImageTooBlurry/ImagingService")
73 @PARSERS.register("tns1:VideoSource/ImageTooBlurry/RecordingService")
74 async def async_parse_image_too_blurry(uid: str, msg) -> Event | None:
75  """Handle parsing event message.
76 
77  Topic: tns1:VideoSource/ImageTooBlurry/*
78  """
79  try:
80  topic, payload = extract_message(msg)
81  source = payload.Source.SimpleItem[0].Value
82  return Event(
83  f"{uid}_{topic}_{source}",
84  "Image Too Blurry",
85  "binary_sensor",
86  "problem",
87  None,
88  payload.Data.SimpleItem[0].Value == "true",
89  EntityCategory.DIAGNOSTIC,
90  )
91  except (AttributeError, KeyError):
92  return None
93 
94 
95 @PARSERS.register("tns1:VideoSource/ImageTooDark/AnalyticsService")
96 @PARSERS.register("tns1:VideoSource/ImageTooDark/ImagingService")
97 @PARSERS.register("tns1:VideoSource/ImageTooDark/RecordingService")
98 async def async_parse_image_too_dark(uid: str, msg) -> Event | None:
99  """Handle parsing event message.
100 
101  Topic: tns1:VideoSource/ImageTooDark/*
102  """
103  try:
104  topic, payload = extract_message(msg)
105  source = payload.Source.SimpleItem[0].Value
106  return Event(
107  f"{uid}_{topic}_{source}",
108  "Image Too Dark",
109  "binary_sensor",
110  "problem",
111  None,
112  payload.Data.SimpleItem[0].Value == "true",
113  EntityCategory.DIAGNOSTIC,
114  )
115  except (AttributeError, KeyError):
116  return None
117 
118 
119 @PARSERS.register("tns1:VideoSource/ImageTooBright/AnalyticsService")
120 @PARSERS.register("tns1:VideoSource/ImageTooBright/ImagingService")
121 @PARSERS.register("tns1:VideoSource/ImageTooBright/RecordingService")
122 async def async_parse_image_too_bright(uid: str, msg) -> Event | None:
123  """Handle parsing event message.
124 
125  Topic: tns1:VideoSource/ImageTooBright/*
126  """
127  try:
128  topic, payload = extract_message(msg)
129  source = payload.Source.SimpleItem[0].Value
130  return Event(
131  f"{uid}_{topic}_{source}",
132  "Image Too Bright",
133  "binary_sensor",
134  "problem",
135  None,
136  payload.Data.SimpleItem[0].Value == "true",
137  EntityCategory.DIAGNOSTIC,
138  )
139  except (AttributeError, KeyError):
140  return None
141 
142 
143 @PARSERS.register("tns1:VideoSource/GlobalSceneChange/AnalyticsService")
144 @PARSERS.register("tns1:VideoSource/GlobalSceneChange/ImagingService")
145 @PARSERS.register("tns1:VideoSource/GlobalSceneChange/RecordingService")
146 async def async_parse_scene_change(uid: str, msg) -> Event | None:
147  """Handle parsing event message.
148 
149  Topic: tns1:VideoSource/GlobalSceneChange/*
150  """
151  try:
152  topic, payload = extract_message(msg)
153  source = payload.Source.SimpleItem[0].Value
154  return Event(
155  f"{uid}_{topic}_{source}",
156  "Global Scene Change",
157  "binary_sensor",
158  "problem",
159  None,
160  payload.Data.SimpleItem[0].Value == "true",
161  )
162  except (AttributeError, KeyError):
163  return None
164 
165 
166 @PARSERS.register("tns1:AudioAnalytics/Audio/DetectedSound")
167 async def async_parse_detected_sound(uid: str, msg) -> Event | None:
168  """Handle parsing event message.
169 
170  Topic: tns1:AudioAnalytics/Audio/DetectedSound
171  """
172  try:
173  audio_source = ""
174  audio_analytics = ""
175  rule = ""
176  topic, payload = extract_message(msg)
177  for source in payload.Source.SimpleItem:
178  if source.Name == "AudioSourceConfigurationToken":
179  audio_source = source.Value
180  if source.Name == "AudioAnalyticsConfigurationToken":
181  audio_analytics = source.Value
182  if source.Name == "Rule":
183  rule = source.Value
184 
185  return Event(
186  f"{uid}_{topic}_{audio_source}_{audio_analytics}_{rule}",
187  "Detected Sound",
188  "binary_sensor",
189  "sound",
190  None,
191  payload.Data.SimpleItem[0].Value == "true",
192  )
193  except (AttributeError, KeyError):
194  return None
195 
196 
197 @PARSERS.register("tns1:RuleEngine/FieldDetector/ObjectsInside")
198 async def async_parse_field_detector(uid: str, msg) -> Event | None:
199  """Handle parsing event message.
200 
201  Topic: tns1:RuleEngine/FieldDetector/ObjectsInside
202  """
203  try:
204  video_source = ""
205  video_analytics = ""
206  rule = ""
207  topic, payload = extract_message(msg)
208  for source in payload.Source.SimpleItem:
209  if source.Name == "VideoSourceConfigurationToken":
210  video_source = _normalize_video_source(source.Value)
211  if source.Name == "VideoAnalyticsConfigurationToken":
212  video_analytics = source.Value
213  if source.Name == "Rule":
214  rule = source.Value
215 
216  evt = Event(
217  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
218  "Field Detection",
219  "binary_sensor",
220  "motion",
221  None,
222  payload.Data.SimpleItem[0].Value == "true",
223  )
224  except (AttributeError, KeyError):
225  return None
226  return evt
227 
228 
229 @PARSERS.register("tns1:RuleEngine/CellMotionDetector/Motion")
230 async def async_parse_cell_motion_detector(uid: str, msg) -> Event | None:
231  """Handle parsing event message.
232 
233  Topic: tns1:RuleEngine/CellMotionDetector/Motion
234  """
235  try:
236  video_source = ""
237  video_analytics = ""
238  rule = ""
239  topic, payload = extract_message(msg)
240  for source in payload.Source.SimpleItem:
241  if source.Name == "VideoSourceConfigurationToken":
242  video_source = _normalize_video_source(source.Value)
243  if source.Name == "VideoAnalyticsConfigurationToken":
244  video_analytics = source.Value
245  if source.Name == "Rule":
246  rule = source.Value
247 
248  return Event(
249  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
250  "Cell Motion Detection",
251  "binary_sensor",
252  "motion",
253  None,
254  payload.Data.SimpleItem[0].Value == "true",
255  )
256  except (AttributeError, KeyError):
257  return None
258 
259 
260 @PARSERS.register("tns1:RuleEngine/MotionRegionDetector/Motion")
261 async def async_parse_motion_region_detector(uid: str, msg) -> Event | None:
262  """Handle parsing event message.
263 
264  Topic: tns1:RuleEngine/MotionRegionDetector/Motion
265  """
266  try:
267  video_source = ""
268  video_analytics = ""
269  rule = ""
270  topic, payload = extract_message(msg)
271  for source in payload.Source.SimpleItem:
272  if source.Name == "VideoSourceConfigurationToken":
273  video_source = _normalize_video_source(source.Value)
274  if source.Name == "VideoAnalyticsConfigurationToken":
275  video_analytics = source.Value
276  if source.Name == "Rule":
277  rule = source.Value
278 
279  return Event(
280  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
281  "Motion Region Detection",
282  "binary_sensor",
283  "motion",
284  None,
285  payload.Data.SimpleItem[0].Value in ["1", "true"],
286  )
287  except (AttributeError, KeyError):
288  return None
289 
290 
291 @PARSERS.register("tns1:RuleEngine/TamperDetector/Tamper")
292 async def async_parse_tamper_detector(uid: str, msg) -> Event | None:
293  """Handle parsing event message.
294 
295  Topic: tns1:RuleEngine/TamperDetector/Tamper
296  """
297  try:
298  video_source = ""
299  video_analytics = ""
300  rule = ""
301  topic, payload = extract_message(msg)
302  for source in payload.Source.SimpleItem:
303  if source.Name == "VideoSourceConfigurationToken":
304  video_source = _normalize_video_source(source.Value)
305  if source.Name == "VideoAnalyticsConfigurationToken":
306  video_analytics = source.Value
307  if source.Name == "Rule":
308  rule = source.Value
309 
310  return Event(
311  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
312  "Tamper Detection",
313  "binary_sensor",
314  "problem",
315  None,
316  payload.Data.SimpleItem[0].Value == "true",
317  EntityCategory.DIAGNOSTIC,
318  )
319  except (AttributeError, KeyError):
320  return None
321 
322 
323 @PARSERS.register("tns1:RuleEngine/MyRuleDetector/DogCatDetect")
324 async def async_parse_dog_cat_detector(uid: str, msg) -> Event | None:
325  """Handle parsing event message.
326 
327  Topic: tns1:RuleEngine/MyRuleDetector/DogCatDetect
328  """
329  try:
330  video_source = ""
331  topic, payload = extract_message(msg)
332  for source in payload.Source.SimpleItem:
333  if source.Name == "Source":
334  video_source = _normalize_video_source(source.Value)
335 
336  return Event(
337  f"{uid}_{topic}_{video_source}",
338  "Pet Detection",
339  "binary_sensor",
340  "motion",
341  None,
342  payload.Data.SimpleItem[0].Value == "true",
343  )
344  except (AttributeError, KeyError):
345  return None
346 
347 
348 @PARSERS.register("tns1:RuleEngine/MyRuleDetector/VehicleDetect")
349 async def async_parse_vehicle_detector(uid: str, msg) -> Event | None:
350  """Handle parsing event message.
351 
352  Topic: tns1:RuleEngine/MyRuleDetector/VehicleDetect
353  """
354  try:
355  video_source = ""
356  topic, payload = extract_message(msg)
357  for source in payload.Source.SimpleItem:
358  if source.Name == "Source":
359  video_source = _normalize_video_source(source.Value)
360 
361  return Event(
362  f"{uid}_{topic}_{video_source}",
363  "Vehicle Detection",
364  "binary_sensor",
365  "motion",
366  None,
367  payload.Data.SimpleItem[0].Value == "true",
368  )
369  except (AttributeError, KeyError):
370  return None
371 
372 
373 @PARSERS.register("tns1:RuleEngine/MyRuleDetector/PeopleDetect")
374 async def async_parse_person_detector(uid: str, msg) -> Event | None:
375  """Handle parsing event message.
376 
377  Topic: tns1:RuleEngine/MyRuleDetector/PeopleDetect
378  """
379  try:
380  video_source = ""
381  topic, payload = extract_message(msg)
382  for source in payload.Source.SimpleItem:
383  if source.Name == "Source":
384  video_source = _normalize_video_source(source.Value)
385 
386  return Event(
387  f"{uid}_{topic}_{video_source}",
388  "Person Detection",
389  "binary_sensor",
390  "motion",
391  None,
392  payload.Data.SimpleItem[0].Value == "true",
393  )
394  except (AttributeError, KeyError):
395  return None
396 
397 
398 @PARSERS.register("tns1:RuleEngine/MyRuleDetector/FaceDetect")
399 async def async_parse_face_detector(uid: str, msg) -> Event | None:
400  """Handle parsing event message.
401 
402  Topic: tns1:RuleEngine/MyRuleDetector/FaceDetect
403  """
404  try:
405  video_source = ""
406  topic, payload = extract_message(msg)
407  for source in payload.Source.SimpleItem:
408  if source.Name == "Source":
409  video_source = _normalize_video_source(source.Value)
410 
411  return Event(
412  f"{uid}_{topic}_{video_source}",
413  "Face Detection",
414  "binary_sensor",
415  "motion",
416  None,
417  payload.Data.SimpleItem[0].Value == "true",
418  )
419  except (AttributeError, KeyError):
420  return None
421 
422 
423 @PARSERS.register("tns1:RuleEngine/MyRuleDetector/Visitor")
424 async def async_parse_visitor_detector(uid: str, msg) -> Event | None:
425  """Handle parsing event message.
426 
427  Topic: tns1:RuleEngine/MyRuleDetector/Visitor
428  """
429  try:
430  video_source = ""
431  topic, payload = extract_message(msg)
432  for source in payload.Source.SimpleItem:
433  if source.Name == "Source":
434  video_source = _normalize_video_source(source.Value)
435 
436  return Event(
437  f"{uid}_{topic}_{video_source}",
438  "Visitor Detection",
439  "binary_sensor",
440  "occupancy",
441  None,
442  payload.Data.SimpleItem[0].Value == "true",
443  )
444  except (AttributeError, KeyError):
445  return None
446 
447 
448 @PARSERS.register("tns1:Device/Trigger/DigitalInput")
449 async def async_parse_digital_input(uid: str, msg) -> Event | None:
450  """Handle parsing event message.
451 
452  Topic: tns1:Device/Trigger/DigitalInput
453  """
454  try:
455  topic, payload = extract_message(msg)
456  source = payload.Source.SimpleItem[0].Value
457  return Event(
458  f"{uid}_{topic}_{source}",
459  "Digital Input",
460  "binary_sensor",
461  None,
462  None,
463  payload.Data.SimpleItem[0].Value == "true",
464  )
465  except (AttributeError, KeyError):
466  return None
467 
468 
469 @PARSERS.register("tns1:Device/Trigger/Relay")
470 async def async_parse_relay(uid: str, msg) -> Event | None:
471  """Handle parsing event message.
472 
473  Topic: tns1:Device/Trigger/Relay
474  """
475  try:
476  topic, payload = extract_message(msg)
477  source = payload.Source.SimpleItem[0].Value
478  return Event(
479  f"{uid}_{topic}_{source}",
480  "Relay Triggered",
481  "binary_sensor",
482  None,
483  None,
484  payload.Data.SimpleItem[0].Value == "active",
485  )
486  except (AttributeError, KeyError):
487  return None
488 
489 
490 @PARSERS.register("tns1:Device/HardwareFailure/StorageFailure")
491 async def async_parse_storage_failure(uid: str, msg) -> Event | None:
492  """Handle parsing event message.
493 
494  Topic: tns1:Device/HardwareFailure/StorageFailure
495  """
496  try:
497  topic, payload = extract_message(msg)
498  source = payload.Source.SimpleItem[0].Value
499  return Event(
500  f"{uid}_{topic}_{source}",
501  "Storage Failure",
502  "binary_sensor",
503  "problem",
504  None,
505  payload.Data.SimpleItem[0].Value == "true",
506  EntityCategory.DIAGNOSTIC,
507  )
508  except (AttributeError, KeyError):
509  return None
510 
511 
512 @PARSERS.register("tns1:Monitoring/ProcessorUsage")
513 async def async_parse_processor_usage(uid: str, msg) -> Event | None:
514  """Handle parsing event message.
515 
516  Topic: tns1:Monitoring/ProcessorUsage
517  """
518  try:
519  topic, payload = extract_message(msg)
520  usage = float(payload.Data.SimpleItem[0].Value)
521  if usage <= 1:
522  usage *= 100
523 
524  return Event(
525  f"{uid}_{topic}",
526  "Processor Usage",
527  "sensor",
528  None,
529  "percent",
530  int(usage),
531  EntityCategory.DIAGNOSTIC,
532  )
533  except (AttributeError, KeyError):
534  return None
535 
536 
537 @PARSERS.register("tns1:Monitoring/OperatingTime/LastReboot")
538 async def async_parse_last_reboot(uid: str, msg) -> Event | None:
539  """Handle parsing event message.
540 
541  Topic: tns1:Monitoring/OperatingTime/LastReboot
542  """
543  try:
544  topic, payload = extract_message(msg)
545  date_time = local_datetime_or_none(payload.Data.SimpleItem[0].Value)
546  return Event(
547  f"{uid}_{topic}",
548  "Last Reboot",
549  "sensor",
550  "timestamp",
551  None,
552  date_time,
553  EntityCategory.DIAGNOSTIC,
554  )
555  except (AttributeError, KeyError):
556  return None
557 
558 
559 @PARSERS.register("tns1:Monitoring/OperatingTime/LastReset")
560 async def async_parse_last_reset(uid: str, msg) -> Event | None:
561  """Handle parsing event message.
562 
563  Topic: tns1:Monitoring/OperatingTime/LastReset
564  """
565  try:
566  topic, payload = extract_message(msg)
567  date_time = local_datetime_or_none(payload.Data.SimpleItem[0].Value)
568  return Event(
569  f"{uid}_{topic}",
570  "Last Reset",
571  "sensor",
572  "timestamp",
573  None,
574  date_time,
575  EntityCategory.DIAGNOSTIC,
576  entity_enabled=False,
577  )
578  except (AttributeError, KeyError):
579  return None
580 
581 
582 @PARSERS.register("tns1:Monitoring/Backup/Last")
583 async def async_parse_backup_last(uid: str, msg) -> Event | None:
584  """Handle parsing event message.
585 
586  Topic: tns1:Monitoring/Backup/Last
587  """
588 
589  try:
590  topic, payload = extract_message(msg)
591  date_time = local_datetime_or_none(payload.Data.SimpleItem[0].Value)
592  return Event(
593  f"{uid}_{topic}",
594  "Last Backup",
595  "sensor",
596  "timestamp",
597  None,
598  date_time,
599  EntityCategory.DIAGNOSTIC,
600  entity_enabled=False,
601  )
602  except (AttributeError, KeyError):
603  return None
604 
605 
606 @PARSERS.register("tns1:Monitoring/OperatingTime/LastClockSynchronization")
607 async def async_parse_last_clock_sync(uid: str, msg) -> Event | None:
608  """Handle parsing event message.
609 
610  Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization
611  """
612  try:
613  topic, payload = extract_message(msg)
614  date_time = local_datetime_or_none(payload.Data.SimpleItem[0].Value)
615  return Event(
616  f"{uid}_{topic}",
617  "Last Clock Synchronization",
618  "sensor",
619  "timestamp",
620  None,
621  date_time,
622  EntityCategory.DIAGNOSTIC,
623  entity_enabled=False,
624  )
625  except (AttributeError, KeyError):
626  return None
627 
628 
629 @PARSERS.register("tns1:RecordingConfig/JobState")
630 async def async_parse_jobstate(uid: str, msg) -> Event | None:
631  """Handle parsing event message.
632 
633  Topic: tns1:RecordingConfig/JobState
634  """
635 
636  try:
637  topic, payload = extract_message(msg)
638  source = payload.Source.SimpleItem[0].Value
639  return Event(
640  f"{uid}_{topic}_{source}",
641  "Recording Job State",
642  "binary_sensor",
643  None,
644  None,
645  payload.Data.SimpleItem[0].Value == "Active",
646  EntityCategory.DIAGNOSTIC,
647  )
648  except (AttributeError, KeyError):
649  return None
650 
651 
652 @PARSERS.register("tns1:RuleEngine/LineDetector/Crossed")
653 async def async_parse_linedetector_crossed(uid: str, msg) -> Event | None:
654  """Handle parsing event message.
655 
656  Topic: tns1:RuleEngine/LineDetector/Crossed
657  """
658  try:
659  video_source = ""
660  video_analytics = ""
661  rule = ""
662  topic, payload = extract_message(msg)
663  for source in payload.Source.SimpleItem:
664  if source.Name == "VideoSourceConfigurationToken":
665  video_source = source.Value
666  if source.Name == "VideoAnalyticsConfigurationToken":
667  video_analytics = source.Value
668  if source.Name == "Rule":
669  rule = source.Value
670 
671  return Event(
672  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
673  "Line Detector Crossed",
674  "sensor",
675  None,
676  None,
677  payload.Data.SimpleItem[0].Value,
678  EntityCategory.DIAGNOSTIC,
679  )
680  except (AttributeError, KeyError):
681  return None
682 
683 
684 @PARSERS.register("tns1:RuleEngine/CountAggregation/Counter")
685 async def async_parse_count_aggregation_counter(uid: str, msg) -> Event | None:
686  """Handle parsing event message.
687 
688  Topic: tns1:RuleEngine/CountAggregation/Counter
689  """
690  try:
691  video_source = ""
692  video_analytics = ""
693  rule = ""
694  topic, payload = extract_message(msg)
695  for source in payload.Source.SimpleItem:
696  if source.Name == "VideoSourceConfigurationToken":
697  video_source = _normalize_video_source(source.Value)
698  if source.Name == "VideoAnalyticsConfigurationToken":
699  video_analytics = source.Value
700  if source.Name == "Rule":
701  rule = source.Value
702 
703  return Event(
704  f"{uid}_{topic}_{video_source}_{video_analytics}_{rule}",
705  "Count Aggregation Counter",
706  "sensor",
707  None,
708  None,
709  payload.Data.SimpleItem[0].Value,
710  EntityCategory.DIAGNOSTIC,
711  )
712  except (AttributeError, KeyError):
713  return None
714 
715 
716 @PARSERS.register("tns1:UserAlarm/IVA/HumanShapeDetect")
717 async def async_parse_human_shape_detect(uid: str, msg) -> Event | None:
718  """Handle parsing event message.
719 
720  Topic: tns1:UserAlarm/IVA/HumanShapeDetect
721  """
722  try:
723  topic, payload = extract_message(msg)
724  video_source = ""
725  for source in payload.Source.SimpleItem:
726  if source.Name == "VideoSourceConfigurationToken":
727  video_source = _normalize_video_source(source.Value)
728  break
729 
730  return Event(
731  f"{uid}_{topic}_{video_source}",
732  "Human Shape Detect",
733  "binary_sensor",
734  "motion",
735  None,
736  payload.Data.SimpleItem[0].Value == "true",
737  )
738  except (AttributeError, KeyError):
739  return None
tuple[str, Any] extract_message(Any msg)
Definition: parsers.py:24
Event|None async_parse_last_reset(str uid, msg)
Definition: parsers.py:560
Event|None async_parse_linedetector_crossed(str uid, msg)
Definition: parsers.py:653
Event|None async_parse_image_too_dark(str uid, msg)
Definition: parsers.py:98
Event|None async_parse_visitor_detector(str uid, msg)
Definition: parsers.py:424
Event|None async_parse_count_aggregation_counter(str uid, msg)
Definition: parsers.py:685
Event|None async_parse_detected_sound(str uid, msg)
Definition: parsers.py:167
Event|None async_parse_jobstate(str uid, msg)
Definition: parsers.py:630
Event|None async_parse_relay(str uid, msg)
Definition: parsers.py:470
Event|None async_parse_cell_motion_detector(str uid, msg)
Definition: parsers.py:230
Event|None async_parse_digital_input(str uid, msg)
Definition: parsers.py:449
Event|None async_parse_vehicle_detector(str uid, msg)
Definition: parsers.py:349
Event|None async_parse_last_clock_sync(str uid, msg)
Definition: parsers.py:607
Event|None async_parse_face_detector(str uid, msg)
Definition: parsers.py:399
Event|None async_parse_tamper_detector(str uid, msg)
Definition: parsers.py:292
Event|None async_parse_human_shape_detect(str uid, msg)
Definition: parsers.py:717
Event|None async_parse_storage_failure(str uid, msg)
Definition: parsers.py:491
Event|None async_parse_dog_cat_detector(str uid, msg)
Definition: parsers.py:324
Event|None async_parse_person_detector(str uid, msg)
Definition: parsers.py:374
Event|None async_parse_field_detector(str uid, msg)
Definition: parsers.py:198
Event|None async_parse_processor_usage(str uid, msg)
Definition: parsers.py:513
Event|None async_parse_image_too_blurry(str uid, msg)
Definition: parsers.py:74
datetime.datetime|None local_datetime_or_none(str value)
Definition: parsers.py:38
Event|None async_parse_scene_change(str uid, msg)
Definition: parsers.py:146
Event|None async_parse_motion_alarm(str uid, msg)
Definition: parsers.py:51
Event|None async_parse_last_reboot(str uid, msg)
Definition: parsers.py:538
Event|None async_parse_motion_region_detector(str uid, msg)
Definition: parsers.py:261
Event|None async_parse_backup_last(str uid, msg)
Definition: parsers.py:583
str _normalize_video_source(str source)
Definition: parsers.py:29
Event|None async_parse_image_too_bright(str uid, msg)
Definition: parsers.py:122