Skip to content

ESPHome IEC 62056-21 Komponentas

IEC 62056-21 yra tarptautinis standartas, skirtas protokolui keistis duomenimis su komunaliniais skaitikliais. Dažniausiai naudojamas elektros, bet taip pat vandens, šilumos ir kitų skaitiklių duomenims. Anksčiau buvo žinomas kaip IEC 61107.

iec62056 komponentas leidžia skaityti duomenis iš bet kurio suderinamo skaitiklio. Tam reikalingas nuoseklusis prievadas ir išorinis optinis sąsaja. Duomenų mainai vyksta naudojant infraraudonųjų spindulių optinį kanalą. Suderinami skaitikliai turi būdingą apvalų metalinį plokštelę su dviem opto-elementais viduje. Protokolas gali būti naudojamas su kitais transporto sluoksniais, pvz., srovės kilpa, tačiau komponentas buvo išbandytas tik su optine sąsaja.

Jis palaiko 4 IEC 62056-21 režimus: A, B, C ir D. E režimas nepalaikomas.

Komponentas nepalaiko programavimo. Skaitiklio konfigūracijos parametrų nustatymas reikalauja slapto slaptažodžio, todėl paprastiems vartotojams tai neįmanoma.

Sąsaja ant skaitiklio. Metalinis žiedas magnetui ir du optiniai elementai viduje.

Yra ir kitų išmaniųjų skaitiklių standartų, kurie naudoja tą pačią optinę sąsają. Nors jie dalijasi kai kuriais bendrais principais, jie nėra suderinami.

Įdiegimas

Pridėkite šį kodą prie ESPHome YAML konfigūracijos failo, kad nurodytumėte išorinį komponentą.

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

Veikimo teorija

Komponentas veikia 2 pagrindiniais režimais:

  • Dvikryptis bendravimas su skaitikliu. Šiuo režimu skaitiklis siunčia duomenis tik tada, kai to prašoma. Reikalingas IR imtuvas ir siųstuvas. Tai yra A, B ir C režimai pagal IEC 62056-21.
  • Vienkryptis bendravimas, kai skaitiklis siunčia duomenis į zondą laikas nuo laiko. Reikalingas tik IR imtuvas. IEC 62056-21 terminologijoje tai yra D režimas.

Režimai A, B, C

Komponentas pirmą kartą skaito duomenis praėjus 15 sekundžių po paleidimo. Pirmiausia jis siunčia identifikavimo užklausą 300 bps greičiu. Skaitiklis grąžina didžiausią duomenų perdavimo spartą, kurią jis gali palaikyti. Po to nuosekliojo prievado duomenų perdavimo sparta keičiama į vertę, kurią pateikia skaitiklis arba kurią konfigūruoja parinktis baud_rate_max. Skaitiklis perduoda duomenų registrus su susijusiais OBIS kodais.

Jei perdavimas nepavyko (blogas kontrolinis suma arba netinkamas formatas), komponentas bandys skaityti duomenis dar kartą, bet šį kartą naudodamas lėtesnį perdavimo greitį. Kiekvienam bandymui greitis mažinamas. Bandymų skaičius ir vėlavimai gali būti konfigūruojami.

Jei skaitiklis yra maitinamas baterijomis, gali būti taikoma speciali pažadinimo seka. Tai įvyksta tik tada, kai battery_meter nustatytas į True.

D režimas

Skaitikliams, veikiantiems D režimu, jums reikia tik IR imtuvo, nes perdavimas į skaitiklį nepalaikomas. Šiame režime skaitiklis siunčia duomenis kas kelias sekundes be jokio užklausimo. Jūs turėtumėte sukonfigūruoti nuoseklųjį prievadą, kad atitiktų skaitiklio perdavimo formatą. Skirtingai nuo A, B ir C režimų, kurie aptinkami automatiškai, D režimas turi būti įjungtas rankiniu būdu, nustatant mode_d=True platformos konfigūracijoje.

E režimas

Šis režimas nepalaikomas. E režimas naudoja dvejetainį kodavimą per HDLC ryšį.

Komponentas bando naudoti C režimą skaitikliams, pranešantiems apie E režimą. Tai turėtų veikti, jei skaitiklis palaiko tiek E, tiek C režimus. Skaitikliams, palaikantiems tik E režimą, nuskaitymas nėra įmanomas.

OBIS kodai

OBIS (Objektų Identifikavimo Sistema) kodas identifikuoja skirtingus skaitiklio rodmenis. Kodas susideda iš iki 6 grupių subidentifikatorių. Kodas formatuojamas taip: A-B:C.D.E*F, kur:

  • A - terpė: 0=abstraktūs objektai, 1=elektra, 6=šiluma, 7=dujos, 8=vanduo
  • B - kanalas, 0=kanalas neprieinamas
  • C - fizinė vertė, pavyzdžiui, srovė, įtampa, temperatūra.
  • D - matavimo tipas,
  • E - tarifas, 0=bendras, 1=tarifas #1, 2=tarifas #2 ir t.t.
  • F - atsiskaitymo laikotarpis

A, B ir F gali būti praleisti. Kodai gali naudoti šešioliktainius skaitmenis, pavyzdžiui, kodas 15.8.0 gali būti atvaizduotas kaip F.8.0.

Kodai yra standartizuoti, tačiau įrenginiai siunčia skirtingą kodų skaičių. Norėdami gauti jūsų skaitiklio palaikomų kodų sąrašą, įjunkite DEBUG žurnalą iec62056 komponentui ir stebėkite žurnalo išvestį. Pavyzdinė išvestis:

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

Jutiklio OBIS kodas turi tiksliai atitikti tai, kas perduodama iš skaitiklio. Tai yra dalis prieš pirmąjį skliaustą (.

Jei OBIS kodas yra tik dviženklis, konfigūracijos faile turėtumėte naudoti kabutes; pavyzdžiui, "1.2" vietoj tiesiog 1.2.

OBIS kodų sąrašą elektros skaitikliams galite rasti:

Aparatūra

Norėdami bendrauti su skaitikliu, turite prijungti optinę sąsają prie nuosekliojo prievado. Sąsają sudaro infraraudonųjų spindulių LED ir fototranzistorius. Be to, įrenginys turi būti aprūpintas žiediniu magnetu, kad būtų išlaikytas suderinimas su skaitikliu.

Jei skaitiklis veikia vienkrypčiu režimu D, reikalingas tik IR fototranzistorius.

Zondas

Standartas apibrėžia maksimalius zondo matmenis, kurie gali būti pritvirtinti prie skaitiklio. Jis turi būti aprūpintas magnetu, nes tai vienintelis būdas išlaikyti zondą stabilioje padėtyje.

Optinio zondo matmenys

Konfigūracija

Norėdami matyti skaitiklio duomenis Home Assistant, turite apibrėžti sensorių arba teksto sensorių su tinkamu OBIS kodu. Atkreipkite dėmesį, kad skaitikliai palaiko skirtingus OBIS kodų rinkinius. Pagal numatytuosius nustatymus komponentas nedefiniuoja jokių sensorių.

Nuoseklusis prievadas

Komponentui reikalingas UART magistralė. Daugeliu atvejų nuoseklusis prievadas turi būti sukonfigūruotas kaip 7E1. Kai mode_d=True, baudų dažnis turi būti nustatytas į vertę, kurią palaiko skaitiklis. Paprastai 2400 arba 9600 bps. Kitais režimais (mode_d=False) perdavimo greitis derinamas su skaitikliu. baud_rate ignoruojamas ir gali būti bet kokia vertė.

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

WARNING

ESP8266 labai rekomenduojama naudoti aparatinės įrangos UART. Programinė įranga UART negali apdoroti perdavimų greičiau nei 4800 bps.

Gali tekti išjungti žurnalavimą, jei optinis zondas prijungtas prie nuosekliojo prievado, kurį naudoja žurnalavimo komponentas.

yaml
# Nustatykite baud_rate į 0, kad išjungtumėte žurnalavimą per UART.
logger:
    baud_rate: 0

Platforma

Norėdami naudoti komponentą, turite apibrėžti iec62056 platformos skyrių konfigūracijos faile. Jis susideda iš pagrindinių nustatymų.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Vienpusio ryšio platformos konfigūracijos pavyzdys
iec62056:
  mode_d: True

Konfigūracijos kintamieji

  • update_interval (Pasirenkama, Time): Intervalas duomenims iš skaitiklio nuskaityti. Numatytasis intervalas yra 15min. never išjungia atnaujinimus. Tokiu atveju turėtų būti naudojamas jungiklis nuskaitymui inicijuoti. Norint gauti nuolatinius nuskaitymus, naudokite mažą reikšmę, pvz., 1s.
  • baud_rate_max (Pasirenkama, int): Apriboja maksimalų perdavimo greitį iki nurodytos vertės. Pagal numatytuosius nustatymus nustatyta 9600, nes tai užtikrina stabilų ryšį. Norėdami jį išjungti, nustatykite į 0. Tokiu būdu galite naudoti maksimalų galimą baudų greitį 19200, jei skaitiklis tai palaiko. ESP8266 naudokite programinę UART, nustatytą 4800 arba mažesnį.
  • receive_timeout (Pasirenkama, Time): Maksimalus laikas, kurį komponentas laukia duomenų iš skaitiklio prieš pranešdamas apie perdavimo klaidą. Numatytasis laikas yra 3s.
  • battery_meter (Pasirenkama, boolean): Nustatykite į true, jei skaitiklis yra maitinamas baterijomis. Tokiu būdu bus naudojama speciali įjungimo seka.
  • retry_delay (Pasirenkama, Time): Perdavimo nesėkmės atveju, laikas, kurį reikia laukti prieš bandant perduoti iš naujo. Numatytasis laikas yra 15s.
  • retry_counter_max (Pasirenkama, int): Perdavimo nesėkmės atveju, maksimalus bandymų skaičius. Numatytasis skaičius yra 2.
  • uart_id (Pasirenkama, ID: Rankiniu būdu nurodykite UART komponento ID, jei norite naudoti kelis UART magistrales.
  • mode_d (Pasirenkama, boolean): Nustatykite į True, jei skaitiklis siunčia duomenis kas kelias sekundes. Tai priverčia komponentą veikti D režimu. Šiame režime duomenys niekada nėra perduodami skaitikliui. Jei nustatyta, bet kokie kiti nustatymai, išskyrus receive_timeout, yra ignoruojami. Nepamirškite nustatyti UART baudų greičio, kurį naudoja skaitiklis. Jei nesate tikri, pabandykite 2400 7E1 arba 9600 7E1.

WARNING

Baterijomis maitinami matuokliai paprastai riboja rodmenų skaičių, kad taupytų energiją, pvz., iki 4 rodmenų per dieną. Jei matuoklis neriboja rodmenų, dažni rodmenys gali žymiai sumažinti baterijos veikimo laiką.

Jutiklis

Jutiklis praneša pirmąją reikšmę iš įrašo skliausteliuose. Pavyzdžiui, šiems duomenims

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

jutiklio reikšmė yra 6000.385. Norėdami gauti antrąją reikšmę (šiuo atveju datą/laiką), naudokite Teksto Jutiklį.

Jutiklis palaiko tik dešimtaines reikšmes. Jei įrašas turi duomenis kitokiu formatu, turite naudoti Teksto Jutiklį ir, jei reikia, lambda, kad konvertuotumėte į skaičių.

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

Konfigūracijos kintamieji

  • obis (Privaloma): OBIS kodas.
  • Visos kitos parinktys iš Jutiklis.

Teksto Jutiklis

Teksto jutiklis pateikia nuskaitytus duomenis kaip tekstą. Skirtingai nei Jutiklis, galite pasirinkti, kurią nuskaitymo dalį pranešti ir netgi siųsti visą duomenų įrašą atgal į 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

Konfigūracijos kintamieji

  • obis (Privaloma): OBIS kodas. Galite apibrėžti kelis teksto jutiklius su tuo pačiu OBIS, bet skirtinga grupe.
  • grupė (Pasirinktinai, int): Reikšmių grupė, 0, 1 arba 2. Numatytasis yra 1. Jei nustatyta 0, pranešamas visas duomenų įrašas, įskaitant OBIS kodą. 1 praneša pirmąją reikšmę, 2 - antrąją.
  • Visos kitos parinktys yra iš Teksto Jutiklis.

Duomenų konvertavimas

Jei matuoklis praneša duomenis kaip ne dešimtainę reikšmę, galite automatiškai konvertuoti naudodami šablono jutiklį ir lambda. Tarkime, kad matuoklis siunčia įrašą, kaip šis, su šešioliktainiais duomenimis:

text
0-0:96.8.0*255(ABCDEF00)

Pirmiausia sukurkite šablono jutiklį, kuris paskelbs duomenis kaip dešimtainę reikšmę.

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

Dabar sukurkite teksto jutiklį, kuris priims duomenis kaip eilutę, konvertuos į dešimtainę reikšmę ir paskelbs.

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);

Kiekvieną kartą, kai teksto jutiklis gauna naują reikšmę, jis ją konvertuoja į dešimtainę ir publikuoja naudodamas jutiklį su id hex_to_dec_sensor. internal vėliava neleidžia jutikliui būti matomam Home Assistant. Žurnale turėtumėte matyti:

log
[I][iec62056.component:127]: Konvertuota HEX 'ABCDEF00' į 2882400000 dešimtainę

Tą patį rezultatą galima pasiekti naudojant Home Assistant lambdas. Šiuo atveju, teksto jutiklis publikuoja šešioliktainę reikšmę, o Home Assistant šablono jutiklis atlieka konvertavimą.

Jungiklis

Jungiklis suteikia galimybę inicijuoti nuskaitymą pagal užklausą. Kai būsena pakeičiama iš OFF į ON, komponentas inicijuoja duomenų perdavimą iš skaitiklio. Galite naudoti jungiklį automatizavime.

Galima naudoti konfigūracijos kintamuosius iš Jungiklis.

yaml
# Sample switch configuration
switch:
  - platform: iec62056
    name: 'Readout Trigger'

Negalite inicijuoti nuskaitymo D režime.

Dvejetainis jutiklis

Nustatomas į ON, kai prasideda perdavimas į skaitiklį. OFF, kai perdavimas baigtas.

Galite naudoti visus konfigūracijos kintamuosius iš Dvejetainis jutiklis.

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

Trikčių šalinimas

  • Įsitikinkite, kad zondas tinkamai suderintas su optiniais elementais ant skaitiklio.
  • Skaitikliai dažniausiai įrengiami ne itin švariose vietose. Gali tekti laikas nuo laiko nuvalyti dulkes nuo optinės sąsajos.
  • Jei susiduriate su perdavimo ir BCC kontrolinės sumos klaidomis, sumažinkite perdavimo greitį naudodami baud_rate_max nustatymą.
  • Jei jūsų įrenginys valdo kelis jutiklius, kurie užima daug laiko atnaujinimo cikle, gali tekti padidinti nuoseklaus prievado buferio dydį. Ypač jei pastebite perdavimo problemas, kai papildomi jutikliai yra įjungti, bet ne kai jie yra išjungti.

Taip pat žiūrėkite