From 0147108b89b6a45f1d3887239a5688b3f05cfad3 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Thu, 28 Sep 2023 09:13:33 +0200 Subject: [PATCH] Fix onvif creating a new entity for every new event (#101035) Use topic value as topic --- homeassistant/components/onvif/parsers.py | 224 ++++++++++++---------- 1 file changed, 125 insertions(+), 99 deletions(-) diff --git a/homeassistant/components/onvif/parsers.py b/homeassistant/components/onvif/parsers.py index 3f405767c54..6185adb70a1 100644 --- a/homeassistant/components/onvif/parsers.py +++ b/homeassistant/components/onvif/parsers.py @@ -48,15 +48,16 @@ async def async_parse_motion_alarm(uid: str, msg) -> Event | None: Topic: tns1:VideoSource/MotionAlarm """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Motion Alarm", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -71,15 +72,16 @@ async def async_parse_image_too_blurry(uid: str, msg) -> Event | None: Topic: tns1:VideoSource/ImageTooBlurry/* """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Image Too Blurry", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -95,15 +97,16 @@ async def async_parse_image_too_dark(uid: str, msg) -> Event | None: Topic: tns1:VideoSource/ImageTooDark/* """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Image Too Dark", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -119,15 +122,16 @@ async def async_parse_image_too_bright(uid: str, msg) -> Event | None: Topic: tns1:VideoSource/ImageTooBright/* """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Image Too Bright", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -143,15 +147,16 @@ async def async_parse_scene_change(uid: str, msg) -> Event | None: Topic: tns1:VideoSource/GlobalSceneChange/* """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Global Scene Change", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -167,8 +172,9 @@ async def async_parse_detected_sound(uid: str, msg) -> Event | None: audio_source = "" audio_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "AudioSourceConfigurationToken": audio_source = source.Value if source.Name == "AudioAnalyticsConfigurationToken": @@ -177,12 +183,12 @@ async def async_parse_detected_sound(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{audio_source}_{audio_analytics}_{rule}", + f"{uid}_{topic_value}_{audio_source}_{audio_analytics}_{rule}", "Detected Sound", "binary_sensor", "sound", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -198,8 +204,9 @@ async def async_parse_field_detector(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = _normalize_video_source(source.Value) if source.Name == "VideoAnalyticsConfigurationToken": @@ -208,12 +215,12 @@ async def async_parse_field_detector(uid: str, msg) -> Event | None: rule = source.Value evt = Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Field Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) return evt except (AttributeError, KeyError): @@ -230,8 +237,9 @@ async def async_parse_cell_motion_detector(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = _normalize_video_source(source.Value) if source.Name == "VideoAnalyticsConfigurationToken": @@ -240,12 +248,12 @@ async def async_parse_cell_motion_detector(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Cell Motion Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -261,8 +269,9 @@ async def async_parse_motion_region_detector(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = _normalize_video_source(source.Value) if source.Name == "VideoAnalyticsConfigurationToken": @@ -271,12 +280,12 @@ async def async_parse_motion_region_detector(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Motion Region Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value in ["1", "true"], + message_value.Data.SimpleItem[0].Value in ["1", "true"], ) except (AttributeError, KeyError): return None @@ -292,8 +301,9 @@ async def async_parse_tamper_detector(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = _normalize_video_source(source.Value) if source.Name == "VideoAnalyticsConfigurationToken": @@ -302,12 +312,12 @@ async def async_parse_tamper_detector(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Tamper Detection", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -322,18 +332,19 @@ async def async_parse_dog_cat_detector(uid: str, msg) -> Event | None: """ try: video_source = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "Source": video_source = _normalize_video_source(source.Value) return Event( - f"{uid}_{value_1}_{video_source}", + f"{uid}_{topic_value}_{video_source}", "Pet Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -347,18 +358,19 @@ async def async_parse_vehicle_detector(uid: str, msg) -> Event | None: """ try: video_source = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "Source": video_source = _normalize_video_source(source.Value) return Event( - f"{uid}_{value_1}_{video_source}", + f"{uid}_{topic_value}_{video_source}", "Vehicle Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -372,18 +384,19 @@ async def async_parse_person_detector(uid: str, msg) -> Event | None: """ try: video_source = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "Source": video_source = _normalize_video_source(source.Value) return Event( - f"{uid}_{value_1}_{video_source}", + f"{uid}_{topic_value}_{video_source}", "Person Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -397,18 +410,19 @@ async def async_parse_face_detector(uid: str, msg) -> Event | None: """ try: video_source = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "Source": video_source = _normalize_video_source(source.Value) return Event( - f"{uid}_{value_1}_{video_source}", + f"{uid}_{topic_value}_{video_source}", "Face Detection", "binary_sensor", "motion", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -422,18 +436,19 @@ async def async_parse_visitor_detector(uid: str, msg) -> Event | None: """ try: video_source = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "Source": video_source = _normalize_video_source(source.Value) return Event( - f"{uid}_{value_1}_{video_source}", + f"{uid}_{topic_value}_{video_source}", "Visitor Detection", "binary_sensor", "occupancy", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -446,15 +461,16 @@ async def async_parse_digital_input(uid: str, msg) -> Event | None: Topic: tns1:Device/Trigger/DigitalInput """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Digital Input", "binary_sensor", None, None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", ) except (AttributeError, KeyError): return None @@ -467,15 +483,16 @@ async def async_parse_relay(uid: str, msg) -> Event | None: Topic: tns1:Device/Trigger/Relay """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Relay Triggered", "binary_sensor", None, None, - value_1.Data.SimpleItem[0].Value == "active", + message_value.Data.SimpleItem[0].Value == "active", ) except (AttributeError, KeyError): return None @@ -488,15 +505,16 @@ async def async_parse_storage_failure(uid: str, msg) -> Event | None: Topic: tns1:Device/HardwareFailure/StorageFailure """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Storage Failure", "binary_sensor", "problem", None, - value_1.Data.SimpleItem[0].Value == "true", + message_value.Data.SimpleItem[0].Value == "true", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -510,13 +528,14 @@ async def async_parse_processor_usage(uid: str, msg) -> Event | None: Topic: tns1:Monitoring/ProcessorUsage """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - usage = float(value_1.Data.SimpleItem[0].Value) + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + usage = float(message_value.Data.SimpleItem[0].Value) if usage <= 1: usage *= 100 return Event( - f"{uid}_{value_1}", + f"{uid}_{topic_value}", "Processor Usage", "sensor", None, @@ -535,10 +554,11 @@ async def async_parse_last_reboot(uid: str, msg) -> Event | None: Topic: tns1:Monitoring/OperatingTime/LastReboot """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - date_time = local_datetime_or_none(value_1.Data.SimpleItem[0].Value) + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + date_time = local_datetime_or_none(message_value.Data.SimpleItem[0].Value) return Event( - f"{uid}_{value_1}", + f"{uid}_{topic_value}", "Last Reboot", "sensor", "timestamp", @@ -557,10 +577,11 @@ async def async_parse_last_reset(uid: str, msg) -> Event | None: Topic: tns1:Monitoring/OperatingTime/LastReset """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - date_time = local_datetime_or_none(value_1.Data.SimpleItem[0].Value) + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + date_time = local_datetime_or_none(message_value.Data.SimpleItem[0].Value) return Event( - f"{uid}_{value_1}", + f"{uid}_{topic_value}", "Last Reset", "sensor", "timestamp", @@ -581,10 +602,11 @@ async def async_parse_backup_last(uid: str, msg) -> Event | None: """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - date_time = local_datetime_or_none(value_1.Data.SimpleItem[0].Value) + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + date_time = local_datetime_or_none(message_value.Data.SimpleItem[0].Value) return Event( - f"{uid}_{value_1}", + f"{uid}_{topic_value}", "Last Backup", "sensor", "timestamp", @@ -604,10 +626,11 @@ async def async_parse_last_clock_sync(uid: str, msg) -> Event | None: Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - date_time = local_datetime_or_none(value_1.Data.SimpleItem[0].Value) + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + date_time = local_datetime_or_none(message_value.Data.SimpleItem[0].Value) return Event( - f"{uid}_{value_1}", + f"{uid}_{topic_value}", "Last Clock Synchronization", "sensor", "timestamp", @@ -628,15 +651,16 @@ async def async_parse_jobstate(uid: str, msg) -> Event | None: """ try: - value_1 = msg.Message._value_1 # pylint: disable=protected-access - source = value_1.Source.SimpleItem[0].Value + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + source = message_value.Source.SimpleItem[0].Value return Event( - f"{uid}_{value_1}_{source}", + f"{uid}_{topic_value}_{source}", "Recording Job State", "binary_sensor", None, None, - value_1.Data.SimpleItem[0].Value == "Active", + message_value.Data.SimpleItem[0].Value == "Active", EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -653,8 +677,9 @@ async def async_parse_linedetector_crossed(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = source.Value if source.Name == "VideoAnalyticsConfigurationToken": @@ -663,12 +688,12 @@ async def async_parse_linedetector_crossed(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Line Detector Crossed", "sensor", None, None, - value_1.Data.SimpleItem[0].Value, + message_value.Data.SimpleItem[0].Value, EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError): @@ -685,8 +710,9 @@ async def async_parse_count_aggregation_counter(uid: str, msg) -> Event | None: video_source = "" video_analytics = "" rule = "" - value_1 = msg.Message._value_1 # pylint: disable=protected-access - for source in value_1.Source.SimpleItem: + message_value = msg.Message._value_1 # pylint: disable=protected-access + topic_value = msg.Topic._value_1 # pylint: disable=protected-access + for source in message_value.Source.SimpleItem: if source.Name == "VideoSourceConfigurationToken": video_source = _normalize_video_source(source.Value) if source.Name == "VideoAnalyticsConfigurationToken": @@ -695,12 +721,12 @@ async def async_parse_count_aggregation_counter(uid: str, msg) -> Event | None: rule = source.Value return Event( - f"{uid}_{value_1}_{video_source}_{video_analytics}_{rule}", + f"{uid}_{topic_value}_{video_source}_{video_analytics}_{rule}", "Count Aggregation Counter", "sensor", None, None, - value_1.Data.SimpleItem[0].Value, + message_value.Data.SimpleItem[0].Value, EntityCategory.DIAGNOSTIC, ) except (AttributeError, KeyError):