Kamstrup flowIQ 2200 Wasserzähler - IR auslesen

Ich wurde letzte Woche von meinen Stadtwerken spontan auf den Kamstrup flowIQ 2200 Wasserzähler umgestellt.
Damit musste natürlich auch eine neue Lösung zum Auslesen her.

Leider stellen meine Stadtwerke den AES-Key für das Auslesen über Funk nicht zur Verfügung.
Damit bleiben eigentlich nur zwei Optionen:

  1. ESPCAM

  2. IR Schnittstelle - inspiriert über diesen Beitrag

Ich habe mich für Letzteres entschieden und konnte erfolgreich einen IR Smart Meter Lesekopf umflashen.

:cross_mark: Problem

Die Kommunikation schlug zunächst fehl mit:

Received invalid message (prefix mismatch received 0x80, expected 0x40)
Received invalid message (prefix mismatch received 0x00, expected 0x40)

:magnifying_glass_tilted_left: Ursache

Die Ursache war ein zu starkes IR-Signal.

Der Lesekopf stammt ursprünglich aus dem Stromzähler-Bereich (SML/D0) und ist dafür relativ „aggressiv“ ausgelegt.
Beim Kamstrup führt das dazu, dass der Empfänger übersteuert und nur noch Müll empfängt.

:white_check_mark: Lösung

Ich habe den TX-Teil (IR-LED) einfach mit etwas weißem Isolierband abgeklebt, um das Signal zu dämpfen.

Danach lief die Kommunikation sofort stabil.

RX konnte unverändert bleiben.

:battery: Hinweis zur Batterielaufzeit

Das Auslesen über die IR-Schnittstelle hat einen direkten Einfluss auf die Batterielaufzeit des Zählers.

Laut Hersteller liegt die erwartete Lebensdauer bei ca. 16 Jahren – durch das regelmäßige Abfragen wird sich diese jedoch verkürzen.

Wie stark genau, lässt sich aktuell schwer abschätzen und muss über die Zeit beobachtet werden.
Aus diesem Grund habe ich:

  • das Abfrageintervall auf 120 Sekunden erhöht

  • zusätzliche Werte wie Durchfluss (L/h) und Temperatur deaktiviert

  • und bewusst Batteriedaten mit ausgegeben, um die Entwicklung im Blick zu behalten

:magnet: Mechanik / Halterung

Der restliche Tag ging dann für eine passende Halterung drauf, damit der Sensor exakt positioniert ist.

Wichtig dabei:

  • Die optische Schnittstelle ist nur aktiv, wenn die Magnete korrekt positioniert sind

  • Der Magnetring des IR-Lesekopfs passt glücklicherweise genau

:backhand_index_pointing_right: Ohne saubere Positionierung + Magnete funktioniert die Kommunikation nicht


:link: Halterung

Link zur Halterung:

https://makerworld.com/en/models/2613834-iqflow-2200-water-meter-braket-fur-ir-sensor

:gear: ESPHome YAML

esphome:
  name: flowiq-2200
  friendly_name: flowIQ 2200

esp8266:
  board: esp01_1m

logger:
  baud_rate: 0

api:
  encryption:
    key: "your key"

ota:
  - platform: esphome
    password: "your password"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "Flowiq-2200 Fallback Hotspot"
    password: "12345678"

captive_portal:

mdns:
  disabled: false

web_server:
  port: 80

uart:
  baud_rate: 1200
  stop_bits: 2
  tx_pin: GPIO1
  rx_pin: GPIO3

sensor:
  - platform: kamstrup_kmp
    id: kamstrup_live
    update_interval: 120s
    custom:
      - name: Volume
        command: 0x0044 # reg 68
        unit_of_measurement: "m³"
        accuracy_decimals: 5
        state_class: "total_increasing"
        device_class: "water"

      #- name: Flow
      #  command: 0x004A # reg 74
      #  unit_of_measurement: "L/h"
      #  accuracy_decimals: 3
      #  state_class: "measurement"
      #  device_class: "volume_flow_rate"

      #- name: Water temperature
      #  command: 0x0124 # reg 292
      #  unit_of_measurement: "°C"
      #  accuracy_decimals: 2
      #  state_class: "measurement"
      #  device_class: "temperature"

      - name: Battery days left
        id: battery_days
        command: 0x0246 # reg 582
        unit_of_measurement: "days"
        accuracy_decimals: 1

  - platform: copy
    source_id: battery_days
    name: "Battery lifetime percent"
    unit_of_measurement: "%"
    accuracy_decimals: 1
    filters:
      - lambda: |-
          float pct = (x / (16.0 * 365.0)) * 100.0;
          if (pct < 0.0) return 0.0;
          if (pct > 100.0) return 100.0;
          return pct;

  - platform: copy
    source_id: battery_days
    name: "Battery lifetime decimal years"
    unit_of_measurement: "a"
    accuracy_decimals: 2
    filters:
      - lambda: return x / 365.0;

  - platform: wifi_signal
    name: "Diag : WiFi Signal dB"
    id: wifi_signal_db
    update_interval: 60s
    entity_category: diagnostic

  - platform: copy
    source_id: wifi_signal_db
    name: "Diag : WiFi Signal Percent"
    unit_of_measurement: "%"
    entity_category: diagnostic
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);

button:
  - platform: restart
    name: "Ctrl : Device Restart"

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "Diag : IP Address"
    ssid:
      name: "Diag : Connected SSID"
    mac_address:
      name: "Diag : Mac Address"

  - platform: template
    name: "Battery lifetime Y/M/D"
    update_interval: 60s
    lambda: |-
      if (isnan(id(battery_days).state) || id(battery_days).state < 0) {
        return {"unknown"};
      }

      int total_days = (int) roundf(id(battery_days).state);

      int years = total_days / 365;
      int rem_days = total_days % 365;
      int months = rem_days / 30;
      int days = rem_days % 30;

      char buffer[32];
      sprintf(buffer, "%dJ %dM %dT", years, months, days);
      return {buffer};

1 „Gefällt mir“

Sehr NICE.

Kannst Du bitte Infos geben, welchen Lesekopf man bestellen soll.

Dann würde ich gerne anfangen das nach zu bauen.

TOLL

:electric_plug: Hardware

Verwendet habe ich einen WattWächter von SmartCircuits.de

Grundsätzlich sollte aber auch jeder andere vergleichbare IR-Lesekopf funktionieren – wichtig ist nur, dass er sich entsprechend anpassen bzw. umflashen lässt.

:counterclockwise_arrows_button: Flashen ESPHome

Zum Umflashen - wird mit Tasmota ausgeliefert - auf ESPHome bin ich zweistufig vorgegangen:

Zunächst habe ich per OTA Tasmota minimal aufgespielt.
Anschließend konnte ich die ESPHome-Binary - direkt in HA erstellt - direkt über das Webinterface flashen.

Das funktioniert zuverlässig, ohne das Gerät öffnen oder seriell flashen zu müssen.

OK Danke . habe jetzt den bestellt - Ich Freu mich sehr.

Wattzähler

Ich habe noch einen USB-Lesekopf herumliegen, den ich direkt am Raspberry Pi anschließen könnte. Gibt es dafür auch eine Lösung?

Ganz andere Geschichte, hat nichts mit der Lösung hier zu tuen.

Da mein Wasserversorge rmir ebenfalls den Key zum Auslesen nicht zur Verfügung stellen möchte, bin ich an dieser Lösung interessiert.
Den Haltering lasse ich mir drucken.

Nimmt dieser dann auch die Magnete auf oder wo müssen die hin? Welchen Durchmesser braucht man bei den Magneten?

Zum angesprochenen Batterieverbrauch: Kann mir das als Kunde nicht egal sein? Muss ich den Batteriewechsel denn zahlen? Und wäre der erhöhte Batterieverbrauch nicht ein Argument ggü dem Wasserversorger, den Key zur Verfügung zu stellen?

Ich würde ja auch auf AI on the edge setzen, aber meine Abwasserleitung verläuft direkt darüber, ich habe dafür nicht genügend Platz fürchte ich…

Der Ring-Magnet ist in jedem Smart Meter Lesekopf enthalten. Normal hält dieser damit an dem Smart Meter.

Zum Batterieverbrauch kann ich noch nicht viel sagen. Bisher nimmt die erwartete Lebensdauer die ausgelesen wird jedem Tag um 1 ab. Mir wäre das erstmal egal, was der Versorger da ggf. nach einigen Jahren sagt, wenn die Batterie leer ist.

@JailBraik und @Bl8Runnr
Ich habe bei mir gerade täglich das Problem, dass ich irgendwann keine Werte mehr auslesen kann. Es geht erst wieder, nachdem ich die Magnete neu triggere - Halter mit Sensor einmal anhebe und wieder absetzte.

Bisher habe ich da kein festes Muster gefunden. 12-14 Stunden funktioniert es bisher am Stück.

Ob dieser Reset immer nach x Stunden kommt oder meine Magnetposition noch nicht perfekt ist, weiß ich leider noch nicht…

Hm, ich glaube darüber habe ich schon mal irgendwo gelesen. Scheinbar ist das normal, du triggerst ide IR Schnittstelle durch den Magneten, um einmalig auszulesen. Der User hat das mit einem Micro-Servo gelöst, der wohl in regelmäßigen Abständen vorbeibewegt wird.

Das wäre natürlich ungünstig!

Wenn es 12h+ funktioniert, sollte es ja eigentlich nicht an den Magneten liegen.
Ich schaue mir das mal weiter an.

Guten Morgen, heute wird bei mir alles geliefert . Bin natürlich jetzt am zweifeln, wenn es alle 12h nicht mehr funktioniert ….

Hast Du schon etwas raus bekommen?

Aus dem HA Forum kam die Rückmeldung, dass es bei einem schon über mehrere Tage läuft. Er hat den aktuell aber nur so drauf liegen.

Vermutung daher, dass die Position meiner Halterung noch nicht perfekt ist. Oder der im Wattwächter verbaute Magnet ist nicht stark genug?

Am besten testen wir da mal zusammen weiter.

1 „Gefällt mir“

So Wattwächter ist da, bekomme aber per “ESP Home Installation ( Web - ESPHome ) nicht installiert - bekomme keine Verbindung nach der auswahl….

Welche Tasmota hast Du genau installiert? Die Auswahl ist ja riesig…

Danke Dir

Habe jetzt auch alles am laufen mit ESP Home -

Habe alles übernommen von Dir, aber bekomme keine Verbindung aufgebaut.

[16:32:59.212\]\[E\]\[kamstrup_kmp:174\]: Received invalid message (prefix mismatch received 0x80, expected 0x40)
[16:32:59.212\]\[E\]\[kamstrup_kmp:174\]: Received invalid message (prefix mismatch received 0x80, expected 0x40)

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: (Neues Update & Features - Hier in der Community 🫶)

Das ist genau der fehler, wenn die Tx IR noch zu hell ist.
Hast du schon abgeklebt?

Funktioniert es? Kannst Du berichten?

Setzt sich die Auslesung nun täglich zurück oder läuft alles durch? Das wäre noch eine interessante Info.

Bei mir läuft es nun 36h durch - wir wissen aber noch nicht warum.

Also beim einen geht es, beim anderen nur 10-12h…..

Können nur hoffen, das sich mehr beteiligen.