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."""
|
"""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,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue