Komponent wM-Bus do ESPHome wersja 5.x - wątek ogólny

Wersje czego? EspHome?
Nic sie nie dzieje zlego. To są dane przyrostowe wiec te restarty jakos przezyje. Poczekam na poprawki :slight_smile:

To zrezygnuj na ten moment z odczytu licznika energii i zostaw tylko licznik wody. To chyba najlepsze rozwiązanie.

Przejrzałem kod i doszedłem do kluczowego wniosku że w starszych wersjach ESPHome i prostszych architekturach, stos (Stack) był na tyle luźny, że małe ramki przechodziły bez echa. Jednak liczniki Amiplus generują ramki, które mogą mieć grubo ponad 150-200 bajtów. Przy głębokim zagnieżdżeniu funkcji w ESP-IDF, alokacja uint8_t buffer[length] na stosie, gdzie length pochodzi z zewnątrz, to prosty przepis na Stack Overflow. Moja poprawka przenosi te bufory na stertę (Heap), która na ESP32 ma znacznie więcej miejsca niż stos zadania.

To będzie mała zmiana w kodzie a jeśli ktoś potrzebuje udostępniłem forka tego repozytorium i mogę go zostawić dopóki @_Szczepan nie zaktualizuje swojego repozytorium. Niestety mój fork nie jest jeszcze przetestowany więc prosiłbym o testy.

@kniazio tu masz dla gotowy config korzystający z poprawki:

esphome:
  name: lora
  friendly_name: Lora
  platformio_options:
    upload_speed: 921600

external_components:
  - source:
      type: git
      url: https://github.com/AllonGit/esphome-components
      ref: main
    components: [wmbus_common, wmbus_radio, wmbus_meter]
    refresh: 0s

esp32:
  board: esp32dev
  flash_size: 8MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP_MAIN_TASK_STACK_SIZE: "8192"
      CONFIG_ESP_TASK_WDT_TIMEOUT_S: "60"
      CONFIG_LOG_DEFAULT_LEVEL_INFO: "y"

logger:
  level: INFO
  baud_rate: 0
  logs:
    wmbus: ERROR
    component: ERROR

api:
  encryption:
    key: "HQgeLhbuFOvN73DM0CYaT3qVabF0Euciq2C1aqJ0hLU="
  reboot_timeout: 0s

ota:
  platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: NONE
  ap:
    ssid: "Lora Fallback Hotspot"
    password: "EyK1CEVSi4yt"

web_server:
  version: 3
  local: true

time:
  - platform: sntp
    id: sntp_time

spi:
  clk_pin: GPIO5
  mosi_pin: GPIO27
  miso_pin: GPIO19

wmbus_radio:
  radio_type: SX1276
  cs_pin: GPIO18
  reset_pin: GPIO14
  irq_pin: GPIO35 

wmbus_meter:
  - id: water_meter
    meter_id: 0x12345678 # <<< WPISZ SWOJE ID
    type: apator162
    key: "00000000000000000000000000000000" # <<< WPISZ SWÓJ KLUCZ

  - id: electricity_meter
    meter_id: 0x87654321 # <<< WPISZ SWOJE ID
    type: amiplus
    key: "00000000000000000000000000000000" # <<< WPISZ SWÓJ KLUCZ

sensor:
  - platform: wmbus_meter
    parent_id: water_meter
    field: total_m3
    name: "Zużycie wody"
    device_class: water
    state_class: total_increasing
    unit_of_measurement: "m³"
    accuracy_decimals: 3
    
  - platform: wmbus_meter
    parent_id: electricity_meter
    field: total_energy_consumption_kwh
    name: "Suma konsumpcji"
    device_class: energy
    state_class: total_increasing

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: current_power_consumption_kw
    name: "Aktualny pobór"
    device_class: power
    state_class: measurement

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: total_energy_production_kwh
    name: "Suma produkcji"
    device_class: energy
    state_class: total_increasing

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: current_power_production_kw
    name: "Aktualna produkcja"
    device_class: power
    state_class: measurement

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: voltage_at_phase_1_v
    name: "Faza V1"
    device_class: voltage
    state_class: measurement
    unit_of_measurement: "V"

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: voltage_at_phase_2_v
    name: "Faza V2"
    device_class: voltage
    state_class: measurement
    unit_of_measurement: "V"

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: voltage_at_phase_3_v
    name: "Faza V3"
    device_class: voltage
    state_class: measurement
    unit_of_measurement: "V"

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: rssi_dbm
    name: "Licznik RSSI"

Zalecam wykonanie “Clean Build” w menu ESPHome przed kliknięciem “Install”. To zagwarantuje, że stare, błędne biblioteki zostaną całkowicie usunięte i zastąpione Twoją nową wersją.

Super. Juz testujemy :slight_smile:

board: esp32dev

Musze to zmieniac?
Nie moge zostawic swojej wersji?

EDIT:
Liczniki odczytało. Czekamy czy będą restarty.
Nie zmienialem wersji modułu ale nie mam odczytow na wyswietlaczu. NAN

Teoretycznie nie musi być na board: esp32dev ale też przez to nie ma danych na wyświetlaczu. Proponuję abyś przetestował przez jakąś godzinę czy dwie i jeśli nie będzie restartów ani błędów to możesz zmienić na ten kod który miałeś na początku tylko nie zapomnij zmienić

external_components:
  - source:
      type: git
      url: https://github.com/AllonGit/esphome-components
      ref: main
    components: [wmbus_common, wmbus_radio, wmbus_meter]
    refresh: 0s 

Przepraszam. Sa dane na wyswietlaczu tylko jakos dlugo sie nie pojawialy. I zauwazylem ze web jakos tak ciezko odswieza

Po dwudziestu minutach restart
Bledy:

[20:05:40.711][E][component:415]: http_request set Error flag: unspecified
[20:05:40.717][E][http_request.idf:127]: HTTP Request failed: ESP_ERR_HTTP_CONNECT
[20:05:41.717][E][component:432]: http_request cleared Error flag
[20:06:41.850][E][component:415]: http_request set Error flag: unspecified
[20:06:41.856][E][http_request.idf:127]: HTTP Request failed: ESP_ERR_HTTP_CONNECT
[20:06:42.862][E][component:432]: http_request cleared Error flag
INFO Processing unexpected disconnect from ESPHome API for wmbus-lora @ 192.168.1.105
WARNING Disconnected from API
INFO Successfully resolved wmbus-lora @ 192.168.1.105 in 0.000s
INFO Successfully connected to wmbus-lora @ 192.168.1.105 in 0.004s
INFO Successful handshake with wmbus-lora @ 192.168.1.105 in 0.064s
INFO Processing unexpected disconnect from ESPHome API for wmbus-lora @ 192.168.1.105
WARNING Disconnected from API
INFO Successfully resolved wmbus-lora @ 192.168.1.105 in 0.000s
INFO Successfully connected to wmbus-lora @ 192.168.1.105 in 0.003s
INFO Successful handshake with wmbus-lora @ 192.168.1.105 in 0.067s

EDIT:
Kolejny restart po półtorej minuty

A już myłśałem, ale na szczęście to nie błędy Stack Overflow.

Skoro błędy HTTP sypały się co minutę (widzę 20:05:39, potem 20:06:40), ESPHome prawdopodobnie aktywował tzw. reboot_timeout. Jeśli moduł nie może nawiązać jakiegoś połączenia przez dłuższy czas, restartuje się “zapobiegawczo”.

Sprawdź, co wysyła żądania HTTP W kodzie, nie było sekcji http_request:. Czy masz taką sekcje w configu np. wysyłanie danych do jakiejś bazy danych.

A najlepiej to wyłączyć całkowicie restet z powodu błędów sieciowych.
Dodaj do sekcji api i wifi taką linie reboot_timeout: 0s

To że Web Server ciężko się odświeża to jest normalne ponieważ esp-idf nadaje priorytet zadaniom w tle a Web Server v3 jest rozbudowany i zasobożerny. Jeśli Ci to bardzo przeszkadaza usuń linię version: 3 w sekcji web_server.

Ok. Przetestuje to na drugim module. W tym module mam wysylanie danych do ThingSpeak. Ale kolejny restart byl juz chyba bez bledow http
Ale webserver odswiezal sie super przedtem

Ok. Usuwam ThinhSpeak i testuje
Szkoda ze tylko ja to testuje. Nie jest to obiektywne. Czyzbym ja tylko mial problem :slight_smile:

Kurcze nie wiem o co chodzi juz teraz. Usunalem sekcje z ThingSpeak. Kompilacja przeszla bezproblemowo i teraz nie czyta mi licznikow wogole.
Jesli chodzi o http request to jest fragment w kodzie
http_request:
verify_ssl: false
timeout: 10s
useragent: esphome/wmbus
i on chyba nie dotycy thingspeak-a

Teraz to by się pewnie przydało jeszcze raz zrobić Clean Build ponieważ mogło zstać coś po thingspeak polecam jeszcze zakomentować lub usunąć sekcje http_request:. Spójrz jeszcze w logi przy uruchomieniu czy pisze wmbus_radio: SX1276 found.

Ale mi nie pokazuje tych logow na starcie przy tych twoich ustawieniach

O nawet już zapomniałem że wyłączyliśmy logger musisz zmienic to w sekcji logger

logger:
  level: VERY_VERBOSE
  baud_rate: 115200
  logs:
    wmbus: DEBUG
    component: DEBUG

Teraz powinniśmy dostać szczegółowe dane.

Tak tylko ze ja zrobilem clean build i zaladowalem swoj poprzedni config i nadal nic nie czyta. Pewnie modul (radio) szlag trafil
Niezle kuzwa

To juz po testach :slight_smile:

Raczej jest mało prawdpodobne że radio walło to musimy do tego “strategicznie” podejść najpierw uprościmy kod do minimum:

esphome:
  name: lora
  friendly_name: Lora

esp32:
  board: heltec_wifi_lora_32_V2
  framework:
    type: arduino  # Wracamy na chwilę do stabilnego Arduino

# PRZYWRACAMY LOGI NA USB - to powie nam czy radio żyje
logger:
  level: DEBUG
  baud_rate: 115200

external_components:
  - source:
      type: git
      url: https://github.com/AllonGit/esphome-components
      ref: main
    components: [wmbus_common, wmbus_radio, wmbus_meter]
    refresh: 0s

spi:
  clk_pin: GPIO5
  mosi_pin: GPIO27
  miso_pin: GPIO19

wmbus_radio:
  radio_type: SX1276
  cs_pin: GPIO18
  reset_pin: GPIO14
  irq_pin: GPIO35

# TYLKO JEDEN LICZNIK DO TESTÓW
wmbus_meter:
  - id: water_test
    meter_id: 0x12345678
    type: apator162

Akurat bardziej topornej konfiguracji dawno nie widziałem.

Teraz kuzwa jaki matrix leci caly cas w logach

21:00:43
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:43
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:43
[V]
[i2c.idf:155]
0x3C TX 40:00:8F:80:80:80:80:00:00:0F:09:09:05:0F:00:00:0C
21:00:43
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:43
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:43
[V]
[i2c.idf:155]
0x3C TX 40:0B:09:08:08:00:0F:09:09:05:0F:00:00:00:80:8F:80
21:00:43
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:43
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:43
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:08:00:00:00:00:00:0F:00:00:00:0F:00:00
21:00:43
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:43
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:43
[V]
[i2c.idf:155]
0x3C TX 40:0F:09:09:05:0F:00:00:0F:00:00:00:0F:00:00:00:00
21:00:43
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:43
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:43
[V]
[i2c.idf:155]
0x3C TX 40:80:80:03:0E:0F:01:80:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:FF:08:08:08:08:00:00:F4:92:92:56:FC:00:00:C2
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:B2:9A:86:80:00:F4:92:92:56:FC:00:00:C3:E0:90:88
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:87:00:00:84:00:00:00:00:00:FE:02:02:02:FC:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:F4:92:92:56:FC:00:00:FE:02:02:02:FC:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:07:3C:E0:F0:1E:03:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]
Sending 4 jobs
21:00:44
[V]
[i2c.idf:142]
Writing 17 bytes, reading 0 bytes
21:00:44
[V]
[i2c.idf:155]
0x3C TX 40:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
21:00:44
[V]
[i2c.idf:187]

To co by moglo sie stac ze teraz nie czyta nawet na poprzednich cofigach na ktorych czytal

może troche mnie poniosło z tymi logami spróbuj zmienić w sekcji logger na:

logger:
  level: DEBUG
  baud_rate: 115200

I spróbuj wyszukać fragmentu SX1276 found

Zresztą przygotowałem to comusisz zrobić aby mam nadzieję zaczeło działać:

anim wgrasz kod, musimy “odwiesić” radio, które mogło zgłupieć od ciągłych zmian softu.

  1. Odłącz moduł od komputera/zasilania.
  2. Poczekaj pełną minutę.
  3. Podłącz go z powrotem.

W ESPHome Dashboard:

  1. Kliknij 3 kropki przy swoim urządzeniu (lub strzałkę przy Install).
  2. Wybierz Clean Build.
  3. Poczekaj, aż wyczyści stare pliki. Nie wgrywaj jeszcze.

Skopiuj całość. Jedyne co musisz zmienić, to wpisać swoje ID i KLUCZE w sekcji wmbus_meter oraz hasło do WiFi. Reszty nie dotykaj.

esphome:
  name: lora
  friendly_name: Lora
  platformio_options:
    upload_speed: 921600

external_components:
  - source:
      type: git
      url: https://github.com/AllonGit/esphome-components
      ref: main
    components: [wmbus_common, wmbus_radio, wmbus_meter]
    refresh: 0s

esp32:
  board: heltec_wifi_lora_32_V2
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP_MAIN_TASK_STACK_SIZE: "16384"
      CONFIG_ESP_TASK_WDT_TIMEOUT_S: "120"
      CONFIG_LOG_DEFAULT_LEVEL_INFO: "y"
      CONFIG_LWIP_MAX_SOCKETS: "16"

# Czytelne logi bez śmieci
logger:
  level: DEBUG
  baud_rate: 115200
  logs:
    wmbus: DEBUG
    component: ERROR
    i2c: ERROR
    sensor: ERROR
    ssd1306: ERROR

api:
  encryption:
    key: "HQgeLhbuFOvN73DM0CYaT3qVabF0Euciq2C1aqJ0hLU="
  reboot_timeout: 0s 

ota:
  platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: NONE
  reboot_timeout: 0s
  ap:
    ssid: "Lora Fallback Hotspot"
    password: "EyK1CEVSi4yt"

web_server:
  version: 3
  local: true

time:
  - platform: sntp
    id: sntp_time

# 3. Konfiguracja Ekranu
i2c:
  sda: GPIO4
  scl: GPIO15
  scan: true
  frequency: 400kHz

font:
  - file: "gfonts://Roboto"
    id: font_small
    size: 14

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    reset_pin: GPIO16
    lambda: |-
      it.print(0, 0, id(font_small), "wM-Bus Monitor");
      
      // Woda
      if (id(woda_total).has_state()) {
        it.printf(0, 25, id(font_small), "Woda: %.3f", id(woda_total).state);
      } else {
        it.print(0, 25, id(font_small), "Woda: Szukam...");
      }

      // Prąd
      if (id(energia_total).has_state()) {
        it.printf(0, 45, id(font_small), "Prad: %.1f", id(energia_total).state);
      } else {
        it.print(0, 45, id(font_small), "Prad: Szukam...");
      }

# 4. Konfiguracja Radia
spi:
  clk_pin: GPIO5
  mosi_pin: GPIO27
  miso_pin: GPIO19

wmbus_radio:
  radio_type: SX1276
  cs_pin: GPIO18
  reset_pin: GPIO14
  irq_pin: GPIO35 

# 5. Liczniki (UZUPEŁNIJ SWOJE DANE!)
wmbus_meter:
  - id: water_meter
    meter_id: 0x12345678    # <<< TU WPISZ ID WODY
    type: apator162
    key: "00000000000000000000000000000000"  # <<< TU WPISZ KLUCZ WODY

  - id: electricity_meter
    meter_id: 0x87654321    # <<< TU WPISZ ID AMIPLUS
    type: amiplus
    key: "00000000000000000000000000000000"  # <<< TU WPISZ KLUCZ AMIPLUS

sensor:
  - platform: wmbus_meter
    parent_id: water_meter
    id: woda_total
    field: total_m3
    name: "Zużycie wody"
    device_class: water
    state_class: total_increasing
    unit_of_measurement: "m³"
    accuracy_decimals: 3
    
  - platform: wmbus_meter
    parent_id: electricity_meter
    id: energia_total
    field: total_energy_consumption_kwh
    name: "Suma konsumpcji"
    device_class: energy
    state_class: total_increasing

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: current_power_consumption_kw
    name: "Aktualny pobór"
    device_class: power
    state_class: measurement

  - platform: wmbus_meter
    parent_id: electricity_meter
    field: rssi_dbm
    name: "Licznik RSSI"

Gdy wgrasz ten kod, otwórz logi.

  1. Ekran: Powinien wyświetlać “wM-Bus Monitor” oraz napisy “Szukam…”.
  2. Radio: W logach (na zielono/biało) MUSI pojawić się linia: [wmbus_radio:063]: SX1276 found

Mam nadzieję że to pomoże bo na tą chwilę nie mam więcej pomysłów.

Juz czyta. Ale wrocilem do wczorajszego configu.
Zauwazylem ze w zaleznosci jak ustawimy logi to raz liczniki sa czytane a w innym przypadku nie
Najszybciej odczyty pojawiaja sie przy takim configu:

esp32:
  board: heltec_wifi_lora_32_V2
  flash_size: 8MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP_MAIN_TASK_STACK_SIZE: "8192"
      CONFIG_ESP_TASK_WDT_TIMEOUT_S: "60"
      CONFIG_LOG_DEFAULT_LEVEL_NONE: "y"


# Enable logging
logger:
  level: INFO
  baud_rate: 0
  logs:
    wmbus: ERROR
    component: ERROR