ESPHome IEC 62056-21 Komponenta
IEC 62056-21 je mezinárodní standard pro protokol pro výměnu dat s měřiči. Většinou pro elektřinu, ale také pro vodu, teplo a další měřiče. Dříve byl znám jako IEC 61107.
Komponenta iec62056
vám umožňuje číst data z jakéhokoli kompatibilního měřiče. Vyžaduje sériový port a externí optické rozhraní. Výměna dat používá infračervený optický kanál. Kompatibilní měřiče jsou vybaveny charakteristickou kulatou kovovou deskou se dvěma opto-prvky uvnitř. Protokol by mohl být použit s jinými transportními vrstvami, např. proudovou smyčkou, ale komponenta byla testována pouze s optickým rozhraním.
Podporuje 4 režimy IEC 62056-21: A, B, C a D. Režim E není podporován.
Komponenta nepodporuje programování. Nastavení konfiguračních parametrů měřiče vyžaduje tajné heslo, což znemožňuje jeho použití běžnými uživateli.
Existují další standardy pro chytré měřiče, které používají stejné optické rozhraní. Ačkoli sdílejí některé společné koncepty, nejsou kompatibilní.
Instalace
Přidejte následující kód do konfiguračního souboru ESPHome YAML pro odkaz na externí komponentu.
yaml
external_components:
# IEC62056 komponenta
- source: github://aquaticus/esphome-iec62056
Teorie provozu
Komponenta pracuje ve 2 hlavních režimech:
- Obousměrná komunikace s měřičem. V tomto režimu měřič posílá data pouze na vyžádání. Vyžaduje IR přijímač a vysílač. Toto je režim A, B a C podle IEC 62056-21.
- Jednosměrná komunikace, kde měřič posílá data do sondy čas od času. Vyžaduje pouze IR přijímač. V terminologii IEC 62056-21 je to režim D.
Režimy A, B, C
Komponenta čte data poprvé 15 sekund po spuštění. Nejprve odešle žádost o identifikaci při 300 bps. Měřič vrátí maximální přenosovou rychlost, kterou může zvládnout. Poté se přenosová rychlost sériového portu změní na hodnotu poskytnutou měřičem nebo nakonfigurovanou pomocí možnosti baud_rate_max
. Měřič přenáší datové registry s přidruženými OBIS kódy.
Pokud přenos selhal (špatná kontrolní součet nebo neplatný formát), komponenta se pokusí znovu přečíst data, tentokrát však s nižší přenosovou rychlostí. Při každém opakování se rychlost snižuje. Počet opakování a zpoždění lze konfigurovat.
Pokud je měřič napájen z baterie, může být použita speciální sekvence probuzení. To se stane pouze tehdy, když je battery_meter
nastaveno na True
.
Režim D
Pro měřiče pracující v režimu D potřebujete pouze IR přijímač, protože přenos do měřiče není podporován. V tomto režimu měřič odesílá data každých několik sekund bez jakéhokoli požadavku. Měli byste nakonfigurovat sériový port tak, aby odpovídal formátu přenosu měřiče. Na rozdíl od režimů A, B a C, které jsou detekovány automaticky, musí být režim D povolen ručně nastavením mode_d=True
v konfiguraci platformy.
Režim E
Tento režim není podporován. Režim E používá binární kódování přes HDLC linku.
Komponenta se pokusí použít režim C pro měřiče hlásící režim E. To by mělo fungovat, pokud měřič podporuje oba režimy E a C. Pro měřiče podporující pouze režim E není čtení možné.
OBIS kódy
OBIS (Object Identification System) kód identifikuje různé odečty z měřiče. Kód se skládá až ze 6 skupin podidentifikátorů. Kód je formátován takto: A-B:C.D.E*F
, kde:
A
- médium: 0=abstraktní objekty, 1=elektřina, 6=teplo, 7=plyn, 8=vodaB
- kanál, 0=žádný kanál není k dispoziciC
- fyzická hodnota, například proud, napětí, teplota.D
- typ měření,E
- tarif, 0=celkem, 1=tarif č. 1, 2=tarif č. 2 a tak dáleF
- fakturační období
A
, B
a F
mohou být vynechány. Kódy mohou používat hexadecimální číslice, například kód 15.8.0
by mohl být reprezentován jako F.8.0
.
Kódy jsou standardizovány, ale zařízení odesílají různé množství kódů. Chcete-li získat seznam kódů podporovaných vaším měřičem, povolte DEBUG
log pro komponentu iec62056
a sledujte výstup logu. Ukázkový výstup:
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
OBIS kód senzoru musí přesně odpovídat tomu, co je přenášeno z měřiče. Toto je část před první závorkou (
.
Pokud je OBIS kód pouze dvouciferný, měli byste v konfiguračním souboru použít uvozovky; například "1.2"
místo jen 1.2
.
Pro seznam OBIS kódů pro elektroměry můžete navštívit:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Hardware
Pro komunikaci s měřičem musíte připojit optické rozhraní k sériovému portu. Rozhraní se skládá z infračervené LED a fototranzistoru. Kromě toho musí být zařízení vybaveno kruhovým magnetem, aby bylo zarovnáno s měřičem.
Pokud měřič pracuje v jednosměrném režimu D, je vyžadován pouze IR fototranzistor.
Sonda
Standard definuje maximální rozměry sondy, kterou lze připojit k měřiči. Musí být vybavena magnetem, protože je to jediný způsob, jak udržet sondu ve stabilní poloze.
Konfigurace
Pro zobrazení dat z měřiče v Home Assistant musíte definovat senzor nebo textový senzor s příslušným OBIS kódem. Všimněte si, že měřiče podporují různé sady OBIS kódů. Ve výchozím nastavení komponenta nedefinuje žádné senzory.
Sériový port
Komponenta vyžaduje UART sběrnici. Sériový port musí být ve většině případů nastaven jako 7E1. Když je mode_d=True
, musí být přenosová rychlost nastavena na hodnotu podporovanou měřičem. Obvykle 2400 nebo 9600 bps. Pro jiné režimy (mode_d=False
) je přenosová rychlost vyjednána s měřičem. baud_rate
je ignorován a může být jakákoli hodnota.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
Pro ESP8266 se důrazně doporučuje používat hardwarový UART. Softwarový UART nedokáže zpracovat přenosy rychlejší než 4800 bps.
Možná budete muset zakázat protokolování, pokud je optická sonda připojena k sériovému portu používanému komponentou logger.
yaml
# Nastavte baud_rate na 0 pro zakázání protokolování přes UART.
logger:
baud_rate: 0
Platforma
Pro použití komponenty musíte v konfiguračním souboru definovat sekci platformy iec62056
. Skládá se ze základních nastavení.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Příklad konfigurace platformy pro jednosměrnou komunikaci
iec62056:
mode_d: True
Konfigurační proměnné
- update_interval (Volitelné, Time): Interval pro čtení dat z měřiče. Výchozí hodnota je
15min
.never
zakáže aktualizace. V takovém případě by měl být použit přepínač pro spuštění čtení. Pro nepřetržité čtení použijte malou hodnotu jako 1s. - baud_rate_max (Volitelné, int): Omezuje maximální přenosovou rychlost na zadanou hodnotu. Ve výchozím nastavení je nastavena na
9600
, protože poskytuje stabilní připojení. Pro deaktivaci nastavte na0
. Tímto způsobem můžete použít maximální možnou přenosovou rychlost19200
, pokud to měřič podporuje. Pro ESP8266 použijte softwarový UART nastavený na4800
nebo nižší. - receive_timeout (Volitelné, Time): Maximální čas, po který komponent čeká na data z měřiče před nahlášením chyby přenosu. Výchozí hodnota je
3s
. - battery_meter (Volitelné, boolean): Nastavte na true, pokud je měřič napájen z baterie. Tímto způsobem bude použita speciální sekvence zapnutí.
- retry_delay (Volitelné, Time): V případě selhání přenosu, čas čekání před opětovným pokusem o přenos. Výchozí hodnota je
15s
. - retry_counter_max (Volitelné, int): V případě selhání přenosu, maximální počet opakování. Výchozí hodnota je
2
. - uart_id (Volitelné, ID: Ručně zadejte ID UART komponenty, pokud chcete použít více UART sběrnic.
- mode_d (Volitelné, boolean): Nastavte na
True
, pokud měřič odesílá data každých několik sekund. Tímto způsobem je komponenta nucena pracovat v režimu D. V tomto režimu nejsou data nikdy odesílána do měřiče. Pokud je nastaveno, jakékoli jiné nastavení kroměreceive_timeout
je ignorováno. Nezapomeňte nastavit přenosovou rychlost UART, kterou měřič používá. Pokud si nejste jisti, zkuste2400 7E1
nebo9600 7E1
.
WARNING
Měřiče napájené z baterií obvykle omezují počet odečtů, aby šetřily energii, např. na 4 odečty denně. Pokud měřič toto omezení neukládá, časté odečty mohou výrazně snížit životnost baterie.
Senzor
Senzor hlásí první hodnotu v závorkách ze záznamu. Pro následující data
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
je hodnota senzoru 6000.385
. Pro získání druhé hodnoty (datum/čas v tomto příkladu) použijte Textový senzor.
Senzor podporuje pouze desetinné hodnoty. Pokud záznam obsahuje data v jiném formátu, musíte použít Textový senzor a případně lambda pro převod na číslo.
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
Konfigurační proměnné
- obis (Povinné): OBIS kód.
- Všechny ostatní možnosti z Senzor.
Textový senzor
Textový senzor poskytuje odečtená data jako text. Na rozdíl od senzoru můžete vybrat, která část odečtu je hlášena, a dokonce odeslat celý datový záznam zpět 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
Konfigurační proměnné
- obis (Povinné): OBIS kód. Můžete definovat více textových senzorů se stejným OBIS, ale jinou skupinou.
- group (Volitelné, int): Skupina hodnot,
0
,1
nebo2
. Výchozí hodnota je1
. Pokud je nastavena na0
, je hlášen celý datový záznam včetně OBIS kódu.1
hlásí první hodnotu,2
druhou. - Všechny ostatní možnosti jsou z Textový senzor.
Převod dat
Pokud měřič hlásí data jako nedesetinnou hodnotu, můžete ji automaticky převést pomocí šablonového senzoru a lambda. Předpokládejme, že měřič odesílá záznam jako následující s hexadecimálně kódovanými daty:
text
0-0:96.8.0*255(ABCDEF00)
Nejprve vytvořte šablonový senzor, který bude publikovat data jako desetinnou hodnotu.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Nyní vytvořte textový senzor, který přijme data jako řetězec, převede je na desetinnou hodnotu a publikuje.
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);
Pokaždé, když textový senzor obdrží novou hodnotu, převede ji na desítkovou soustavu a publikuje ji pomocí senzoru s id hex_to_dec_sensor
. Příznak internal
zabraňuje senzoru být viditelný v Home Assistant. V logu byste měli vidět:
log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal
Stejné výsledky lze získat pomocí Home Assistant lambd. V tomto scénáři textový senzor publikuje hexadecimální hodnotu a Home Assistant šablonový senzor provádí konverzi.
Přepínač
Přepínač poskytuje možnost spustit čtení na vyžádání. Když se stav změní z OFF
na ON
, komponenta zahájí přenos dat z měřiče. Přepínač můžete použít v automatizaci.
Konfigurační proměnné z Přepínač lze použít.
yaml
# Sample switch configuration
switch:
- platform: iec62056
name: 'Readout Trigger'
Nemůžete spustit čtení v režimu D.
Binární senzor
Nastaveno na ON
, když začíná přenos do měřiče. OFF
, když je přenos dokončen.
Můžete použít všechny konfigurační proměnné z Binární senzor.
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
Řešení problémů
- Ujistěte se, že je sonda správně zarovnána s optickými prvky na měřiči.
- Měřiče jsou obvykle instalovány v ne příliš čistých oblastech. Možná budete muset čas od času odstranit prach z optického rozhraní.
- Pokud narazíte na chyby přenosu a BCC kontrolního součtu, snižte přenosovou rychlost pomocí nastavení
baud_rate_max
. - Pokud vaše zařízení zpracovává více senzorů, které tráví hodně času v aktualizační smyčce, možná budete muset zvýšit velikost vyrovnávací paměti sériového portu. Zejména pokud zaznamenáte problémy s přenosem, když jsou povoleny další senzory, ale ne když jsou zakázány.