## --------------------------------------------------------------------------- ## 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 ## ## ## --------------------------------------------------------------------------- substitutions: ## device settings device_name_short: "water-meter-esp" device_description: "Wasserzähler ESP32 + CC1101 (Diehl IZAR RC 868 I R4 PL) - alle Wasserzähler" projectname: "Diehl IZAR RC 868.Watermeter" appversion: "3.0.0" esphome_version: "2025.9.1" last_test: "2026-01-22 14:00" ## all watermeters wmid: "0" ## your watermeter: wmid: !secret watermeterId wmid: "0" ## 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: "115200" # 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: 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: 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 ## https://esphome.io/components/external_components.html ## ------------------------------------------------------------------ external_components: # uses the version 3 from SzczepanLeon (github) # https://github.com/SzczepanLeon/esphome-components # You can make ESPHome check the repository every time by setting this option to 0s - source: github://SzczepanLeon/esphome-components@version_3 refresh: 0s 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 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: networks: - ssid: !secret ssid3_name password: !secret ssid3_pswd priority: 0 - ssid: !secret ssid1_name password: !secret ssid1_pswd priority: 1 - ssid: !secret ssid2_name password: !secret ssid2_pswd priority: 2 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 ota_pswd platform: esphome 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 ## --------------------------------------------------- ## 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 CC1101 --> ESP32 az-delivery-devkit-v4 ## ------------------------------------------------------------------ ## ## ## o 1 (3.3V) ## | ## ╭――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――x――o―╮ ## | | ## | | ## - | 5v az-delivery-devkit-v4 | -- ANT ## | | ## | 16 17 5 18 19 23 | ## ╰――x――x――x――x――x――x――x――x――o――x――o――o――o――o――o――o――o――o――o――o―╯ ## | | | | | | | ## o | | o | | ╰-o - 2 (GND) ## 7 o | 4 o o ## GDO0 6 | CLK 5 3 ## GD02 o MISO M0SI ## 8 ## CSN ## ## ------------------------------------------------------------------ wmbus: mosi_pin: GPIO23 ## SI: braun miso_pin: GPIO19 ## SO: grün clk_pin: GPIO18 ## SCLK: violett cs_pin: GPIO21 ## 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: 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: izar add_prefix: true # 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: "Watermeter Display" unit_of_measurement: "m³" state_class: total_increasing device_class: "water" accuracy_decimals: 3 icon: mdi:counter # 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; # get the last month total watermter m3 from the wmbus telegram (wM-Bus 2.1.10) last_month_total_water_m3: name: "Water last month" id: "waterdisplay_lastmonth" unit_of_measurement: "m³" state_class: total_increasing device_class: "water" accuracy_decimals: 3 icon: mdi:counter # water current month (wM-Bus v2.1.4) current_month_total_water_l: name: "Water current month" id: "watermonth" accuracy_decimals: 2 unit_of_measurement: "L" state_class: total_increasing device_class: "water" # get the battery life time (wM-Bus v2.1.4) remaining_battery_life_y: name: "Watermeter Battery Life" id: "watermeter_batterie" accuracy_decimals: 2 unit_of_measurement: "Years" icon: mdi:battery # get the last transmit periode (wM-Bus v2.1.4) transmit_period_s: name: "Watermeter transmit periode" id: "watermeter_transmit_periode" unit_of_measurement: "sec" accuracy_decimals: 2 icon: mdi:timelapse ## get the current watermeter alarms and publish the text message (wM-Bus 2.1.10) current_alarms: id: "watermeter_current_alarms" name: "Watermeter current alarm code" icon: mdi:alarm-light entity_category: "diagnostic" ## get the prevois watermeter alarms and publish the text message (wM-Bus 2.1.10) previous_alarms: id: "watermeter_previous_alarms" name: "Watermeter pervious alarm code" icon: mdi:alarm-light entity_category: "diagnostic" # 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));