Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Solax inverter via local API."""
2 
3 from __future__ import annotations
4 
5 from solax.units import Units
6 
8  SensorDeviceClass,
9  SensorEntity,
10  SensorEntityDescription,
11  SensorStateClass,
12 )
13 from homeassistant.const import (
14  PERCENTAGE,
15  UnitOfElectricCurrent,
16  UnitOfElectricPotential,
17  UnitOfEnergy,
18  UnitOfFrequency,
19  UnitOfPower,
20  UnitOfTemperature,
21 )
22 from homeassistant.core import HomeAssistant
23 from homeassistant.helpers.device_registry import DeviceInfo
24 from homeassistant.helpers.entity_platform import AddEntitiesCallback
25 from homeassistant.helpers.update_coordinator import CoordinatorEntity
26 
27 from . import SolaxConfigEntry
28 from .const import DOMAIN, MANUFACTURER
29 from .coordinator import SolaxDataUpdateCoordinator
30 
31 DEFAULT_PORT = 80
32 
33 
34 SENSOR_DESCRIPTIONS: dict[tuple[Units, bool], SensorEntityDescription] = {
35  (Units.C, False): SensorEntityDescription(
36  key=f"{Units.C}_{False}",
37  device_class=SensorDeviceClass.TEMPERATURE,
38  native_unit_of_measurement=UnitOfTemperature.CELSIUS,
39  state_class=SensorStateClass.MEASUREMENT,
40  ),
41  (Units.KWH, False): SensorEntityDescription(
42  key=f"{Units.KWH}_{False}",
43  device_class=SensorDeviceClass.ENERGY,
44  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
45  state_class=SensorStateClass.MEASUREMENT,
46  ),
47  (Units.KWH, True): SensorEntityDescription(
48  key=f"{Units.KWH}_{True}",
49  device_class=SensorDeviceClass.ENERGY,
50  native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
51  state_class=SensorStateClass.TOTAL_INCREASING,
52  ),
53  (Units.V, False): SensorEntityDescription(
54  key=f"{Units.V}_{False}",
55  device_class=SensorDeviceClass.VOLTAGE,
56  native_unit_of_measurement=UnitOfElectricPotential.VOLT,
57  state_class=SensorStateClass.MEASUREMENT,
58  ),
59  (Units.A, False): SensorEntityDescription(
60  key=f"{Units.A}_{False}",
61  device_class=SensorDeviceClass.CURRENT,
62  native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
63  state_class=SensorStateClass.MEASUREMENT,
64  ),
65  (Units.W, False): SensorEntityDescription(
66  key=f"{Units.W}_{False}",
67  device_class=SensorDeviceClass.POWER,
68  native_unit_of_measurement=UnitOfPower.WATT,
69  state_class=SensorStateClass.MEASUREMENT,
70  ),
71  (Units.PERCENT, False): SensorEntityDescription(
72  key=f"{Units.PERCENT}_{False}",
73  device_class=SensorDeviceClass.BATTERY,
74  native_unit_of_measurement=PERCENTAGE,
75  state_class=SensorStateClass.MEASUREMENT,
76  ),
77  (Units.HZ, False): SensorEntityDescription(
78  key=f"{Units.HZ}_{False}",
79  device_class=SensorDeviceClass.FREQUENCY,
80  native_unit_of_measurement=UnitOfFrequency.HERTZ,
81  state_class=SensorStateClass.MEASUREMENT,
82  ),
83  (Units.NONE, False): SensorEntityDescription(
84  key=f"{Units.NONE}_{False}",
85  ),
86 }
87 
88 
90  hass: HomeAssistant,
91  entry: SolaxConfigEntry,
92  async_add_entities: AddEntitiesCallback,
93 ) -> None:
94  """Entry setup."""
95  api = entry.runtime_data.api
96  coordinator = entry.runtime_data.coordinator
97  resp = coordinator.data
98  serial = resp.serial_number
99  version = resp.version
100  entities: list[InverterSensorEntity] = []
101  for sensor, (idx, measurement) in api.inverter.sensor_map().items():
102  description = SENSOR_DESCRIPTIONS[(measurement.unit, measurement.is_monotonic)]
103 
104  uid = f"{serial}-{idx}"
105  entities.append(
107  coordinator,
108  api.inverter.manufacturer,
109  uid,
110  serial,
111  version,
112  sensor,
113  description.native_unit_of_measurement,
114  description.state_class,
115  description.device_class,
116  )
117  )
118  async_add_entities(entities)
119 
120 
122  """Class for a sensor."""
123 
124  _attr_should_poll = False
125 
126  def __init__(
127  self,
128  coordinator: SolaxDataUpdateCoordinator,
129  manufacturer: str,
130  uid: str,
131  serial: str,
132  version: str,
133  key: str,
134  unit: str | None,
135  state_class: SensorStateClass | str | None,
136  device_class: SensorDeviceClass | None,
137  ) -> None:
138  """Initialize an inverter sensor."""
139  super().__init__(coordinator)
140  self._attr_unique_id_attr_unique_id = uid
141  self._attr_name_attr_name = f"{manufacturer} {serial} {key}"
142  self._attr_native_unit_of_measurement_attr_native_unit_of_measurement = unit
143  self._attr_state_class_attr_state_class = state_class
144  self._attr_device_class_attr_device_class = device_class
145  self._attr_device_info_attr_device_info = DeviceInfo(
146  identifiers={(DOMAIN, serial)},
147  manufacturer=MANUFACTURER,
148  name=f"{manufacturer} {serial}",
149  sw_version=version,
150  )
151  self.keykey = key
152 
153  @property
154  def native_value(self):
155  """State of this inverter attribute."""
156  return self.coordinator.data.data[self.keykey]
None __init__(self, SolaxDataUpdateCoordinator coordinator, str manufacturer, str uid, str serial, str version, str key, str|None unit, SensorStateClass|str|None state_class, SensorDeviceClass|None device_class)
Definition: sensor.py:137
None async_setup_entry(HomeAssistant hass, SolaxConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:93