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/

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, …