Skip to content

Componenta ESPHome IEC 62056-21

IEC 62056-21 este un standard internațional pentru un protocol de schimb de date cu contoarele utilitare. În principal pentru electricitate, dar și pentru apă, termic și alte contoare. A fost cunoscut anterior sub numele de IEC 61107.

Componenta iec62056 îți permite să citești date de la orice contor compatibil. Necesită un port serial și o interfață optică externă. Schimbul de date folosește un canal optic cu infraroșu. Contoarele compatibile sunt echipate cu o placă metalică rotundă caracteristică cu două opto-elemente în interior. Protocolul ar putea fi folosit cu alte straturi de transport, de exemplu buclă de curent, dar componenta a fost testată doar cu interfața optică.

Suportă 4 moduri ale IEC 62056-21: A, B, C și D. Modul E nu este suportat.

Componenta nu suportă programarea. Setarea parametrilor de configurare a contorului necesită o parolă secretă, ceea ce face imposibilă utilizarea de către utilizatorii obișnuiți.

Interfața pe un contor. Inel metalic pentru un magnet și două elemente optice în interior.

Există alte standarde de contoare inteligente care folosesc aceeași interfață optică. Deși împărtășesc unele concepte comune, nu sunt compatibile.

Instalare

Adaugă următorul cod în fișierul de configurare YAML al ESPHome pentru a referenția componenta externă.

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

Teoria funcționării

Componenta funcționează în 2 moduri principale:

  • Comunicare bidirecțională cu un contor. În acest mod, un contor trimite date doar când este solicitat. Necesită un receptor și un emițător IR. Acesta este modul A, B și C conform IEC 62056-21.
  • Comunicare unidirecțională, unde un contor trimite date către o sondă din când în când. Necesită doar un receptor IR. În terminologia IEC62056-21 este modul D.

Modurile A, B, C

Componenta citește date pentru prima dată la 15 secunde după pornire. Mai întâi, trimite o cerere de identificare la 300 bps. Contorul returnează rata maximă de baud pe care o poate gestiona. După aceea, rata de baud a portului serial este schimbată la valoarea furnizată de contor sau configurată prin opțiunea baud_rate_max. Contorul transmite registre de date cu coduri OBIS asociate.

Dacă transmisia a eșuat (checksum incorect sau format invalid), componenta va încerca să citească din nou datele, dar de această dată folosind o viteză de transmisie mai lentă. Pentru fiecare încercare, viteza este redusă. Numărul de încercări și întârzieri poate fi configurat.

Dacă contorul este alimentat cu baterie, poate fi aplicată o secvență specială de trezire. Acest lucru se întâmplă doar când battery_meter este setat la True.

Modul D

Pentru contoarele care operează în modul D, aveți nevoie doar de un receptor IR, deoarece transmisia către un contor nu este suportată. În acest mod, contorul trimite date la fiecare câteva secunde fără nicio cerere. Ar trebui să configurați portul serial pentru a se potrivi cu formatul de transmisie al contorului. Spre deosebire de modurile A, B și C, care sunt detectate automat, Modul D trebuie activat manual prin setarea mode_d=True în configurația platformei.

Modul E

Acest mod nu este suportat. Modul E folosește codificare binară peste legătura HDLC.

Componenta încearcă să folosească modul C pentru contoarele care raportează modul E. Acest lucru ar trebui să funcționeze dacă contorul suportă ambele moduri E și C. Pentru contoarele care suportă doar modul E, citirea nu este posibilă.

Coduri OBIS

Codul OBIS (Object Identification System) identifică diferitele citiri de la un contor. Codul constă din până la 6 sub-identificatori de grup. Codul este formatat astfel: A-B:C.D.E*F, unde:

  • A - mediu: 0=obiecte abstracte, 1=electricitate, 6=căldură, 7=gaz, 8=apă
  • B - canal, 0=niciun canal disponibil
  • C - valoare fizică, de exemplu curent, tensiune, temperatură.
  • D - tip de măsurare,
  • E - tarif, 0=total, 1=tarif #1, 2=tarif #2 și așa mai departe
  • F - perioadă de facturare

A, B și F pot fi omise. Codurile pot folosi cifre hexazecimale, de exemplu, codul 15.8.0 ar putea fi reprezentat ca F.8.0.

Codurile sunt standardizate, dar dispozitivele trimit un număr diferit de coduri. Pentru a obține o listă de coduri suportate de contorul dumneavoastră, activați jurnalul DEBUG pentru componenta iec62056 și observați ieșirea jurnalului. Ieșire exemplu:

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

Codul OBIS al senzorului trebuie să se potrivească exact cu ceea ce este transmis de la un contor. Aceasta este partea înainte de prima paranteză (.

Dacă un cod OBIS are doar două cifre, ar trebui să folosiți ghilimele în fișierul de configurare; de exemplu, "1.2" în loc de 1.2.

Pentru o listă de coduri OBIS pentru contoare electrice, puteți vizita:

Hardware

Pentru a comunica cu un contor, trebuie să atașați o interfață optică la portul serial. Interfața constă dintr-un LED cu infraroșu și un fototransistor. În plus, dispozitivul trebuie să fie echipat cu un magnet inelar pentru a-l menține aliniat cu contorul.

Dacă contorul operează în modul unidirecțional D, este necesar doar un fototransistor IR.

Sondă

Standardul definește dimensiunile maxime ale sondei care poate fi atașată la un contor. Trebuie să fie echipată cu un magnet, deoarece este singura modalitate de a menține sonda într-o poziție stabilă.

Dimensiunile sondei optice

Configurare

Pentru a vedea datele contorului în Home Assistant, trebuie să definiți un senzor sau un senzor text cu codul OBIS corespunzător. Rețineți că contoarele suportă seturi diferite de coduri OBIS. În mod implicit, componenta nu definește niciun senzor.

Port serial

Componenta necesită autobuz UART. Serialul trebuie configurat ca 7E1 în majoritatea cazurilor. Când mode_d=True, rata de baud trebuie setată la o valoare suportată de contor. De obicei 2400 sau 9600 bps. Pentru alte moduri (mode_d=False), viteza de transmisie este negociată cu un contor. baud_rate este ignorat și poate fi orice valoare.

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

WARNING

Pentru ESP8266 este recomandat să folosiți UART hardware. UART software nu poate gestiona transmisii mai rapide de 4800 bps.

Este posibil să fie necesar să dezactivați jurnalizarea dacă sonda optică este conectată la portul serial utilizat de componenta de jurnalizare.

yaml
# Setați baud_rate la 0 pentru a dezactiva jurnalizarea prin UART.
logger:
    baud_rate: 0

Platformă

Pentru a utiliza componenta, trebuie să definiți secțiunea platformei iec62056 în fișierul de configurare. Aceasta constă în setări de bază.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Exemplu de configurare a platformei pentru comunicare unidirecțională
iec62056:
  mode_d: True

Variabile de configurare

  • update_interval (Opțional, Time): Intervalul pentru a citi datele de la un contor. Implicit este 15min. never dezactivează actualizările. În acest caz, ar trebui folosit un comutator pentru a declanșa citirea. Pentru a obține citiri continue, utilizați o valoare mică, cum ar fi 1s.
  • baud_rate_max (Opțional, int): Limitează viteza maximă de transmisie la valoarea specificată. Implicit este setat la 9600, deoarece oferă o conexiune stabilă. Pentru a-l dezactiva, setați-l la 0. În acest fel, puteți utiliza rata maximă posibilă de 19200 dacă contorul o suportă. Pentru ESP8266 utilizați UART software setat la 4800 sau mai mic.
  • receive_timeout (Opțional, Time): Timpul maxim în care componenta așteaptă date de la un contor înainte de a raporta o eroare de transmisie. Implicit este 3s.
  • battery_meter (Opțional, boolean): Setați la true dacă un contor este alimentat de baterie. În acest fel, va fi folosită o secvență specială de pornire.
  • retry_delay (Opțional, Time): În caz de eșec al transmisiei, timpul de așteptare înainte de a încerca din nou transmisia. Implicit este 15s.
  • retry_counter_max (Opțional, int): În caz de eșec al transmisiei, numărul maxim de încercări. Implicit este 2.
  • uart_id (Opțional, ID): Specificați manual ID-ul Componentului UART dacă doriți să utilizați mai multe magistrale UART.
  • mode_d (Opțional, boolean): Setați la True dacă un contor trimite date la fiecare câteva secunde. Aceasta forțează componenta să opereze în modul D. În acest mod, datele nu sunt niciodată transmise către un contor. Dacă este setat, orice alte setări, cu excepția receive_timeout, sunt ignorate. Nu uitați să setați rata de baud UART pe care o folosește contorul. Dacă nu sunteți sigur, încercați 2400 7E1 sau 9600 7E1.

WARNING

Contoarele alimentate cu baterii limitează de obicei numărul de citiri pentru a conserva energia, de exemplu, la 4 citiri pe zi. Dacă un contor nu impune această limită, citirile frecvente pot reduce semnificativ durata de viață a bateriei.

Senzor

Senzorul raportează prima valoare dintre paranteze din înregistrare. Pentru următoarele date

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

valoarea senzorului este 6000.385. Pentru a obține a doua valoare (data/ora în acest exemplu) folosiți un Senzor Text.

Senzorul suportă doar valori zecimale. Dacă înregistrarea conține date în alt format, trebuie să folosiți Senzor Text și opțional lambda pentru a le converti într-un număr.

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

Variabile de configurare

  • obis (Obligatoriu): Codul OBIS.
  • Toate celelalte opțiuni de la Senzor.

Senzor Text

Senzorul text oferă datele citite sub formă de text. Spre deosebire de Senzor, puteți selecta ce parte a citirii este raportată și chiar să trimiteți întregul înregistrare de date înapoi la 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

Variabile de configurare

  • obis (Obligatoriu): Codul OBIS. Puteți defini mai mulți senzori text cu același OBIS, dar cu un grup diferit.
  • group (Opțional, int): Grupul de valori, 0, 1 sau 2. Implicit este 1. Dacă este setat la 0, întregul înregistrare de date este raportat, inclusiv codul OBIS. 1 raportează prima valoare, 2 a doua.
  • Toate celelalte opțiuni sunt de la Senzor Text.

Conversia datelor

Dacă un contor raportează date ca o valoare non-zecimală, le puteți converti automat folosind un senzor șablon și lambda. Să presupunem că contorul trimite o înregistrare ca următoarea cu date codificate hex:

text
0-0:96.8.0*255(ABCDEF00)

Mai întâi, creați un senzor șablon care va publica datele ca o valoare zecimală.

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

Acum creați un senzor text care va primi datele ca un șir, le va converti în zecimal și le va publica.

De fiecare dată când senzorul de text primește o valoare nouă, o convertește într-un număr zecimal și o publică folosind senzorul cu id-ul hex_to_dec_sensor. Flag-ul internal împiedică senzorul să fie vizibil în Home Assistant. În jurnal ar trebui să vezi:

Aceleași rezultate pot fi obținute folosind lambdas în Home Assistant. În acest scenariu, senzorul de text publică valoarea hexazecimală, iar senzorul de șablon din Home Assistant face conversia.

Comutator

Comutatorul oferă abilitatea de a declanșa citirea la cerere. Când starea este schimbată de la OFF la ON, componenta inițiază transmiterea datelor de la un contor. Poți folosi comutatorul în automatizări.

Variabilele de configurare din Comutator pot fi utilizate.

Nu poți declanșa citirea în modul D.

Senzor binar

Setat pe ON când începe transmiterea către un contor. OFF când transmiterea este finalizată.

Poți folosi toate variabilele de configurare din Senzor Binar.

Depanare

  • Asigură-te că sonda este aliniată corect cu elementele optice de pe contor.
  • Contoarele sunt de obicei instalate în zone nu foarte curate. Poate fi necesar să îndepărtezi praful de pe interfața optică din când în când.
  • Dacă întâmpini erori de transmisie și de checksum BCC, scade rata de baud folosind setarea baud_rate_max.
  • Dacă dispozitivul tău gestionează mai mulți senzori care petrec mult timp în bucla de actualizare, poate fi necesar să mărești dimensiunea bufferului portului serial. Mai ales dacă observi probleme de transmisie când senzori suplimentari sunt activați, dar nu când sunt dezactivați.

Vezi și