Zuletzt aktualisiert am 03.02.2025 von Torsten
In diesem Artikel möchten wir einen Weg beschreiben, der einen WEMOS D1 mini und einen Reed-Kontakt einsetzt. Der Reed-Kontakt registriert den Null-Durchlauf des Gaszählers mit eingebautem Magnet.
Die Idee: Wir flashen den WEMOS D1 mini mit Tasmota, nutzen die Pinouts des WEMOS, um den Reed-Kontakt an Ground und z.B. D7 anzuschließen. D7 ist als Zähler konfiguriert und jedes Mal, wenn der Reed-Kontakt schließt, wird in Tasmota ein interner Zähler hochgezählt. Diesen Wert übertragen wir per MQTT an ioBroker und berechnen den Zählerstand, jeder Durchlauf entspricht 0,01qm Gas.
Was benötigen wir:
- WEMOS D1 mini
- Reed-Kontakt
- Tasmotizer, um den D1 zu flashen
- 10k OHM Widerstand (siehe Beschreibung unten)
- Tasmota Firmware 12.02 (smart meter web display)
Schritt 1: WEMOS D1 mini mit Tasmota flashen
Der WEMOS D1 mini ist perfekt für Einsteiger, lässt er sich doch mit einem normalen Micro-USB-Kabel flashen. Umständliches Verkabeln mit den Pinouts ist hier nicht notwendig. Wir laden Tasmotizer herunter, starten das Programm und wählen bei Release „tasmota.bin“ aus. So stellen wir sicher, dass die Firmware mit dem letzten Release-Stand von Github auf dem WEMOS D1 mini geflasht wird.
Wir stecken den WEMOS D1 mini per USB an, wählen den USB-Port aus und starten den Flashvorgang, sollte dies nicht auf Anhieb funktionieren, einfach nochmals versuchen. Die Zeit zwischen dem Anstecken und dem Flashen darf nicht zu lange sein.
Ist Tasmota erfolgreich auf dem WEMOS D1 mini geflasht, können wir das Device neu starten. Der WEMOS D1 mini startet ein eigenes WLAN, mit dem wir uns im nächsten Schritt verbinden müssen, um die WLAN-Konfiguration unseres eigenen WLANs vornehmen zu können.
Das WLAN heißt üblicherweise „tasmota-######-####“ und lässt sich ohne Passworteingabe verbinden. Nach erfolgreicher Verbindung sollte sich unter Windows automatisch der Standardbrowser öffnen und die Tasmota-Startseite aufgerufen werden. Ist dies nicht der Fall, im Browser der eigenen Wahl die IP 192.168.4.1 aufrufen.
Tasmota zeigt die verfügbaren WLANs und wir wählen das korrekte WLAN aus, tragen das WLAN-Passwort ein und klicken auf „save“. Im Anschluss wird der WEMOS D1 mini neu gestartet und bei erfolgreichem Verbinden mit dem eigenen WLAN können wir Tasmota mit der zugewiesenen IP aufrufen (diese könnt ihr in der Router-Konfiguration einsehen).
Im nächsten Schritt konfigurieren wir Tasmota so, dass wir an einem der Pinouts den Reed-Kontakt installieren können und ein Schließen des Reed-Kontakts in Tasmota hochgezählt wird. Hierzu klicken wir auf Configuration > Configure Module. Wir wählen im Dropdown „Generic 0“ aus und setzen D7 GPIO13 auf Counter mit dem Index 1.
Wir klicken auf „Speichern“, Tasmota startet neu und folgende Startseite erwartet uns:
Verbinden wir nun D7 und GND mit einem Kabel bzw. nutzen den Reed-Kontakt und einen Magneten, sollte der Counter1 hochzählen. Wir merken schnell, dass zu viele Impulse gezählt werden. Abhilfe schafft hier die Definition eines timeouts zwischen zwei Triggern, die ein Hochzählen auslösen sollen, der Befehl in Tasmota heißt CounterDebounce und kann mit der Angabe von Millisekunden eingerichtet werden.
Wir setzen CounterDebounce auf 500 Millisekunden.
Jetzt sollte der Zähler mit jedem Schließen von D7 und GND korrekt hochzählen.
Immer wieder wir empfohlen, zusätzlich zur Verbindung des Reed-Kontakts mit D7 und GND noch einen Widerstand von D7 auf 3,3V zu legen. Die Theorie dahinter besagt, dass der Zustand des D7 (auf Spannung oder auf GND) sporadisch wechseln kann, weswegen man den Pinout mit Hilfe eines Widerstands auf Spannung, an den 3,3V-Pinout legt:
Wir können also nun den mit dem WEMOS D1 mini verbundenen Reed-Kontakt am Gaszähler installieren, hierfür entweder die Aussparung nutzen oder den Reed-Kontakt direkt über die letzte Zahl der Kommastellen auf das Display „kleben“.
Die wesentlichen Schritte haben wir bereits hinter uns, auf Basis des Reed-Kontakts zählt Tasmota die 0-Durchläufe des Zählers mit, ein Durch lauf entspricht bei drei Nachkommastellen genau 0,01 qm Gas. Wir müssen also im nächsten Schritt den Zählerstand ab Aktivierung unseres Reed-Kontakts mit Anzahl Counter * 0,01 addieren und erhalten den aktuellen Zählerstand.
Wir übertragen den aktuellen Zählerstand von Tasmota an ioBroker mit der eingebauten MQTT-Funktion von Tasmota. Hierzu benötigen wir zunächst einen installierten Sonoff-Adapter im ioBroker. Die Konfiguration ist trivial, wir müssen lediglich einen Nutzer und ein Passwort definieren (und uns den Port merken). Diese Daten geben wir im MQTT-Menü (Configuration > Configure MQTT) unseres WEMOS D1 mini ein:
Mit „save“ speichern und aktivieren wir die Konfiguration.
Fügen wir nun das Script ein. Dazu gehen wir auf Konsolen -> Skript konfigurieren
Wir setzen den Haken bei Skript aktivieren und geben den folgenden Code ein:
>D p:m1=0 p:g1=0 p:g2=0 p:month1=0 p:month2=0 p:month3=0 p:gesamt=0 p:c1=0 p:gastotal=0 s1=0 h1=0 hkw1=0 gkw1=0 gkw2=0 mkw1=0 mkw2=0 mkw3=0 mkwgs=0 skw1=0 hgp=0 g1gp=0 g2gp=0 m1gp=0 m2gp=0 m3gp=0 gsgp=0 hr=0 dy=0 zu=0.9575 br=11.519 gp=10.38 gasinit=5625.33 >B =>sensor53 l255 >S h1=s1-m1 hkw1=h1*br*zu hgp=(hkw1*gp)/100 gkw1=g1*br*zu gkw2=g2*br*zu mkw1=month1*br*zu mkw2=month2*br*zu mkw3=month3*br*zu mkwgs=gesamt*br*zu g1gp=(gkw1*gp)/100 g2gp=(gkw2*gp)/100 m1gp=(mkw1*gp)/100 m2gp=(mkw2*gp)/100 m3gp=(mkw3*gp)/100 gsgp=(mkwgs*gp)/100 skw1=s1*br*zu hr=hours dy=day if chg[hr]>0 and hr==0 then m1=s1 g2=g1 g1=h1 month1=month1+h1 gesamt=gesamt+h1 if chg[dy]<2 and dy==1 then month3=month2 month2=month1 month1=0 endif svars endif if upsecs%tper==0{ =>Publish tasmota/%topic%/main/td_m3 %2h1% =>Publish tele/%topic%/main/td_kwh %2hkw1% =>Publish tele/%topic%/main/yd_m3 %2g1% =>Publish tele/%topic%/main/yd_kwh %2gkw1% =>Publish tele/%topic%/main/dbyd_m3 %2g2% =>Publish tele/%topic%/main/dbyd_kwh %2gkw2% =>Publish tele/%topic%/main/value %2s1% =>Publish tele/%topic%/SENSOR {"VERBRAUCH":{"GasTotal":%2gastotal%}} =>Publish tele/%topic%/json {"gastotal": "%2gastotal%", "value": "%2s1%", "today_m3": "%2h1%", "today_kwh": "%2hkw1%", "yesterday_m3": "%2g1%", "yesterday_kwh": "%2gkw1%", "db_yesterday_m3": "%2g2%", "db_yesterday_kwh": "%2gkw2%"} } >T s1=Counter#C1/100 c1=Counter#C1 gastotal=(c1/100)+gasinit >W GAS gezählt: {m} %3s1% m³ Zählerstand: {m} %gastotal% m³ ============ Zustandszahl: {m} %zu% Brennwert: {m} %br% kWh/m³ Gaspreis: {m} %gp% Cent/kWh ============ Verbrauch: --------------------- Heute: {m} %2h1% m³ | %2hkw1% kWh Kosten: {m} %2hgp% € --------------------- Gestern: {m} %2g1% m³ | %2gkw1% kWh Kosten: {m} %2g1gp% € --------------------- Vorgestern: {m} %2g2% m³ | %2gkw2% kWh Kosten: {m} %2g2gp% € --------------------- Aktueller Monat: {m} %2month1% m³ | %2m1gp% € Letzter Monat: {m} %2month2% m³ | %2m2gp% € Vorletzter Monat: {m} %2month3% m³ | %2m3gp% € Gesamt: {m} %2gesamt% m³ | %2gsgp% € ;>M 1 ;+1,13,c,1,-25,GAS ;1,1-0:1.8.0*255(@100,gezählt,m³,Stand,3) #
Anschließend sollte es auf der Startseite in etwa so aussehen:
Konsolen Kommandos und Zählerstand Anpassung
Damit nicht zu viele Impulse gezählt werden schafft die Definition eines Timeouts Abhilfe. Mittels CounterDebounce 500 wird der Wert auf 500 Millisekunden gesetzt.
Timezone 99 Zeitzone Europa/Berlin.
TelePeriod 60 sogt dafür, dass nur einmal alle 60 Sekunden Werte an die Hausautomation gesendet werden.
Sensor53 c1 0 bedeutet, dass der Zähler auf NULL gesetzt wird. Diesen Wert könnte man auch dafür benutzen um den aktuellen Zählerstand abzubilden. Im Konsolen Script gibt es aber auch eine Variable namens gasinit um dies zu realisieren.
SaveData 60 bedeutet, dass die Werte alle 60 Sekunden gespeichert werden. Bei SaveData 0 würden die Einstellungen erst beim Neustart gespeichert werden.
Timezone 99 TelePeriod 60 CounterDebounce 500 Sensor53 c1 0 SaveData 60
Falls sich mit o.g. Debounce Einstellungen das Prellen (zuviel zählen) nicht verbessert, dann bitte folgende Einstellungen versuchen oder damit rumspielen, bis es besser wird.
Low/High sind lediglich Feinjustierungen. Diese kann man zunächst weglassen und sich dem Hauptwert erstmal annähern. Ggf. weiter erhöhen auf 2000, 2500, 3000, etc.
CounterDebounce 1000 CounterDebounceLow 500 CounterDebounceHigh 500
Konsolen Script
In folgendem Script (Werkzeuge/Konsolen > Script konfigurieren) sind zwei Variablen zu ersetzen. Zum Einen der Gaspreis und zum Anderen der aktuelle Zählerstand auf dem Gaszähler (falls Sensor53 c1 xxx nicht dazu verwendet wurde).
Anhand dessen werden die Kosten berechnet und der aktuelle Zählerstand angezeigt.
-
gp (Gaspreis in Cent)
-
gasinit (Zählerstand bei Montage)
Optional kann natürlich die Zustandszahl (zu) und der Brennwert (br) angepasst werden.
Diese Werte sind meist auf der Gasrechnung zu finden.
Möchte man mehr Werte als im Script vorgegeben an seine Hausautomation übermitteln, kann man die Zeilen beginnend mit ⇒Publish ergänzen.
z.B. würde ⇒Publish tele/%topic%/main/gasprice %3gp% den Gaspreis mit übermitteln.
Für json Abfragen, müsste auch die Zeile mit den geschweiften Klammern {} ergänzt werden.
Ab Tasmota 13.4.0.4 wird im Webinterface der Button „Werkzeuge“ anstelle von „Konsolen“ verwendet.
Werte einstellen/korrigieren
Will man die Werte in der Weboberfläche neu justieren, kann man in der Konsole folgende Kommandos dazu verwenden.
Dabei lautet die Syntax folgendermaßen:
script ><var>=<value>
Beispiel: Der Verbrauch von gestern soll auf 5.65 m³ korrigiert werden. Dafür wird die Variable g1 benötigt.
Somit wird in der Konsole folgendes Kommando verwendet:
script >g1=5.65
Variablen Übersicht:
g1 = Verbauch gestern in m³ g2 = Verbauch vorgestern in m³ month1 = Verbauch aktueller Monat in m³ month2 = Verbauch letzter Monat in m³ month3 = Verbauch vorletzter Monat in m³ gesamt = gesamter Verbrauch in m³
Der Verbrauch heute wird anhand der Zählungen berechnet und kann dementsprechend nicht korrigiert werden. Man muss also einen Tag warten und dann den Verbrauch für gestern korrigieren.
Gezählter Wert (Zähler1) auf 0 (Null) setzen
Um den bisher gezählten Wert zu resetten, also auf NULL zu setzen wird folgendes Kommando verwendet:
sensor53 c1 0
Damit Heute auch NULL gesetzt wird, muss m1 (Differenz-Zählungen) auch auf NULL gesetzt werden.
script >m1=0