Add smartdevice module for led controls (#761)

Allows controlling LED on devices that support it.
This commit is contained in:
Teemu R 2024-02-19 20:59:09 +01:00 committed by GitHub
parent f5175c5632
commit 44b59efbb2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 83 additions and 0 deletions

View File

@ -3,6 +3,7 @@ from .childdevicemodule import ChildDeviceModule
from .cloudmodule import CloudModule from .cloudmodule import CloudModule
from .devicemodule import DeviceModule from .devicemodule import DeviceModule
from .energymodule import EnergyModule from .energymodule import EnergyModule
from .ledmodule import LedModule
from .lighttransitionmodule import LightTransitionModule from .lighttransitionmodule import LightTransitionModule
from .timemodule import TimeModule from .timemodule import TimeModule
@ -11,6 +12,7 @@ __all__ = [
"EnergyModule", "EnergyModule",
"DeviceModule", "DeviceModule",
"ChildDeviceModule", "ChildDeviceModule",
"LedModule",
"CloudModule", "CloudModule",
"LightTransitionModule", "LightTransitionModule",
] ]

View File

@ -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"],
}

View File

@ -14,8 +14,10 @@ from ..feature import Feature, FeatureType
from ..smartprotocol import SmartProtocol from ..smartprotocol import SmartProtocol
from .modules import ( # noqa: F401 from .modules import ( # noqa: F401
ChildDeviceModule, ChildDeviceModule,
CloudModule,
DeviceModule, DeviceModule,
EnergyModule, EnergyModule,
LedModule,
LightTransitionModule, LightTransitionModule,
TimeModule, TimeModule,
) )

View File

@ -46,6 +46,20 @@ class FakeSmartTransport(BaseTransport):
FIXTURE_MISSING_MAP = { FIXTURE_MISSING_MAP = {
"get_wireless_scan_info": ("wireless", {"ap_list": [], "wep_supported": False}), "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_connect_cloud_state": ("cloud_connect", {"status": 1}),
"get_on_off_gradually_info": ("on_off_gradually", {"enable": True}), "get_on_off_gradually_info": ("on_off_gradually", {"enable": True}),
} }