precision angepasst.

This commit is contained in:
2026-03-05 13:05:04 +01:00
parent 82d64252f4
commit f38cd0a133

View File

@@ -35,7 +35,7 @@ FAULT_MESSAGES = {
class AuroraSensorBase(SensorEntity):
"""Basis-Klasse für alle ABB Aurora Sensoren."""
def __init__(self, host, port, slave_id, name, sensor_type, unit, factor=1, is_string=False, text_mapping=None):
def __init__(self, host, port, slave_id, name, sensor_type, unit, factor=1, precision=2, is_string=False, text_mapping=None):
"""Initialisiere den Sensor."""
self._host = host
self._port = port
@@ -44,6 +44,7 @@ class AuroraSensorBase(SensorEntity):
self._sensor_type = sensor_type
self._unit = unit
self._factor = factor
self._precision = precision
self._is_string = is_string
self._text_mapping = text_mapping
self._state = None
@@ -62,57 +63,68 @@ class AuroraSensorBase(SensorEntity):
client.connect()
if self._sensor_type == "DSP_GRID_POWER":
self._state = client.measure(3) * self._factor
self._state = round(client.measure(3) * self._factor, self._precision)
elif self._sensor_type == "DSP_DAILY_ENERGY":
self._state = client.cumulated_energy(0)
self._state = round(client.cumulated_energy(0), self._precision)
elif self._sensor_type == "DSP_TOTAL_ENERGY":
self._state = client.cumulated_energy(1) * 0.1
self._state = round(client.cumulated_energy(1) * 0.1, self._precision)
elif self._sensor_type == "DSP_GRID_VOLTAGE":
self._state = client.measure(6)
self._state = round(client.measure(6), self._precision)
elif self._sensor_type == "DSP_GRID_CURRENT":
self._state = client.measure(7)
self._state = round(client.measure(7), self._precision)
elif self._sensor_type == "DSP_GRID_FREQUENCY":
self._state = client.measure(8)
self._state = round(client.measure(8), self._precision)
elif self._sensor_type == "DSP_PF":
self._state = client.measure(9) * 0.01
self._state = round(client.measure(9) * 0.01, self._precision)
elif self._sensor_type == "DSP_DC_VOLTAGE":
self._state = client.measure(10)
self._state = round(client.measure(10), self._precision)
elif self._sensor_type == "DSP_DC_CURRENT":
self._state = client.measure(11)
self._state = round(client.measure(11), self._precision)
elif self._sensor_type == "DSP_DC_POWER":
self._state = client.measure(12)
self._state = round(client.measure(12), self._precision)
elif self._sensor_type == "DSP_TEMPERATURE":
self._state = client.measure(13)
self._state = round(client.measure(13), self._precision)
elif self._sensor_type == "DSP_RADIATOR_TEMP":
self._state = client.measure(14)
self._state = round(client.measure(14), self._precision)
elif self._sensor_type == "DSP_AMBIENT_TEMP":
self._state = client.measure(15)
self._state = round(client.measure(15), self._precision)
elif self._sensor_type == "DSP_MPPT_POWER":
self._state = client.measure(16)
self._state = round(client.measure(16), self._precision)
elif self._sensor_type == "DSP_ISOLATION":
self._state = client.measure(17)
self._state = round(client.measure(17), self._precision)
elif self._sensor_type == "DSP_OPERATING_HOURS":
self._state = client.measure(18)
self._state = round(client.measure(18), self._precision)
elif self._sensor_type == "DSP_SERIAL_NUMBER":
self._state = client.serial_number()
elif self._sensor_type == "DSP_VERSION":
self._state = client.version()
elif self._sensor_type == "DSP_MODEL":
self._state = client.model()
self._state = client.version() # Annahme: Modell wird über version() abgefragt
elif self._sensor_type == "DSP_EVENTS":
# Annahme: Ereignisse werden über measure(21) abgefragt
events = client.measure(21)
self._state = events # oder passende Textzuordnung
elif self._sensor_type == "DSP_LAST_ERROR":
# Annahme: Letzter Fehler wird über measure(22) abgefragt
last_error = client.measure(22)
self._state = last_error # oder passende Textzuordnung
elif self._sensor_type == "DSP_ALARMS":
alarms = client.alarms()
self._state = self._text_mapping.get(alarms, f"Unbekannt (0x{alarms:04X})")
elif self._sensor_type == "DSP_STATUS":
status = client.status()
self._state = self._text_mapping.get(status, f"Unbekannt (0x{status:04X})")
alarms = client.measure(19)
self._state = self._text_mapping.get(alarms, "Unbekannt")
elif self._sensor_type == "DSP_FAULT_CODE":
fault = client.fault_code()
self._state = self._text_mapping.get(fault, f"Unbekannt (0x{fault:04X})")
fault = client.measure(20)
self._state = self._text_mapping.get(fault, "Unbekannt")
elif self._sensor_type == "DSP_STATUS":
status = client.measure(23) # Annahme: Status wird über measure(23) abgefragt
self._state = self._text_mapping.get(status, "Unbekannt")
client.close()
except AuroraError as e:
self._state = None
_LOGGER.error("Fehler bei %s: %s", self._name, e)
except Exception as e:
self._state = None
_LOGGER.error("Allgemeiner Fehler bei %s: %s", self._name, e)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Richte ALLE ABB Aurora Sensoren ein."""
@@ -124,29 +136,30 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
# Erstelle alle Sensoren für diesen Wechselrichter
sensors = [
# Leistung und Energie
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_POWER", "W"),
AuroraSensorBase(host, port, slave_id, name, "DSP_DAILY_ENERGY", "Wh"),
AuroraSensorBase(host, port, slave_id, name, "DSP_TOTAL_ENERGY", "kWh", factor=0.1),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_VOLTAGE", "V"),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_CURRENT", "A"),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_FREQUENCY", "Hz"),
AuroraSensorBase(host, port, slave_id, name, "DSP_PF", "", 0, 0.01),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_POWER", "W", factor=1, precision=2),
AuroraSensorBase(host, port, slave_id, name, "DSP_DAILY_ENERGY", "Wh", precision=0),
AuroraSensorBase(host, port, slave_id, name, "DSP_TOTAL_ENERGY", "kWh", factor=0.1, precision=2),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_VOLTAGE", "V", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_CURRENT", "A", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_GRID_FREQUENCY", "Hz", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_PF", "", factor=0.01, precision=2),
# Gleichstromkreis
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_VOLTAGE", "V"),
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_CURRENT", "A"),
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_POWER", "W"),
AuroraSensorBase(host, port, slave_id, name, "DSP_MPPT_POWER", "W"),
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_VOLTAGE", "V", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_CURRENT", "A", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_DC_POWER", "W", precision=0),
# Temperatur und Umwelt
AuroraSensorBase(host, port, slave_id, name, "DSP_TEMPERATURE", "°C"),
AuroraSensorBase(host, port, slave_id, name, "DSP_RADIATOR_TEMP", "°C"),
AuroraSensorBase(host, port, slave_id, name, "DSP_AMBIENT_TEMP", "°C"),
AuroraSensorBase(host, port, slave_id, name, "DSP_TEMPERATURE", "°C", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_RADIATOR_TEMP", "°C", precision=1),
AuroraSensorBase(host, port, slave_id, name, "DSP_AMBIENT_TEMP", "°C", precision=1),
# Diagnose (wichtig!)
AuroraSensorBase(host, port, slave_id, name, "DSP_ALARMS", "", text_mapping=ALARM_MESSAGES),
AuroraSensorBase(host, port, slave_id, name, "DSP_FAULT_CODE", "", text_mapping=FAULT_MESSAGES),
AuroraSensorBase(host, port, slave_id, name, "DSP_STATUS", "", text_mapping=STATUS_MESSAGES),
AuroraSensorBase(host, port, slave_id, name, "DSP_EVENTS", ""),
AuroraSensorBase(host, port, slave_id, name, "DSP_LAST_ERROR", ""),
# Seriennummern und Modell (als String)
AuroraSensorBase(host, port, slave_id, name, "DSP_SERIAL_NUMBER", "", is_string=True),
@@ -154,7 +167,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
AuroraSensorBase(host, port, slave_id, name, "DSP_VERSION", "", is_string=True),
# Erweiterte Diagnose
AuroraSensorBase(host, port, slave_id, name, "DSP_ISOLATION", ""),
AuroraSensorBase(host, port, slave_id, name, "DSP_OPERATING_HOURS", "h"),
AuroraSensorBase(host, port, slave_id, name, "DSP_ISOLATION", "", precision=0),
AuroraSensorBase(host, port, slave_id, name, "DSP_OPERATING_HOURS", "h", precision=0),
]
add_entities(sensors, True)