mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-23 11:43:34 +00:00
867b7b8830
Allows setting the device time (on SMART devices) to the current time. Fixes also setting the time which was previously broken.
64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
"""Implementation of time module."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta, timezone
|
|
from time import mktime
|
|
from typing import TYPE_CHECKING, cast
|
|
|
|
from ...feature import Feature
|
|
from ..smartmodule import SmartModule
|
|
|
|
if TYPE_CHECKING:
|
|
from ..smartdevice import SmartDevice
|
|
|
|
|
|
class Time(SmartModule):
|
|
"""Implementation of device_local_time."""
|
|
|
|
REQUIRED_COMPONENT = "time"
|
|
QUERY_GETTER_NAME = "get_device_time"
|
|
|
|
def __init__(self, device: SmartDevice, module: str):
|
|
super().__init__(device, module)
|
|
|
|
self._add_feature(
|
|
Feature(
|
|
device=device,
|
|
id="time",
|
|
name="Time",
|
|
attribute_getter="time",
|
|
container=self,
|
|
category=Feature.Category.Debug,
|
|
)
|
|
)
|
|
|
|
@property
|
|
def time(self) -> datetime:
|
|
"""Return device's current datetime."""
|
|
td = timedelta(minutes=cast(float, self.data.get("time_diff")))
|
|
if self.data.get("region"):
|
|
tz = timezone(td, str(self.data.get("region")))
|
|
else:
|
|
# in case the device returns a blank region this will result in the
|
|
# tzname being a UTC offset
|
|
tz = timezone(td)
|
|
return datetime.fromtimestamp(
|
|
cast(float, self.data.get("timestamp")),
|
|
tz=tz,
|
|
)
|
|
|
|
async def set_time(self, dt: datetime):
|
|
"""Set device time."""
|
|
unixtime = mktime(dt.timetuple())
|
|
offset = cast(timedelta, dt.utcoffset())
|
|
diff = offset / timedelta(minutes=1)
|
|
return await self.call(
|
|
"set_device_time",
|
|
{
|
|
"timestamp": int(unixtime),
|
|
"time_diff": int(diff),
|
|
"region": dt.tzname(),
|
|
},
|
|
)
|