From 40eb1554d9a4c621852b35d1803cd08d9242cd4d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 17 Apr 2022 19:53:49 -1000 Subject: [PATCH] Only set attributes based on the configured type for min_max sensors (#70142) --- homeassistant/components/min_max/sensor.py | 33 ++++------ tests/components/min_max/test_config_flow.py | 1 - tests/components/min_max/test_init.py | 1 - tests/components/min_max/test_sensor.py | 64 ++++++++------------ 4 files changed, 36 insertions(+), 63 deletions(-) diff --git a/homeassistant/components/min_max/sensor.py b/homeassistant/components/min_max/sensor.py index cc5636f6633..5c117357729 100644 --- a/homeassistant/components/min_max/sensor.py +++ b/homeassistant/components/min_max/sensor.py @@ -31,24 +31,11 @@ ATTR_MIN_VALUE = "min_value" ATTR_MIN_ENTITY_ID = "min_entity_id" ATTR_MAX_VALUE = "max_value" ATTR_MAX_ENTITY_ID = "max_entity_id" -ATTR_COUNT_SENSORS = "count_sensors" ATTR_MEAN = "mean" ATTR_MEDIAN = "median" ATTR_LAST = "last" ATTR_LAST_ENTITY_ID = "last_entity_id" -ATTR_TO_PROPERTY = [ - ATTR_COUNT_SENSORS, - ATTR_MAX_VALUE, - ATTR_MAX_ENTITY_ID, - ATTR_MEAN, - ATTR_MEDIAN, - ATTR_MIN_VALUE, - ATTR_MIN_ENTITY_ID, - ATTR_LAST, - ATTR_LAST_ENTITY_ID, -] - ICON = "mdi:calculator" SENSOR_TYPES = { @@ -58,6 +45,7 @@ SENSOR_TYPES = { ATTR_MEDIAN: "median", ATTR_LAST: "last", } +SENSOR_TYPE_TO_ATTR = {v: k for k, v in SENSOR_TYPES.items()} PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { @@ -179,7 +167,8 @@ class MinMaxSensor(SensorEntity): if name: self._name = name else: - self._name = f"{next(v for k, v in SENSOR_TYPES.items() if self._sensor_type == v)} sensor".capitalize() + self._name = f"{sensor_type} sensor".capitalize() + self._sensor_attr = SENSOR_TYPE_TO_ATTR[self._sensor_type] self._unit_of_measurement = None self._unit_of_measurement_mismatch = False self.min_value = self.max_value = self.mean = self.last = self.median = None @@ -213,9 +202,7 @@ class MinMaxSensor(SensorEntity): """Return the state of the sensor.""" if self._unit_of_measurement_mismatch: return None - return getattr( - self, next(k for k, v in SENSOR_TYPES.items() if self._sensor_type == v) - ) + return getattr(self, self._sensor_attr) @property def native_unit_of_measurement(self): @@ -232,11 +219,13 @@ class MinMaxSensor(SensorEntity): @property def extra_state_attributes(self): """Return the state attributes of the sensor.""" - return { - attr: getattr(self, attr) - for attr in ATTR_TO_PROPERTY - if getattr(self, attr) is not None - } + if self._sensor_type == "min": + return {ATTR_MIN_ENTITY_ID: self.min_entity_id} + if self._sensor_type == "max": + return {ATTR_MAX_ENTITY_ID: self.max_entity_id} + if self._sensor_type == "last": + return {ATTR_LAST_ENTITY_ID: self.last_entity_id} + return None @property def icon(self): diff --git a/tests/components/min_max/test_config_flow.py b/tests/components/min_max/test_config_flow.py index 8e66f1a4711..ac617eb938c 100644 --- a/tests/components/min_max/test_config_flow.py +++ b/tests/components/min_max/test_config_flow.py @@ -132,4 +132,3 @@ async def test_options(hass: HomeAssistant, platform) -> None: # Check the state of the entity has changed as expected state = hass.states.get(f"{platform}.my_min_max") assert state.state == "21.1" - assert state.attributes["count_sensors"] == 3 diff --git a/tests/components/min_max/test_init.py b/tests/components/min_max/test_init.py index 4df543c2565..8d8eac5c700 100644 --- a/tests/components/min_max/test_init.py +++ b/tests/components/min_max/test_init.py @@ -44,7 +44,6 @@ async def test_setup_and_remove_config_entry( # Check the platform is setup correctly state = hass.states.get(min_max_entity_id) assert state.state == "20.0" - assert state.attributes["count_sensors"] == 2 # Remove the config entry assert await hass.config_entries.async_remove(config_entry.entry_id) diff --git a/tests/components/min_max/test_sensor.py b/tests/components/min_max/test_sensor.py index ae6a14893f8..e143b26e47f 100644 --- a/tests/components/min_max/test_sensor.py +++ b/tests/components/min_max/test_sensor.py @@ -27,6 +27,31 @@ MEAN_4_DIGITS = round(sum(VALUES) / COUNT, 4) MEDIAN = round(statistics.median(VALUES), 2) +async def test_default_name_sensor(hass): + """Test the min sensor with a default name.""" + config = { + "sensor": { + "platform": "min_max", + "type": "min", + "entity_ids": ["sensor.test_1", "sensor.test_2", "sensor.test_3"], + } + } + + assert await async_setup_component(hass, "sensor", config) + await hass.async_block_till_done() + + entity_ids = config["sensor"]["entity_ids"] + + for entity_id, value in dict(zip(entity_ids, VALUES)).items(): + hass.states.async_set(entity_id, value) + await hass.async_block_till_done() + + state = hass.states.get("sensor.min_sensor") + + assert str(float(MIN_VALUE)) == state.state + assert entity_ids[2] == state.attributes.get("min_entity_id") + + async def test_min_sensor(hass): """Test the min sensor.""" config = { @@ -51,10 +76,6 @@ async def test_min_sensor(hass): assert str(float(MIN_VALUE)) == state.state assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("max_value") == MAX_VALUE - assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("mean") == MEAN - assert state.attributes.get("median") == MEDIAN async def test_max_sensor(hass): @@ -80,11 +101,7 @@ async def test_max_sensor(hass): state = hass.states.get("sensor.test_max") assert str(float(MAX_VALUE)) == state.state - assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("min_value") == MIN_VALUE assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("mean") == MEAN - assert state.attributes.get("median") == MEDIAN async def test_mean_sensor(hass): @@ -110,11 +127,6 @@ async def test_mean_sensor(hass): state = hass.states.get("sensor.test_mean") assert str(float(MEAN)) == state.state - assert state.attributes.get("min_value") == MIN_VALUE - assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("max_value") == MAX_VALUE - assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("median") == MEDIAN async def test_mean_1_digit_sensor(hass): @@ -141,11 +153,6 @@ async def test_mean_1_digit_sensor(hass): state = hass.states.get("sensor.test_mean") assert str(float(MEAN_1_DIGIT)) == state.state - assert state.attributes.get("min_value") == MIN_VALUE - assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("max_value") == MAX_VALUE - assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("median") == MEDIAN async def test_mean_4_digit_sensor(hass): @@ -172,11 +179,6 @@ async def test_mean_4_digit_sensor(hass): state = hass.states.get("sensor.test_mean") assert str(float(MEAN_4_DIGITS)) == state.state - assert state.attributes.get("min_value") == MIN_VALUE - assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("max_value") == MAX_VALUE - assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("median") == MEDIAN async def test_median_sensor(hass): @@ -202,11 +204,6 @@ async def test_median_sensor(hass): state = hass.states.get("sensor.test_median") assert str(float(MEDIAN)) == state.state - assert state.attributes.get("min_value") == MIN_VALUE - assert entity_ids[2] == state.attributes.get("min_entity_id") - assert state.attributes.get("max_value") == MAX_VALUE - assert entity_ids[1] == state.attributes.get("max_entity_id") - assert state.attributes.get("mean") == MEAN async def test_not_enough_sensor_value(hass): @@ -241,20 +238,14 @@ async def test_not_enough_sensor_value(hass): state = hass.states.get("sensor.test_max") assert STATE_UNKNOWN != state.state - assert entity_ids[1] == state.attributes.get("min_entity_id") - assert VALUES[1] == state.attributes.get("min_value") assert entity_ids[1] == state.attributes.get("max_entity_id") - assert VALUES[1] == state.attributes.get("max_value") hass.states.async_set(entity_ids[2], STATE_UNKNOWN) await hass.async_block_till_done() state = hass.states.get("sensor.test_max") assert STATE_UNKNOWN != state.state - assert entity_ids[1] == state.attributes.get("min_entity_id") - assert VALUES[1] == state.attributes.get("min_value") assert entity_ids[1] == state.attributes.get("max_entity_id") - assert VALUES[1] == state.attributes.get("max_value") hass.states.async_set(entity_ids[1], STATE_UNAVAILABLE) await hass.async_block_till_done() @@ -337,11 +328,6 @@ async def test_last_sensor(hass): assert str(float(value)) == state.state assert entity_id == state.attributes.get("last_entity_id") - assert state.attributes.get("min_value") == MIN_VALUE - assert state.attributes.get("max_value") == MAX_VALUE - assert state.attributes.get("mean") == MEAN - assert state.attributes.get("median") == MEDIAN - async def test_reload(hass): """Verify we can reload filter sensors."""