Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Autarco sensors."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 
8 from autarco import Battery, Inverter, Solar
9 
11  SensorDeviceClass,
12  SensorEntity,
13  SensorEntityDescription,
14  SensorStateClass,
15 )
16 from homeassistant.const import PERCENTAGE, UnitOfEnergy, UnitOfPower
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import StateType
21 from homeassistant.helpers.update_coordinator import CoordinatorEntity
22 
23 from . import AutarcoConfigEntry
24 from .const import DOMAIN
25 from .coordinator import AutarcoDataUpdateCoordinator
26 
27 
28 @dataclass(frozen=True, kw_only=True)
30  """Describes an Autarco sensor entity."""
31 
32  value_fn: Callable[[Battery], StateType]
33 
34 
35 SENSORS_BATTERY: tuple[AutarcoBatterySensorEntityDescription, ...] = (
37  key="flow_now",
38  translation_key="flow_now",
39  native_unit_of_measurement=UnitOfPower.WATT,
40  device_class=SensorDeviceClass.POWER,
41  state_class=SensorStateClass.MEASUREMENT,
42  value_fn=lambda battery: battery.flow_now,
43  ),
45  key="state_of_charge",
46  translation_key="state_of_charge",
47  native_unit_of_measurement=PERCENTAGE,
48  device_class=SensorDeviceClass.BATTERY,
49  state_class=SensorStateClass.MEASUREMENT,
50  value_fn=lambda battery: battery.state_of_charge,
51  ),
53  key="discharged_today",
54  translation_key="discharged_today",
55  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
56  device_class=SensorDeviceClass.ENERGY,
57  state_class=SensorStateClass.TOTAL,
58  value_fn=lambda battery: battery.discharged_today,
59  ),
61  key="discharged_month",
62  translation_key="discharged_month",
63  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
64  device_class=SensorDeviceClass.ENERGY,
65  state_class=SensorStateClass.TOTAL,
66  value_fn=lambda battery: battery.discharged_month,
67  ),
69  key="discharged_total",
70  translation_key="discharged_total",
71  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
72  device_class=SensorDeviceClass.ENERGY,
73  state_class=SensorStateClass.TOTAL_INCREASING,
74  value_fn=lambda battery: battery.discharged_total,
75  ),
77  key="charged_today",
78  translation_key="charged_today",
79  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
80  device_class=SensorDeviceClass.ENERGY,
81  state_class=SensorStateClass.TOTAL,
82  value_fn=lambda battery: battery.charged_today,
83  ),
85  key="charged_month",
86  translation_key="charged_month",
87  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
88  device_class=SensorDeviceClass.ENERGY,
89  state_class=SensorStateClass.TOTAL,
90  value_fn=lambda battery: battery.charged_month,
91  ),
93  key="charged_total",
94  translation_key="charged_total",
95  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
96  device_class=SensorDeviceClass.ENERGY,
97  state_class=SensorStateClass.TOTAL_INCREASING,
98  value_fn=lambda battery: battery.charged_total,
99  ),
100 )
101 
102 
103 @dataclass(frozen=True, kw_only=True)
105  """Describes an Autarco sensor entity."""
106 
107  value_fn: Callable[[Solar], StateType]
108 
109 
110 SENSORS_SOLAR: tuple[AutarcoSolarSensorEntityDescription, ...] = (
112  key="power_production",
113  translation_key="power_production",
114  native_unit_of_measurement=UnitOfPower.WATT,
115  device_class=SensorDeviceClass.POWER,
116  state_class=SensorStateClass.MEASUREMENT,
117  value_fn=lambda solar: solar.power_production,
118  ),
120  key="energy_production_today",
121  translation_key="energy_production_today",
122  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
123  device_class=SensorDeviceClass.ENERGY,
124  state_class=SensorStateClass.TOTAL,
125  value_fn=lambda solar: solar.energy_production_today,
126  ),
128  key="energy_production_month",
129  translation_key="energy_production_month",
130  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
131  device_class=SensorDeviceClass.ENERGY,
132  state_class=SensorStateClass.TOTAL,
133  value_fn=lambda solar: solar.energy_production_month,
134  ),
136  key="energy_production_total",
137  translation_key="energy_production_total",
138  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
139  device_class=SensorDeviceClass.ENERGY,
140  state_class=SensorStateClass.TOTAL_INCREASING,
141  value_fn=lambda solar: solar.energy_production_total,
142  ),
143 )
144 
145 
146 @dataclass(frozen=True, kw_only=True)
148  """Describes an Autarco inverter sensor entity."""
149 
150  value_fn: Callable[[Inverter], StateType]
151 
152 
153 SENSORS_INVERTER: tuple[AutarcoInverterSensorEntityDescription, ...] = (
155  key="out_ac_power",
156  translation_key="out_ac_power",
157  native_unit_of_measurement=UnitOfPower.WATT,
158  device_class=SensorDeviceClass.POWER,
159  state_class=SensorStateClass.MEASUREMENT,
160  value_fn=lambda inverter: inverter.out_ac_power,
161  ),
163  key="out_ac_energy_total",
164  translation_key="out_ac_energy_total",
165  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
166  device_class=SensorDeviceClass.ENERGY,
167  state_class=SensorStateClass.TOTAL_INCREASING,
168  value_fn=lambda inverter: inverter.out_ac_energy_total,
169  ),
170 )
171 
172 
174  hass: HomeAssistant,
175  entry: AutarcoConfigEntry,
176  async_add_entities: AddEntitiesCallback,
177 ) -> None:
178  """Set up Autarco sensors based on a config entry."""
179  entities: list[SensorEntity] = []
180  for coordinator in entry.runtime_data:
181  entities.extend(
183  coordinator=coordinator,
184  description=description,
185  )
186  for description in SENSORS_SOLAR
187  )
188  entities.extend(
190  coordinator=coordinator,
191  description=description,
192  serial_number=inverter,
193  )
194  for description in SENSORS_INVERTER
195  for inverter in coordinator.data.inverters
196  )
197  if coordinator.data.battery:
198  entities.extend(
200  coordinator=coordinator,
201  description=description,
202  )
203  for description in SENSORS_BATTERY
204  )
205  async_add_entities(entities)
206 
207 
209  CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
210 ):
211  """Defines an Autarco battery sensor."""
212 
213  entity_description: AutarcoBatterySensorEntityDescription
214  _attr_has_entity_name = True
215 
216  def __init__(
217  self,
218  *,
219  coordinator: AutarcoDataUpdateCoordinator,
220  description: AutarcoBatterySensorEntityDescription,
221  ) -> None:
222  """Initialize Autarco sensor."""
223  super().__init__(coordinator)
224 
225  self.entity_descriptionentity_description = description
226  self._attr_unique_id_attr_unique_id = (
227  f"{coordinator.account_site.site_id}_battery_{description.key}"
228  )
229  self._attr_device_info_attr_device_info = DeviceInfo(
230  identifiers={(DOMAIN, f"{coordinator.account_site.site_id}_battery")},
231  entry_type=DeviceEntryType.SERVICE,
232  manufacturer="Autarco",
233  name="Battery",
234  )
235 
236  @property
237  def native_value(self) -> StateType:
238  """Return the state of the sensor."""
239  assert self.coordinator.data.battery is not None
240  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.battery)
241 
242 
244  CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
245 ):
246  """Defines an Autarco solar sensor."""
247 
248  entity_description: AutarcoSolarSensorEntityDescription
249  _attr_has_entity_name = True
250 
251  def __init__(
252  self,
253  *,
254  coordinator: AutarcoDataUpdateCoordinator,
255  description: AutarcoSolarSensorEntityDescription,
256  ) -> None:
257  """Initialize Autarco sensor."""
258  super().__init__(coordinator)
259 
260  self.entity_descriptionentity_description = description
261  self._attr_unique_id_attr_unique_id = (
262  f"{coordinator.account_site.site_id}_solar_{description.key}"
263  )
264  self._attr_device_info_attr_device_info = DeviceInfo(
265  identifiers={(DOMAIN, f"{coordinator.account_site.site_id}_solar")},
266  entry_type=DeviceEntryType.SERVICE,
267  manufacturer="Autarco",
268  name="Solar",
269  )
270 
271  @property
272  def native_value(self) -> StateType:
273  """Return the state of the sensor."""
274  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.solar)
275 
276 
278  CoordinatorEntity[AutarcoDataUpdateCoordinator], SensorEntity
279 ):
280  """Defines an Autarco inverter sensor."""
281 
282  entity_description: AutarcoInverterSensorEntityDescription
283  _attr_has_entity_name = True
284 
285  def __init__(
286  self,
287  *,
288  coordinator: AutarcoDataUpdateCoordinator,
289  description: AutarcoInverterSensorEntityDescription,
290  serial_number: str,
291  ) -> None:
292  """Initialize Autarco sensor."""
293  super().__init__(coordinator)
294 
295  self.entity_descriptionentity_description = description
296  self._serial_number_serial_number = serial_number
297  self._attr_unique_id_attr_unique_id = f"{serial_number}_{description.key}"
298  self._attr_device_info_attr_device_info = DeviceInfo(
299  identifiers={(DOMAIN, serial_number)},
300  name=f"Inverter {serial_number}",
301  manufacturer="Autarco",
302  model="Inverter",
303  serial_number=serial_number,
304  )
305 
306  @property
307  def native_value(self) -> StateType:
308  """Return the state of the sensor."""
309  return self.entity_descriptionentity_description.value_fn(
310  self.coordinator.data.inverters[self._serial_number_serial_number]
311  )
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoBatterySensorEntityDescription description)
Definition: sensor.py:221
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoInverterSensorEntityDescription description, str serial_number)
Definition: sensor.py:291
None __init__(self, *AutarcoDataUpdateCoordinator coordinator, AutarcoSolarSensorEntityDescription description)
Definition: sensor.py:256
None async_setup_entry(HomeAssistant hass, AutarcoConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:177