mirror of
https://github.com/home-assistant/core.git
synced 2025-08-14 01:55:18 +02:00
Addresses code review by @MartinHjelmare
This commit is contained in:
@@ -45,25 +45,26 @@ FILTER_SCHEMA = vol.Schema({
|
|||||||
|
|
||||||
FILTER_OUTLIER_SCHEMA = FILTER_SCHEMA.extend({
|
FILTER_OUTLIER_SCHEMA = FILTER_SCHEMA.extend({
|
||||||
vol.Required(CONF_FILTER_NAME): FILTER_NAME_OUTLIER,
|
vol.Required(CONF_FILTER_NAME): FILTER_NAME_OUTLIER,
|
||||||
vol.Optional(CONF_FILTER_RADIUS): vol.Coerce(float),
|
vol.Optional(CONF_FILTER_RADIUS,
|
||||||
|
default=DEFAULT_FILTER_RADIUS): vol.Coerce(float),
|
||||||
})
|
})
|
||||||
|
|
||||||
FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({
|
FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend({
|
||||||
vol.Required(CONF_FILTER_NAME): FILTER_NAME_LOWPASS,
|
vol.Required(CONF_FILTER_NAME): FILTER_NAME_LOWPASS,
|
||||||
vol.Optional(CONF_FILTER_TIME_CONSTANT): vol.Coerce(int),
|
vol.Optional(CONF_FILTER_TIME_CONSTANT,
|
||||||
|
default=DEFAULT_FILTER_TIME_CONSTANT): vol.Coerce(int),
|
||||||
})
|
})
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
|
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
|
||||||
vol.Optional(CONF_NAME): cv.string,
|
vol.Optional(CONF_NAME): cv.string,
|
||||||
vol.Optional(ATTR_UNIT_OF_MEASUREMENT): cv.string,
|
vol.Required(CONF_FILTERS): vol.All(cv.ensure_list,
|
||||||
vol.Required(CONF_FILTERS): [vol.Any(FILTER_OUTLIER_SCHEMA,
|
[vol.Any(FILTER_OUTLIER_SCHEMA,
|
||||||
FILTER_LOWPASS_SCHEMA)]
|
FILTER_LOWPASS_SCHEMA)])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
# pylint: disable=unused-argument
|
|
||||||
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
"""Set up the template sensors."""
|
"""Set up the template sensors."""
|
||||||
sensors = []
|
sensors = []
|
||||||
@@ -72,23 +73,22 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|||||||
entity_id = config.get(CONF_ENTITY_ID)
|
entity_id = config.get(CONF_ENTITY_ID)
|
||||||
filters = []
|
filters = []
|
||||||
|
|
||||||
for _filter in config.get(CONF_FILTERS):
|
for _filter in config[CONF_FILTERS]:
|
||||||
window_size = _filter.get(CONF_FILTER_WINDOW_SIZE)
|
window_size = _filter.get(CONF_FILTER_WINDOW_SIZE)
|
||||||
precision = _filter.get(CONF_FILTER_PRECISION)
|
precision = _filter.get(CONF_FILTER_PRECISION)
|
||||||
|
|
||||||
if _filter['filter'] == FILTER_NAME_OUTLIER:
|
if _filter[CONF_FILTER_NAME] == FILTER_NAME_OUTLIER:
|
||||||
radius = _filter.get(CONF_FILTER_RADIUS, DEFAULT_FILTER_RADIUS)
|
radius = _filter.get(CONF_FILTER_RADIUS)
|
||||||
filters.append(OutlierFilter(window_size=window_size,
|
filters.append(OutlierFilter(window_size=window_size,
|
||||||
precision=precision,
|
precision=precision,
|
||||||
radius=radius))
|
radius=radius))
|
||||||
elif _filter['filter'] == FILTER_NAME_LOWPASS:
|
elif _filter[CONF_FILTER_NAME] == FILTER_NAME_LOWPASS:
|
||||||
time_constant = _filter.get(CONF_FILTER_TIME_CONSTANT,
|
time_constant = _filter.get(CONF_FILTER_TIME_CONSTANT)
|
||||||
DEFAULT_FILTER_TIME_CONSTANT)
|
|
||||||
filters.append(LowPassFilter(window_size=window_size,
|
filters.append(LowPassFilter(window_size=window_size,
|
||||||
precision=precision,
|
precision=precision,
|
||||||
time_constant=time_constant))
|
time_constant=time_constant))
|
||||||
|
|
||||||
sensors.append(SensorFilter(hass, name, entity_id, filters))
|
sensors.append(SensorFilter(name, entity_id, filters))
|
||||||
|
|
||||||
async_add_devices(sensors)
|
async_add_devices(sensors)
|
||||||
|
|
||||||
@@ -96,11 +96,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|||||||
class SensorFilter(Entity):
|
class SensorFilter(Entity):
|
||||||
"""Representation of a Filter Sensor."""
|
"""Representation of a Filter Sensor."""
|
||||||
|
|
||||||
filters = [FILTER_NAME_LOWPASS, FILTER_NAME_OUTLIER]
|
def __init__(self, name, entity_id, filters):
|
||||||
|
|
||||||
def __init__(self, hass, name, entity_id, filters):
|
|
||||||
"""Initialize the sensor."""
|
"""Initialize the sensor."""
|
||||||
self.hass = hass
|
|
||||||
self._name = name
|
self._name = name
|
||||||
self._entity = entity_id
|
self._entity = entity_id
|
||||||
self._unit_of_measurement = None
|
self._unit_of_measurement = None
|
||||||
@@ -125,7 +122,8 @@ class SensorFilter(Entity):
|
|||||||
self._state = filtered_state
|
self._state = filtered_state
|
||||||
filt.states.append(filtered_state)
|
filt.states.append(filtered_state)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
_LOGGER.warning("Could not convert state to number")
|
_LOGGER.warning("Could not convert state: %s to number",
|
||||||
|
self._state)
|
||||||
|
|
||||||
self.async_schedule_update_ha_state(True)
|
self.async_schedule_update_ha_state(True)
|
||||||
|
|
||||||
@@ -180,10 +178,10 @@ class Filter(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name, window_size=1, precision=None):
|
def __init__(self, name, window_size=1, precision=None):
|
||||||
"""Initialize common properties."""
|
"""Initialize common attributes."""
|
||||||
self.states = deque(maxlen=window_size)
|
self.states = deque(maxlen=window_size)
|
||||||
self.precision = precision
|
self.precision = precision
|
||||||
self._stats = dict()
|
self._stats = {}
|
||||||
self._name = name
|
self._name = name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -211,7 +209,7 @@ class Filter(object):
|
|||||||
class OutlierFilter(Filter):
|
class OutlierFilter(Filter):
|
||||||
"""BASIC outlier filter.
|
"""BASIC outlier filter.
|
||||||
|
|
||||||
Determines if new state is in a band around the median
|
Determines if new state is in a band around the median.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
radius (float): band radius
|
radius (float): band radius
|
||||||
@@ -233,7 +231,7 @@ class OutlierFilter(Filter):
|
|||||||
erasures = self._stats.get('erasures', 0)
|
erasures = self._stats.get('erasures', 0)
|
||||||
self._stats['erasures'] = erasures+1
|
self._stats['erasures'] = erasures+1
|
||||||
|
|
||||||
_LOGGER.warning("Outlier in %s: %s", self._name, new_state)
|
_LOGGER.debug("Outlier in %s: %s", self._name, new_state)
|
||||||
return self.states[-1]
|
return self.states[-1]
|
||||||
return new_state
|
return new_state
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user