mirror of
				https://github.com/python-kasa/python-kasa.git
				synced 2025-10-31 04:31:54 +00:00 
			
		
		
		
	 b860c32d5f
			
		
	
	b860c32d5f
	
	
	
		
			
			Initial implementation for feature categories to help downstreams and our cli tool to categorize the data for more user-friendly manner. As more and more information is being exposed through the generic features interface, it is necessary to give some hints to downstreams about how might want to present the information to users. This is not a 1:1 mapping to the homeassistant's mental model, and it will be necessary to fine-tune homeassistant-specific parameters by other means to polish the presentation.
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.6 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 TimeModule(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,
 | |
|                 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())
 | |
|         return await self.call(
 | |
|             "set_device_time",
 | |
|             {"timestamp": unixtime, "time_diff": dt.utcoffset(), "region": dt.tzname()},
 | |
|         )
 |