Komponent IoTLabs-pl wM-Bus do ESPHome

/// mod-edit - wydzielono z wątku na inny temat…


Czym jest wersja “v5 od Kuby”? Mam SX1267 i czy można do niej zmigrować?

W pierwszej linii readme.md SzczepanLeon @4 masz taki wiersz: Version 5 based on Kuba’s dirty fork
Po naciśnięciu zostaniesz przeniesiony do githuba: GitHub - IoTLabs-pl/ESPHome-Components.

Pierwsze zbudowałem obraz z użyciem V5 od Szczepana. Mieszkam w bloku gdzie tylko w mojej klatce mam 36 różnych liczników (ciepłomierze + liczniki wody) i układ na SX1276 w porywach dwa razy na godzinę dekodował ramki. Mam również RTL-SDR i miałem porównanie jaki jest ruch w eterze. Po zainstalowaniu wersji od Kuby co sekundę, co dwie układ odbiera i dekoduje ramki z eteru.
Mój YAML. Nie mam sekcji sensors itd ponieważ mój układ nie jest zintegrowany z asistantem - odbieram i analizuję wiadomości mqtt.

esphome:
  name: nowysx1276
  friendly_name: NowySX1276
  platformio_options: 
    upload_speed: 921600

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

esp32:
  board: esp32dev
  framework:
    type: esp-idf

logger:
  id: component_loger
  level: DEBUG
  baud_rate: 115200

ota:
  - platform: esphome
    password: "19bbb3a5a185d53ba756c99add5a42f8"

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

api:

web_server:
  version: 3

time:
    platform: sntp
    id: time_sntp

spi:
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19

mqtt:
  broker: 192.168.1.201
  port: 1883
  client_id: dm

wmbus_common:
    # drivers: all
    # or specify specific drivers
    drivers:
      - apator162
      - iwmtx5
      - hydrocalm3

wmbus_radio:
  radio_type: SX1276
  cs_pin: GPIO15
  reset_pin: GPIO27
  irq_pin: GPIO14       # DIO01
  on_frame:
    - then:
        - logger.log:
            format: "RSSI: %ddBm T: %s (%d)"
            args: [ frame->rssi(), frame->as_hex().c_str(), frame->data().size() ]
    - then:
        - repeat:
            count: 3
            then:
              - output.turn_on: status_led
              - delay: 100ms
              - output.turn_off: status_led
              - delay: 100ms
    - mark_as_handled: True
      then:
        - mqtt.publish:
            topic: telemetria/telegram_rtl
            payload: !lambda return frame->as_rtlwmbus();

wmbus_meter:
  - id: cold_water_supply
    meter_id: 25319203
    type: iwmtx5
    mode: T1
    on_telegram:
      - wmbus_meter.send_telegram_with_mqtt:
          topic: telemetria/gw/licznik_wody/zimna

  - id: hot_water_supply
    meter_id: 25318091
    type: iwmtx5
    mode: T1
    on_telegram:
      - wmbus_meter.send_telegram_with_mqtt:
          topic: telemetria/gw/licznik_wody/ciepla

  - id: heat_meter
    meter_id: 05285311
    type: iwmtx5
    mode: T1
    on_telegram:
      - wmbus_meter.send_telegram_with_mqtt:
          topic: telemetria/gw/licznik_ciepla

  - id: public_water_supply_system
    meter_id: 06861073
    type: apator162
    mode: T1
    key: "00000000000000000000000000000000"
    on_telegram:
      - wmbus_meter.send_telegram_with_mqtt:
          topic: telemetria/dm/licznik_wody/woda_z_wodociagow

  - id: own_water_supply_system
    meter_id: 06861531
    type: apator162
    mode: T1
    key: "00000000000000000000000000000000"
    on_telegram:
      - wmbus_meter.send_telegram_with_mqtt:
          topic: telemetria/dm/licznik_wody/woda_z_wlasnego_ujecia

output:
  - platform: gpio
    id: status_led
    pin: GPIO25

Na jakiej płytce odpalasz ta wersje od Kuby?

Tak właśnie probowałem coś zrobić z esp32s3mini i cc1101 i to nie działa(V4) nie wiem z jakiego powodu dlatego tez pytam jaki HW by cos innego sprawdzonego kupić :slight_smile:

Skorzystaj z drugiego wątku, gdzie się podpiąłeś - “wersja Kuby”, czyli IoTLabs-pl jest dedykowana wyłącznie dla SX1276, jeśli się wczytasz w repozytorium to się dowiesz nawet jaka to konkretnie płytka prototypowa (sorry nie pamiętam konkretów, ale coś ze stajni Heltec bodajże).

A jedyne co mogę sugerować, by być fair, to byś kupił gotowy odbiornik właśnie u niego (link do ogłoszenia sprzedaży, bo realnie trudno to znaleźć).

Tak widziałem heltec_wifi_lora_32_V2 tylko to teraz ciezko kupic w wersji V2 wiekszosć to V3 i V4 niestety :(.

A więc czytanie dokumentacji wita. Jeśli znajdziesz wszystkie różnice między wersjami tych płytek (a jakie właściwie są?) to sobie dostosujesz YAMLa. Oczywiście to MUSI być SX1276 868MHz.
Oprócz tego sugeruję MCU “S3” (to jest chyba coś, przed czym się bronisz) na płytce wyposażonej w PSRAM.
Ale jak pisałem wyżej - uważam, że dobrą robotę trzeba wspierać, a cena sprzętu u niego nie jest wygórowana…

Piszemy w niewłaściwym wątku przenoszę posty. przeniesione

1 polubienie

Narazie zamówiłem ESP32 inne niz te mini, czytajac watek o EspHome mam duzo watpliwosci czy sie skompiluje i w sumie nie wiem czy moj licznik wody w ogole odczyta (DIEHL) . wiec szukam alterantywy na 2 krok :slight_smile:

Zupełnie nie łapię kontekstu, nie rozmawialiśmy nigdzie o żadnych “mini”.

Za to zmusiłeś mnie do przekopania dokumentacji Helteca,

zamiast jasno napisać, że ich wypusty Heltec wifi lora 32 v3 i Heltec wifi lora 32 v4 mają radio SX1262 (niekompatybilne z tu opisywanym komponentem).

Proponuję byś wybierał za każdym razem właściwy wątek do treści, które chcesz napisać, bo naprawdę mamy tu już wystarczająco dużo bałaganu z komponentami pochodzącymi od rożnych autorów (a raczej z osobami postującymi w losowo wybranych wątkach…).

Tym bardziej nie rozumiem twoich kombinacji - spytaj te osoby które produkują te czytniki - nikt nie będzie bardziej zorientowany od nich czy dany model daje się odczytać (ale jak znam życie, to do Diehl, o ile w ogóle to jest wersja wM-Bus, musisz znać klucz szyfrowania, a duzi dostawcy wody mają jakiś betonowo-mentalny problem z udostępnianiem klucza swojemu klientowi, więc szanse oceniam na niskie jeśli nie pojawi się w końcu uregulowanie prawne dające konsumentom prawo do dostępu do danych o własnym zużyciu wszelkich mediów na równi z dostawcami).

Dziekuje za wyjasnienia. napisze do iotlabs bo na stronie nic nie znalazlem o DIEHL niestety.

Bo do DIEHL są zakładane nakładki IZAR i w 99 procentach użycia są bez kodowania.
Licznik Wody Diehl Aries IS IZAR - Home Assistant - ArturHome
P.S.
Prześlij mi foto nakładki radiowej na PW, to porównam ze swoimi.

1 polubienie

@kubasa

Próbowałeś może odpalać kod swojego komponentu pod Arduino framework? Masz gdzieś projekt?

Twoje rozwiązanie na integrację z Suplą GitHub - IoTLabs-pl/wM-Bus-Gateway-for-Supla zainstalowane z Twojej strony działa jak powinno, natomiast próba zbudowania tego pod frameworkiem Arduino po oczywistym pozbyciu się zależności do ESPHome się kompiluje i uruchamia, ale nie odbiera w ogóle poprawnych ramek. Strzelam, że problem leży w obsłudze przerwań, aczkolwiek może Ty wiesz dokładnie.

Testuje na sx1276

Niestety nie.
W IDFie mam bardziej bezpośrednią kontrolę nad komunikacją tasków odbiorczego i przetwarzającego i dlatego chciałem to zrobić jak najbliżej samego IDFa. Nie mam zasadniczo pojęcia dlaczego pod Arduino to nie działa, bo Arduino też przecież jest pośrednio nakładką na IDF.

Na ten moment, ramka jest akumulowana na stercie przez wątek odbiorczy, a gdy mamy prawo przypuszczać że jest kompletna, przerzucamy wskaźnik na nią przez kolejkę do main loopa, który robi wszystkie wmbusmetersowo-ciężkie sprawy na niskim priorytecie.

Wczoraj wieczorem wypuściliśmy dość mocno zmienioną wersję komponentów (1.1.0). W szczególności:

  • zsynchronizowaliśmy wmbusmeters do wersji 1.20.0
  • napisaliśmy ładowanie sterowników XMQ
  • loader sterowników wyposażyliśmy w odrzucanie pól niekoniecznie potrzebnych do działania konkretnej konfiguracji (to bardzo duża, potencjalnie psująca zmiana, ale w naszych testach wypada całkiem nieźle)

Ostatecznie, wszystkie zmiany powinny doprowadzić do zdecydowanie mniejszego zużycia RAMu w trakcie działania. Na ten moment, prawdopodobnie przez dłuższy czas (o ile nie będzie bugów), ten mechanizm ładowania pozostanie z nami. wmbusmeters w 2.0.0 wprowadza dynamiczne konstruowanie parserów: sportowanie go na mały mikrokontroler będzie jeszcze bardziej karkołomne niż teraz, ale póki ten system ładowania się nie ustabilizuje po stronie wmbusmeters, to ciężko podjąć jakiekolwiek działania.
Wiodący autor wmbusmeters ma chyba jakieś zamiłowanie do pisania własnych formatów plików, parserów i lexerów, co niestety nie jest przyjemne do utrzymania :confused:

Jeśli ktoś miałby możliwość i ochotę, to bardzo chętnie przygarniemy jakiś feedback, bo lokalnie możemy to przetestować na dość mocno ograniczonej liczbie konfiguracji.

4 polubienia

https://pl.aliexpress.com/item/1005005967763162.html?spm=a2g0o.order_list.order_list_main.5.612c180258Ae33&gatewayAdapt=glo2pol posadzę go na takiej płytce?

Na dowolnej z SX1276 i prockiem z rodziny ESP. Na Heltecach mamy zrobione nasze zestawy: wM-Bus Gateway – IoTLabs dostępne właściwie od ręki.

Jeśli ktoś miałby możliwość i ochotę, to bardzo chętnie przygarniemy jakiś feedback, bo lokalnie możemy to przetestować na dość mocno ograniczonej liczbie konfiguracji.

Uruchomiłem ten fork u siebie. Mam, jak przytłaczająca większość apatora 162 to was pewnie nie zainteresuje. Ale jak byście chcieli jakieś konkretne info zwrotne o takim ciepłomierzu Ciepłomierz mieszkaniowy Q heat 5.5 - Santech - Ciepłomierze to służę.

Moja płytka to klon Heltec V2

jakby ktoś widział jakieś błędy w yamlu lub miał sugestie co zmienić lub dopisać, to chętnie potestuje.

esphome:
  name: test
  friendly_name: test

  # Po uruchomieniu publikuje ostatnie zapisane wartości z globals,
  # żeby encje w Home Assistant od razu miały stan, zanim przyjdą nowe ramki z liczników.
  on_boot:
    priority: -100
    then:
      - lambda: |-
          if (id(g_ciepla_woda) > 0) {
            id(ciepla_woda_2).publish_state(id(g_ciepla_woda));
          }
          if (id(g_zimna_woda) > 0) {
            id(zimna_woda_2).publish_state(id(g_zimna_woda));
          }
          if (id(g_ogrzewanie) > 0) {
            id(ogrzewanie_2).publish_state(id(g_ogrzewanie));
          }
          if (id(g_ogrzewanie_last_year) > 0) {
            id(ogrzewanie_2_last_year).publish_state(id(g_ogrzewanie_last_year));
          }
          if (id(g_ogrzewanie_last_month) > 0) {
            id(ogrzewanie_2_last_month).publish_state(id(g_ogrzewanie_last_month));
          }

preferences:
  # Jak często ESPHome zapisuje wartości restore_value do flash
  flash_write_interval: 1min

esp32:
  board: heltec_wifi_lora_32_V2
  framework:
    type: esp-idf

globals:
  # Ostatni znany stan licznika ciepłej wody
  - id: g_ciepla_woda
    type: float
    restore_value: yes
    initial_value: '168.469'

  # Ostatni znany stan licznika zimnej wody
  - id: g_zimna_woda
    type: float
    restore_value: yes
    initial_value: '131.450'

  # Ostatni znany stan całkowitego zużycia energii z licznika ogrzewania
  - id: g_ogrzewanie
    type: float
    restore_value: yes
    initial_value: '21188.801'

  # Ostatni znany odczyt pola "poprzedni rok" z licznika ogrzewania
  - id: g_ogrzewanie_last_year
    type: float
    restore_value: yes
    initial_value: '14216.400'

  # Ostatni znany odczyt pola "poprzedni miesiąc" z licznika ogrzewania
  - id: g_ogrzewanie_last_month
    type: float
    restore_value: yes
    initial_value: '20668.301'

logger:
  level: DEBUG
  baud_rate: 115200
  task_log_buffer_size: 2048
  logs: #chyba złoty kompromis jeśli mamy sporo obcych liczników w koło.
    wmbus: WARN
    esp32.preferences: WARN

api:
  encryption:
    key: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

ota:
  - platform: esphome
    password: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  power_save_mode: none

time:
  - platform: homeassistant

external_components:
  - source: github://IoTLabs-pl/ESPHome-Components@v1.1.0
    components:
      - wmbus_radio
      - wmbus_meter
      - wmbus_common

wmbus_common:
  drivers:
    - apator162
    - qheat
    - amiplus #czekam na klucz z pging

spi:
  clk_pin:
    number: GPIO5
    ignore_strapping_warning: true
  mosi_pin: GPIO27
  miso_pin: GPIO19

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

wmbus_meter:
  - id: ciepla_woda_meter
    meter_id: 6929680
    type: apator162
    key: "00000000000000000000000000000000"

  - id: zimna_woda_meter
    meter_id: 6830337
    type: apator162
    key: "00000000000000000000000000000000"

  - id: ogrzewanie_meter
    meter_id: 67897051
    type: qheat
    key: "00000000000000000000000000000000"

sensor:
  # =========================
  # CIEPŁA WODA
  # =========================
  - platform: wmbus_meter
    id: ciepla_woda_2
    parent_id: ciepla_woda_meter
    field: total_m3
    name: "CieplaWoda"
    accuracy_decimals: 3
    unit_of_measurement: "m³"
    device_class: water
    state_class: total_increasing
    icon: "mdi:water"
    on_value:
      then:
        - lambda: |-
            // Zapamiętaj ostatni odczyt po restarcie
            id(g_ciepla_woda) = x;

  - platform: wmbus_meter
    parent_id: ciepla_woda_meter
    field: rssi_dbm
    name: "CieplaWoda RSSI"
    accuracy_decimals: 0
    unit_of_measurement: "dBm"
    device_class: signal_strength
    state_class: measurement
    entity_category: diagnostic
    icon: "mdi:signal"

  # =========================
  # ZIMNA WODA
  # =========================
  - platform: wmbus_meter
    id: zimna_woda_2
    parent_id: zimna_woda_meter
    field: total_m3
    name: "ZimnaWoda"
    accuracy_decimals: 3
    unit_of_measurement: "m³"
    device_class: water
    state_class: total_increasing
    icon: "mdi:water"
    on_value:
      then:
        - lambda: |-
            // Zapamiętaj ostatni odczyt po restarcie
            id(g_zimna_woda) = x;

  - platform: wmbus_meter
    parent_id: zimna_woda_meter
    field: rssi_dbm
    name: "ZimnaWoda RSSI"
    accuracy_decimals: 0
    unit_of_measurement: "dBm"
    device_class: signal_strength
    state_class: measurement
    entity_category: diagnostic
    icon: "mdi:signal"

  # =========================
  # OGRZEWANIE
  # =========================
  - platform: wmbus_meter
    id: ogrzewanie_2
    parent_id: ogrzewanie_meter
    field: total_energy_consumption_kwh
    name: "Ogrzewanie"
    accuracy_decimals: 3
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    icon: "mdi:radiator"
    on_value:
      then:
        - lambda: |-
            // Zapamiętaj główny stan licznika ogrzewania
            id(g_ogrzewanie) = x;

  - platform: wmbus_meter
    id: ogrzewanie_2_last_year
    parent_id: ogrzewanie_meter
    field: last_year_energy_consumption_kwh
    name: "Ogrzewanie poprzedni rok"
    accuracy_decimals: 3
    unit_of_measurement: "kWh"
    device_class: energy
    entity_category: diagnostic
    icon: "mdi:radiator"
    on_value:
      then:
        - lambda: |-
            // Zapamiętaj pole "poprzedni rok"
            id(g_ogrzewanie_last_year) = x;

  - platform: wmbus_meter
    id: ogrzewanie_2_last_month
    parent_id: ogrzewanie_meter
    field: last_month_energy_consumption_kwh
    name: "Ogrzewanie poprzedni miesiąc"
    accuracy_decimals: 3
    unit_of_measurement: "kWh"
    device_class: energy
    entity_category: diagnostic
    icon: "mdi:radiator"
    on_value:
      then:
        - lambda: |-
            // Zapamiętaj pole "poprzedni miesiąc"
            id(g_ogrzewanie_last_month) = x;

  - platform: wmbus_meter
    parent_id: ogrzewanie_meter
    field: rssi_dbm
    name: "Ogrzewanie RSSI"
    accuracy_decimals: 0
    unit_of_measurement: "dBm"
    device_class: signal_strength
    state_class: measurement
    entity_category: diagnostic
    icon: "mdi:signal"

  # =========================
  # DIAGNOSTYKA WIFI
  # =========================
  - platform: wifi_signal
    id: wifi_signal_db
    name: "WiFi RSSI"
    update_interval: 60s
    device_class: signal_strength
    entity_category: diagnostic

  - platform: copy
    source_id: wifi_signal_db
    name: "WiFi Signal"
    unit_of_measurement: "%"
    accuracy_decimals: 0
    entity_category: diagnostic
    filters:
      # Proste przeliczenie RSSI z dBm na %
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
[17:53:08.397][D][wifi:2327]: Roam scan (-54 dBm, attempt 1/3)
[17:53:32.203][D][sensor:118]: 'Ogrzewanie RSSI' >> -75 dBm
[17:54:05.981][D][sensor:118]: 'CieplaWoda' >> 168.479 m³
[17:54:05.989][D][sensor:118]: 'CieplaWoda RSSI' >> -80 dBm
[17:54:06.791][D][sensor:118]: 'WiFi RSSI' >> -54 dBm
[17:54:06.797][D][sensor:118]: 'WiFi Signal' >> 92 %
[17:54:13.551][D][sensor:118]: 'ZimnaWoda' >> 131.489 m³
[17:54:13.559][D][sensor:118]: 'ZimnaWoda RSSI' >> -77 dBm
[17:55:06.796][D][sensor:118]: 'WiFi RSSI' >> -54 dBm
[17:55:06.839][D][sensor:118]: 'WiFi Signal' >> 92 %
[17:55:20.983][D][sensor:118]: 'CieplaWoda' >> 168.479 m³
[17:55:20.990][D][sensor:118]: 'CieplaWoda RSSI' >> -80 dBm
[17:55:51.552][D][sensor:118]: 'ZimnaWoda' >> 131.490 m³
[17:55:51.596][D][sensor:118]: 'ZimnaWoda RSSI' >> -77 dBm
[17:56:06.805][D][sensor:118]: 'WiFi RSSI' >> -54 dBm
[17:56:06.809][D][sensor:118]: 'WiFi Signal' >> 92 %
[17:56:29.985][D][sensor:118]: 'CieplaWoda' >> 168.479 m³
[17:56:29.992][D][sensor:118]: 'CieplaWoda RSSI' >> -80 dBm
[17:56:30.028][W][api.connection:2235]: ESPHome Logs 2026.2.4 (192.168.1.148): Reading failed CONNECTION_CLOSED errno=128
[17:57:01.541][D][sensor:118]: 'Ogrzewanie' >> 21190.801 kWh
[17:57:01.547][D][sensor:118]: 'Ogrzewanie poprzedni rok' >> 14216.400 kWh
[17:57:01.547][D][sensor:118]: 'Ogrzewanie poprzedni miesiąc' >> 20668.301 kWh
[17:57:01.554][D][sensor:118]: 'Ogrzewanie RSSI' >> -74 dBm
[17:57:06.803][D][sensor:118]: 'WiFi RSSI' >> -54 dBm
[17:57:06.810][D][sensor:118]: 'WiFi Signal' >> 92 %

Ogarnął ktoś może odczyt podzielników ciepła Apator EITN 40? Aktualnie mam 2 odbiorniki. Jeden na radiu CC1101, który odbiera mi właśnie te podzielniki a drugi na SX1276, którym łapię ramki nowych nakładek wodomierzy apatora (jeszcze natywnie niewspieranych w tym komponencie). Chciałbym mieć wszystko na 1 urządzeniu.

Podzielniki wyglądają tak:

Specyfikacja: https://api.apator.com/uploads/oferta/woda-i-cieplo/podzielniki/e-itn40/e-itn40-instrukcja-obslugi.pdf

Mogę dostarczyć wszelkich możliwych danych. Kiedyś założyłem issue na github celem dodania ich do wsparcia. Niestety idzie to bardzo powoli a w zasadzie to stoi w miejscu. Adding support for Apator E-ITN 40 · Issue #1144 · wmbusmeters/wmbusmeters · GitHub

na CC1101 odbieram te ramki na v3 zmodyfikowanego komponentu od Szczepana, tylko na ESPHome 2025.6.3 wyżej już nie działa. wrzucając ramkę do wmbus wychodzą jakieś kosmiczne wskazania, sprzeczne z fizycznym odczytem.

Użyłem swojego komponentu i na Twoim Telegramie:

40440106139901000908A00000A10081016B013F00A2004E00000000000000000000000000000018001E0007007800100002002F01C700000000002D3006000000

Dostałem :

Received telegram from: 00019913
          manufacturer: (APA) Apator, Poland (0x601)
                  type: Heat Cost Allocator (0x08)
                   ver: 0x09
                driver: unknown!
[wmbus-bridge][WARN] === NEW METER CANDIDATE DETECTED ===
[wmbus-bridge][WARN] Received telegram from: 00019913
[wmbus-bridge][WARN] Suggested driver: unknown
[wmbus-bridge][WARN] Add to options.json meters[] (example):
[wmbus-bridge][WARN]   {"id":"meter_00019913","meter_id":"00019913","type":"auto","type_other":"","key":"NOKEY"}
[wmbus-bridge][WARN] ==================================

Zaraz sprawdzę Czy mi założy encje.

Nie założył - wmbusmeters nie ma driverów:

(meter) CIEPŁO: meter detection could not find driver for id: 00019913 mfct: (APA) Apator, Poland (0x601) type: Heat Cost Allocator (0x08) ver: 0x09
(meter) please consider opening an issue at https://github.com/wmbusmeters/wmbusmeters/
(meter) to add support for this unknown mfct,media,version combination
{"_":"telegram","media":"heat cost allocation","meter":"auto","name":"CIEPŁO","id":"00019913","timestamp":"2026-03-16T12:13:35Z"}

Także tego czytał nie będziesz bo nie ma czym dekodować.

czytam to, właściwie i poprawnie, nie wiem tylko jaki sterownik jest użyty. Pisałem, że wersją bodajże 3 albo nawet v2 od Szczepana, który obrobił drivera apatora eitn.

jak widać złapało poprawne wartości