Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for getting collected information from PVOutput."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from pvo import Status, System
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.const import (
18  UnitOfElectricPotential,
19  UnitOfEnergy,
20  UnitOfPower,
21  UnitOfTemperature,
22 )
23 from homeassistant.core import HomeAssistant
24 from homeassistant.helpers.device_registry import DeviceInfo
25 from homeassistant.helpers.entity_platform import AddEntitiesCallback
26 from homeassistant.helpers.update_coordinator import CoordinatorEntity
27 
28 from .const import CONF_SYSTEM_ID, DOMAIN
29 from .coordinator import PVOutputDataUpdateCoordinator
30 
31 
32 @dataclass(frozen=True, kw_only=True)
34  """Describes a PVOutput sensor entity."""
35 
36  value_fn: Callable[[Status], int | float | None]
37 
38 
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,
47  ),
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,
55  ),
57  key="normalized_output",
58  translation_key="efficiency",
59  native_unit_of_measurement=(
60  f"{UnitOfEnergy.KILO_WATT_HOUR}/{UnitOfPower.KILO_WATT}"
61  ),
62  state_class=SensorStateClass.MEASUREMENT,
63  value_fn=lambda status: status.normalized_output,
64  ),
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,
72  ),
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,
80  ),
82  key="temperature",
83  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
84  device_class=SensorDeviceClass.TEMPERATURE,
85  state_class=SensorStateClass.MEASUREMENT,
86  value_fn=lambda status: status.temperature,
87  ),
89  key="voltage",
90  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
91  device_class=SensorDeviceClass.VOLTAGE,
92  state_class=SensorStateClass.MEASUREMENT,
93  value_fn=lambda status: status.voltage,
94  ),
95 )
96 
97 
99  hass: HomeAssistant,
100  entry: ConfigEntry,
101  async_add_entities: AddEntitiesCallback,
102 ) -> None:
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()
106 
109  coordinator=coordinator,
110  description=description,
111  system_id=entry.data[CONF_SYSTEM_ID],
112  system=system,
113  )
114  for description in SENSORS
115  )
116 
117 
119  CoordinatorEntity[PVOutputDataUpdateCoordinator], SensorEntity
120 ):
121  """Representation of a PVOutput sensor."""
122 
123  entity_description: PVOutputSensorEntityDescription
124  _attr_has_entity_name = True
125 
126  def __init__(
127  self,
128  *,
129  coordinator: PVOutputDataUpdateCoordinator,
130  description: PVOutputSensorEntityDescription,
131  system_id: str,
132  system: System,
133  ) -> None:
134  """Initialize a PVOutput sensor."""
135  super().__init__(coordinator=coordinator)
136  self.entity_descriptionentity_description = description
137  self._attr_unique_id_attr_unique_id = f"{system_id}_{description.key}"
138  self._attr_device_info_attr_device_info = DeviceInfo(
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,
144  )
145 
146  @property
147  def native_value(self) -> int | float | None:
148  """Return the state of the device."""
149  return self.entity_descriptionentity_description.value_fn(self.coordinator.data)
None __init__(self, *PVOutputDataUpdateCoordinator coordinator, PVOutputSensorEntityDescription description, str system_id, System system)
Definition: sensor.py:133
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:102