sunlit_solar/binary_sensor.py
2025-06-03 14:51:08 +00:00

116 lines
5.1 KiB
Python

from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorDeviceClass,
)
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.helpers.entity import DeviceInfo
from .helper import get_merged_device_data
from .const import DOMAIN
async def async_setup_entry(hass, entry, async_add_entities):
coordinator = hass.data[DOMAIN][entry.entry_id]["coordinator"]
data = get_merged_device_data(coordinator)
sensors = []
for family_key in data:
family = data[family_key]
if "devices" not in family:
continue
for device_key in family["devices"]:
device = family["devices"][device_key]
device_info = DeviceInfo(
identifiers={(DOMAIN, device["deviceId"], device.get("deviceSn",""))},
name=device.get("stationName", "Unbekanntes Gerät"),
serial_number=device.get("deviceSn", "Unbekannt"),
suggested_area=family.get("name", "Unbekannt"),
manufacturer="Sunlit Solar",
model=device.get("deviceType", "Unbekanntes Modell"),
)
if device["deviceType"] == "ENERGY_STORAGE_BATTERY":
device_info = DeviceInfo(
identifiers={(DOMAIN, device["deviceId"], device.get("deviceSn",""))},
name="Speicher",
serial_number=device.get("deviceSn", "Unbekannt"),
suggested_area=family.get("name", "Unbekannt"),
manufacturer="Sunlit Solar",
model=device.get("deviceType", "Unbekanntes Modell"),
)
sensor_keys = [
{'id': 'fault', 'name': 'Fehler', 'device_class': None, 'state_class': None, 'native_unit_of_measurement': None},
{'id': 'off', 'name': 'Abgeschaltet', 'device_class': None, 'state_class': None, 'native_unit_of_measurement': None},
{'id': 'bypass', 'name': 'Bypass aktiv', 'device_class': None, 'state_class': None, 'native_unit_of_measurement': None},
{'id': 'isChargingStatus', 'name': 'Lädt', 'device_class': None, 'state_class': None, 'native_unit_of_measurement': None},
]
for sensor in sensor_keys:
sensors.append(Sensor(
coordinator,
device_info,
entry.entry_id,
f"{sensor['id']}",
family_key,
device_key,
sensor['name'],
sensor['device_class'],
sensor['state_class'],
sensor['native_unit_of_measurement']
))
# heaterStatusList
for i,key in enumerate(device['heaterStatusList']):
sensors.append(Sensor(
coordinator,
device_info,
entry.entry_id,
key,
family_key,
device_key,
f'Heizung Speicher {i+1}',
None, #sensor['device_class'],
None, #sensor['state_class'],
None, #sensor['native_unit_of_measurement']
"heaterStatusList"
))
async_add_entities(sensors)
class Sensor(CoordinatorEntity, BinarySensorEntity):
def __init__(self, coordinator, deviceinfo, entry_id, id, family_key, device_key, name, device_class, state_class, native_unit_of_measurement, subkey=None):
super().__init__(coordinator)
# self._entry_id = entry_id
self._deviceinfo = deviceinfo
self._family_key = family_key
self._device_key = device_key
self._subkey = subkey
self._key_id = id
self._attr_name = name
self._attr_unique_id = f"{entry_id}_{family_key}_{device_key}_{id}"
if subkey:
self._attr_unique_id += f"{entry_id}_{family_key}_{device_key}_{subkey}_{id}"
self._attr_native_unit_of_measurement = native_unit_of_measurement
self._attr_device_class = device_class
self._attr_state_class = state_class
@property
def is_on(self):
data = get_merged_device_data(self.coordinator)
if self._family_key not in data:
return None
family = data[self._family_key]
if "devices" not in family or self._device_key not in family["devices"]:
return None
device = family["devices"][self._device_key]
if self._subkey:
if self._subkey in device and isinstance(device[self._subkey], dict):
return device[self._subkey].get(self._key_id, None)
else:
return device.get(self._subkey, [])[self._key_id] if isinstance(device.get(self._subkey, []), list) else device.get(self._subkey, {}).get(self._key_id, None)
return device.get(self._key_id, None)
@property
def device_info(self) -> DeviceInfo:
return self._deviceinfo