diff --git a/kasa/smart/modules/__init__.py b/kasa/smart/modules/__init__.py index 123435be..5274e7b3 100644 --- a/kasa/smart/modules/__init__.py +++ b/kasa/smart/modules/__init__.py @@ -3,6 +3,7 @@ from .childdevicemodule import ChildDeviceModule from .cloudmodule import CloudModule from .devicemodule import DeviceModule from .energymodule import EnergyModule +from .ledmodule import LedModule from .lighttransitionmodule import LightTransitionModule from .timemodule import TimeModule @@ -11,6 +12,7 @@ __all__ = [ "EnergyModule", "DeviceModule", "ChildDeviceModule", + "LedModule", "CloudModule", "LightTransitionModule", ] diff --git a/kasa/smart/modules/ledmodule.py b/kasa/smart/modules/ledmodule.py new file mode 100644 index 00000000..72e3e33a --- /dev/null +++ b/kasa/smart/modules/ledmodule.py @@ -0,0 +1,65 @@ +"""Module for led controls.""" +from typing import TYPE_CHECKING, Dict + +from ...feature import Feature, FeatureType +from ..smartmodule import SmartModule + +if TYPE_CHECKING: + from ..smartdevice import SmartDevice + + +class LedModule(SmartModule): + """Implementation of led controls.""" + + REQUIRED_COMPONENT = "led" + QUERY_GETTER_NAME = "get_led_info" + + def __init__(self, device: "SmartDevice", module: str): + super().__init__(device, module) + self._add_feature( + Feature( + device=device, + container=self, + name="LED", + icon="mdi:led-{state}", + attribute_getter="led", + attribute_setter="set_led", + type=FeatureType.Switch, + ) + ) + + def query(self) -> Dict: + """Query to execute during the update cycle.""" + return {self.QUERY_GETTER_NAME: {"led_rule": None}} + + @property + def mode(self): + """LED mode setting. + + "always", "never", "night_mode" + """ + return self.data["led_rule"] + + @property + def led(self): + """Return current led status.""" + return self.data["led_status"] + + async def set_led(self, enable: bool): + """Set led. + + This should probably be a select with always/never/nightmode. + """ + rule = "always" if enable else "never" + return await self.call("set_led_info", self.data | {"led_rule": rule}) + + @property + def night_mode_settings(self): + """Night mode settings.""" + return { + "start": self.data["start_time"], + "end": self.data["end_time"], + "type": self.data["night_mode_type"], + "sunrise_offset": self.data["sunrise_offset"], + "sunset_offset": self.data["sunset_offset"], + } diff --git a/kasa/smart/smartdevice.py b/kasa/smart/smartdevice.py index 7542078a..d9e859d4 100644 --- a/kasa/smart/smartdevice.py +++ b/kasa/smart/smartdevice.py @@ -14,8 +14,10 @@ from ..feature import Feature, FeatureType from ..smartprotocol import SmartProtocol from .modules import ( # noqa: F401 ChildDeviceModule, + CloudModule, DeviceModule, EnergyModule, + LedModule, LightTransitionModule, TimeModule, ) diff --git a/kasa/tests/fakeprotocol_smart.py b/kasa/tests/fakeprotocol_smart.py index 210c63b9..0b04282e 100644 --- a/kasa/tests/fakeprotocol_smart.py +++ b/kasa/tests/fakeprotocol_smart.py @@ -46,6 +46,20 @@ class FakeSmartTransport(BaseTransport): FIXTURE_MISSING_MAP = { "get_wireless_scan_info": ("wireless", {"ap_list": [], "wep_supported": False}), + "get_led_info": ( + "led", + { + "led_rule": "never", + "led_status": False, + "night_mode": { + "end_time": 420, + "night_mode_type": "sunrise_sunset", + "start_time": 1140, + "sunrise_offset": 0, + "sunset_offset": 0, + }, + }, + ), "get_connect_cloud_state": ("cloud_connect", {"status": 1}), "get_on_off_gradually_info": ("on_off_gradually", {"enable": True}), }