Skip to content

Commit 2378fab

Browse files
committed
fix: cleanup duplication in energy sensor resolving
1 parent 5598c33 commit 2378fab

2 files changed

Lines changed: 20 additions & 33 deletions

File tree

custom_components/powercalc/sensors/cost.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
UnitOfEnergy,
1414
)
1515
from homeassistant.core import Event, EventStateChangedData, HomeAssistant, State, callback
16-
import homeassistant.helpers.entity_registry as er
1716
from homeassistant.helpers.event import async_track_state_change_event
1817
from homeassistant.helpers.restore_state import RestoreEntity
1918
from homeassistant.helpers.typing import ConfigType
@@ -32,15 +31,14 @@
3231
DOMAIN,
3332
DOMAIN_CONFIG,
3433
)
35-
from custom_components.powercalc.errors import SensorConfigurationError
3634
from custom_components.powercalc.unit import convert_to_decimal, parse_decimal
3735

3836
from .abstract import (
3937
BaseEntity,
4038
generate_cost_sensor_entity_id,
4139
generate_cost_sensor_name,
4240
)
43-
from .energy import EnergySensor, RealEnergySensor
41+
from .energy import EnergySensor, resolve_existing_energy_sensor
4442

4543
if TYPE_CHECKING:
4644
from datetime import datetime
@@ -188,17 +186,7 @@ def create_cost_sensor_for_energy_entity(hass: HomeAssistant, sensor_config: Con
188186
"""
189187
cost_config = sensor_config.get(CONF_COST, {})
190188
energy_sensor_id = cost_config.get(CONF_ENERGY_SENSOR_ID) or sensor_config[CONF_ENERGY_SENSOR_ID]
191-
entity_entry = er.async_get(hass).async_get(energy_sensor_id)
192-
if entity_entry is None:
193-
raise SensorConfigurationError(
194-
f"No energy sensor with id {energy_sensor_id} found in your HA instance. "
195-
"Double check the `energy_sensor_id` setting",
196-
)
197-
energy_sensor = RealEnergySensor(
198-
entity_entry.entity_id,
199-
entity_entry.name or entity_entry.original_name,
200-
entity_entry.unique_id,
201-
)
189+
energy_sensor = resolve_existing_energy_sensor(hass, energy_sensor_id)
202190
# In YAML the name is optional, fall back to the name of the tracked energy sensor.
203191
name = sensor_config.get(CONF_NAME) or energy_sensor.name
204192
return create_cost_sensor(

custom_components/powercalc/sensors/energy.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,17 @@ def create_energy_sensor(
8080
return _create_virtual_energy_sensor(hass, sensor_config, power_sensor, source_entity)
8181

8282

83+
def resolve_existing_energy_sensor(hass: HomeAssistant, energy_sensor_id: str) -> RealEnergySensor:
84+
"""Look up an existing energy sensor in the entity registry, raising when not found."""
85+
entity_entry = er.async_get(hass).async_get(energy_sensor_id)
86+
if entity_entry is None:
87+
raise SensorConfigurationError(
88+
f"No energy sensor with id {energy_sensor_id} found in your HA instance. "
89+
"Double check the `energy_sensor_id` setting",
90+
)
91+
return RealEnergySensor.from_registry_entry(entity_entry)
92+
93+
8394
def _get_existing_energy_sensor(
8495
hass: HomeAssistant,
8596
sensor_config: ConfigType,
@@ -88,19 +99,7 @@ def _get_existing_energy_sensor(
8899
if CONF_ENERGY_SENSOR_ID not in sensor_config:
89100
return None
90101

91-
ent_reg = er.async_get(hass)
92-
energy_sensor_id = sensor_config[CONF_ENERGY_SENSOR_ID]
93-
entity_entry = ent_reg.async_get(energy_sensor_id)
94-
if entity_entry is None:
95-
raise SensorConfigurationError(
96-
f"No energy sensor with id {energy_sensor_id} found in your HA instance. "
97-
"Double check `energy_sensor_id` setting",
98-
)
99-
return RealEnergySensor(
100-
entity_entry.entity_id,
101-
entity_entry.name or entity_entry.original_name,
102-
entity_entry.unique_id,
103-
)
102+
return resolve_existing_energy_sensor(hass, sensor_config[CONF_ENERGY_SENSOR_ID])
104103

105104

106105
def _get_related_energy_sensor(
@@ -227,12 +226,7 @@ def _find_related_real_energy_sensor(
227226
if not energy_sensors:
228227
return None
229228

230-
entity_entry = energy_sensors[0]
231-
return RealEnergySensor(
232-
entity_entry.entity_id,
233-
entity_entry.name or entity_entry.original_name,
234-
entity_entry.unique_id,
235-
)
229+
return RealEnergySensor.from_registry_entry(energy_sensors[0])
236230

237231

238232
class EnergySensor(BaseEntity):
@@ -365,6 +359,11 @@ def __init__(
365359
self._name = name
366360
self._unique_id = unique_id
367361

362+
@classmethod
363+
def from_registry_entry(cls, entry: er.RegistryEntry) -> RealEnergySensor:
364+
"""Create a reference to an existing energy sensor from its registry entry."""
365+
return cls(entry.entity_id, entry.name or entry.original_name, entry.unique_id)
366+
368367
@property
369368
def name(self) -> str | None:
370369
"""Return the name of the sensor."""

0 commit comments

Comments
 (0)