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.
Update 09/2023 Gegen eine Spende können wir anbieten, eine für Elster-Gaszähler vorgesehene 3D-Druck-Halterung (siehe https://www.thingiverse.com/thing:5175961) für den Reed-Kontakt und Wemos zu drucken.
Bei Interesse gerne an 3d@smarthomejetzt.de schreiben.
Was benötigen wir dafür:
- WEMOS D1 mini
- Reed-Kontakt
- Tasmotizer, um den D1 zu flashen
- 10k OHM Widerstand (siehe Beschreibung unten)
Unsere Empfehlungen
Fangen wir an, 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 „save“, 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. Wir wechseln in die Protokoll-Ansicht in ioBroker und können die Registrierung des WEMOS in ioBroker beobachten:
Der Sonoff-Adapter speichert alle empfangenen Werte in den Objekten unter dem Sonoff-Adapter-Knoten:
Wer die Werte aufmerksam beobachtet wird feststellen, dass nur alle 5 Minuten die Werte per MQTT von Tasmota an ioBroker übertragen werden. Dies ist die Standard-Einstellung von Tasmota, bei Bedarf kann das MQTT-Übertragungsintervall mit dem Befehl TelePeriod in Sekunden definiert werden:
Mit TelePeriod sendet der WEMOS D1 mini alle 60 Sekunden den Zählerstand an ioBroker.
Müssen wir im letzten Schritt „nur“ noch die Berechnung auf Basis der gezählten Impulse in ioBroker umsetzen. Hierzu legen wir ein neues Blockly-Script an. Wir erzeugen einen neuen Datenpunkt für den Zählerstand und mit jedem Update des Tasmota-Counters, multiplizieren wir diesen mit 0,01 und addieren den Zählerstand bei Aktivierung des Scripts:
Nach Aktivierung des Scripts wird der aktuelle Zählerstand im angelegten Objekt gespeichert:
Auf Basis des stetig aktualisierten Zählerstands lässt sich mit unserem Script oder dem Sourceanalytix-Adapter der Gasverbrauch aufzeichnen und auswerten.
Hi Florian,
ich habe den WemosD1 mini genauso aufgebaut wie du ihn hier vorgestellt hast. An den Gaszähler befestigt und es Get super. Allerdings kann ich dein Blockly nicht nachbauen, weil ich die Befehle „setze“ und Datenpunkt erzeugen nicht in der Blockly Liste auswählen kann.
Wäre rs möglich, das du mir das Blockly als Text zusenden kannst, damit ich es importieren kann?
vg G. Helling
Die beiden Bausteine gibt es unter „System“.
Hallo, vielen Dank für den – auch für Anfänger – gut verständlichen Beitrag zu einem sehr aktuellen Thema. Ich habe es so nachgebaut wie beschrieben, allerdings scheint der Kontakt nicht zuverlässig zu zählen. Es kommt vor, dass einige Impulse -trotz Counter Debounce- doppelt gezählt werden. Habe auch mal einen höheren Wert ausprobiert. Habt ihr eine Idee, woran das liegen kann?
Vielen Dank für eure Unterstützung!
Versuch es mal damit. Bei mir war es die Lösung des Problems.
CounterDebounce 1000
CounterDebounceLow 500
CounterDebounceHigh 500
Danke für die tolle Anleitung.
Ich habe es mit einem Reed von Meder nachgebaut. Provisorisch mit Tesa Posterstrip befestigt. Aktuell zählt der Counter bei jeder Umdrehung 2 Werte hoch. Scheinbar immer beim Wechsel von 9 auf 0 und von 0 auf 1.
Eine Umdrehung benötigt 105 Sekunden. Ich werde das mal über einen längeren Zeitraum beobachten und hoffe, das bei schnellerem Durchlauf auch immer +2 gezählt werden.
Vermutlich prellt der Kontakt. Durchsuche das Netz nach Kontakt „entprellen“.
Hallo,
muss der Widerstand zwingend 10k sein ?
Denn einen 10k hab ich nicht im Bestand….
Florian
Muss hier zwingend ein 10K Widerstand verbaut werden ?
Ein Kondensator (100nF) parallel zum Reddkontakt könnte bei Prellproblemen ggf. auch helfen. Ganz richtig wäre noch ein Wiederstand von max 1kOhm in riehe zum Reedkontakt.
Servus zusammen, ich habe das alles jetzt mal nachgebaut. Allerdings habe ich das Problem, dass der Wert am Zähler höher ist als das was ich auslese. Wenn man davor steht und live anschaut wird der Counter sauber hochgezählt. Habe immer so drei vier Umdrehungen beobachtet. Irgendwann über den Tag entstehen dann ziemlich heftige Abweichungen. Hatte das schon mal jemand?
Muss man den Zählerstand 3 stellen nach dem Komma eingeben oder 2 stellig ? Hab das Script 1zu1 übernommen aber iwie will es nicht. Datenpunkt ist vorhanden aber immer bei 0.
Könnte mir mal jemand hier sein Script als Quellcode für C&P zur Verfügung stellen ?
Wäre super .
Danke
Hi, habe auch das Problem das mehr gezählt wird als wirklich an Umrundungen passiert. Ich vermute es ensteht durch das „stehenbliben“ des Magneten am Kontakt. Beim nächsten „loslaufen“ zählt er dann nochmal einen Zähler hoch, also doppelt für den Kontakt.
Das Ganze ist mit debounce nicht zu regeln, da das pausieren des Gasbezugs ja viel länger als eine Umdrehung ist.
Hat da schon jemand eine Lösung gefunden?
Danke
Hi, habe auch das Problem das mehr gezählt wird als wirklich an Umrundungen passiert. Ich vermute es ensteht durch das „stehenbliben“ des Magneten am Kontakt. Beim nächsten „loslaufen“ zählt er dann nochmal einen Zähler hoch, also doppelt für den Kontakt.
Das Ganze ist mit debounce nicht zu regeln, da das pausieren des Gasbezugs ja viel länger als eine Umdrehung ist.
Hat da schon jemand eine Lösung gefunden?
Danke
Danke für die Anregungen hier. Ich habe es etwas anders umgesetzt (Tasmota als Switch konfiguriert mit SwitchMode 13 und die ONs aus MQTT in Home Assistant abgegriffen) aber der Beitrag hat mich auf die richtige Fährte gebracht.
Das verlinkte Gehäuse passt ja nicht richtig zu den hier vorgeschlagenen Komponenten (D1 mini und Reedsensoren von Amazon), daher habe ich mal was ähnliches aber passendes gebastelt:
https://www.thingiverse.com/thing:6343580
VG, Frank
Florians Nachfrage ist zwar schon etwas her, aber nein, es muss nicht zwingend genau ein 10K. Ein 22k oder dergleichen geht auch oder 4K7 oder was auch immer, für die Funktion ist der Wert fast egal (warum fast steht weiter unten). Eigentlich sollte der gar nicht nötig sein, da der ESP8266 intern schon einen solchen (sogenannten Pullup-) Widerstand verbaut hat und auch wenn ich wenig konkrete Erfahrung mit ESPs habe funktionieren die Dinger bei Microcontrollern auch üblicherweise recht zuverlässig. Selbst wenn es eine geringe Fehlerquote geben sollte, sollten die Messungen auch dann ziemlich brauchbar sein, wenn du den Widerstand ganz weglässt.
Das einzige was du nicht machen solltest ist, den Widerstand zu klein zu wählen. Je nachdem wie gut der Reedsensor anspricht, ist die „Schaltzeit“ schon mal bei 3-4Sekunden und wenn der Zähler über den Sensor stehen bleibt auch schon mal so lange wie es eben dauert. In dieser Zeit fließt dann Strom über den Widerstand und parallel auch über den eingebauten Pullup. Wenn du da z.B. 56R verbaust sind das nach I = U/R dann knapp 60mA oder 0,2W die für genau nix verbraten werden (plus Verluste auf dem Spannungsregler, wenn der das überhaupt schafft).
Bevor du dich in Unkosten stürzt sollte also alles zwischen 1K und 100K den Job erledigen.
VG, Frank
Danke für die tolle Anleitung!
Den Wemos habe ich zum laufen bekommen und die Montage am Gaszähler werde ich auch noch schaffen.
Ich habe aber keinen ioBroker (nur HomeBridge, aber das wird sich vielleicht ändern).
Ich würde gerne auf der Startseite von Tasmota den aktuellen Zählerstand haben (so wie bei Hichis Stromzähler), gerne auch ohne Komma…
Dazu muss ja nur der Wert des Counter auf ungefähr den Zählerstand des Gaszählers gebracht werden… nur wie?
Sorry für meine Dummheit, aber ich bin neu bei Tasmota…
Liebe Grüße
Andreas
PS: Ich habe es gefunden… um den Wert des Zählers zu ändern reicht ein
counter1 4711
gefolgt von RETURN in der Console einzugeben
Ich möchte mich hier mal ganz herzlich für diese tolle Lösung bedanken.
Das Ganze habe ich gern mit den zusätzlichen Empfehlungen von Frank nachgebaut und in HA integriert.
Ich habe meiner Ausführung noch einen DHT-22 hinzugefügt, so habe ich gleich Temperatur & Luftfeuchte im HWR erfasst.
Wenn man in Tasmota auch noch die auf dem D1 Mini integrierte LED konfiguriert hat man gleich noch ein visuelles Feedback des Zählers. ;)
OFF: http://running-egg.de/Content/GasZaehler/20240114_160825_off.png
ON: http://running-egg.de/Content/GasZaehler/20240114_160848_on.png
VG Remo
Ich möchte mich hier mal ganz herzlich für diese tolle Lösung bedanken.
Das Ganze habe ich gern mit den zusätzlichen Empfehlungen von Frank nachgebaut und in HA integriert.
Ich habe meiner Ausführung noch einen DHT-22 hinzugefügt, so habe ich gleich Temperatur & Luftfeuchte im HWR erfasst.
Wenn man in Tasmota auch noch die auf dem D1 Mini integrierte LED konfiguriert hat man gleich noch ein visuelles Feedback des Zählers. ;)
OFF: http://running-egg.de/Content/GasZaehler/20240114_160825_off.png
ON: http://running-egg.de/Content/GasZaehler/20240114_160848_on.png
VG Remo
Hi zusammen,
danke für dieses Projekt welches ich gleich noch um einen Wasserzähler erweitert habe.
nur zur Vollständigkeit noch habe ich mal ein Blockly geschrieben deren ZählerWERT unabhängig agiert. Die Differenz zwischen altem und neuem Wert des Tasmotas wird dann dem zu erzeugendem Zählerstandobjekt addiert.
Vorteil:
-kein anpassen/reset der Zähler auf dem Tasmota
-nach Fehlerfall (Stromausfall usw.) kann das Zählerstandsobjekt direkt manuell aktualisiert werden
var GasMeter_abs, GasMeter_diff;
on({ id: ’sonoff.0.Gas/Water-Meter.COUNTER_C2′ /* Gas/Water-Meter COUNTER C2 */, change: ’ne‘ }, async (obj) => {
let value = obj.state.val;
let oldValue = obj.oldState.val;
GasMeter_abs = getState(‚0_userdata.0.prod.Gaszähler‘).val;
GasMeter_diff = (obj.state ? obj.state.val : “) – (obj.oldState ? obj.oldState.val : “);
GasMeter_abs = (typeof GasMeter_abs === ’number‘ ? GasMeter_abs : 0) + GasMeter_diff * 0.01;
setState(‚0_userdata.0.prod.Gaszähler‘ /* Gaszähler */, GasMeter_abs, true);
});