eBusd, Vaillant Wärmepumpe und Home Assistant

Den eBus anzubinden ist nicht so dramatisch, aber eine halbwegs korrekte Konfiguration zu bauen und diese in den Home Assistant zu bringen, kostet viel (wirklich viel) Zeit.

Aber dafür jetzt gibt es wirklich viele Messwerte, einige davon sind recht interessant und über die myVaillant API nicht zu bekommen.

Im Sensocomfort sind quasi nur die gemachten Konfigurationen zu finden, also eher nicht so spannend. Ansonsten sind dort nur einige Verbrauchs- und Ertragswerte zu finden.

Die ArothermPlus (Vaillant VWL 55/6 A) weiß einiges über die Heizungs-Umwälzpumpe, den Kompressor und den Lüfter (Last, Betriebsstunden, Anläufe, …).

Außerdem hat sie

  • Betriebseigenschaften des Kompressors: Verdampfungstemperatur, EEV, …
  • Durchflussmenge, Druck und Temperatur des Heizkreises
  • Zustande PV-Ready, EVU-Sperre, …
  • Betriebsstunden für Heizung, für Warmwasser und Gesamt (Maschinenlaufstunden)
  • Alle möglichen Verbrauchs- und Ertragswerte

Aus der Hydraulikstation (Vaillant VWZ MEH 97/6) bekommt man primär Informationen über die elektrische Zusatzheizung: Betriebsstunden, Temperaturen, Anläufe, Energieverbrauch, … 

Viele Informationen tauchen mehrfach in verschiedenen Geräten auch: Außentemperatur, Innentemperatur, Vor- und Rücklauftemperaturen, … mal gerundet auf zwei Nachkommastellen, mal umgerundet, …

Hier sind die Konfigurations-Dateien: https://github.com/rmalbrecht/ebusd-configuration/tree/master/ebusd-2.1.x/de

  • https://github.com/rmalbrecht/ebusd-configuration/blob/master/ebusd-2.1.x/de/vaillant/08.hmu00.HW5103.SW0901.csv
  • https://github.com/rmalbrecht/ebusd-configuration/blob/master/ebusd-2.1.x/de/vaillant/15.ctlv.SW0514.HW1104.csv
  • https://github.com/rmalbrecht/ebusd-configuration/blob/master/ebusd-2.1.x/de/vaillant/76.vwzio.HW5103.SW0902.csv
  • https://github.com/rmalbrecht/ebusd-configuration/blob/master/ebusd-2.1.x/de/vaillant/f6.netx2.csv
  • https://github.com/rmalbrecht/ebusd-configuration/blob/master/ebusd-2.1.x/de/_templates.csv

Das ist nicht alles auf meinem Mist gewachsen, aber die verschiedenen Quellen in Foren, … zusammen zu sammeln, zu mergen, für Home Assistant zu tweaken, … muss ja nicht jeder neu machen.

Da der eBusD „passiv“ am Bus lauscht und die Nachrichten dekodiert, braucht man etwas Geduld. Nach dem Starten kann es zu einer Stunde dauern, bis alle Werte populiert sind.

Dafür kann man dann sowas machen:

ebus und eebus

Ah. Der Groschen ist gefallen. Manchmal ließt man eBus und manchmal eeBus

Das eine ist eBus-Protokoll über eBus (zwei Draht seriell) und das andere ist eBus-Protokoll über Ethernet.

Der Groschen hat aber eine Weile gebraucht.

Wobei mir nicht klar ist, ob eeBus nicht irgendwie tot ist. Vaillant hat es bei der Umstellung auf die neue App irgendwie vergessen (sollte mal in 23Q3 kommen, jetzt in 24Q1). Solaredge hat eine Pressemitteilung, aber keine lieferbaren Produkte, die Historie in der Wikipedia endet in 2019, …

Könnte zusammen mit dem Ikea Dirigera Matter Update kommen.

Fenecon Rest-API und SG-Ready

Wenn der Home Assistant den aktuellen SG-Ready Status und die Historie anzeigen soll, kann man die Werte aus der Rest-API bekommen. Eine Ergänzung für die rest.yaml:

- resource: "http://192.168.0.123:8084/rest/channel/ctrlIoHeatPump0/.*“
username: x
password: user
authentication: basic
scan_interval: 60
sensor:
  - value_template: '{{value_json | selectattr("address", "equalto", "ctrlIoHeatPump0/Status") | map(attribute="value") | first }}‘
    name: "FEMS SGReady Aktueller Status“
    state_class: measurement
    unique_id: "fems/ctrlIoHeatPump0/Status“
  - value_template: '{{value_json | selectattr("address", "equalto", "ctrlIoHeatPump0/RecommendationStateTime") | map(attribute="value") | first }}‘
    name: "FEMS SGReady Einschaltempfehlung“
    unit_of_measurement: „s“
    device_class: duration
    state_class: measurement
    unique_id: "fems/ctrlIoHeatPump0/RecommendationStateTime“
  - value_template: '{{value_json | selectattr("address", "equalto", "ctrlIoHeatPump0/RegularStateTime") | map(attribute="value") | first }}‘
    name: "FEMS SGReady Normalbetrieb“
    unit_of_measurement: „s“
    device_class: duration
    state_class: measurement
    unique_id: "fems/ctrlIoHeatPump0/RegularStateTime“
  - value_template: '{{value_json | selectattr("address", "equalto", "ctrlIoHeatPump0/ForceOnStateTime") | map(attribute="value") | first }}‘
    name: "FEMS SGReady Einschaltbefehl“
    unit_of_measurement: „s“
    device_class: duration
    state_class: measurement
    unique_id: "fems/ctrlIoHeatPump0/ForceOnStateTime“
  - value_template: '{{value_json | selectattr("address", "equalto", "ctrlIoHeatPump0/LockStateTime") | map(attribute="value") | first }}‘
    name: "FEMS SGReady Sperre“
    unit_of_measurement: „s“
    device_class: duration
    state_class: measurement
    unique_id: "fems/ctrlIoHeatPump0/LockStateTime“

Und noch einen Eintrag in die configuration.yaml, damit es Text und nicht nur einen numerischen Wert gibt:

 


- sensor:
- name: "FEMS SG-Ready Betriebsmodus"
unique_id: "FEMS.SG-Ready.Betriebsmodus"
device_class: enum
state: >
{% if is_state('sensor.fems_sgready_aktueller_status', '1') %}
Normalbetrieb
{% elif is_state('sensor.fems_sgready_aktueller_status', '2') %}
Einschaltempfehlung
{% elif is_state('sensor.fems_sgready_aktueller_status', '3') %}
Einschaltbefehl
{% elif is_state('sensor.fems_sgready_aktueller_status', '0') %}
Sperre
{% else %}
Undefinierter Status
{% endif %}

Aus der Vaillant Wärmepumpe habe ich den Status nicht rausbekommen, die macht einfach was man ihr sagt.

Fenecon Wechselrichter aka GoodWe

Der Fenecon Home Wechselrichter ist ein GoodWe-OEM. In der Zubehörkiste fliegt der Wifi-Stecker rum, der kommt unten an den USB-Port ran und baut dann ein Solar-12345 WLAN auf. Das Passwort ist 12345678 (echt :-).

Auf der 10.10.100.253 findet sich dann ein minimales WebInterface, mit dem man das Netzwerk einrichten kann.

 

Das WebInterface ist insgesamt ziemlich langweilig. Dafür exportiert der Goodwe unglaublich viele Messwerte. Home Assistant hat sogar eine eigene GoodWe-Integration:

Gewaltige 149 Entitäten bringt die Integration mit:

Mir ist beim Durchgucken aber nichts so richtig spannendes aufgefallen, was man vom Fenecon EMS nicht auch bekommen kann. Die Dokumentation von Goodwe ich auch nicht so richtig ausführlich: klick.

SG-Ready im Vaillant Sensocomfort Regler

Damit die Wärmepumpe auch weiß, wie sie auf die SG-Ready Signale des Fenecons reagieren soll, müssen noch einige Einstellungen im Sensocomfort Regler gemacht werden:

Der FB/OT-Eingang ist ein Multifunktionseingang, der kann für verschiedene Dinge genutzt werden. Hier soll er für PV genutzt werden:

Der Warmwasser-Speicher soll geladen werden:

Fenecon, Vaillant und SG-Ready

Die Fenecon Home Sektorenkopplung zur Vaillant Wärmepumpe ist überraschend trivial.

Der Fenecon Home hat ein paar eingebaute Relais, die die (optionale) App auf- und zumachen kann. Die Wärmepumpe hat ein paar Klemmen, die im Normalzustand unbelegt und offen sind. Wenn man ein Relais da rantüdelt und dieses schließt, sieht die Wärmepumpe eine 1, da dann die beiden Pins dann verbunden sind. Wenn die Pins offen sind, ist es eine 0.

SG-Ready hat zwei Bits, was vier Zustände ergibt:

0 0 Normalbetrieb
0 1 Einschaltempfehlung
1 0 Sperre
1 1 Einschaltbefehl

Die Sperre ist für den Heimgebrauch irgendwie Quatsch. Warum sollte eine PV der Wärmepumpe eine Sperre schicken? Für einen Netzbetreiber ergibt das Sinn, aber für zuhause eher nicht. Oder für ganze Harte: wenn ich keinen selbstproduzierten Strom mehr habe und ich absolut keinen kaufen will, friere ich lieber. Oder wenn er bei dynamischen Strompreisen gerade sehr teuer ist. Es mag Anwendungsfälle dafür geben.

Normalbetrieb ist der Zustand wie ohne SG-Ready Anbindung. Es liegt kein Signal an, da keine Pins verbunden sind.

Die Einschaltempfehlung scheint der sinnvolle Status für eine PV-Überschussladung zu sein. In diesem Zustand bringt unsere Vaillant erst den Warmwasserspeicher und anschließend den Heizungsspeicher auf maximale Temperatur, jedenfalls solange das Signal anliegt. Die Heizung unterbricht dabei aber keine definierten Aus-Zeiten oder Nachtabsenkungen.

Der Einschaltbefehl bringt zwangsweise den Warmwasserspeicher und anschließend den Heizungsspeicher auf maximale Temperatur und ignoriert dabei definierte Aus-Zeiten oder Nachtabsenkungen. Das mag für einen Netzbetreiber sinnvoll sein. Wenn ich weiß, daß ich die Anlage heute drosseln muss (Sperre), dann ergibt es Sinn, die Wärme vorher zu speichern, damit es dann beim Kunden nicht kalt wird und er noch Warmwasser im Tank hat. Für den Heimgebrauch finde ich das Ignorieren der hinterlegten Programmierung nicht sinnvoll.

Letztendlich braucht man für zuhause eigentlich nur zwei Modi: Normalbetrieb und Einschaltempfehlung. Da reicht eine Klemme und ein Relais. Dann kann man die anderen Relais noch für was anderes benutzen. Das Setzen des hinteren Bits reicht: dann kann man Normalbetrieb und Einschaltempfehlung ansteuern.

Die Vaillant ArothermPlus kann beides: 1 Signal aka PV-Ready oder 2 Signale aka SG-Ready.

Vaillant hat eine gute Dokumentation: Wärmepumpen einfach und schnell anschließen

PV-Ready:

Ein Relais vom Fenecon kommt an FB und OT.

Für SG-Ready braucht man dann noch ein zweites Kabel. Die erste Leitung ist unverändert. Das zweite Relais kommt an den S21 ran.

Die Konfiguration der App ist etwas versteckt. Auf dem Fenecon die FEMS-App-Übersicht öffnen:Die App auswählen, den Cookie-Hinweis einfach ignorieren und rechts den Button „App Bearbeiten“ auswählen. Dahinter versteckt dich die Konfigurations-Ebene; wer immer sich das wohl ausgedacht hat.

Da kann man dann auswählen, welches Relais wofür verwendet wird.

Wann der Fenecon die Zustände auslöst, lasst sich in der GUI konfigurieren:

Diverse Links zu Fokus zu dem Thema:

  • https://www.vaillant.ch/downloads/installationsanleitungen/deutsch/waermepumpen/elektrische-anschluesse/installationsanleitung-elektrische-anschluesse-arotherm-plus-1727522.pdf
  • https://www.photovoltaikforum.com/thread/167490-sgready-pvready-mit-vaillant-w%C3%A4rmepumpe-und-senec-wechselrichter/
  • https://www.photovoltaikforum.com/core/attachment/7892-sg-ready-w%C3%A4rmepumpen-pdf/
  • https://www.haustechnikdialog.de/Forum/t/259807/PV-Anbindung-Vaillant-Arotherm-plus-mit-Shelly1
  • https://enphase.com/de-de/download/warmepumpe-vaillant-arotherm-plus-konfigurationsanleitung-fur-iq-energy-router
  • https://docs.fenecon.de/de/_/latest/fems/fems-app/OEM_App_SG-ready_Waermepumpe.html

Wenn der Wechselrichter das nicht kann, könnte man die beiden Kontakte in der Vaillant auch an ein Shelly-Relais verbinden und den Shelly aus dem Home-Assistent ansteuern.

Fenecon Home und das Rest-API

Merkwürdigerweise exportieren nicht alle Schnittstellen am Fenecon Home die gleichen Informationen. Die Rest-API hat mehr als Modbus, ist aber leider nur unvollständig dokumentiert. Die internen Temperaturen, die Netzfrequenz oder die Alterung der Batterie z.B. scheint es nur über Rest zu geben. Home Assistant kann Rest von Haus aus:

- resource: "http://192.168.0.123:8084/rest/channel/meter0/(Frequency)“
username: x
password: user
authentication: basic
scan_interval: 60
sensor:
  - value_template: '{{value_json | selectattr("address", "equalto", "meter0/Frequency") | map(attribute="value") | first }}‘
    name: "FEMS Netzfrequenz“
    unit_of_measurement: „Hz“
    device_class: Frequency
    state_class: measurement
    unique_id: "fems/meter0/frequency“
- resource: "http://192.168.0.123:8084/rest/channel/battery0/(Tower0PackVoltage|Current|Soh)“
username: x
password: user
authentication: basic
scan_interval: 60
sensor:
  - value_template: '{{value_json | selectattr("address", "equalto", "battery0/Tower0PackVoltage") | map(attribute="value") | first / 10 }}‘
    name: "FEMS Batteriespannung“
    unit_of_measurement: „V“
    device_class: voltage
    state_class: measurement
    unique_id: "fems/battery0/Tower0PackVoltage“
  - value_template: '{{value_json | selectattr("address", "equalto", "battery0/Current") | map(attribute="value") | first }}‘
    name: "FEMS Batteriestrom“
    unit_of_measurement: „A“
    device_class: current
    state_class: measurement
    unique_id: "fems/battery0/Current“
  - value_template: '{{value_json | selectattr("address", "equalto", "battery0/Soh") | map(attribute="value") | first }}‘
    name: "FEMS Batterie State of Health“
    unit_of_measurement: „%“
    #device_class: current
    state_class: measurement
    unique_id: "fems/battery0/Soh“
- resource: "http://192.168.0.123:8084/rest/channel/charger.+/(ActualPower|Voltage|Current|ActualEnergy)“
username: x
password: user
authentication: basic
scan_interval: 20
sensor:
  - name: "FEMS PV 2 Leistung“
    value_template: '{{value_json | selectattr("address", "equalto", "charger1/ActualPower") | map(attribute="value") | first }}‘
    unit_of_measurement: „W“
    device_class: power
    state_class: measurement
    unique_id: "fems/charger1/ActualPower“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger1/Voltage") | map(attribute="value") | first / 1000 }}‘
    name: "FEMS PV 2 Spannung“
    unit_of_measurement: „V“
    device_class: voltage
    state_class: measurement
    unique_id: "fems/charger1/Voltage“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger1/Current") | map(attribute="value") | first / 1000 }}‘
    name: "FEMS PV 2 Strom“
    unit_of_measurement: „A“
    device_class: current
    state_class: measurement
    unique_id: "fems/charger1/Current“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger1/ActualEnergy") | map(attribute="value") | first }}‘
    name: "FEMS PV 2 Erzeugung“
    unit_of_measurement: „Wh“
    device_class: energy
    state_class: total_increasing
    unique_id: "fems/charger1/ActualEnergy“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger0/ActualPower") | map(attribute="value") | first }}‘
    name: "FEMS PV 1 Leistung“
    unit_of_measurement: „W“
    device_class: power
    state_class: measurement
    unique_id: "fems/charger0/ActualPower“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger0/Voltage") | map(attribute="value") | first / 1000 }}‘
    name: "FEMS PV 1 Spannung“
    unit_of_measurement: „V“
    device_class: voltage
    state_class: measurement
    unique_id: "fems/charger0/Voltage“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger0/Current") | map(attribute="value") | first / 1000 }}‘
    name: "FEMS PV 1 Strom“
    unit_of_measurement: „A“
    device_class: current
    state_class: measurement
    unique_id: "fems/charger0/Current“
  - value_template: '{{value_json | selectattr("address", "equalto", "charger0/ActualEnergy") | map(attribute="value") | first }}‘
    name: "FEMS PV 1 Erzeugung“
    unit_of_measurement: „Wh“
    device_class: energy
    state_class: total_increasing
    unique_id: "fems/charger0/ActualEnergy“
- resource: "http://192.168.0.123:8084/rest/channel/batteryInverter0/(AirTemperature|BmsPackTemperature|RadiatorTemperature)“
username: x
password: user
authentication: basic
scan_interval: 60
sensor:  
  - value_template: '{{value_json | selectattr("address", "equalto", "batteryInverter0/AirTemperature") | map(attribute="value") | first }}‘
    name: "FEMS batteryInverter0/AirTemperature“
    unit_of_measurement: „°C“
    device_class: temperature
    state_class: measurement
    unique_id: "fems/batteryInverter0/AirTemperature“
  - value_template: '{{value_json | selectattr("address", "equalto", "batteryInverter0/BmsPackTemperature") | map(attribute="value") | first }}‘
    name: "FEMS batteryInverter0/BmsPackTemperature“
    unit_of_measurement: „°C“
    device_class: temperature
    state_class: measurement
    unique_id: "fems/batteryInverter0/BmsPackTemperature“
  - value_template: '{{value_json | selectattr("address", "equalto", "batteryInverter0/RadiatorTemperature") | map(attribute="value") | first }}‘
    name: "FEMS batteryInverter0/RadiatorTemperature“
    unit_of_measurement: „°C“
    device_class: temperature
    state_class: measurement
    unique_id: "fems/batteryInverter0/RadiatorTemperature"

 

Fenecon Modbus Details

Die Modbus-Dokus und Sensor-Namen sind teilweise nicht selbsterklärend und in englisch.

Glossar:

  • ESS = Energy Storage System
  • SOC = State of Charge
  • EVCS = Electric Vehicle Charging Station = WallBox
  • Meter = StromZähler
  • Inverter = Wechselrichter
  • Active Power = Wirkleistung
  • Apparent Power =  Scheinleistung
  • Reactive Power = Blindleistung

ESS_SOC ist also der Ladezustand (in Prozent) des Akkus:

public static final Sum.ChannelId ESS_SOC
Ess: Average State of Charge.
  Interface: Sum (origin: Ess)
  Type: Integer
  Unit: %
  Range: 0..100

Und einige nicht selbsterklärende Sensoren:

  • GRID_MODE Values: ‚-1‘ = UNDEFINED, ‚1‘ = On-Grid, ‚2‘ = Off-Grid 
  • battery0/Tower0PackVoltage = FEMS Batteriespannung
  • battery0/Current = Stromstärke
  • battery0/Soh = FEMS Batterie State of Health in Prozent
  • Charger0 = String 1
  • Charger 1 = String 2
  • Actual energy = Leistung in Watt
  • Voltage = Spannung in Volt
  • Current  = Strom in Ampere
  • ActualEnergy = Erzeugung in Wh

Quellen:

  1. https://openems.github.io/openems.io/javadoc/io/openems/edge/common/sum/Sum.ChannelId.html#PRODUCTION_AC_ACTIVE_POWER
  2. https://openems.github.io/openems.io//openems/latest/edge/controller.html
  3. https://openems.io/