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:
parent
57daeaa174
commit
2c936addd2
1 changed files with 24 additions and 14 deletions
|
@ -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,
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue