From 7fc1c32cbaa1afdd048ecbaca3379e571009230d Mon Sep 17 00:00:00 2001 From: Bram Date: Fri, 5 Aug 2022 19:03:24 +0200 Subject: [PATCH] Keep entity_id the same when the entity has a unique id --- .../powercalc/sensors/abstract.py | 14 +++++++++++ .../powercalc/sensors/daily_energy.py | 18 +++++++------- custom_components/powercalc/sensors/energy.py | 9 +++---- custom_components/powercalc/sensors/power.py | 10 ++------ tests/test_sensor.py | 24 +++++++++++++++++++ 5 files changed, 53 insertions(+), 22 deletions(-) diff --git a/custom_components/powercalc/sensors/abstract.py b/custom_components/powercalc/sensors/abstract.py index ad2bafa80..e7868e227 100644 --- a/custom_components/powercalc/sensors/abstract.py +++ b/custom_components/powercalc/sensors/abstract.py @@ -2,6 +2,7 @@ from typing import Any +import homeassistant.helpers.entity_registry as er from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import CONF_NAME from homeassistant.core import HomeAssistant, callback @@ -13,6 +14,7 @@ CONF_ENERGY_SENSOR_NAMING, CONF_POWER_SENSOR_FRIENDLY_NAMING, CONF_POWER_SENSOR_NAMING, + DOMAIN, ) ENTITY_ID_FORMAT = SENSOR_DOMAIN + ".{}" @@ -73,8 +75,11 @@ def generate_power_sensor_entity_id( sensor_config: dict[str, Any], source_entity: SourceEntity | None = None, name: str | None = None, + unique_id: str | None = None, ) -> str: """Generates the entity_id to use for a power sensor""" + if entity_id := get_entity_id_by_unique_id(hass, unique_id): + return entity_id name_pattern: str = sensor_config.get(CONF_POWER_SENSOR_NAMING) object_id = name or sensor_config.get(CONF_NAME) or source_entity.object_id entity_id = async_generate_entity_id( @@ -89,11 +94,20 @@ def generate_energy_sensor_entity_id( sensor_config: dict[str, Any], source_entity: SourceEntity | None = None, name: str | None = None, + unique_id: str | None = None, ) -> str: """Generates the entity_id to use for an energy sensor""" + if entity_id := get_entity_id_by_unique_id(hass, unique_id): + return entity_id name_pattern: str = sensor_config.get(CONF_ENERGY_SENSOR_NAMING) object_id = name or sensor_config.get(CONF_NAME) or source_entity.object_id entity_id = async_generate_entity_id( ENTITY_ID_FORMAT, name_pattern.format(object_id), hass=hass ) return entity_id + +def get_entity_id_by_unique_id(hass: HomeAssistant, unique_id: str | None) -> str | None: + if unique_id is None: + return None + entity_reg = er.async_get(hass) + return entity_reg.async_get_entity_id(SENSOR_DOMAIN, DOMAIN, unique_id) \ No newline at end of file diff --git a/custom_components/powercalc/sensors/daily_energy.py b/custom_components/powercalc/sensors/daily_energy.py index 628d50a8a..7c6ac4ee0 100644 --- a/custom_components/powercalc/sensors/daily_energy.py +++ b/custom_components/powercalc/sensors/daily_energy.py @@ -76,19 +76,21 @@ async def create_daily_fixed_energy_sensor( mode_config: dict = sensor_config.get(CONF_DAILY_FIXED_ENERGY) name = generate_energy_sensor_name(sensor_config, sensor_config.get(CONF_NAME)) - entity_id = generate_energy_sensor_entity_id(hass, sensor_config) - old_entity_id = async_generate_entity_id( - ENTITY_ID_FORMAT, sensor_config.get(CONF_NAME), hass=hass - ) - async_migrate_entity_id( - hass, SENSOR_DOMAIN, old_entity_id=old_entity_id, new_entity_id=entity_id - ) + unique_id = sensor_config.get(CONF_UNIQUE_ID) or None + entity_id = generate_energy_sensor_entity_id(hass, sensor_config, unique_id=unique_id) + if not unique_id: + old_entity_id = async_generate_entity_id( + ENTITY_ID_FORMAT, sensor_config.get(CONF_NAME), hass=hass + ) + async_migrate_entity_id( + hass, SENSOR_DOMAIN, old_entity_id=old_entity_id, new_entity_id=entity_id + ) _LOGGER.debug( "Creating daily_fixed_energy energy sensor (name=%s, entity_id=%s, unique_id=%s)", name, entity_id, - sensor_config.get(CONF_UNIQUE_ID), + unique_id, ) if CONF_ON_TIME in mode_config: diff --git a/custom_components/powercalc/sensors/energy.py b/custom_components/powercalc/sensors/energy.py index b98376ec5..ac3652b42 100644 --- a/custom_components/powercalc/sensors/energy.py +++ b/custom_components/powercalc/sensors/energy.py @@ -27,7 +27,6 @@ DEFAULT_ENERGY_INTEGRATION_METHOD, UnitPrefix, ) -from ..migrate import async_migrate_entity_id from .abstract import generate_energy_sensor_entity_id, generate_energy_sensor_name from .power import PowerSensor, RealPowerSensor @@ -70,14 +69,12 @@ async def create_energy_sensor( name = generate_energy_sensor_name( sensor_config, sensor_config.get(CONF_NAME), source_entity ) - entity_id = generate_energy_sensor_entity_id(hass, sensor_config, source_entity) - entity_category = sensor_config.get(CONF_ENERGY_SENSOR_CATEGORY) unique_id = None if power_sensor.unique_id: unique_id = f"{power_sensor.unique_id}_energy" - async_migrate_entity_id( - hass, SENSOR_DOMAIN, unique_id=unique_id, new_entity_id=entity_id - ) + + entity_id = generate_energy_sensor_entity_id(hass, sensor_config, source_entity, unique_id=unique_id) + entity_category = sensor_config.get(CONF_ENERGY_SENSOR_CATEGORY) unit_prefix = sensor_config.get(CONF_ENERGY_SENSOR_UNIT_PREFIX) if unit_prefix == UnitPrefix.NONE: diff --git a/custom_components/powercalc/sensors/power.py b/custom_components/powercalc/sensors/power.py index e6b9c2cef..9f51f71be 100644 --- a/custom_components/powercalc/sensors/power.py +++ b/custom_components/powercalc/sensors/power.py @@ -61,7 +61,6 @@ CalculationStrategy, ) from ..errors import ModelNotSupported, StrategyConfigurationError, UnsupportedMode -from ..migrate import async_migrate_entity_id from ..power_profile.model_discovery import get_light_model from ..strategy.factory import PowerCalculatorStrategyFactory from ..strategy.strategy_interface import PowerCalculationStrategyInterface @@ -98,14 +97,9 @@ async def create_virtual_power_sensor( name = generate_power_sensor_name( sensor_config, sensor_config.get(CONF_NAME), source_entity ) - entity_id = generate_power_sensor_entity_id(hass, sensor_config, source_entity) - entity_category = sensor_config.get(CONF_POWER_SENSOR_CATEGORY) - unique_id = sensor_config.get(CONF_UNIQUE_ID) or source_entity.unique_id - if unique_id: - async_migrate_entity_id( - hass, SENSOR_DOMAIN, unique_id=unique_id, new_entity_id=entity_id - ) + entity_id = generate_power_sensor_entity_id(hass, sensor_config, source_entity, unique_id=unique_id) + entity_category = sensor_config.get(CONF_POWER_SENSOR_CATEGORY) light_model = None try: diff --git a/tests/test_sensor.py b/tests/test_sensor.py index dc183b182..e34b42684 100644 --- a/tests/test_sensor.py +++ b/tests/test_sensor.py @@ -393,3 +393,27 @@ async def test_include_light_group(hass: HomeAssistant): group_state = hass.states.get("sensor.test_include_lightgroup_power") assert group_state assert group_state.attributes.get(ATTR_ENTITIES) == {"sensor.bathroom_mirror_power"} + +async def test_user_can_rename_entity_id(hass: HomeAssistant, entity_reg: EntityRegistry): + entity_reg.async_get_or_create("sensor", DOMAIN, "abcdef", suggested_object_id="my_renamed_power") + await hass.async_block_till_done() + + await create_input_boolean(hass) + + await run_powercalc_setup_yaml_config( + hass, + { + CONF_ENTITY_ID: "input_boolean.test", + CONF_MODE: CalculationStrategy.FIXED, + CONF_UNIQUE_ID: "abcdef", + CONF_FIXED: {CONF_POWER: 40}, + } + ) + await hass.async_block_till_done() + + assert hass.states.get("sensor.my_renamed_power") + assert not hass.states.get("sensor.test_power") + + energy_state = hass.states.get("sensor.test_energy") + assert energy_state + assert energy_state.attributes.get("source") == "sensor.my_renamed_power" \ No newline at end of file