Add fan module (#764)

Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com>
This commit is contained in:
Teemu R
2024-04-17 12:07:16 +02:00
committed by GitHub
parent da441bc697
commit 700643d3cf
8 changed files with 120 additions and 7 deletions

View File

@@ -9,6 +9,7 @@ from .cloudmodule import CloudModule
from .colortemp import ColorTemperatureModule
from .devicemodule import DeviceModule
from .energymodule import EnergyModule
from .fanmodule import FanModule
from .firmware import Firmware
from .humidity import HumiditySensor
from .ledmodule import LedModule
@@ -30,6 +31,7 @@ __all__ = [
"AutoOffModule",
"LedModule",
"Brightness",
"FanModule",
"Firmware",
"CloudModule",
"LightTransitionModule",

View File

@@ -0,0 +1,66 @@
"""Implementation of fan_control module."""
from typing import TYPE_CHECKING, Dict
from ...feature import Feature, FeatureType
from ..smartmodule import SmartModule
if TYPE_CHECKING:
from ..smartdevice import SmartDevice
class FanModule(SmartModule):
"""Implementation of fan_control module."""
REQUIRED_COMPONENT = "fan_control"
def __init__(self, device: "SmartDevice", module: str):
super().__init__(device, module)
self._add_feature(
Feature(
device,
"Fan speed level",
container=self,
attribute_getter="fan_speed_level",
attribute_setter="set_fan_speed_level",
icon="mdi:fan",
type=FeatureType.Number,
minimum_value=1,
maximum_value=4,
)
)
self._add_feature(
Feature(
device,
"Fan sleep mode",
container=self,
attribute_getter="sleep_mode",
attribute_setter="set_sleep_mode",
icon="mdi:sleep",
type=FeatureType.Switch
)
)
def query(self) -> Dict:
"""Query to execute during the update cycle."""
return {}
@property
def fan_speed_level(self) -> int:
"""Return fan speed level."""
return self.data["fan_speed_level"]
async def set_fan_speed_level(self, level: int):
"""Set fan speed level."""
if level < 1 or level > 4:
raise ValueError("Invalid level, should be in range 1-4.")
return await self.call("set_device_info", {"fan_speed_level": level})
@property
def sleep_mode(self) -> bool:
"""Return sleep mode status."""
return self.data["fan_sleep_mode_on"]
async def set_sleep_mode(self, on: bool):
"""Set sleep mode."""
return await self.call("set_device_info", {"fan_sleep_mode_on": on})

View File

@@ -49,6 +49,8 @@ class SmartChildDevice(SmartDevice):
child_device_map = {
"plug.powerstrip.sub-plug": DeviceType.Plug,
"subg.trigger.temp-hmdt-sensor": DeviceType.Sensor,
"kasa.switch.outlet.sub-fan": DeviceType.Fan,
"kasa.switch.outlet.sub-dimmer": DeviceType.Dimmer,
}
dev_type = child_device_map.get(self.sys_info["category"])
if dev_type is None:

View File

@@ -314,12 +314,11 @@ class SmartDevice(Device):
return self._last_update
def _update_internal_state(self, info):
"""Update internal state.
"""Update the internal info state.
This is used by the parent to push updates to its children
This is used by the parent to push updates to its children.
"""
# TODO: cleanup the _last_update, _info mess.
self._last_update = self._info = info
self._info = info
async def _query_helper(
self, method: str, params: Optional[Dict] = None, child_ids=None

View File

@@ -62,7 +62,7 @@ class SmartModule(Module):
q = self.query()
if not q:
return dev.internal_state["get_device_info"]
return dev.sys_info
q_keys = list(q.keys())
query_key = q_keys[0]