Wasserzähler per Impulsadapter auslesen (Tasmota)

Hallo in die Runde! Ich habe einen Digitalen Wasserzähler (Multical 21) den ich leider nicht per wmbus auslesen kann, da mir die Wasserwerke den Verschlüsselungskey nicht ausgeben wollen. Ich könnte für 250€ nen USB wmbus Adapter kaufen der auf meinen Zähler „gebrandet“ ist, das ists mir aber nicht wert.

Da ich noch eine Impulsadapter (TCRT5000) und Wemos D1 liegen. Konnte anhand der Unterlagen vom Zähler rausfinden das er über die IR Schnittstelle Impulse rausgibt ( 1 Impuls - 0,1L)

Wie kann ich die daten nun mit den vorhandenen mitteln und Tasmota (?) abfragen und dann per MQTT an Homeassistant schicken um dort den Wasserverbrauch zu Monitoren? Hat das jemand schon umgesetzt?

Danke für den Input!

2 „Gefällt mir“

Du fragtest nach einer Lösung mit Tasmota. Da du die Daten jedoch an Home Assistant senden möchtest, habe ich mich entschieden, meine ESPHome-Lösung vorzustellen. Ergänzend möchte ich erwähnen, dass ich zunächst versucht habe, den Sensor mit - platform: pulse_counter zu betreiben. Dies funktionierte jedoch nur mäßig, weshalb ich nun - platform: gpio verwende

Ich verwende als Impulsgeber einen Näherungssensor (M18 8mm DC 5V NPN LJ18A3-8-Z/BX-5V) zusammen mit einem ESP32 Supermini. Da der Näherungssensor mit 5 Volt betrieben wird, habe ich eine kleine Schutzschaltung (Diode) eingebaut. Zusätzlich habe ich den verwendeten GPIO5 des ESP32 mit einem 33-kOhm-Widerstand auf die 3,3-Volt-Spannung gezogen.

Den ESP habe ich in ESPHome als Wasserzähler konfiguriert, was bei mir tadellos funktioniert. Nach einer Laufzeit von etwa 4 Wochen konnte ich keine Abweichung zwischen meiner Messung und dem Zählerstand feststellen.

Anbei meine Konfiguration:

tippe oder füge den Code hier ein
```substitutions:
  devicename: "smart-wasserzahler"
  long_devicename: "Smart Wasserzähler"
  pcb_version: "2024-12-19"

esphome:
  name: "${devicename}"
  name_add_mac_suffix: false
  comment: "${long_devicename} ${pcb_version}"
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32-c3-devkitm-1
  variant: ESP32C3
  framework:
    type: esp-idf

# Aktiviert das Loggen
logger:

# Aktiviert die Home Assistant API
api:
  encryption:
    key: "="

  services:
    - service: set_total_pulses
      variables:
        new_value: int
      then:
        - lambda: |-
            id(total_pulses) = new_value;
            ESP_LOGD("Service", "Neuer Zählerstand: %d", id(total_pulses));


# Ermöglicht OTA-Updates
ota:
  - platform: esphome
    password: ""

# WLAN-Konfiguration
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Optional manuelle IP
  manual_ip:
    static_ip: 
    gateway: 
    subnet: 255.255.255.0
  reboot_timeout: 0s # Neustart warten, wenn kein WLAN, 0s ist ausgeschaltet

  ap:
    ssid: "${long_devicename} hotspot"
    password: ""

# Webserver hinzufügen
web_server:
  port: 80    

# Fallback-Hotspot für Konfigurationsfehler
captive_portal:

globals:
  - id: total_pulses
    type: int
    restore_value: false  # Speichern im Flash deaktiviert, wenn nicht notwendig
    initial_value: '298'  # Startwert des Zählers (Ganzzahl)
  - id: imp_ratio
    type: float
    restore_value: false  # Keine Notwendigkeit, die Impulsrate zu speichern
    initial_value: '0.001'  # Impulsrate vom Wasserzähler (0.001 Liter pro Impuls)

binary_sensor:
  - platform: gpio
    id: internal_pulse_counter
    pin:
      number: GPIO5
      # mode: INPUT_PULLUP  # GPIO5 als Eingang mit Pullup-Widerstand, ohne mode-Attribut, wird standardmäßig der Pin als reiner Eingang ohne Pullup- oder Pulldown-Widerstand konfiguriert.
      inverted: true  # Signal invertieren test 21.12.2024
    name: "Impuls"
    # Diese Filter sorgen dafür, dass der Sensor zuverlässig arbeitet und nur gültige Impulse erkennt
    filters:     
      - delayed_on: 100ms  # Test mit 100ms  Debouncing, der Impuls muss mindestens 50ms dauern, um als gültig zu zählen
      - delayed_off: 400ms  # Test mit 500ms Nach dem Impuls muss eine Pause von mindestens 100ms folgen
    on_press:
      then:
        - lambda: 'id(total_pulses) += 1; ESP_LOGD("Wasserzähler", "Aktueller Zählerstand: %d", id(total_pulses));'
        - switch.turn_on: status_led  # Schaltet die LED ein, wenn ein Impuls empfangen wird
        - delay: 200ms  # LED bleibt 200ms an
        - switch.turn_off: status_led  # Schaltet die LED wieder aus

# Status-LED auf GPIO8
switch:
  - platform: gpio
    id: status_led
    name: "Status LED"
    pin: GPIO8
    inverted: true  # true Umgekehrte Logik: Ein (LOW) bedeutet "an", aus (HIGH) bedeutet "aus"

# Sensoren
sensor:
  # Uptime-Sensor (Betriebszeit)
  - platform: uptime
    name: "${long_devicename} Betriebszeit"
    id: uptime_seconds
    update_interval: 30s

  # WLAN-Signalstärke
  - platform: wifi_signal
    name: "${long_devicename} WLAN-Signal"
    update_interval: 60s

  # Sensor für Wasserverbrauch
  - platform: template
    name: "Wasserverbrauch"
    id: wasser_verbrauch_liter
    device_class: water
    unit_of_measurement: "Liter"
    state_class: "total_increasing"
    icon: "mdi:water"
    accuracy_decimals: 0
    lambda: |-
      return id(total_pulses);  
    # Berechnung in Litern (Anzahl der Impulse)

  - platform: template
    name: "Wasserverbrauch gesamt"
    id: wasser_verbrauch_total
    device_class: energy
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:water"
    accuracy_decimals: 3
    lambda: |-
      return id(total_pulses) * id(imp_ratio);  
    # Umrechnung von Litern zu m³
1 „Gefällt mir“

So ist es mir auch gegangen. (Kein Key erkalten)

Dann habe ich auf ESP32 Cam umgestellt .
Funktioniert super.

" Digitizer - AI on the edge - watermeter"

Gruss

1 „Gefällt mir“

Wenn Du es per Tasmota erfassen willst siehe:

So habe ich meinen Gaszähler eingebunden. Impulse Zählen.
Allerdings magnetisch (Reed Kontakt)

Und hier der script dazu:

2 „Gefällt mir“

Was genau hat denn nicht geklappt?

Wie genau hast du die verschaltet und was genau soll die tun?

Der Elko sitzt nur zwischen 5V und Masse, oder?

Auf welchem Pin sitzt der Reed? 10?

Kümmert sich sensor53 automagisch um Entprellung und Fehlzählung?

Steht doch im script.

Pull UP Widerstand nicht vergessen.

Meter Definition

+<M>,<rxGPIO>,<type>,<flag>,<parameter>,<jsonPrefix>{,<txGPIO>,<txPeriod>,<cmdTelegram>}

Siehe SML Sprache.

Neue Tasmota Script!!!

Wenn man die Legende zu den Variablen kennt, bestimmt. :slight_smile:

Diese Zeile kann ich aber in deinem #2 nicht entdecken?

Dein Bild zeigt nicht den ganzen script da geht es unten noch weiter.

Gruss

Mein Bild?

Das ist DEIN Bild!

Ich hab mich schon gewundert, dass das so einfach sein soll. :slight_smile:

Wie stellst du eigentlich sicher, dass die Zählerwerte nicht verloren sind, sobald der esp einmal rebootet?

@jay
Die gelieferten Werte in eine Variable schreiben.

Beim Tasmota gehen die werte nicht verloren! (ESP8266 mini)

Bleiben erhalten.

Ohne weitere Erklärung nutzt mir das nix.

Was ich machen will ist ja klar, aber wie bringe ich HA das bei?

Die gehn nur dann nicht verloren, wenn sie regelmäßig ins Flash geschrieben werden.

Das würde ich aber gerne vermeiden, da der Zähler ja lange zeit funktionieren soll (10 Jahre plus).

Das Speichern würde ich gern in HA erledigen.

@jay

Sorry aber da kann ich dir leider nicht weiter helfen.

In HA verwende ich keine extra Angelegten Variablen.

Ich benutze auch noch Homematic und Cux-D und
da ist es ein Kinderspiel sowas an zu legen.

Ja dann erst recht Tasmota.

Mein Esp8266 mini erfasst jetzt schon 8 Jahre mein Gaszähler früher sogar Gas und Wasser zusammen . Mit dem selben ESP8266! Habe in dieser Zeit nur einmal ein Versions Update gemacht.

Mit HA über MQTT bzw, Tasmota verbunden Statistik usw.

Monatliche Zählerstände erfasse ich zusätzlich in einem File.

Gruss

1 „Gefällt mir“

Schön.

Würdest du mir deine Config schicken? Gerne als PM.

@jay

Du meinst den Tasmota SML script?