Qundis digitaler Wasserzähler

du hast am Foto ein ESP32 Board, in der Konfig aber ein ESP8266 (d1 mini) ausgewählt.

Oh, no :sweat_smile: Stimmt. Das habe ich jetzt geändert- Danke Dir…So langsam wird es. Lässt sich auch ohne Fehler flashen und ist in ESP Home Online. Nur nicht in der Geräteübersicht ESP32. Das Gerät wird nicht automatisch erkannt bzw. kann auch nicht hinzugefügt werden. Fehlermeldung:
Keine Verbindung zum ESP möglich. Achte darauf, dass deine YAML-Datei eine Zeile „api:“ enthält.

Bei klick auf VISIT in ESP Home (water-meter) wird eine leere Seite angezeigt.

Habe ich da ggf. noch einen Fehler bei den Einträgen:

domain: !secret domain
(Die Zeile hatte ich auskommentiert)

und

js_url: !secret webserver_jsurl
(Der Eintrag in secret.yaml ist: webserver_jsurl: “http://192.168.xxx.xx:8123/www.js

siehst du jetzt etwas in der Konsole?

Ja ich sehe folgendes im Log:

�>�j����Oha�[     6][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
[    33][D][WiFiGeneric.cpp:929] _eventCallback(): Arduino Event: 0 - WIFI_READY
[   123][V][WiFiGeneric.cpp:338] _arduino_event_cb(): STA Started
[   124][D][WiFiGeneric.cpp:929] _eventCallback(): Arduino Event: 2 - STA_START
[  5845][V][WiFiGeneric.cpp:381] _arduino_event_cb(): SCAN Done: ID: 128, Status: 0, Results: 3
[  5845][D][WiFiGeneric.cpp:929] _eventCallback(): Arduino Event: 1 - SCAN_DONE
[  7311][V][WiFiGeneric.cpp:353] _arduino_event_cb(): STA Connected: SSID: xxxxxxx, BSSID: MACID, Channel: 1, Auth: WPA2_PSK
[  7313][D][WiFiGeneric.cpp:929] _eventCallback(): Arduino Event: 4 - STA_CONNECTED
[  7338][V][WiFiGeneric.cpp:367] _arduino_event_cb(): STA Got New IP:192.168.177.87
[  7339][D][WiFiGeneric.cpp:929] _eventCallback(): Arduino Event: 7 - STA_GOT_IP
[  7342][D][WiFiGeneric.cpp:991] _eventCallback(): STA IP: 192.168.177.87, MASK: 255.255.255.0, GW: 192.168.177.1

ok, das ist soweit alles? Ich sehe nichts vom mbus Modul, das ist etwas eigenartig.

Verstehe ich auch nicht, alles korrekt verlötet.

Hier ist nochmal das komplette Script:

## ------------------------------------------------------------------
## TESTCASE FOR WMBUS METER + CC1101 for WATERMETES
##
## This version has no sensors and shows only
## the logs for checking wM-Bus and CC1101.
##
## DO NOT USE THIS CONFIGURATION FOR PRODUCTION
##
## ------------------------------------------------------------------
substitutions:

  # device and application settings
  device_name_short: "water-meter"
  device_description: "Watermeter CC1101 wmbus Test"
  projectname: "CC1101 wmbus Test.Watermeter"
  appversion: "2.0.7"

# logger settings
  log_level: "VERBOSE"  # not that logging need memory, so in production mode use "WARN"
  log_wmbus: "VERBOSE" # Loglevel for wmbus meters component
  log_baudrate: "0" # 0 disable uart logger messages


 
  BOARD: az-delivery-devkit-v4
  CC1101_3: GPIO23  # M0SI
  CC1101_4: GPIO18  # CLK
  CC1101_5: GPIO19  # MISO
  CC1101_6: GPIO17  # GD02
  CC1101_7: GPIO16  # GDO0
  CC1101_8: GPIO05  # CSN

## ----------------------------------------------------------------
## HARDWARE az-delivery-devkit-v4
##          ESP32 240MHz, 520KB RAM, 4MB Flash
## ----------------------------------------------------------------
esp32:
  board: ${BOARD}
  framework:
    type: arduino


  ## ------------------------------------------------------------------
  ##
  ##
  ##       GDO0                 MOSI
  ##         7              MISO  3
  ##         o GD02       CLK  5  o  CSN
  ##         |  6           4  o  |  8           ╭-------o 2 (GND)
  ##         |  o           o  |  |  o           |  ╭----o 1 (3.3V)
  ##         |  |           |  |  |  |           |  |
  ##   ╭――x――o――o――x――x――x――o――o――o――o――x――x――x――o――o―╮
  ##   |     D1 D2          D5 D6 D7 D8               |
  ##   |                                              |
  ## - | ANT              NODEMCU V3                  | -- USB
  ##   |                                              |
  ##   |                                              |
  ##   ╰――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x―╯
  ##
  ##
  ##
  ## ------------------------------------------------------------------

## ----------------------------------------------------------------
## ESPHOME APPLICATION
## ----------------------------------------------------------------
esphome:
  name: ${device_name_short}
  comment: ${device_description}
  # Automatically add the mac address to the name
  # so you can use a single firmware for all devices
  name_add_mac_suffix: false
  project:
    name: ${projectname}
    version: ${appversion}
  build_path: ./build/${device_name_short}
  on_boot:
    priority: -100.00
    then:
      - logger.log:
          level: INFO
          tag: "system"
          format: "BOOTMESSAGE:${device_name_short} API is connected, Device ready!"
  on_shutdown:
    priority: 700
    then:
      - logger.log:
          level: ERROR
          tag: "system"
          format: "BOOTMESSAGE:${device_name_short} is down!"

## ----------------------------------------------------------------
## External components
## ----------------------------------------------------------------
external_components:
  # uses the latest version from SzczepanLeon
  - source: github://SzczepanLeon/esphome-components@main
    refresh: 0s
    components: [wmbus]

## ---------------------------------------------------
## WIFI Settings 
## ---------------------------------------------------

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

## ---------------------------------------------------
## mDNS Component
## ---------------------------------------------------
mdns:
  # if mDNS is disabled, they will no longer be able to automatically find your devices.
  disabled: false

## ---------------------------------------------------
## Captive portal component
## ---------------------------------------------------
captive_portal:

## ---------------------------------------------------
## LOGGER COMPONENT
## ---------------------------------------------------
logger:
  id: appslogger
  level: ${log_level}
  baud_rate: ${log_baudrate}
  logs:
    wmbus: ${log_wmbus}
    wMBus-lib: ${log_wmbus}

## ---------------------------------------------------
## OTA Updates
## ---------------------------------------------------
ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxx"
  safe_mode: false
  on_begin:
    then:
      - logger.log:
          format: "OTA Start"
          tag: "OTA"
          level: WARN
  on_progress:
    then:
      - logger.log:
          level: WARN
          tag: "OTA"
          format: "OTA progress %0.1f%%"
          args: ["x"]
  on_end:
    then:
      - logger.log:
          format: "OTA End"
          tag: "OTA"
          level: WARN
  on_error:
    then:
      - logger.log:
          format: "OTA update error %d"
          tag: "OTA"
          level: ERROR
          args: ["x"]

## ---------------------------------------------------
## COMPONENT WEBSERVER
## ---------------------------------------------------
web_server:
  port: 80
  version: 2
  js_url: !secret webserver_jsurl

## ---------------------------------------------------
## SNTP Time server
## ---------------------------------------------------
time:
  - platform: sntp
    id: time_sntp
    timezone: Europe/Berlin
    servers:
      - 0.at.pool.ntp.org
      - 0.pool.ntp.org
      # - 1.pool.ntp.org

## ---------------------------------------------------
## CC11001 WMBUS TO DEVICE (selected board)
## ---------------------------------------------------
wmbus:
  mosi_pin: ${CC1101_3}  # MOSI Attached to Hardware SPI controller MOSI SPI Interface
  miso_pin: ${CC1101_5}  # MISO Attached to Hardware SPI controller MISO SPI Interface
  clk_pin: ${CC1101_4}   # SCK  Attached to Hardware SPI controller CLK
  cs_pin: ${CC1101_8}    # CSN  Attached to Hardware SPI controller
  gdo0_pin: ${CC1101_7}  # GDO0 Clock output. High Impedance !
  gdo2_pin: ${CC1101_6}  # GDO2 status signals. High Impedance !

  # Shows telegrams from all watermeters in log.
  log_unknown: True

## Nothing follow here, output only on log console

bau mal noch folgende Zeile ein:

wmid: “0”

Hab ich. Ändert sich aber erkennbar nichts

Ich habe ebenfalls versucht den Qwater 5.5 mithilfe des Projektes auszulesen. (zibous/ha-watermeter)

Ich erhalte auch die entsprechenden Telegram Daten bzw. Frames, welche vermutlich aber verschlüsselt sind. Zumindest begründet es ChatGPT damit, dass die wohl an bestimmten Teilen des Strings erkennbar ist. Ohne den “Decryption Key” kommt man da wohl nicht weiter.

Hier ein Frame von meinem Wasserzähler als Beispiel mit Treiber von qwater: WMBusmeters Analyze Telegram

Vlt hat aber jemand noch Ideen oder bleibt dann wirklich nur noch die irDA-Schnittstelle (Infarot)?

Das hier ist mein Wasserzähler: https://qundis.de/fileadmin/user_upload/01_Produkte/03_Qwater_Wasserzähler/02_PDF/01_DE/QUNDIS_Datenblatt_Qwater_5.5_elektronische_Wasserzähler_Verschraubung_2017_dt.pdf

Hi @sippeeey. Die Wasseruhr habe ich, wie oben beschrieben auch. Inzwischen läuft das Script und im Protokoll wird meine Wasseruhr und die von meiner Nachbarin angezeigt. Leider kommen keine Sensordaten an (Wasserverbrauch usw).Hinter der ID von der Wasseruhr wird noch ein sehr langer Alphanumerischer String angezeigt. Das könnte der Schlüssel sein, aber wo binde ich den ein?

der Schlüssel wird nicht per Funk übertragen, das ist der payload. Du brauchst den Schlüssel von deinen Wasserwerken.

Habe vergessen zu erwähnen, dass es der Wasserzähler in der Wohnung ist.
Beim Hauptzähler kann ich mir das noch vorstellen, dass der Schlüssel von den Wasserwerken kommt (hier: WSE). Meinen Wasseruhr kommt aber vom Vermieter und da war auch in der Originalverpackung kein Code. Kann es sein, dass der Hersteller der Uhr diesen Code hat?

ok, hast du mal überprüft in welchen Mode er die Telegramme verschickt? S oder C?

sonst aktivier mal den C-mode und prüfe es nochmal.

1 „Gefällt mir“

Dank der absoluten Geduld von @meloneA (Besten Dank an dieser Stelle) habe ich den Qwater nunmehr in Homeassistant einbinden können. Bei der Verwendung der Qundis Wasseruhr ist dokumentiert, dass nur ein Sensor abgelesen werden kann. Das ist zwar schade, aber es reicht ja der aktuelle Zählerstand. Alles andere lässt sich mit Statistiken regeln.

So sieht nun meine Hardware aus:

Gekaufte Komponenten:
AZDelivery ESP32 NodeMCU Module WLAN WiFi Dev Kit C Development Board mit CP2102

diymore ESP32 Breakout Board für 38PIN ESP32 Entwicklungs Board

K0R41 1 x CC1101 Funkfrequenz-Transceiver-Modul – 315 MHz 433 MHz 868 MHz 915 MHz – Arduino – Pi – GPIO

Das Script für den ESP32:

---
## ---------------------------------------------------------------------------
## WMBUS METER az-delivery-devkit-v4 + CC1101 for Diehl IZAR RC 868 I R4 PL
## Hardware: ESP32 240MHz, 520KB RAM, 4MB Flash
##
## this version shows all watermeters. Use this for the first test
##
##  1. uses the latest wmbusmeter component from github
##  2. Optional uses syslog component
##
##  SYSLOG:  tail -f /var/log/syslog | grep "water-meter"
##
## ---------------------------------------------------------------------------
substitutions:

  ## device settings
  device_name_short: "esphome-kaltwasser"
  device_description: "Wasserzähler QWater"
  projectname: "QWater.Watermeter"
  appversion: "2.0.7"

  ## all watermeters   wmid: "0"
  ## your watermeter: wmid: !secret watermeterId
  wmid: !secret watermeterId

  ## logger settings
  log_level: "DEBUG"  # not that logging need memory, so in production mode use "WARN"
  log_wmbus: "DEBUG" # Loglevel for wmbus meters component
  log_baudrate: "0" # 0 disable uart logger messages

## ----------------------------------------------------------------
## APPLICATION ESPHOME
## ----------------------------------------------------------------
esphome:
  name: ${device_name_short}
  comment: ${device_description}
  # Automatically add the mac address to the name
  # so you can use a single firmware for all devices
  name_add_mac_suffix: false
  project:
    name: ${projectname}
    version: ${appversion}
  build_path: ./build/${device_name_short}
  on_boot:
    priority: 200
    then:
      - globals.set:
          id: boot_counter
          value: !lambda "return id(boot_counter)+=1;"
      - logger.log:
          level: INFO
          tag: "system"
          format: "BOOTMESSAGE:${device_name_short} API is connected, Device ready!"
      - component.update: bootcounter
  on_shutdown:
    priority: 700
    then:
      - logger.log:
          level: ERROR
          tag: "system"
          format: "BOOTMESSAGE:${device_name_short} is down!"

## ----------------------------------------------------------------
## HARDWARE az-delivery-devkit-v4
##          ESP32 240MHz, 520KB RAM, 4MB Flash
## ----------------------------------------------------------------
esp32:
  board: az-delivery-devkit-v4
  framework:
    type: arduino

## ----------------------------------------------------------------
## EXTERNAL COMPONENTS
## ----------------------------------------------------------------
external_components:
  - source: github://SzczepanLeon/esphome-components@main
    components: [ wmbus ]

## ----------------------------------------------------------------
## Global variables
## ----------------------------------------------------------------
globals:

  - id: boot_counter
    type: int
    restore_value: yes
    initial_value: "0"

  - id: last_value
    type: float
    restore_value: yes
    initial_value: "0.00"

  - id: alarm_error_text
    type: std::vector<std::string>
    restore_value: no
    initial_value: '{"no error", "general_alarm","leakage","meter_blocked","back_flow","underflow","overflow","submarine","sensor_fraud","mechanical_fraud"}'

## ---------------------------------------------------
## WIFI Settings 3 wifis
## ---------------------------------------------------
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  domain: !secret domain

## ---------------------------------------------------
## mDNS Component
## ---------------------------------------------------
mdns:
  # if mDNS is disabled, they will no longer be able to automatically find your devices.
  disabled: false

## ---------------------------------------------------
## The captive portal component in ESPHome is a
## fallback mechanism for when connecting to the
## configured WiFi fails.
## ---------------------------------------------------
captive_portal:

## ---------------------------------------------------
## LOGGER COMPONENT
## ---------------------------------------------------
logger:
  id: appslogger
  level: ${log_level}
  baud_rate: ${log_baudrate}
  logs:
    wmbus: ${log_wmbus}
    wMBus-lib: ${log_wmbus}

## ---------------------------------------------------
## OTA COMPONENT
## ---------------------------------------------------
ota:
  password: !secret waterota
  safe_mode: false
  on_begin:
    then:
      - logger.log:
          format: "OTA Start"
          tag: "OTA"
          level: WARN
  on_progress:
    then:
      - logger.log:
          level: WARN
          tag: "OTA"
          format: "OTA progress %0.1f%%"
          args: ["x"]
  on_end:
    then:
      - logger.log:
          format: "OTA End"
          tag: "OTA"
          level: WARN
  on_error:
    then:
      - logger.log:
          format: "OTA update error %d"
          tag: "OTA"
          level: ERROR
          args: ["x"]

## ---------------------------------------------------
## COMPONENT WEBSERVER
## ---------------------------------------------------
web_server:
  port: 80
  version: 3

## ---------------------------------------------------
## Home Assistant API COMPONENT
## ---------------------------------------------------
api:
  id: espapi_wmbus_esp32
  port: 6053
  reboot_timeout: 0s

## ---------------------------------------------------
## SNTP COMPONENT
## ---------------------------------------------------
time:
  - platform: sntp
    id: time_sntp
    timezone: Europe/Berlin
    servers:
      - 0.at.pool.ntp.org
      - 0.pool.ntp.org
      - 1.pool.ntp.org
    on_time_sync:
      then:
        - logger.log:
            tag: "system"
            level: INFO
            format: "Synchronized sntp clock"

wmbus:
  mosi_pin: GPIO23    ## SI:   braun
  miso_pin: GPIO19    ## SO:   grün
  clk_pin: GPIO18     ## SCLK: violett
  cs_pin: GPIO05      ## CSN:  orange
  gdo0_pin: GPIO16    ## GD00: gelb (rx)
  gdo2_pin: GPIO17    ## GD02: weiss (tx)

  # log_unknown (Optional): Show telegrams from not configured meters in log.
  # Defaults to False
  log_unknown: false
  sync_mode: true

## ---------------------------------------------------
## SWITCHES
## ---------------------------------------------------
switch:
  # reset boot counter value
  - platform: template
    name: Device Boot Counter reset
    turn_on_action:
      then:
        - lambda: |-
            id(boot_counter) = 0;
            id(bootcounter).publish_state(id(boot_counter));
        - logger.log:
            level: WARN
            tag: "system"
            format: "${device_name_short} reset boot counter o.k!"
        - component.update: bootcounter

  - platform: safe_mode
    name: "Device Restart (Safe Mode)"

  - platform: restart
    name: "Restart"
    id: restart_switch

  - platform: factory_reset
    name: Device Restart Factory

## ---------------------------------------------------
## SENSORS
## ---------------------------------------------------
sensor:

  - platform: wmbus
    # Meter ID (usually from sticker). Can be specified as decimal or hex.
    # only hex is working for my watermeter !
    # see: https://github.com/SzczepanLeon/esphome-components/issues/6
    # edit watermeterid in the secrets file
    meter_id: ${wmid}
    type: qwater
    add_prefix: true
    mode: C1
  
    # The LQI value reported by the CC1101 is a 7 bit unsigned number with a range from 0 to 127.
    # Note that a lower value indicates a better link.
    # The LQI of a received packet will be bad (higher number) when there is lot of interference.
    lqi:
      id: wmbus_cc1101_lqi
      name: "Watermeter CC1101 LQI"
      unit_of_measurement: "lqi"
      entity_category: "diagnostic"

    # The RSSI value reported by the CC1101 is a 8 bit signed number with an effective
    # range from -138 dBm to -10.5 dBm when the CC1101 is operating around 868 MHz.
    # RSSI stands for received signal strength (power) indication (in dBm).
    # A higher value indicates higher power.
    rssi:
      id: wmbus_cc1101_rssi
      name: "Watermeter CC1101 RSSI"
      unit_of_measurement: "%"
      entity_category: "diagnostic"

    # reports the watermeter display value
    total_water_m3:
      id: "waterdisplay"
      name: "Wasseruhr"
      unit_of_measurement: "m³"
      state_class: total_increasing
      device_class: "water"
      accuracy_decimals: 3
      # update and calulatet all watermeter data values
      on_value:
        then:
          - lambda: |-
              ESP_LOGI("wmbus", "Water Display value: %.3f, last value: %.3f", id(waterdisplay).state, id(last_value));
              id(last_value)=id(waterdisplay).state;

  # Wifi quality RSSI, internal used to calculate the Wifi quality RSSI in percentage
  - platform: wifi_signal
    id: wifi_signal_db
    update_interval: 60s
    internal: true
    disabled_by_default: true

  # Wifi quality RSSI in percentage
  # Received Signal Strength (RSSI) is a measure of incoherent
  ## (raw) RF power in a channel.
  - platform: copy # Reports the WiFi signal strength in %
    source_id: wifi_signal_db
    name: "Device WLAN Signal"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "%"
    entity_category: "diagnostic"

  # device boot counter
  - platform: template
    name: Device Boot counter
    id: bootcounter
    icon: mdi:counter
    accuracy_decimals: 0
    state_class: "measurement"
    entity_category: "diagnostic"
    lambda: return (id(boot_counter));

Die Einträge in der Secrets entsprechend anpassen und aufpassen, dass die ID der Wasseruhr ein 0x vorangestellt wird. Hatte mehrere Variationen ausprobiert. Diese hier funktioniert.

watermeterId: "0x12345678"
watermetersecret: ""

waterota: "hier ein OTA Kennwort vergeben"

domain: ".local"

Viel Erfolg beim ausprobieren :slight_smile:

Hallo @andifidi

was hast du jetzt geändert, dass es auf einmal geht bei dir?
Wie bekommst du nun den korrekten m³ Verbrauch übermittelt?

Sein Zähler ist nicht verschlüsselt. Poste mal deine Konfig, bzw hast du mal ein komplettes Protokoll?

Hallo @meloneA
ok das ist nämlich auch meine Annahme, allerdings scheint es, als wäre in dem Frame, welches gesendet wird, ein herstellerspezifischer Inhalt, der nicht gelesen werden kann, wodurch die Werte nicht korrekt sind.

Siehe hier: WMBusmeters Analyze Telegram

Welchen mode verwendest du aktuell?

Qundis hat sein eigenes Protokoll, die Zähler können aber beide gleichzeitig nutzen. Du brauchst mMn einen Key von deinem Wasserwerk.

Der Zähler läuft im C-Modus. Meinst du mit Key den Decription Key, obwohl es an sich nicht “verschlüsselt” ist?

Hi @sippeeey, habe den Modus T1 auf C1 geändert und dann hat es funktioniert.
Ich bekomme die aktuelle Anzeige (Gesamt m3) ausgelesen und kann mit Helfern den Tages bzw. Monatsverbrauch ermitteln. Die Werte stimmen absolut. Auf der Energiekarte scheint es aber nicht korrekt mit der Auswertung zu funktionieren. Das ist aber egal, da die Helfer bis jetzt ganz gut laufen.