diff --git a/homeassistant/components/sensor/min_max.py b/homeassistant/components/sensor/min_max.py index 3e863562777..9e36904222b 100644 --- a/homeassistant/components/sensor/min_max.py +++ b/homeassistant/components/sensor/min_max.py @@ -115,6 +115,7 @@ class MinMaxSensor(Entity): next(v for k, v in SENSOR_TYPES.items() if self._sensor_type == v)).capitalize() self._unit_of_measurement = None + self._unit_of_measurement_mismatch = False self.min_value = self.max_value = self.mean = STATE_UNKNOWN self.count_sensors = len(self._entity_ids) self.states = {} @@ -134,7 +135,10 @@ class MinMaxSensor(Entity): if self._unit_of_measurement != new_state.attributes.get( ATTR_UNIT_OF_MEASUREMENT): - _LOGGER.warning("Units of measurement do not match") + _LOGGER.warning( + "Units of measurement do not match for entity %s" % + self.entity_id) + self._unit_of_measurement_mismatch = True try: self.states[entity] = float(new_state.state) @@ -155,12 +159,16 @@ class MinMaxSensor(Entity): @property def state(self): """Return the state of the sensor.""" + if (self._unit_of_measurement_mismatch): + return STATE_UNKNOWN return getattr(self, next( k for k, v in SENSOR_TYPES.items() if self._sensor_type == v)) @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" + if (self._unit_of_measurement_mismatch): + return "ERR" return self._unit_of_measurement @property diff --git a/tests/components/sensor/test_min_max.py b/tests/components/sensor/test_min_max.py index c19e2b60627..a6d6a5adc68 100644 --- a/tests/components/sensor/test_min_max.py +++ b/tests/components/sensor/test_min_max.py @@ -2,7 +2,8 @@ import unittest from homeassistant.setup import setup_component -from homeassistant.const import STATE_UNKNOWN +from homeassistant.const import ( + STATE_UNKNOWN, ATTR_UNIT_OF_MEASUREMENT, TEMP_CELSIUS, TEMP_FAHRENHEIT) from tests.common import get_test_home_assistant @@ -213,3 +214,49 @@ class TestMinMaxSensor(unittest.TestCase): state = self.hass.states.get('sensor.test_max') self.assertEqual(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.block_till_done() + + state = self.hass.states.get('sensor.test') + + self.assertEqual(str(float(self.values[0])), 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() + + state = self.hass.states.get('sensor.test') + + self.assertEqual(STATE_UNKNOWN, state.state) + self.assertEqual('ERR', 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() + + state = self.hass.states.get('sensor.test') + + self.assertEqual(STATE_UNKNOWN, state.state) + self.assertEqual('ERR', state.attributes.get('unit_of_measurement'))