Energiemonitoring mit Loxone – Wärmepumpe

Dies ist der zweite Teil meiner Serie zum Thema Energiemonitoring und -management im Smart Home mit Loxone. Teil 1 „Energiemonitoring mit Loxone und SMA“ beschreibt meine Motivation, meinen Energieverbrauch besser zu verstehen, z.B. um die Photovoltaikanlage bestmöglich zu nutzen, sowie die Schritte um alle Informationen aus der App meiner PV-Anlage in Loxone abzubilden. In diesem Beitrag stelle ich dar, wie ich diese Grundfunktionalität erweitert habe, um den Energieverbrauch unserer Wärmepumpe separat vom Rest der Verbraucher zu erfassen, um diesen getrennt analysieren zu können, und warum meine Lösung auch diesmal ohne Modbus auskommt.

Daten der Novelan-Wärmepumpe abfragen

Wie schon bei meiner Integration der DoorBird-Türklingel gab es durchaus Dokumentation im Internet, etwa im Loxwiki. Diese setzte teilweise aber auf älteren Versionen des Regelungsgeräts auf, und die Kommentare ließen keine abschließende Bewertung zu, ob das heute noch so funktionieren würde. Daher habe ich mir zunächst einen Überblick über die Möglichkeiten verschafft. Meine Erkenntnisse waren:

  • Wärmepumpen der ait-Gruppe (Alpha Innotec, Novelan) sowie einige andere teilen sich die Steuerungselektronik, die unter dem Namen „Luxtronik“ firmiert.
  • Zugriffsmöglichkeiten gibt es entweder am Bedienteil direkt, über eine Web-Oberfläche im Browser, oder über eine App des Herstellers. Dort kann die Wärmepumpe entweder über ihre lokale IP-Adresse angesprochen werden, oder über eine Registrierung im Onlineportal heatpump24.
  • Bei Nutzung der Web-Oberfläche zeigt der Web Inspector im Browser (anders als etwa Wechselrichter oder Wallbox) keine JSON-basierte HTTP-API, sondern eine WebSocket-Verbindung.
  • Kommunikation und Steuerung via Modbus ist bei diesem Gerät zwar theoretisch möglich, erfordert aber eine sog. GLT-Lizenz („Gebäudeleittechnik“) vom Hersteller, die via USB-Dongle freigeschaltet werden muss, und mit mehreren hundert Euro zu Buche schlägt.

Da also weder HTTP noch Modbus eine direkte Option waren, musste ein „Vermittler“ her. Dazu hatte ich vor ein paar Jahren schon zwei verschiedene Ansätze ausprobiert: (1) Einen HTTP-Server zu entwickeln, der auf die bestehende WebSocket-Schnittstelle ein REST-Interface aufsetzt. Das hat zwar im Prinzip funktioniert, war mir aber letztlich den Aufwand nicht wert, und (2) ein Plugin für Home Assistant, das leider damals auch nicht auf Anhieb funktioniert hat. Nachdem ich allerdings ohnehin kürzlich mein komplettes Docker-Setup inklusive Home Assistant auf einen neuen Rechner umgezogen und aktualisiert hatte, gab ich dieser Option eine zweite Chance. Ergebnis: Die „Luxtronik“-Integration aus dem Home Assistant Community Store HACS funktionierte auf Anhieb. Ich konnte nicht nur die Zählerstände des Energiezählers sehen, sondern auch sämtliche aktuelle Temperaturen, und die Sollwerte verändern. Auch die Anzeige, wann das Gerät wie lange gelaufen ist, ließen sich in Home Assistant deutlich besser aufbereiten als in der App des Herstellers.

Kommunikation zwischen Home Assistant und Loxone

Nun waren die Zählerwerte also in Home Assistant verfügbar. Für den Zählerbaustein in Loxone reichen diese prinzipiell aus. Um allerdings im Energieflussmonitor auch die aktuellen Leistungswerte und den Energiefluss zu visualisieren, wird auch der aktuelle Energieverbrauch benötigt, den die Wärmepumpe allerdings nicht direkt anzeigt. Hier greife ich zu einer Vereinfachung: Da unsere Wärmepumpe ihre Leistung nicht regulieren kann, sondern entweder „läuft“ oder „nicht läuft“, verwende ich den Status des Verdichters als Signal, und gehe dann von einer konstanten Leistungsaufnahme aus. Das betrifft am Ende sowieso nur die Momentan-Visualisierung im Energieflussmonitor, da für den tatsächlichen Verbrauch ja die exakten Zählerwerte zur Verfügung stehen. Ich habe mich daher nicht für den „Festwertzähler„-Baustein in Loxone entschieden, sondern für einen Standardzähler, und belege den Power-Eingang über einen „Status„-Baustein, der sich wiederum aus dem Status des Verdichters ableitet: Ist der Verdichter aktiv, liefert der Statusbaustein den Wert 1,95 (kW) am Ausgang, sonst Null.

Screenshot aus der Loxone Config: Der Virtuelle Eingang "WpVerdichter" ist über die Bausteine "Befehlserkennung" und "Status" mit dem "Pf"-Eingang (Power / Flow) des Zählerbausteins verbunden. Die virtuellen Eingänge "WpEnergieBw" und "WpEnergieHeiz" über einen "Addierer"-Baustein mit dem "Mr"-Eingang (Meter Reading).

Option 1: Abfrage aus Loxone via HTTP Input

Mein erster Ansatz war, genau wie für den Wechselrichter einen HTTP Input am Miniserver zu konfigurieren, der dann über einen HTTP Get-Aufruf die Zählerstände (Energieverbrauch Warmwasser, Energieverbrauch Heizung) sowie den Verdichterstatus abruft. Das hat zwar irgendwann funktioniert, war aber etwas komplexer als gedacht:

  1. Die Home Assistant REST API verlangt Authentifizierung via Bearer Tokens. Das ist ein gängiger Standard und durchaus sinnvoll, wird aber vom Miniserver nur für HTTP-Ausgänge unterstützt, nicht aber für HTTP-Eingänge. Ich konnte das nur umgehen, indem ich einen Reverse-Proxy zwischengeschaltet habe, der ohne Authentifizierung (oder wahlweise HTTP Basic Auth) funktioniert, und dann jedem Request an Home Assistant den Authentication Header1 mit dem korrekten Token hinzufügt.
  2. Da jede Entität ihre eigene URL hat (und ich das Konzept der Gruppen in Home Assistant noch nicht kannte), musste ich drei separate HTTP-Eingänge konfigurieren, also würde der Miniserver auch regelmäßig drei Requests absetzen.
  3. Da der Verdichterstatus als Hinweis zum aktuellen Stromverbrauch dient, sollte dieser möglichst schnell erkannt werden – die Anfragen müssten also in kurzen Abständen erfolgen. Allerdings würde sich dieser Status nur selten ändern – die meisten Abfragen würden also immer wieder dasselbe Ergebnis liefern und wären damit unnötig.

Option 2: Push aus Home Assistant via HTTP

Insgesamt erschien mir ein „Pull“-Mechanismus wenig sinnvoll, wenn ich beide Seiten kontrollieren konnte. Daher war mein zweiter Versuch, in Home Assistant eine Automatisierung zu verwenden, die bei Änderung des Verdichterstatus aktiv wird und den neuen Statuswert an den Miniserver schickt. Von der Installation meiner DoorBird-Türklingel wusste ich, dass das über die HTTP-API des Miniservers möglich ist. Im Prinzip kann man einfach über einen HTTP Get (!)-Request an http://miniserver/dev/sps/io/NameDesEingangs/wert einen neuen Wert setzen. In Home Assistant kann man einfach ein passendes RESTful Command definieren:

rest_command:
loxone_input:
url: 'http://miniserver/dev/sps/io/{{ input }}/{{ value }}'
username: !secret loxone_user
password: !secret loxone_password
timeout: 2

…und dieses dann in Automatisierungen mit den jeweiligen Werten für input und value füttern. Dieser Ansatz funktionierte ebenfalls. Später fand ich sogar heraus, dass es dafür schon einen Blueprint im Home Assistant Forum gegeben hätte. Dieser hätte allerdings per Konvention die Entity ID als Namen des Eingangs am Miniserver erwartet, und die waren mir nicht sprechend genug. Außerdem war ich immer noch nicht 100% zufrieden mit dieser Methode, denn jede Ausführung einer solchen Automatisierung hätte eine neue HTTP-Verbindung zum Miniserver aufgebaut. Das wäre zwar vermutlich auch für meinen Miniserver der ersten Generation überhaupt kein Problem gewesen, aber nun sollte es auch die „sauberste“ Lösung sein.

Option 3: Push aus Home Assistant via PyLoxone

Mein Home Assistant unterhält sowieso schon eine permanente Verbindung zum Miniserver über die PyLoxone Integration, und diese macht einen sehr responsiven Eindruck. Daher wollte ich möglichst diesen bestehenden Kanal verwenden um Änderungen an Zählerständen und Verdichterstatus an den Miniserver zu schicken. Und da diese drei Werte nicht die letzten bleiben sollten (Stichwort Wallbox), wollte ich möglichst nicht für jeden Wert eine eigene Regel definieren, in der dann die jeweilige Entität und der dazugehörige Miniserver-Eingang festgelegt sind, sondern möglichst eine Regel, die auf alle relevanten Zustände anspringt und sich den passenden Eingang selbst heraussucht.

Da PyLoxone auf der WebSockets API des Miniservers aufsetzt, werden außerdem statt der Namen die UUIDs der Eingänge benötigt, und ich wollte diese an einer Stelle dokumentiert haben. Diese UUID erhält man über die Strukturdatei http://miniserver/data/LoxApp3.json. Zum Setzen von Werten muss man dabei immer den Wert von uuidAction verwenden. Die Zuordnung erledige ich über „Manual Customization„:

homeassistant:
customize:
    sensor.luxtronik_280827_0374_dhw_energy_input:
     loxone_uuid: '1c53cc06-02b5-8047-ffff7f08837d3b2d'
    sensor.luxtronik_280827_0374_heat_energy_input:
     loxone_uuid: '1c53cc08-03af-a4fd-ffff7f08837d3b2d'
    binary_sensor.luxtronik_280827_0374_compressor:
     loxone_uuid: '1c55f4c8-0363-a4a0-ffff7f08837d3b2d'

Nun kann ich eine einzige Automatisierungsregel verwenden, die auf alle relevanten Entitäten lauscht2 und bei Änderungen den Wert über die bestehende Verbindung zum Miniserver an die passende UUID sendet:

trigger:
- platform: state
entity_id:
- binary_sensor.luxtronik_280827_0374_compressor
- sensor.luxtronik_280827_0374_dhw_energy_input
- sensor.luxtronik_280827_0374_heat_energy_input
from: null
to: null
condition: []
action:
- service: loxone.event_websocket_command
metadata: {}
data:
value: "{{trigger.to_state.state}}"
uuid: "{{trigger.to_state.attributes.loxone_uuid}}"
mode: queued
max: 10

Zusammenfassung

Nun werden also Zählerstände für den Energieverbrauch der Wärmepumpe automatisch an den Miniserver übertragen. Der Verdichterstatus liefert über den Statusbaustein einen Näherungswert für die aktuelle Leistungsaufnahme, die im Energieflussmonitor angezeigt wird.

Screenshot des Energieflussmonitors der Loxone-App. Außer den Knoten "Hausverbrauch", "PV", "Speicher" und "Netz" gibt es separate Knoten für "Wärmepumpe" und "Wallbox". Die Wärmepumpe zeigt aktuell einen (gerundeten) Energieverbrauch von 2 kW an.

Nach ersten Versuchen fiel mir auf, dass die Visualisierung des Zählers exakt jede zweite Stunde einen Verbrauch von 0 liefert. Ein schneller Check in Home Assistant zeigte, dass die Wärmepumpe tatsächlich die Zählerstände nur alle zwei Stunden aktualisiert ausgibt:

Zeitlicher Verlauf des Zählerstandes in Home Assistant. Man sieht eine Treppenfunktion mit unterschiedlich hohen Stufen. Der Zählerstand bleibt immer ein Vielfaches von 2 Stunden konstant, bevor er "springt".

Allerdings ist das maximale Raster für Zähler in Loxone 60 Minuten, so dass mindestens in jeder zweiten Stunde ein Nullverbrauch angezeigt wird:

Screenshot der relativen Zählerstände aus der Loxone-App. Säulendiagramm mit einer Säule pro Stunde des Tages für den Verbrauch in dieser Stunde. Zu den geraden Stunden sind keine Säulen vorhanden (Verbrauch = 0).

Ich habe sowohl einen Feature Request an Loxone für ein 120-Minuten-Intervall im Zählerbaustein als auch einen Feature Request an Novelan zur Ausgabe aktueller Zählerstände maximal alle 60 Minuten gestellt. Ich bin gespannt, ob eine der beiden Parteien sich regt. Der Loxone-Kundenservice hat jedenfalls sehr freundlich und schnell reagiert und als Übergangslösung das Einfügen künstlicher Zwischenwerte empfohlen.

Fußnoten

  1. Da die API-Dokumentation explizit den HTTP-Header erwähnte, habe ich nicht versucht, ob die in RFC 7650 erwähnten alternativen Methoden über Formular- oder URL-Parameter möglich gewesen wären. Sollte das jemand ausprobiert haben, bin ich über Feedback dankbar. ↩︎
  2. Die Entities sind hier noch als fixe Liste angeben. Eigentlich war mein Plan, das über eine passende Query dynamisch zu machen, so dass das Festlegen einer loxone_uuid ausreicht. Das hat aber mangels Erfahrung mit Home Assistant Templates und YAML noch nicht geklappt. Auch hier gerne Feedback geben. ↩︎

3 Kommentare zu „Energiemonitoring mit Loxone – Wärmepumpe

Hinterlasse einen Kommentar

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..