From 2c936addd2470e7e6c67e6d78500fcb3babe0ec8 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 20 Jun 2022 08:52:37 +0200 Subject: [PATCH] Fix handling of illegal dates in onvif sensor (#73600) * Fix handling of illegal dates in onvif sensor * Address review comment * Address review comment --- homeassistant/components/onvif/parsers.py | 38 ++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/onvif/parsers.py b/homeassistant/components/onvif/parsers.py index 5141f25cbef..87b901d2c52 100644 --- a/homeassistant/components/onvif/parsers.py +++ b/homeassistant/components/onvif/parsers.py @@ -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, )