Komponent wM-Bus do ESPHome wersja 4.x - vitkuv fork (ESP32-S3)

witam wszystkich, próbuję zrobić odbiornik wmbus na esp32-s3-wroom-1 P2N8 próbowałem też esp32-s3-N16R8 obie 44 pinowe + cc11010 próbowałem różnych konfiguracji pinów niestety po kompilacji płytka wpada w bootloop na watchdogu wywala się nawet gdy cc11010 jest fizycznie odłączony. Płytka sprawna bo jak zakomentuję wmbus to startuje bez jąknięcia. Miał ktoś podobne problemy? Esphome w wersji 2025.12.5

Udało mi się uruchomić na tej płytce z esphome 2025.12.7.
Problem leży w bibliotece SmartRC-CC1101-Driver-Lib a mianowicie w zahardkodowanyh wartościach, jest nawet na to zgłoszenie.
Najprostszy sposób to obejść, ręcznie zainicjalizować SPI dla CC1101 w pliku rf_cc1101.cpp.
Musisz sklonować repozytorium wmbus
git clone --single-branch --branch version_4 git@github.com:SzczepanLeon/esphome-components.git
I nałożyć mój patch rf_cc1101.zip (800 Bytes)

patch -p1 < rf_cc1101.cpp.patch

zmienić

external_components:
  - source: github://SzczepanLeon/esphome-components@version_4

na

external_components:
  - source:
      type: local
      path: esphome-components/components

mój yaml plik wygląda tak:

esphome:
  name: wmbusgw

esp32:
  board: esp32-s3-devkitc1-n16r8
  framework:
    type: arduino
  flash_size: 16MB

logger:
  level: DEBUG

api:
  password: ""

ota:
  - platform: esphome
    password: ""

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

external_components:
  - source:
      type: local
      path: esphome-components/components

time:
  - platform: sntp
    id: time_sntp

wmbus:
  mosi_pin: GPIO13
  miso_pin: GPIO11
  clk_pin:  GPIO12
  cs_pin:   GPIO09
  gdo0_pin: GPIO15
  gdo2_pin: GPIO16

  frequency: 868.950
  all_drivers: False
  sync_mode: False
  log_all: True

Cześć, czy możesz rozwinąć :


Może wykażę się kompletną niewiedzą ale jak to zrobić ?
"
Najprostszy sposób to obejść, ręcznie zainicjalizować SPI dla CC1101 w pliku rf_cc1101.cpp"

Zrobiłem osobne repo ze wszystkimi zmianami.
Teraz wystarczy zmienić ścieżkę do repo na:

external_components:
  - source: github://vitkuv/esphome-wmbus@version_4
5 polubień

Niestety nadal mam problem z kompilacją :

dołączam zrzut z błedem:

 INFO ESPHome 2025.5.2
INFO Reading configuration /config/esphome/licnik.yaml...
INFO Detected timezone 'Europe/Warsaw'
WARNING GPIO15 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Generating C++ source...
INFO Compiling app...
Processing licnik (board: esp32dev; framework: arduino; platform: platformio/espressif32@5.4.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Dependency Graph
|-- AsyncTCP-esphome @ 2.1.4
|-- WiFi @ 2.0.0
|-- FS @ 2.0.0
|-- Update @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.3.0
|-- DNSServer @ 2.0.0
|-- ESPmDNS @ 2.0.0
|-- noise-c @ 0.1.6
|-- SPI @ 2.0.0
|-- SmartRC-CC1101-Driver-Lib @ 2.5.7
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_abbb23.cpp.o
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_apatoreitn.cpp.o
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_apatorna1.cpp.o
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_auto.cpp.o
xtensa-esp32-elf-g++: fatal error: Killed signal terminated program as
compilation terminated.
*** [.pioenvs/licnik/src/esphome/components/wmbus/driver_abbb23.cpp.o] Error 1
========================= [FAILED] Took 11.12 seconds =========================

oraz yaml

esphome:
  name: licnik
  friendly_name: Licnik

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "/gE9nDw4tqboKmK3dB464oAVxo/YPXrGdDRnQnZubb4="

ota:
  - platform: esphome
    password: "56f801d3f3398d8fdfed913cc9d037cd"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Licnik Fallback Hotspot"
    password: "0JpwXT5eT8QI"

captive_portal:

time:
  - platform: sntp
    id: time_sntp
    
external_components:
  - source: github://vitkuv/esphome-wmbus@version_4
    components: [ wmbus ]

wmbus:
  mosi_pin: GPIO23
  miso_pin: GPIO19
  clk_pin:  GPIO18
  cs_pin:   GPIO15
  gdo0_pin: GPIO4
  gdo2_pin: GPIO27

  frequency: 868.950
  all_drivers: True
  sync_mode: True
  log_all: True

dodam, że próbowałem również wersji 2025.6.3 i wystąpił podobny problem

Popraw swój post, będzie czytelniej i można wyłapywać potencjalne błędy.

Pcem zrobić na początek Clean Build.

No tak wstawiam poprany yaml

esphome:
  name: licnik
  friendly_name: Licnik

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "/gE9nDw4tqboKmK3dB464oAVxo/YPXrGdDRnQnZubb4="

ota:
  - platform: esphome
    password: "56f801d3f3398d8fdfed913cc9d037cd"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Licnik Fallback Hotspot"
    password: "0JpwXT5eT8QI"

captive_portal:

time:
  - platform: sntp
    id: time_sntp
    
external_components:
  - source: github://vitkuv/esphome-wmbus@version_4
    components: [ wmbus ]

wmbus:
  mosi_pin: GPIO23
  miso_pin: GPIO19
  clk_pin:  GPIO18
  cs_pin:   GPIO15
  gdo0_pin: GPIO4
  gdo2_pin: GPIO27

  frequency: 868.950
  all_drivers: True
  sync_mode: True
  log_all: True

i jeszcze kod błędu:

INFO ESPHome 2025.5.2
INFO Reading configuration /config/esphome/licnik.yaml...
INFO Detected timezone 'Europe/Warsaw'
WARNING GPIO15 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Generating C++ source...
INFO Compiling app...
Processing licnik (board: esp32dev; framework: arduino; platform: platformio/espressif32@5.4.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Dependency Graph
|-- AsyncTCP-esphome @ 2.1.4
|-- WiFi @ 2.0.0
|-- FS @ 2.0.0
|-- Update @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.3.0
|-- DNSServer @ 2.0.0
|-- ESPmDNS @ 2.0.0
|-- noise-c @ 0.1.6
|-- SPI @ 2.0.0
|-- SmartRC-CC1101-Driver-Lib @ 2.5.7
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_abbb23.cpp.o
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_c5isf.cpp.o
Compiling .pioenvs/licnik/src/esphome/components/wmbus/driver_cma12w.cpp.o
xtensa-esp32-elf-g++: fatal error: Killed signal terminated program as
compilation terminated.
*** [.pioenvs/licnik/src/esphome/components/wmbus/driver_abbb23.cpp.o] Error 1
========================= [FAILED] Took 10.44 seconds =========================

W jaki sposób masz uruchomiony ESPHome Device Builder? Może brakuje pamięci RAM podczas kompilacji, bo ten log by to sugerował:

xtensa-esp32-elf-g++: fatal error: Killed signal terminated program as
compilation terminated

Proces został ubity…

1 polubienie

ESPHome zainstalowany wewnątrz HA, próbowałem również kompilacji przez narzędzie " ESPHome Online Compiler" niestety z takim samym rezultatem.

Zwiększyłem obszar przydzielonej pamięci , kompilacja ruszyła dalej jednak otrzymuję nowe błędy:

INFO Reading configuration /config/esphome/licnik.yaml...
INFO Detected timezone 'Europe/Warsaw'
WARNING GPIO15 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Generating C++ source...
INFO Compiling app...
Processing licnik (board: esp32dev; framework: arduino; platform: platformio/espressif32@5.4.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Dependency Graph
|-- AsyncTCP-esphome @ 2.1.4
|-- WiFi @ 2.0.0
|-- FS @ 2.0.0
|-- Update @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.3.0
|-- DNSServer @ 2.0.0
|-- ESPmDNS @ 2.0.0
|-- noise-c @ 0.1.6
|-- SPI @ 2.0.0
|-- SmartRC-CC1101-Driver-Lib @ 2.5.7
Compiling .pioenvs/licnik/src/esphome/components/wmbus/wmbus.cpp.o
Compiling .pioenvs/licnik/src/esphome/core/helpers.cpp.o
In file included from src/esphome/components/web_server_base/web_server_base.h:11,
                 from src/esphome/components/captive_portal/captive_portal.h:11,
                 from src/esphome/components/wmbus/wmbus.cpp:13:
.piolibdeps/licnik/ESPAsyncWebServer-esphome/src/ESPAsyncWebServer.h:280:68: warning: 'warning_x' attribute directive ignored [-Wattributes]
     const String& ASYNCWEBSERVER_REGEX_ATTRIBUTE pathArg(size_t i) const;
                                                                    ^~~~~
src/esphome/components/wmbus/wmbus.cpp:18:48: note: #pragma message: Loop task stack increased.
 #pragma message ( "Loop task stack increased." )
                                                ^
Compiling .pioenvs/licnik/src/esphome/core/log.cpp.o
src/esphome/components/wmbus/wmbus.cpp: In member function 'virtual void esphome::wmbus::WMBusComponent::loop()':
src/esphome/components/wmbus/wmbus.cpp:145:42: error: 'class esphome::sensor::Sensor' has no member named 'get_unit_of_measurement_ref'; did you mean 'get_unit_of_measurement'?
                   else if (field.second->get_unit_of_measurement_ref().empty()) {
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
                                          get_unit_of_measurement
src/esphome/components/wmbus/wmbus.cpp:149:60: error: 'class esphome::sensor::Sensor' has no member named 'get_unit_of_measurement_ref'; did you mean 'get_unit_of_measurement'?
                     Unit field_unit = toUnit(field.second->get_unit_of_measurement_ref());
                                                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                            get_unit_of_measurement
*** [.pioenvs/licnik/src/esphome/components/wmbus/wmbus.cpp.o] Error 1
========================== [FAILED] Took 7.24 seconds ==========================

W Twoim logu widzę: Processing licnik (board: esp32dev; framework: arduino; platform: platformio/espressif32@5.4.0)

Używasz starej wersji platform. Przy nowych komponentach (wmbus z 2025 roku) i nowszych wersjach ESPhome, biblioteki takie jak ESPAsyncWebServer mogą sypać ostrzezeniami lub błędami jeśli framework arduino jest zbyt stary.

Spróbuj w kodzie podbić wersję:

esp32:
  board: esp32dev
  framework:
    type: arduino
  platform: platformio/espressif32@^6.0.0

Masz ustawione all_drivers: True. Komponent wmbus dla ESPHome zawiera dziesiątki sterowników dla różnych liczników (Apator, Izar, Itron itd.). Każdy z nich to osobny plik który musi zostać skompilowany.

Jeśli wiesz, jaki masz licznik, wyłącz all_drivers i dodaj tylko konkretny sterownik. Jeśli nie wiesz, spróbuj chociaż ograniczyć listę zamiast ładować wszystko:

wmbus:
  # ... piny ...
  all_drivers: False
  # Zamiast all_drivers, dodaj tylko te, których potrzebujesz, np.:
  # drivers:
  #   - name: apator08
  #   - name: izar

Ostrzeżenie o Strapping Pin (GPIO15)

To nie błąd kompilacj ale błąd sprzętowy . GPIO15 na ESP32 decyduje o trybie bootowania. Jeśli masz tam podłączony CS od CC1101 a moduł w momencie startu wymusi tam stan niski/wysoki, ESP32 może nie wystartować (wejść w bootloop).

Jeśli masz wolne inne piny, przenieś cs_pin z GPIO15 na np. GPIO5 lub inny nie-strapping pin.

Jak to zrobisz powinno zaddziałać.

ale korzystasz z forka dla S3 (inny procesor) i nie rozumiem dlaczego, bo ta definicja płytki nie pasuje do S3

1 polubienie

Postąpiłem zgodnie z wskazówkami kompilacja rusza dalej jednak tym razem zatrzymuje się na wbus

INFO Reading configuration /config/esphome/licnik.yaml...
INFO Detected timezone 'Europe/Warsaw'
WARNING GPIO5 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Generating C++ source...
INFO Compiling app...
Processing licnik (board: esp32dev; framework: arduino; platform: platformio/espressif32@6.0.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Dependency Graph
|-- AsyncTCP-esphome @ 2.1.4
|-- WiFi @ 2.0.0
|-- FS @ 2.0.0
|-- Update @ 2.0.0
|-- ESPAsyncWebServer-esphome @ 3.3.0
|-- DNSServer @ 2.0.0
|-- ESPmDNS @ 2.0.0
|-- noise-c @ 0.1.6
|-- SPI @ 2.0.0
|-- SmartRC-CC1101-Driver-Lib @ 2.5.7
Compiling .pioenvs/licnik/src/esphome/components/wmbus/wmbus.cpp.o
Compiling .pioenvs/licnik/src/esphome/core/component.cpp.o
In file included from src/esphome/components/web_server_base/web_server_base.h:11,
                 from src/esphome/components/captive_portal/captive_portal.h:11,
                 from src/esphome/components/wmbus/wmbus.cpp:13:
.piolibdeps/licnik/ESPAsyncWebServer-esphome/src/ESPAsyncWebServer.h:280:68: warning: 'warning_x' attribute directive ignored [-Wattributes]
     const String& ASYNCWEBSERVER_REGEX_ATTRIBUTE pathArg(size_t i) const;
                                                                    ^~~~~
Compiling .pioenvs/licnik/src/esphome/core/component_iterator.cpp.o
src/esphome/components/wmbus/wmbus.cpp:18:48: note: #pragma message: Loop task stack increased.
 #pragma message ( "Loop task stack increased." )
                                                ^
src/esphome/components/wmbus/wmbus.cpp: In member function 'virtual void esphome::wmbus::WMBusComponent::loop()':
src/esphome/components/wmbus/wmbus.cpp:145:42: error: 'class esphome::sensor::Sensor' has no member named 'get_unit_of_measurement_ref'; did you mean 'get_unit_of_measurement'?
                   else if (field.second->get_unit_of_measurement_ref().empty()) {
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
                                          get_unit_of_measurement
src/esphome/components/wmbus/wmbus.cpp:149:60: error: 'class esphome::sensor::Sensor' has no member named 'get_unit_of_measurement_ref'; did you mean 'get_unit_of_measurement'?
                     Unit field_unit = toUnit(field.second->get_unit_of_measurement_ref());
                                                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                            get_unit_of_measurement
*** [.pioenvs/licnik/src/esphome/components/wmbus/wmbus.cpp.o] Error 1
========================== [FAILED] Took 6.79 seconds ==========================

To już konkretny błąd programistyczny, a nie problem z brakiem pamięci. Dobra wiadomość jest taka, że wiemy dokładnie, co się dzieje.

Błąd error: 'class esphome::sensor::Sensor' has no member named 'get_unit_of_measurement_ref' wynika z niedopasowania wersji (API mismatch). W repozytorium, którego używasz (vitkuv/esphome-wmbus@version_4), autor użył nowszych funkcji rdzenia ESPHome (wprowadzonych w wersjach dev/beta), których nie ma w Twojej wersji ESPHome 2025.5.2.
W starszych wersjach ESPHome funkcja ta nazywała się get_unit_of_measurement(), a w nowszych dodano _ref dla optymalizacji.

Jak to naprawić?

Masz dwie drogi, ale polecam opcję 1, bo jest najszybsza:

Opcja 1: Aktualizacja ESPHome (Zalecane)

Błąd sugeruje, że Twój komponent oczekuje standardów z okolic wersji ESPHome 2025.10+. Skoro masz wersję 2025.5.2, jesteś “do tyłu” o kilka miesięcy zmian w API.

  • Zaktualizuj dodatek (Add-on) ESPHome w Home Assistant do najnowszej dostępnej wersji (obecnie powinna to być 2025.12.x lub nowsza).
  • Po aktualizacji spróbuj skompilować ponownie.

Opcja 2: Zmiana wersji komponentu (Jeśli nie chcesz aktualizować ESPHome)

Jeśli z jakiegoś powodu musisz zostać na ESPHome 2025.5.2, spróbuj użyć stabilniejszej, nieco starszej gałęzi komponentu od oryginalnego autora, która nie miała jeszcze tych zmian w kodzie:

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

Uwaga: Pamiętaj, że wracając do main u SzczepanLeona, możesz znów trafić na problem z SPI na ESP32-S3, o którym pisał @Witek Witek w swoim poście.

W logu widzę: WARNING GPIO5 is a strapping PIN... Teraz używasz GPIO5 jako cs_pin. Na klasycznym ESP32 (nie S3) GPIO5 to pin decydujący o napięciu flasha lub trybie bootowania. Jeśli kompilacja przejdzie, a płytka nadal nie będzie chciała wstać (bootloop), zmień ten pin na inny, np. GPIO2 (jeśli wolny) lub dowolny powyżej GPIO16 (np. 21, 22). [Tak w tamtym poprzednim poście jednak się pomyliłem sorry]

To jest OK,
CS jest w tu wyjściem MCU, więc w tym wypadku ostrzeżenie można zignorować (MCU w trakcie inicjalizacji nie wystawi sobie tam poziomu, który będzie kolidował z bootstrapem).

akurat GPIO2 w wielu modelach płytek jest na sztywno wyjściem kontrolki LED (i to może wywoływać konflikty, bo dioda jest zwykle wpięta w układzie OD = odciągą pin do zasilania)


Jeśli chodzi akurat o CS to sugeruję użyć domyślny pin CS danej magistrali SPI (to zależy od modelu MCU, w zwykłym ESP32 = dwurdzeniowy Xtensa6 te piny to akurat GPIO5 i GPIO15 oba biorące udział w bootstrapie, mimo to można je używać w tym akurat zastosowaniu).
Ostrzeżenie jest automatycznie generowane niezależnie od tego w jakiej roli użyjemy te piny (zakłócenia bootstrapu są możliwe jedynie jeśli podciągniemy je do zasilania lub masy niezgodnie z intencją producenta lub będą pinami wejściowymi).

Świetne bryki z dokumentacji są na randomnerdtutorials - tu jest dla S3

Powróciłem do wersji 2025.12 tak jak zasugerowałeś ,korzystając dalej z repo które utworzył Witek, kompilacja została wykonana :smile: Poprawiłem jeszcze kilka drobiazgów związanych z podłączeniem ( pozostałem na GPIO5) wszystko zainstalowało się bez błędu esp32 wykrywa i komunikuje się z radiem. Działam dalej wielkie dzięki za wsparcie