1 """Support for getting collected information from PVOutput."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
8 from pvo
import Status, System
13 SensorEntityDescription,
18 UnitOfElectricPotential,
28 from .const
import CONF_SYSTEM_ID, DOMAIN
29 from .coordinator
import PVOutputDataUpdateCoordinator
32 @dataclass(frozen=True, kw_only=True)
34 """Describes a PVOutput sensor entity."""
36 value_fn: Callable[[Status], int | float |
None]
39 SENSORS: tuple[PVOutputSensorEntityDescription, ...] = (
41 key=
"energy_consumption",
42 translation_key=
"energy_consumption",
43 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
44 device_class=SensorDeviceClass.ENERGY,
45 state_class=SensorStateClass.TOTAL_INCREASING,
46 value_fn=
lambda status: status.energy_consumption,
49 key=
"energy_generation",
50 translation_key=
"energy_generation",
51 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
52 device_class=SensorDeviceClass.ENERGY,
53 state_class=SensorStateClass.TOTAL_INCREASING,
54 value_fn=
lambda status: status.energy_generation,
57 key=
"normalized_output",
58 translation_key=
"efficiency",
59 native_unit_of_measurement=(
60 f
"{UnitOfEnergy.KILO_WATT_HOUR}/{UnitOfPower.KILO_WATT}"
62 state_class=SensorStateClass.MEASUREMENT,
63 value_fn=
lambda status: status.normalized_output,
66 key=
"power_consumption",
67 translation_key=
"power_consumption",
68 native_unit_of_measurement=UnitOfPower.WATT,
69 device_class=SensorDeviceClass.POWER,
70 state_class=SensorStateClass.MEASUREMENT,
71 value_fn=
lambda status: status.power_consumption,
74 key=
"power_generation",
75 translation_key=
"power_generation",
76 native_unit_of_measurement=UnitOfPower.WATT,
77 device_class=SensorDeviceClass.POWER,
78 state_class=SensorStateClass.MEASUREMENT,
79 value_fn=
lambda status: status.power_generation,
83 native_unit_of_measurement=UnitOfTemperature.CELSIUS,
84 device_class=SensorDeviceClass.TEMPERATURE,
85 state_class=SensorStateClass.MEASUREMENT,
86 value_fn=
lambda status: status.temperature,
90 native_unit_of_measurement=UnitOfElectricPotential.VOLT,
91 device_class=SensorDeviceClass.VOLTAGE,
92 state_class=SensorStateClass.MEASUREMENT,
93 value_fn=
lambda status: status.voltage,
101 async_add_entities: AddEntitiesCallback,
103 """Set up a PVOutput sensors based on a config entry."""
104 coordinator: PVOutputDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
105 system = await coordinator.pvoutput.system()
109 coordinator=coordinator,
110 description=description,
111 system_id=entry.data[CONF_SYSTEM_ID],
114 for description
in SENSORS
119 CoordinatorEntity[PVOutputDataUpdateCoordinator], SensorEntity
121 """Representation of a PVOutput sensor."""
123 entity_description: PVOutputSensorEntityDescription
124 _attr_has_entity_name =
True
129 coordinator: PVOutputDataUpdateCoordinator,
130 description: PVOutputSensorEntityDescription,
134 """Initialize a PVOutput sensor."""
135 super().
__init__(coordinator=coordinator)
139 configuration_url=f
"https://pvoutput.org/list.jsp?sid={system_id}",
140 identifiers={(DOMAIN,
str(system_id))},
141 manufacturer=
"PVOutput",
142 model=system.inverter_brand,
143 name=system.system_name,
148 """Return the state of the device."""
None __init__(self, *PVOutputDataUpdateCoordinator coordinator, PVOutputSensorEntityDescription description, str system_id, System system)
int|float|None native_value(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)