mirror of
https://github.com/home-assistant/core.git
synced 2025-08-05 13:45:12 +02:00
Fix handling of known->unknown state, extended test, fix lint errors
This commit is contained in:
@@ -65,6 +65,39 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def calc_min(sensor_values):
|
||||||
|
"""Calculate min value, honoring unknown states."""
|
||||||
|
val = STATE_UNKNOWN
|
||||||
|
for sval in sensor_values:
|
||||||
|
if sval != STATE_UNKNOWN:
|
||||||
|
if val == STATE_UNKNOWN or val > sval:
|
||||||
|
val = sval
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def calc_max(sensor_values):
|
||||||
|
"""Calculate max value, honoring unknown states."""
|
||||||
|
val = STATE_UNKNOWN
|
||||||
|
for sval in sensor_values:
|
||||||
|
if sval != STATE_UNKNOWN:
|
||||||
|
if val == STATE_UNKNOWN or val < sval:
|
||||||
|
val = sval
|
||||||
|
return val
|
||||||
|
|
||||||
|
|
||||||
|
def calc_mean(sensor_values, round_digits):
|
||||||
|
"""Calculate mean value, honoring unknown states."""
|
||||||
|
val = 0
|
||||||
|
count = 0
|
||||||
|
for sval in sensor_values:
|
||||||
|
if sval != STATE_UNKNOWN:
|
||||||
|
val += sval
|
||||||
|
count += 1
|
||||||
|
if count == 0:
|
||||||
|
return STATE_UNKNOWN
|
||||||
|
return round(val/count, round_digits)
|
||||||
|
|
||||||
|
|
||||||
class MinMaxSensor(Entity):
|
class MinMaxSensor(Entity):
|
||||||
"""Representation of a min/max sensor."""
|
"""Representation of a min/max sensor."""
|
||||||
|
|
||||||
@@ -91,6 +124,8 @@ class MinMaxSensor(Entity):
|
|||||||
def async_min_max_sensor_state_listener(entity, old_state, new_state):
|
def async_min_max_sensor_state_listener(entity, old_state, new_state):
|
||||||
"""Called when the sensor changes state."""
|
"""Called when the sensor changes state."""
|
||||||
if new_state.state is None or new_state.state in STATE_UNKNOWN:
|
if new_state.state is None or new_state.state in STATE_UNKNOWN:
|
||||||
|
self.states[entity] = STATE_UNKNOWN
|
||||||
|
hass.async_add_job(self.async_update_ha_state, True)
|
||||||
return
|
return
|
||||||
|
|
||||||
if self._unit_of_measurement is None:
|
if self._unit_of_measurement is None:
|
||||||
@@ -152,38 +187,6 @@ class MinMaxSensor(Entity):
|
|||||||
"""Get the latest data and updates the states."""
|
"""Get the latest data and updates the states."""
|
||||||
sensor_values = [self.states[k] for k in self._entity_ids
|
sensor_values = [self.states[k] for k in self._entity_ids
|
||||||
if k in self.states]
|
if k in self.states]
|
||||||
self.min_value = self.calc_min(sensor_values)
|
self.min_value = calc_min(sensor_values)
|
||||||
self.max_value = self.calc_max(sensor_values)
|
self.max_value = calc_max(sensor_values)
|
||||||
self.mean = self.calc_mean(sensor_values)
|
self.mean = calc_mean(sensor_values, self._round_digits)
|
||||||
|
|
||||||
# pylint: disable=R0201
|
|
||||||
def calc_min(self, sensor_values):
|
|
||||||
"""Calculate min value, honoring unknown states."""
|
|
||||||
val = STATE_UNKNOWN
|
|
||||||
for sval in sensor_values:
|
|
||||||
if sval != STATE_UNKNOWN:
|
|
||||||
if val == STATE_UNKNOWN or val > sval:
|
|
||||||
val = sval
|
|
||||||
return val
|
|
||||||
|
|
||||||
# pylint: disable=R0201
|
|
||||||
def calc_max(self, sensor_values):
|
|
||||||
"""Calculate max value, honoring unknown states."""
|
|
||||||
val = STATE_UNKNOWN
|
|
||||||
for sval in sensor_values:
|
|
||||||
if sval != STATE_UNKNOWN:
|
|
||||||
if val == STATE_UNKNOWN or val < sval:
|
|
||||||
val = sval
|
|
||||||
return val
|
|
||||||
|
|
||||||
def calc_mean(self, sensor_values):
|
|
||||||
"""Calculate mean value, honoring unknown states."""
|
|
||||||
val = 0
|
|
||||||
count = 0
|
|
||||||
for sval in sensor_values:
|
|
||||||
if sval != STATE_UNKNOWN:
|
|
||||||
val += sval
|
|
||||||
count += 1
|
|
||||||
if count == 0:
|
|
||||||
return STATE_UNKNOWN
|
|
||||||
return round(val/count, self._round_digits)
|
|
||||||
|
@@ -196,7 +196,7 @@ class TestMinMaxSensor(unittest.TestCase):
|
|||||||
state = self.hass.states.get('sensor.test_max')
|
state = self.hass.states.get('sensor.test_max')
|
||||||
self.assertEqual(STATE_UNKNOWN, state.state)
|
self.assertEqual(STATE_UNKNOWN, state.state)
|
||||||
|
|
||||||
self.hass.states.set(entity_ids[2], self.values[1])
|
self.hass.states.set(entity_ids[1], self.values[1])
|
||||||
self.hass.block_till_done()
|
self.hass.block_till_done()
|
||||||
|
|
||||||
state = self.hass.states.get('sensor.test_max')
|
state = self.hass.states.get('sensor.test_max')
|
||||||
@@ -207,3 +207,9 @@ class TestMinMaxSensor(unittest.TestCase):
|
|||||||
|
|
||||||
state = self.hass.states.get('sensor.test_max')
|
state = self.hass.states.get('sensor.test_max')
|
||||||
self.assertNotEqual(STATE_UNKNOWN, state.state)
|
self.assertNotEqual(STATE_UNKNOWN, state.state)
|
||||||
|
|
||||||
|
self.hass.states.set(entity_ids[1], STATE_UNKNOWN)
|
||||||
|
self.hass.block_till_done()
|
||||||
|
|
||||||
|
state = self.hass.states.get('sensor.test_max')
|
||||||
|
self.assertEqual(STATE_UNKNOWN, state.state)
|
||||||
|
Reference in New Issue
Block a user