412 lines
13 KiB
Python
412 lines
13 KiB
Python
"""ONVIF event parsers."""
|
|
from homeassistant.util import dt as dt_util
|
|
from homeassistant.util.decorator import Registry
|
|
|
|
from .models import Event
|
|
|
|
PARSERS = Registry()
|
|
|
|
|
|
@PARSERS.register("tns1:VideoSource/MotionAlarm")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_motion_alarm(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:VideoSource/MotionAlarm
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} Motion Alarm",
|
|
"binary_sensor",
|
|
"motion",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBlurry/AnalyticsService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBlurry/ImagingService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBlurry/RecordingService")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_image_too_blurry(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:VideoSource/ImageTooBlurry/*
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} Image Too Blurry",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:VideoSource/ImageTooDark/AnalyticsService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooDark/ImagingService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooDark/RecordingService")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_image_too_dark(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:VideoSource/ImageTooDark/*
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} Image Too Dark",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBright/AnalyticsService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBright/ImagingService")
|
|
@PARSERS.register("tns1:VideoSource/ImageTooBright/RecordingService")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_image_too_bright(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:VideoSource/ImageTooBright/*
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} Image Too Bright",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:VideoSource/GlobalSceneChange/AnalyticsService")
|
|
@PARSERS.register("tns1:VideoSource/GlobalSceneChange/ImagingService")
|
|
@PARSERS.register("tns1:VideoSource/GlobalSceneChange/RecordingService")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_scene_change(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:VideoSource/GlobalSceneChange/*
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} Global Scene Change",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:AudioAnalytics/Audio/DetectedSound")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_detected_sound(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:AudioAnalytics/Audio/DetectedSound
|
|
"""
|
|
try:
|
|
audio_source = ""
|
|
audio_analytics = ""
|
|
rule = ""
|
|
for source in msg.Message._value_1.Source.SimpleItem:
|
|
if source.Name == "AudioSourceConfigurationToken":
|
|
audio_source = source.Value
|
|
if source.Name == "AudioAnalyticsConfigurationToken":
|
|
audio_analytics = source.Value
|
|
if source.Name == "Rule":
|
|
rule = source.Value
|
|
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{audio_source}_{audio_analytics}_{rule}",
|
|
f"{rule} Detected Sound",
|
|
"binary_sensor",
|
|
"sound",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:RuleEngine/FieldDetector/ObjectsInside")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_field_detector(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:RuleEngine/FieldDetector/ObjectsInside
|
|
"""
|
|
try:
|
|
video_source = ""
|
|
video_analytics = ""
|
|
rule = ""
|
|
for source in msg.Message._value_1.Source.SimpleItem:
|
|
if source.Name == "VideoSourceConfigurationToken":
|
|
video_source = source.Value
|
|
if source.Name == "VideoAnalyticsConfigurationToken":
|
|
video_analytics = source.Value
|
|
if source.Name == "Rule":
|
|
rule = source.Value
|
|
|
|
evt = Event(
|
|
f"{uid}_{msg.Topic._value_1}_{video_source}_{video_analytics}_{rule}",
|
|
f"{rule} Field Detection",
|
|
"binary_sensor",
|
|
"motion",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
return evt
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:RuleEngine/CellMotionDetector/Motion")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_cell_motion_detector(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:RuleEngine/CellMotionDetector/Motion
|
|
"""
|
|
try:
|
|
video_source = ""
|
|
video_analytics = ""
|
|
rule = ""
|
|
for source in msg.Message._value_1.Source.SimpleItem:
|
|
if source.Name == "VideoSourceConfigurationToken":
|
|
video_source = source.Value
|
|
if source.Name == "VideoAnalyticsConfigurationToken":
|
|
video_analytics = source.Value
|
|
if source.Name == "Rule":
|
|
rule = source.Value
|
|
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{video_source}_{video_analytics}_{rule}",
|
|
f"{rule} Cell Motion Detection",
|
|
"binary_sensor",
|
|
"motion",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:RuleEngine/MotionRegionDetector/Motion")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_motion_region_detector(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:RuleEngine/MotionRegionDetector/Motion
|
|
"""
|
|
try:
|
|
video_source = ""
|
|
video_analytics = ""
|
|
rule = ""
|
|
for source in msg.Message._value_1.Source.SimpleItem:
|
|
if source.Name == "VideoSourceConfigurationToken":
|
|
video_source = source.Value
|
|
if source.Name == "VideoAnalyticsConfigurationToken":
|
|
video_analytics = source.Value
|
|
if source.Name == "Rule":
|
|
rule = source.Value
|
|
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{video_source}_{video_analytics}_{rule}",
|
|
f"{rule} Motion Region Detection",
|
|
"binary_sensor",
|
|
"motion",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:RuleEngine/TamperDetector/Tamper")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_tamper_detector(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:RuleEngine/TamperDetector/Tamper
|
|
"""
|
|
try:
|
|
video_source = ""
|
|
video_analytics = ""
|
|
rule = ""
|
|
for source in msg.Message._value_1.Source.SimpleItem:
|
|
if source.Name == "VideoSourceConfigurationToken":
|
|
video_source = source.Value
|
|
if source.Name == "VideoAnalyticsConfigurationToken":
|
|
video_analytics = source.Value
|
|
if source.Name == "Rule":
|
|
rule = source.Value
|
|
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{video_source}_{video_analytics}_{rule}",
|
|
f"{rule} Tamper Detection",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:Device/HardwareFailure/StorageFailure")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_storage_failure(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:Device/HardwareFailure/StorageFailure
|
|
"""
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
"Storage Failure",
|
|
"binary_sensor",
|
|
"problem",
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "true",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:Monitoring/ProcessorUsage")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_processor_usage(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:Monitoring/ProcessorUsage
|
|
"""
|
|
try:
|
|
usage = float(msg.Message._value_1.Data.SimpleItem[0].Value)
|
|
if usage <= 1:
|
|
usage *= 100
|
|
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}",
|
|
"Processor Usage",
|
|
"sensor",
|
|
None,
|
|
"percent",
|
|
int(usage),
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:Monitoring/OperatingTime/LastReboot")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_last_reboot(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:Monitoring/OperatingTime/LastReboot
|
|
"""
|
|
try:
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}",
|
|
"Last Reboot",
|
|
"sensor",
|
|
"timestamp",
|
|
None,
|
|
dt_util.as_local(
|
|
dt_util.parse_datetime(msg.Message._value_1.Data.SimpleItem[0].Value)
|
|
),
|
|
)
|
|
except (AttributeError, KeyError, ValueError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:Monitoring/OperatingTime/LastReset")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_last_reset(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:Monitoring/OperatingTime/LastReset
|
|
"""
|
|
try:
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}",
|
|
"Last Reset",
|
|
"sensor",
|
|
"timestamp",
|
|
None,
|
|
dt_util.as_local(
|
|
dt_util.parse_datetime(msg.Message._value_1.Data.SimpleItem[0].Value)
|
|
),
|
|
entity_enabled=False,
|
|
)
|
|
except (AttributeError, KeyError, ValueError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:Monitoring/OperatingTime/LastClockSynchronization")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_last_clock_sync(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization
|
|
"""
|
|
try:
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}",
|
|
"Last Clock Synchronization",
|
|
"sensor",
|
|
"timestamp",
|
|
None,
|
|
dt_util.as_local(
|
|
dt_util.parse_datetime(msg.Message._value_1.Data.SimpleItem[0].Value)
|
|
),
|
|
entity_enabled=False,
|
|
)
|
|
except (AttributeError, KeyError, ValueError):
|
|
return None
|
|
|
|
|
|
@PARSERS.register("tns1:RecordingConfig/JobState")
|
|
# pylint: disable=protected-access
|
|
async def async_parse_jobstate(uid: str, msg) -> Event:
|
|
"""Handle parsing event message.
|
|
|
|
Topic: tns1:RecordingConfig/JobState*
|
|
"""
|
|
|
|
try:
|
|
source = msg.Message._value_1.Source.SimpleItem[0].Value
|
|
return Event(
|
|
f"{uid}_{msg.Topic._value_1}_{source}",
|
|
f"{source} JobState",
|
|
"binary_sensor",
|
|
None,
|
|
None,
|
|
msg.Message._value_1.Data.SimpleItem[0].Value == "Active",
|
|
)
|
|
except (AttributeError, KeyError):
|
|
return None
|