python-kasa/kasa/iot/modules/time.py
Steven B. bd5a24b0ed
Use tzinfo in time constructor instead of astime for iot devices (#1158)
Fixes using `astime` on a non tzinfo aware object which causes issues with daylight saving.
2024-10-08 12:33:19 +01:00

67 lines
1.7 KiB
Python

"""Provides the current time and timezone information."""
from __future__ import annotations
from datetime import datetime, timezone, tzinfo
from ...exceptions import KasaException
from ..iotmodule import IotModule, merge
from ..iottimezone import get_timezone
class Time(IotModule):
"""Implements the timezone settings."""
_timezone: tzinfo = timezone.utc
def query(self):
"""Request time and timezone."""
q = self.query_for_command("get_time")
merge(q, self.query_for_command("get_timezone"))
return q
async def _post_update_hook(self):
"""Perform actions after a device update."""
if res := self.data.get("get_timezone"):
self._timezone = await get_timezone(res.get("index"))
@property
def time(self) -> datetime:
"""Return current device time."""
res = self.data["get_time"]
time = datetime(
res["year"],
res["month"],
res["mday"],
res["hour"],
res["min"],
res["sec"],
tzinfo=self.timezone,
)
return time
@property
def timezone(self) -> tzinfo:
"""Return current timezone."""
return self._timezone
async def get_time(self):
"""Return current device time."""
try:
res = await self.call("get_time")
return datetime(
res["year"],
res["month"],
res["mday"],
res["hour"],
res["min"],
res["sec"],
)
except KasaException:
return None
async def get_timezone(self):
"""Request timezone information from the device."""
return await self.call("get_timezone")