Add support for waterleak sensor (T300) (#876)

This commit is contained in:
Teemu R 2024-04-30 17:31:47 +02:00 committed by GitHub
parent 300d823895
commit 5599756d28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 107 additions and 0 deletions

View File

@ -19,6 +19,7 @@ from .reportmodule import ReportModule
from .temperature import TemperatureSensor from .temperature import TemperatureSensor
from .temperaturecontrol import TemperatureControl from .temperaturecontrol import TemperatureControl
from .timemodule import TimeModule from .timemodule import TimeModule
from .waterleak import WaterleakSensor
__all__ = [ __all__ = [
"AlarmModule", "AlarmModule",
@ -40,4 +41,5 @@ __all__ = [
"LightTransitionModule", "LightTransitionModule",
"ColorTemperatureModule", "ColorTemperatureModule",
"ColorModule", "ColorModule",
"WaterleakSensor",
] ]

View File

@ -0,0 +1,62 @@
"""Implementation of waterleak module."""
from __future__ import annotations
from enum import Enum
from typing import TYPE_CHECKING
from ...feature import Feature
from ..smartmodule import SmartModule
if TYPE_CHECKING:
from ..smartdevice import SmartDevice
class WaterleakStatus(Enum):
"""Waterleawk status."""
Normal = "normal"
LeakDetected = "water_leak"
Drying = "water_dry"
class WaterleakSensor(SmartModule):
"""Implementation of waterleak module."""
REQUIRED_COMPONENT = "sensor_alarm"
def __init__(self, device: SmartDevice, module: str):
super().__init__(device, module)
self._add_feature(
Feature(
device,
"Water leak",
container=self,
attribute_getter="status",
icon="mdi:water",
)
)
self._add_feature(
Feature(
device,
"Water alert",
container=self,
attribute_getter="alert",
icon="mdi:water-alert",
)
)
def query(self) -> dict:
"""Query to execute during the update cycle."""
# Water leak information is contained in the main device info response.
return {}
@property
def status(self) -> WaterleakStatus:
"""Return current humidity in percentage."""
return WaterleakStatus(self._device.sys_info["water_leak_status"])
@property
def alert(self) -> bool:
"""Return true if alarm is active."""
return self._device.sys_info["in_alarm"]

View File

@ -50,6 +50,7 @@ class SmartChildDevice(SmartDevice):
child_device_map = { child_device_map = {
"plug.powerstrip.sub-plug": DeviceType.Plug, "plug.powerstrip.sub-plug": DeviceType.Plug,
"subg.trigger.temp-hmdt-sensor": DeviceType.Sensor, "subg.trigger.temp-hmdt-sensor": DeviceType.Sensor,
"subg.trigger.water-leak-sensor": DeviceType.Sensor,
"kasa.switch.outlet.sub-fan": DeviceType.Fan, "kasa.switch.outlet.sub-fan": DeviceType.Fan,
"kasa.switch.outlet.sub-dimmer": DeviceType.Dimmer, "kasa.switch.outlet.sub-dimmer": DeviceType.Dimmer,
"subg.trv": DeviceType.Thermostat, "subg.trv": DeviceType.Thermostat,

View File

@ -0,0 +1,42 @@
from enum import Enum
import pytest
from kasa.smart.modules import WaterleakSensor
from kasa.tests.device_fixtures import parametrize
waterleak = parametrize(
"has waterleak", component_filter="sensor_alarm", protocol_filter={"SMART.CHILD"}
)
@waterleak
@pytest.mark.parametrize(
"feature, type",
[
("alert", int),
("status", Enum),
],
)
async def test_waterleak_properties(dev, feature, type):
"""Test that features are registered and work as expected."""
waterleak: WaterleakSensor = dev.modules["WaterleakSensor"]
prop = getattr(waterleak, feature)
assert isinstance(prop, type)
feat = waterleak._module_features[feature]
assert feat.value == prop
assert isinstance(feat.value, type)
@waterleak
async def test_waterleak_features(dev):
"""Test waterleak features."""
waterleak: WaterleakSensor = dev.modules["WaterleakSensor"]
assert "water_leak" in dev.features
assert dev.features["water_leak"].value == waterleak.status
assert "water_alert" in dev.features
assert dev.features["water_alert"].value == waterleak.alert