From 496713cfec2ffdee9805706893cde30e320bfeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=90?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=93=D0=B5=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D1=87?= Date: Tue, 21 Sep 2021 14:26:00 +0300 Subject: [PATCH] add sensor filters --- custom_components/mega/__init__.py | 7 +++++- custom_components/mega/const.py | 2 ++ custom_components/mega/sensor.py | 37 +++++++++++++++++++++++++++--- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 8d7edca..59ba267 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -16,7 +16,8 @@ from homeassistant.config_entries import ConfigEntry from .const import DOMAIN, CONF_INVERT, CONF_RELOAD, PLATFORMS, CONF_PORTS, CONF_CUSTOM, CONF_SKIP, CONF_PORT_TO_SCAN, \ CONF_MQTT_INPUTS, CONF_HTTP, CONF_RESPONSE_TEMPLATE, CONF_ACTION, CONF_GET_VALUE, CONF_ALLOW_HOSTS, \ CONF_CONV_TEMPLATE, CONF_ALL, CONF_FORCE_D, CONF_DEF_RESPONSE, CONF_FORCE_I2C_SCAN, CONF_HEX_TO_FLOAT, \ - RGB_COMBINATIONS, CONF_WS28XX, CONF_ORDER, CONF_SMOOTH, CONF_LED, CONF_WHITE_SEP, CONF_CHIP, CONF_RANGE + RGB_COMBINATIONS, CONF_WS28XX, CONF_ORDER, CONF_SMOOTH, CONF_LED, CONF_WHITE_SEP, CONF_CHIP, CONF_RANGE, \ + CONF_FILTER_VALUES, CONF_FILTER_SCALE from .hub import MegaD from .config_flow import ConfigFlow from .http import MegaView @@ -74,6 +75,8 @@ CUSTOMIZE_PORT = { vol.Optional(CONF_VALUE_TEMPLATE): cv.template, vol.Optional(CONF_FORCE_I2C_SCAN): bool, vol.Optional(CONF_HEX_TO_FLOAT): bool, + vol.Optional(CONF_FILTER_VALUES): [cv.positive_float], + vol.Optional(CONF_FILTER_SCALE): cv.positive_float, vol.Optional(CONF_SMOOTH): cv.time_period_seconds, # vol.Optional(CONF_RANGE): vol.ExactSequence([int, int]), TODO: сделать отбрасывание "плохих" значений vol.Optional(str): { @@ -111,6 +114,8 @@ CONFIG_SCHEMA = vol.Schema( CUSTOMIZE_PORT, CUSTOMIZE_DS2413, ), + vol.Optional(CONF_FILTER_VALUES): [cv.positive_float], + vol.Optional(CONF_FILTER_SCALE): cv.positive_float, } } }, diff --git a/custom_components/mega/const.py b/custom_components/mega/const.py index 49940f6..ac5143f 100644 --- a/custom_components/mega/const.py +++ b/custom_components/mega/const.py @@ -45,6 +45,8 @@ CONF_SMOOTH = 'smooth' CONF_WHITE_SEP = 'white_sep' CONF_CHIP = 'chip' CONF_RANGE = 'range' +CONF_FILTER_VALUES = 'filter_values' +CONF_FILTER_SCALE = 'filter_scale' PLATFORMS = [ "light", "switch", diff --git a/custom_components/mega/sensor.py b/custom_components/mega/sensor.py index c4fd40e..c5e5eb3 100644 --- a/custom_components/mega/sensor.py +++ b/custom_components/mega/sensor.py @@ -20,7 +20,8 @@ from homeassistant.const import ( from homeassistant.core import HomeAssistant from homeassistant.helpers.template import Template from .entities import MegaPushEntity -from .const import CONF_KEY, TEMP, HUM, W1, W1BUS, CONF_CONV_TEMPLATE, CONF_HEX_TO_FLOAT, DOMAIN, CONF_CUSTOM, CONF_SKIP +from .const import CONF_KEY, TEMP, HUM, W1, W1BUS, CONF_CONV_TEMPLATE, CONF_HEX_TO_FLOAT, DOMAIN, CONF_CUSTOM, \ + CONF_SKIP, CONF_FILTER_VALUES, CONF_FILTER_SCALE from .hub import MegaD import re @@ -107,7 +108,35 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, asyn async_add_devices(devices) -class MegaI2C(MegaPushEntity): +class FilterBadValues(MegaPushEntity): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._prev_value = None + + def filter_value(self, value): + if value in self.filter_values \ + or ( + self._prev_value is not None + and self.filter_scale is not None + and ( + abs(value - self._prev_value) / self._prev_value > self.filter_scale + ) + ): + value = self._prev_value + self._prev_value = value + return value + + @property + def filter_values(self): + return self.customize.get(CONF_FILTER_VALUES, self.mega.customize.get(CONF_FILTER_VALUES, [])) + + @property + def filter_scale(self): + return self.customize.get(CONF_FILTER_SCALE, self.mega.customize.get(CONF_FILTER_SCALE, None)) + + +class MegaI2C(FilterBadValues): def __init__( self, @@ -151,6 +180,7 @@ class MegaI2C(MegaPushEntity): ret = tmpl.async_render({'value': ret}) except: ret = ret + ret = self.filter_value(ret) return str(ret) @property @@ -158,7 +188,7 @@ class MegaI2C(MegaPushEntity): return self._device_class -class Mega1WSensor(MegaPushEntity): +class Mega1WSensor(FilterBadValues): def __init__( self, @@ -247,6 +277,7 @@ class Mega1WSensor(MegaPushEntity): ret = tmpl.async_render({'value': ret}) except: pass + ret = self.filter_value(ret) return str(ret) @property