Gas- und Wasserzähler mit Tasmota digitalisieren
Die Digitalisierung von Gas- und Wasserzählern in einer SmartHome Lösung führt zu einer höheren Transparenz der Verbrauchskosten, wenn man mit Gas heizt und Warmwasser erzeugt. Bei den bestehenden Gaszählern in Privathaushalten handelt es sich fast immer um Balgengaszähler, die die verbrauchten Kubikmeter an Gas zählen.
Aufgabenstellung
Für mich stellte sich die Frage, wie man einen Gaszähler und einen Wasserzähler digital auslesen und die Ergebnisse auch an eine Homematic CCU oder andere Smarthome Lösungen wie z.B. Openhab oder IOBroker übertragen kann.
Ich nutze bereits Tasmota auf anderen D1 Mini's. Für Tasmota habe ich auch die Scripting Funktionaliät aktiviert (siehe auch meinen Beitrag Tasmota Scripting aktivieren, wie man sich eine eigene Tasmota Version kompiliert).
Ich besitze einen Balgengaszähler vom Typ BK-G4. In diesem befindet sich unter der Zähleranzeige eine kleine Öffnung. Die Zähler sind mit einem rotierenden Magneten ausgestatt (i.d.R. an der Ziffer 6 als sichtbarer silberner Belag, der beim Rotieren von außen gemessen werden kann). Die kleinste messbare Einheit ist vorne auf dem Zähler angegeben z.B. in der Form 1imp 0,01m³.
Der Wasserzähler ist ein Aquadis+ P50 von Itron. Dieser besitzt eine kleine Drehscheibe auf der sich ein kleines silbernes magnetisches Dreieck befindet.
Sensor installieren
Um den kleinen Magneten auf der Zählscheibe des Gaszählers messen zu können, ist ein einfacher Reedkontakt erforderlich (wie z.B. bei Fensterkontakten). Ich habe mir dazu bei Conrad den Sensor MK04 bestellt. Dieser besitzt zwei Leitungen. Die eine wird auf dem Pin GND und die andere auf einem beliebigen anderen PIN angeschlossen. Dieser PIN wird dann als SWITCH konfiguriert (siehe nächstee Kapitel).
Das Prinzip eines Reedkontaktes ist recht einfach. Durch einen Magneten wird ein Schalter bewegt, der eine Verbindung zwischen zwei Kabeln herstellt, so dass dort ein Strom fließen kann. Verschwindet der Magnet, so wird der Schalter wieder geöffnet, die Verbindung ist damit getrennt. Jedes Schalterschließen entspricht dabei einem Wert von 0,001 m³.
Den Sensor befestigt man mit Klebeband oder mit einem gedruckten Gehäuse von unten in der Vertiefung unter dem Zähler. Ich habe den Sensor mittig unter der letzten Zählerscheibe angebracht, das muss man aber ausprobieren.
Für den Wasserzähler mache ich es mir einfach. Hierfür gibt es bereits einen fertigen Sensor, den man einfach nur auf den Wasserzähler aufstecken muss. Ein Reedkontakt wie für den Gaszähler würde aber auch funktionieren. Ich verwende von Itron das Modell "Cyble-Sensor V2 KLF 1“ (K-Faktor=1, LF-Signal)" mit 2 Adern. Dieser liefert mir pro Liter Verbrauch ein Signal.
Es empfiehlt sich, vor der Installation der Sensoren Tasmote (wie in den nächsten Kapiteln beschrieben) auf dem D1 Mini zu konfigurieren und mit diesem direkt zu prüfen, ob ein Signal in Tasmota ankommt. Dies sieht man immer dann, wenn in der Console eine MQTT Nachricht abgesetzt wird.
Auf einer Vielzahl von Webseiten ist die Installation eines Reedkontakts am Gas- und Wasserzähler bereits dargestellt, z.B. unter
http://monitor4home.com/beispiele/gaszahler-mit-reedkontakt-ausstatten
http://blog.bubux.de/gaszaehler-auslesen/
https://smart-wohnen.org/homematic-wasserzaehler-auswerten/
Sensorwerte an MQTT Broker übertragen
Für eine Nutzung von Gas- und Wasserzählerwerten reicht die Digitalisierung des Impulses und die Übertragung an ein weiteres System, was aus diesen Impulsen Werte berechnet. Am einfachsten ist die Verwendung des MQTT Protokolls, da dies fast alle zentral verarbeitenden Smarthome Systeme verstehen.
Die Telemetry Period lasse ich übrigens auf 300 stehen, da TASMOTA automatisch einen geänderten Sensorwert per MQTT übermittelt. Die Telemetry Period gibt nur an, wann spätestens ein Status per MQTT übermittelt wird.
Schritt 1
Um den Reedkontakt in Tasmota zu konfigurieren verwende ich einen Switch, der auf PIN D1 liegen soll. Der Switch toggled zwischen ON und OFF hin und her, je nachdem, ob der Schaltkreis offen oder geschlossen ist. Ein Switch wird nach der Einrichtung als Button mit der Bezeichnung "SWITCH 1" dargestellt, den man wie einen Button auch manuell betätigen kann. Der Toggle Mode des Switches ist per Default eingestellt, diesen kann man aber über die Console auch mit dem Befehl "SwitchMode" umstellen. Die Modes sind auf dieser Tasmota Seite erläutert.
In der Console sollte man nun sehen, welche Werte per MQTT über den Switch gesendet werden (ich habe hier noch einen Switch mehr verwendet verwendet):
15:07:57.409 MQT: tele/AZD-TEST/SENSOR = {"Time":"2021-01-22T15:07:57","Switch1":"ON","Switch2":"ON"}
und
15:07:58.310 MQT: stat/AZD-TEST/RESULT= {"SWITCH":"OFF"}
Hier kann man nun auch kontrollieren, ob der Switch bei geschlossener Verbindung "ON" oder bei geöffneter Verbindung "OFF" anzeigt (hängt vom Kabelanschluss ab). In meinem Test hatte der offene Zustan den Wert 1 (ON, der geschlossene Zustand der Wert 0 (OFF).
Schritt 2
Zwar funktionieren die Switche, aber es gibt zwei große Nachteile:
- Der Status der Switche wird nicht auf der Tasmota Console angezeigt
- Per MQTT wird bei mehr als einem Switch immer nur ein Switch STATUS geschickt, wenn sich dieser ändert. D.h. mit der RESULT Message (siehe oben) ist nicht identifizierbar, welcher Switch geschaltet wurde. Erst wenn die Telemetry Message erstellt wird (siehe oben) werden die Werte der beiden Switche per MQTT übertragen.
Dieses Verhalten ist mit dem Typ eines Switches zu erklären, für den es eigentlich gar keinen messbaren Status gibt. Stattdessen muss man gleichzeitig jedem Switch ein korrespondierendes Relay zuordnen, denn ein Switch schaltet per Default immer einen messbaren Power-Wert von ON auf OFF oder umgekehrt.
Switch und Relais werden durch die Nummernzuordnung einfach intern verbunden (Relais 1 und Switch 1).
In diesem Beispiel habe ich auch den PIN 3 für Switch 2 und PIN D4 für Relay 2 verwendet. Dieser steuert gleichzeitig auch die Mini-LED auf dem Board, so dass diese anfängt zu leuchten, wenn der Kontakt geschlossen wird.
Wenn man jetzt PIN D1 mit PIN GND verbindet, wird in Tasmota die Anzeige auf "ON" springen, wenn man die Verbindung auflöst wieder auf "OFF". Für einen zweiten Switch verfährt man genauso, wobei jetzt Schalter und Relay die Nummer 2 erhalten. Ebenso werden jetzt für jeden Switch bei einer Änderung die jeweiligen POWER-Werte sofort korrekt übertragen:
18:23:08.941 MQT: stat/AZD-TEST/RESULT = {"POWER1":"ON"}
18:23:11.832 MQT: stat/AZD-TEST/RESULT = {"POWER2":"OFF"}
Welche Werte MQTT sendet kan man nun auch auf der Console betrachten. Sollte beim Schließen des Kontaktes "OFF" anstelle "ON angezeigt werden, dann invertiert man das Relay indem man den Typ Relay_i wählt.
Auf der Console sieht das Ganze dann so aus (mittels des Befehls "WebButton" , kann man die Beschriftung der Button ändern)
Sensorwerte an eine Homematic CCU übertragen
Neben der automatischen Versendung der MQTT Nachrichten möchte ich noch den Status des Reedkontaktes an eine CCU schicken und zwar nur dann, wenn sich der Wert tatsächlich geändert hat. Die weitere Verarbeitung der Sensorwerte kann ich dann in der CCU vornehmen, so dass ich nur einen Wert übertrage, wenn sich der Reedkontakt verändert hat.
Hier ist jetzt noch folgendes zu berücksichtigen. Während MQTT Messages automatisch bei einem geänderten Sensorwert übertragen werden, muss ich bei der manuellen Übertragung berücksichtigen, wie häufig das Programm ausgeführt werden soll, um den Sensorwert "erwischen" zu können. Der Reedkontakt bei einem Wasser- oder Gaszähler ist höchstens eine Sekunde geschlossen, so dass ich einen Check sekündlich machen muss. Dies erreiche ich durch die Definition einer Sektion mit ">S", in der der Code steht, der sekündlich ausgeführt wird.
Das entsprechende kleine Programm für den Script Editor sieht nun wie folgt aus:
Das Script ist recht einfach.
In der ">D" Sektion wird die Variable definiert, die ich benötige um zu checken, ob sich ein Wert geändert hat. Je nachdem, ob der geöffnete Wert des Schalter ON oder OFF ist muss hier die Variable mit 1 oder 0 vorbelegt. Damit wird sichergestellt, dass bei einem Reset des D1 Mini der tatsächliche Zustand zu einem Zählen führt oder nicht.
In der ">B" Sektion weise ich der Hilfsvariablen direkt den Sensorwert zu. Damit verhindere ich, dass bei einem Reboot sofort der Zähler erhöht wird, wenn der Sensor auf "AN" steht. Denn ich möchte nur die vollständigen Zählimpulse erwischen.
In der ">S" Sektion trage ich nun das kleine Programm ein. Nun wird mittels sw[0] der erste (!) Switch ausgelesen. Der Rest erklärt sich von selber, eine Websend Message wird nur dann ausgelöst , wenn sich der Wert des Switches von 0 auf 1 ändert. Wichtig ist, dass die zweite Bedinung, die mit "and" beginnt in einer neuen Zeile steht. Hier ist Tasmota Interpreter sehr empfindlich.
Nun wird in der CCU immer ein Wert aktualisiert, wenn der Schalter geschlossen ist. Diese Variable kann man nun dort weiterverarbeiten, indem man beispielsweise bei jeder Änder der Systemvariable ein Programm ausführt um z.B. einen Zähler zu addieren.
Um aus den den Kubikmetern die kWh auszurechnen ist ein Blick auf eigene Gasrechnung notwendig. Hier stehen die Faktoren die erforderlich sind, um eine Umrechnung vorzunehmen
Danke sehr für den tollen Artikel. Hat mir sehr bei der Einrichtung geholfen 🙂
Hallo Dieter,
vielen Dank für die Anleitung. Ich habe jedoch ein Problem, bei dem du mir vielleicht helfen kannst.
Wenn ich D1 und GND verbinde kommt bei mir folgende Nachricht über die Console:
09:05:22.899 MQT: stat/Gaszaehler/RESULT = {„POWER1″:“OFF“}
09:05:22.902 MQT: stat/Gaszaehler/POWER1 = OFF
Wenn ich den D1 neustarte kommt folgendes über die Console, auch wenn der Status manuell auf „OFF“ gesetzt wurde:
09:06:29.577 MQT: stat/Gaszaehler/STATUS8 = {„StatusSNS“:{„Time“:“2022-09-18T09:06:29″,“Switch1″:“ON“,“Switch2″:“ON“}}
Was mache ich falsch?
Vielen Dank im Voraus für deine Hilfe
Grüße,
Thomas
Hat sich erledigt.
Ich halte die Variante mit einem „Switch“ für nicht so günstig.
Ich habe das ganze bei mir als „Counter“ (nicht Counter_n, da würde der interne Pull-Up-Widerstand nicht zugeschaltet!) definiert. Ich habe bei mir also den Reed-Kontakt ganz simpel nur zwischen D5 (als Daten-Pin kann man natürlich auch einen anderen wählen) und Gnd gehängt. In den Geräteeinstellungen ist lediglich D5 als „Counter 1“ definiert. Irgendwelche Pseudo-Verbindungen wie bei der „Switch“-Variante sind da gar nicht notwendig.
Da ich kein Scripting bei mir beim Bauen der tasmota.bin aktiviert hatte, habe ich die Zählerstand-Berechnung über simple Rules gelöst. Man kann mit einem Event einen aktuellen Zählerstand in einer Mem-Variable (z.B. Mem1) setzen und dabei eine Hilfs-Counter-Variable (z.B. Var1) auf 0. Ein Event feuert, wenn der Counter1 > Var1, da wird dann Var1 auf den Counter1-Wert gesetzt. Dann wird die Zählerstand-Variable Var2=Mem1+Var1/100 gesetzt. Die enthält also nun den korrekten Zählerwert. Und den übertrage ich dann per MQTT an den iobroker auf dem Pi. Das ganze ist mit einer Rule gelöst:
rule1 on event#init do backlog mem1=%value%; counter1 0; var2=0; var1=0 endon
on counter#c1>%var1% do backlog var1=%value%; var2=%mem1%+0.01*%value%; event pub endon
on event#pub do publish tele/%topic%/SENSOR {\“Time\“:\“%timestamp%\“,\“Zaehlerstand\“:\“%var2%\“} endon
Mit dem ersten Event kann man in der Konsole mit dem Kommando „event init=12345.67“ den aktuellen Zählerstand setzen. Das Counter-Event berechnet den veränderten Zählerwert nach Reedkontakt-Schaltung und das dritte event (pub) publiziert dann den Zählerwert über mqtt.
Da ich allerdings den tatsächlichen Zählerstand auch gern in der WebGUI von Tasmota sehen würde, werde ich das ganze wohl auch mal auf Script umstellen. Allerdings natürlich unter Beibehaltung des Counter. Wie gesagt, das mit dem Switch halte ich für unnötig kompliziert.