From 9dfd37c60b514d92345b6a4e3e3107d92cdd4ce9 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Tue, 19 Apr 2022 08:00:36 +0100 Subject: [PATCH] Use CONF_NAME consistently in utility meter sensors with and without tariffs (#69152) * apply name to tariff based sensors too * change name without breaking entity_id * address comments --- .../components/utility_meter/__init__.py | 4 +- .../components/utility_meter/sensor.py | 17 +++++- tests/components/utility_meter/test_sensor.py | 55 +++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/utility_meter/__init__.py b/homeassistant/components/utility_meter/__init__.py index 095a5e2825e..05ed01f8208 100644 --- a/homeassistant/components/utility_meter/__init__.py +++ b/homeassistant/components/utility_meter/__init__.py @@ -138,13 +138,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: if not conf[CONF_TARIFFS]: # only one entity is required - name = conf.get(CONF_NAME, meter) hass.async_create_task( discovery.async_load_platform( hass, SENSOR_DOMAIN, DOMAIN, - {name: {CONF_METER: meter, CONF_NAME: name}}, + {meter: {CONF_METER: meter}}, config, ) ) @@ -170,7 +169,6 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: name = f"{meter} {tariff}" tariff_confs[name] = { CONF_METER: meter, - CONF_NAME: name, CONF_TARIFF: tariff, } diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index f44c7a950a9..d1afc449903 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -36,6 +36,7 @@ from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.start import async_at_start from homeassistant.helpers.template import is_number from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType +from homeassistant.util import slugify import homeassistant.util.dt as dt_util from .const import ( @@ -194,6 +195,17 @@ async def async_setup_platform( if conf_meter_unique_id else None ) + conf_meter_name = hass.data[DATA_UTILITY][meter].get(CONF_NAME, meter) + conf_sensor_tariff = conf.get(CONF_TARIFF) + + suggested_entity_id = None + if conf_sensor_tariff: + conf_sensor_name = f"{conf_meter_name} {conf_sensor_tariff}" + slug = slugify(f"{meter} {conf_sensor_tariff}") + suggested_entity_id = f"sensor.{slug}" + else: + conf_sensor_name = conf_meter_name + conf_meter_type = hass.data[DATA_UTILITY][meter].get(CONF_METER_TYPE) conf_meter_offset = hass.data[DATA_UTILITY][meter][CONF_METER_OFFSET] conf_meter_delta_values = hass.data[DATA_UTILITY][meter][ @@ -211,13 +223,14 @@ async def async_setup_platform( delta_values=conf_meter_delta_values, meter_offset=conf_meter_offset, meter_type=conf_meter_type, - name=conf.get(CONF_NAME), + name=conf_sensor_name, net_consumption=conf_meter_net_consumption, parent_meter=meter, source_entity=conf_meter_source, tariff_entity=conf_meter_tariff_entity, tariff=conf_sensor_tariff, unique_id=conf_sensor_unique_id, + suggested_entity_id=suggested_entity_id, ) meters.append(meter_sensor) @@ -251,9 +264,11 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): tariff_entity, tariff, unique_id, + suggested_entity_id=None, ): """Initialize the Utility Meter sensor.""" self._attr_unique_id = unique_id + self.entity_id = suggested_entity_id self._parent_meter = parent_meter self._sensor_source_id = source_entity self._state = None diff --git a/tests/components/utility_meter/test_sensor.py b/tests/components/utility_meter/test_sensor.py index 4aa403d842d..b3ed413f249 100644 --- a/tests/components/utility_meter/test_sensor.py +++ b/tests/components/utility_meter/test_sensor.py @@ -342,6 +342,61 @@ async def test_unique_id(hass): assert ent_reg.entities["sensor.energy_bill_onpeak"].unique_id == "1_onpeak" +@pytest.mark.parametrize( + "yaml_config,entity_id, name", + ( + ( + { + "utility_meter": { + "energy_bill": { + "name": "dog", + "source": "sensor.energy", + "tariffs": ["onpeak", "midpeak", "offpeak"], + } + } + }, + "sensor.energy_bill_onpeak", + "dog onpeak", + ), + ( + { + "utility_meter": { + "energy_bill": { + "name": "dog", + "source": "sensor.energy", + } + } + }, + "sensor.dog", + "dog", + ), + ( + { + "utility_meter": { + "energy_bill": { + "source": "sensor.energy", + } + } + }, + "sensor.energy_bill", + "energy_bill", + ), + ), +) +async def test_entity_name(hass, yaml_config, entity_id, name): + """Test utility sensor state initializtion.""" + assert await async_setup_component(hass, DOMAIN, yaml_config) + await hass.async_block_till_done() + + hass.bus.async_fire(EVENT_HOMEASSISTANT_START) + await hass.async_block_till_done() + + state = hass.states.get(entity_id) + assert state is not None + assert state.state == STATE_UNKNOWN + assert state.name == name + + @pytest.mark.parametrize( "yaml_config,config_entry_configs", (