Skip to content

Komponent ESPHome IEC 62056-21

IEC 62056-21 to międzynarodowy standard protokołu do wymiany danych z licznikami użytkowymi. Głównie dla energii elektrycznej, ale także dla wody, ciepła i innych liczników. Wcześniej znany jako IEC 61107.

Komponent iec62056 pozwala na odczyt danych z dowolnego kompatybilnego licznika. Wymaga portu szeregowego i zewnętrznego interfejsu optycznego. Wymiana danych odbywa się za pomocą kanału optycznego w podczerwieni. Kompatybilne liczniki są wyposażone w charakterystyczną okrągłą metalową płytkę z dwoma elementami optycznymi wewnątrz. Protokół może być używany z innymi warstwami transportowymi, np. pętlą prądową, ale komponent był testowany tylko z interfejsem optycznym.

Obsługuje 4 tryby IEC 62056-21: A, B, C i D. Tryb E nie jest obsługiwany.

Komponent nie obsługuje programowania. Ustawienie parametrów konfiguracyjnych licznika wymaga tajnego hasła, co uniemożliwia jego użycie przez zwykłych użytkowników.

Interfejs na liczniku. Metalowy pierścień dla magnesu i dwa elementy optyczne wewnątrz.

Istnieją inne standardy inteligentnych liczników, które używają tego samego interfejsu optycznego. Chociaż dzielą pewne wspólne koncepcje, nie są kompatybilne.

Instalacja

Dodaj następujący kod do pliku konfiguracyjnego YAML ESPHome, aby odwołać się do zewnętrznego komponentu.

yaml
external_components:
    # Komponent IEC62056
    - source: github://aquaticus/esphome-iec62056

Teoria działania

Komponent działa w 2 głównych trybach:

  • Dwukierunkowa komunikacja z licznikiem. W tym trybie licznik wysyła dane tylko na żądanie. Wymaga odbiornika i nadajnika IR. To jest tryb A, B i C zgodnie z IEC 62056-21.
  • Jednokierunkowa komunikacja, gdzie licznik wysyła dane do sondy od czasu do czasu. Wymaga tylko odbiornika IR. W terminologii IEC 62056-21 jest to tryb D.

Tryby A, B, C

Komponent odczytuje dane po raz pierwszy 15 sekund po uruchomieniu. Najpierw wysyła żądanie identyfikacyjne z prędkością 300 bps. Licznik zwraca maksymalną prędkość transmisji, którą może obsłużyć. Następnie prędkość transmisji portu szeregowego jest zmieniana na wartość podaną przez licznik lub skonfigurowaną przez opcję baud_rate_max. Licznik przesyła rejestry danych z przypisanymi kodami OBIS.

Jeśli transmisja nie powiodła się (zły suma kontrolna lub nieprawidłowy format), komponent spróbuje ponownie odczytać dane, ale tym razem używając wolniejszej prędkości transmisji. Przy każdej próbie prędkość jest zmniejszana. Liczba prób i opóźnień może być konfigurowana.

Jeśli licznik jest zasilany bateryjnie, można zastosować specjalną sekwencję wybudzania. Dzieje się to tylko wtedy, gdy battery_meter jest ustawiony na True.

Tryb D

Dla liczników działających w trybie D potrzebny jest tylko odbiornik IR, ponieważ transmisja do licznika nie jest obsługiwana. W tym trybie licznik wysyła dane co kilka sekund bez żadnego żądania. Należy skonfigurować port szeregowy, aby pasował do formatu transmisji licznika. W przeciwieństwie do trybów A, B i C, które są wykrywane automatycznie, tryb D musi być włączony ręcznie przez ustawienie mode_d=True w konfiguracji platformy.

Tryb E

Ten tryb nie jest obsługiwany. Tryb E używa kodowania binarnego przez łącze HDLC.

Komponent próbuje użyć trybu C dla liczników zgłaszających tryb E. Powinno to działać, jeśli licznik obsługuje oba tryby E i C. Dla liczników obsługujących tylko tryb E odczyt nie jest możliwy.

Kody OBIS

Kod OBIS (Object Identification System) identyfikuje różne odczyty z licznika. Kod składa się z maksymalnie 6 grup podidentyfikatorów. Kod jest sformatowany w następujący sposób: A-B:C.D.E*F, gdzie:

  • A - medium: 0=abstrakcyjne obiekty, 1=elektryczność, 6=ciepło, 7=gas, 8=woda
  • B - kanał, 0=brak dostępnego kanału
  • C - wartość fizyczna, na przykład prąd, napięcie, temperatura.
  • D - typ pomiaru,
  • E - taryfa, 0=całkowita, 1=taryfa #1, 2=taryfa #2 i tak dalej
  • F - okres rozliczeniowy

A, B i F mogą być pominięte. Kody mogą używać cyfr szesnastkowych, na przykład kod 15.8.0 może być reprezentowany jako F.8.0.

Kody są znormalizowane, ale urządzenia wysyłają różną liczbę kodów. Aby uzyskać listę kodów obsługiwanych przez Twój licznik, włącz log DEBUG dla komponentu iec62056 i obserwuj wynik logu. Przykładowy wynik:

log
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.1(00000009999.567*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.2(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.3(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.4(00000000000.000*kWh)'

TIP

Kod OBIS sensora musi dokładnie odpowiadać temu, co jest transmitowane z licznika. Jest to część przed pierwszym nawiasem (.

Jeśli kod OBIS ma tylko dwie cyfry, należy użyć cudzysłowów w pliku konfiguracyjnym; na przykład "1.2" zamiast tylko 1.2.

Aby uzyskać listę kodów OBIS dla liczników elektrycznych, można odwiedzić:

Sprzęt

Aby komunikować się z licznikiem, należy podłączyć interfejs optyczny do portu szeregowego. Interfejs składa się z diody LED na podczerwień i fototranzystora. Dodatkowo urządzenie musi być wyposażone w pierścień magnetyczny, aby utrzymać je w linii z licznikiem.

Jeśli licznik działa w trybie jednokierunkowym D, wymagany jest tylko fototranzystor IR.

Sonda

Standard definiuje maksymalne wymiary sondy, którą można podłączyć do licznika. Musi być wyposażona w magnes, ponieważ jest to jedyny sposób na utrzymanie sondy w stabilnej pozycji.

Wymiary sondy optycznej

Konfiguracja

Aby zobaczyć dane z licznika w Home Assistant, należy zdefiniować czujnik lub czujnik tekstowy z odpowiednim kodem OBIS. Należy pamiętać, że liczniki obsługują różne zestawy kodów OBIS. Domyślnie komponent nie definiuje żadnych czujników.

Port szeregowy

Komponent wymaga szyny UART. Port szeregowy musi być skonfigurowany jako 7E1 w większości przypadków. Gdy mode_d=True, prędkość transmisji musi być ustawiona na wartość obsługiwaną przez licznik. Zwykle 2400 lub 9600 bps. Dla innych trybów (mode_d=False) prędkość transmisji jest negocjowana z licznikiem. baud_rate jest ignorowane i może mieć dowolną wartość.

yaml
# Example UART configuration entry
uart:
    rx_pin: GPIO21
    tx_pin: GPIO22
    baud_rate: 9600
    data_bits: 7
    parity: EVEN
    stop_bits: 1

WARNING

Dla ESP8266 zaleca się użycie sprzętowego UART. Oprogramowanie UART nie może obsługiwać transmisji szybszych niż 4800 bps.

Może być konieczne wyłączenie logowania, jeśli sonda optyczna jest podłączona do portu szeregowego używanego przez komponent loggera.

yaml
# Ustaw baud_rate na 0, aby wyłączyć logowanie przez UART.
logger:
    baud_rate: 0

Platforma

Aby użyć komponentu, należy zdefiniować sekcję platformy iec62056 w pliku konfiguracyjnym. Składa się ona z podstawowych ustawień.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Przykładowa konfiguracja platformy dla komunikacji jednokierunkowej
iec62056:
  mode_d: True

Zmienne konfiguracyjne

  • update_interval (Opcjonalne, Time): Interwał odczytu danych z licznika. Domyślnie 15min. never wyłącza aktualizacje. W takim przypadku należy użyć przełącznika do wyzwalania odczytu. Aby uzyskać ciągłe odczyty, użyj małej wartości, np. 1s.
  • baud_rate_max (Opcjonalne, int): Ogranicza maksymalną prędkość transmisji do określonej wartości. Domyślnie ustawiona na 9600, ponieważ zapewnia stabilne połączenie. Aby ją wyłączyć, ustaw na 0. W ten sposób można użyć maksymalnej możliwej prędkości transmisji 19200, jeśli licznik to obsługuje. Dla ESP8266 użyj programowego UART ustawionego na 4800 lub mniej.
  • receive_timeout (Opcjonalne, Time): Maksymalny czas oczekiwania komponentu na dane z licznika przed zgłoszeniem błędu transmisji. Domyślnie 3s.
  • battery_meter (Opcjonalne, boolean): Ustaw na true, jeśli licznik jest zasilany bateryjnie. W ten sposób zostanie użyta specjalna sekwencja uruchamiania.
  • retry_delay (Opcjonalne, Time): W przypadku niepowodzenia transmisji, czas oczekiwania przed ponowną próbą transmisji. Domyślnie 15s.
  • retry_counter_max (Opcjonalne, int): W przypadku niepowodzenia transmisji, maksymalna liczba prób ponownych. Domyślnie 2.
  • uart_id (Opcjonalne, ID: Ręczne określenie ID Komponentu UART, jeśli chcesz używać wielu magistrali UART.
  • mode_d (Opcjonalne, boolean): Ustaw na True, jeśli licznik wysyła dane co kilka sekund. Wymusza to działanie komponentu w trybie D. W tym trybie dane nigdy nie są przesyłane do licznika. Jeśli ustawione, wszystkie inne ustawienia oprócz receive_timeout są ignorowane. Nie zapomnij ustawić prędkości transmisji UART, której używa licznik. Jeśli nie jesteś pewien, spróbuj 2400 7E1 lub 9600 7E1.

::: ostrzeżenie Liczniki zasilane bateryjnie zazwyczaj ograniczają liczbę odczytów, aby oszczędzać energię, np. do 4 odczytów dziennie. Jeśli licznik nie narzuca limitu, częste odczyty mogą znacząco skrócić żywotność baterii. :::

Czujnik

Czujnik raportuje pierwszą wartość w nawiasach z rekordu. Dla następujących danych

log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)

wartość czujnika to 6000.385. Aby uzyskać drugą wartość (data/czas w tym przykładzie), użyj Czujnika Tekstowego.

Czujnik obsługuje tylko wartości dziesiętne. Jeśli rekord zawiera dane w innym formacie, musisz użyć Czujnika Tekstowego i opcjonalnie lambdy, aby przekonwertować je na liczbę.

yaml
# Example sensor configuration entries
sensor:
  - platform: iec62056
    obis: 1-0:15.8.0
    name: Absolute active energy total
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing

  - platform: iec62056
    name: Instantaneous current in phase L1
    obis: 1-0:31.7.0
    unit_of_measurement: A
    accuracy_decimals: 2
    device_class: current
    state_class: measurement

  - platform: iec62056
    name: Instantaneous voltage in phase L1
    obis: 1-0:32.7.0
    unit_of_measurement: V
    accuracy_decimals: 1
    device_class: voltage
    state_class: measurement

  - platform: iec62056
    name: Absolute active instantaneous power
    obis: 1-0:15.7.0
    unit_of_measurement: kW
    accuracy_decimals: 3
    device_class: energy
    state_class: measurement

Zmienne konfiguracyjne

  • obis (Wymagane): Kod OBIS.
  • Wszystkie inne opcje z Czujnika.

Czujnik Tekstowy

Czujnik tekstowy dostarcza dane odczytu jako tekst. W przeciwieństwie do Czujnika, możesz wybrać, która część odczytu jest raportowana, a nawet wysłać cały rekord danych z powrotem do Home Assistant.

yaml
# Sample text sensor configuration
# Data record:
# 1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)

text_sensor:
  - platform: iec62056
    obis: 1-0:15.6.0
    group: 2 # "2000-01-01 20:10:30"
    name: Date time

  - platform: iec62056
    obis: 1-0:15.6.0
    group: 1 # "00000006000.385"
    name: Value

  - platform: iec62056
    obis: 1-0:15.6.0
    group: 0 # "1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)"
    name: The entire record

Zmienne konfiguracyjne

  • obis (Wymagane): Kod OBIS. Możesz zdefiniować wiele czujników tekstowych z tym samym OBIS, ale inną grupą.
  • group (Opcjonalne, int): Grupa wartości, 0, 1 lub 2. Domyślnie 1. Jeśli ustawione na 0, raportowany jest cały rekord danych, w tym kod OBIS. 1 raportuje pierwszą wartość, 2 drugą.
  • Wszystkie inne opcje pochodzą z Czujnika Tekstowego.

Konwersja danych

Jeśli licznik raportuje dane jako wartość nie-dziesiętną, możesz je automatycznie przekonwertować, używając czujnika szablonowego i lambdy. Załóżmy, że licznik wysyła rekord jak poniżej z danymi zakodowanymi w formacie szesnastkowym:

text
0-0:96.8.0*255(ABCDEF00)

Najpierw utwórz czujnik szablonowy, który opublikuje dane jako wartość dziesiętną.

yaml
sensor:
  - platform: template
    id: hex_to_dec_sensor
    name: "Converted hexadecimal number"

Teraz utwórz czujnik tekstowy, który odbierze dane jako ciąg znaków, przekonwertuje je na dziesiętną i opublikuje.

yaml
text_sensor:
  - platform: iec62056
    id: hex_sensor
    obis: 0-0:96.8.0*255
    name: Hex content
    internal: True
    on_value:
      lambda: |-
        std::string hex_str = id(hex_sensor).state;
        uint32_t dec=std::stoul(hex_str, nullptr, 16);
        ESP_LOGI("iec62056.component", "Converted HEX '%s' to %u decimal", hex_str.c_str(), dec);
        id(hex_to_dec_sensor).publish_state((float)dec);

Za każdym razem, gdy czujnik tekstowy otrzymuje nową wartość, konwertuje ją na dziesiętną i publikuje za pomocą czujnika o identyfikatorze hex_to_dec_sensor. Flaga internal zapobiega widoczności czujnika w Home Assistant. W logu powinieneś zobaczyć:

log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal

Te same wyniki można uzyskać za pomocą lambd Home Assistant. W tym scenariuszu czujnik tekstowy publikuje wartość szesnastkową, a czujnik szablonowy Home Assistant dokonuje konwersji.

Przełącznik

Przełącznik umożliwia wyzwolenie odczytu na żądanie. Gdy stan zmienia się z OFF na ON, komponent inicjuje transmisję danych z licznika. Możesz użyć przełącznika w automatyzacji.

Można użyć zmiennych konfiguracyjnych z Przełącznik.

yaml
# Sample switch configuration
switch:
  - platform: iec62056
    name: 'Readout Trigger'

Nie można wyzwolić odczytu w trybie D.

Czujnik binarny

Ustawia się na ON, gdy rozpoczyna się transmisja do licznika. OFF, gdy transmisja jest zakończona.

Możesz użyć wszystkich zmiennych konfiguracyjnych z Czujnik binarny.

yaml
# Sample automation to turn LED on when data read from a meter
switch:
  - platform: gpio
    pin: GPIO2
    name: Internal LED
    id: led_switch
    internal: True

binary_sensor:
  - platform: iec62056
    id: meter_status
    name: Meter Connection Status
    on_press:
      then:
        - switch.turn_on: led_switch
    on_release:
      then:
        - switch.turn_off: led_switch

Rozwiązywanie problemów

  • Upewnij się, że sonda jest prawidłowo ustawiona względem elementów optycznych na liczniku.
  • Liczniki są zwykle instalowane w miejscach niezbyt czystych. Może być konieczne usunięcie kurzu z interfejsu optycznego od czasu do czasu.
  • Jeśli napotkasz błędy transmisji i sumy kontrolnej BCC, zmniejsz prędkość transmisji za pomocą ustawienia baud_rate_max.
  • Jeśli Twoje urządzenie obsługuje wiele czujników, które spędzają dużo czasu w pętli aktualizacji, może być konieczne zwiększenie rozmiaru bufora portu szeregowego. Szczególnie jeśli zauważysz problemy z transmisją, gdy dodatkowe czujniki są włączone, ale nie, gdy są wyłączone.

Zobacz także