move get_time{zone} out from smartdevice + some minor cleanups

This commit is contained in:
Teemu Rytilahti 2022-01-29 20:36:08 +01:00 committed by Teemu R
parent c8ad99abcb
commit f0d66e4195
5 changed files with 35 additions and 46 deletions

View File

@ -39,6 +39,10 @@ class Emeter(Usage):
""" """
return await self.call("erase_emeter_stat") return await self.call("erase_emeter_stat")
async def get_realtime(self):
"""Return real-time statistics."""
return await self.call("get_realtime")
async def get_daystat(self, *, year, month, kwh=True): async def get_daystat(self, *, year, month, kwh=True):
"""Return daily stats for the given year & month.""" """Return daily stats for the given year & month."""
raw_data = await super().get_daystat(year=year, month=month) raw_data = await super().get_daystat(year=year, month=month)

View File

@ -2,8 +2,7 @@
from enum import Enum from enum import Enum
from typing import Optional from typing import Optional
from kasa.smartdevice import SmartDeviceException from ..exceptions import SmartDeviceException
from .module import Module from .module import Module

View File

@ -1,6 +1,7 @@
"""Provides the current time and timezone information.""" """Provides the current time and timezone information."""
from datetime import datetime from datetime import datetime
from ..exceptions import SmartDeviceException
from .module import Module, merge from .module import Module, merge
@ -32,3 +33,22 @@ class Time(Module):
"""Return current timezone.""" """Return current timezone."""
res = self.data["get_timezone"] res = self.data["get_timezone"]
return res return res
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 SmartDeviceException:
return None
async def get_timezone(self):
"""Request timezone information from the device."""
return await self.call("get_timezone")

View File

@ -186,7 +186,6 @@ class SmartDevice:
""" """
TIME_SERVICE = "time"
emeter_type = "emeter" emeter_type = "emeter"
def __init__(self, host: str) -> None: def __init__(self, host: str) -> None:
@ -314,11 +313,6 @@ class SmartDevice:
_LOGGER.debug("Performing the initial update to obtain sysinfo") _LOGGER.debug("Performing the initial update to obtain sysinfo")
self._last_update = await self.protocol.query(req) self._last_update = await self.protocol.query(req)
self._sys_info = self._last_update["system"]["get_sysinfo"] self._sys_info = self._last_update["system"]["get_sysinfo"]
# If the device has no emeter, we are done for the initial update
# Otherwise we will follow the regular code path to also query
# the emeter data also during the initial update
if not self.has_emeter:
return
if self.has_emeter: if self.has_emeter:
_LOGGER.debug( _LOGGER.debug(
@ -380,22 +374,17 @@ class SmartDevice:
async def get_time(self) -> Optional[datetime]: async def get_time(self) -> Optional[datetime]:
"""Return current time from the device, if available.""" """Return current time from the device, if available."""
try: _LOGGER.warning(
res = await self._query_helper(self.TIME_SERVICE, "get_time") "Use `time` property instead, this call will be removed in the future."
return datetime(
res["year"],
res["month"],
res["mday"],
res["hour"],
res["min"],
res["sec"],
) )
except SmartDeviceException: return await self.modules["time"].get_time()
return None
async def get_timezone(self) -> Dict: async def get_timezone(self) -> Dict:
"""Return timezone information.""" """Return timezone information."""
return await self._query_helper(self.TIME_SERVICE, "get_timezone") _LOGGER.warning(
"Use `timezone` property instead, this call will be removed in the future."
)
return await self.modules["time"].get_timezone()
@property # type: ignore @property # type: ignore
@requires_update @requires_update
@ -433,7 +422,7 @@ class SmartDevice:
loc["latitude"] = sys_info["latitude_i"] / 10000 loc["latitude"] = sys_info["latitude_i"] / 10000
loc["longitude"] = sys_info["longitude_i"] / 10000 loc["longitude"] = sys_info["longitude_i"] / 10000
else: else:
_LOGGER.warning("Unsupported device location.") _LOGGER.debug("Unsupported device location.")
return loc return loc
@ -481,29 +470,7 @@ class SmartDevice:
async def get_emeter_realtime(self) -> EmeterStatus: async def get_emeter_realtime(self) -> EmeterStatus:
"""Retrieve current energy readings.""" """Retrieve current energy readings."""
self._verify_emeter() self._verify_emeter()
return EmeterStatus(await self._query_helper(self.emeter_type, "get_realtime")) return EmeterStatus(await self.modules["emeter"].get_realtime())
def _create_emeter_request(self, year: int = None, month: int = None):
"""Create a Internal method for building a request for all emeter statistics at once."""
# TODO: this is currently only here for smartstrip plug support, move it there?
if year is None:
year = datetime.now().year
if month is None:
month = datetime.now().month
req: Dict[str, Any] = {}
merge(req, self._create_request(self.emeter_type, "get_realtime"))
merge(
req, self._create_request(self.emeter_type, "get_monthstat", {"year": year})
)
merge(
req,
self._create_request(
self.emeter_type, "get_daystat", {"month": month, "year": year}
),
)
return req
@property # type: ignore @property # type: ignore
@requires_update @requires_update

View File

@ -39,7 +39,6 @@ class SmartPlug(SmartDevice):
def __init__(self, host: str) -> None: def __init__(self, host: str) -> None:
super().__init__(host) super().__init__(host)
self.emeter_type = "emeter"
self._device_type = DeviceType.Plug self._device_type = DeviceType.Plug
self.add_module("schedule", Schedule(self, "schedule")) self.add_module("schedule", Schedule(self, "schedule"))
self.add_module("usage", Usage(self, "schedule")) self.add_module("usage", Usage(self, "schedule"))