From 55ac0a9805cde263a3147f366e9334b114a64d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Jaworski?= Date: Tue, 6 Feb 2024 23:45:07 +0100 Subject: [PATCH] add support for flood sensing for multisensors as binary moisture sensor --- blebox_uniapi/binary_sensor.py | 39 ++++++++++++++++++++++++++++++++-- blebox_uniapi/box_types.py | 2 ++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/blebox_uniapi/binary_sensor.py b/blebox_uniapi/binary_sensor.py index a025a22..5c7d3fe 100644 --- a/blebox_uniapi/binary_sensor.py +++ b/blebox_uniapi/binary_sensor.py @@ -13,17 +13,26 @@ def __init__(self, product: "Box", alias: str, methods: dict): def many_from_config( cls, product, box_type_config, extended_state ) -> list["Feature"]: + type_class_map = { + "rain": Rain, + "flood": Flood, + } + output_list = list() sensors_list = extended_state.get("multiSensor").get("sensors", {}) alias, methods = box_type_config[0] + for sensor in sensors_list: sensor_type = sensor.get("type") sensor_id = sensor.get("id") - if sensor.get("type") in ("rain", "flood"): + + if sensor_type in type_class_map: + klass = type_class_map[sensor_type] + if methods.get(sensor_type) is not None: value_method = {sensor_type: methods[sensor_type](sensor_id)} output_list.append( - Rain( + klass( product=product, alias=sensor_type + "_" + str(sensor_id), methods=value_method, @@ -56,3 +65,29 @@ def _read_rain(self, field: str) -> Union[float, int, None]: def after_update(self) -> None: self._current = self._read_rain("rain") + + +class Flood(BinarySensor): + def __init__(self, product: "Box", alias: str, methods: dict): + self._device_class = "moisture" + super().__init__(product, alias, methods) + + @property + def state(self) -> bool: + return self._current > 0 + + @property + def device_class(self) -> str: + return self._device_class + + def _read_flood(self, field: str) -> Union[float, int, None]: + product = self._product + + if product.last_data is not None: + raw = self.raw_value(field) + if raw is not None: # no reading + return self.raw_value("flood") + return 0 + + def after_update(self) -> None: + self._current = self._read_flood("flood") diff --git a/blebox_uniapi/box_types.py b/blebox_uniapi/box_types.py index 46e3481..8523122 100644 --- a/blebox_uniapi/box_types.py +++ b/blebox_uniapi/box_types.py @@ -610,6 +610,7 @@ def get_latest_api_level(product_type: str) -> Union[dict, int]: "multiSensor", { "rain": lambda x: f"multiSensor/sensors/[id={x}]/value", + "flood": lambda x: f"multiSensor/sensors/[id={x}]/value", }, ] ], @@ -631,6 +632,7 @@ def get_latest_api_level(product_type: str) -> Union[dict, int]: "multiSensor", { "rain": lambda x: f"multiSensor/sensors/[id={x}]/value", + "flood": lambda x: f"multiSensor/sensors/[id={x}]/value", }, ] ],