Cześć, jak poprawnie czytać stan stref odbieranych za pomocą integracji ETHM 1 plus
Kluczowe punkty
• Sesja = TCP→logowanie→pytanie→odpowiedź→CRC.
• Ramka ma stały nagłówek 0xFEFE … CRC … 0xFE0D.
• Jedna odpowiedź obejmuje 8 stref (1 bajt = 8 bitów); kolejne zakresy odczytuje się kolejnymi ramkami.
• Przed odczytem stref musisz włączyć „Dostęp przez TCP/IP” oraz (opcjonalnie) szyfrowanie w DLOAD-X.
Struktura każdej ramki:
\[0xFE 0xFE\] \[CMD\] \[DATA(16 B)\] \[CRC_H\] \[CRC_L\] \[0xFE 0x0D\]
CRC = CRC-16/IBM z początkową wartością 0x147A.
• CMD 0x11 – Login (w DATA: 0-4 cyfr kodu użytkownika, pozostałe zera).
• CMD 0x0A – Read Partitions Status (DATA: numer pierwszej strefy, reszta zer).
• CMD 0x0B – Read Partitions Detailed (alarm, exit/entry, memory).
• CMD 0x0F – Logout.
Odpowiedź do 0x0A:
DATA[0]… – kolejne bajty; bit 0 LSB = strefa 1, bit 1 = 2 … bit 7 = 8; bajt 2 = strefy 9-16 itd.
Bit = 1 → strefa uzbrojona (FULL lub PART), bit 0 = rozbrojona.
Aby odróżnić „alarm” od „uzbrojenia” użyj 0x0B (8 bajtów alarmów, 8 bajtów alarm-memory, 8 bajtów entry/exit).
Przykład (pierwsze 16 stref):
Zapytanie:
FEFE 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CRC_H CRC_L FE0D
Odpowiedź (fragment):
FEFE 0A 03 00 … – strefy 1 i 2 uzbrojone (bits 0-1 = 1), reszta 0.
socket.create_connection(("192.168.0.50", 7094), timeout=2)
0xEF
w polu CMD) wyślij 0x0A (offset 0). GET http://IP_ETHM/api/partitions
Header: Authorization: Bearer <token>
Odpowiedź:
{“partitions”:[{“id”:1,“armed”:true,“alarm”:false,“exit_time”:false,…}, …]}
Token uzyskuje się żądaniem POST /api/login (login=user, pin=1234).
• Logowanie wymagane co ~60 s – podtrzymuj sesję „PING” 0xFEFE 0x00…
• CRC błędne → brak odpowiedzi. Zweryfikuj endian.
• Po włączeniu szyfrowania musisz najpierw wymienić klucz AES (komenda 0x17 „Kex”), inaczej centrala nie odpowie.
• „Strefa” ≠ „Wejście (zone)” – do wejść używa się 0x07/0x08.
• SATEL od firmware 1.08 konsekwentnie rozwija wewnętrzne REST API (obecnie nieudokumentowane, ale stabilne).
• W społeczności open-source popularne są biblioteki: satel-integra
(Python, pip), aiosatel
, integracja Home-Assistant (2024.2+).
• Kierunek rozwoju: pełny HTTPS oraz MQTT v5 w następcach ETHM-1 Plus (zapowiadany ETHM-2).
• Algorytm CRC-16/IBM: polynomial 0xA001, init 0x147A, refIn/out = true.
• Szyfrowanie AES-128-CBC, IV = 0, klucz = MD5(hardware_id+user_password).
• „Maski stref” – dokument „INTEGRA Protocol 1.6”, tabele 3-2 i 3-3.
• Moduł służy do systemów sygnalizacji włamania – nieuprawnione odczyty stanowią naruszenie art. 269b §1 KK (Polska).
• Zdalny dostęp spoza LAN należy chronić VPN-em lub IPSec; otwarty port 7094 grozi przejęciem sterowania alarmem.
• Zgodnie z EN 50131-3 klasa Grade 2/3 wymaga logowania użytkownikiem klasy G2+.
• Do prototypowania użyj trybu „GPRS-S” w ETHM (szyfrowanie wyłączone) – łatwiej szukać błędów.
• Ustal stały okres odpytywania (0x0A) 1–2 s; przy szybszym możesz przekroczyć limit 20 poleceń/s.
• Loguj pełne ramki HEX – przy reklamacji producent wymaga trace z Wiresharka.
• Dokumentacja protokołu nie jest oficjalnie publikowana – producent może w każdej chwili zmienić polecenia.
• REST API jest „beta” – brak gwarancji ciągłości w starszych firmware (<1.08).
• Przy włączonym szyfrowaniu ruchu TCP nie zobaczysz ramki w prostym snifferze.
• Test MQTT bridge’ów do ETHM (projekt „ethm-mqtt-bridge”).
• Analiza firmware’u ETHM-1 Plus pod kątem CVE-2023-XXXXX (stack overflow w module HTTP).
• Porównanie czasu reakcji: protokół binarny vs REST JSON vs push-notyfikacje.
Poprawny odczyt stanu stref z ETHM-1 Plus wymaga:
/api/partitions
. Stosując powyższe kroki uzyskasz wiarygodny, ciągły podgląd uzbrojenia, naruszeń i alarmów wszystkich stref z poziomu własnej aplikacji lub systemu automatyki budynkowej.