Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Read status of SunWEG inverters."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from types import MappingProxyType
7 from typing import Any
8 
9 from sunweg.api import APIHelper
10 from sunweg.device import Inverter
11 from sunweg.plant import Plant
12 
13 from homeassistant.components.sensor import SensorEntity
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.const import CONF_NAME
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.device_registry import DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .. import SunWEGData
21 from ..const import CONF_PLANT_ID, DEFAULT_PLANT_ID, DOMAIN, DeviceType
22 from .inverter import INVERTER_SENSOR_TYPES
23 from .phase import PHASE_SENSOR_TYPES
24 from .sensor_entity_description import SunWEGSensorEntityDescription
25 from .string import STRING_SENSOR_TYPES
26 from .total import TOTAL_SENSOR_TYPES
27 
28 _LOGGER = logging.getLogger(__name__)
29 
30 
32  api: APIHelper, config: MappingProxyType[str, Any]
33 ) -> tuple[list[Inverter], int]:
34  """Retrieve the device list for the selected plant."""
35  plant_id = int(config[CONF_PLANT_ID])
36 
37  if plant_id == DEFAULT_PLANT_ID:
38  plant_info: list[Plant] = api.listPlants()
39  plant_id = plant_info[0].id
40 
41  devices: list[Inverter] = []
42  # Get a list of devices for specified plant to add sensors for.
43  for inverter in api.plant(plant_id).inverters:
44  api.complete_inverter(inverter)
45  devices.append(inverter)
46  return (devices, plant_id)
47 
48 
50  hass: HomeAssistant,
51  config_entry: ConfigEntry,
52  async_add_entities: AddEntitiesCallback,
53 ) -> None:
54  """Set up the SunWEG sensor."""
55  name = config_entry.data[CONF_NAME]
56 
57  probe: SunWEGData = hass.data[DOMAIN][config_entry.entry_id]
58 
59  devices, plant_id = await hass.async_add_executor_job(
60  get_device_list, probe.api, config_entry.data
61  )
62 
63  entities = [
65  probe,
66  name=f"{name} Total",
67  unique_id=f"{plant_id}-{description.key}",
68  description=description,
69  device_type=DeviceType.TOTAL,
70  )
71  for description in TOTAL_SENSOR_TYPES
72  ]
73 
74  # Add sensors for each device in the specified plant.
75  entities.extend(
76  [
78  probe,
79  name=f"{device.name}",
80  unique_id=f"{device.sn}-{description.key}",
81  description=description,
82  device_type=DeviceType.INVERTER,
83  inverter_id=device.id,
84  )
85  for device in devices
86  for description in INVERTER_SENSOR_TYPES
87  ]
88  )
89 
90  entities.extend(
91  [
93  probe,
94  name=f"{device.name} {phase.name}",
95  unique_id=f"{device.sn}-{phase.name}-{description.key}",
96  description=description,
97  inverter_id=device.id,
98  device_type=DeviceType.PHASE,
99  deep_name=phase.name,
100  )
101  for device in devices
102  for phase in device.phases
103  for description in PHASE_SENSOR_TYPES
104  ]
105  )
106 
107  entities.extend(
108  [
110  probe,
111  name=f"{device.name} {string.name}",
112  unique_id=f"{device.sn}-{string.name}-{description.key}",
113  description=description,
114  inverter_id=device.id,
115  device_type=DeviceType.STRING,
116  deep_name=string.name,
117  )
118  for device in devices
119  for mppt in device.mppts
120  for string in mppt.strings
121  for description in STRING_SENSOR_TYPES
122  ]
123  )
124 
125  async_add_entities(entities, True)
126 
127 
129  """Representation of a SunWEG Sensor."""
130 
131  entity_description: SunWEGSensorEntityDescription
132 
133  def __init__(
134  self,
135  probe: SunWEGData,
136  name: str,
137  unique_id: str,
138  description: SunWEGSensorEntityDescription,
139  device_type: DeviceType,
140  inverter_id: int = 0,
141  deep_name: str | None = None,
142  ) -> None:
143  """Initialize a sensor."""
144  self.probeprobe = probe
145  self.entity_descriptionentity_description = description
146  self.device_typedevice_type = device_type
147  self.inverter_idinverter_id = inverter_id
148  self.deep_namedeep_name = deep_name
149 
150  self._attr_name_attr_name = f"{name} {description.name}"
151  self._attr_unique_id_attr_unique_id = unique_id
152  self._attr_icon_attr_icon = (
153  description.icon if description.icon is not None else "mdi:solar-power"
154  )
155 
156  self._attr_device_info_attr_device_info = DeviceInfo(
157  identifiers={(DOMAIN, str(probe.plant_id))},
158  manufacturer="SunWEG",
159  name=name,
160  )
161 
162  def update(self) -> None:
163  """Get the latest data from the Sun WEG API and updates the state."""
164  self.probeprobe.update()
165  (
166  self._attr_native_value,
167  self._attr_native_unit_of_measurement,
168  ) = self.probeprobe.get_data(
169  api_variable_key=self.entity_descriptionentity_description.api_variable_key,
170  api_variable_unit=self.entity_descriptionentity_description.api_variable_unit,
171  deep_name=self.deep_namedeep_name,
172  device_type=self.device_typedevice_type,
173  inverter_id=self.inverter_idinverter_id,
174  name=self.entity_descriptionentity_description.name,
175  native_unit_of_measurement=self.native_unit_of_measurementnative_unit_of_measurement,
176  never_resets=self.entity_descriptionentity_description.never_resets,
177  previous_value_drop_threshold=self.entity_descriptionentity_description.previous_value_drop_threshold,
178  )
None __init__(self, SunWEGData probe, str name, str unique_id, SunWEGSensorEntityDescription description, DeviceType device_type, int inverter_id=0, str|None deep_name=None)
Definition: __init__.py:142
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: __init__.py:53
tuple[list[Inverter], int] get_device_list(APIHelper api, MappingProxyType[str, Any] config)
Definition: __init__.py:33