Cache zoneinfo for smart devices (#1156)

This commit is contained in:
Steven B.
2024-10-08 12:21:01 +01:00
committed by GitHub
parent 9641edcbc0
commit 7c1686d3ae
3 changed files with 45 additions and 32 deletions

View File

@@ -6,8 +6,9 @@ from datetime import datetime, timedelta, timezone, tzinfo
from time import mktime
from typing import cast
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
from zoneinfo import ZoneInfoNotFoundError
from ...cachedzoneinfo import CachedZoneInfo
from ...feature import Feature
from ..smartmodule import SmartModule
@@ -18,6 +19,8 @@ class Time(SmartModule):
REQUIRED_COMPONENT = "time"
QUERY_GETTER_NAME = "get_device_time"
_timezone: tzinfo = timezone.utc
def _initialize_features(self):
"""Initialize features after the initial update."""
self._add_feature(
@@ -32,21 +35,25 @@ class Time(SmartModule):
)
)
@property
def timezone(self) -> tzinfo:
"""Return current timezone."""
async def _post_update_hook(self):
"""Perform actions after a device update."""
td = timedelta(minutes=cast(float, self.data.get("time_diff")))
if region := self.data.get("region"):
try:
# Zoneinfo will return a DST aware object
tz: tzinfo = ZoneInfo(region)
tz: tzinfo = await CachedZoneInfo.get_cached_zone_info(region)
except ZoneInfoNotFoundError:
tz = timezone(td, region)
else:
# in case the device returns a blank region this will result in the
# tzname being a UTC offset
tz = timezone(td)
return tz
self._timezone = tz
@property
def timezone(self) -> tzinfo:
"""Return current timezone."""
return self._timezone
@property
def time(self) -> datetime: