Skip to content

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.

Interfacet på en måler. Metalring til en magnet og to optiske
elementer indeni.

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=vand
  • B - kanal, 0=ingen kanal tilgængelig
  • C - 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:

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.

Optisk probe dimensioner

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 til 0. 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 til 4800 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 undtagen receive_timeout. Glem ikke at indstille UART baudrate, som måleren bruger. Hvis du ikke er sikker, prøv 2400 7E1 eller 9600 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 eller 2. Standard er 1. Hvis sat til 0, 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.

Se også