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:

Copy to Clipboard

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