Gaszähler mit WEMOS D1 Mini und reed Kontakt

0
35

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:

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

 

Vorheriger ArtikelLogikbaustein Senec v3 verfügbar

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein