113 lines
3.6 KiB
Python
113 lines
3.6 KiB
Python
""" A sensor entity that holds the result of the recuit simule algorithm """
|
|
import logging
|
|
from homeassistant.const import UnitOfPower
|
|
from homeassistant.core import callback, HomeAssistant
|
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|
from homeassistant.components.sensor import (
|
|
SensorEntity,
|
|
SensorDeviceClass,
|
|
SensorStateClass,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
|
|
from homeassistant.helpers.entity_platform import (
|
|
AddEntitiesCallback,
|
|
)
|
|
|
|
|
|
from .const import DOMAIN
|
|
from .coordinator import SolarOptimizerCoordinator
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
) -> None:
|
|
"""Setup the entries of type Sensor"""
|
|
|
|
# Sets the config entries values to SolarOptimizer coordinator
|
|
coordinator: SolarOptimizerCoordinator = hass.data[DOMAIN]["coordinator"]
|
|
|
|
entity1 = SolarOptimizerSensorEntity(coordinator, hass, "best_objective")
|
|
entity2 = SolarOptimizerSensorEntity(coordinator, hass, "total_power")
|
|
entity3 = SolarOptimizerSensorEntity(coordinator, hass, "power_production")
|
|
entity4 = SolarOptimizerSensorEntity(coordinator, hass, "power_production_brut")
|
|
entity5 = SolarOptimizerSensorEntity(coordinator, hass, "battery_soc")
|
|
|
|
async_add_entities([entity1, entity2, entity3, entity4, entity5], False)
|
|
|
|
await coordinator.configure(entry)
|
|
|
|
|
|
class SolarOptimizerSensorEntity(CoordinatorEntity, SensorEntity):
|
|
"""The entity holding the algorithm calculation"""
|
|
|
|
def __init__(self, coordinator, hass, idx):
|
|
super().__init__(coordinator, context=idx)
|
|
self._hass = hass
|
|
self.idx = idx
|
|
self._attr_name = idx
|
|
self._attr_unique_id = "solar_optimizer_" + idx
|
|
|
|
self._attr_native_value = None
|
|
|
|
@callback
|
|
def _handle_coordinator_update(self) -> None:
|
|
"""Handle updated data from the coordinator."""
|
|
if (
|
|
not self.coordinator
|
|
or not self.coordinator.data
|
|
or (value := self.coordinator.data.get(self.idx)) == None
|
|
):
|
|
_LOGGER.debug("No coordinator found or no data...")
|
|
return
|
|
|
|
self._attr_native_value = value
|
|
self.async_write_ha_state()
|
|
|
|
@property
|
|
def device_info(self):
|
|
# Retournez des informations sur le périphérique associé à votre entité
|
|
return {
|
|
"identifiers": {(DOMAIN, "solar_optimizer_device")},
|
|
"name": "Solar Optimizer",
|
|
# Autres attributs du périphérique ici
|
|
}
|
|
|
|
@property
|
|
def icon(self) -> str | None:
|
|
if self.idx == "best_objective":
|
|
return "mdi:bullseye-arrow"
|
|
elif self.idx == "total_power":
|
|
return "mdi:flash"
|
|
elif self.idx == "battery_soc":
|
|
return "mdi:battery"
|
|
else:
|
|
return "mdi:solar-power-variant"
|
|
|
|
@property
|
|
def device_class(self) -> SensorDeviceClass | None:
|
|
if self.idx == "best_objective":
|
|
return SensorDeviceClass.MONETARY
|
|
elif self.idx == "battery_soc":
|
|
return SensorDeviceClass.BATTERY
|
|
else:
|
|
return SensorDeviceClass.POWER
|
|
|
|
@property
|
|
def state_class(self) -> SensorStateClass | None:
|
|
if self.idx == "best_objective":
|
|
return SensorStateClass.TOTAL
|
|
else:
|
|
return SensorStateClass.MEASUREMENT
|
|
|
|
@property
|
|
def native_unit_of_measurement(self) -> str | None:
|
|
if self.idx == "best_objective":
|
|
return "€"
|
|
elif self.idx == "battery_soc":
|
|
return "%"
|
|
else:
|
|
return UnitOfPower.WATT
|