67 lines
2.6 KiB
Python
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)
|