1 """Support for SolarEdge Monitoring API."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
8 from aiosolaredge
import SolarEdge
13 SensorEntityDescription,
22 DataUpdateCoordinator,
25 from .const
import CONF_SITE_ID, DATA_API_CLIENT, DOMAIN
26 from .coordinator
import (
28 SolarEdgeDetailsDataService,
29 SolarEdgeEnergyDetailsService,
30 SolarEdgeInventoryDataService,
31 SolarEdgeOverviewDataService,
32 SolarEdgePowerFlowDataService,
34 from .types
import SolarEdgeConfigEntry
37 @dataclass(frozen=True, kw_only=True)
39 """Sensor entity description for SolarEdge."""
46 key=
"lifetime_energy",
47 json_key=
"lifeTimeData",
48 translation_key=
"lifetime_energy",
49 state_class=SensorStateClass.TOTAL,
50 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
51 device_class=SensorDeviceClass.ENERGY,
54 key=
"energy_this_year",
55 json_key=
"lastYearData",
56 translation_key=
"energy_this_year",
57 entity_registry_enabled_default=
False,
58 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
59 device_class=SensorDeviceClass.ENERGY,
62 key=
"energy_this_month",
63 json_key=
"lastMonthData",
64 translation_key=
"energy_this_month",
65 entity_registry_enabled_default=
False,
66 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
67 device_class=SensorDeviceClass.ENERGY,
71 json_key=
"lastDayData",
72 translation_key=
"energy_today",
73 entity_registry_enabled_default=
False,
74 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
75 device_class=SensorDeviceClass.ENERGY,
79 json_key=
"currentPower",
80 translation_key=
"current_power",
81 state_class=SensorStateClass.MEASUREMENT,
82 native_unit_of_measurement=UnitOfPower.WATT,
83 device_class=SensorDeviceClass.POWER,
88 translation_key=
"site_details",
89 entity_registry_enabled_default=
False,
94 translation_key=
"meters",
95 entity_registry_enabled_default=
False,
100 translation_key=
"sensors",
101 entity_registry_enabled_default=
False,
106 translation_key=
"gateways",
107 entity_registry_enabled_default=
False,
111 json_key=
"batteries",
112 translation_key=
"batteries",
113 entity_registry_enabled_default=
False,
117 json_key=
"inverters",
118 translation_key=
"inverters",
119 entity_registry_enabled_default=
False,
122 key=
"power_consumption",
124 translation_key=
"power_consumption",
125 entity_registry_enabled_default=
False,
130 translation_key=
"solar_power",
131 entity_registry_enabled_default=
False,
136 translation_key=
"grid_power",
137 entity_registry_enabled_default=
False,
142 translation_key=
"storage_power",
143 entity_registry_enabled_default=
False,
146 key=
"purchased_energy",
147 json_key=
"Purchased",
148 translation_key=
"purchased_energy",
149 entity_registry_enabled_default=
False,
150 state_class=SensorStateClass.TOTAL_INCREASING,
151 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
152 device_class=SensorDeviceClass.ENERGY,
155 key=
"production_energy",
156 json_key=
"Production",
157 translation_key=
"production_energy",
158 entity_registry_enabled_default=
False,
159 state_class=SensorStateClass.TOTAL_INCREASING,
160 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
161 device_class=SensorDeviceClass.ENERGY,
164 key=
"consumption_energy",
165 json_key=
"Consumption",
166 translation_key=
"consumption_energy",
167 entity_registry_enabled_default=
False,
168 state_class=SensorStateClass.TOTAL_INCREASING,
169 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
170 device_class=SensorDeviceClass.ENERGY,
173 key=
"selfconsumption_energy",
174 json_key=
"SelfConsumption",
175 translation_key=
"selfconsumption_energy",
176 entity_registry_enabled_default=
False,
177 state_class=SensorStateClass.TOTAL_INCREASING,
178 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
179 device_class=SensorDeviceClass.ENERGY,
184 translation_key=
"feedin_energy",
185 entity_registry_enabled_default=
False,
186 state_class=SensorStateClass.TOTAL_INCREASING,
187 native_unit_of_measurement=UnitOfEnergy.WATT_HOUR,
188 device_class=SensorDeviceClass.ENERGY,
193 translation_key=
"storage_level",
194 entity_registry_enabled_default=
False,
195 state_class=SensorStateClass.MEASUREMENT,
196 native_unit_of_measurement=PERCENTAGE,
203 entry: SolarEdgeConfigEntry,
204 async_add_entities: AddEntitiesCallback,
206 """Add an solarEdge entry."""
208 api = entry.runtime_data[DATA_API_CLIENT]
210 for service
in sensor_factory.all_services:
211 service.async_setup()
212 await service.coordinator.async_refresh()
215 for sensor_type
in SENSOR_TYPES:
216 sensor = sensor_factory.create_sensor(sensor_type)
217 if sensor
is not None:
218 entities.append(sensor)
223 """Factory which creates sensors based on the sensor_key."""
225 def __init__(self, hass: HomeAssistant, site_id: str, api: SolarEdge) ->
None:
226 """Initialize the factory."""
234 self.
all_servicesall_services = (details, overview, inventory, flow, energy)
239 type[SolarEdgeSensorEntity | SolarEdgeOverviewSensor],
240 SolarEdgeDataService,
242 ] = {
"site_details": (SolarEdgeDetailsSensor, details)}
251 self.services[key] = (SolarEdgeOverviewSensor, overview)
253 for key
in (
"meters",
"sensors",
"gateways",
"batteries",
"inverters"):
254 self.services[key] = (SolarEdgeInventorySensor, inventory)
256 for key
in (
"power_consumption",
"solar_power",
"grid_power",
"storage_power"):
257 self.services[key] = (SolarEdgePowerFlowSensor, flow)
259 for key
in (
"storage_level",):
260 self.services[key] = (SolarEdgeStorageLevelSensor, flow)
266 "consumption_energy",
267 "selfconsumption_energy",
269 self.services[key] = (SolarEdgeEnergyDetailsSensor, energy)
272 self, sensor_type: SolarEdgeSensorEntityDescription
273 ) -> SolarEdgeSensorEntity:
274 """Create and return a sensor based on the sensor_key."""
275 sensor_class, service = self.services[sensor_type.key]
277 return sensor_class(sensor_type, service)
281 CoordinatorEntity[DataUpdateCoordinator[
None]], SensorEntity
283 """Abstract class for a solaredge sensor."""
285 _attr_has_entity_name =
True
287 entity_description: SolarEdgeSensorEntityDescription
291 description: SolarEdgeSensorEntityDescription,
292 data_service: SolarEdgeDataService,
294 """Initialize the sensor."""
295 super().
__init__(data_service.coordinator)
299 identifiers={(DOMAIN, data_service.site_id)}, manufacturer=
"SolarEdge"
304 """Return a unique ID."""
307 return f
"{self.data_service.site_id}_{self.entity_description.key}"
311 """Representation of an SolarEdge Monitoring API overview sensor."""
315 """Return the state of the sensor."""
320 """Representation of an SolarEdge Monitoring API details sensor."""
324 """Return the state attributes."""
329 """Return the state of the sensor."""
334 """Return a unique ID."""
341 """Representation of an SolarEdge Monitoring API inventory sensor."""
345 """Return the state attributes."""
350 """Return the state of the sensor."""
355 """Representation of an SolarEdge Monitoring API power flow sensor."""
359 sensor_type: SolarEdgeSensorEntityDescription,
360 data_service: SolarEdgeEnergyDetailsService,
362 """Initialize the power flow sensor."""
363 super().
__init__(sensor_type, data_service)
369 """Return the state attributes."""
374 """Return the state of the sensor."""
379 """Representation of an SolarEdge Monitoring API power flow sensor."""
381 _attr_device_class = SensorDeviceClass.POWER
385 description: SolarEdgeSensorEntityDescription,
386 data_service: SolarEdgePowerFlowDataService,
388 """Initialize the power flow sensor."""
389 super().
__init__(description, data_service)
395 """Return the state attributes."""
400 """Return the state of the sensor."""
405 """Representation of an SolarEdge Monitoring API storage level sensor."""
407 _attr_device_class = SensorDeviceClass.BATTERY
411 """Return the state of the sensor."""
413 if attr
and "soc" in attr:
str|None native_value(self)
dict[str, Any] extra_state_attributes(self)
None __init__(self, SolarEdgeSensorEntityDescription sensor_type, SolarEdgeEnergyDetailsService data_service)
str|None native_value(self)
dict[str, Any]|None extra_state_attributes(self)
_attr_native_unit_of_measurement
str|None native_value(self)
dict[str, Any]|None extra_state_attributes(self)
str|None native_value(self)
None __init__(self, SolarEdgeSensorEntityDescription description, SolarEdgePowerFlowDataService data_service)
str|None native_value(self)
dict[str, Any]|None extra_state_attributes(self)
_attr_native_unit_of_measurement
None __init__(self, SolarEdgeSensorEntityDescription description, SolarEdgeDataService data_service)
SolarEdgeSensorEntity create_sensor(self, SolarEdgeSensorEntityDescription sensor_type)
None __init__(self, HomeAssistant hass, str site_id, SolarEdge api)
str|None native_value(self)
None async_setup_entry(HomeAssistant hass, SolarEdgeConfigEntry entry, AddEntitiesCallback async_add_entities)