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.
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=wodaB
- kanał, 0=brak dostępnego kanałuC
- 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 dalejF
- 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ć:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
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.
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 na0
. W ten sposób można użyć maksymalnej możliwej prędkości transmisji19200
, jeśli licznik to obsługuje. Dla ESP8266 użyj programowego UART ustawionego na4800
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óczreceive_timeout
są ignorowane. Nie zapomnij ustawić prędkości transmisji UART, której używa licznik. Jeśli nie jesteś pewien, spróbuj2400 7E1
lub9600 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
lub2
. Domyślnie1
. Jeśli ustawione na0
, 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.