Vorwort
Nach einigen Versuchen das Problem zu lösen habe ich nun eine für meine Verhältnisse elegante Lösung gefunden. Ein großer Stolperstein war, dass ich MQTT nicht richtig verstanden hatte und mir die Kommunikation zwischen den Geräten nicht ganz klar war.
Diese Anleitung funktioniert mit jedem Wechselrichter, der im Home Assistant eingebunden ist.
Problemstellung:
Die OpenWB braucht, um Solar Überschuss Laden zu können eine Verbindung zu dem Zähler des Wechselrichters. Bei mir ist diese Verbindung nur über den Wechselrichter selbst möglich, weil der Eastron SDM630-M direkt per Modbus an dem Wechselrichter angeschlossen werden muss. Wenn jetzt die OpenWB auch über Modbus TCP, in meinem Fall über den Deye LSE Stick (LAN-Adapter), auf den Zähler zugreift, kommt es zu Abbrüchen beim Auslesen und der Wechselrichter meldet Fehler beim Zugriff auf den Zähler. Ich weiß nicht, ob sich ein Waveshare Adapter hier anders verhält. Ich habe auch keinen Weg gefunden den WR über die interne Modbus Schnittstelle auszulesen. Einen zusätzlichen OpenWB kompatiblen Zähler wollte ich icht einbauen.
Mein Setup
Wechselrichter Deye
Um die Daten Auszulesen benutze ich den Home Assistent mit Solarman und einem Visualisierung Dashboard namens Sunsynk-Power-Flow-Card. Das Dashboard sieht dann nach der Konfiguration so aus:
Da ich den chinesischen WR wenig vertraue, was die Verbindung ins Internet betrifft, habe ich die Möglichkeiten des Wechselrichters ins Internet zu kommen eingeschränkt. Der LAN-Adapter hat keine Berechtigung Daten nach Außerhalb des privaten Netzwerkes zu senden. Dazu gibt es viele Möglichkeiten. Die Einfachste ist, in meinem Fall, den Verkehr von der IP des LAN-Adapters ins Internet auf der Fritzbox zu verbieten.
Wallbox OpenWB
Die Wallbox ist standardmäßig konfiguriert (Ladepunkt, Fahrzeug und Ladeprofil sind angelegt). Somit sind die Voraussetzungen für das Sofort Laden gegeben. Für den Modus PV-Überschuss Laden wird eine Anbindung des Zählers benötigt, damit die Wallbox weiß, wieviel sie ins Auto schieben darf.
Fehlversuche
Modbus RTU
Die Versuche den Eastron Zähler über Modbus RTU auszulesen sind bei mir kläglich gescheitert. Manchmal kamen Werte an der OpenWB an, manchmal nicht. Bei diesem Versuch hat der Wechselrichter die Verbindung zum Zähler verloren und ist auf Störung gegangen (hat aber weiterhin das Haus versorgt).
Auslesen über OpenWB Deye Erweiterung
Auch bei dieser Konfiguration wird Modbus benutzt aber anders. Hier hatte ich keine Probleme auf dem Wechselrichter, aber die Daten wurden auch nur sporadisch an die Wallbox übertragen, was dazu führt, das PV-Überschuss Laden nicht oder nur eingeschränkt funktioniert. Bei mir gab es immer wieder Abbrüche und das Auto hat trotz voller Solarleistung nicht oder nur langsam geladen.
Auslesen der Home Assistant Daten per http
Hieran bin ich komplett gescheitert. Um die Daten auslesen zu können muss ein Langlebiger Token im Home Assistant eingerichtet werden. Dieser kann aber bei der Konfiguration der OpenWB nirgendwo mitgegeben werden. Ich habe jedenfalls keine Möglichkeit gefunden.
Meine Lösung
Die Zählerdaten sind im Home Assistant vorhanden, warum diese nicht einfach per MQTT an die Wallbox übertragen?
Dazu muss lediglich ein Automatisierungsskript (yaml) erstellt werden, welches die Werte aus dem Solman in MQTT überträgt. Das kann man grafisch, in Einstellungen -> Automatisation & Szenen machen, oder besser in einer Konfigurationsdatei. Ich empfehle das Trennen der Konfigurationsdateien im Home Assitant um die Übersicht zu wahren. Hier wird nur auf die Konfigurationsdatei eingegangen, nicht wie man die Konfig sauber in einzelne Dateien aufteilt.
Voraussetzung
- Home Assistant
- Solar Daten müssen sauber ausgelesen und zugeordnet werden (Bei mir per Solarman)
- MQTT-Broker wird benötigt (Ich benutze den Mosquitto Broker)
- Datei Editor wird benötigt (Ich benutze den File Editor)
- Auf der OpenWB muss vor der Konfiguration unter Konfiguration - Geräte und Komponenten ein MQTT-Zähler eingerichtet werden (Das ist wichtig, weil die OpenWB eine ID beim anlegen vergibt, die in der Konfiguration auf dem Home Assistant benötigt wird.
- OpenWB Software > 2.2 (Ich benutze 2.2.3)
- Wenn möglich die OpenWB Erweiterung aus dem HACS laden und konfigurieren
Konfiguration auf der OpenWB
Unter Konfiguration - Geräte und Komponenten bei Hersteller auf das Pull down Menü klicken und Universell auswählen:
Danach unter Verfügbare Geräte MQTT auswählen und auf das grüne + klicken
Es wird ein neuer Baum Angelegt. Diesen Baum muss man aufklappen und bei verfügbare Komponenten den MQTT-Zähler hinzufügen.
Ich habe gleich noch die Komponenten MQTT Speicher und MQTT-Wechselrichter hinzugefügt um alle Werte in der OpenWB zu haben. Somit sieht meine Konfig dann so aus:
Wenn man nun den MQTT-Zähler aufklappt, bekommt man einen Menge Hinweise, wie die Werte für die OpenWB eingerichtet werden müssen, damit die Wallbox die Daten verarbeiten kann. Hier ein Auszug:
Diese Topics brauchen wir gleich bei der Konfiguration im Home Assistant. In dem Screenshot sieht man auch schon die benötigte ID des angelegten Gerätes. In meinem Fall ist das für den Zähler die 20 (openWB/set/mqtt/counter/20/get/power) Unter Status sieht man jetzt ungefähr das Bild:
Die OpenWB ist nun soweit Konfiguriert und wir können in den Home Assistant gehen.
Home Assistant
Mit dem File Editor kann eine Automatisation vorzugsweise in einer eigenen Konfigdatei, zur Not aber auch in die configuration.yaml (nicht empfohlen wegen nicht getestet und unübersichtlich)
Die Konfiguration sieht so aus:
- id: openwb_transmit_all_inverter_data_v2
alias: "openWB: Wechselrichterdaten per MQTT übertragen"
description: "Überträgt alle Netz-, PV- und Batteriedaten von Solarman als echtes JSON per MQTT an openWB v2.2.3"
triggers:
# --- COUNTER (ID 20) ---
- platform: state
entity_id: sensor.inverter_grid_power
id: t_counter_update
- platform: state
entity_id: sensor.inverter_grid_frequency
id: t_counter_frequency
- platform: state
entity_id: sensor.inverter_external_ct1_current
id: t_counter_currents
- platform: state
entity_id: sensor.inverter_external_ct2_current
id: t_counter_currents
- platform: state
entity_id: sensor.inverter_external_ct3_current
id: t_counter_currents
- platform: state
entity_id: sensor.inverter_grid_l1_voltage
id: t_counter_voltages
- platform: state
entity_id: sensor.inverter_grid_l2_voltage
id: t_counter_voltages
- platform: state
entity_id: sensor.inverter_grid_l3_voltage
id: t_counter_voltages
- platform: state
entity_id: sensor.inverter_external_ct1_power
id: t_counter_powers
- platform: state
entity_id: sensor.inverter_external_ct2_power
id: t_counter_powers
- platform: state
entity_id: sensor.inverter_external_ct3_power
id: t_counter_powers
# --- BATTERIE (ID 21) ---
- platform: state
entity_id: sensor.inverter_battery
id: t_bat_soc
- platform: state
entity_id: sensor.inverter_battery_power
id: t_bat_power
# --- PV (ID 22) ---
- platform: state
entity_id: sensor.inverter_pv_power
id: t_pv_update
conditions:
- condition: template
value_template: "{{ trigger.to_state.state not in ['unknown', 'unavailable'] }}"
actions:
- choose:
# --- COUNTER AKTIONEN (ID 20) ---
- conditions: "{{ trigger.id == 't_counter_update' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/power"
payload: "{{ (trigger.to_state.state | float(0)) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/imported"
payload: "{{ (states('sensor.inverter_today_energy_import') | float(0) * 1000) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/exported"
payload: "{{ (states('sensor.inverter_today_energy_export') | float(0) * 1000) | to_json }}"
retain: false
- conditions: "{{ trigger.id == 't_counter_frequency' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/frequency"
payload: "{{ (trigger.to_state.state | float(0)) | to_json }}"
retain: false
- conditions: "{{ trigger.id == 't_counter_currents' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/currents"
payload: >
{{ [
states('sensor.inverter_external_ct1_current') | float(0),
states('sensor.inverter_external_ct2_current') | float(0),
states('sensor.inverter_external_ct3_current') | float(0)
] | to_json }}
retain: false
- conditions: "{{ trigger.id == 't_counter_voltages' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/voltages"
payload: >
{{ [
states('sensor.inverter_grid_l1_voltage') | float(0),
states('sensor.inverter_grid_l2_voltage') | float(0),
states('sensor.inverter_grid_l3_voltage') | float(0)
] | to_json }}
retain: false
- conditions: "{{ trigger.id == 't_counter_powers' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/12/get/powers"
payload: >
{{ [
states('sensor.inverter_external_ct1_power') | float(0),
states('sensor.inverter_external_ct2_power') | float(0),
states('sensor.inverter_external_ct3_power') | float(0)
] | to_json }}
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/power_factors"
payload: "{{ [1.0, 1.0, 1.0] | to_json }}"
retain: false
# --- BATTERIE AKTIONEN (ID 21) ---
- conditions: "{{ trigger.id == 't_bat_soc' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/bat/21/get/soc"
payload: "{{ (trigger.to_state.state | int(0)) | to_json }}"
retain: false
- conditions: "{{ trigger.id == 't_bat_power' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/bat/21/get/power"
payload: "{{ (trigger.to_state.state | float(0)) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/bat/21/get/imported"
payload: "{{ (states('sensor.inverter_today_battery_charge') | float(0) * 1000) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/bat/21/get/exported"
payload: "{{ (states('sensor.inverter_today_battery_discharge') | float(0) * 1000) | to_json }}"
retain: false
# --- PV AKTIONEN (ID 22) ---
- conditions: "{{ trigger.id == 't_pv_update' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/pv/22/get/power"
payload: "{{ (trigger.to_state.state | float(0)) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/pv/22/get/exported"
payload: "{{ (states('sensor.inverter_today_energy_export') | float(0) * 1000) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/pv/22/get/imported"
payload: "{{ (states('sensor.inverter_today_energy_import') | float(0) * 1000) | to_json }}"
retain: false
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/pv/22/get/currents"
payload: >
{{ [
states('sensor.inverter_internal_ct1_current') | float(0),
states('sensor.inverter_internal_ct2_current') | float(0),
states('sensor.inverter_internal_ct3_current') | float(0)
] | to_json }}
retain: false
mode: queued
max: 20
Nehmen wir mal Beispielhaft die einzelnen Abschnitte auseinander
triggers:
# --- COUNTER (ID 20) ---
- platform: state
entity_id: sensor.inverter_grid_power
id: t_counter_update
Hier werden die Werte aus dem Solarman eingelesen. Die Zeile entity_id enthällt den Wert, den der Solarman liefert. Es müssen hier alle Werte definiert werden, die an die OpenWB übertragen werden sollen. Die id ist der Schlüssel, der weiter unten (conditions) verwendet wird.
actions:
- choose:
# --- COUNTER AKTIONEN (ID 20) ---
- conditions: "{{ trigger.id == 't_counter_update' }}"
sequence:
- action: mqtt.publish
data:
topic: "openWB/set/mqtt/counter/20/get/power"
payload: "{{ (trigger.to_state.state | float(0)) | to_json }}"
retain: false
Hier wird bestimmt, wie die oben ausgelesenen Daten an den MQTT-Broker übergeben werden. Die Zeile Conditions mit dem Trigger ist der Schlüssel (id) Das ganze muss für alle Werte wiederholt werden. Achtung, die OpenWB erwartet teilweise andere Einheiten (Wh nicht kWh) Aus diesem Grund sind in der Payload Zeile teilweise Berechnungen enthalten um die Werte von kWh, die der WR liefert in Wh umzurechnen, die die OpenWB erwartet.
Wenn man nun alles in dieser Datei fertig konfiguriert hat, sollte man die Konfiguration im Home Assistant unter Einstellung -> Werkzeuge prüfen.
Wird die Konfiguration grün angezeigt, kann man auf Neu Starten klicken.
Nun sollten die Daten mit einem MQTT Explorer geprüft werden. Ich habe bei mir diesen Explorer auf meinem Rechner installiert und mit dem Home Assistant verbunden. Bei mir sieht die Ausgabe so aus:
Hier sieht man, dass die Daten per MQTT an den Broker 10.9.1.42 gesendet werden. Das ist der Home Assistant selber. Nun müssen wir dafür sorgen, dass die Daten auch an den MQTT-Broker auf der OpenWB gesendet werden. Das kann über eine MQTT-Brücke erfolgen. Dazu geht man auf dem Home Assistant wieder in den File Editor und wechselt in das Verzeichnis /share/mosquitto/. Dort ist bei mir schon eine Datei Namens openwb.conf. Diese wurde von der OpenWB App im Home Assistant angelegt. Wenn diese Datei nicht da ist, dann kann diese einfach angelegt werden.
Wichtig sind die Zeilen:
connection openwb2
local_clientid openwb2.mosquitto
address 10.9.1.15:1883
# Daten von HA an openWB senden (ID 20-22)
topic openWB/set/mqtt/counter/20/get/# out
topic openWB/set/mqtt/bat/21/get/# out
topic openWB/set/mqtt/pv/22/get/# out
Hier wird bestimmt, welche Daten an den MQTT-Broker der OpenWB geschoben werden. Der MQTT Broker muss dann im Home Assistant neu gestartet werden. Das geht unter Einstellungen -> Apps -> Mosquitto broker -> Neu starten.
Wenn man nun mit dem MQTT Explorer auf die OpenWB schaut, sieht man einen neuen Zweig:
Hier sieht man den MQTT-Broker von der OpenWB 10.9.1.15, ganz unten die Topic mqtt aufgetaucht. Diese war vorher noch nicht da. Leider wird der Pfad nicht so angezeigt, wie er im Home Assistant vermuten lässt. Im Home Assistant ist der Pfad
openWB/set/mqtt/counter/20/get/
im MQTT Explorer auf der OpenWB ist der Pfad
openWB/mqtt/counter/20/get
Wenn die Daten ankommen ist alles richtig gelaufen und diese sollten auch in der Weboberfläche unter Status auf der OpenWB zu sehen sein:
Ich hoffe ich konnte ein wenig helfen. Mich würde interessieren, welche Methode ihr benutzt um die OpenWB mit Zählerdaten aus dem Home Assistant zu versorgen.











