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