ESPHome IEC 62056-21 Komponent
IEC 62056-21 er en international standard for en protokol til at udveksle data med forsyningsmålere. Mest for elektricitet, men også vand, termiske og andre målere. Det var tidligere kendt som IEC 61107.
iec62056
-komponenten giver dig mulighed for at læse data fra enhver kompatibel måler. Det kræver en seriel port og en ekstern optisk interface. Dataudveksling bruger en infrarød optisk kanal. Kompatible målere er udstyret med en karakteristisk rund metalplade med to opto-elementer indeni. Protokollen kunne bruges med andre transportlag, f.eks. strømsløjfe, men komponenten blev kun testet med den optiske interface.
Den understøtter 4 tilstande af IEC 62056-21: A, B, C og D. Tilstand E er ikke understøttet.
Komponenten understøtter ikke programmering. Indstilling af målerens konfigurationsparametre kræver en hemmelig adgangskode, hvilket gør det umuligt at bruge for almindelige brugere.
Der er andre smartmålerstandarder, der bruger det samme optiske interface. Selvom de deler nogle fælles koncepter, er de ikke kompatible.
Installation
Tilføj følgende kode til ESPHome YAML-konfigurationsfilen for at referere til ekstern komponent.
yaml
external_components:
# IEC62056 komponent
- source: github://aquaticus/esphome-iec62056
Teori om drift
Komponenten opererer i 2 hovedtilstande:
- Tovejs kommunikation med en måler. I denne tilstand sender en måler kun data, når det anmodes om det. Det kræver en IR-modtager og sender. Dette er tilstand A, B og C ifølge IEC 62056-21.
- Envejs kommunikation, hvor en måler sender data til en probe fra tid til anden. Det kræver kun en IR-modtager. I IEC 62056-21 terminologi er det tilstand D.
Tilstande A, B, C
Komponenten læser data for første gang 15 sekunder efter opstart. Først sender den en identifikationsanmodning ved 300 bps. Måleren returnerer den maksimale baudrate, den kan håndtere. Derefter ændres den serielle port baudrate til den værdi, der leveres af måleren eller konfigureret af optionen baud_rate_max
. Måleren transmitterer dataregistre med tilknyttede OBIS koder.
Hvis transmissionen er mislykket (dårlig kontrolsum eller ugyldigt format), vil komponenten forsøge at læse data igen, men denne gang ved hjælp af en langsommere transmissionshastighed. For hver gentagelse reduceres hastigheden. Antallet af forsøg og forsinkelser kan konfigureres.
Hvis måleren er batteridrevet, kan en speciel vækningssekvens anvendes. Dette sker kun, når battery_meter
er sat til True
.
Mode D
For målere, der opererer i mode D, behøver du kun en IR-modtager, da transmission til en måler ikke understøttes. I denne tilstand sender måleren data hvert par sekunder uden nogen forespørgsel. Du skal konfigurere den serielle port til at matche målerens transmissionsformat. I modsætning til tilstandene A, B og C, som detekteres automatisk, skal Mode D aktiveres manuelt ved at sætte mode_d=True
i platformkonfigurationen.
Mode E
Denne tilstand understøttes ikke. Mode E bruger binær kodning over HDLC-link.
Komponenten forsøger at bruge mode C for målere, der rapporterer mode E. Dette bør fungere, hvis måleren understøtter både E- og C-tilstande. For målere, der kun understøtter mode E, er aflæsning ikke mulig.
OBIS-koder
OBIS (Object Identification System) koden identificerer de forskellige aflæsninger fra en måler. Koden består af op til 6 gruppe-underidentifikatorer. Koden er formateret som følger: A-B:C.D.E*F
, hvor:
A
- medium: 0=abstrakte objekter, 1=elektricitet, 6=varme, 7=gas, 8=vandB
- kanal, 0=ingen kanal tilgængeligC
- fysisk værdi, for eksempel strøm, spænding, temperatur.D
- målingstype,E
- tarif, 0=total, 1=tarif #1, 2=tarif #2 osv.F
- faktureringsperiode
A
, B
og F
kan udelades. Koder kan bruge hexadecimale cifre, for eksempel kan koden 15.8.0
repræsenteres som F.8.0
.
Koderne er standardiserede, men enheder sender et forskelligt antal koder. For at få en liste over koder, der understøttes af din måler, aktiver DEBUG
log for iec62056
komponenten og observer logoutputtet. Eksempel på output:
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
Sensor OBIS-koden skal matche præcis, hvad der transmitteres fra en måler. Dette er delen før den første parentes (
.
Hvis en OBIS-kode kun er to cifre, skal du bruge anførselstegn i konfigurationsfilen; for eksempel, "1.2"
i stedet for blot 1.2
.
For en liste over OBIS-koder for elmålere kan du besøge:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Hardware
For at kommunikere med en måler skal du tilslutte et optisk interface til serielporten. Interfacet består af en infrarød LED og fototransistor. Derudover skal enheden være udstyret med en ringmagnet for at holde den justeret med måleren.
Hvis måleren opererer i unidirektionel tilstand D, kræves kun en IR-fototransistor.
Probe
Standarden definerer de maksimale dimensioner af proben, der kan fastgøres til en måler. Den skal være udstyret med en magnet, da det er den eneste måde at holde proben i en stabil position.
Konfiguration
For at se målerdata i Home Assistant skal du definere en sensor eller tekstsensor med den passende OBIS-kode. Bemærk, at målere understøtter forskellige sæt af OBIS-koder. Som standard definerer komponenten ingen sensorer.
Serielport
Komponenten kræver UART bus. Seriel skal konfigureres som 7E1 i de fleste tilfælde. Når mode_d=True
skal baudraten indstilles til en værdi, der understøttes af måleren. Normalt 2400 eller 9600 bps. For andre tilstande (mode_d=False
) forhandles transmissionshastigheden med en måler. baud_rate
ignoreres og kan være en hvilken som helst værdi.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
For ESP8266 anbefales det stærkt at bruge hardware UART. Software UART kan ikke håndtere transmissioner hurtigere end 4800 bps.
Du kan være nødt til at deaktivere logning, hvis den optiske probe er forbundet til serielporten, der bruges af logger-komponenten.
yaml
# Indstil baud_rate til 0 for at deaktivere logning via UART.
logger:
baud_rate: 0
Platform
For at bruge komponenten skal du definere iec62056
platformsektion i konfigurationsfilen. Den består af grundlæggende indstillinger.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Eksempel på platformkonfigurationsindgang for unidirektionel kommunikation
iec62056:
mode_d: True
Konfigurationsvariabler
- update_interval (Valgfri, Time): Intervallet for at læse data fra en måler. Standard er
15min
.never
deaktiverer opdateringer. I så fald bør en switch bruges til at udløse aflæsning. For at få kontinuerlige aflæsninger brug en lille værdi som 1s. - baud_rate_max (Valgfri, int): Begrænser den maksimale transmissionshastighed til den angivne værdi. Som standard er den sat til
9600
, da det giver en stabil forbindelse. For at deaktivere det, sæt det til0
. På den måde kan du bruge den maksimalt mulige baudrate på19200
, hvis måleren understøtter det. For ESP8266 brug software UART sat til4800
eller lavere. - receive_timeout (Valgfri, Time): Maksimal tid komponenten venter på data fra en måler, før den rapporterer transmissionsfejl. Standard er
3s
. - battery_meter (Valgfri, boolean): Sæt til true, hvis en måler er batteridrevet. På den måde vil en speciel opstartssekvens blive brugt.
- retry_delay (Valgfri, Time): I tilfælde af transmissionsfejl, tid til at vente før der forsøges igen. Standard er
15s
. - retry_counter_max (Valgfri, int): I tilfælde af transmissionsfejl, det maksimale antal forsøg. Standard er
2
. - uart_id (Valgfri, ID: Angiv manuelt ID'et for UART-komponenten, hvis du ønsker at bruge flere UART-busser.
- mode_d (Valgfri, boolean): Sæt til
True
, hvis en måler sender data hvert par sekunder. Dette tvinger komponenten til at operere i mode D. I denne tilstand sendes data aldrig til en måler. Hvis sat, ignoreres alle andre indstillinger undtagenreceive_timeout
. Glem ikke at indstille UART baudrate, som måleren bruger. Hvis du ikke er sikker, prøv2400 7E1
eller9600 7E1
.
WARNING
Batteridrevne målere begrænser typisk antallet af aflæsninger for at spare energi, f.eks. til 4 aflæsninger om dagen. Hvis en måler ikke pålægger denne begrænsning, kan hyppige aflæsninger betydeligt reducere batterilevetiden.
Sensor
Sensoren rapporterer den første værdi i parentes fra posten. For de følgende data
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
er sensorværdien 6000.385
. For at få den anden værdi (dato/tid i dette eksempel) skal du bruge en Tekstsensor.
Sensoren understøtter kun decimale værdier. Hvis posten indeholder data i et andet format, skal du bruge Tekstsensor og eventuelt lambda til at konvertere det til et tal.
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
Konfigurationsvariabler
- obis (Påkrævet): OBIS-kode.
- Alle andre muligheder fra Sensor.
Tekstsensor
Tekstsensoren giver aflæsningsdata som tekst. I modsætning til Sensor kan du vælge, hvilken del af aflæsningen der rapporteres, og endda sende hele dataposten tilbage til 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
Konfigurationsvariabler
- obis (Påkrævet): OBIS-kode. Du kan definere flere tekstsensorer med samme OBIS, men med en anden gruppe.
- gruppe (Valgfri, int): Værdi gruppe,
0
,1
eller2
. Standard er1
. Hvis sat til0
, rapporteres hele dataposten inklusive OBIS-kode.1
rapporterer den første værdi,2
den anden. - Alle andre muligheder er fra Tekstsensor.
Datakonvertering
Hvis en måler rapporterer data som en ikke-decimal værdi, kan du automatisk konvertere det ved hjælp af en skabelonsensor og lambda. Lad os antage, at måleren sender en post som den følgende med hex-kodede data:
text
0-0:96.8.0*255(ABCDEF00)
Først skal du oprette en skabelonsensor, der vil offentliggøre data som en decimalværdi.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Opret nu en tekstsensor, der vil modtage data som en streng, konvertere det til decimal og offentliggøre.
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);
Hver gang tekstsensoren modtager en ny værdi, konverterer den den til en decimal og offentliggør den ved hjælp af sensoren med id hex_to_dec_sensor
. Flaget internal
forhindrer sensoren i at være synlig i Home Assistant. I loggen bør du se:
log
[I][iec62056.component:127]: Konverterede HEX 'ABCDEF00' til 2882400000 decimal
De samme resultater kan opnås ved hjælp af Home Assistant lambdas. I dette scenarie offentliggør tekstsensoren en hexadecimal værdi, og Home Assistant templatesensoren foretager konverteringen.
Switch
Switch'en giver mulighed for at udløse aflæsning på forespørgsel. Når tilstanden ændres fra OFF
til ON
, initierer komponenten dataoverførsel fra en måler. Du kan bruge switch'en i automatisering.
Konfigurationsvariabler fra Switch kan bruges.
yaml
# Sample switch configuration
switch:
- platform: iec62056
name: 'Readout Trigger'
Du kan ikke udløse aflæsning i tilstand D.
Binær sensor
Indstillet til ON
, når transmission til en måler begynder. OFF
, når transmissionen er afsluttet.
Du kan bruge alle konfigurationsvariabler fra Binær Sensor.
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
Fejlfinding
- Sørg for, at sonden er korrekt justeret med de optiske elementer på måleren.
- Målerne er normalt installeret i ikke særlig rene områder. Du kan have brug for at fjerne støv fra den optiske grænseflade fra tid til anden.
- Hvis du støder på transmissions- og BCC checksumfejl, skal du sænke baudraten ved hjælp af indstillingen
baud_rate_max
. - Hvis din enhed håndterer flere sensorer, der bruger meget tid i opdateringssløjfen, kan du have brug for at øge seriel port buffer størrelsen. Især hvis du bemærker transmissionsproblemer, når yderligere sensorer er aktiveret, men ikke når de er deaktiveret.