Skip to content

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.

Sučelje na mjeraču. Metalni prsten za magnet i dva optička elementa unutar.

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=voda
  • B - kanal, 0=nema dostupnog kanala
  • C - fizička vrijednost, na primjer struja, napon, temperatura.
  • D - tip mjerenja,
  • E - tarifa, 0=ukupno, 1=tarifa #1, 2=tarifa #2 i tako dalje
  • F - 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:

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.

Dimenzije optičke sonde

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 na 0. Na taj način možete koristiti maksimalnu moguću brzinu prijenosa od 19200 ako brojilo to podržava. Za ESP8266 koristite softverski UART postavljen na 4800 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 osim receive_timeout se ignoriraju. Ne zaboravite postaviti UART brzinu prijenosa koju brojilo koristi. Ako niste sigurni, pokušajte 2400 7E1 ili 9600 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 ili 2. Zadano je 1. Ako je postavljeno na 0, 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.

Vidi također