Fix handling of illegal dates in onvif sensor (#73600)

* Fix handling of illegal dates in onvif sensor

* Address review comment

* Address review comment
This commit is contained in:
Erik Montnemery 2022-06-20 08:52:37 +02:00 committed by GitHub
parent 57daeaa174
commit 2c936addd2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,4 +1,6 @@
"""ONVIF event parsers.""" """ONVIF event parsers."""
from __future__ import annotations
from collections.abc import Callable, Coroutine from collections.abc import Callable, Coroutine
import datetime import datetime
from typing import Any from typing import Any
@ -12,16 +14,16 @@ from .models import Event
PARSERS: Registry[str, Callable[[str, Any], Coroutine[Any, Any, Event]]] = Registry() PARSERS: Registry[str, Callable[[str, Any], Coroutine[Any, Any, Event]]] = Registry()
def datetime_or_zero(value: str) -> datetime: def local_datetime_or_none(value: str) -> datetime.datetime | None:
"""Convert strings to datetimes, if invalid, return datetime.min.""" """Convert strings to datetimes, if invalid, return None."""
# To handle cameras that return times like '0000-00-00T00:00:00Z' (e.g. hikvision) # To handle cameras that return times like '0000-00-00T00:00:00Z' (e.g. hikvision)
try: try:
ret = dt_util.parse_datetime(value) ret = dt_util.parse_datetime(value)
except ValueError: except ValueError:
return datetime.datetime.min return None
if ret is None: if ret is not None:
return datetime.datetime.min return dt_util.as_local(ret)
return ret return None
@PARSERS.register("tns1:VideoSource/MotionAlarm") @PARSERS.register("tns1:VideoSource/MotionAlarm")
@ -394,14 +396,16 @@ async def async_parse_last_reboot(uid: str, msg) -> Event:
Topic: tns1:Monitoring/OperatingTime/LastReboot Topic: tns1:Monitoring/OperatingTime/LastReboot
""" """
try: try:
date_time = datetime_or_zero(msg.Message._value_1.Data.SimpleItem[0].Value) date_time = local_datetime_or_none(
msg.Message._value_1.Data.SimpleItem[0].Value
)
return Event( return Event(
f"{uid}_{msg.Topic._value_1}", f"{uid}_{msg.Topic._value_1}",
"Last Reboot", "Last Reboot",
"sensor", "sensor",
"timestamp", "timestamp",
None, None,
dt_util.as_local(date_time), date_time,
EntityCategory.DIAGNOSTIC, EntityCategory.DIAGNOSTIC,
) )
except (AttributeError, KeyError): except (AttributeError, KeyError):
@ -416,14 +420,16 @@ async def async_parse_last_reset(uid: str, msg) -> Event:
Topic: tns1:Monitoring/OperatingTime/LastReset Topic: tns1:Monitoring/OperatingTime/LastReset
""" """
try: try:
date_time = datetime_or_zero(msg.Message._value_1.Data.SimpleItem[0].Value) date_time = local_datetime_or_none(
msg.Message._value_1.Data.SimpleItem[0].Value
)
return Event( return Event(
f"{uid}_{msg.Topic._value_1}", f"{uid}_{msg.Topic._value_1}",
"Last Reset", "Last Reset",
"sensor", "sensor",
"timestamp", "timestamp",
None, None,
dt_util.as_local(date_time), date_time,
EntityCategory.DIAGNOSTIC, EntityCategory.DIAGNOSTIC,
entity_enabled=False, entity_enabled=False,
) )
@ -440,14 +446,16 @@ async def async_parse_backup_last(uid: str, msg) -> Event:
""" """
try: try:
date_time = datetime_or_zero(msg.Message._value_1.Data.SimpleItem[0].Value) date_time = local_datetime_or_none(
msg.Message._value_1.Data.SimpleItem[0].Value
)
return Event( return Event(
f"{uid}_{msg.Topic._value_1}", f"{uid}_{msg.Topic._value_1}",
"Last Backup", "Last Backup",
"sensor", "sensor",
"timestamp", "timestamp",
None, None,
dt_util.as_local(date_time), date_time,
EntityCategory.DIAGNOSTIC, EntityCategory.DIAGNOSTIC,
entity_enabled=False, entity_enabled=False,
) )
@ -463,14 +471,16 @@ async def async_parse_last_clock_sync(uid: str, msg) -> Event:
Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization Topic: tns1:Monitoring/OperatingTime/LastClockSynchronization
""" """
try: try:
date_time = datetime_or_zero(msg.Message._value_1.Data.SimpleItem[0].Value) date_time = local_datetime_or_none(
msg.Message._value_1.Data.SimpleItem[0].Value
)
return Event( return Event(
f"{uid}_{msg.Topic._value_1}", f"{uid}_{msg.Topic._value_1}",
"Last Clock Synchronization", "Last Clock Synchronization",
"sensor", "sensor",
"timestamp", "timestamp",
None, None,
dt_util.as_local(date_time), date_time,
EntityCategory.DIAGNOSTIC, EntityCategory.DIAGNOSTIC,
entity_enabled=False, entity_enabled=False,
) )