===== MQTT-Wasserzähler / Verbrauchsmessung eines Wasserzählers =====
=== Beschreibung ===
Einige Wasserzähler sind werksseitig mit einem Reed-Kontakt Aufnehmer ausgestattet und können demzufolge mit einfachen Maßnahmen Smart gemacht werden.\\
Der meist separat, erhältlichew Reed-Kontaktgeber, erfasst das umlaufene Flügelrad des Zählers und gibt das Signal an die Zählereinheit (MQTT-Wasserzähler) weiter, welche die Auswertung übernimmt.\\
\\
\\
=== WLAN ===
Die Einbindung in das lokale Netzwerk wird folgendermaßen durchgeführt.\\
Nach dem Einstecken der Stromversorgung meldet sich das Gerät mit der SSID **Wasserzaehler-XXXXXX-XXXX**, wobei XXXXXX-XXXX für eine alphanumerische Zahlenfolge steht.\\
Nach dem Verbinden wird man automatisch auf eine Webseite mit der IP: 192.168.4.1 weitergeleitet. Dort bitte das **lokale WLAN** wählen und das **Passwort** eingeben (am besten mit dem Haken sichtbar machen beim Eingeben).\\
\\
{{:public:wlan1.jpg?300|}}
\\
\\
Kurz nach dem **Speichern** meldet sich das Webinterface mit der über DHCP erworbenen IP-Adresse.\\
Ist dies nicht der Fall, bitte im lokalen Router nach dem Gerät suchen und die IP-Adresse ausfindig machen.\\
{{:public:wlan2.jpg?300|}}
\\
Der MQTT-Wasserzähler ist nun über diese Adresse mittels Browser errereichbar.\\
\\
\\
=== Messeinheit ===
Der Reed Kontaktgeber ist folgendermaßen an den D1-Mini ESP8266 anzuschließen/anzulöten.\\
Für Zenner MNK hier erhältlich: [[https://www.spewa.de/systemtechnik-m-bus-impuls-zaehler/kontaktgeber/269/reed-kontaktgeber-zu-mnk-n-zaehler-zenner|Reed Kontaktgeber zu MNK N Zähler (Zenner)]]\\
\\
Für andere Wasserzähler ist ein geegneter Reed-Kontaktgeber zu erwerben. Bitte beim Hersteller oder Gas/Wasser-Installateur nachfragen.\\
\\
{{:public:esp8266_reed_wasser.jpg?400|}}
\\
Kabel durch das Loch seitlich des Gehäuses einfädeln, verlöten, einsetzen, mit Deckel verschließen.\\
GGf. den D1-Mini an der hinteren Seite (aufgedruckte Antenne) etwas runter feilen, damit er besser ins Gehäuse gleitet.\\
\\
{{:public:wasser_gehaeuse_3.jpg?300|}}
{{:public:wasser_gehaeuse_2.jpg?280|}}
\\
\\
\\
=== Montage ===
**Modell mit Aufsatzring**\\
Das Gehäuse wird auf den Aufsatzring aufgeschoben und anschließend ganz einfach auf den Wasserzähler aufgesetzt.\\
\\
{{:public:mqtt_gehaeuse_4.jpg?400|}}\\
{{:public:mqtt_wasserzaehler1.jpg?400|}}
{{:public:mqtt_wasserzaehler2.jpg?475|}}
\\
\\
**Modell mit Halterung**\\
\\
Die Halterung wird entweder mit dem mitgelieferten Klettband am Wasserzähler oder einer anderen, geeigneten Stelle befestigt, oder mit 2x 4mm Schrauben/Dübeln (nicht bei der Lieferung enthalten) an die Wand montiert.\\
Das Gehäuse mit der Messheinheit wird dann ganz einfach in die Halterung eingesetzt.\\
\\
{{:public:halterung1.jpg?400|}}\\
\\
{{:public:klettband-montage.jpg?348}}
{{:public:wandmontage.jpg?400|}}\\
\\
Anschließend wird der Reed-Kontaktgeber gemäß Herstelleranleitung an den Wasserzähler montiert.\\
Anleitung für Reed-Kontaktgeber (Zenner MNK): [[https://www.spewa.de/media/8d/b9/95/1719925531/ma_reed_mnk_de_en_fr_es_w.pdf?ts=1719925531|Installationsanleitung Reedkontakt]]\\
\\
===== Konfiguration =====
Bitte TASMOTA nicht mit einer Standard Firmware updaten!
Die installierte Firmware enthält das Scripting Modul, welches in Standard Versionen nicht enthalten ist. Siehe am Ende dieser Wiki Seite, wie man ein Update oder eine Neuinstallation durchführt.
\\
=== Zählerstand einstellen ===
Der auf dem Wasserzähler bereits erfasste Zählerstand wird folgendermaßen in TASMOTA per Konsole übertragen:\\
Kommando: **sensor53 c1 xxx**\\
Wobei xxx die aktuelle Wert ohne Komma ist. Z.B. 336,96 m³ entsprechen der Zahl 33696.\\
Somit wäre gemäß dieses Beispiels das Kommando:\\
\\
sensor53 c1 33696
\\
Jetzt sollte der neue Zählerstand gesetzt sein. Aber der Wert für **Heute** wurde enbenfalls geändert :-(\\
Da **Heute** sich durch die Zählungen errechnet, muss nach dem Setzen des Zählerstandes der selbe Wert geteilt durch 100 für den Wert **m1** (Differenz-Zählungen) gesetzt werden um **Heute** wieder auf Null zu bekommen.\\
Beispiel:
sensor53 c1 33696
script >m1=336.96
Jetzt passt alles! 8-)\\
\\
=== Konsolen Script ===
In folgendem Script (Konsolen > Script konfigurieren) ist eine Variablenwerte zu ersetzen. Immer mit PUNKT nicht mit KOMMA !!\\
- wp (Wasserpreis in EUR) z.B. 1.81
\\
>D
p:m1=0
p:g1=0
p:g2=0
p:month1=0
p:month2=0
p:month3=0
p:gesamt=0
c1=0
s1=0
h1=0
hgp=0
g1gp=0
g2gp=0
m1gp=0
m2gp=0
m3gp=0
gsgp=0
hr=0
dy=0
wp=1.81
wtotal=0
>B
=>sensor53 l255
>S
h1=s1-m1
hgp=(h1*wp)
g1gp=(g1*wp)
g2gp=(g2*wp)
m1gp=(month1*wp)
m2gp=(month2*wp)
m3gp=(month3*wp)
gsgp=(gesamt*wp)
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/yd_m3 %2g1%
=>Publish tele/%topic%/main/dbyd_m3 %2g2%
=>Publish tele/%topic%/main/value %2s1%
=>Publish tele/%topic%/main/wtotal %2wtotal%
=>Publish tele/%topic%/main/water_price %2wp%
=>Publish tele/%topic%/json {"wtotal": "%2wtotal%", "water_price": "%2wp%", "td_m3": "%2h1%", "td_money": "%2hgp%", "yd_m3": "%2g1%", "yd_money": "%2g1gp%", "dbyd_m3": "%2g2%", "dbyd_money": "%2g2gp%"}
}
>T
s1=Counter#C1/100
c1=Counter#C1
wtotal=(c1/100)
>W
Zählerstand: {m} %wtotal% m³
============
Wasserpreis: {m} %wp% €/m³
============
Verbrauch:
---------------------
Heute: {m} %2h1% m³
Kosten: {m} %2hgp% €
---------------------
Gestern: {m} %2g1% m³
Kosten: {m} %2g1gp% €
---------------------
Vorgestern: {m} %2g2% m³
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% €
#
Sieht dann in etwas so aus: \\
\\
{{:public:wasser_tasmota_script.jpg?400|}}
\\
=== Sonstige Konfiguration ===
Fall noch nicht vordefiniert, muss Pin D5 für den Counter konfiguriert werden, da der Reedkontaktgeber zwischen GND und D5 eingelötet ist.\\
{{:public:gaszaehler_7.jpg?400|}}\\
\\
MQTT gegebenfalls aktivieren (für Hausautomation) und zum Datenschutz sollte man die Weboberfläche mit einem kryptischen Passwort schützen:\\
{{:public:wz-weitere-einstellungen.jpg?400|}}
\\
==== 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 >=
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 wirklich 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 auf NULL gesetzt wird, muss m1 (Differenz-Zählungen) auch auf NULL gesetzt werden.
script >m1=0
=== Impuls Anpassung ===
Per default geht das Script von 10 Liter pro Impuls aus.\\
Falls der Wasserzähler andere Impulse liefert, aslo 1L/imp oder 100L/imp, muss das script angepasst werden.\\
\\
z.B. bei 1L/imp (1 Liter pro Impuls)\\
s1=Counter#C1/1000
c1=Counter#C1
wtotal=(c1/1000)
z.B. bei 1L/imp (100 Liter pro Impuls)\\
s1=Counter#C1/10
c1=Counter#C1
wtotal=(c1/10)
Um die Kommastellen der Bildschirmausgabe von 2 Stellen auf 3 Stellen zu erweitern, muss im Script %2 durch %3 ersetzt werden.\\
Zählerstand: {m} %3wtotal% m³
=== Debounce/Prellen ===
Es ist normal, dass ein Reedkontakt manchmal doppelt zähler. Dies nennt man **Prellen** und es kommt vor, wenn der Magnet längere Zeit über den Reedkontakt steht.\\
Um dies zu verhindern oder zumindest zu minimieren, kann per Konsole ein Kommandoe **CounterDebounce** eingegeben werden.\\
Der Wert kann von 0-32000 gewählt werden und spiegelt Millisekunden da, welche vergehen müssen, bis eine erneute Zählung zugelassen wird.\\
Man sollte mir einem Wert von 1000 anfangen und das Verhalten beobachten. Wenn der Reedkontakt immer noch prellt, dann um 500 bis 1000 erhöhen.\\
CounterDebounce 1000
===== Konfiguration in FHEM =====
In FHEM ist dann noch das einmalige Anlegen eines Brokers erforderlich.\\
define myBroker MQTT2_SERVER 1883 global
Anschließend sollte sich der Stromzähler in FHEM nach kurzer Zeit folgendermaßen, aber mit abweichender Adresse (4F9216) melden (autocreate muss aktiviert sein):\\
{{:public:gaszaehler_10.jpg?200|}}
\\
\\
Zusätzlich sind noch folgende Attribute von Vorteil.\\
attr MQTT2_DVES_4F9216 alias Wasserzähler
attr MQTT2_DVES_4F9216 group Wasser
attr MQTT2_DVES_4F9216 icon measure_water_meter
attr MQTT2_DVES_4F9216 stateFormat {ReadingsVal($name,"LWT","") eq "Offline" ? "absent" : ReadingsVal($name,"wtotal","") . " m³"}
Zusätzlich werden noch folgende **dummies** und eine **Notification** benötigt.\\
\\
Wasserverbrauch:
defmod WasserVerbrauch dummy
attr WasserVerbrauch group Wasser
attr WasserVerbrauch room 99_Zähler
attr WasserVerbrauch sortby 12
Wasser-Verbrauch Letzte Abrechnung: (Im Alias steht das Datum der Abrechnung als Hinweis)
defmod WasserVerbrauchLetzteAbrechung dummy
attr WasserVerbrauchLetzteAbrechung alias WasserVerbrauch_20221202
attr WasserVerbrauchLetzteAbrechung group Gas
attr WasserVerbrauchLetzteAbrechung room 99_Zähler
attr WasserVerbrauchLetzteAbrechung sortby 1
Wasserzählerstand letzte Abrechnung: (Im Alias steht das Datum der Abrechnung als Hinweis)
defmod WasserZaehlerStandLetzteAbrechnung dummy
attr WasserZaehlerStandLetzteAbrechnung alias Wasserzähler_20220522
attr WasserZaehlerStandLetzteAbrechnung group Wasser
attr WasserZaehlerStandLetzteAbrechnung room 99_Zähler
attr WasserZaehlerStandLetzteAbrechnung sortby 110
Wasserverbrauch Heute:
defmod WasserVerbrauch_Heute dummy
attr WasserVerbrauch_Heute group Wasser
attr WasserVerbrauch_Heute room 99_Zähler
attr WasserVerbrauch_Heute sortby 20
Wasserverbrauch Gestern:
defmod WasserVerbrauch_Gestern dummy
attr WasserVerbrauch_Gestern group Wasser
attr WasserVerbrauch_Gestern room 99_Zähler
attr WasserVerbrauch_Gestern sortby 30
Wasserverbrauch Vorgestern:
defmod WasserVerbrauch_Vorgestern dummy
attr WasserVerbrauch_Vorgestern group Wasser
attr WasserVerbrauch_Vorgestern room 99_Zähler
attr WasserVerbrauch_Vorgestern sortby 40
Notification:
defmod WasserverbrauchNoti notify MQTT2_DVES_BE3FE3:wtotal.* {\
my $Zaehlerstand=round(ReadingsNum("MQTT2_DVES_BE3FE3","wtotal","0"),0);;\
my $ZaehlerStandLetzteAbrechnung=round(ReadingsNum("WasserZaehlerStandLetzteAbrechnung","state","0"),0);;\
my $Diff=$Zaehlerstand-$ZaehlerStandLetzteAbrechnung;;\
fhem("set WasserVerbrauch $Diff m³");;\
my $wasser_db_yesterday=ReadingsNum("MQTT2_DVES_BE3FE3","dbyd_m3","0");;\
my $wasser_yesterday=ReadingsNum("MQTT2_DVES_BE3FE3","yd_m3","0");;\
my $wasser_today=ReadingsNum("MQTT2_DVES_BE3FE3","td_m3","0");;\
fhem("set WasserVerbrauch_Vorgestern $wasser_db_yesterday m³");;\
fhem("set WasserVerbrauch_Gestern $wasser_yesterday m³");;\
fhem("set WasserVerbrauch_Heute $wasser_today m³");;\
}
===== Konfiguration Home Assistant =====
Bitte die Konfiguration in Anlehnung an die des Gaszählers vornehmen. Anschließend aber das folgende Script für den Wasserzähler verwenden.\\
[[https://wiki.gorjup.de/doku.php?id=public:gaszaehler#konfiguration_im_home_assistant]]
Script:
mqtt:
sensor:
- name: "Wasserzähler Zählerstand"
unique_id: sensor.wasserzaehler_zaehlerstand
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.wtotal }}'
unit_of_measurement: 'm³'
payload_available: "Online"
payload_not_available: "Offline"
device_class: water
state_class: "total_increasing"
- name: "Wasserzähler Wasserpreis"
unique_id: sensor.wasserzaehler_wasserpreis
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.water_price }}'
unit_of_measurement: 'EUR/m³'
payload_available: "Online"
payload_not_available: "Offline"
device_class: monetary
state_class: "total"
- name: "Wasserzähler Verbrauch heute"
unique_id: sensor.wasserzaehler_verbrauch_heute
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.td_m3 }}'
unit_of_measurement: 'm³'
payload_available: "Online"
payload_not_available: "Offline"
device_class: water
state_class: "total_increasing"
- name: "Wasserzähler Verbrauch Kosten heute"
unique_id: sensor.wasserzaehler_verbrauch_kosten_heute
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.td_money }}'
unit_of_measurement: 'EUR'
payload_available: "Online"
payload_not_available: "Offline"
device_class: monetary
state_class: "total"
- name: "Wasserzähler Verbrauch gestern"
unique_id: sensor.wasserzaehler_verbrauch_gestern
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.yd_m3 }}'
unit_of_measurement: 'm³'
payload_available: "Online"
payload_not_available: "Offline"
device_class: water
state_class: "total_increasing"
- name: "Wasserzähler Verbrauch Kosten gestern"
unique_id: sensor.wasserzaehler_verbrauch_kosten_gestern
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.yd_money }}'
unit_of_measurement: 'EUR'
payload_available: "Online"
payload_not_available: "Offline"
device_class: monetary
state_class: "total"
- name: "Wasserzähler Verbrauch vorgestern"
unique_id: sensor.wasserzaehler_verbrauch_vorgestern
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.dbyd_m3 }}'
unit_of_measurement: 'm³'
payload_available: "Online"
payload_not_available: "Offline"
device_class: water
state_class: "total_increasing"
- name: "Wasserzähler Verbrauch Kosten vorgestern"
unique_id: sensor.wasserzaehler_verbrauch_kosten_vorgestern
state_topic: "tele/Wasserzaehler/json"
value_template: '{{ value_json.dbyd_money }}'
unit_of_measurement: 'EUR'
payload_available: "Online"
payload_not_available: "Offline"
device_class: monetary
state_class: "total"
\\
**Dashboard:**\\
{{:public:wasserzaehler_ha.jpg?400|}}\\
\\
**Energy-Board:** (Beispielhaft sind alle drei angebotenen Zähler dargestellt)\\
{{:public:ha-energy.jpg?400|}}\\
===== Neue TASMOTA Firmware für den MQTT-Wasserzähler =====
Neue TASMOTA Releases stehen zum Download unter folgendem Link zur Verfügung (Passwort = 10 stellige, aphanumerische Nummer auf dem Gerätelabel **"unterste Zeile"**)\\
[[https://nextcloud.gorjup.de/nextcloud/index.php/s/T4C9CWWrqWYA7rT|Download TASMOTA Releases für MQTT-Zähler]]
\\
Hier geht's zur STEP-BY-STEP Anleitung für das Neuflashen des Zähler: [[public:ESP-Flashen|STEP-BY-STEP-FLASHEN]]\\
\\
===== Troubleshooting =====
=== Es wurde eine Standard TASMOTA Firmware auf den MQTT-Wasserzähler geflashed/geupdated ===
Solange kein blank_1MB.bin Image geflashed wurde, sind die Einstellungen noch vorhanden, aber das Script funktioniert nicht mehr.\\
In diesem Fall muss zuerst die **tasmota-minimal_xxx.bin** Firmware und anschließend wieder die ** scripting_tasmota_xxx.bin** Firmware über das Webinterface geflashed werden. (Siehe "Neue TASMOTA Firmware für den MQTT Stromzähler").\\
\\
\\
=== MQTT-Wasserzähler meldet sich nicht mit seiner WLAN/SSID ===
Bitte prüfen, ob das 5V Stromkabel richtig tief eingesteckt wurde. Es kann sein, dass das Kabel nicht 100% Kontakt mit dem D1 Wemos Mini im inneren des Gehäuses hat.\\
Im Zweifelsfall bitte den Deckel öffen, den D1 Wemos Mini heraus nehmen und nochmal das Kabel einstecken. Wenn er sich immer noch nicht meldet, scheint die TASMOTA Software nicht geflashed oder korrupt zu sein.\\
Es kann auch sein, dass bei der WLAN Verbindung ein falsches Passwort eingegeben wurde und das Gerät jetzt permanent versucht sich mit falschem Passwort zu verbinden.\\
In diesem Fall muss das Gerät neu geflashed werden. Zuerst mit dem **blank_1MB.bin** und anschließend mit der **scripting_tasmota_xxx.bin**. (Siehe "Neue TASMOTA Firmware für den MQTT Wasserzähler").\\
Danach muss eine komplette Neukonfiguration gemäß dieser Wiki Anleitung durchgeführt werden.\\
\\
Hier geht's zur STEP-BY-STEP Anleitung für das Neuflashen des Zähler: [[public:ESP-Flashen|STEP-BY-STEP-FLASHEN]]\\
\\
\\
=== MQTT-Wasserzähler wird am USB-Port nicht erkannt ===
In diesem Fall handelt es sich bei dem verwendeten Kabel evtl. nur um ein reines Stromkabel und nicht um ein Datenkabel. Bitte ein anderes USB-Kabel verwenden.\\
Meistens ist beim Einstecken des MQTT-Wasserzählers in den Computer-USB Port bei Verwendung eines Datenkabels ein Windows-Sound zu hören (Windows 10 oder höher).\\
\\
\\
=== Seit HomeAssistant Update 2025.3.1 werden Fehler in MQTT angzeigt ===
{{:public:mqtt_ungueltig.jpg?600|}}
HomeAssistant hat mit dem Release 2025.3.1 die **device_class** und **unit_of_measurement** Einstellungen verschäft.
Somit ist z.B. die Kombination aus "water" + "EUR" nicht mehr zulässig. In obigem Script sind die **device_class** Werte beeits korrigiert. Bitte diese entsprechend im File Editor ändern.\\
Aus **water** wird z.B. **monetary**.
\\