Gaszähler in Home Assistant einbinden mit Xiaomi MiJia Türkontaktsensor
Nachdem wir vor kurzem ein Balkonkraftwerk installiert bekommen haben, habe ich nach Ewigkeiten mal wieder Home Assistant installiert und eingerichtet. Bei der letzten Installation habe ich gemerkt, dass ich mit vielen Daten dann am Ende doch nichts gemacht habe, deswegen wollte ich es diesmal nützlicher halten.
Diesmal soll es vor allem um eines gehen: Energieflüsse und Energiesparen. Home Assistant wurde bereits Mitte/Ende 2021 um die Möglichkeits des Energy Managements erweitert. Mit dem Balkonkraftwerk ist das Ganze dann besonders interessant geworden. Statt nur Verbräuche zu sehen, die ich übers Jahr hinweg ohnehin schon kenne, können wir jetzt optimieren. Da es beim Balkonkraftwerk keine Einspeisevergütung gibt, haben wir nämlich jede Menge Gründe, den Ertrag so vollständig wie möglich selbst zu nutzen.
Wenn Home Assistant das schon mal anbietet, möchte ich dann aber doch wieder so viel wie möglich einbinden. Wenigstens wenn es um das Energy Dashboard geht. Einen digitalen Stromzähler haben wir inzwischen (auch wenn ich an dessen Daten gerade noch nicht rankomme, aber das ist womöglich ein Thema für die Zukunft), der Gaszähler ist jedoch ein Analoger.
Kontext
Ich verwende Home Assistant 2023.5.4 und ZigBee2MQTT 1.30.4-1. Alles Folgende bezieht sich also auf den aktuellen Stand. Es ist gut möglich, dass sich in neueren Versionen etwas ändert.
Xiaomi Tür- und Fensterkontaktsensor zum Gasverbrauch messen
Aus der alten Installation hatte ich ohnehin noch jede Menge Xiaomi MiJia Sensoren vom Typ MCCGQ01LM herumfliegen, die ich nach dem Umzug dann aber nicht angebracht habe. Als ich danach gesucht habe, wie ich Strom- und Gaszähler einbinden kann, bin ich dann auf mehrere Blog- und Redditposts gestoßen, zuletzt aber auf diesem von Michael zur Einbindung eines „Schlumberger G4 RF1“ hängen geblieben. Der Beitrag hat mir an vielen Stellen geholfen, ich habe den Aufbau aber etwas „modernisiert“ und vereinfach. Denn vieles geht inzwischen über das Home Assistant User Interface und muss nicht mehr über die Konfigurationsdatei hinzugefügt werden.
Michaels Gaszähler ist zwar nicht unser Modell – denn wir haben einen Pipersberg BK-G4T „Balgengaszähler mit multifunktionalem Zählwerk“ –, aber das Funktionsprinzip ist hierfür dasselbe: Auf einer der Nachkommastellen im Zählwerk ist ein Magnet eingebracht.
Der Kontaktsensor macht nichts anderes als zu messen, ob der Magnet, der üblicherweise an Tür oder Fenster befestigt wird, in der Nähe des Sensors ist. Ist er das, wird die Tür als geschlossen gewertet. Ist er’s nicht, ist sie offen.
Dieses Prinzip wird hier genutzt: Da bei jeder Umdrehung der letzten Nachkommastelle der Magnet einmal an der Messseite vorbeikommt, wird hier der Kontakt geschlossen und wir können einen Zählerstand hochzählen. Eine Umdrehung entspricht beim Pipersberg BK-G4T 0,010 Kubikmeter, denn der Magnet sitzt auf der dritten Nachkommastelle, womit eine komplette Umdrehung entsprechend die zweite Nachkommastelle um eins erhöht.
Damit der Sensor den Magnet erkennt, musste ich die Platine mit Sensor aus dem Gehäuse rausnehmen. Wie Michael schon schreibt ist das kein großer Akt: Einfach die zwei Gehäusehälften auseinander ziehen, als würde die Batterie getauscht werden, und dann mit einem Schraubendreher vorsichtig die Platine raushebeln. Sie liegt mit zwei Nasen eingerastet in der unteren Hälfte des Gehäuses.
Einbindung in Home Assistant
Ich habe den Sensor einem bestehenden ZigBee-Mesh über ZigBee2MQTT hinzugefügt. Die Hinweise aus der ZigBee2MQTT-Dokumentation kann ich bestätigen: Der Sensor möchte sich nicht so recht ins Mesh einbinden, sondern ausschließlich zum Coordinator verbunden bleiben. Mehrere vorhandene TuYa-Geräte, die teils auch näher dran wären, werden nicht fürs Mesh genutzt.
Das ist beim Aufbau hier zum Glück kein Problem, da der Coordinator recht zentral sitzt, ist aber dennoch schade.
Zählerstand
Da der Sensor keinen Zählerstand kennt, sondern nur (über Bande) zählen kann, wie oft der Kontakt geschlossen war, muss anfänglich der aktuelle Zählerstand festgelegt werden.
Das geht am einfachsten über das User Interface. Einfach die Konfiguration zu den Helfern innerhalb der Geräte und Integrationen aufrufen > Helfer erstellen Knopf drücken > Nummer auswählen und die Eingaben entsprechend eurer Gegebenheiten tätigen.
Gasbrennwert
Den Gasbrennwert benötigst du, um zu berechnen, wie viel Energie in kWh ein Kubikmeter Gas entsprechen. Denn was du am Ende bezahlst sind bezogene kWh, nicht m³
. Im Energy Dashboard wollte ich auch den Preis sehen und dafür muss ich von Kubikmeter zu Kilowattstunden umrechnen. Wenn dir der Preis egal ist, kannst du auch den Kubikmeterzählerstand nutzen und komplett auf den Gasbrennwert – und später den Gaspreis – verzichten.
Auch hierfür habe ich mir erstmal eine Input Number festgelegt, da sich der Gasbrennwert für jeden Monat unterscheidet. Wie der Wert des Vormonats ist, kannst du auf der Webseite deines Gasnetzbetreibers (nicht zwingend dein Gasanbieter!) erfahren. Der Wert ist auch auf der Jahresrechnung ausgewiesen.
Ich habe den Gasbrennwert erstmal händisch angegeben und schaue die nächsten Monate mal, ob ich Monat für Monat händisch den Wert ändre oder ob ich mir noch einen Scraper für die Webseite des Gasnetzbetreibers baue, um den Wert automatisch zu erhöhen …
Gaspreis
Falls du im Energy Dashboard später auch den Preis anzeigen lassen möchtest, erstell noch eine weitere Nummer für den Gaspreis in EUR/kWh. Falls nicht, überspring den Schritt hier einfach.
Template Sensor: Gaszählerstand
Leider funktioniert eine Input Number zum aktuellen Zeitpunkt nicht als Basis fürs Energy Dashboard. Daher muss hier noch ein Template Sensor hinzugefügt werden, der aber letztlich auch einfach nur den aktuellen Wert der zuvor angelegten Input Number verwertet.
Füge folgenden Code in deine configuration.yaml
von Home Assistant ein:
template:
- sensor:
- name: "Gaszählerstand Kubikmeter"
unique_id: "gaszaehlerstand_kubikmeter"
unit_of_measurement: "m³"
device_class: gas
state_class: total_increasing
state: '{{ states("input_number.gaszahlerstand") | round(2, "floor") }}'
- sensor:
- name: "Gaszählerstand kWh"
unique_id: "gaszahlerstand_kilowattstunden"
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
state: >
{% set brennwert = states('input_number.gasbrennwert') | float %}
{% set gasKubikmeter = states('sensor.gaszahlerstand_kubikmeter') | float %}
{{ ((gasKubikmeter) * (brennwert) * 0.9595) | round(3, 'ceil') }}
Hiermit werden zwei Templatesensoren festgelegt:
- Gaszählerstand in Kubikmeter
- Gaszählerstand in Kilowattstunden
Wie weiter oben erwähnt: Wenn dir die Gaspreisaufschlüsslung im Dashboard egal ist, kannst du den zweiten Sensor auslassen.
Beiden Sensoren habe ich die Maßeinheit und Device Class mitgegeben. Beide Sensoren sind total_increasing
, also Gesamtzählerstände, die nur ansteigen können. Bei Ausfällen des Sensoraufbaus erwarte ich höchstens ein Nachjustieren nach oben, aber nie nach unten. Mal gucken, ob sich das bewahrheiten wird.
Als State wird dann beim ersten Sensor einfach nur die Input Number verwendet und auf zwei Nachkommastellen gerundet, wobei ich immer nach unten runden möchte, da ansonsten der Zählerstand im Dashboard (minimal) höher sein kann als der auf dem tatsächlichen Zähler. Die dritte Nachkommastelle kann ich ohnehin nicht auswerten, also kommt das hier einem Abschneiden der dritten Stelle gleich.
Für den Kilowattstundensensor hole ich mir dann erst den zuvor angelegten Gasbrennwert und schreibe ihn in eine Variable. Dasselbe dann noch für den Kubikmetersensor, der wenige Zeilen darüber angelegt wird. Bei beiden gehe ich mit float
noch mal sicher, dass sie auch definitiv mit Nachkommastellen verfügbar sind.
Zu guter letzt rechne ich dann die Kilowattstunden so aus wie es auf der Rechnung auch passiert: Kubikmeter multipliziert mit Brennwert multipliziert mit der „Z-Zahl“, die auf den bisherigen Rechnungen immer gleich war, weswegen ich sie hier fest als 0.9595 festgelegt habe.
Das alles runde ich dann auf drei Nachkommastellen (die Genauigkeit, die ich gern hätte) und immer nach oben, da die kWh-Berechnung ohnehin sehr abweichend sein wird, also ist der Rundungsfehler auch egal.
Danach die Datei speichern, in den Developer Tools sichergehen dass das YAML valide ist und dann die Template-Entitäten neu laden. Ein kompletter Neustart ist nicht notwendig!
Noch während ich das hier tippe fällt mir auf, dass der variable Brennwert ja für komplett unterschiedliche Ergebnisse sorgen wird. Denn auf der Rechnung wird der nur für die Verrechnung des Unterschieds zum Vormonat verwendet, nicht für den Gesamtzählerstand. Aber egal. Ich lasse das jetzt erstmal so.
Zur eigentlichen Magie: Die Automatisierung
Kommen wir nun zum eigentlichen spannenden Teil: Der Automatisierung, die aus einem „geschlossen“ überhaupt eine Erhöhung des Zählerstands macht.
Das Ganze ist denkbar einfach:
Pass entsprechend die Geräte/Entitäten nach deiner Benennung an, aber das war’s auch schon.
Update: In einer ersten Version hatte ich beim Auslöser noch Gerät statt Zustand ausgewählt. Dadurch wurde jedes Mal wenn der Sensor (neu) als „geschlossen“ erkannt wurde, der Zählerstand erhöht. Bei einem Neustart von Home Assistant ist mir dann aber der Fehler bei dem Ansatz aufgefallen: Dabei wechselte der Zustand nämlich von unknown direkt zu off, sobald ZigBee2MQTT den Zustand wieder bereitgestellt hatte. Und damit wurde dann auch der Zählerstand erhöht. Deshalb habe ich in einer neueren Version eingestellt, dass die Automatisierung nur dann ausgelöst wird, wenn der Zustand von geöffnet (on) zu geschlossen (off) wechselt.
Energy Dashboard
Zu guter letzt kannst du nun noch den Gaszählerstand im Energy Dashboard hinzufügen. Wenn du zuvor nur den Zählerstand in Kubikmeter als Templatesensor hinzugefügt hast, wählst du entsprechend den für den Gasverbrauch aus. Hast du einen für Kilowattstunden erstellt, ist es der. In dem Fall kannst du dann darunter auch noch Verwende einen statischen Preis oder, falls zuvor erstellt, Verwende eine Entität mit dem aktuellen Preis angeben. Speichern, bummzackreturn und schon ist das Dashboard um den Gaszählerstand reicher. Jedenfalls nach spätestens wenigen Stunden und wenn es eine Zählerstanderhöhung gab.
Hat’s funktioniert?
Ob es funktioniert hat, kannst du durch Verbrauchen von Gas herausfinden. In unserem Fall ist das recht einfach: Einmal heiß duschen oder etwas warmes Wasser einlassen und schon dreht sich der Zähler. Falls deine Therme nur für die Heizung genutzt wird, wird es hier außerhalb der Heizperiode natürlich etwas schwieriger.
Schau nach dem Einrichten einfach mal ins Logbuch und wenn alles funktioniert hat (und du die Logs nicht enorm filterst), sollte es ungefähr solche Einträge geben:
Genauigkeit
Wie genau das ganze sein wird, muss ich nun mal über die nächsten Monate verfolgen. Ich werde den Beitrag hier mit errechnetem und tatsächlichem Wert erhöhen.