HomeMatic Tutorial

HomeMatic – Wasserzähler auswerten

HomeMatic Wasserzähler

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 mein Versorger einen neuen Zähler montiert hatte, ist es mit zunächst nicht in den Sinn gekommen, dass dieser mit einem Sensor nachgerüstet werden kann. So stieß ich eher zufällig auf eine einfache aber sehr zuverlässige Möglichkeit, neben Strom- und Heizöl- nun auch meinen 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 meinem „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.

Während das HF-Signal nicht rückflusskompensiert ausgegeben wird, ist das LF-Signal 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.

Für die Auslesung des Wasserzählers bietet sich also die – zudem günstigere – Zweidrahtversion an.

Als K-Faktor sollte ein möglichst geringer Wert gewählt werden. K 100 liefert z.B. in Verbindung mit dem Aquadis+ erst bei 100 Litern Wasserverbrauch einen Impuls, was in einem vier Personen Haushalt mit 0,2 bis 0,3 m3 Wasserverbrauch am Tag zwei bis drei Impulse bedeutet.

Mein Sensor wurde daher ein „Cyble-Sensor V2 KLF 1“ (K-Faktor=1, LF-Signal), der je Liter einen Impuls übermittelt und den ich Anfang 2020 für unter 50 € gebraucht erstanden habe.

Bei einem eventuellen Gebrauchtkauf ist zu beachten, dass die Lithium-Langszeitbatterie des Sensors 12 Jahre Lebensdauer aufweist und – zumindest nicht ohne den Sensor gewaltsam zu öffnen – nicht wechselbar ist. 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, der sich im Vergleich mit dem HM-ES-TX-WM, zumindest was Auswertegeschwindigkeit, Stromversorgung und Korrekturen angeht, als deutlich praktikabler erwiesen hat und dabei mindestens ebenso zuverlässig ist.

Wie der Pulscounter zusammengebaut und in Betrieb genommen wird, ist unter dem o.a. Link fundiert beschrieben und braucht hier nicht wiederholt oder ergänzt zu werden.

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 werden die Impulse bei mir jedenfalls richtig erkannt, was sich auch in der blinkenden blauen Kanal LED des Pulscounters 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, muss für den Pulscounter die Firmware 48 oder höher verwendet werden (Hintergrund siehe Link).
Mit älteren Firmware-Versionen ermittelt der Zähler die Zählerstände nur auf 0,1 m3 also 100 Liter genau, was insbesondere bei einem Tageszähler unschön ist und damit im Ergebnis quasi einem Cyble-Sensor mit dem K-Faktor 100 entspricht.

Auswertung

Die Auswertung wurde 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)…

…wird das folgende Skript getriggert,…

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…

"neuer \quad Stand" \quad = "aktueller \quad Stand" - "Stand \quad bis \quad zum \quad letzten \quad Reset"

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, das im Executor ausgeführt werden kann (die „!“ sind in den Zeilen, deren Systemvariable befüllt werden sollen, natürlich zu entfernen und die eigenen Werte 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.

Bitte beachten...

SMART WOHNEN in Stern's Haus ist ein rein privates Projekt. Support kann ich daher nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“. Die Verwendung erfolgt auf eigenes Risiko, ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern's Haus | smart-wohnen.org

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.