diff --git a/homeassistant/components/sensor/min_max.py b/homeassistant/components/sensor/min_max.py index d612ca5cf26..506163d1c70 100644 --- a/homeassistant/components/sensor/min_max.py +++ b/homeassistant/components/sensor/min_max.py @@ -98,7 +98,7 @@ class MinMaxSensor(Entity): if self._unit_of_measurement != new_state.attributes.get( ATTR_UNIT_OF_MEASUREMENT): _LOGGER.warning("Units of measurement do not match") - return + try: self.states[entity] = float(new_state.state) except ValueError: @@ -150,10 +150,36 @@ class MinMaxSensor(Entity): """Get the latest data and updates the states.""" sensor_values = [self.states[k] for k in self._entity_ids if k in self.states] - if len(sensor_values) == self.count_sensors: - self.min_value = min(sensor_values) - self.max_value = max(sensor_values) - self.mean = round(sum(sensor_values) / self.count_sensors, - self._round_digits) - else: - self.min_value = self.max_value = self.mean = STATE_UNKNOWN + self.min_value = self.calc_min(sensor_values) + self.max_value = self.calc_max(sensor_values) + self.mean = self.calc_mean(sensor_values) + + def calc_min(self, sensor_values): + """Calculate min value, honoring unkown states.""" + val = STATE_UNKNOWN + for v in sensor_values: + if v != STATE_UNKNOWN: + if val == STATE_UNKNOWN or val > v: + val = v + return val + + def calc_max(self, sensor_values): + """Calculate max value, honoring unkown states.""" + val = STATE_UNKNOWN + for v in sensor_values: + if v != STATE_UNKNOWN: + if val == STATE_UNKNOWN or val < v: + val = v + return val + + def calc_mean(self, sensor_values): + """Calculate mean value, honoring unkown states.""" + val = 0 + count = 0 + for v in sensor_values: + if v != STATE_UNKNOWN: + val += v + count += 1 + if count == 0: + return STATE_UNKNOWN + return round(val/count, self._round_digits) diff --git a/tests/components/sensor/test_min_max.py b/tests/components/sensor/test_min_max.py index b610775b39b..be140127b45 100644 --- a/tests/components/sensor/test_min_max.py +++ b/tests/components/sensor/test_min_max.py @@ -2,8 +2,7 @@ import unittest from homeassistant.setup import setup_component -from homeassistant.const import ( - STATE_UNKNOWN, ATTR_UNIT_OF_MEASUREMENT, TEMP_CELSIUS, TEMP_FAHRENHEIT) +from homeassistant.const import STATE_UNKNOWN from tests.common import get_test_home_assistant @@ -191,62 +190,20 @@ class TestMinMaxSensor(unittest.TestCase): entity_ids = config['sensor']['entity_ids'] - self.hass.states.set(entity_ids[0], self.values[0]) + self.hass.states.set(entity_ids[0], STATE_UNKNOWN) self.hass.block_till_done() state = self.hass.states.get('sensor.test_max') self.assertEqual(STATE_UNKNOWN, state.state) - self.hass.states.set(entity_ids[1], self.values[1]) - self.hass.block_till_done() - - state = self.hass.states.get('sensor.test_max') - self.assertEqual(STATE_UNKNOWN, state.state) - - self.hass.states.set(entity_ids[2], self.values[2]) + self.hass.states.set(entity_ids[2], self.values[1]) self.hass.block_till_done() state = self.hass.states.get('sensor.test_max') self.assertNotEqual(STATE_UNKNOWN, state.state) - def test_different_unit_of_measurement(self): - """Test for different unit of measurement.""" - config = { - 'sensor': { - 'platform': 'min_max', - 'name': 'test', - 'type': 'mean', - 'entity_ids': [ - 'sensor.test_1', - 'sensor.test_2', - 'sensor.test_3', - ] - } - } - - assert setup_component(self.hass, 'sensor', config) - - entity_ids = config['sensor']['entity_ids'] - - self.hass.states.set(entity_ids[0], self.values[0], - {ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS}) + self.hass.states.set(entity_ids[2], STATE_UNKNOWN) self.hass.block_till_done() - state = self.hass.states.get('sensor.test_mean') - - self.assertEqual(STATE_UNKNOWN, state.state) - self.assertEqual('°C', state.attributes.get('unit_of_measurement')) - - self.hass.states.set(entity_ids[1], self.values[1], - {ATTR_UNIT_OF_MEASUREMENT: TEMP_FAHRENHEIT}) - self.hass.block_till_done() - - self.assertEqual(STATE_UNKNOWN, state.state) - self.assertEqual('°C', state.attributes.get('unit_of_measurement')) - - self.hass.states.set(entity_ids[2], self.values[2], - {ATTR_UNIT_OF_MEASUREMENT: '%'}) - self.hass.block_till_done() - - self.assertEqual(STATE_UNKNOWN, state.state) - self.assertEqual('°C', state.attributes.get('unit_of_measurement')) + state = self.hass.states.get('sensor.test_max') + self.assertNotEqual(STATE_UNKNOWN, state.state)