Skip to content

ESPHome IEC 62056-21 Component

IEC 62056-21 is een internationale standaard voor een protocol om gegevens uit te wisselen met utiliteitsmeters. Voornamelijk voor elektriciteit, maar ook voor water-, thermische en andere meters. Het was voorheen bekend als IEC 61107.

De iec62056-component stelt je in staat om gegevens van elke compatibele meter te lezen. Het vereist een seriële poort en een externe optische interface. Gegevensuitwisseling maakt gebruik van een infrarood optisch kanaal. Compatibele meters zijn uitgerust met een karakteristieke ronde metalen plaat met twee opto-elementen erin. Het protocol kan worden gebruikt met andere transportlagen, bijvoorbeeld stroomlus, maar de component is alleen getest met de optische interface.

Het ondersteunt 4 modi van IEC 62056-21: A, B, C en D. Modus E wordt niet ondersteund.

De component ondersteunt geen programmering. Het instellen van meterconfiguratieparameters vereist een geheim wachtwoord, wat het onmogelijk maakt voor gewone gebruikers.

De interface op een meter. Metalen ring voor een magneet en twee optische elementen binnenin.

Er zijn andere slimme meterstandaarden die dezelfde optische interface gebruiken. Hoewel ze enkele gemeenschappelijke concepten delen, zijn ze niet compatibel.

Installatie

Voeg de volgende code toe aan het ESPHome YAML-configuratiebestand om de externe component te refereren.

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

Theorie van de werking

De component werkt in 2 hoofdmodi:

  • Bidirectionele communicatie met een meter. In deze modus stuurt een meter alleen gegevens wanneer daarom wordt gevraagd. Het vereist een IR-ontvanger en -zender. Dit is modus A, B en C volgens IEC 62056-21.
  • Unidirectionele communicatie, waarbij een meter van tijd tot tijd gegevens naar een sonde stuurt. Het vereist alleen een IR-ontvanger. In de terminologie van IEC 62056-21 is dit modus D.

Modi A, B, C

De component leest gegevens voor de eerste keer 15 seconden na het opstarten. Eerst stuurt het een identificatieverzoek bij 300 bps. De meter retourneert de maximale baudrate die hij aankan. Vervolgens wordt de baudrate van de seriële poort gewijzigd naar de waarde die door de meter is opgegeven of geconfigureerd door de optie baud_rate_max. De meter verzendt gegevensregisters met bijbehorende OBIS-codes.

Als de overdracht is mislukt (slechte checksum of ongeldig formaat), zal de component proberen de gegevens opnieuw te lezen, maar deze keer met een lagere overdrachtssnelheid. Bij elke herhaling wordt de snelheid verlaagd. Het aantal herhalingen en vertragingen kan worden geconfigureerd.

Als de meter op batterijen werkt, kan er een speciale wake-up-sequentie worden toegepast. Dit gebeurt alleen wanneer battery_meter is ingesteld op True.

Modus D

Voor meters die in modus D werken, heb je alleen een IR-ontvanger nodig, omdat overdracht naar een meter niet wordt ondersteund. In deze modus stuurt de meter elke paar seconden gegevens zonder enige aanvraag. Je moet de seriële poort configureren om overeen te komen met het overdrachtsformaat van de meter. In tegenstelling tot de modi A, B en C, die automatisch worden gedetecteerd, moet modus D handmatig worden ingeschakeld door mode_d=True in de platformconfiguratie in te stellen.

Modus E

Deze modus wordt niet ondersteund. Modus E gebruikt binaire codering via een HDLC-link.

De component probeert modus C te gebruiken voor meters die modus E rapporteren. Dit zou moeten werken als de meter zowel de modi E als C ondersteunt. Voor meters die alleen modus E ondersteunen, is uitlezing niet mogelijk.

OBIS-codes

De OBIS (Object Identification System) code identificeert de verschillende metingen van een meter. De code bestaat uit maximaal 6 groep sub-identificatoren. De code is als volgt geformatteerd: A-B:C.D.E*F, waarbij:

  • A - medium: 0=abstracte objecten, 1=elektriciteit, 6=warmte, 7=gas, 8=water
  • B - kanaal, 0=geen kanaal beschikbaar
  • C - fysieke waarde, bijvoorbeeld stroom, spanning, temperatuur.
  • D - meettype,
  • E - tarief, 0=totaal, 1=tarief #1, 2=tarief #2 enzovoort
  • F - factureringsperiode

A, B en F kunnen worden weggelaten. Codes kunnen hexadecimale cijfers gebruiken, bijvoorbeeld, code 15.8.0 kan worden weergegeven als F.8.0.

De codes zijn gestandaardiseerd, maar apparaten sturen een verschillend aantal codes. Om een lijst met codes te krijgen die door je meter worden ondersteund, schakel je de DEBUG log in voor de iec62056 component en observeer je de loguitvoer. Voorbeelduitvoer:

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

De OBIS-code van de sensor moet exact overeenkomen met wat er van een meter wordt verzonden. Dit is het deel vóór de eerste haakje (.

Als een OBIS-code slechts twee cijfers bevat, moet je aanhalingstekens gebruiken in het configuratiebestand; bijvoorbeeld "1.2" in plaats van alleen 1.2.

Voor een lijst met OBIS-codes voor elektriciteitsmeters kun je de volgende websites bezoeken:

Hardware

Om met een meter te communiceren, moet je een optische interface aan de seriële poort bevestigen. De interface bestaat uit een infrarood LED en een fototransistor. Daarnaast moet het apparaat zijn uitgerust met een ringmagneet om het uitgelijnd te houden met de meter.

Als de meter in unidirectionele modus D werkt, is alleen een IR-fototransistor vereist.

Probe

De standaard definieert de maximale afmetingen van de probe die aan een meter kan worden bevestigd. Het moet zijn uitgerust met een magneet, aangezien dit de enige manier is om de probe in een stabiele positie te houden.

Optische probe-afmetingen

Configuratie

Om meterdata in Home Assistant te zien, moet je een sensor of textsensors definiëren met de juiste OBIS-code. Let op dat meters verschillende sets OBIS-codes ondersteunen. Standaard definieert de component geen sensoren.

Seriële poort

De component vereist UART-bus. De seriële poort moet in de meeste gevallen als 7E1 worden geconfigureerd. Wanneer mode_d=True moet de baudrate worden ingesteld op een waarde die door de meter wordt ondersteund. Meestal 2400 of 9600 bps. Voor andere modi (mode_d=False) wordt de transmissiesnelheid met een meter onderhandeld. baud_rate wordt genegeerd en kan elke waarde zijn.

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

WARNING

Voor ESP8266 wordt sterk aanbevolen om hardware UART te gebruiken. Software UART kan geen transmissies sneller dan 4800 bps verwerken.

Het kan nodig zijn om logging uit te schakelen als de optische probe is aangesloten op de seriële poort die door de loggercomponent wordt gebruikt.

yaml
# Stel baud_rate in op 0 om logging via UART uit te schakelen.
logger:
    baud_rate: 0

Platform

Om de component te gebruiken, moet je de iec62056 platformsectie in het configuratiebestand definiëren. Het bestaat uit basisinstellingen.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Voorbeeld platformconfiguratie-invoer voor unidirectionele communicatie
iec62056:
  mode_d: True

Configuratievariabelen

  • update_interval (Optioneel, Time): Het interval om gegevens van een meter te lezen. Standaard ingesteld op 15min. never schakelt updates uit. In dat geval moet een schakelaar worden gebruikt om de uitlezing te activeren. Gebruik een kleine waarde zoals 1s voor continue metingen.
  • baud_rate_max (Optioneel, int): Beperkt de maximale transmissiesnelheid tot de opgegeven waarde. Standaard ingesteld op 9600 omdat dit een stabiele verbinding biedt. Om het uit te schakelen, stel het in op 0. Op die manier kunt u de maximaal mogelijke baudrate van 19200 gebruiken als de meter dit ondersteunt. Voor ESP8266 gebruik de software UART ingesteld op 4800 of lager.
  • receive_timeout (Optioneel, Time): Maximale tijd dat de component wacht op gegevens van een meter voordat een transmissiefout wordt gemeld. Standaard ingesteld op 3s.
  • battery_meter (Optioneel, boolean): Stel in op true als een meter op batterijen werkt. Op die manier wordt een speciale opstartvolgorde gebruikt.
  • retry_delay (Optioneel, Time): In geval van transmissiefout, tijd om te wachten voordat opnieuw wordt geprobeerd te verzenden. Standaard ingesteld op 15s.
  • retry_counter_max (Optioneel, int): In geval van transmissiefout, het maximale aantal herhalingen. Standaard ingesteld op 2.
  • uart_id (Optioneel, ID: Handmatig het ID specificeren van de UART Component als u meerdere UART-bussen wilt gebruiken.
  • mode_d (Optioneel, boolean): Stel in op True als een meter elke paar seconden gegevens verzendt. Dit dwingt de component om in modus D te werken. In deze modus worden er nooit gegevens naar een meter verzonden. Als ingesteld, worden alle andere instellingen behalve receive_timeout genegeerd. Vergeet niet de UART-baudrate in te stellen die de meter gebruikt. Als u het niet zeker weet, probeer 2400 7E1 of 9600 7E1.

WARNING

Meters op batterijen beperken doorgaans het aantal metingen om energie te besparen, bijvoorbeeld tot 4 metingen per dag. Als een meter deze limiet niet oplegt, kunnen frequente metingen de levensduur van de batterij aanzienlijk verkorten.

Sensor

De sensor rapporteert de eerste waarde tussen haakjes uit het record. Voor de volgende gegevens

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

is de sensorwaarde 6000.385. Om de tweede waarde (datum/tijd in dit voorbeeld) te krijgen, gebruik een Tekstsensor.

De sensor ondersteunt alleen decimale waarden. Als het record gegevens in een ander formaat bevat, moet je een Tekstsensor gebruiken en eventueel een lambda om het om te zetten naar een getal.

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

Configuratievariabelen

  • obis (Vereist): OBIS-code.
  • Alle andere opties van Sensor.

Tekstsensor

De tekstsensor levert uitleesgegevens als tekst. In tegenstelling tot de Sensor kun je selecteren welk deel van de uitlezing wordt gerapporteerd en zelfs het gehele gegevensrecord terugsturen naar 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

Configuratievariabelen

  • obis (Vereist): OBIS-code. Je kunt meerdere tekstsensoren definiëren met dezelfde OBIS maar een andere groep.
  • groep (Optioneel, int): Waardegroep, 0, 1 of 2. Standaard is 1. Als ingesteld op 0, wordt het gehele gegevensrecord gerapporteerd inclusief OBIS-code. 1 rapporteert de eerste waarde, 2 de tweede.
  • Alle andere opties zijn van Tekstsensor.

Gegevensconversie

Als een meter gegevens rapporteert als een niet-decimale waarde, kun je deze automatisch omzetten met een templatesensor en lambda. Stel dat de meter een record verzendt zoals het volgende met hex-gecodeerde gegevens:

text
0-0:96.8.0*255(ABCDEF00)

Maak eerst een templatesensor die gegevens als een decimale waarde publiceert.

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

Maak nu een tekstsensor die gegevens als een string ontvangt, deze omzet naar decimaal en publiceert.

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

Elke keer dat de tekstsensor een nieuwe waarde ontvangt, zet hij deze om naar een decimaal en publiceert het met de sensor met id hex_to_dec_sensor. De internal vlag voorkomt dat de sensor zichtbaar is in Home Assistant. In het logboek zou je moeten zien:

log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal

Dezelfde resultaten kunnen worden verkregen met behulp van Home Assistant lambdas. In dit scenario publiceert de tekstsensor een hexadecimale waarde en maakt de Home Assistant templatesensor de conversie.

Schakelaar

De schakelaar biedt de mogelijkheid om op verzoek een uitlezing te activeren. Wanneer de status verandert van OFF naar ON initieert de component de gegevensoverdracht van een meter. Je kunt de schakelaar in automatisering gebruiken.

Configuratievariabelen van Schakelaar kunnen worden gebruikt.

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

Je kunt geen uitlezing activeren in modus D.

Binaire sensor

Ingesteld op ON wanneer de overdracht naar een meter begint. OFF wanneer de overdracht is voltooid.

Je kunt alle configuratievariabelen van Binaire Sensor gebruiken.

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

Problemen oplossen

  • Zorg ervoor dat de sonde correct is uitgelijnd met de optische elementen op de meter.
  • Meters worden meestal geïnstalleerd in niet erg schone gebieden. Het kan nodig zijn om van tijd tot tijd stof van de optische interface te verwijderen.
  • Als je transmissie- en BCC-controlefouten tegenkomt, verlaag dan de baudrate met de instelling baud_rate_max.
  • Als je apparaat meerdere sensoren verwerkt die veel tijd in de update-lus doorbrengen, moet je mogelijk de bufferomvang van de seriële poort vergroten. Vooral als je transmissieproblemen opmerkt wanneer extra sensoren zijn ingeschakeld, maar niet wanneer ze zijn uitgeschakeld.

Zie ook