Vaillant Recovair 275 aus Home Assistant steuern

Für die Steuerung der Vaillant Recovair 275 aus dem Home Assistant heraus, bietet sich eine Hardware-Lösung an. Die Recovair hat verschiedene Eingänge:

Leider ist die Auswahl an potential-freien Relais bei Shelly sehr begrenzt, nämlich genau eines: Shelly Plus 1.

Das Relais lässt sich dafür mit einem Steckernetzteil betreiben (praktisch und sicher):

Wenn man am Shelly die beiden Input + Output Anschlüsse benutzt um an der Recovair am Port X11 einen Kontakt zwischen 0 und H herzustellen, hat man schon alles was man braucht:

Na gut, es ist nur ein 2-Stufen-Schalter (offen und 0 auf H aber nicht 0 auf D). Dafür könnte man ein zweites Relais benutzen, dann muss man nur sicherstellen, daß nicht beide gleichzeitig aktiv sind. Aber die Lüftungsstufe High aktivierbar zu machen reicht mir. 0 auf D ist ja ohnehin das normale Tagesprogramm, welches die Automatik meistens ohnehin ansteuert.

Im Home Assistant geht das über die normale Shelly-Integration und sieht dann so aus:

Aktiviert man den Schalter, aktiviert man den High-Betrieb. Schaltet man ihn aus, geht das Gerät zurück in was auch immer man programmiert hat und sonst jetzt gerade aktiv wäre.

Damit der High-Modus nicht tagelang aktiv bleibt, gibt es noch eine Automatisierung im Home Assistant, die nach drei Stunden den Schalter wieder aufhebt:

Damit ein frisch gestarteter Shelly (Firmware Update, …) den High-Modus nicht versehentlich aktiviert, sollte man im Shelly noch die Action on power auf OFF setzen:

 

eBusD und Vaillant Recovair 275

Die Vaillant Recovair 275 ist etwas eigenartig. An den Sensocomfort lässt sie sich nicht anbinden, obwohl die ein eBus-Gerät ist. Aus dem Installationshandbuch:

Das Sensocomfort-Display bleibt einfach dunkel, wenn man es trotzdem probiert. Schade, das original Bedienpanel ist schon ziemlich rudimentär.

Also muss wieder der eBus-Adapter ran, der vertragt sich nämlich mit der Recovair 275, auch parallel mit dem Bediengerät. Der Anschluss ist einfach, der eBus ist extern (rechts unten am Gerät) rausgeführt, dort wird auch die Fernbedienung angeschlossen:

Den Adapter kann man einfach parallel mit auflegen.

Das eBus Addon für den Home Assistant kann leider nicht mit zwei Adaptern umgehen, das ist wohl zu sehr Nische. Also kommt ein neuer eBusD auf den PiHole mit drauf und postet von dort auf dem Home Assistant MQTT-Broker. Angebunden wird der eBus-Adapter über Wifi.

Die Konfiguration sieht dann so aus:

# /etc/default/ebusd:
# config file for ebusd service.
# Options to pass to ebusd (run "ebusd -?" for more info):
EBUSD_OPTS="--latency=10 --scanconfig --port=8888 --device=ens:192.168.0.123:9999 --configpath=/home/bla/ebusd-configuration/ebusd-2.1.x/de --mqttint=/etc/ebusd/mqtt-hassio.cfg --mqttjson --mqtthost 192.168.0.999 --mqttport 1883 --mqtttopic=recovair --mqttvar='area=recovair' —mqttuser=user —mqttpass=password --mqttvar=filter-direction=r|u| --log=all:notice --log=update:error"

Der eBusD findet dann zwei Geräte auf dem Bus: die Recovair (ID=WTW04) und das Bedienpanel (ID=VAI00). Dafür brauchen wir zwei CSV-Dateien. Insbesondere das FHEM-und das Loxone-Forum war hier sehr hilfreich. Dort finden sich verschiedene Versionen für verschiedene Recovair-Modelle. Nach etwas basteln und testen sind diese beiden Dateien entstanden:

Fernbedienung 15.vai00.csv:

# Before constructing the variable replacements, the messages and fields can optionally be filtered in order to use
# type (r[1-9];w;u),circuit,name,[comment],[QQ],ZZ,PBSB,[ID],field1,part (m/s),datatypes/templates,divider/values,unit,comment
#,recov,RecoVair 275,,,,,,,,,,,
# ##### Generell #####,,,,,,,,,,,,,
*r,,,,,,B509,0D,,,,,,
*w,,,,,,B509,0F,,,,,,
r;w,,Lueftungsstufe,Lueftungsstufe,,,,2400,,,UCH,1=Tag;2=Aus;3=Auto;5=Nacht,,
r;w,,Lueftung_HI,Lueftung_HI,,,,5800,,,BCD:2,,,
r,,Uhrzeit,Uhrzeit,,,,2C00,,,VTI,,,
#

Für die Recovair 275 c0.wtw04.csv:

# type (r[1-9] w u ),circuit,name,[comment],[QQ],ZZ,PBSB,[ID],field1,part (m/s),datatypes/templates,divider/values,unit,comment
#,recov,RecoVair 275,,,,,,,,,,,
############ Luftvolumen################,,,,,,,,,,,,,
*r,,,,,,B509,0D,,,,,,
*w,,,,,,B509,0E,,,,,,
w,,Lueftung = 50m³/h,Lueftung = 50m³/h,,,,1500a600,,,,,,
w,,Lueftung = 55m³/h,Lueftung = 55m³/h,,,,1500b700,,,,,,
w,,Lueftung = 60m³/h,Lueftung = 60m³/h,,,,1500c800,,,,,,
w,,Lueftung = 65m³/h,Lueftung = 65m³/h,,,,1500d800,,,,,,
w,,Lueftung = 70m³/h,Lueftung = 70m³/h,,,,1500e900,,,,,,
w,,Lueftung = 75m³/h,Lueftung = 75m³/h,,,,1500fa00,,,,,,
w,,Lueftung = 80m³/h,Lueftung = 80m³/h,,,,15000a01,,,,,,
w,,Lueftung = 85m³/h,Lueftung = 85m³/h,,,,15001b01,,,,,,
w,,Lueftung = 90m³/h,Lueftung = 90m³/h,,,,15002c01,,,,,,
w,,Lueftung = 95m³/h,Lueftung = 95m³/h,,,,15003c01,,,,,,
w,,Lueftung = 100m³/h,Lueftung = 100m³/h,,,,15004d01,,,,,,
w,,Lueftung = 105m³/h,Lueftung = 105m³/h,,,,15005e01,,,,,,
w,,Lueftung = 110m³/h,Lueftung = 110m³/h,,,,15006e01,,,,,,
w,,Lueftung = 115m³/h,Lueftung = 115m³/h,,,,15007f01,,,,,,
w,,Lueftung = 120m³/h,Lueftung = 120m³/h,,,,15009001,,,,,,
w,,Lueftung = 125m³/h,Lueftung = 125m³/h,,,,1500a001,,,,,,
w,,Lueftung = 130m³/h,Lueftung = 130m³/h,,,,1500b101,,,,,,
w,,Lueftung = 135m³/h,Lueftung = 135m³/h,,,,1500c201,,,,,,
w,,Lueftung = 140m³/h,Lueftung = 140m³/h,,,,1500d201,,,,,,
w,,Lueftung = 145m³/h,Lueftung = 145m³/h,,,,1500e301,,,,,,
w,,Lueftung = 150m³/h,Lueftung = 150m³/h,,,,1500f401,,,,,,
w,,Lueftung = 155m³/h,Lueftung = 155m³/h,,,,15000402,,,,,,
w,,Lueftung = 160m³/h,Lueftung = 160m³/h,,,,15001502,,,,,,
w,,Lueftung = 165m³/h,Lueftung = 165m³/h,,,,15002602,,,,,,
w,,Lueftung = 170m³/h,Lueftung = 170m³/h,,,,15003602,,,,,,
w,,Lueftung = 175m³/h,Lueftung = 175m³/h,,,,15004702,,,,,,
w,,Lueftung = 180m³/h,Lueftung = 180m³/h,,,,15005802,,,,,,
w,,Lueftung = 185m³/h,Lueftung = 185m³/h,,,,15006802,,,,,,
w,,Lueftung = 190m³/h,Lueftung = 190m³/h,,,,15007902,,,,,,
w,,Lueftung = 195m³/h,Lueftung = 195m³/h,,,,15008a02,,,,,,
w,,Lueftung = 200m³/h,Lueftung = 200m³/h,,,,15009a02,,,,,,
w,,Lueftung = 205m³/h,Lueftung = 205m³/h,,,,1500ab02,,,,,,
w,,Lueftung = 210m³/h,Lueftung = 210m³/h,,,,1500bc02,,,,,,
w,,Lueftung = 215m³/h,Lueftung = 215m³/h,,,,1500cc02,,,,,,
w,,Lueftung = 220m³/h,Lueftung = 220m³/h,,,,1500dd02,,,,,,
w,,Lueftung = 225m³/h,Lueftung = 225m³/h,,,,1500ee02,,,,,,
w,,Lueftung = 230m³/h,Lueftung = 230m³/h,,,,1500fe02,,,,,,
w,,Lueftung = 235m³/h,Lueftung = 235m³/h,,,,15000f03,,,,,,
w,,Lueftung = 240m³/h,Lueftung = 240m³/h,,,,15002003,,,,,,
w,,Lueftung = 245m³/h,Lueftung = 245m³/h,,,,15003003,,,,,,
w,,Lueftung = 250m³/h,Lueftung = 250m³/h,,,,15004103,,,,,,
w,,Lueftung = 255m³/h,Lueftung = 255m³/h,,,,15005203,,,,,,
w,,Lueftung = 260m³/h,Lueftung = 260m³/h,,,,15006203,,,,,,
w,,Lueftung = 265m³/h,Lueftung = 265m³/h,,,,15007303,,,,,,
w,,Lueftung = 270m³/h,Lueftung = 270m³/h,,,,15008403,,,,,,
w,,Lueftung = 275m³/h,Lueftung = 275m³/h,,,,15009403,,,,,,
w,,Lueftung = 280m³/h,Lueftung = 280m³/h,,,,1500a503,,,,,,
w,,Lueftung = 285m³/h,Lueftung = 285m³/h,,,,1500b603,,,,,,
w,,Lueftung = 290m³/h,Lueftung = 290m³/h,,,,1500c603,,,,,,
w,,Lueftung = 295m³/h,Lueftung = 295m³/h,,,,1500d703,,,,,,
w,,Lueftung = 300m³/h,Lueftung = 300m³/h,,,,1500e803,,,,,,
r;w,,Soll-Volumenstromkorrektur,Soll-Volumenstromkorrektur,,,,2000,,,D1B,,,
r9;w,,Waermerueckgewinnung,Waermerueckgewinnung,,,,0a00,,,UCH,1=EIN;2=AUS,,
*r,,,,,,B509,29,,,IGN:2,,,
r1;w,,TempInletAir_SAI,Temperatur Zuluft,,,,0100,,,temp,,,
r1;w,,TempOutsideAir_SAO,Temperatur Aussenluft,,,,0200,,,temp,,,
r1;w,,TempWasteAir_EAI,Temperatur Abluft,,,,0300,,,temp,,,
r1;w,,TempOutgoingAir_EAO,Temperatur Fortluft,,,,0400,,,temp,,,
r1;w,,Roomtemp,Zimmertemperatur,,,,0000,,,temp,,,
r;w,,Unterdruckschutz,Unterdruckschutz,,,,4700,,,UCH,1=AN;0=AUS,,
r5;w,,Ertrag_Gesamt_kWh,Ertrag_Gesamt_kWh,,,,4d00,,,UIN,,,
r5;w,,Heatrecovery,Wärmerueckgewinnung,,,,8c03,,,UCH,0=auto;1=on;2=off,,Aktuelle Uhrzeit
r;w,,Desiredtemp,Wunschtemp,,,,140e,,,temp,,°C,
*r,,,,,,B509,29,,,,,,r9,,BypassStellung,BypassStellung,,,,0900,,,IGN:2;percent0,,,

Die Dateien:

Lässt man den eBusD eine Weile laufen, sammeln sich einige relevante Werte an:

$ebusctl -p 8888 find -d -r -w -p
broadcast queryexistence = (empty for 31fe07fe00 / )
broadcast signoflife = (empty for 10fe07ff00 / )
scan.15 = Vaillant;VAI00;0125;8901
scan.15 id = 21;11;24;0020015281;0907;005605;N3
scan.c0 = Vaillant;WTW04;0127;9001
scan.c0 id = 21;11;33;0010005354;0006;005593;N5
vai00 Lueftung_HI = 0
vai00 Lueftungsstufe = Auto
vai00 Uhrzeit = 19:59:11
wtw04 BypassStellung = 0
wtw04 Ertrag_Gesamt_kWh = 54160
wtw04 Lueftung = 70m³/h = (empty for 10c0b509050e1500e900 / 00)
wtw04 Roomtemp = 17.94
wtw04 Soll-Volumenstromkorrektur = 5
wtw04 TempInletAir_SAI = 7.50
wtw04 TempOutgoingAir_EAO = 11.88
wtw04 TempOutsideAir_SAO = 16.38
wtw04 TempWasteAir_EAI = 17.56
wtw04 Unterdruckschutz = AN
wtw04 Waermerueckgewinnung = EIN

Das kann dann in Home Assistant so aussehen:

Die Messwerte sind etwas daneben; die Thermometer sind halt im Gerät nahe am Wärmetauscher verbaut. Wenn die Frischluft bis dahin gekommen ist, hat sie sich ja schon erwärmt.

So richtig viel steuern kann man bei der Recovair 275 nicht, im Kern liefert sie einige interessante Temperatur-Messwerte. Die verfügbaren Informationen:

$ ebusctl -p 8888 find -F circuit,name,comment
broadcast,datetime,Datum/Uhrzeit
broadcast,error,Fehlernachricht
broadcast,hwcStatus,Status Warmwasser
broadcast,id,Identifikation
broadcast,id,Identifikation
broadcast,load,Quick - WW Speicherladung
broadcast,outsidetemp,Außentemperatur
broadcast,signoflife,Lebenszeichen
broadcast,vdatetime,Datum/Uhrzeit
general,valuerange,Register Wertebereich
memory,eeprom,EEPROM Daten lesen
memory,ram,RAM Daten lesen
scan,id,Scan ID
scan.15,,
scan.15,id,Scan ID
scan.c0,,
scan.c0,id,Scan ID
vai00,Lueftung_HI,Lueftung_HI
vai00,Lueftungsstufe,Lueftungsstufe
vai00,Uhrzeit,Uhrzeit
wtw04,BypassStellung,BypassStellung
wtw04,Desiredtemp,Wunschtemp
wtw04,Ertrag_Gesamt_kWh,Ertrag_Gesamt_kWh
wtw04,Heatrecovery,Wärmerueckgewinnung
wtw04,Roomtemp,Zimmertemperatur
wtw04,Soll-Volumenstromkorrektur,Soll-Volumenstromkorrektur
wtw04,TempInletAir_SAI,Temperatur Zuluft
wtw04,TempOutgoingAir_EAO,Temperatur Fortluft
wtw04,TempOutsideAir_SAO,Temperatur Aussenluft
wtw04,TempWasteAir_EAI,Temperatur Abluft
wtw04,Unterdruckschutz,Unterdruckschutz
wtw04,Waermerueckgewinnung,Waermerueckgewinnung

Home Assistant Energie Dashboard und Fenecon Home

So lässt sich der Fenecon Home in das Home Assistant Energie-Dashboard einbinden:

Die Sensoren kommen aus der Modbus-Integration, Man muss aus der Menge der Sensoren nur die erwischen, die genau das liefern, was Home Assistant erwartet.

Für einige Sensoren sind noch Details verfügbar, z.B: die Preise oder die Solar-Wettervorhersage (die ziemlich ungenau ist).

 

Das ergibt dann eine schöne Übersicht über Verbrauch, Produktion und Kosten von Strom, Gas, Wasser,  …

Fenecon Home über MQTT anbinden

 

Es gibt für den Fenecon Home ein Addon, welches die WebSocket-Schnittstelle anzapft und die Daten per MQTT in den Home Assistant bringt. Teilweise ist diese Schnittstelle ausführlicher als die Modbus-Schnittstelle. Modus bietet z.B. nicht die Einzelwerte der Strings an, sondern nur die Summe.

Die Installation ist recht simpel: downloaden, Benutzer/Passwort und zwei IPs eintragen. Die eine IP ist die des MQTT-Brokers (normalerweise der Home Assistant), die andere IP ist die des Fenecons.

mqtt_broker_host: 192.168.0.xyz
mqtt_broker_port: 1883
mqtt_broker_user: FeneconUser
mqtt_broker_passwd: FeneconPasswort

Den Benutzer und Passwort muss man vorher im Home Assistant in den Einstelllungen anlegen.

fems_ip: 192.168.0.abc
fems_password: user

Das Passwort user ist das Standard-PW des Fenecons. 

Danach einmal den HA durchstarten und über die vielen neuen Sensoren freuen:

Fenecom Home im Home Assistant

Den Fenecon Home in Home Assistant einzubinden ist nicht wirklich kompliziert. Der Fenecon bietet Modbus an, welches im lokalen Netz zu erreichen ist.

In der configuration.yaml reicht ein Eintrag wie

modbus: !include fenecon-modbus.yaml

In der fenecon-modbus.yaml sind dann die ganze Sensoren drin. Vorlagen dafür finden sich in diversen Foren. Die Konfiguration hängt sicherlich immer von der konkreten Hardware ab. Bei mir sieht das so aus.

- name: „fems“
delay: 5
timeout: 5
type: tcp
host: 192.168.168.99
port: 502
sensors:
  #INT
  - name: "FEMS_EssSoc" # Battery SoC
    scan_interval: 60
    data_type: uint16
    input_type: input
    device_class: battery
    state_class: measurement
    unit_of_measurement: „%“
    address: 302
    slave: 1
    unique_id: fems_modbus_302
  #FLOAT32    
  - name: "FEMS_EssActivePower" # Combined Power of PV + Battery
    unit_of_measurement: W
    scan_interval: 10
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 303
    slave: 1
    unique_id: fems_modbus_303
  - name: "FEMS_GridActivePower" # Grid Power
    unit_of_measurement: W
    scan_interval: 10
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 315
    slave: 1
    unique_id: fems_modbus_315
- name: "FEMS_ProductionDcActualPower" # PV Power
    unit_of_measurement: W
    scan_interval: 10
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 339
    slave: 1
    unique_id: fems_modbus_339
  - name: "FEMS_ConsumptionActivePower" #House Power
    unit_of_measurement: W
    scan_interval: 10
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 343
    slave: 1
    unique_id: fems_modbus_343
  - name: „FEMS_EssActivePowerL1“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 391
    slave: 1
    unique_id: fems_modbus_391
  - name: „FEMS_EssActivePowerL2“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 393
    slave: 1
    unique_id: fems_modbus_393
  - name: „FEMS_EssActivePowerL3“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 395
    slave: 1
    unique_id: fems_modbus_395
  - name: „FEMS_GridActivePowerL1“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 397
    slave: 1
    unique_id: fems_modbus_397
  - name: „FEMS_GridActivePowerL2“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 399
    slave: 1
    unique_id: fems_modbus_399
  - name: „FEMS_GridActivePowerL3“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 401
    slave: 1
    unique_id: fems_modbus_401
  - name: „FEMS_ConsumptionActivePowerL1“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 409
    slave: 1
    unique_id: fems_modbus_409
  - name: „FEMS_ConsumptionActivePowerL2“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 411
    slave: 1
    unique_id: fems_modbus_411
  - name: „FEMS_ConsumptionActivePowerL3“
    unit_of_measurement: W
    scan_interval: 20
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 413
    slave: 1
    unique_id: fems_modbus_413
  - name: "FEMS_EssDischargePower" #Battery Discharge Power
    unit_of_measurement: W
    scan_interval: 5
    data_type: float32
    input_type: holding
    device_class: power
    state_class: measurement
    address: 415
    slave: 1
    unique_id: fems_modbus_415
  #Energy (Float64)
  - name: "FEMS_EssActiveChargeEnergy" #not sure what this is, I think its the Energy the battery has been charged form AC/the Grid, should not be too high, because its normally not possible/allowed (in Germany at least) to charge from the Grid.
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 351
    slave: 1
    unique_id: fems_modbus_351
  - name: "FEMS_EssActiveDischargeEnergy" #not sure what this is, I think its the total amount of Energy the System has put out to AC, so basicially the the amount of PV minus what is currently stored in the battery plus the amount that you have charged from the Grid (so FEMS_EssActiveChargeEnergy), but that is normally not possible, so this is not very useful.
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 355
    slave: 1
    unique_id: fems_modbus_355
  - name: "FEMS_GridBuyActiveEnergy" #Total Consumption from Grid
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 359
    slave: 1
    unique_id: fems_modbus_359
  - name: "FEMS_GridSellActiveEnergy" #Total Energy Sold to Grid
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 363
    slave: 1
    unique_id: fems_modbus_363
  - name: "FEMS_ProductionActiveEnergy" # Total PV Production Energy
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 367
    slave: 1
    unique_id: fems_modbus_367
  - name: "FEMS_ConsumptionActiveEnergy" # Total Energy Usage
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 379
    slave: 1
    unique_id: fems_modbus_379
  - name: "FEMS_EssDcChargeEnergy" # Total Battery Charge Energy
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 383
    slave: 1
    unique_id: fems_modbus_383
  - name: "FEMS_EssDcDischargeEnergy" # Total Battery Discharge Energy
    unit_of_measurement: Wh
    scan_interval: 60
    data_type: float64
    input_type: holding
    device_class: energy
    state_class: total_increasing
    address: 387
    slave: 1
    unique_id: fems_modbus_387

Wenn das alles eingebunden ist, kann man das im Energie-Dashboard einrichten:

Im Fenecon-Webinterface sind noch weitere Modbus-Register aufgeführt, aber da kommen keine Werte. Vermutlich sind die nur aktiv, wenn man mehrere Batterie-Türme oder die optionalen Relais-Boards hat, …

eBus und Vaillant Arotherm

Die Vaillant ArothermPlus benutzt eBus zur Kommunikation zwischen den Komponenten: Bedienpanel, Hydraulikstation, Solarthermie, …

eBus ist eine Art RS232-Bus, was natürlich kein normaler Rechner beherrscht. Aber es gibt einige wenige Adapter, wie z.B. den eBus Adapter.

Der Anschluss des Adapters an den eBus ist relativ simpel. An den eBus ranzukommen ist dagegen nicht so ganz einfach. Im Bedienpanel ist kein Platz für ein weiteres Kabel. Die Wärmepumpe ist draußen, da müsste wieder ein weiteres Kabel durch die Wand. Und die Hydraulikstation muss man aufmachen und an die reichlich beengte Steuerplatine ran. Im SensoNet liegt der eBus nicht als normale Klemme an, sondern ein komischer Spezialstecker welcher mit einem vergossenen Kabel an die Hydraulikstation geht. Bei uns liegt der eBus aber im Vaillant VR70 Mischer gut zugänglich an. 

Bildschirmfoto 2023 11 16 um 06 39 30

Da die Klemme für ein weiteres Kabel zu klein war, mussten zwei Wago-Klemmen als kleine Verteiler herhalten. Die Polung ist egal. Von dort aus geht ein Kabel (ca 5 Meter, Schlauchleitung H03 VVH2-F 2×0,75 mm² ) in den Netzwerk-Schrank. Dort ist der eBus-Adapter eingebaut; da liegt er sicher, hat Strom, … und baumelt nicht irgendwo an der Wand rum.

Der Adapter selber hatte eine alte Firmware, die bei mir nicht stabil lief. Das Flashen ist auf der WebSeite beschrieben, aber etwas merkwürdig (Webbrowser, serielle Schnittstelle, …) ging dann aber nach mehreren Versuchen. Seitdem läuft der Adapter (überwiegend) stabil, wobei mir noch nicht ganz klar ist, ob der Adapter oder der eBusD manchmal hängt.

Bildschirmfoto 2023 11 16 um 07 13 15

Zum Einrichten baut er ein kleines WLAN auf, bei dem man sich anmeldet und die Erstkonfiguration macht. Im Prinzip braucht er nur die Zugangsdaten zum Haus-Wifi und für das Webinterface einen Benutzer und ein Passwort.

Wichtig ist der eBus Device String, der angezeigt wird.

Zur Integration des eBusD in den Home Assistant gibt es verschiedene Varianten. Ich habe dieses AddOn benutzt, das sich über den HACS installieren lässt.

Bildschirmfoto 2023 11 16 um 07 17 57

Für die Konfiguration dieses Addons braucht man wieder den eBus Device String von oben. Für das AddOn muss dann noch der Autostart aktiviert werden.

Danach den Adapter und den Home Assistant einmal neu starten. Wenn alles klappt, zeigt der Adapter bei eBusD connected ein Yes an. Und bei eBus acquired natürlich auch.

Das Addon richtet die Datenübertragung per MQTT ein:Bildschirmfoto 2023 11 16 um 07 22 53

Danach bekommt man wirklich viele Entitäten in den Home Assistant gespült:

Ebus

 

Viele von den Werten bekommt man auch über Vaillant-API, aber nicht alle. Die Temperaturen aus dem Solarthermie-Mischer VR70 z.B. hat die API nicht. Einige fehlen aber auch, z.B. die Arbeitszahlen. Die errechnet sich der Vaillant-Service vermutlich aus den Rohdaten, denn der VR921 hängt ja auch am eBus und sollte daher nicht mehr Daten zur Verfügung haben.

Home Assistant und Impluszähler

Wenn man in Home Assistant den Wasser- oder Gasverbrauch pro Tag erfassen will, muss man die Impuls-Zähler um Mitternacht zurück setzen. Ansonsten zählt der einfach immer weiter und man hat keine Unterscheidung zwischen den Tagen sondern den Gesamtverbrauch über alle Tage.

Bildschirmfoto 2023 11 09 um 19 44 04

Dafür braucht man eine Automatisierung. Der Auslöser ist die Uhrzeit und die Aktion ist der Service counter.reset. Dort dann die beiden Wasser- und Gaszähler auswählen:

Bildschirmfoto 2023 11 09 um 19 46 16

Shoot yourrself into the Shelly

Grmpf. Ich habe die letzten Tage beim Basteln ein paar mal die Konfiguration des Shelly Plus i4 DC verloren, war einfach so weg. Keine Ahnung warum.

Heute ist mir bei einem Basteln mit einem anderen Shelly Plus i4 klar geworden, was da passiert: ein automatisierter Reset auf die Werkseinstellungen.

Beim i4 löst man einen Factory-Reset aus, in dem man den höchsten Eingang mehrfach schnell auf An zieht. Eigentlich sind die Dinger ja für Lichtschalter gedacht und da passiert das in der Geschwindigkeit eher nicht. Es hämmert ja niemand per Dauerfeuer auf einem Lichtschalter rum. Na gut, Kleinkinder vielleicht wenn sie die Sache mit dem Lichtschalter entdecken.

Aber eine Wasseruhr bekommt das hin, wenn da pro Liter ein Impuls kommt. Und in so eine Toilettenspülung gehen ein paar Liter rein; und schon geht die Konfiguration in die Kanalisation.

Also nicht Eingang 4 nehmen. Oder in der Konfiguration den externen Factory-Reset abschalten. Aber dann bekommt man ihn extern nicht mehr zurückgesetzt; auch doof.

IMG 1703

Wasser- & Gasverbrauch in Home Assistant

Ich wollte meinem Home Assistant noch das Messen des Wasser- und Gasverbrauches beibringen. Wie immer, wenn man es fertig hat, ist es im Kern einfach; aber der Weg war etwas beschwerlich. Daher hier mein funktionierendes Setup.

Komponenten:

Die Abnehmer kann man auch preiswerter machen, aber insbesondere der für die Wasseruhr sitzt mechanisch stabil auf drauf. Kein Wackeln, kein Kleben, … einfach draufstecken und er rastet auf diesen Zapfen ein.

 

IMG 1534

IMG 1698

Der Gas-Abnehmer hat nur zwei Kontakte, bei dem Wasserabnehmer braucht man Weiß und Braun, der Rest kann weg.

 

IMG 1525

IMG 1691Beim Tasmota-Shelly müssen die Eingänge auf Switch_n stehen. Die beiden Abnehmer habe ich an Eingang 1 und 4 dran:

Bildschirmfoto 2023 11 04 um 07 09 49Bildschirmfoto 2023 11 04 um 07 10 02

Die Konfiguration als Switch erzeugt zwei Signale: Schalter an und Schalter aus, jedesmal wenn der Reed-Kontakt ein Signal sendet. Das zweite Signal kann man im HA einfach ignorieren. Die Konfiguration als Button wäre eigentlich korrekter, aber Buttons in HA sind umständlich, da die nicht als Entität in den Automatisierungen auftauchen; warum auch immer.

IMG 1696

Beim Tasmota-Shelly läuft die Datenübertragung per MQTT an den Home Assistant:

Bildschirmfoto 2023 11 04 um 22 29 44Jetzt braucht es noch etwas Konfiguration im Home Assistant. Für Gas und Wasser wird je eine Automatisierung benötigt: wenn der Schalter sich öffnet, muss ein Zähler erhöht werden; wir zählen die Impulse.

Bildschirmfoto 2023 11 04 um 20 47 41

Die Zähler für Gas und Wasser legt man als Helfer an:Bildschirmfoto 2023 11 04 um 20 48 54

In der Automations.yaml sieht das dann so aus:

- id: ‚1698295769848‘

  alias: WasserUhrEvent

  description: WasserUhrEvent

  trigger:

  - platform: state

    entity_id:

    - binary_sensor.energo_switch1

    from: ‚off‘

    to: ‚on‘

  condition: []

  action:

  - service: counter.increment

    data: {}

    target:

      entity_id: counter.wasserzahler

  mode: single

- id: ‚1698295894472‘

  alias: GasEvent

  description: GasEvent

  trigger:

  - platform: state

    entity_id:

    - binary_sensor.energo_switch4

    from: ‚off‘

    to: ‚on‘

  condition: []

  action:

  - service: counter.increment

    data: {}

    target:

      entity_id: counter.gaszaehler

  mode: single

Jetzt müssen wir uns noch Sensoren basteln, damit diese in Diagrammen und im Energie-Dashboard verwendet können. Die werden in der Configuration.yaml erzeugt:

template:

  - sensor:

    - name: „Sensor_Gas_m3“

        unit_of_measurement: „m³“

        device_class: gas

        state_class: total_increasing

        state: >

          {% set gas = states('counter.gaszaehler') | int %}

          {{ ((gas) * 0.01) | round(1, default=0) }}

  - sensor:

    - name: „Sensor_Gas_kwh“

        unit_of_measurement: „kWh“

        device_class: energy

        state_class: total_increasing

        state: >

          {% set kwh = states('sensor.Sensor_Gas_m3') | float %}

          {{ ((kwh) * 10.48) | round(1, default=0) }}

- sensor:

    - name: „sensor_Wasser_L“

        unit_of_measurement: „L“

        device_class: water

        state_class: total_increasing

        state: >

          {% set water = states('counter.wasserzahler') | int %}

          {{ ((water) * 1) | round(1, default=0) }}


Die Umrechnungswerte sind bei mir pro Impuls 0,01 qm Gas und pro Liter Wasser. Der Brennwert des Gases findet sich auf der letzten Gas-Rechnung und unterscheidet sich von Netzbetreiber zu Netzbetreiber. Bei uns sind es 10,48.

Danach lassen sich dann Diagramme definieren:

Bildschirmfoto 2023 11 04 um 20 54 08

Und auch im Energiedashboard aufnehmen:

Bildschirmfoto 2023 11 04 um 20 54 57

Home Assistant und Vaillant

Das Einbinden einer Vaillant ArothermPlus in den Home Assistant ist im Kern trivial:

  1. HACS im Home Assistant installieren
    1. https://hacs.xyz/
  2. Die myPyllant Komponente von SignalKraft installieren
    1. https://github.com/signalkraft/mypyllant-component
  3. Die Anmelde-Daten von der myVaillant App benutzen

Danach bekommt man diverse Messwerte der Wärmepumpe in den Home Assistant gespült: Energieverbräuche für Heizung und Warmwasser, Umweltgewinne, … aber auch viele Anlageneigenschaften wie aktueller Wasserdruck oder die hinterlegten Konfigurationen (Heizkurve, …).

Zur Installation braucht man allerdings eine native Home Assistant Installation, keine die im Docker läuft.

Bildschirmfoto 2023 11 04 um 06 39 01

Leider dokumentiert Vaillant die API nicht offiziell, sodaß Signalkraft mittels myVaillants Android-App und MITM-Proxies den Datenverkehr beobachtet um zu sehen, was da passiert.

Wer die Integration am Laufen hat, kann helfen, indem er seine Anlagenkonfiguration mittels Testscript ausliest und hochlädt:

  • https://signalkraft.com/mypyllant-component/3-contributing/#contributing-to-the-underlying-mypyllant-library