Apator Naxom OP-04 WMBUS -> HOWTO

W bloku mojej mamy wymienili stare dobre Apatory z kluczem “0” na takie oto nowinki, jakimi są Apator Naxom OP-04, a konkretnie OP-04-1 czyli NAXOM-1. W necie nie znalazłem żadnego info by ktoś odczytał je w jakikolwiek sposób do chwili pisania tego postu.

Co tu zrobić? Jak żyć?

Niestety producent chwali się, że wszystkie nakładki posiadają unikalny klucz szyfrujący dostępny z panelu sterowania systemem wodomierzy. Zatem: Nie da się ich odczytać bez pozyskania klucza od wspólnoty / spółdzielni.

Osoby w mojej spółdzielni udostępniły mi klucze i mogłem zacząć się bawić. Posiadam WMBUS-reader od Mariusza i działa świetnie. Ale niestety Naxom nie jest wspierany przez wmbusmeters (Planuję udostępnić im ramki i poprosić o zrobienie pełnego wsparcia). Ale sam odczyt zużytej wody da się zrobić wykorzystując sterownik c5isf. Poniżej fragment konfiguracji dla esphome (external component GitHub - SzczepanLeon/esphome-components), który pozwala mi odczytać dane:

sensor:   
  - platform: wmbus
    meter_id: 0xID_LICZNIKA
    type: c5isf
    key: "KLUCZ AES-128"
    sensors:
      - name: "RSSI"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: "signal_strength"
        state_class: "measurement"
        entity_category: "diagnostic"
      - name: "Cold water"
        field: "total_volume"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: "water"
        state_class: "total_increasing"
        icon: "mdi:water"

Jeśli do wmbusmeters wpadnie dedykowane wsparcie Apatora, poprawię swój post. Sama ramka wygląda tak:

telegram=|51440106283019101A078CE0217A860040A52F2F_041371110000046D0D353A320F60000000000874876573F63B373F31B70C00005005000065000000650000006500000065000000650000002F2F2F2F2F2F|

Auto driver    : not found!
Similar driver : c5isf 08/58
Using driver   : c5isf 00/00
000   : 51 length (81 bytes)
001   : 44 dll-c (from meter SND_NR)
002   : 0106 dll-mfct (APA)
004   : 28301910 dll-id (10193028)
008   : 1a dll-version
009   : 07 dll-type (Water meter)
010   : 8c ell-ci-field (ELL: Extended Link Layer I (2 Byte))
011   : e0 ell-cc (bidir fast_resp sync)
012   : 21 ell-acc
013   : 7a tpl-ci-field (EN 13757-3 Application Layer (short tplh))
014   : 86 tpl-acc-field
015   : 00 tpl-sts-field (OK)(OK)
016   : 40a5 tpl-cfg a540 (bidirectional synchronous AES_CBC_IV nb=4 cntn=0 ra=0 hc=0 )
018   : 2f2f decrypt check bytes (OK)
020   : 04 dif (32 Bit Integer/Binary Instantaneous value)
021   : 13 vif (Volume l)
022 C!: 71110000 ("total_volume_m3":4.465)
026   : 04 dif (32 Bit Integer/Binary Instantaneous value)
027   : 6D vif (Date and time type)
028 C!: 0D353A32 ("last_month_date":"2025-02-26 21:13")
032 C?: 0F manufacturer specific data 60000000000874876573F63B373F31B70C00005005000065000000650000006500000065000000650000002F2F2F2F2F2F

{
    "_":"telegram",
    "media":"water",
    "meter":"c5isf",
    "name":"",
    "id":"10193028",
    "total_volume_m3":4.465,
    "last_month_date":"2025-02-26 21:13",
    "status":"OK",
    "timestamp":"2025-02-27T22:42:39Z"
}


Using: wmbusmeters: 1.17.1-70-g41a2b48
41a2b4808f00367af7bbaac57e221539825babbb

Może komuś jeszcze się przyda ta wiedza.

4 polubienia

Cześć @chkdsk
mam ten same nakładki i czekam wciąż na uzyskanie kluczy, natomiast wyczytałem że czasem technicy ustawiają klucze na te spośród kilkunastu wbudowanych kluczy w urządzenia odbiorcze. Czy mógłbyś sprawdzić czy Twój klucz odczyta te ramki?:slight_smile:

Received telegram from: 10891172
manufacturer: (APA) Apator, Poland (0x601)
type: Water meter (0x07) encrypted
ver: 0x1a
device: rtlwmbus[00000001]
rssi: 90 dBm
driver: unknown!
telegram=|_41440106721189101A078CE0287AD63030A5CC77537D9D9E36D35E3DD8BE307A7356B5F41DAEEC6F96CD536A902266F25B7947F7C02986E5093E998D935A6C5ECB40|+46

Received telegram from: 11047085
manufacturer: (APA) Apator, Poland (0x601)
type: Water meter (0x07) encrypted
ver: 0x1a
device: rtlwmbus[00000001]
rssi: 73 dBm
driver: unknown!
telegram=|_41440106857004111A078CE0847AA13030A5294DD73956915AB6F10D1848C461E6C68AA13DA2F9DD7D7608E72F0E61881543866B4F96C8634456CCB110D3642755FF|+216

Dzisiaj u mnie spółdzielnia wymieniła wodomierze na te nakładki NAXOM OP-04-1a. Czy mógłbyś się podzielić kluczem? Możliwe, że będzie działał u innych. Jak najlepiej zdobyć klucz? Uderzać do osoby, która montowała, czy do spółdzielni?

Ja swoje klucze już mam, otrzymałem od administracji - napisz do swojej i powinni Ci udostępnić :slight_smile:
W moim przypadku klucze są indywidualne dla każdego licznika, sprawdzałem i nie mogę rozkodować nakładek sąsiadów, moich nakładek ludzie z GitHuba posiadający klucze również nie mogli rozkodować: Support for the water meter Apator op-04-1a · Issue #1499 · wmbusmeters/wmbusmeters · GitHub więc nie obyło się bez uzyskania ich z administracji.

Ja dostalem informacje od Apator

“Nakładki Naxom nadają zgodnie normom standardzie OMS- wysylany jest stan z urządzenia bez danych diagnostycznych. Bez konieczności podawania klucza.”
Moja spółdzielnia napisała do nich w mojej sprawie i taką dostali odpowiedź. I jak mam rozkodowac dane?

Skoro bez klucza, to takie ramki nie są szyfrowane.
skorzystaj z tego
https://wmbusmeters.org/
wrzuć tam przechwycone ramki (tych niekodowanych może być stosunkowo mało), zobacz jaki sterownik pasuje

prawidłowo odkodowana ramka nie będzie miała takiego znacznika czasu
"timestamp":"1970-01-01T00:00:00Z"
tylko czas zbliżony do realnego

Ja uzyskałem klucze od Spółdzielni. Trochę to trwało i wymagało nieco odwołań albo w końcu się udało.

@KuChar
To dodatkowo podziel się kompletem informacji czym to odbierasz i jaki sterownik w wmbus.

Jestem w kontakcie ze @_Szczepan i jedyne czym odbieram dobre ramki to LilyGo T3S3 z tym GitHub - IoTLabs-pl/wM-Bus-Gateway przerobionym pod Lilygo. Sterownik c5isf

1 polubienie

Zapraszam do testów mojego forka repo Szczepana, który wspiera odczyt z nakładki APATOR NAXOM: OP-04-1a, OP-04-1b oraz OP-04-2.

Pragnę od razu dodać, że nakładki NAXOM 1 (modele OP-04-1a, OP-04-1b oraz OP-04-2), mają domyślnie ustawione przez producenta randomowe klucze AES-128. Wpisanie samych zer, jak w przypadku starszych nakładek nie zadziała. Trzeba pozyskać klucze od administracji / zarządu wspólnoty.

4 polubienia

Cześć
Meczę się już kilka dni z tym wodomierzem.
Puki co mam : ESP32-S3-WROOM-1 N16R8 , CC1101 i wodomierz z nakładką Apator Naxom OP-04-1b.
Mam przeczucie że nie potrafię właściwie zainicjować esp32 w esphome.
Może podrzucił by ktoś właściwą konfigurację pliku yaml dla w/w esp32 oraz piny GPIO niepowodujące konfliktów w w/w płytce .

A masz zdefiniowane SPI i piny sterujące GDO0, GDO2 ?

Unikaj pinów od GPIO26 do GPIO32 – są one połączone z Flash i PSRAM. Wykorzystanie ich spowoduje “boot loop” lub błędy odczytu pamięci.

Tak .
Próbowałem już wielu różnych kombinacji pinów. Cały czas boot loop . Co ciekawe w Arduino IDE udało się odebrać jakieś ramki danych , niekoniecznie z mojego Apatora więc wnioskuje że esp i cc działa.
Podejrzewam ze problem jest z właściwym zdefiniowaniem esp w pliku yaml.

Spróbuj tego układu jest “czysty” i nie koliduje z pamięcią:

Funkcja CC1101 Pin GPIO (S3) Uwagi
SCK (CLK) GPIO 7 Standardowy SPI
MISO GPIO 6 Standardowy SPI
MOSI GPIO 5 Standardowy SPI
CS GPIO 4
GDO0 GPIO 1
GDO2 GPIO 2

I yaml:

spi:
  clk_pin: GPIO7
  mosi_pin: GPIO5
  miso_pin: GPIO6

wmbus:
  mosi_pin: GPIO5
  miso_pin: GPIO6
  clk_pin: GPIO7
  cs_pin: GPIO4
  gdo0_pin: GPIO1
  gdo2_pin: GPIO2

# Reszta konfiguracji sensora

Niestety zmiana pinów nie pomogła .

[22:38:41][   147][E][esp32-hal-gpio.c:181] __digitalWrite(): IO 7 is not set as GPIO. Execute digitalMode(7, OUTPUT) first.
[22:38:41][   148][E][esp32-hal-gpio.c:181] __digitalWrite(): IO 5 is not set as GPIO. Execute digitalMode(5, OUTPUT) first.

Moj plik wygląda teraz tak :

esphome:
  name: "licznik"
  friendly_name: "licznik"
  platformio_options:
    build_flags: "-DBOARD_HAS_PSRAM"
    board_build.arduino.memory_type: qio_opi
    board_upload.maximum_ram_size: 524288

esp32:
  board: esp32-s3-devkitc-1
#  flash_size: 16MB  # zakomentowałem, bo moim zdaniem nie działa
  framework:
#    type: esp-idf # (ta konfiguracja nie działa z idf)
    type: arduino
#    version: recommended # nie działa (rekomendowana jest wersja poniżej 2.0.0)
    version: latest

psram:
  mode: octal
  speed: 80MHz

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxx"

ota:
  - platform: esphome
    password: "xxxxx"

wifi:
  ssid: "xxx"
  password: "xxx"

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

captive_portal:

time:
  - platform: sntp
    id: time_sntp

external_components:
  - source: github://MaciejR89/esphome-components@version_4
    refresh: 0d
    components: [ wmbus ]

# to musialem zakomentowac bo wywalalo blad przy kompilacji 
#spi:
#  clk_pin: GPIO7
#  mosi_pin: GPIO5
#  miso_pin: GPIO6

wmbus:
  mosi_pin: GPIO5
  miso_pin: GPIO6
  clk_pin: GPIO7
  cs_pin: GPIO4
  gdo0_pin: GPIO1
  gdo2_pin: GPIO2

  #led_pin: GPIO2
  #led_blink_time: "1s"

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

sensor:
  - platform: wmbus
    meter_id: 0xxxxxxx
    # ^^ Replace the * with the ID of your water meter
    type: apator_op04
    key: "00000000000000000000000000000000"
    # ^^ Replace the * with the key assigned to your water meter

    sensors:
      - name: "woda sygnał"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: "signal_strength"
        state_class: "measurement"
        entity_category: "diagnostic"

      - name: "woda"
        field: "total"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: "water"
        state_class: "total_increasing"
        icon: "mdi:water"
    ```

Proszę🙏 do wstawiania yaml/logów użyj znaku(`)(akcent grawis) który znajduje się na klawiszu razem z tyldą(~), a dokładnie trzy razy (```) i zamknij tak samo

Czyli:
```
logi lub kod
```

Piny razcej są dobre oczywiście te:

Spróbuj :

Wersja ESP-IDF

esphome:
  name: licznik
  friendly_name: licznik

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

logger:
api:
ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Licznik Fallback"
    password: "SDVBFeeXaqcp"

captive_portal:

external_components:
  - source: github://MaciejR89/esphome-components@version_4
    refresh: 0d
    components: [ wmbus ]

wmbus:
  # CC1101 SPI (bezpieczne GPIO)
  mosi_pin: GPIO11
  miso_pin: GPIO13
  clk_pin:  GPIO12
  cs_pin:   GPIO10

  # CC1101 GDO (przerwania) – NIE 1/2
  gdo0_pin: GPIO17
  gdo2_pin: GPIO18

  frequency: 868.950
  all_drivers: false
  sync_mode: true
  log_all: true

sensor:
  - platform: wmbus
    meter_id: 0xxxxxxx
    type: apator_op04
    key: "00000000000000000000000000000000"
    sensors:
      - name: "woda sygnał"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: signal_strength
        state_class: measurement
        entity_category: diagnostic

      - name: "woda"
        field: "total"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: water
        state_class: total_increasing
        icon: "mdi:water"

Wersja Arduino:

esphome:
  name: licznik
  friendly_name: licznik

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino

logger:
api:
ota:

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

external_components:
  - source: github://MaciejR89/esphome-components@version_4
    refresh: 0d
    components: [ wmbus ]

wmbus:
  mosi_pin: GPIO11
  miso_pin: GPIO13
  clk_pin:  GPIO12
  cs_pin:   GPIO10
  gdo0_pin: GPIO17
  gdo2_pin: GPIO18

  frequency: 868.950
  all_drivers: false
  sync_mode: true
  log_all: true

Cześć
Więc sprawa ma się tak :
Wersja ESP-IDF nie przechodzi kompilacja :

src/esphome/components/wmbus/cc1101_rf_settings.h:3:10: fatal error: 
ELECHOUSE_CC1101_SRC_DRV.h: No such file or directory
***************************************************************************************** Looking for ELECHOUSE_CC1101_SRC_DRV.h dependency? Check our library registry!** CLI > platformio lib search "header:ELECHOUSE_CC1101_SRC_DRV.h"* Web > https://registry.platformio.org/search?q=header:%1B%5Bm%1B%5BKELECHOUSE_CC1101_SRC_DRV.h***************************************************************************************** 3 | #include <ELECHOUSE_CC1101_SRC_DRV.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~compilation terminated.*** [.pioenvs/licznik/src/esphome/components/wmbus/rf_cc1101.cpp.o] Error 1
========================= [FAILED] Took 627.14 seconds =========================

Po zmanie na arduino kompilacja przechodzi ale :

[09:48:06]ESP-ROM:esp32s3-20210327
[09:48:06]Build:Mar 27 2021
[09:48:06]rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
[09:48:06]Saved PC:0x4209f5b0
[09:48:06]SPIWP:0xee
[09:48:06]mode:DIO, clock div:1
[09:48:06]load:0x3fce2820,len:0x15c8
[09:48:06]load:0x403c8700,len:0xce4
[09:48:06]load:0x403cb700,len:0x2f98
[09:48:06]entry 0x403c8918
[09:48:06]I (24) boot: ESP-IDF 5.5.2 2nd stage bootloader
[09:48:06]I (24) boot: compile time Feb 22 2026 08:41:36
[09:48:06]I (24) boot: Multicore bootloader
[09:48:06]I (24) boot: chip revision: v0.2
[09:48:06]I (24) boot: efuse block revision: v1.4
[09:48:06]I (25) boot.esp32s3: Boot SPI Speed : 80MHz
[09:48:06]I (25) boot.esp32s3: SPI Mode       : DIO
[09:48:06]I (25) boot.esp32s3: SPI Flash Size : 4MB
[09:48:06]I (25) boot: Enabling RNG early entropy source...
[09:48:06]I (26) boot: Partition Table:
[09:48:06]I (26) boot: ## Label            Usage          Type ST Offset   Length
[09:48:06]I (26) boot:  0 nvs              WiFi data        01 02 00009000 00005000
[09:48:06]I (26) boot:  1 otadata          OTA data         01 00 0000e000 00002000
[09:48:06]I (27) boot:  2 app0             OTA app          00 10 00010000 001c0000
[09:48:06]I (27) boot:  3 app1             OTA app          00 11 001d0000 001c0000
[09:48:06]I (28) boot:  4 eeprom           Unknown data     01 99 00390000 00001000
[09:48:06]I (28) boot:  5 spiffs           Unknown data     01 82 00391000 0000f000
[09:48:06]I (28) boot: End of partition table
[09:48:06]I (29) esp_image: segment 0: paddr=00010020 vaddr=3c140020 size=66024h (417828) map
[09:48:06]I (103) esp_image: segment 1: paddr=0007604c vaddr=3fc96600 size=04d80h ( 19840) load
[09:48:06]I (108) esp_image: segment 2: paddr=0007add4 vaddr=40374000 size=05244h ( 21060) load
[09:48:06]I (113) esp_image: segment 3: paddr=00080020 vaddr=42000020 size=133d74h (1260916) map
[09:48:06]I (336) esp_image: segment 4: paddr=001b3d9c vaddr=40379244 size=0d350h ( 54096) load
[09:48:06]I (348) esp_image: segment 5: paddr=001c10f4 vaddr=50000000 size=00020h (    32) load
[09:48:06]I (356) boot: Loaded app from partition at offset 0x10000
[09:48:06]I (356) boot: Disabling RNG early entropy source...
[09:48:06][I][logger:121]: Log initialized
[09:48:06][C][safe_mode:118]: Unsuccessful boot attempts: 1
[09:48:06][D][esp32.preferences:155]: Writing 1 items: 0 cached, 1 written, 0 failed
[09:48:06][I][app:087]: Running through setup()
[09:48:06][C][wifi:475]: Starting
[09:48:06][D][wifi:1098]: Starting scan
[09:48:06][C][component:249]: Setup wifi took 60ms
[09:48:06][W][component:386]: api set Warning flag: unspecified
[09:48:06][   139][E][esp32-hal-gpio.c:181] __digitalWrite(): IO 12 is not set as GPIO. Execute digitalMode(12, OUTPUT) first.
[09:48:06][   140][E][esp32-hal-gpio.c:181] __digitalWrite(): IO 11 is not set as GPIO. Execute digitalMode(11, OUTPUT) first.
[09:48:11]E (10594) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
[09:48:11]E (10594) task_wdt:  - loopTask (CPU 1)
[09:48:11]E (10594) task_wdt: Tasks currently running:
[09:48:11]E (10594) task_wdt: CPU 0: IDLE0
[09:48:11]E (10594) task_wdt: CPU 1: loopTask
[09:48:11]E (10594) task_wdt: Aborting.
[09:48:11]E (10594) task_wdt: Print CPU 1 backtrace
[09:48:11]
[09:48:11]
[09:48:11]
[09:48:11]
[09:48:11]Backtrace: 0x4209245d:0x3fcebcf0 0x420899c4:0x3fcebd10 0x42089ac6:0x3fcebd30 0x4208a34d:0x3fcebd50 0x4208a46e:0x3fcebd70 0x42071ae4:0x3fcebd90 0x4207b911:0x3fcebdd0 0x42125811:0x3fcebe10 0x4207e160:0x3fcebe30 0x4207d97d:0x3fcebe50 0x420806a9:0x3fcebe90 0x42008fe2:0x3fcebf30
[09:48:11]
[09:48:11]
[09:48:11]
[09:48:11]
[09:48:11]ELF file SHA256: baf45ad8d
[09:48:11]

I tak w kółko .

Dodatkowo podczas kompilacji zauwazyłęm że moja płytka jest rozpoznawana jako :

HARDWARE: ESP32S3 240MHz, 320KB RAM, 4MB Flash

Ma 16 MB Flash z Twojego oznaczenia.
Piny i przykładowy kod to AI na mój prompt z dokumetacji technicznej układu , repo oraz Twojego Yaml.

W tej chwili przepuściłem siebie validacje i poniższy przykładowy kod się skompilował :

esphome:
  name: licznik
  friendly_name: licznik

esp32:
  board: esp32-s3-devkitc-1
  flash_size: 16MB
  framework:
    type: arduino

logger:
api:
ota:
time:
  - platform: sntp
    id: time_sntp

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Licznik Fallback"
    password: "SDVBFeeXaqcp"

captive_portal:

external_components:
  - source: github://MaciejR89/esphome-components@version_4
    refresh: 0d
    components: [ wmbus ]
    
wmbus:
  # CC1101 SPI (bezpieczne GPIO)
  mosi_pin: GPIO11
  miso_pin: GPIO13
  clk_pin:  GPIO12
  cs_pin:   GPIO10

  # CC1101 GDO (przerwania) – NIE 1/2
  gdo0_pin: GPIO17
  gdo2_pin: GPIO18

  frequency: 868.950
  all_drivers: false
  sync_mode: true
  log_all: true

sensor:
  - platform: wmbus
    meter_id: 123456789
    type: apator_op04
    key: "00000000000000000000000000000000"
    sensors:
      - name: "woda sygnał"
        field: "rssi"
        accuracy_decimals: 0
        unit_of_measurement: "dBm"
        device_class: signal_strength
        state_class: measurement
        entity_category: diagnostic

      - name: "woda"
        field: "total"
        accuracy_decimals: 3
        unit_of_measurement: "m³"
        device_class: water
        state_class: total_increasing
        icon: "mdi:water"

Niestety dalej nic .
AI tutaj nie pomaga za dobrze .