Komponent IoTLabs-pl wM-Bus do ESPHome

Cześć,

Mam Magic Reader v5 (ESP32-POE + SX1276) z komponentem IoTLabs (main branch, wmbusmeters 1.20.0). Liczniki wody apator162 działają bez problemu. Problem dotyczy licznika prądu Elgama Gama 350.

Objawy

  • Radio odbiera ramki 191 bajtów z Gama 350 (Try to make frame from packet t1 of size 191)
  • Ale nigdy nie pojawia się Frame created — ramka jest cicho odrzucana
  • Drivery ładują się poprawnie: amiplus + apator162
  • Ten sam telegram dekoduje się bezbłędnie na wmbusmeters.org — klucz OK, driver amiplus 66/91 match
  • Bez zdefiniowanego metera amiplus (same wodomierze) ramka 191 bajtów parsuje się poprawnie: Frame created (191 bytes), Telegram handled by 0 handlers — problem pojawia się dopiero po dodaniu metera amiplus

Dekodowanie na wmbusmeters.org

Meter: amiplus, Manufacturer: EGM (Elgama), Type: Electricity
- total_energy_consumption_kwh: 6768.166
- total_energy_production_kwh: 3857.112
- current_power_production_kw: 6.552
- voltage_at_phase_1/2/3_v: 239/233/237

Log

[C][wmbus_common:028]:     - amiplus
[C][wmbus_common:028]:     - apator162

[D][wmbus:181]: Try to make frame from packet t1 of size 191   ← Gama 350, brak "Frame created"
[D][wmbus:181]: Try to make frame from packet t1 of size 110
[I][wmbus:047]: Frame created (63 bytes) [RSSI: -63, mode:t1]  ← apator162 działa OK
[S][sensor]: 'Main water meter - value' >> 1746.67 m³

Konfiguracja

external_components:
  - source:
      type: git
      url: https://github.com/IoTLabs-pl/esphome-components

wmbus_meter:
  - id: electricity_meter
    meter_id: XXXXXXXX
    type: amiplus
    key: "<klucz hex 32 znaki, działa na wmbusmeters.org>"

ESPHome 2026.6.2, ESP-IDF 5.5.4.

Czy ktoś ma działającą Gamę 350 na komponencie IoTLabs? Wygląda na problem z parserem dłuższych ramek T1 (191 bajtów vs 110 bajtów dla apator162).

Dzięki za zgłoszenie także na GH.

Przyjrzymy się problemowi w miarę możliwości.

Generalnie mamy w instalacji testowej Gamę 350 ze 191 bajtowymi komunikatami i nie ma/nie było z nią nigdy większych problemów.

Jak działa to może ja mam config zły?

@kubasa czy masz może jakiś pomysł na problem z ultrimis?

Masz dobry tylko nie masz narzędzia by to zdiagnozować.

Pomysł na ultrimis jest dość prosty: w generatorze xmq->cpp jest jakiś błąd. Niestety nie mam możliwości się nim zająć w jakimś przewidywalnym okresie czasu: priorytetem jest jednak wsparcie własnych urządzeń plus tysiąc innych rzeczy którymi muszę się zająć w bieżącej pracy. Zawsze możesz spróbować napuścić na to jakiegoś Codexa czy innego Claude Code. Prawdopodobnie pomoże, ale będziesz prawdopodobnie musiał sobie zestawić lokalne środowisko do jego odpalenia, żeby pooglądać wygenerowane pliki cpp.

Konfig do amiplusa jest prawdopodobnie okej, tak jak napisał Krzysztof, ale tak na sto procent, to ciężko przewidzieć go nie widząc.
Przyczyną może być dużo różnych rzeczy: pamięć zaalokowana w SPIRAM zamiast w środku ESPa, wysoko priorytetowe operacje które trzeba wykonać na porcie ETH żeby nie utracić połączenia internetowego, które muszą być zrobione w określonym czasie i dowolne inne rzeczy o których pewnie tak na pierwszy rzut oka ciężko powiedzieć.

Mogę potwierdzić jedynie, że szybki test z konfigiem amiplus+apator162, po jednej encji z każdego, na biurku przechodzi mi bez problemów. Ale to biurko, konkretne ramki testowe, konkretny soft, urządzenie i tak dalej.

Chat sugeruje, że to problem z wyścigiem/timeoutem. Zdarzyło mi się odczytać ramkę, jeśli był włączony VERBOSE. Chat sugeruje, że przez to działanie było spowolnione i był w stanie dostać całość… A ile to ma sensu, to nie wiem :frowning:

Verbose czy nawet Very Verbose to nie diagnostyka tylko dokładanie roboty dla ESP.

Jakby co sprawdzałem na apator162 i amiplus ale brak danych, chociaż widać telegramy w logu. @kubasa kiedy mógłbyś zerknąć na kod dla ultrimis?

Mam trzy liczniki nadające w standardzie wM-Bus:

  • APATOR Telemetria APT-ELF2-WMBUS-1
  • APATOR Telemetria AT-WMBUS-16-2
  • od wczoraj dodatkowo ELGAMA GAMA 350 Typ G35

Wcześniej w tym wątku opisywałem problemy z driverem elf2, ale po poprawkach wszystko działa prawidłowo. Z pewnymi obawami wczoraj zabrałem się za licznik prądu i poszło prawie od strzału. To ‘prawie’ to konieczność wyczyszczenia projektu bo driver amiplus się nie ładował — po esphome clean ... natychmiast ruszyło. A do licznika prądu mam ok. 10m i RSSI ok. -84 dBm. Odbiornik to Magic Reader v5 z radiem SX1276.

Działający YAML:

substitutions:
  name: "wmbus-reader-v5"
  friendly_name: "WMBUS Reader V5"

esphome:
  name: "${name}"
  friendly_name: "${friendly_name}"

esp32:
  board: nodemcu-32s
  framework:
    type: esp-idf
    advanced:
      minimum_chip_revision: "3.1"
      sram1_as_iram: true

external_components:
  - source:
      type: git
      url: https://github.com/IoTLabs-pl/esphome-components
      ref: v1.2.1
    components:
      - wmbus_common
      - wmbus_meter
      - wmbus_radio

wmbus_common:
  drivers:
    - elf2
    - apator162
    - amiplus

logger:
  level: WARN

api:
  encryption:
    key: !secret api_encryption_key

ota:
  - platform: esphome
    password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  output_power: 18dB

  ap:
    ssid: "Wmbus-Reader-V5 Fallback Hotspot"
    password: !secret wifi_password

captive_portal:

spi:
  clk_pin: GPIO33
  mosi_pin: GPIO32
  miso_pin: GPIO19

wmbus_radio:
  radio_type: SX1276
  cs_pin: GPIO23
  reset_pin: GPIO22
  irq_pin: GPIO21

wmbus_meter:
  - id: licznik_ciepla
    meter_id: 12345678
    type: elf2
    key: !secret key_cieplo

  - id: licznik_wody
    meter_id: 12345678
    type: apator162
    key: !secret key_woda

  - id: licznik_pradu
    meter_id: 12345678
    type: amiplus
    key: !secret key_prad

binary_sensor:
  - platform: status
    name: "WMBus Reader Status"
    entity_category: diagnostic

text_sensor:
  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz status"
    field: status
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_pradu
    name: "Licznik prądu data i czas"
    field: device_date_time
    entity_category: diagnostic

sensor:
  - platform: wmbus_meter
    parent_id: licznik_ciepla
    field: rssi_dbm
    name: Licznik ciepła RSSI
    unit_of_measurement: "dBm"
    accuracy_decimals: 0
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_wody
    field: rssi_dbm
    name: Licznik wody RSSI
    unit_of_measurement: "dBm"
    accuracy_decimals: 0
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_wody
    field: total_m3
    name: Licznik wody stan
    device_class: water
    state_class: total_increasing
    unit_of_measurement: "m³"
    accuracy_decimals: 3

  - platform: uptime
    id: esp_uptime
    name: "WMBus Reader – uptime"
    update_interval: 30s
    entity_category: diagnostic

  - platform: wifi_signal
    name: "WMBUS Reader WiFi RSSI"
    id: wmbus_reader_wifi_rssi
    update_interval: 60s
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz energia"
    field: total_energy_kwh
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz moc chwilowa"
    field: current_power_kw
    unit_of_measurement: "kW"
    device_class: power
    state_class: measurement
    accuracy_decimals: 3
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz objętość czynnika"
    field: total_volume_m3
    unit_of_measurement: "m³"
    device_class: volume
    state_class: total_increasing
    accuracy_decimals: 3
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz przepływ"
    field: current_volume_flow_m3h
    unit_of_measurement: "m³/h"
    state_class: measurement
    accuracy_decimals: 3
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz zasilanie"
    field: t1_temperature_c
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_ciepla
    name: "Ciepłomierz powrót"
    field: t2_temperature_c
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 1
    entity_category: diagnostic

  - platform: wmbus_meter
    id: licznik_pradu_energia_pobrana
    parent_id: licznik_pradu
    name: "Licznik prądu energia pobrana"
    field: total_energy_consumption_kwh
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    accuracy_decimals: 3

  - platform: wmbus_meter
    id: licznik_pradu_moc_chwilowa
    parent_id: licznik_pradu
    name: "Licznik prądu moc chwilowa"
    field: current_power_consumption_kw
    unit_of_measurement: "kW"
    device_class: power
    state_class: measurement
    accuracy_decimals: 3
    entity_category: diagnostic

  - platform: wmbus_meter
    id: licznik_pradu_rssi
    parent_id: licznik_pradu
    name: "Licznik prądu RSSI"
    field: rssi_dbm
    unit_of_measurement: "dBm"
    device_class: signal_strength
    state_class: measurement
    accuracy_decimals: 0
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_pradu
    name: "Licznik prądu napięcie L1"
    field: voltage_at_phase_1_v
    unit_of_measurement: "V"
    device_class: voltage
    state_class: measurement
    accuracy_decimals: 0
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_pradu
    name: "Licznik prądu napięcie L2"
    field: voltage_at_phase_2_v
    unit_of_measurement: "V"
    device_class: voltage
    state_class: measurement
    accuracy_decimals: 0
    entity_category: diagnostic

  - platform: wmbus_meter
    parent_id: licznik_pradu
    name: "Licznik prądu napięcie L3"
    field: voltage_at_phase_3_v
    unit_of_measurement: "V"
    device_class: voltage
    state_class: measurement
    accuracy_decimals: 0
    entity_category: diagnostic

ESPHome: 2026.5.2, ESP-IDF: 5.5.4

1 Like

Przeszedłem z wersji komponentu v1.2.2 na v1.2.4, zmieniając jedynie:

external_components:
  - source:
      type: git
      url: https://github.com/IoTLabs-pl/esphome-components
      ref: v1.2.4

Sama aktualizacja komponentu nie spowodowała u mnie żadnych problemów. Konfiguracja skompilowała się prawidłowo, urządzenie uruchomiło się, a wszystkie trzy liczniki — ciepła, wody i energii elektrycznej — były poprawnie odbierane i dekodowane.

Problemy pojawiły się dopiero po aktualizacji ESPHome z 2026.5.2 do 2026.7.3.

Kompilacja nadal kończyła się sukcesem, ale pojawiło się kilka ostrzeżeń kompilatora dotyczących kodu komponentu i wmbusmeters. Znacznie ważniejsze było jednak zachowanie urządzenia po wgraniu firmware.

W logu zaczęły pojawiać się niemal bez przerwy komunikaty:

[W][wmbus:091][radio_recv]: Failed to read data

Czasami występowały po kilka razy w ciągu jednej sekundy.

Jednocześnie wyraźnie pogorszyła się skuteczność odbioru telegramów:

  • ciepłomierz, normalnie odbierany mniej więcej co 16 sekund, zaczął mieć przerwy po 30–60 sekund, a czasami znacznie dłuższe;
  • licznik energii elektrycznej, normalnie odbierany raz na minutę, był odbierany tylko sporadycznie;
  • wodomierz również pojawiał się rzadziej;
  • wartości RSSI poprawnie odebranych telegramów pozostawały normalne;
  • urządzenie nie wykazywało problemów z pamięcią, a uptime rósł bez restartów.

Dla sprawdzenia wróciłem do ESPHome 2026.5.2 (komponent IoTLabs w wersji v1.2.4).

Po ponownej kompilacji i wgraniu firmware problem zniknął natychmiast:

  • nie pojawiały się komunikaty Failed to read data;
  • ciepłomierz był odbierany przeważnie co około 16 sekund, sporadycznie po około 32 sekundach;
  • licznik prądu był odbierany niemal zawsze co 60 sekund; w kilkunastominutowym logu wypadł jeden telegram;
  • wodomierz również był odbierany w marę regularnie — kilka razy w ciągu kilkunastu minut, choć odstępy między telegramami nie były stałe;
  • nie było restartów ani rollbacku OTA.

Podsumowując: przejście z komponentu v1.2.2 na v1.2.4 przebiegło u mnie bezproblemowo. Kłopoty z odbiorem pojawiły się po aktualizacji ESPHome do 2026.7.3, natomiast po powrocie do ESPHome 2026.5.2 odbiór ponownie działa prawidłowo.

Badamy temat. Postaramy się to podfiksować do końca tygodnia
(Failed to read data after updating ESPHome past v2026.7.0 · Issue #59 · IoTLabs-pl/wM-Bus-Gateway · GitHub)

Wydaje mi się (i paru innym osobom), że 1.2.5 rozwiązuje problem. Jednak nigdy nie jest za późno, żeby uzmysłowić sobie jak działa opóźnienie w RTOSie :wink:

Dla Ultrimis nadal błąd w wersji 1.2.5