-
Notifications
You must be signed in to change notification settings - Fork 0
Configuration
Krótko: minimalny klient do odczytu rejestrów z dataloggera SmartESS / Dessmonitor.
Program wysyła UDP notify, akceptuje połączenie TCP od dataloggera i tuneluje żądania Modbus RTU przez Modbus TCP, zwracając wynik jako JSON.
Szybkie linki:
Dla developerów i szczegółów technicznych zobacz README.md w repozytorium.
W kilku krokach uruchomienia:
- Sklonuj repozytorium:
git clone <repo-url>- (Opcjonalnie) utwórz i aktywuj virtualenv (Windows):
python -m venv venv
venv\Scripts\activate- Uruchom przykład (przykładowy IP i rejestr):
python smartess_client.py 192.168.1.50 100 --count 2Wymagania:
- Python 3.7+
- Komputer i datalogger w tej samej sieci LAN (lub skonfigurowany routing / przekierowanie portów)
Uwaga: projekt nie używa zewnętrznych pakietów (standardowa biblioteka Pythona).
Wywołanie:
python smartess_client.py <IP_DATALOGGERA> <REGISTER> [--count N] [--localip X.X.X.X] [--tcp-port 502] [--udp-port 58899] [--debug]Argumenty:
-
IP_DATALOGGERA— adres IP urządzenia SmartESS -
REGISTER— adres startowy rejestru (liczba całkowita) -
--count— liczba rejestrów do odczytu (domyślnie 1) -
--localip— wymuszony lokalny adres interfejsu (autodetekcja jeśli brak) -
--tcp-port— port TCP Anenji (domyślnie 502) -
--udp-port— port UDP (domyślnie 58899) -
--debug— włącza dodatkowe logi
Przykład wynikowego JSON:
{ "ts": "2025-09-30T12:00:00", "100": 123, "101": -5 }Opis działania:
- Skrypt wysyła UDP notify do dataloggera (port domyślny
58899). - Otwiera nasłuch TCP (domyślnie port
502) i akceptuje połączenie, które inicjuje datalogger. - Wysyła tunelowaną ramkę Modbus (funkcja 3 — odczyt holding registers) i parsuje odpowiedź.
- Zwraca wynik jako JSON z timestampem.
Parametry i uwagi techniczne:
-
--localip— jeśli host ma wiele interfejsów, użyj tej opcji by wskazać adres źródłowy (jeśli brak, skrypt próbuje autodetekcji). -
--tcp-port— port, na który skrypt nasłuchuje połączenia od dataloggera (domyślnie502). Upewnij się, że port jest otwarty i nieblokowany przez system/firewall. -
--udp-port— port, na który skrypt wysyła notify (domyślnie58899). -
--debug— włącza szczegółowe logi (przydatne do debugowania połączeń i ramek).
Protokół i specyfika:
- SmartESS przesyła tunelowane ramki: MBAP + prefiks
0x04 0x01zawierający RTU PDU + CRC RTU. Oznacza to, że nie można traktować ruchu jako czysty Modbus TCP — skrypt uwzględnia prefiks i CRC. - Jeśli host jest za NAT, uruchom skrypt w tej samej sieci co datalogger lub skonfiguruj przekierowania portów/publiczny adres.
CRC16 (MODBUS) — jak to działa w projekcie:
- Algorytm CRC używany w Modbus RTU:
- Inicjalna wartość CRC =
0xFFFF. - Dla każdego bajtu: XOR z bieżącym CRC, następnie 8 iteracji przesunięcia w prawo; jeśli najmłodszy bit był ustawiony, XOR z polinomem
0xA001. - Rezultat to 16-bitowa wartość CRC zapisana w porządku little-endian (LSB pierwsze) przy dołączaniu do ramki.
- Inicjalna wartość CRC =
- W tym repozytorium funkcja obliczająca CRC to
crc16_modbus(data: bytes) -> intwsmartess_client.py. Przy budowie tunelowanej ramki CRC jest dopisywane jakostruct.pack("<H", crc). - Przykład użycia (w kodzie): przy budowie PDU obliczamy CRC po bajcie Unit ID (0x01) + RTU-PDU i dołączamy w little-endian:
crc = crc16_modbus(b"\x01" + fn_addr_qty)
pdu = b"\x04\x01" + fn_addr_qty + struct.pack("<H", crc)- Uwaga praktyczna: podczas parsowania odpowiedzi warto weryfikować długość PDU uwzględniając CRC (2 bajty) i oczekiwaną liczbę danych.
Q: Skrypt nie otrzymuje połączenia TCP — co sprawdzić?
- Sprawdź, czy firewall na hoście nie blokuje portu
502. - Upewnij się, że komputer i datalogger są w tej samej sieci lub skonfigurowany jest odpowiedni routing/NAT.
Q: Czy potrzebuję dodatkowych bibliotek Pythona?
- Nie — projekt używa tylko standardowej biblioteki (Python 3.7+).
Q: Co oznacza tunelowanie w kontekście SmartESS?
- Datalogger używa MBAP nagłówka, ale PDU zawiera prefiks
0x04 0x01i wewnątrz znajduje się RTU PDU wraz z CRC — stąd specyficzne parsowanie i budowa ramek.
Q: Gdzie znaleźć szczegółowe informacje techniczne?
- Dla programistów i szczegółowych opisów funkcji sprawdź
README.mdw repozytorium.
Chętnie przyjmujemy poprawki i małe PR-y.
Zasady:
- Preferuj małe, jedna-logiczna-zmiana na Pull Request.
- Dobrze opisuj tytuł PR i opisuj co i dlaczego zmieniasz.
- Testuj lokalnie jeśli to możliwe.
Edycja dokumentacji Wiki:
- Możesz edytować przez UI GitHub lub sklonować repozytorium wiki:
git clone https://github.com/<user>/<repo>.wiki.gitNastępnie commit → push. Jeśli pracujesz nad kodem, utwórz branch w głównym repo i otwórz PR tam.
Kontakt:
- Zgłaszaj błędy i propozycje przez Issues w głównym repozytorium.
- Podstawowy klient do odczytu rejestrów z dataloggera SmartESS/Dessmonitor.
- Wysyłanie UDP notify, akceptacja połączenia TCP, tunelowanie Modbus RTU przez Modbus TCP.
- Wyjście w formacie JSON z timestampem.