Kamstrup flowIQ 2200 auslesen: Wasserzähler mit Tasmota und ESP8266 smart machen

Kamstrup flowIQ 2200 auslesen: Wasserzähler mit Tasmota und ESP8266 smart machen

Wasserverbrauch automatisch erfassen, ohne Cloud, ohne Hersteller-App und ohne jeden Monat mit der Taschenlampe in den Keller zu kriechen? Klingt nach einem guten Plan. Mit einem Wemos D1 Mini, einem optischen IR-Lesekopf und Tasmota lässt sich der Kamstrup flowIQ 2200 direkt ins eigene Smart Home integrieren. Sogar die verbleibende Batterielaufzeit gibt der Wasserzähler preis. Ganz freiwillig allerdings nicht – wir müssen ihn erst danach fragen.

Kann das Ding nicht eigentlich funken?

Doch. Kann es. Und genau das macht die Sache ein bisschen absurd. Der Kamstrup flowIQ 2200 bringt nämlich bereits eine Funkschnittstelle mit. Theoretisch müssten wir uns also gar nicht mit IR-Leseköpfen, ESP8266 und kryptischen HEX-Telegrammen beschäftigen.

Theoretisch. Etwa ein halbes Jahr vor dem angekündigten Zählerwechsel hatte ich mich deshalb schon einmal freundlich bei meinem Wasserversorger gemeldet. Mein bisheriger analoger Wasserzähler war schließlich längst in mein Smart Home eingebunden und das sollte nach dem Austausch möglichst auch so bleiben. Man könnte meinen, ein moderner, funkfähiger Wasserzähler wäre dafür die perfekte Voraussetzung.

Die erste Antwort klang auch vielversprechend: Man werde sich melden. Spoiler: Tat man nicht. Ein halbes Jahr Funkstille später wurde der Zähler ausgetauscht. Also habe ich noch einmal nachgefragt. Wieder vergingen einige Wochen. Inzwischen wusste ich immerhin, welches Modell bei mir verbaut war, und konnte meine Anfrage etwas konkreter formulieren. Geholfen hat das allerdings nur bedingt.

Denn für die verschlüsselte Funkkommunikation benötigt man den passenden AES-Schlüssel. Ohne den kann man die Funktelegramme zwar grundsätzlich empfangen, aber mit den verschlüsselten Daten herzlich wenig anfangen. Und genau diesen Schlüssel wollte man nicht zur Verfügung stellen. Die Begründung: Sowohl der Wasserzähler als auch der zugehörige Schlüssel seien Eigentum des Wasserversorgers. Und das solle auch so bleiben. Tja.

Da hängt also ein smarter, funkfähiger Wasserzähler in meinem Keller, der seine Messwerte drahtlos übertragen kann. Nur ich als derjenige, dessen Wasserverbrauch da gemessen wird, darf mit den Daten auf diesem Weg nichts anfangen. Smart ist der Zähler damit vor allem für den Wasserversorger. Für mich ist er erst einmal ein digitaler Zähler mit eingebautem „Du kommst hier nicht rein!“.

Und genau deshalb hängen jetzt ein IR-Lesekopf und ein ESP8266 davor. Manchmal ist sowas eben weniger eine Frage des technisch Sinnvollen als des technisch Erlaubten. Seufz.

Als Alternative empfahl mir mein Wasserversorger übrigens den Kamstrup Pulse Adapter (Typ 66-99-051), einen speziellen Impulsadapter für den flowIQ 2200. Der wird direkt am Wasserzähler befestigt und gibt für jeweils zehn Liter Wasserverbrauch einen elektrischen Impuls aus. Kostenpunkt laut Empfehlung: schlanke 170 Euro.

Ernsthaft jetzt? Da hängt ein hochmoderner, funkfähiger Wasserzähler an meiner Wand, der die gewünschten Daten längst digital bereitstellt. Aber weil ich den AES-Schlüssel nicht bekomme, soll ich 170 Euro für ein zusätzliches Gerät ausgeben, das mir den Wasserverbrauch wieder als simple Zählimpulse ausspuckt? Digitalisierung rückwärts. Für 170 Euro. Kannste dir nicht ausdenken.

Die Hardware: ESP8266 trifft Wasserzähler

Für das Projekt brauchen wir tatsächlich nicht viel. Meine Einkaufsliste:

  • Wemos D1 Mini mit ESP8266
  • Optischer IR-Schreib-Lesekopf mit TTL-Schnittstelle

Als Lesekopf eignet sich beispielsweise die Variante aus dem Volkszähler-Wiki. Wichtig: Der Lesekopf muss senden und empfangen können. Ein einfacher IR-Empfänger reicht hier nicht aus. Der Kamstrup sendet seine Informationen nämlich nicht einfach permanent in die Gegend, in der Hoffnung, dass zufällig jemand zuhört. Stattdessen müssen wir ihm gezielt mitteilen, welche Informationen wir haben möchten.

Verkabelung: Vier Kabel und die erste Stolperfalle

Die Verkabelung ist überschaubar. Der IR-Lesekopf wird direkt mit dem Wemos D1 Mini verbunden:

Wemos D1 MiniGPIOIR-Lesekopf
TXGPIO1TX
RXGPIO3RX
3V3–VCC
GND–GND

Wir verwenden also die Hardware-UART des ESP8266. GPIO1 dient zum Senden der Daten und GPIO3 zum Empfangen.

Achtung bei TX und RX! Das ist einer dieser Momente, bei denen man sich fragt, warum Hardwarehersteller offenbar unterschiedliche Vorstellungen davon haben, was eine eindeutige Beschriftung ist. Je nach Lesekopf beziehen sich TX und RX auf die Signalrichtung des Lesekopfs oder auf die angeschlossene Hardware. Bei der hier verwendeten Belegung verbinden wir TX mit TX und RX mit RX. Bei einem anders beschrifteten Lesekopf kann das abweichen.

Falls später keine Daten ankommen, ist das also einer der ersten Punkte, die ihr überprüfen solltet. Der verwendete Lesekopf muss außerdem für eine Versorgung mit 3,3 Volt geeignet sein.

Anschließend wird der Lesekopf auf der optischen Schnittstelle des Wasserzählers positioniert und fixiert. Hier lohnt es sich, etwas sorgfältiger zu arbeiten. Die Infrarotkommunikation ist nämlich erstaunlich wenig beeindruckt davon, dass der Lesekopf ungefähr an der richtigen Stelle sitzt.

Tasmota vorbereiten

Als Firmware kommt Tasmota zum Einsatz. Allerdings benötigen wir eine Version, die sowohl die Scripting-Funktion als auch das Smart Meter Interface unterstützt. Die aktuellen Scripting-Builds können das, über den Web-Flasher könnt ihr euch die also auf euren D1 Mini flashen.

Prüft vor dem Flashen trotzdem nochmal, ob eure Firmware die beiden Features unterstützt. Andernfalls wundert ihr euch später über fehlende Menüpunkte, obwohl der ESP8266 ansonsten fröhlich vor sich hin blinkt.

Nach dem Flashen wird der Wemos D1 Mini wie gewohnt ins WLAN eingebunden.

Die serielle Konsole muss weg

Da wir GPIO1 und GPIO3 für die Kommunikation mit dem Wasserzähler verwenden, darf Tasmota diese Schnittstelle nicht gleichzeitig für seine Logmeldungen nutzen.

In der Tasmota-Webkonsole geben wir deshalb Folgendes ein:

SerialLog 0

Damit wird die serielle Logausgabe deaktiviert. Die Webkonsole funktioniert selbstverständlich weiterhin. Ich habe dafür folgendes Loglevel gesetzt:

WebLog 2

Scripting aktivieren

Anschließend aktivieren wir die Scripting-Funktion:

Script 1

Den Skripteditor findet ihr unter:

Consoles → Edit Script

Dort hinterlegen wir gleich die gesamte Kommunikation mit dem Wasserzähler.

Das komplette Tasmota-Skript

Jetzt wird es interessant: Der Kamstrup flowIQ 2200 stellt seine Werte über verschiedene Register bereit. Wir fragen zwei davon ab:

  • Register 0x0044: Gesamtwasserverbrauch
  • Register 0x0246: Verbleibende Batterielaufzeit

Damit das funktioniert, müssen wir zunächst eine Initialisierungsabfrage senden. Anschließend fragt Tasmota in einem Intervall von 120 Sekunden die beiden Register ab. Das komplette Skript sieht folgendermaßen aus:

>D

>B
=>sensor53 r

>S
; Einmalige Initialisierung beim Start
if upsecs==2 {
print KAMSTRUP INIT
sml(1 1 "803F0235E90D")
}

; Gesamtvolumen alle 120 Sekunden
if upsecs%120==10 {
print KAMSTRUP VOLUMEN
sml(1 1 "803F100100444DC00D")
}

; Batterielaufzeit zwei Sekunden spaeter
if upsecs%120==12 {
print KAMSTRUP BATTERIE
sml(1 1 "803F100102460BE00D")
}

>M 1
+1,3,rN1,0,1200,Kamstrup,1
1,=so3,32
1,0044280443UUuuUUuu@1000,Zaehlerstand,m³,Volume,3
1,02463E0200UUuu@1,Batterie Resttage,d,BatteryDays,0

#

Das Skript wird im Tasmota-Skripteditor gespeichert und aktiviert. Keine Sorge, falls euch die vielen Zahlen und Buchstaben gerade ein wenig an die Matrix erinnern. So wild ist es nicht. Schauen wir uns an, was hier passiert…

Was macht das Skript eigentlich?

Das Skript besteht im Wesentlichen aus drei Bereichen:

  1. Initialisierung des Smart Meter Interface
  2. Regelmäßige Kommunikation mit dem Wasserzähler
  3. Auswertung der empfangenen Daten

Schritt 1: Den Kamstrup aufwecken

Zwei Sekunden nach dem Start wird folgendes Telegramm gesendet:

80 3F 02 35 E9 0D

Im Skript sieht das so aus:

if upsecs==2 {
print KAMSTRUP INIT
sml(1 1 "803F0235E90D")
}

Damit senden wir den KMP-Befehl 0x02. Diese Initialisierungsabfrage wird einmalig nach dem Gerätestart ausgeführt.

Schritt 2: Den Zählerstand abfragen

Zehn Sekunden nach dem Start fragt Tasmota erstmals den Gesamtwasserverbrauch ab. Dafür wird folgendes Telegramm an den Wasserzähler geschickt:

80 3F 10 01 00 44 4D C0 0D

Entscheidend ist hier das Register 0x0044. Im Skript übernehmen diese Zeilen die Abfrage:

if upsecs%120==10 {
print KAMSTRUP VOLUMEN
sml(1 1 "803F100100444DC00D")
}

Die Bedingung upsecs%120==10 bewirkt, dass die Abfrage nach zehn Sekunden und anschließend alle 120 Sekunden ausgeführt wird.

Schritt 3: Die Batterielaufzeit abfragen

Zwei Sekunden später interessiert uns, wie lange die Batterie des Wasserzählers voraussichtlich noch durchhält. Dafür verwenden wir Register 0x0246. Das Abfragetelegramm lautet:

80 3F 10 01 02 46 0B E0 0D

Die entsprechende Stelle im Skript:

if upsecs%120==12 {
print KAMSTRUP BATTERIE
sml(1 1 "803F100102460BE00D")
}

Damit fragen wir die Batterielaufzeit jeweils zwei Sekunden nach dem Gesamtvolumen ab. Das ergibt folgenden Ablauf:

Zeit nach dem StartAktion
2 SekundenInitialisierung
10 SekundenGesamtwasserverbrauch abfragen
12 SekundenBatterielaufzeit abfragen
130 SekundenGesamtwasserverbrauch abfragen
132 SekundenBatterielaufzeit abfragen
DanachWiederholung alle 120 Sekunden

Damit haben wir die beiden benötigten Werte. Zumindest theoretisch. Denn der Wasserzähler antwortet uns zunächst nicht mit einer hübschen Zahl wie „30,885 Kubikmeter“, sondern mit einer Reihe von HEX-Werten. Wäre ja auch zu einfach.

Serielle Kommunikation: Warum 1200 Baud völlig ausreichen

Im Tasmota-Skript findet sich folgende Zeile:

+1,3,rN1,0,1200,Kamstrup,1

Damit konfigurieren wir die Kommunikation über das Smart Meter Interface. Die Parameter haben folgende Bedeutung:

ParameterBedeutung
1Nummer des Zählers
3Empfang über GPIO3
rN1Raw-Modus mit 8 Datenbits, keiner Parität und einem Stoppbit
0Standard-Flags
1200Baudrate
KamstrupName des Sensors
1Senden über GPIO1

Wir kommunizieren also mit 1200 Baud und 8N1. Das ist aus heutiger Sicht ungefähr die Geschwindigkeit, bei der ein alter Modemrouter nostalgisch wird. Aber wir übertragen hier schließlich keine 4K-Videos, sondern ein paar Bytes mit Zählerständen. Dafür reicht es vollkommen.

Der Empfangspuffer: Kleine Einstellung, große Wirkung

Kommen wir zu einer Einstellung, die mich tatsächlich etwas Zeit gekostet hat. Im Skript steht diese Zeile:

1,=so3,32

Damit wird der Raw-Empfangspuffer auf 32 Bytes eingestellt. Klingt unspektakulär. War es aber nicht. Bei meinen Versuchen mit einer kleineren Puffergröße kam es zu Buffer Overflows. Der ESP8266 griff dadurch auf falsche Speicherbereiche zu und verabschiedete sich mit einer Exception in den Neustart. Immer wieder.

Besonders fies daran: Die Antworten des Kamstrup konnten im HEX-Dump teilweise völlig normal aussehen. Trotzdem wurden die Messwerte nicht korrekt dekodiert. Erst mit der passenden Pufferkonfiguration funktionierte die Verarbeitung zuverlässig.

Falls ihr die Telegramme im Debug-Modus sehen könnt, aber keine Sensorwerte erhaltet oder der ESP unerwartet neu startet, schaut euch unbedingt diese Einstellung an.

Aus HEX wird Wasserverbrauch

Jetzt haben wir den Wasserzähler erfolgreich angesprochen. Aber was machen wir mit seinen Antworten? Schauen wir uns dazu ein echtes Antworttelegramm an:

40 3F 10 00 44 28 04 43 00 00 78 A5 79 A0 0D

Das ist die Antwort auf die Abfrage des Gesamtwasserverbrauchs. Auf den ersten Blick wenig hilfreich. Es sei denn, man liest HEX-Dumps zum Frühstück. Der eigentliche Zählerstand steckt in diesen vier Bytes:

00 00 78 A5

Umgerechnet ergibt sich:

0x000078A5 = 30885

Dieser Wert muss durch 1000 geteilt werden:

30885 / 1000 = 30.885 m³

Unser Wasserzähler steht also bei 30,885 Kubikmetern. Die Umrechnung müssen wir glücklicherweise nicht selbst programmieren. Dafür ist folgende Zeile im Tasmota-Skript zuständig:

1,0044280443UUuuUUuu@1000,Zaehlerstand,m³,Volume,3

Sie erkennt das entsprechende Antwortmuster, liest den 32-Bit-Wert aus und teilt ihn durch 1000. Das Ergebnis wird als Volume mit drei Nachkommastellen bereitgestellt. Damit lässt sich schon deutlich mehr anfangen als mit einer langen Reihe von HEX-Werten.

Und wie lange hält die Batterie noch?

Der Kamstrup liefert auch eine geschätzte verbleibende Batterielaufzeit. Das passende Antworttelegramm sieht beispielsweise so aus:

40 3F 10 02 46 3E 02 00 16 18 C2 32 0D

Die Batterierestlaufzeit steckt in diesen zwei Bytes:

16 18

Auch hier müssen wir den HEX-Wert umrechnen:

0x1618 = 5656

Das entspricht einer verbleibenden Laufzeit von 5656 Tagen. Also noch ein paar Jährchen. Die Umrechnung übernimmt wieder Tasmota:

1,02463E0200UUuu@1,Batterie Resttage,d,BatteryDays,0

Anders als beim Wasserverbrauch ist hier keine Division notwendig. Der Wert wird direkt in Tagen ausgegeben. Es handelt sich übrigens um die vom Wasserzähler selbst geschätzte Restlaufzeit. Ob die Batterie am Ende wirklich so lange hält, kann natürlich niemand garantieren.

Geschafft: Die Werte erscheinen in Tasmota

Wenn alles funktioniert, erscheinen die beiden Messwerte direkt auf der Tasmota-Hauptseite.

Bei meinem Test sah das beispielsweise so aus:

MesswertWert
Kamstru Zaehlerstand30,885 m³
Kamstru Batterie Resttage5656 d

Das ist doch schon einmal ganz ordentlich. Aus einem gewöhnlichen Wasserzähler ist damit ein Gerät geworden, das seine Messwerte über das heimische WLAN bereitstellt. Und das vollständig lokal.

Wer sich jetzt wundert, warum dort Kamstru statt Kamstrup steht: So lautet der ausgegebene Sensorschlüssel in der hier getesteten Tasmota-Firmware. Das ist nicht besonders hübsch, aber solange die Daten stimmen, kann ich damit leben.

MQTT: Ab ins Smart Home mit den Daten

Dass der Wasserverbrauch jetzt auf der Tasmota-Weboberfläche erscheint, ist schön. Aber wir betreiben doch kein Smart Home, nur um anschließend eine andere Webseite aufrufen zu müssen. Die Daten sollen natürlich weiterverarbeitet werden.

Zum Glück bringt Tasmota die passende MQTT-Unterstützung bereits mit. Die Verbindung zu eurem MQTT-Broker richtet ihr unter folgendem Menüpunkt ein:

Configuration → Configure MQTT

Anschließend stellen wir das Telemetrieintervall passend zum Abfrageintervall ein:

TelePeriod 120

Damit veröffentlicht Tasmota alle 120 Sekunden seine Telemetriedaten. Falls MQTT noch deaktiviert ist, könnt ihr es mit folgendem Befehl aktivieren:

MqttEnable 1

Ein typisches MQTT-Topic lautet dann beispielsweise:

tele/tasmota_C86554/SENSOR

Die Sensorwerte werden als JSON bereitgestellt. Der für uns interessante Ausschnitt sieht so aus:

{
  "Kamstru": {
    "Volume": 30.885,
    "BatteryDays": 5656
  }
}

Damit stehen zwei Werte zur Verfügung: Volume: Der bisherige Gesamtwasserverbrauch in Kubikmetern. BatteryDays: Die geschätzte verbleibende Batterielaufzeit in Tagen. Und damit können wir arbeiten.

Die Werte lassen sich beispielsweise in Home Assistant übernehmen, in einer Datenbank speichern oder über Grafana visualisieren. Aus dem fortlaufenden Zählerstand kann man sich dann auch den täglichen oder monatlichen Wasserverbrauch berechnen.

Endlich lässt sich also nicht nur feststellen, dass die Wasserrechnung hoch ist, sondern auch genauer nachvollziehen, wann das ganze Wasser eigentlich verbraucht wurde. Ob man danach noch entspannt duschen kann, ist eine andere Frage.

Wie oft sollte man den Wasserzähler abfragen?

In meinem Beispiel werden die beiden Register alle 120 Sekunden abgefragt. Für die Einrichtung und zum Testen ist das praktisch. Schließlich möchte man nicht jedes Mal eine viertel Stunde warten, um herauszufinden, ob eine Änderung am Skript funktioniert.

Für den dauerhaften Betrieb gibt es allerdings etwas zu bedenken. Der Kamstrup flowIQ 2200 wird über eine interne Batterie versorgt. Und auch wenn die optische Schnittstelle keine großen Datenmengen überträgt, benötigt jede aktive Kommunikation Energie.

Am idealen Intervall zur Abfrage arbeite ich noch… schließlich soll die Schnittstelle nicht schlafen gehen, aber auch nicht ständig Daten übertragen.

Weiterführende Links

4 Kommentare zu „Kamstrup flowIQ 2200 auslesen: Wasserzähler mit Tasmota und ESP8266 smart machen“

  1. Avatar von Klaus
    Klaus

    Hallo Richard,

    hab eben diese Anleitung gefunden, hab auch vor kurzem den FlowIQ 2200 bekommen, hab mir zum auslesen den WattWächter Wi-Fi/USB Gen.2 gekauft, den ich mittels ESPHome in meinen HomeAssistant eingebunden hab.

    Hast du mit deinem Setup nicht das Problem dass alle paar Stunden (~12h bei mir) die Schnittstelle des FlowIQ schlafen geht?
    lt. Hersteller haben die gezielt eine Sperre implementiert damit man nicht „dauerhaft“ über IR die Daten abfragen kann.

    1. Avatar von Richard Becker

      Hallo Klaus, ich habe einem anderen Blog entnommen, dass das wohl nur geschieht, wenn man ein gewisses Timeout nicht einhält. Bei einer recht kurzfristigen Abfrage von max. 120 Sekunden soll dies nicht passieren. Zudem gibt es wohl mehrere Modell-Nummern unter dem gleichen Gerätenamen, da habe ich auch schon die Theorie gelesen, dass manche abschalten, andere nicht.

      Ich habe es dann aber letztlich nicht lange genug laufen gehabt, weil mir der erhöhte Batterieverbrauch keine Ruhe gelassen hat. In den eineinhalb Tagen, in denen das bei mir lief, habe ich kein Schlafengehen der Schnittstelle bemerkt. Ich bin unterdessen aber auf AI on the edge umgestiegen, was sehr gut funktioniert.

      Ich werde dazu noch einen eigenen Beitrag verfassen – ein Blick lohnt sich aber, denn das funktioniert auch für andere Zähler, die man sonst gar nicht smart bekommen würde.

      1. Avatar von Richard Becker

        Der Vollständigkeit halber hier meine Infos zu den Modellnummern:

        • KWM2230: Komposit-Gehäuse mit 1 D-Batterie
        • KWM2231: Komposit-Gehäuse mit 2 A-Batterien
        • KWM3230: Edelstahl-Gehäuse mit 1 D-Batterie

        Die vollständige Typnummer ist ein längerer Code, der sich aus folgenden Merkmalen zusammensetzt: Generation (z. B. 02), Gehäusematerial (Kunststoff oder Edelstahl), Kommunikationsmodul (z. B. NB-IoT, LoRaWAN, wM-Bus), Batterietyp, Messspanne (R-Wert), Anschlussgröße/Baulänge und Wassertyp (Kalt-/Warmwasser).

  2. […] Mein ursprünglicher Beitrag: Kamstrup flowIQ 2200 mit Tasmota und ESP8266 auslesen […]

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.