1818#
1919
2020from functools import cached_property
21+
2122from homeassistant .components .sensor import SensorEntity , SensorDeviceClass
22- from homeassistant .helpers .update_coordinator import DataUpdateCoordinator
23+ from homeassistant .helpers .update_coordinator import DataUpdateCoordinator , CoordinatorEntity
2324from homeassistant .helpers .entity import DeviceInfo
2425
2526from .utils import make_id
2627
27- class EnpalBaseSensor (SensorEntity ):
28- """Generische Enpal Sensor-Entity, geeignet für die meisten Sensoren ."""
28+ class EnpalBaseSensor (CoordinatorEntity , SensorEntity ):
29+ """Generic Enpal sensor entity using the update coordinator ."""
2930
3031 def __init__ (self , sensor : dict , coordinator : DataUpdateCoordinator ):
32+ super ().__init__ (coordinator )
33+ self ._sensor = sensor
3134 self ._attr_name = sensor .get ("name" )
3235 self ._attr_unique_id = make_id (sensor .get ("name" , "unknown" ))
33- self ._attr_native_value = sensor .get ("value" )
3436 self ._attr_native_unit_of_measurement = sensor .get ("unit" )
35- # device_class als Enum, falls möglich:
37+ self ._attr_enabled_default = sensor .get ("enabled" , True )
38+
3639 device_class = sensor .get ("device_class" )
3740 if device_class and hasattr (SensorDeviceClass , device_class .upper ()):
3841 self ._attr_device_class = getattr (SensorDeviceClass , device_class .upper ())
3942 else :
4043 self ._attr_device_class = device_class
41- self ._attr_enabled_default = sensor .get ("enabled" , True )
42- self ._attr_extra_state_attributes = {
43- "enpal_last_update" : sensor .get ("enpal_last_update" )
44+
45+ @property
46+ def native_value (self ):
47+ return self ._sensor .get ("value" )
48+
49+ @property
50+ def extra_state_attributes (self ):
51+ return {
52+ "enpal_last_update" : self ._sensor .get ("enpal_last_update" )
4453 }
45- self ._coordinator = coordinator
4654
4755 @cached_property
4856 def device_info (self ) -> DeviceInfo :
@@ -53,32 +61,29 @@ def device_info(self) -> DeviceInfo:
5361 "model" : "Webparser" ,
5462 }
5563
56-
57- async def async_update (self ):
58- await self ._coordinator .async_request_refresh ()
64+ def _handle_coordinator_update (self ):
65+ for s in self .coordinator .data :
66+ if make_id (s .get ("name" , "" )) == self ._attr_unique_id :
67+ self ._sensor = s
68+ break
69+ self .async_write_ha_state ()
5970
6071 async def async_added_to_hass (self ):
61- self ._coordinator .async_add_listener (self ._handle_coordinator_update )
72+ await super ().async_added_to_hass ()
73+ self ._handle_coordinator_update ()
6274
63- def _handle_coordinator_update (self ):
64- # Hier kannst du das Update-Handling noch anpassen, falls nötig!
65- self .async_write_ha_state ()
6675
6776def build_sensor_entity (sensor : dict , coordinator : DataUpdateCoordinator ) -> SensorEntity :
6877 """
69- Factory-Funktion: Baut die passende SensorEntity .
70- Hier kannst du auch Spezialfälle oder Subklassen einbauen .
78+ Factory function: Builds the appropriate sensor entity .
79+ Extendable for special cases or subclasses .
7180 """
72- # Beispiel für Spezialfall: Energiesensor mit zusätzlichem Attribut
7381 if sensor .get ("device_class" ) == "energy" :
7482 return EnpalEnergySensor (sensor , coordinator )
75- # Weitere Spezialfälle ...
7683 return EnpalBaseSensor (sensor , coordinator )
7784
78- # Beispiel für einen spezialisierten Sensor
85+
7986class EnpalEnergySensor (EnpalBaseSensor ):
8087 def __init__ (self , sensor : dict , coordinator : DataUpdateCoordinator ):
8188 super ().__init__ (sensor , coordinator )
82- self ._attr_state_class = "total_increasing" # Nur für Energie!
83-
84- # Hier könntest du noch eigene Properties oder Methoden ergänzen
89+ self ._attr_state_class = "total_increasing"
0 commit comments