Files
HomeAssistantVS/custom_components/powercalc/sensors/energy_related.py
T
2026-07-14 23:57:03 -04:00

67 lines
2.6 KiB
Python

from __future__ import annotations
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.typing import ConfigType
from custom_components.powercalc.common import SourceEntity
from custom_components.powercalc.const import CONF_CREATE_COST_SENSOR
from .cost import create_cost_sensor
from .energy import EnergySensor
from .utility_meter import create_utility_meters
def create_energy_related_sensors(
hass: HomeAssistant,
sensor_config: ConfigType,
energy_sensor: EnergySensor,
source_entity: SourceEntity | None = None,
config_entry: ConfigEntry | None = None,
utility_meter_config: ConfigType | None = None,
cost_name: str | None = None,
) -> list[Entity]:
"""Create optional utility meters and cost sensor for an energy sensor.
When cost sensors are enabled, a cost sensor is created for the energy sensor and,
when utility meters are enabled as well, one additional cost sensor per utility meter.
"""
entities: list[Entity] = []
meter_config = sensor_config if utility_meter_config is None else utility_meter_config
utility_meters = create_utility_meters(hass, energy_sensor, meter_config, config_entry)
entities.extend(utility_meters)
cost_sensor = create_cost_sensor_if_needed(hass, sensor_config, energy_sensor, source_entity, cost_name)
if cost_sensor:
entities.append(cost_sensor)
# A cost sensor per utility meter, so each meter cycle (daily, monthly, ...) is priced individually.
for utility_meter in utility_meters:
meter_name = utility_meter.name if isinstance(utility_meter.name, str) else None
# The utility meter resets each cycle, so the cost sensor must reset along with it.
meter_cost_sensor = create_cost_sensor(
hass,
sensor_config,
utility_meter,
source_entity,
meter_name,
reset_on_source_reset=True,
)
if meter_cost_sensor:
entities.append(meter_cost_sensor)
return entities
def create_cost_sensor_if_needed(
hass: HomeAssistant,
sensor_config: ConfigType,
energy_sensor: EnergySensor,
source_entity: SourceEntity | None = None,
name: str | None = None,
) -> Entity | None:
"""Create a cost sensor when enabled and configured."""
if not sensor_config.get(CONF_CREATE_COST_SENSOR):
return None
return create_cost_sensor(hass, sensor_config, energy_sensor, source_entity, name)