Fix SolarEdge statistics; missing device_class (#53720)

This commit is contained in:
Franck Nijhof 2021-07-29 21:34:22 +02:00 committed by GitHub
parent 3c0e4b1fd9
commit 7c98fc94d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 59 deletions

View file

@ -3,10 +3,16 @@ from datetime import timedelta
import logging import logging
from homeassistant.components.sensor import STATE_CLASS_MEASUREMENT from homeassistant.components.sensor import STATE_CLASS_MEASUREMENT
from homeassistant.const import ENERGY_WATT_HOUR, PERCENTAGE, POWER_WATT from homeassistant.const import (
DEVICE_CLASS_ENERGY,
DEVICE_CLASS_POWER,
ENERGY_WATT_HOUR,
PERCENTAGE,
POWER_WATT,
)
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from .models import SolarEdgeSensor from .models import SolarEdgeSensorEntityDescription
DOMAIN = "solaredge" DOMAIN = "solaredge"
@ -29,7 +35,7 @@ SCAN_INTERVAL = timedelta(minutes=15)
# Supported overview sensors # Supported overview sensors
SENSOR_TYPES = [ SENSOR_TYPES = [
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="lifetime_energy", key="lifetime_energy",
json_key="lifeTimeData", json_key="lifeTimeData",
name="Lifetime energy", name="Lifetime energy",
@ -37,138 +43,143 @@ SENSOR_TYPES = [
last_reset=dt_util.utc_from_timestamp(0), last_reset=dt_util.utc_from_timestamp(0),
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=ENERGY_WATT_HOUR, unit_of_measurement=ENERGY_WATT_HOUR,
device_class=DEVICE_CLASS_ENERGY,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="energy_this_year", key="energy_this_year",
json_key="lastYearData", json_key="lastYearData",
name="Energy this year", name="Energy this year",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:solar-power", icon="mdi:solar-power",
unit_of_measurement=ENERGY_WATT_HOUR, unit_of_measurement=ENERGY_WATT_HOUR,
device_class=DEVICE_CLASS_ENERGY,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="energy_this_month", key="energy_this_month",
json_key="lastMonthData", json_key="lastMonthData",
name="Energy this month", name="Energy this month",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:solar-power", icon="mdi:solar-power",
unit_of_measurement=ENERGY_WATT_HOUR, unit_of_measurement=ENERGY_WATT_HOUR,
device_class=DEVICE_CLASS_ENERGY,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="energy_today", key="energy_today",
json_key="lastDayData", json_key="lastDayData",
name="Energy today", name="Energy today",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:solar-power", icon="mdi:solar-power",
unit_of_measurement=ENERGY_WATT_HOUR, unit_of_measurement=ENERGY_WATT_HOUR,
device_class=DEVICE_CLASS_ENERGY,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="current_power", key="current_power",
json_key="currentPower", json_key="currentPower",
name="Current Power", name="Current Power",
icon="mdi:solar-power", icon="mdi:solar-power",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
unit_of_measurement=POWER_WATT, unit_of_measurement=POWER_WATT,
device_class=DEVICE_CLASS_POWER,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="site_details", key="site_details",
name="Site details", name="Site details",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="meters", key="meters",
json_key="meters", json_key="meters",
name="Meters", name="Meters",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="sensors", key="sensors",
json_key="sensors", json_key="sensors",
name="Sensors", name="Sensors",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="gateways", key="gateways",
json_key="gateways", json_key="gateways",
name="Gateways", name="Gateways",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="batteries", key="batteries",
json_key="batteries", json_key="batteries",
name="Batteries", name="Batteries",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="inverters", key="inverters",
json_key="inverters", json_key="inverters",
name="Inverters", name="Inverters",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="power_consumption", key="power_consumption",
json_key="LOAD", json_key="LOAD",
name="Power Consumption", name="Power Consumption",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="solar_power", key="solar_power",
json_key="PV", json_key="PV",
name="Solar Power", name="Solar Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:solar-power", icon="mdi:solar-power",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="grid_power", key="grid_power",
json_key="GRID", json_key="GRID",
name="Grid Power", name="Grid Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:power-plug", icon="mdi:power-plug",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="storage_power", key="storage_power",
json_key="STORAGE", json_key="STORAGE",
name="Storage Power", name="Storage Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:car-battery", icon="mdi:car-battery",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="purchased_power", key="purchased_power",
json_key="Purchased", json_key="Purchased",
name="Imported Power", name="Imported Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="production_power", key="production_power",
json_key="Production", json_key="Production",
name="Production Power", name="Production Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="consumption_power", key="consumption_power",
json_key="Consumption", json_key="Consumption",
name="Consumption Power", name="Consumption Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="selfconsumption_power", key="selfconsumption_power",
json_key="SelfConsumption", json_key="SelfConsumption",
name="SelfConsumption Power", name="SelfConsumption Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="feedin_power", key="feedin_power",
json_key="FeedIn", json_key="FeedIn",
name="Exported Power", name="Exported Power",
entity_registry_enabled_default=False, entity_registry_enabled_default=False,
icon="mdi:flash", icon="mdi:flash",
), ),
SolarEdgeSensor( SolarEdgeSensorEntityDescription(
key="storage_level", key="storage_level",
json_key="STORAGE", json_key="STORAGE",
name="Storage Level", name="Storage Level",

View file

@ -2,20 +2,12 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime
from homeassistant.components.sensor import SensorEntityDescription
@dataclass @dataclass
class SolarEdgeSensor: class SolarEdgeSensorEntityDescription(SensorEntityDescription):
"""Represents an SolarEdge Sensor.""" """Sensor entity description for SolarEdge."""
key: str
name: str
json_key: str | None = None json_key: str | None = None
device_class: str | None = None
entity_registry_enabled_default: bool = True
icon: str | None = None
last_reset: datetime | None = None
state_class: str | None = None
unit_of_measurement: str | None = None

View file

@ -21,7 +21,7 @@ from .coordinator import (
SolarEdgeOverviewDataService, SolarEdgeOverviewDataService,
SolarEdgePowerFlowDataService, SolarEdgePowerFlowDataService,
) )
from .models import SolarEdgeSensor from .models import SolarEdgeSensorEntityDescription
async def async_setup_entry( async def async_setup_entry(
@ -68,7 +68,8 @@ class SolarEdgeSensorFactory:
self.services: dict[ self.services: dict[
str, str,
tuple[ tuple[
type[SolarEdgeSensor | SolarEdgeOverviewSensor], SolarEdgeDataService type[SolarEdgeSensorEntity | SolarEdgeOverviewSensor],
SolarEdgeDataService,
], ],
] = {"site_details": (SolarEdgeDetailsSensor, details)} ] = {"site_details": (SolarEdgeDetailsSensor, details)}
@ -99,7 +100,9 @@ class SolarEdgeSensorFactory:
): ):
self.services[key] = (SolarEdgeEnergyDetailsSensor, energy) self.services[key] = (SolarEdgeEnergyDetailsSensor, energy)
def create_sensor(self, sensor_type: SolarEdgeSensor) -> SolarEdgeSensor: def create_sensor(
self, sensor_type: SolarEdgeSensorEntityDescription
) -> SolarEdgeSensorEntityDescription:
"""Create and return a sensor based on the sensor_key.""" """Create and return a sensor based on the sensor_key."""
sensor_class, service = self.services[sensor_type.key] sensor_class, service = self.services[sensor_type.key]
@ -109,27 +112,21 @@ class SolarEdgeSensorFactory:
class SolarEdgeSensorEntity(CoordinatorEntity, SensorEntity): class SolarEdgeSensorEntity(CoordinatorEntity, SensorEntity):
"""Abstract class for a solaredge sensor.""" """Abstract class for a solaredge sensor."""
entity_description: SolarEdgeSensorEntityDescription
def __init__( def __init__(
self, self,
platform_name: str, platform_name: str,
sensor_type: SolarEdgeSensor, description: SolarEdgeSensorEntityDescription,
data_service: SolarEdgeDataService, data_service: SolarEdgeDataService,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__(data_service.coordinator) super().__init__(data_service.coordinator)
self.platform_name = platform_name self.platform_name = platform_name
self.sensor_type = sensor_type self.entity_description = description
self.data_service = data_service self.data_service = data_service
self._attr_device_class = sensor_type.device_class self._attr_name = f"{platform_name} ({description.name})"
self._attr_entity_registry_enabled_default = (
sensor_type.entity_registry_enabled_default
)
self._attr_icon = sensor_type.icon
self._attr_last_reset = sensor_type.last_reset
self._attr_name = f"{platform_name} ({sensor_type.name})"
self._attr_state_class = sensor_type.state_class
self._attr_unit_of_measurement = sensor_type.unit_of_measurement
class SolarEdgeOverviewSensor(SolarEdgeSensorEntity): class SolarEdgeOverviewSensor(SolarEdgeSensorEntity):
@ -138,7 +135,7 @@ class SolarEdgeOverviewSensor(SolarEdgeSensorEntity):
@property @property
def state(self) -> str | None: def state(self) -> str | None:
"""Return the state of the sensor.""" """Return the state of the sensor."""
return self.data_service.data.get(self.sensor_type.json_key) return self.data_service.data.get(self.entity_description.json_key)
class SolarEdgeDetailsSensor(SolarEdgeSensorEntity): class SolarEdgeDetailsSensor(SolarEdgeSensorEntity):
@ -161,12 +158,12 @@ class SolarEdgeInventorySensor(SolarEdgeSensorEntity):
@property @property
def extra_state_attributes(self) -> dict[str, Any]: def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes.""" """Return the state attributes."""
return self.data_service.attributes.get(self.sensor_type.json_key) return self.data_service.attributes.get(self.entity_description.json_key)
@property @property
def state(self) -> str | None: def state(self) -> str | None:
"""Return the state of the sensor.""" """Return the state of the sensor."""
return self.data_service.data.get(self.sensor_type.json_key) return self.data_service.data.get(self.entity_description.json_key)
class SolarEdgeEnergyDetailsSensor(SolarEdgeSensorEntity): class SolarEdgeEnergyDetailsSensor(SolarEdgeSensorEntity):
@ -181,12 +178,12 @@ class SolarEdgeEnergyDetailsSensor(SolarEdgeSensorEntity):
@property @property
def extra_state_attributes(self) -> dict[str, Any]: def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes.""" """Return the state attributes."""
return self.data_service.attributes.get(self.sensor_type.json_key) return self.data_service.attributes.get(self.entity_description.json_key)
@property @property
def state(self) -> str | None: def state(self) -> str | None:
"""Return the state of the sensor.""" """Return the state of the sensor."""
return self.data_service.data.get(self.sensor_type.json_key) return self.data_service.data.get(self.entity_description.json_key)
class SolarEdgePowerFlowSensor(SolarEdgeSensorEntity): class SolarEdgePowerFlowSensor(SolarEdgeSensorEntity):
@ -197,23 +194,23 @@ class SolarEdgePowerFlowSensor(SolarEdgeSensorEntity):
def __init__( def __init__(
self, self,
platform_name: str, platform_name: str,
sensor_type: SolarEdgeSensor, description: SolarEdgeSensorEntityDescription,
data_service: SolarEdgeDataService, data_service: SolarEdgeDataService,
) -> None: ) -> None:
"""Initialize the power flow sensor.""" """Initialize the power flow sensor."""
super().__init__(platform_name, sensor_type, data_service) super().__init__(platform_name, description, data_service)
self._attr_unit_of_measurement = data_service.unit self._attr_unit_of_measurement = data_service.unit
@property @property
def extra_state_attributes(self) -> dict[str, Any]: def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes.""" """Return the state attributes."""
return self.data_service.attributes.get(self.sensor_type.json_key) return self.data_service.attributes.get(self.entity_description.json_key)
@property @property
def state(self) -> str | None: def state(self) -> str | None:
"""Return the state of the sensor.""" """Return the state of the sensor."""
return self.data_service.data.get(self.sensor_type.json_key) return self.data_service.data.get(self.entity_description.json_key)
class SolarEdgeStorageLevelSensor(SolarEdgeSensorEntity): class SolarEdgeStorageLevelSensor(SolarEdgeSensorEntity):
@ -224,7 +221,7 @@ class SolarEdgeStorageLevelSensor(SolarEdgeSensorEntity):
@property @property
def state(self) -> str | None: def state(self) -> str | None:
"""Return the state of the sensor.""" """Return the state of the sensor."""
attr = self.data_service.attributes.get(self.sensor_type.json_key) attr = self.data_service.attributes.get(self.entity_description.json_key)
if attr and "soc" in attr: if attr and "soc" in attr:
return attr["soc"] return attr["soc"]
return None return None