From bc70619b17e877125887c12a75973e620640d41c Mon Sep 17 00:00:00 2001 From: nielstron Date: Thu, 22 Mar 2018 14:37:18 +0100 Subject: [PATCH 01/15] Added bandpass filter Allows values in a given range --- homeassistant/components/sensor/filter.py | 62 ++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 9c05028b394..79a91c18cd4 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -11,6 +11,7 @@ from numbers import Number from functools import partial from copy import copy from datetime import timedelta +import math import voluptuous as vol @@ -28,6 +29,7 @@ import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) +FILTER_NAME_BANDPASS = 'bandpass' FILTER_NAME_LOWPASS = 'lowpass' FILTER_NAME_OUTLIER = 'outlier' FILTER_NAME_THROTTLE = 'throttle' @@ -40,6 +42,8 @@ CONF_FILTER_WINDOW_SIZE = 'window_size' CONF_FILTER_PRECISION = 'precision' CONF_FILTER_RADIUS = 'radius' CONF_FILTER_TIME_CONSTANT = 'time_constant' +CONF_FILTER_LOWER_BOUND = 'lower_bound' +CONF_FILTER_UPPER_BOUND = 'upper_bound' CONF_TIME_SMA_TYPE = 'type' TIME_SMA_LAST = 'last' @@ -51,6 +55,8 @@ DEFAULT_WINDOW_SIZE = 1 DEFAULT_PRECISION = 2 DEFAULT_FILTER_RADIUS = 2.0 DEFAULT_FILTER_TIME_CONSTANT = 10 +DEFAULT_LOWER_BOUND = -math.inf +DEFAULT_UPPER_BOUND = math.inf NAME_TEMPLATE = "{} filter" ICON = 'mdi:chart-line-variant' @@ -77,6 +83,14 @@ FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({ default=DEFAULT_FILTER_TIME_CONSTANT): vol.Coerce(int), }) +FILTER_BANDPASS_SCHEMA = FILTER_SCHEMA.extend({ + vol.Required(CONF_FILTER_NAME): FILTER_NAME_BANDPASS, + vol.Optional(CONF_FILTER_LOWER_BOUND, + default=DEFAULT_LOWER_BOUND): vol.Coerce(float), + vol.Optional(CONF_FILTER_UPPER_BOUND, + default=DEFAULT_UPPER_BOUND): vol.Coerce(float), +}) + FILTER_TIME_SMA_SCHEMA = FILTER_SCHEMA.extend({ vol.Required(CONF_FILTER_NAME): FILTER_NAME_TIME_SMA, vol.Optional(CONF_TIME_SMA_TYPE, @@ -100,7 +114,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ [vol.Any(FILTER_OUTLIER_SCHEMA, FILTER_LOWPASS_SCHEMA, FILTER_TIME_SMA_SCHEMA, - FILTER_THROTTLE_SCHEMA)]) + FILTER_THROTTLE_SCHEMA, + FILTER_BANDPASS_SCHEMA)]) }) @@ -325,6 +340,51 @@ class Filter(object): return new_state +@FILTERS.register(FILTER_NAME_BANDPASS) +class BandPassFilter(Filter): + """Band pass filter. + + Determines if new state is in a band between upper_bound and lower_bound. + If not inside, lower or upper bound is returned instead. + + Args: + upper_bound (float): band upper bound + lower_bound (float): band lower bound + """ + + def __init__(self, window_size=1, precision=None, entity, + lower_bound=math.inf, upper_bound=-math.inf): + """Initialize Filter.""" + super().__init__(FILTER_NAME_OUTLIER, window_size, precision, entity) + self._lower_bound = lower_bound + self._upper_bound = upper_bound + self._stats_internal = Counter() + + def _filter_state(self, new_state): + """Implement the outlier filter.""" + new_state = float(new_state) + + if new_state > self._upper_bound: + + self._stats_internal['erasures_up'] += 1 + + _LOGGER.debug("Upper outlier nr. %s in %s: %s", + self._stats_internal['erasures_up'], + self._entity, new_state) + return self._upper_bound + + if new_state < self._lower_bound: + + self._stats_internal['erasures_low'] += 1 + + _LOGGER.debug("Lower outlier nr. %s in %s: %s", + self._stats_internal['erasures_low'], + self._entity, new_state) + return self._lower_bound + + return new_state + + @FILTERS.register(FILTER_NAME_OUTLIER) class OutlierFilter(Filter): """BASIC outlier filter. From 3faed2edc14463e1257c55149d8826d600d017f3 Mon Sep 17 00:00:00 2001 From: nielstron Date: Thu, 22 Mar 2018 14:37:39 +0100 Subject: [PATCH 02/15] Add test for new band_pass filter --- tests/components/sensor/test_filter.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 8e79306fe13..09b56ed6be4 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -131,6 +131,22 @@ class TestFilterSensor(unittest.TestCase): filtered = filt.filter_state(state) self.assertEqual(18.05, filtered.state) + def test_bandpass(self): + """Test if bandpass filter works.""" + lower = 10 + upper = 20 + filt = LowPassFilter(entity=None, + lower_bound=lower, + upper_bound=upper) + for state in self.values: + filtered = filt.filter_state(state) + if state < lower: + self.assertEqual(lower, filtered) + elif state > upper: + self.assertEqual(upper, filtered) + else: + self.assertEqual(state, filtered) + def test_throttle(self): """Test if lowpass filter works.""" filt = ThrottleFilter(window_size=3, From 850131229220275b6b2a45dff0cd990b868fc103 Mon Sep 17 00:00:00 2001 From: nielstron Date: Thu, 22 Mar 2018 14:46:51 +0100 Subject: [PATCH 03/15] Reordered attribute order --- homeassistant/components/sensor/filter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 79a91c18cd4..4505a794883 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -85,6 +85,8 @@ FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({ FILTER_BANDPASS_SCHEMA = FILTER_SCHEMA.extend({ vol.Required(CONF_FILTER_NAME): FILTER_NAME_BANDPASS, + vol.Optional(CONF_FILTER_WINDOW_SIZE, + default=DEFAULT_WINDOW_SIZE): vol.Coerce(int), vol.Optional(CONF_FILTER_LOWER_BOUND, default=DEFAULT_LOWER_BOUND): vol.Coerce(float), vol.Optional(CONF_FILTER_UPPER_BOUND, @@ -352,7 +354,7 @@ class BandPassFilter(Filter): lower_bound (float): band lower bound """ - def __init__(self, window_size=1, precision=None, entity, + def __init__(self, window_size, precision, entity, lower_bound=math.inf, upper_bound=-math.inf): """Initialize Filter.""" super().__init__(FILTER_NAME_OUTLIER, window_size, precision, entity) From b42f4012d1df3ab2ecf8963772b98e0b0e8a1bb6 Mon Sep 17 00:00:00 2001 From: nielstron Date: Thu, 22 Mar 2018 15:29:56 +0100 Subject: [PATCH 04/15] Fixed test --- tests/components/sensor/test_filter.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 09b56ed6be4..e43df67c84f 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -4,7 +4,8 @@ import unittest from unittest.mock import patch from homeassistant.components.sensor.filter import ( - LowPassFilter, OutlierFilter, ThrottleFilter, TimeSMAFilter) + LowPassFilter, OutlierFilter, ThrottleFilter, TimeSMAFilter, + BandPassFilter) import homeassistant.util.dt as dt_util from homeassistant.setup import setup_component import homeassistant.core as ha @@ -135,9 +136,10 @@ class TestFilterSensor(unittest.TestCase): """Test if bandpass filter works.""" lower = 10 upper = 20 - filt = LowPassFilter(entity=None, - lower_bound=lower, - upper_bound=upper) + filt = BandPassFilter(1, None, + entity=None, + lower_bound=lower, + upper_bound=upper) for state in self.values: filtered = filt.filter_state(state) if state < lower: From 734a83c65708f39d4629cb52df306c6a2746df79 Mon Sep 17 00:00:00 2001 From: nielstron Date: Thu, 22 Mar 2018 22:22:53 +0100 Subject: [PATCH 05/15] Removed default values and fixed description in sensor.filter --- homeassistant/components/sensor/filter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 4505a794883..9346480b4b3 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -355,7 +355,7 @@ class BandPassFilter(Filter): """ def __init__(self, window_size, precision, entity, - lower_bound=math.inf, upper_bound=-math.inf): + lower_bound, upper_bound): """Initialize Filter.""" super().__init__(FILTER_NAME_OUTLIER, window_size, precision, entity) self._lower_bound = lower_bound @@ -363,7 +363,7 @@ class BandPassFilter(Filter): self._stats_internal = Counter() def _filter_state(self, new_state): - """Implement the outlier filter.""" + """Implement the band-pass filter.""" new_state = float(new_state) if new_state > self._upper_bound: From a0ab35693647b216eb2fd74e2b19a06abe47b978 Mon Sep 17 00:00:00 2001 From: nielstron Date: Fri, 30 Mar 2018 14:03:38 +0200 Subject: [PATCH 06/15] Renamed to range filter --- homeassistant/components/sensor/filter.py | 20 ++++++++++---------- tests/components/sensor/test_filter.py | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 9346480b4b3..f1fb1fca6f3 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -29,7 +29,7 @@ import homeassistant.util.dt as dt_util _LOGGER = logging.getLogger(__name__) -FILTER_NAME_BANDPASS = 'bandpass' +FILTER_NAME_RANGE = 'range' FILTER_NAME_LOWPASS = 'lowpass' FILTER_NAME_OUTLIER = 'outlier' FILTER_NAME_THROTTLE = 'throttle' @@ -83,8 +83,8 @@ FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({ default=DEFAULT_FILTER_TIME_CONSTANT): vol.Coerce(int), }) -FILTER_BANDPASS_SCHEMA = FILTER_SCHEMA.extend({ - vol.Required(CONF_FILTER_NAME): FILTER_NAME_BANDPASS, +FILTER_RANGE_SCHEMA = FILTER_SCHEMA.extend({ + vol.Required(CONF_FILTER_NAME): FILTER_NAME_RANGE, vol.Optional(CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE): vol.Coerce(int), vol.Optional(CONF_FILTER_LOWER_BOUND, @@ -117,7 +117,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ FILTER_LOWPASS_SCHEMA, FILTER_TIME_SMA_SCHEMA, FILTER_THROTTLE_SCHEMA, - FILTER_BANDPASS_SCHEMA)]) + FILTER_RANGE_SCHEMA)]) }) @@ -342,11 +342,11 @@ class Filter(object): return new_state -@FILTERS.register(FILTER_NAME_BANDPASS) -class BandPassFilter(Filter): - """Band pass filter. +@FILTERS.register(FILTER_NAME_RANGE) +class RangeFilter(Filter): + """Range filter. - Determines if new state is in a band between upper_bound and lower_bound. + Determines if new state is in the range of upper_bound and lower_bound. If not inside, lower or upper bound is returned instead. Args: @@ -357,13 +357,13 @@ class BandPassFilter(Filter): def __init__(self, window_size, precision, entity, lower_bound, upper_bound): """Initialize Filter.""" - super().__init__(FILTER_NAME_OUTLIER, window_size, precision, entity) + super().__init__(FILTER_NAME_RANGE, window_size, precision, entity) self._lower_bound = lower_bound self._upper_bound = upper_bound self._stats_internal = Counter() def _filter_state(self, new_state): - """Implement the band-pass filter.""" + """Implement the range filter.""" new_state = float(new_state) if new_state > self._upper_bound: diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index e43df67c84f..7b232101289 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -5,7 +5,7 @@ from unittest.mock import patch from homeassistant.components.sensor.filter import ( LowPassFilter, OutlierFilter, ThrottleFilter, TimeSMAFilter, - BandPassFilter) + RangeFilter) import homeassistant.util.dt as dt_util from homeassistant.setup import setup_component import homeassistant.core as ha @@ -132,11 +132,11 @@ class TestFilterSensor(unittest.TestCase): filtered = filt.filter_state(state) self.assertEqual(18.05, filtered.state) - def test_bandpass(self): - """Test if bandpass filter works.""" + def test_range(self): + """Test if range filter works.""" lower = 10 upper = 20 - filt = BandPassFilter(1, None, + filt = RangeFilter(1, None, entity=None, lower_bound=lower, upper_bound=upper) From ba836c2e3629257b4461202da5f6f5db7ed667e2 Mon Sep 17 00:00:00 2001 From: nielstron Date: Fri, 30 Mar 2018 14:10:22 +0200 Subject: [PATCH 07/15] Fix indent --- tests/components/sensor/test_filter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 7b232101289..4d52648582f 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -137,9 +137,9 @@ class TestFilterSensor(unittest.TestCase): lower = 10 upper = 20 filt = RangeFilter(1, None, - entity=None, - lower_bound=lower, - upper_bound=upper) + entity=None, + lower_bound=lower, + upper_bound=upper) for state in self.values: filtered = filt.filter_state(state) if state < lower: From f4ef8fd1bc95ced0352ef22486e16fcc477306bb Mon Sep 17 00:00:00 2001 From: nielstron Date: Sat, 28 Apr 2018 17:42:32 +0200 Subject: [PATCH 08/15] Changes for new FilterState construct --- homeassistant/components/sensor/filter.py | 9 ++++----- tests/components/sensor/test_filter.py | 14 +++++++------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index f1fb1fca6f3..88868ddcc42 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -364,25 +364,24 @@ class RangeFilter(Filter): def _filter_state(self, new_state): """Implement the range filter.""" - new_state = float(new_state) - if new_state > self._upper_bound: + if new_state.state > self._upper_bound: self._stats_internal['erasures_up'] += 1 _LOGGER.debug("Upper outlier nr. %s in %s: %s", self._stats_internal['erasures_up'], self._entity, new_state) - return self._upper_bound + new_state.state = self._upper_bound - if new_state < self._lower_bound: + elif new_state < self._lower_bound: self._stats_internal['erasures_low'] += 1 _LOGGER.debug("Lower outlier nr. %s in %s: %s", self._stats_internal['erasures_low'], self._entity, new_state) - return self._lower_bound + new_state.state = self._upper_bound return new_state diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 4d52648582f..0f5b581d075 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -140,14 +140,14 @@ class TestFilterSensor(unittest.TestCase): entity=None, lower_bound=lower, upper_bound=upper) - for state in self.values: - filtered = filt.filter_state(state) - if state < lower: - self.assertEqual(lower, filtered) - elif state > upper: - self.assertEqual(upper, filtered) + for unf_state in self.values: + filtered = filt.filter_state(unf_state) + if unf_state.state < lower: + self.assertEqual(lower, filtered.state) + elif unf_state.state > upper: + self.assertEqual(upper, filtered.state) else: - self.assertEqual(state, filtered) + self.assertEqual(unf_state.state, filtered.state) def test_throttle(self): """Test if lowpass filter works.""" From 07d139b3a82446ad8eaee304e59c947c762fd285 Mon Sep 17 00:00:00 2001 From: nielstron Date: Sat, 28 Apr 2018 17:51:04 +0200 Subject: [PATCH 09/15] Fix wrong comparison --- homeassistant/components/sensor/filter.py | 2 +- tests/components/sensor/test_filter.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 88868ddcc42..21fd09248ff 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -374,7 +374,7 @@ class RangeFilter(Filter): self._entity, new_state) new_state.state = self._upper_bound - elif new_state < self._lower_bound: + elif new_state.state < self._lower_bound: self._stats_internal['erasures_low'] += 1 diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 0f5b581d075..e449f239c0b 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -141,13 +141,14 @@ class TestFilterSensor(unittest.TestCase): lower_bound=lower, upper_bound=upper) for unf_state in self.values: + prev = unf_state.state filtered = filt.filter_state(unf_state) - if unf_state.state < lower: + if prev < lower: self.assertEqual(lower, filtered.state) - elif unf_state.state > upper: + elif prev > upper: self.assertEqual(upper, filtered.state) else: - self.assertEqual(unf_state.state, filtered.state) + self.assertEqual(prev, filtered.state) def test_throttle(self): """Test if lowpass filter works.""" From bb98331ba45f9c2a4845316d21659ceabbf7ebd3 Mon Sep 17 00:00:00 2001 From: nielstron Date: Sat, 28 Apr 2018 18:09:37 +0200 Subject: [PATCH 10/15] Fix doctring newline and handle ha.state string-being --- homeassistant/components/sensor/filter.py | 1 - tests/components/sensor/test_filter.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 21fd09248ff..93380291a3e 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -364,7 +364,6 @@ class RangeFilter(Filter): def _filter_state(self, new_state): """Implement the range filter.""" - if new_state.state > self._upper_bound: self._stats_internal['erasures_up'] += 1 diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index e449f239c0b..6fc732b28f5 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -141,7 +141,7 @@ class TestFilterSensor(unittest.TestCase): lower_bound=lower, upper_bound=upper) for unf_state in self.values: - prev = unf_state.state + prev = float(unf_state.state) filtered = filt.filter_state(unf_state) if prev < lower: self.assertEqual(lower, filtered.state) From 25f7c31911ffb6c1a646468b507a93c84831ecb9 Mon Sep 17 00:00:00 2001 From: nielstron Date: Sat, 28 Apr 2018 18:29:55 +0200 Subject: [PATCH 11/15] Fixed wrong bound assignment on values below the lower bound --- homeassistant/components/sensor/filter.py | 2 +- tests/components/sensor/test_filter.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 93380291a3e..49e9189a84d 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -380,7 +380,7 @@ class RangeFilter(Filter): _LOGGER.debug("Lower outlier nr. %s in %s: %s", self._stats_internal['erasures_low'], self._entity, new_state) - new_state.state = self._upper_bound + new_state.state = self._lower_bound return new_state diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 6fc732b28f5..718c39764d0 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -141,14 +141,14 @@ class TestFilterSensor(unittest.TestCase): lower_bound=lower, upper_bound=upper) for unf_state in self.values: - prev = float(unf_state.state) + unf = float(unf_state.state) filtered = filt.filter_state(unf_state) - if prev < lower: + if unf < lower: self.assertEqual(lower, filtered.state) - elif prev > upper: + elif unf > upper: self.assertEqual(upper, filtered.state) else: - self.assertEqual(prev, filtered.state) + self.assertEqual(unf, filtered.state) def test_throttle(self): """Test if lowpass filter works.""" From 8061f15aec88332a8296c0f4c9ea3e278c4b0ea0 Mon Sep 17 00:00:00 2001 From: nielstron Date: Fri, 4 May 2018 00:51:03 +0200 Subject: [PATCH 12/15] Removal of windows size and precision for range filter --- homeassistant/components/sensor/filter.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 49e9189a84d..770287228a2 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -85,8 +85,6 @@ FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({ FILTER_RANGE_SCHEMA = FILTER_SCHEMA.extend({ vol.Required(CONF_FILTER_NAME): FILTER_NAME_RANGE, - vol.Optional(CONF_FILTER_WINDOW_SIZE, - default=DEFAULT_WINDOW_SIZE): vol.Coerce(int), vol.Optional(CONF_FILTER_LOWER_BOUND, default=DEFAULT_LOWER_BOUND): vol.Coerce(float), vol.Optional(CONF_FILTER_UPPER_BOUND, @@ -354,10 +352,10 @@ class RangeFilter(Filter): lower_bound (float): band lower bound """ - def __init__(self, window_size, precision, entity, + def __init__(self, entity, lower_bound, upper_bound): """Initialize Filter.""" - super().__init__(FILTER_NAME_RANGE, window_size, precision, entity) + super().__init__(FILTER_NAME_RANGE, entity=entity) self._lower_bound = lower_bound self._upper_bound = upper_bound self._stats_internal = Counter() From 33990badcd3955de50a408bb848d24b42f863241 Mon Sep 17 00:00:00 2001 From: nielstron Date: Fri, 4 May 2018 10:30:44 +0200 Subject: [PATCH 13/15] Fixed Rangefilter constructor call --- tests/components/sensor/test_filter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/components/sensor/test_filter.py b/tests/components/sensor/test_filter.py index 718c39764d0..cf2cc9c4205 100644 --- a/tests/components/sensor/test_filter.py +++ b/tests/components/sensor/test_filter.py @@ -136,8 +136,7 @@ class TestFilterSensor(unittest.TestCase): """Test if range filter works.""" lower = 10 upper = 20 - filt = RangeFilter(1, None, - entity=None, + filt = RangeFilter(entity=None, lower_bound=lower, upper_bound=upper) for unf_state in self.values: From fb65276daf96b6e844bee1ed060b2c2fc3ba0449 Mon Sep 17 00:00:00 2001 From: nielstron Date: Mon, 2 Jul 2018 23:59:04 +0200 Subject: [PATCH 14/15] Remove math.inf as bounds --- homeassistant/components/sensor/filter.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index 770287228a2..bc0764f3a35 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -11,7 +11,6 @@ from numbers import Number from functools import partial from copy import copy from datetime import timedelta -import math import voluptuous as vol @@ -55,8 +54,6 @@ DEFAULT_WINDOW_SIZE = 1 DEFAULT_PRECISION = 2 DEFAULT_FILTER_RADIUS = 2.0 DEFAULT_FILTER_TIME_CONSTANT = 10 -DEFAULT_LOWER_BOUND = -math.inf -DEFAULT_UPPER_BOUND = math.inf NAME_TEMPLATE = "{} filter" ICON = 'mdi:chart-line-variant' @@ -85,10 +82,8 @@ FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({ FILTER_RANGE_SCHEMA = FILTER_SCHEMA.extend({ vol.Required(CONF_FILTER_NAME): FILTER_NAME_RANGE, - vol.Optional(CONF_FILTER_LOWER_BOUND, - default=DEFAULT_LOWER_BOUND): vol.Coerce(float), - vol.Optional(CONF_FILTER_UPPER_BOUND, - default=DEFAULT_UPPER_BOUND): vol.Coerce(float), + vol.Optional(CONF_FILTER_LOWER_BOUND): vol.Coerce(float), + vol.Optional(CONF_FILTER_UPPER_BOUND): vol.Coerce(float), }) FILTER_TIME_SMA_SCHEMA = FILTER_SCHEMA.extend({ @@ -353,7 +348,7 @@ class RangeFilter(Filter): """ def __init__(self, entity, - lower_bound, upper_bound): + lower_bound=None, upper_bound=None): """Initialize Filter.""" super().__init__(FILTER_NAME_RANGE, entity=entity) self._lower_bound = lower_bound @@ -362,7 +357,7 @@ class RangeFilter(Filter): def _filter_state(self, new_state): """Implement the range filter.""" - if new_state.state > self._upper_bound: + if self._upper_bound and new_state.state > self._upper_bound: self._stats_internal['erasures_up'] += 1 @@ -371,7 +366,7 @@ class RangeFilter(Filter): self._entity, new_state) new_state.state = self._upper_bound - elif new_state.state < self._lower_bound: + elif self._lower_bound and new_state.state < self._lower_bound: self._stats_internal['erasures_low'] += 1 From 6420ab5535a3edc38ee2e839b9bc4d295297d647 Mon Sep 17 00:00:00 2001 From: nielstron Date: Tue, 3 Jul 2018 11:06:10 +0200 Subject: [PATCH 15/15] Remove default none from filter sensor --- homeassistant/components/sensor/filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/filter.py b/homeassistant/components/sensor/filter.py index bc0764f3a35..261f6e2b510 100644 --- a/homeassistant/components/sensor/filter.py +++ b/homeassistant/components/sensor/filter.py @@ -348,7 +348,7 @@ class RangeFilter(Filter): """ def __init__(self, entity, - lower_bound=None, upper_bound=None): + lower_bound, upper_bound): """Initialize Filter.""" super().__init__(FILTER_NAME_RANGE, entity=entity) self._lower_bound = lower_bound