ESPHome IEC 62056-21 Komponenta
IEC 62056-21 je međunarodni standard za protokol za razmjenu podataka s mjernim uređajima. Uglavnom za električnu energiju, ali i za vodu, toplinsku energiju i druge mjerače. Ranije je bio poznat kao IEC 61107.
Komponenta iec62056
omogućuje čitanje podataka s bilo kojeg kompatibilnog mjerača. Zahtijeva serijski port i vanjsko optičko sučelje. Razmjena podataka koristi infracrveni optički kanal. Kompatibilni mjerači opremljeni su karakterističnom okruglom metalnom pločom s dva opto-elementa unutar. Protokol se može koristiti s drugim transportnim slojevima, npr. strujnom petljom, ali komponenta je testirana samo s optičkim sučeljem.
Podržava 4 načina rada IEC 62056-21: A, B, C i D. Način E nije podržan.
Komponenta ne podržava programiranje. Postavljanje parametara konfiguracije mjerača zahtijeva tajnu lozinku, što ga čini nemogućim za korištenje od strane običnih korisnika.
Postoje i drugi standardi za pametne mjerače koji koriste isto optičko sučelje. Iako dijele neke zajedničke koncepte, nisu kompatibilni.
Instalacija
Dodajte sljedeći kod u ESPHome YAML konfiguracijsku datoteku za referenciranje vanjske komponente.
yaml
external_components:
# IEC62056 komponenta
- source: github://aquaticus/esphome-iec62056
Teorija rada
Komponenta radi u 2 glavna načina:
- Dvosmjerna komunikacija s mjeračem. U ovom načinu mjerač šalje podatke samo kada se to zatraži. Zahtijeva IR prijemnik i odašiljač. Ovo je način A, B i C prema IEC 62056-21.
- Jednosmjerna komunikacija, gdje mjerač povremeno šalje podatke sondi. Zahtijeva samo IR prijemnik. U terminologiji IEC 62056-21 to je način D.
Načini A, B, C
Komponenta prvi put čita podatke 15 sekundi nakon pokretanja. Prvo šalje zahtjev za identifikaciju pri 300 bps. Mjerač vraća maksimalnu brzinu prijenosa koju može podržati. Nakon toga, brzina prijenosa serijskog porta mijenja se na vrijednost koju pruža mjerač ili je konfigurirana opcijom baud_rate_max
. Mjerač prenosi registre podataka s pridruženim OBIS kodovima.
Ako prijenos nije uspio (loša kontrolna suma ili neispravan format), komponenta će pokušati ponovno pročitati podatke, ali ovaj put koristeći sporiju brzinu prijenosa. Za svaki ponovni pokušaj, brzina se smanjuje. Broj ponovnih pokušaja i kašnjenja može se konfigurirati.
Ako je brojilo napajano baterijom, može se primijeniti posebna sekvenca buđenja. To se događa samo kada je battery_meter
postavljen na True
.
Način D
Za brojila koja rade u načinu D, potreban vam je samo IR prijemnik jer prijenos prema brojilu nije podržan. U ovom načinu, brojilo šalje podatke svakih nekoliko sekundi bez ikakvog zahtjeva. Trebali biste konfigurirati serijski port da odgovara formatu prijenosa brojila. Za razliku od načina A, B i C koji se automatski otkrivaju, način D mora se ručno omogućiti postavljanjem mode_d=True
u konfiguraciji platforme.
Način E
Ovaj način nije podržan. Način E koristi binarno kodiranje preko HDLC veze.
Komponenta pokušava koristiti način C za brojila koja prijavljuju način E. Ovo bi trebalo raditi ako brojilo podržava oba načina, E i C. Za brojila koja podržavaju samo način E, očitavanje nije moguće.
OBIS kodovi
OBIS (Object Identification System) kod identificira različita očitanja s brojila. Kod se sastoji od do 6 grupnih pod-identifikatora. Kod je formatiran ovako: A-B:C.D.E*F
, gdje:
A
- medij: 0=apstraktni objekti, 1=električna energija, 6=toplina, 7=plin, 8=vodaB
- kanal, 0=nema dostupnog kanalaC
- fizička vrijednost, na primjer struja, napon, temperatura.D
- tip mjerenja,E
- tarifa, 0=ukupno, 1=tarifa #1, 2=tarifa #2 i tako daljeF
- obračunsko razdoblje
A
, B
i F
mogu biti izostavljeni. Kodovi mogu koristiti heksadecimalne znamenke, na primjer, kod 15.8.0
mogao bi biti predstavljen kao F.8.0
.
Kodovi su standardizirani, ali uređaji šalju različit broj kodova. Da biste dobili popis kodova koje podržava vaše brojilo, omogućite DEBUG
zapis za komponentu iec62056
i promatrajte izlaz zapisa. Primjer izlaza:
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 kod senzora mora točno odgovarati onome što se prenosi s brojila. Ovo je dio prije prve zagrade (
.
Ako je OBIS kod samo dvije znamenke, trebate koristiti navodnike u konfiguracijskoj datoteci; na primjer, "1.2"
umjesto samo 1.2
.
Za popis OBIS kodova za električne brojila, možete posjetiti:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Hardver
Za komunikaciju s brojilom morate priključiti optičko sučelje na serijski port. Sučelje se sastoji od infracrvenog LED-a i fototranzistora. Osim toga, uređaj mora biti opremljen prstenastim magnetom kako bi ostao poravnat s brojilom.
Ako brojilo radi u jednosmjernom načinu rada D, potreban je samo IR fototranzistor.
Sonda
Standard definira maksimalne dimenzije sonde koja se može priključiti na brojilo. Mora biti opremljena magnetom jer je to jedini način da sonda ostane u stabilnom položaju.
Konfiguracija
Da biste vidjeli podatke brojila u Home Assistantu, morate definirati senzor ili tekstualni senzor s odgovarajućim OBIS kodom. Imajte na umu da brojila podržavaju različite skupove OBIS kodova. Prema zadanim postavkama, komponenta ne definira nikakve senzore.
Serijski port
Komponenta zahtijeva UART sabirnicu. Serijski port mora biti konfiguriran kao 7E1 u većini slučajeva. Kada je mode_d=True
, brzina prijenosa mora biti postavljena na vrijednost koju podržava brojilo. Obično 2400 ili 9600 bps. Za druge načine rada (mode_d=False
) brzina prijenosa se dogovara s brojilom. baud_rate
se ignorira i može biti bilo koja vrijednost.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
Za ESP8266 se visoko preporučuje korištenje hardverskog UART-a. Softverski UART ne može podnijeti prijenose brže od 4800 bps.
Možda ćete trebati onemogućiti zapisivanje ako je optička sonda povezana na serijski port koji koristi komponenta za zapisivanje.
yaml
# Postavite baud_rate na 0 da onemogućite zapisivanje putem UART-a.
logger:
baud_rate: 0
Platforma
Da biste koristili komponentu, morate definirati iec62056
sekciju platforme u konfiguracijskoj datoteci. Sastoji se od osnovnih postavki.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Primjer konfiguracije platforme za jednosmjernu komunikaciju
iec62056:
mode_d: True
Varijable konfiguracije
- update_interval (Opcionalno, Time): Interval za čitanje podataka s brojila. Zadano je
15min
.never
onemogućuje ažuriranja. U tom slučaju, prekidač bi trebao biti korišten za pokretanje čitanja. Za kontinuirano čitanje koristite malu vrijednost poput 1s. - baud_rate_max (Opcionalno, int): Ograničava maksimalnu brzinu prijenosa na specificiranu vrijednost. Po defaultu je postavljeno na
9600
jer pruža stabilnu vezu. Da biste ga onemogućili, postavite na0
. Na taj način možete koristiti maksimalnu moguću brzinu prijenosa od19200
ako brojilo to podržava. Za ESP8266 koristite softverski UART postavljen na4800
ili niže. - receive_timeout (Opcionalno, Time): Maksimalno vrijeme koje komponenta čeka na podatke s brojila prije prijavljivanja greške u prijenosu. Zadano je
3s
. - battery_meter (Opcionalno, boolean): Postavite na true ako je brojilo napajano baterijom. Na taj način će se koristiti posebna sekvenca za uključivanje.
- retry_delay (Opcionalno, Time): U slučaju neuspjeha prijenosa, vrijeme čekanja prije ponovnog pokušaja prijenosa. Zadano je
15s
. - retry_counter_max (Opcionalno, int): U slučaju neuspjeha prijenosa, maksimalni broj ponovnih pokušaja. Zadano je
2
. - uart_id (Opcionalno, ID: Ručno specificirajte ID UART Komponente ako želite koristiti više UART sabirnica.
- mode_d (Opcionalno, boolean): Postavite na
True
ako brojilo šalje podatke svakih nekoliko sekundi. To prisiljava komponentu da radi u modu D. U ovom modu podaci se nikada ne šalju brojilu. Ako je postavljeno, bilo koje druge postavke osimreceive_timeout
se ignoriraju. Ne zaboravite postaviti UART brzinu prijenosa koju brojilo koristi. Ako niste sigurni, pokušajte2400 7E1
ili9600 7E1
.
WARNING
Mjerači na baterije obično ograničavaju broj očitanja kako bi sačuvali energiju, npr. na 4 očitanja dnevno. Ako mjerač ne nameće ograničenje, učestala očitanja mogu značajno smanjiti vijek trajanja baterije.
Senzor
Senzor prijavljuje prvu vrijednost između zagrada iz zapisa. Za sljedeće podatke
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
vrijednost senzora je 6000.385
. Da biste dobili drugu vrijednost (datum/vrijeme u ovom primjeru) koristite Tekstualni Senzor.
Senzor podržava samo decimalne vrijednosti. Ako zapis sadrži podatke u bilo kojem drugom formatu, morate koristiti Tekstualni Senzor i po potrebi lambda funkciju za pretvorbu u broj.
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
Konfiguracijske varijable
- obis (Obavezno): OBIS kod.
- Sve ostale opcije iz Senzor.
Tekstualni Senzor
Tekstualni senzor pruža podatke očitanja kao tekst. Za razliku od Senzora, možete odabrati koji dio očitanja se prijavljuje, pa čak i poslati cijeli zapis podataka natrag u 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
Konfiguracijske varijable
- obis (Obavezno): OBIS kod. Možete definirati više tekstualnih senzora s istim OBIS-om, ali različitom grupom.
- group (Opcionalno, int): Grupa vrijednosti,
0
,1
ili2
. Zadano je1
. Ako je postavljeno na0
, prijavljuje se cijeli zapis podataka uključujući OBIS kod.1
prijavljuje prvu vrijednost,2
drugu. - Sve ostale opcije su iz Tekstualni Senzor.
Pretvorba podataka
Ako mjerač prijavljuje podatke kao ne-decimalnu vrijednost, možete ih automatski pretvoriti koristeći predložak senzora i lambda funkciju. Pretpostavimo da mjerač šalje zapis poput sljedećeg s heksadecimalno kodiranim podacima:
text
0-0:96.8.0*255(ABCDEF00)
Prvo, kreirajte predložak senzora koji će objaviti podatke kao decimalnu vrijednost.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Sada kreirajte tekstualni senzor koji će primiti podatke kao niz, pretvoriti ih u decimalni oblik i objaviti.
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);
Svaki put kada tekstualni senzor primi novu vrijednost, pretvara je u decimalni oblik i objavljuje koristeći senzor s ID-om hex_to_dec_sensor
. Zastavica internal
sprječava da senzor bude vidljiv u Home Assistantu. U zapisniku biste trebali vidjeti:
log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal
Isti rezultati mogu se postići korištenjem Home Assistant lambda funkcija. U ovom scenariju, tekstualni senzor objavljuje heksadecimalnu vrijednost, a Home Assistant template senzor vrši konverziju.
Prekidač
Prekidač omogućuje pokretanje očitavanja na zahtjev. Kada se stanje promijeni iz OFF
u ON
, komponenta pokreće prijenos podataka s brojila. Prekidač možete koristiti u automatizaciji.
Mogu se koristiti konfiguracijske varijable iz Prekidač.
yaml
# Sample switch configuration
switch:
- platform: iec62056
name: 'Readout Trigger'
Ne možete pokrenuti očitavanje u načinu rada D.
Binarni senzor
Postavlja se na ON
kada prijenos prema brojilu započne. OFF
kada je prijenos završen.
Možete koristiti sve konfiguracijske varijable iz Binarni 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
Rješavanje problema
- Provjerite je li sonda pravilno poravnata s optičkim elementima na brojilu.
- Brojila su obično instalirana u ne baš čistim područjima. Možda ćete trebati povremeno ukloniti prašinu s optičkog sučelja.
- Ako naiđete na prijenosne i BCC pogreške provjere smanjite brzinu prijenosa koristeći postavku
baud_rate_max
. - Ako vaš uređaj upravlja s više senzora koji troše puno vremena u petlji ažuriranja, možda ćete trebati povećati veličinu međuspremnika serijskog porta. Pogotovo ako primijetite probleme s prijenosom kada su dodatni senzori omogućeni, ali ne i kada su onemogućeni.