Skip to content

Commit

Permalink
Add smartdevice module for led controls (#761)
Browse files Browse the repository at this point in the history
Allows controlling LED on devices that support it.
  • Loading branch information
rytilahti committed Feb 19, 2024
1 parent f5175c5 commit 44b59ef
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
2 changes: 2 additions & 0 deletions kasa/smart/modules/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from .cloudmodule import CloudModule
from .devicemodule import DeviceModule
from .energymodule import EnergyModule
from .ledmodule import LedModule
from .lighttransitionmodule import LightTransitionModule
from .timemodule import TimeModule

Expand All @@ -11,6 +12,7 @@
"EnergyModule",
"DeviceModule",
"ChildDeviceModule",
"LedModule",
"CloudModule",
"LightTransitionModule",
]
65 changes: 65 additions & 0 deletions kasa/smart/modules/ledmodule.py
Original file line number Diff line number Diff line change
@@ -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"],
}
2 changes: 2 additions & 0 deletions kasa/smart/smartdevice.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@
from ..smartprotocol import SmartProtocol
from .modules import ( # noqa: F401
ChildDeviceModule,
CloudModule,
DeviceModule,
EnergyModule,
LedModule,
LightTransitionModule,
TimeModule,
)
Expand Down
14 changes: 14 additions & 0 deletions kasa/tests/fakeprotocol_smart.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,20 @@ def credentials_hash(self):

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}),
}
Expand Down

0 comments on commit 44b59ef

Please sign in to comment.