Hallo,
aufgrund des Forumseintrages hatte ich mir vorgenommen, meinen Gaszähler abzulesen. Leider war ich vom Know-How noch etwas vom Level entfernt, den Eintrag zu verstehen. Nun ist das Ganze "fertig" und ich habe mir sowie vorgenommen Einsteigerfreundliche Anleitungen zu schreiben (Irrtümer vorbehalten). Vorneweg: Für viele aus dem Forum ist dieser Beitrag vielleicht langweilig, aber vielleicht kann ich da jemanden mal mit helfen.
Für mich war es der erste richtige Kontakt mit den NodeMCUs und dem ESP8266...
Zusammenfassung: Eigentlich gar nicht so schwer, für die Teilprobleme gibts immer Hilfe
Zeuitlicher Aufwand: Gar nicht so viel, wenn man schon mal was mit dem 8266 gemacht hat
Kostenpunkt: Sehr gering (je nach Reed-Kontakt)
Die einzelnen Positionen:
Kabel die an den Pin-Out vom NodeMCU passen, oder halt anlöten
1 NodeMCU - ca. 4,50 Euro (bei Ali ca. 2 Euro, dafür längerer Versand, Gearbest ca. 4,50 Euro dafür ca. 2 Wochen und aus D ab ca. 6 Euro)
1 Pull-Up-Widerstand 10 KOhm - ca. 10 Cent (wenn an GPIO-14/D5 dann nicht notwendig)
1 Leuchtdiode - ca. 20 Cent (nicht zwingend notwendig, signalisiert mir den Pulse)
1 Widerstand 1kOhm für die Leuchdiode - ca. 10 cent
Spannungsversorgung für den NodeMCU - habe ein MicroUSB-Kabel einfach an meinen Raspi geschlossen. Tut ansonsten aber ein rumfliegendes USB-Netzteil.
Reed-Kontakt - 28 Euro bei Ebay.
Habe mich für den passenden entschieden, damit ich unter der Gasbalge nicht rumfummeln muss und "Installationsfehler" reduzieren kann. Sieht auch schöner aus. Das Teil kann einfach unter die Gasbalge "geklickt" werden. Die Kabel werden im Gehäuse einfach nur mittels vorhandener Lüsterklemme festgeschraubt.
- Schritt - Flashen des NodeMCUs
Dieser Schritt hat bei mir am längsten gedauert. Aber nur weil ich mich damit nicht so auskannte.
Hier führen bekanntlich viele Wege nach Rom
Ich habe leider etliche Zeit verschwendet, da nirgend deutlich auf die beiden Köpfe auf dem NodeMCU hingewiesen hat - Reset und Flash. Erst nachdem ichd as rausgefunden habe, hat es bei mir zuverlässig funktioniert. Sprich: Flashvorgang am PC starten, Flash-Taste gedrückt halten und kurz reset drücken! (Update- das ist bei Variante B nicht notwendig) Damit fährt die NodeMCU direkt im Flash-Modus hoch und die Programme funktionieren.
Verkabelung des NodeMCU zum flashen
a) Flashen via FTDI
Hierfür benötigt man 4 female-female Kabel, 1 Mini-Usb-Kabel für den FTDI.
Was bei mit nicht funktioniert hat- den FTDI-Jumper auf 3,3V zu setzen. Da hat Windows das Gerät immer nicht erkannt. Deshalb hab ich den Jumper wie auf dem Bild so gelassen wie er war.
VCC - 5v
GND - GND
RX - TX
TX - RX
b) Flashen direkt via MicroUSB-Kabel
Ist von der verkabelung am einfachsten, Stolperstein ist allerdings das Micro-USB-Kabel. Nachdem ich wusste wie es geht, habe ich noch einmal wild rumprobiert und im Haushalt nur 1 Kabel gefunden mit welches dieses möglich war.
Einfach die CP210x USB to UART Bridge VCP Drivers installieren und NodeMCU am MicroUSB-Kabel anschließen.
Windows erkennt die Geräte und weist diesen oftmals Com3 oder 4 zu. bitte im Gerätemanager überprüfen damit man weiss, über welchen Com-Port kommuniziert wird.
Sobald man also die Verkabelung wie in a) oder b) vorgenommen hat, kann man mit dem flashen beginnen.
Flashen und download der Firmware
ESPeasy Download
Auf das entsprechende Release klicken (ja...den Link hatte ich echt immer übersehen) , runterladen und entpacken (aktuell ESPEasy_mega-20191208.zip). Im Hauptordner befinden sich gleich 2 Flash-Tools. Zum einden der ESP.Easy.Flasher.exe und zum anderen FlashESP8266.exe. Der Easyflasher hats bei mir auch nicht getan. Am einfachsten war FlashESP8266.exe.
Dazu im Ordner bin die richtige Datei raussuchen (ESP_Easy_mega-20191208_normal_ESP8266_4M1M.bin) und in den Hauptordner kopieren. Dann FlashESP8266.exe starten und man erhält folgendes Bild.
Jetzt einfach auf "Flash" drücken und wie oben beschrieben- den "Flash"-Knopf gedrückt halten und einmal kurz auf "Reset" drücken. Dann startet der Flash-Vorgang auch schon recht schnell und das Programm bestätigt idealerweise mit "Flash erfolgreich". Für mich hat es hiermit am besten funktioniert.
Der ESPEasyFlasher sieht so aus.
Irgendwie hat das nie so richtig geklappt, die Zeit zum erfolgreichen flashen zählte immer nicht runter.
NodeMCU Flash Tool
Das ganze ist auch hier beschrieben. Das NodeMCU-Flasher Tool runterladen (rechts oben, grüner Button, download) und starten. Unter Config kann man mittels Zahnrad das richtige .bin-File wählen und unter Operation "Flash(F)". Das hat bei mir recht lange gedauert
Alternativ kann man auch Kompilieren & flashen mittels Arduino-Umgebung
Dieser Schritt war bei mir recht aufwändig. Habe die entsprechenden Files dafür gefunden, aber es nie geschafft den NodeMCU zu flashen. Ständig wurden Bibliotheken nicht gefunden etc. Da es fertige .bin-Files gibt, ist dieses eher zu aufwändig. Deshalb beschreibe ich das nicht näher.
Wie gesagt- viele Wege führen nach Rom und man kann über viele Wege das NODEMCU flashen. Der schwierigste Teil ist somit bereits beendet.
Mit ESPeasy auf dem NodeMCU verbinden.
Nach dem erfolgreichen Flashvorgang versorgt man die NODEMCU mit Strom (beispielsweise Netzteil+Micro-USB-Kabel). Die NodeMCU bootet und spannt ein Passwortgeschütztes WLAN auf. Mit diesem WLAN verbinden und als Passwort "configesp" eingeben. In dem nun erscheinenden Fenster trägt man die Daten des eigenen WLANs ein und startet das Gerät neu.
Nach dem Neustart verbindet sich das Gerät mit dem eingegebenen WLAN. Die entsprechende IP kann man beispielsweise über die Oberfläche seines Routers ermitteln.
Jetzt gehts mit dem Verkabeln weiter:
Die eine Seite des Reed-Kontaktes habe ich an GPIO14 geschlossen und die andere an GND darüber.
Zusätzlich habe ich den 10kOhm Widerstand mit GPIO14 und der 3,3V Spannung verbunden. Gemäß @simatec ist dieser vermutlich garnicht notwendig. Siehe auch das Schaltbild. Damit ist die Wesentliche Verkabelung bereits erledigt!
Da ich den Pulse mittels zusätzlicher LED signalisieren wollte, habe ich die +Seite der LED an D6/ GPIO12 und die andere Seite an GND geschlossen. Dazwischen noch den 1kOhm Widerstand. Seite ist egal. Ich hab den auf die GND-Seite geschlossen.
Jetzt noch den Reed-Kontakt unter die Gasbalge klemmen (siehe Bild oben) und die NodeMCU mit Spannung versorgen.
ESPeasy konfiguieren
Aus der Config-Seite habe ich einen Unit-Name gesetzt und als Nummer die "1" gewählt. Der Unit-Name taucht dann später in MQTT auf. Unter "Tools" dann den Haken bei "Rules" machen und idealerweise den NTP-Hostname konfigurierern. Muss nicht, ist aber "schöner".
Jetzt den PulseCounter unter Devices eintragen (add Device generic PulseCounter). Ich habe die folgenden Settings gewählt.
Am wichtigsten ist das "enabled" und GPIO14 - Pulse. Für die values noch sprechende Namen vergeben und 0-Nachkommastellen auswählen. Als Interval habe ich 30 Sekunden gewählt, da die Differenz immer nach dieser Zeiteinheit zurück gesetzt wird. Anhand dieser zähle ich dann später den Gaszähler im ioBroker hoch. Das Ganze natürlich immer via submit an den NodeMCU übertragen.
Als letztes im NodeMCU noch unter Controller MQTT einrichten. Wichtig ist die Portnummer. Ich habe ein paar Sonoffs unter 1883 bereits eingerichtet. Deshalb habe ich mich nun für den Port 1888 entschieden. IP vom ioBroker und die Login-Credentials auf dem ioBroker eintargen. Ganz unten noch auf "enabled" setzen und submitten.
Mittels Leuchtdiode wollte ich mir ja den Pulse anzeigen lassen. Außerdem habe ich noch als "Heartbeat" die Onboard-Led alle 10 Sekunden blinken lassen. Das ganze macht man unter "Rules".
on System#Boot do
Monitor GPIO,14 //GPIO 14 -Reed-Kontakt überprüfen
gpio,2,1 //BoardLED anschalten
timerSet,1,10 //Timer 1 auf 10 Sekunden setzen
endon
on GPIO#14=1 do
GPIO,12,0 //LED definitiv deaktivieren
endon
on GPIO#14=0 do
GPIO,12,1 //LED einschalten
Delay,3000 //3 Sekunden Pause
GPIO,12,0 //Leb abschalten
endon
On Rules#Timer=1 do
gpio,2,0 //BoardLED abschalten
timerSet,2,1 //Timer 2 auf 1 Sekunde setzen
endon
On Rules#Timer=2 do
gpio,2,1 //BoardLED anschalten
timerSet,1,10
endon
Das Abschalten der LED nach Zeit X ist wichtig falls der Gaszähler mal auf der "0" stehen bleibt. Dann würde die Leuchtdiode die ganze Zeit leuchten. Wenn man keine extra Leuchtdiode sonder die interne Diode nutzen möchte (GPIO2) dann einfach die ganzen Timer/ Regeln mit GPIO2 löschen und GPIO12 auf GPIO2 ändern.
Jetzt gehts in den ioBroker
Im ioBroker den MQTT-Server/Client-Adapter installieren. Die gerade gewählte Portnummer und die festgelegten Credentials aus dem letzten Schritt eintragen.
Hierdurch erscheint unter den Objekten bereits der Gaszähler.
Da nach einem Stromverlust alle Werte genullt werden, müssen diese im ioBroker gespeichert werden. Dafür habe ich dann einen eigenen Datenpunkt angelegt. Das sind die wichtigsten Weret des DP.
"role": "value",
"type": "number",
"unit": "m³",
"read": true,
"write": true,
"desc": "Manuell erzeugt",
Zusätzlich habe ich für spätere Verfeinerung dann noch weitere DP bzgl. der Kosten etc. angelegt. Das ist im ursprünglichen Forumsbeitrag von @h1ob und @GeorgS haber viel umfänglicher beschrieben.
Jetzt muss der eigene DP noch via Script aktualisiert werden. Ich habe mir überlegt, dass bei der Aktualisierung der Diffenz der eigene Zähler sofort hochgezählt wird. Sollte dann der NodeMCU neu starten, wurde diese Veränderung ja bereits übertragen. Mein Blockly sieht dann so aus:
Das Script ist dann folgendes.
on({id: 'mqtt.0.ESP_Easy_GAS.Gaszaehler.Differenz', change: "gt"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
setState("0_userdata.0.Gaszaehler.Zaehlerstand"/*Zaehlerstand*/, Math.round((getState("0_userdata.0.Gaszaehler.Zaehlerstand").val + 0.01)*100)/100);
});
Das Runden ist wichtig da die Operationen sonst manchmal krumme Werte ergeben.
Achtung - das ist noch fehlerhaft bzw. der Zählerstand ist mit dem ioBroker-Zähler auseinander gelaufen. Ist ja zum Glück nur das Script bzw. die Eisnetlung auf dem ESP. Prinzipiell funktioniert das ja.Update folgt.
Demnächst werde ich mich noch um ein vernünftiges Gehäuse kümmern und vor allem die monitäre Berechnung vernünftig machen. Dann vermutlich noch einen DHT22 anklemmen damit ich parallel die Temperatur und Luftfeuchtigkeit aus dem HW-Raum via MQTT habe.
Auf diesem Weg- vielen Dank für die Idee und die Unterstützung von @SBorg, @h1ob und @GeorgS .
Ich hoffe ich habe grobe Fehler weggelassen und vor allem anderen Anfängern geholfen bzw. gaanz Anfängerfreundlich dokumentiert.
Falls Ihr Fehler findet oder Ergänzungen habt, bitte Kommentieren.