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 .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",
]

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 .modules import ( # noqa: F401
ChildDeviceModule,
CloudModule,
DeviceModule,
EnergyModule,
LedModule,
LightTransitionModule,
TimeModule,
)

View File

@ -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}),
}