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.
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=vanduoB
- kanalas, 0=kanalas neprieinamasC
- 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:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
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.
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šskyrusreceive_timeout
, yra ignoruojami. Nepamirškite nustatyti UART baudų greičio, kurį naudoja skaitiklis. Jei nesate tikri, pabandykite2400 7E1
arba9600 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
arba2
. Numatytasis yra1
. Jei nustatyta0
, 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.