Letzte Aktualisierung am 17. Dezember 2023
Trotz einiger interessanter Ansätze, einen „traditionellen“ Wasserzähler mittels Homematic auszuwerten, bin ich ob des Aufwandes einer zuverlässigen Ablesung bisher immer davor zurückgeschreckt.
Auch nachdem unser Versorger einen neuen Zähler montiert hatte, kam es mir zunächst nicht in den Sinn, diesen „smart“ zu machen. So stieß ich eher zufällig auf eine einfache, aber sehr zuverlässige Möglichkeit, neben Strom- und Heizöl- nun auch den Wasserzähler in die Homematic zu integrieren.
Funktionalität
- Aktueller Zählerstand
- Wasserverbrauch seit letzter Ablesung
- Tages-, Wochen-, Monats- und Jahreszähler
- Wasserverbrauch in der Stunde
Sensor
Bei unserem „neuen“ Wasserzähler handelt es sich um einen Aquadis+ P50 von Itron,…
…der mit seinem „Cyble Target“ genannten Zeiger serienmäßig für eine Fernauslesung per Cyble-System vorbereitet ist und Haltenasen für einen passenden Cyble-Sensor hat (siehe Beitragsbild).
Neben diversen Cyble-Sensoren, die eine mobile oder stationäre Datenerfassung über M-Bus bzw. Funknetzsysteme ermöglichen, sind vergleichsweise preiswerte Varianten mit Kontaktausgang erhältlich.
Von Letzteren gibt es wiederum Bauarten mit fünf oder zwei Adern und diversen Impulswertigkeiten für unterschiedliche Anwendungsfälle.
Die fünfadrigen Modelle geben ein HF-Signal (eine Umdrehung der Zeigernadel auf dem Zählwerk und damit die höchst mögliche Auflösung für den jeweiligen Zählertyp) und ein LF-Signal (= HF * K-Faktor des jeweiligen Cyble-Moduls) aus, die zweiadrigen nur ein LF-Signal.
Das HF-Signal wird nicht rückflusskompensiert ausgegeben. Das LF-Signal ist dagegen unempfindlich gegenüber Rohrleitungsvibrationen oder Pulsationen und berücksichtigt die Rückflusserkennung. Der damit ermittelte elektronische Zählerstand entspricht somit stets dem mechanischen Zählerstand im Wasserzähler.
Mehr dazu findet sich im Datenblatt des Cyble Sensors oder in dessen Anleitung.
Für die Auslesung des Wasserzählers bietet sich also die – zudem günstigere – Zweidrahtversion an.
Als K-Faktor sollte man einen möglichst geringen Wert wählen. K 100 liefert z.B. in Verbindung mit dem Aquadis+ erst bei 100 Litern Wasserverbrauch einen Impuls. Das führt in einem vier Personen Haushalt mit 0,2 bis 0,3 m3 Wasserverbrauch nur zur zwei bis drei Impulsen am Tag.
Mein Sensor ist daher ein „Cyble-Sensor V2 KLF 1“ (K-Faktor=1, LF-Signal), der je Liter einen Impuls übermittelt. Diesen habe ich Anfang 2020 für unter 50 € gebraucht erstanden.
Bei einem eventuellen Gebrauchtkauf ist zu beachten, dass die Lithium-Langszeitbatterie des Sensors 12 Jahre Lebensdauer aufweist. Sie ist nicht wechselbar, zumindest nicht ohne den Sensor gewaltsam zu öffnen. Die Sensoren haben daher ein „Mindesthaltbarkeitsdatum“ (MHD) aufgedruckt. Mein gebrauchter Sensor (Produktionsjahr 2017) sollte also mindestens bis 2029 durchhalten.
„Neu“ (Produktionsjahr 2018, MHD 2030) findet man den Sensor (Stand April 2020) im Internet für um die 80 € plus Versand.
Impulszählung
Die Sensorauswertung wollte ich eigentlich mit einem HM-ES-TX-WM realisieren. Da dieser aber eine Lieferzeit im zweistelligen Wochenbereich hatte, habe ich einen Pulscounter von Eugen Stall verwendet. Dieser hat sich im Vergleich mit dem HM-ES-TX-WM, zumindest was Auswertegeschwindigkeit, Stromversorgung und Korrekturen angeht, als deutlich praktikabler erwiesen. Dabei ist er mindestens ebenso zuverlässig.
Wie der Pulscounter zusammenzubauen und in Betrieb zu nehmen ist, wird unter dem o.a. Link fundiert beschrieben.
Die beiden Drähte des Cyble-Sensors werden direkt an einen beliebigen Kanal des Pulscounters angeschlossen. Als Periodendauer für den Impulsgeber (param: 2) habe ich im WebUI den kleinst möglichen Wert 100 ms eingegeben, da im Datenblatt des Cyble-Sensors eine Signallänge von 65 ms für K1 angegeben ist (was dort mit „sonst entsprechend des Zählfortschritts“ genau gemeint ist, habe ich bislang noch nicht herausgefunden). In dieser Einstellung erkennt der Pulscounter die Impulse bei mir jedenfalls richtig, was sich auch in der blinkenden blauen Kanal LED nach jedem Liter Verbrauch zeigt.
Für die Auswertung ist der Pulscounter bei Verwendung des Cyble-Sensors V2 KLF 1 mit dem Impuls-Kennwert 1000 zu konfigurieren,…
…zeigt in seinem WebUI den Zählerstand korrekt in m3 und dabei auch bis auf drei Dezimalstellen – also litergenau – an…
Damit dieser Wert mit drei Nachkommastellen in die CCU übertragen und dort weiterverarbeitet werden kann, ist der Pulscounter mit der Firmware 48 oder höher zu betreiben (Hintergrund siehe Link).
Mit älteren Firmware-Versionen ermittelt der Zähler die Zählerstände nur auf 0,1 m3 also 100 Liter genau. Das ist insbesondere bei einem Tageszähler unschön und enstpricht quasi einem Cyble-Sensor mit dem K-Faktor 100.
Auswertung
Die Auswertung ist analog zum Stromzähler-Tutorial realisiert. Zum Verständnis der Logik dahinter empfehle ich, dieses ggf. zusätzlich durchzulesen, da dort die Zusammenhänge und bestimmte Aspekte genauer beschrieben sind, die auch für den Wasserzähler gelten.
Neben den beiden Standard-Systemvariablen des Pulscounters „w_counter_n“ (Zählerstand in m3) und „w_power_n“ (aktuelle Verbrauchsleistung in m3/h)…
…werden folgende Systemvariablen benötigt (alle vom Typ Zahl), deren Maximalwerte vom Standard 65000 entsprechend der eigenen Zählerstände ggf. erhöht werden müssen…
Wasser Verbrauch aktuell Liter
Wasser Referenz Verbrauch heute
Wasser Verbrauch heute
Wasser Verbrauch heute Liter
Wasser Referenz Verbrauch laufende Woche
Wasser Verbrauch laufende Woche
Wasser Verbrauch laufende Woche Liter
Wasser Referenz Verbrauch laufender Monat
Wasser Verbrauch laufender Monat
Wasser Verbrauch laufender Monat Liter
Wasser Referenz Verbrauch laufendes Kalenderjahr
Wasser Verbrauch laufendes Kalenderjahr
Wasser Referenz Verbrauch seit letzter Ablesung
Wasser Verbrauch seit letzter Ablesung
Bei einer Aktualisierung der Systemvariablen „w_counter_n“ (hier ist das der Zähler n=3)…
…triggert das folgende Skript,…
var zA = dom.GetObject("w_counter_3");
var aA = dom.GetObject("w_power_3");
var vAl = dom.GetObject("Wasser Verbrauch aktuell Liter");
var vTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var vTm = dom.GetObject("Wasser Verbrauch heute");
var vTl = dom.GetObject("Wasser Verbrauch heute Liter");
var vWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
var vWm = dom.GetObject("Wasser Verbrauch laufende Woche");
var vWl = dom.GetObject("Wasser Verbrauch laufende Woche Liter");
var vMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
var vMm = dom.GetObject("Wasser Verbrauch laufender Monat");
var vMl = dom.GetObject("Wasser Verbrauch laufender Monat Liter");
var vJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
var vJm = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr");
var vLz = dom.GetObject("Wasser Referenz Verbrauch seit letzter Ablesung");
var vLm = dom.GetObject("Wasser Verbrauch seit letzter Ablesung");
vAl.State(aA.State() * 1000);
vTm.State(zA.State() - vTz.State());
vTl.State(vTm.State() * 1000);
vWm.State(zA.State() - vWz.State());
vWl.State(vWm.State() * 1000);
vMm.State(zA.State() - vMz.State());
vMl.State(vMm.State() * 1000);
vJm.State(zA.State() - vJz.State());
vLm.State(zA.State() - vLz.State());
…das zunächst die aktuelle Verbrauchsleistung in Liter/Stunde speichert und die Zeitraum-Zähler nach folgender Systematik berechnet…
Tages-, Wochen- und Monatszähler werden zusätzlich zu m3 auch in Litern gespeichert.
Der Stand bis zum letzten Reset ist in den jeweiligen Referenz-Systemvariablen hinterlegt, die bei der ersten Inbetriebnahme bzw. Korrektur manuell wie folgt befüllt werden müssen…
Für den Tageszähler (Wasser Referenz Verbrauch laufender Tag) der aktuelle Zählerstand minus den am Eintragetag bereits aufgelaufenen Verbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom Vortag 23:59 Uhr.
Für den Wochenzähler (Wasser Referenz Verbrauch laufende Woche) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Wochenverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom letzten Sonntag 23:59 Uhr.
Für des Monatszähler (Wasser Referenz Verbrauch laufender Monat) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Monatsverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom letzten Tag des Vormonats 23:59 Uhr.
Für den Jahreszähler (Wasser Referenz Verbrauch laufendes Jahr) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Jahresverbrauch (ggf. geschätzt). Dies entspricht dem Zählerstand vom 31.12. des Vorjahres 23:59 Uhr.
Für den Ablesezähler (Wasser Referenz Verbrauch seit letzter Ablesung) der aktuelle Zählerstand minus den bis zum Eintragezeitpunkt bereits aufgelaufenen Verbrauch seit der letzten Wasserablesung (ggf. geschätzt). Am besten übernimmt man hierfür den Zählerstand von der letzten Wasserrechnung.
Die Werte in den Referenz-Systemvariablen müssen in m3 eingetragen werden.
Hierzu eignet sich z.B. das folgende Skript (die „!“ sind in den Zeilen, deren Systemvariable befüllt werden soll, zu entfernen und die eigenen Zahlenwerte einzusetzen)…
var vTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var vWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
var vMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
var vJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
var vLz = dom.GetObject("Wasser Referenz Verbrauch seit letzter Ablesung");
! vTz.State(123.128);
! vWz.State(122.066);
! vMz.State(118.400);
! vJz.State(100.000);
! vLz.State(115.000);
WriteLine("Referenz Systemvariablen wie folgt gespeichert:");
WriteLine("Tageszaehler:");
WriteLine(vTz.State());
WriteLine("Wochenzaehler:");
WriteLine(vWz.State());
WriteLine("Monatszaehler:");
WriteLine(vMz.State());
WriteLine("Jahreszaehler:");
WriteLine(vJz.State());
WriteLine("Ablesezaehler:");
WriteLine(vLz.State());
In der aio NEO App zeigt sich die litergenaue Auswertung…
Reset
Der Reset der Zähler erfolgt gemäß dem Tutorial „Alle Zähler zusammen zurücksetzen“.
Das folgende Skript muss über das Zeitmodul der CCU oder einen CUxD-Timer jeden Tag um 23:59 Uhr getriggert werden…
!Tageszaehler
var wTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var wTm = dom.GetObject("Wasser Verbrauch heute");
var vTl = dom.GetObject("Wasser Verbrauch heute Liter");
wTz.State(wTm.State() + wTz.State());
wTm.State(0.000);
wTl.State(0.000);
!Wochenzaehler
if (system.Date("%u") == 7) {
var wWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
var wWm = dom.GetObject("Wasser Verbrauch laufende Woche");
var wWl = dom.GetObject("Wasser Verbrauch laufende Woche Liter");
wWz.State(wWm.State() + wWz.State());
wWm.State(0.000);
wWl.State(0.000);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
var wMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
var wMm = dom.GetObject("Wasser Verbrauch laufender Monat");
var wMl = dom.GetObject("Wasser Verbrauch laufender Monat Liter");
wMz.State(wMm.State() + wMz.State());
wMm.State(0.000);
wMl.State(0.000);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
var wJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
var wJm = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr");
wJz.State(wJm.State() + wJz.State());
wJm.State(0.000);
}
Den Ablesezähler kann man bei der Ablesung durch manuelles Ausführen des folgenden Programms/ Skripts zurücksetzen…
var wAz = dom.GetObject("Wasser Referenz Verbrauch seit letzter Ablesung");
var wAm = dom.GetObject("Wasser Verbrauch seit letzter Ablesung");
wAz.State(wAm.State() + wAz.State());
wAm.State(0.000);
…oder den Reset später durch Eintrag des Ablesezählerstandes in die Systemvariable „Wasser Referenz Verbrauch seit letzter Ablesung“ nachholen.
Im Tutorial „Alle Zähler zusammen zurücksetzen“ ist ein gemeinsames Rücksetzskript für Strom-, Wasser- und Heizölzähler hinterlegt, das beim Monatswechsel automatisch die Zählerstände mittels Pushover übermittelt…
Korrektur
Je nach Zeitpunkt der Speicherung des Zählerstandes im Pulscounter kann es ggf. zu Abweichung von einigen Litern zwischen dem mechanischen Zählerstand und der Anzeige in der CCU kommen (bei mir sind das meist kontinuierlich fünf Liter).
Falls größere Abweichungen auftreten, z.B. nach Stromausfällen, ist einfach der Zählerstand im WebUI des Pulscounters wieder auf den richtigen Wert zu setzen.
Eventueller Korrekturbedarf bei den Zeitraumzählern wird durch Anpassung der entsprechenden Referenz-Sytemvariablen – wie oben erläutert – umgesetzt.
Hallo Jens,
ich habe mir auch den Pulscounter zugelegt und werde diese Anleitung mal ausprobieren.
Kurze Frage , dies kann ich doch auch sicherlich mit einem Stromsensor genauso machen richtig ?
Ich habe den Pulscounter mit allen Sensoren , Wasser Gas und Strom.
Grüße Holger
Hallo Holger,
klar, das funktioniert auch für einen Strom-, Gas- oder Sonstwas-Zähler. Da musst du aber ggf. im Auswerteskript die Multiplikatoren anpassen, je nachdem, was du wie auswerten möchtest.
Liebe Grüße Jens
Hallo Jens!
Ich verwende ebenfalls den Pulcounter 2 von Eugen. Funktioniert perfekt. Nun zu meiner Frage? Ich möchte auch gern den Ölstand meines Öltanks mit dem Pulscounter auslesen. Welches Produkt verwendest du für die Ölstandsmessung, das würde mich interessieren.
Vielleicht kannst du mir antworten.
P.S: Jedenfalls wünsche ich einen guten Rutsch und viel Freude mit unserem Hobby!
Viele Grüße
Herbert
Hallo Herbert,
ich selbst messe den Ölstand nicht, sondern berechne ihn. Wie ich das gemacht habe, ist im Artikel HomeMatic – Verbrauchs- und Betriebsstundenzähler für Ölheizungen beschrieben.
Zum Messen des Füllstandes gibt es auch fertige Lösungen, z.B. so was wie den Mex. Ich kenne das Ding selbst nicht, ist daher nur ein Beispiel, keine Empfehlung.
Liebe Grüße und ebenso einen guten Rustch, Jens
Hallo Jens,
auch hierfür meinen Dank und Anerkennung für Deine großartige Arbeit. Mit Hilfe Deiner Skripte und einer weiteren Anregung aus einem Forum lese ich meinen Wasserzähler mangels Vorhandenseins eines Impulses (alter Zähler) per „all-in-the-edge“ aus. Dazu ist eine esp32-cam erforderlich. Kosten ca. 10,- € insgesamt. Klappt ohne Umwege über die CCU3. Ich erwähne das nur, weil verschiedentlich im Netz zu lesen ist, dass dies nicht möglich sondern der ioBroker erforderlich sei. Dies ist ganz eindeutig falsch.
Gruß, Dietmar
Hallo Dietmar,
danke für dein Feedback und den Hinweis, dass alternativ zum Pulscounter eine Einbindung mittels esp32-cam möglich ist.
Liebe Grüße Jens
Rückfrage zur esp32-cam … das Ding überträgt dann aber nur das reine Foto vom Zähler, oder? Oder ist da irgendwie eine Bilderkennung drin, die den Zählerstand „abliest“ und als Zahlenwert übermittelt? Das wäre heutzutage ja keine große Kunst mehr, würde mich aber bei einem 10-Euro-Modul überraschen, zumal es schwierig ist, Grenzfälle zu erkennen, bei denen Ziffern nur jeweils halb zu sehen sind.
Hallo Kristian,
falls Dietmar hier nicht ohnehin mitliest und antwortet, könnte ich ihn nach einer Weile auf deine Frage hinweisen und um eine Antwort bitten. Ich habe selbst keine Erfahrung mit dem Gerät.
Grüße Jens
Meines Erachtens ist die Auswertung irgendwelcher Impulse (egal was man misst) keine tolle Idee. Ich habe das bei meinem Gaszähler gemacht und jedes Mal, wenn irgendeine Komponente (Strom, Netzwerk, Smart Home Zentrale, …) nicht verfügbar ist, laufen die Meßwerte und der tatsächliche Zählerstand auseinander.
Mein Stromzähler liefert absolute Werte (den jeweils aktuellen Zählerstand). Auch nach dem Ausfall einer Komponente synchronisiert sich damit der Verbrauch automatisch.
Nun zu meiner Frage: Gibt es eine preiswerte Lösung, den absoluten Zählerstand zu erfassen?
Hallo Hermann,
siehe hier…