Skip to content

ESPHome IEC 62056-21 Komponent

IEC 62056-21 är en internationell standard för ett protokoll för att utbyta data med mätare. Mest för elektricitet men även vatten, värme och andra mätare. Det var tidigare känt som IEC 61107.

iec62056-komponenten låter dig läsa data från vilken kompatibel mätare som helst. Den kräver en seriell port och ett externt optiskt gränssnitt. Datautbyte använder en infraröd optisk kanal. Kompatibla mätare är utrustade med en karakteristisk rund metallplatta med två opto-element inuti. Protokollet kan användas med andra transportlager, t.ex. strömloop, men komponenten har endast testats med det optiska gränssnittet.

Den stöder 4 lägen av IEC 62056-21: A, B, C och D. Läget E stöds inte.

Komponenten stöder inte programmering. Inställning av mätarkonfigurationsparametrar kräver ett hemligt lösenord vilket gör det omöjligt att använda för vanliga användare.

Gränssnittet på en mätare. Metallring för en magnet och två optiska
element inuti.

Det finns andra smarta mätarstandarder som använder samma optiska gränssnitt. Även om de delar vissa gemensamma koncept är de inte kompatibla.

Installation

Lägg till följande kod i ESPHome YAML-konfigurationsfilen för att referera till extern komponent.

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

Teori om funktion

Komponenten fungerar i 2 huvudlägen:

  • Tvåvägskommunikation med en mätare. I detta läge skickar en mätare data endast när det begärs. Det kräver en IR-mottagare och sändare. Detta är läge A, B och C enligt IEC 62056-21.
  • Envägskommunikation, där en mätare skickar data till en sond från tid till annan. Det kräver endast en IR-mottagare. I IEC 62056-21 terminologi är det läge D.

Lägen A, B, C

Komponenten läser data för första gången 15 sekunder efter uppstart. Först skickar den en identifieringsbegäran vid 300 bps. Mätaren returnerar den maximala baudhastighet den kan hantera. Därefter ändras den seriella portens baudhastighet till det värde som tillhandahålls av mätaren eller konfigureras av alternativet baud_rate_max. Mätaren överför dataregister med tillhörande OBIS koder.

Om överföringen har misslyckats (felaktig kontrollsumma eller ogiltigt format), kommer komponenten att försöka läsa data igen, men denna gång med en långsammare överföringshastighet. För varje försök minskas hastigheten. Antalet försök och fördröjningar kan konfigureras.

Om mätaren är batteridriven kan en speciell väckningssekvens tillämpas. Detta sker endast när battery_meter är inställd på True.

Läge D

För mätare som arbetar i läge D behöver du bara en IR-mottagare eftersom överföring till en mätare inte stöds. I detta läge skickar mätaren data var några sekunder utan någon begäran. Du bör konfigurera den seriella porten för att matcha mätarens överföringsformat. Till skillnad från lägena A, B och C som upptäcks automatiskt, måste läge D aktiveras manuellt genom att ställa in mode_d=True i plattformskonfigurationen.

Läge E

Detta läge stöds inte. Läge E använder binär kodning över HDLC-länk.

Komponenten försöker använda läge C för mätare som rapporterar läge E. Detta bör fungera om mätaren stöder både E- och C-lägen. För mätare som endast stöder läge E är avläsning inte möjlig.

OBIS-koder

OBIS (Object Identification System)-koden identifierar de olika avläsningarna från en mätare. Koden består av upp till 6 gruppsubidentifierare. Koden är formaterad så här: A-B:C.D.E*F, där:

  • A - medium: 0=abstrakta objekt, 1=elektricitet, 6=värme, 7=gas, 8=vatten
  • B - kanal, 0=ingen kanal tillgänglig
  • C - fysisk värde, till exempel ström, spänning, temperatur.
  • D - mätningstyp,
  • E - tariff, 0=total, 1=tariff #1, 2=tariff #2 och så vidare
  • F - faktureringsperiod

A, B och F kan utelämnas. Koder kan använda hexadecimala siffror, till exempel kan koden 15.8.0 representeras som F.8.0.

Koderna är standardiserade men enheter skickar ett olika antal koder. För att få en lista över koder som stöds av din mätare, aktivera DEBUG logg för iec62056-komponenten och observera loggutmatningen. Exempel på utmatning:

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 måste exakt matcha det som överförs från en mätare. Detta är delen före den första parentesen (.

Om en OBIS-kod endast består av två siffror, bör du använda citattecken i konfigurationsfilen; till exempel, "1.2" istället för bara 1.2.

För en lista över OBIS-koder för elmätare kan du besöka:

Hårdvara

För att kommunicera med en mätare måste du ansluta ett optiskt gränssnitt till seriella porten. Gränssnittet består av en infraröd LED och fototransistor. Dessutom måste enheten vara utrustad med en ringmagnet för att hålla den i linje med mätaren.

Om mätaren fungerar i enkelriktat läge D, krävs endast en IR-fototransistor.

Prob

Standarden definierar de maximala dimensionerna för proben som kan fästas på en mätare. Den måste vara utrustad med en magnet eftersom det är det enda sättet att hålla proben i en stabil position.

Optisk probdimensioner

Konfiguration

För att se mätardata i Home Assistant måste du definiera en sensor eller textsensors med lämplig OBIS-kod. Observera att mätare stöder olika uppsättningar av OBIS-koder. Som standard definierar komponenten inga sensorer.

Seriell port

Komponenten kräver UART-buss. Den seriella måste konfigureras som 7E1 i de flesta fall. När mode_d=True måste baudhastigheten ställas in på ett värde som stöds av mätaren. Vanligtvis 2400 eller 9600 bps. För andra lägen (mode_d=False) förhandlas överföringshastigheten med en mätare. baud_rate ignoreras och kan vara vilket värde som helst.

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

WARNING

För ESP8266 rekommenderas det starkt att använda hårdvaru-UART. Mjukvaru-UART kan inte hantera överföringar snabbare än 4800 bps.

Du kan behöva inaktivera loggning om den optiska proben är ansluten till den seriella porten som används av loggkomponenten.

yaml
# Ställ in baud_rate till 0 för att inaktivera loggning via UART.
logger:
    baud_rate: 0

Plattform

För att använda komponenten måste du definiera iec62056 plattformssektion i konfigurationsfilen. Den består av grundläggande inställningar.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Exempel på plattformsinställning för enkelriktad kommunikation
iec62056:
  mode_d: True

Konfigurationsvariabler

  • update_interval (Valfritt, Time): Intervallet för att läsa data från en mätare. Standard är 15min. never inaktiverar uppdateringar. I det fallet bör en brytare användas för att utlösa avläsning. För kontinuerliga avläsningar, använd ett litet värde som 1s.
  • baud_rate_max (Valfritt, int): Begränsar den maximala överföringshastigheten till det angivna värdet. Som standard är det inställt på 9600 eftersom det ger en stabil anslutning. För att inaktivera det, ställ in det på 0. På så sätt kan du använda den maximala möjliga baudhastigheten på 19200 om mätaren stöder det. För ESP8266 använd den mjukvarubaserade UART inställd på 4800 eller lägre.
  • receive_timeout (Valfritt, Time): Maximal tid komponenten väntar på data från en mätare innan den rapporterar överföringsfel. Standard är 3s.
  • battery_meter (Valfritt, boolean): Ställ in på true om en mätare är batteridriven. På så sätt kommer en speciell uppstartsekvens att användas.
  • retry_delay (Valfritt, Time): Vid överföringsfel, tid att vänta innan överföringen försöks igen. Standard är 15s.
  • retry_counter_max (Valfritt, int): Vid överföringsfel, maximalt antal försök. Standard är 2.
  • uart_id (Valfritt, ID: Ange manuellt ID för UART-komponenten om du vill använda flera UART-bussar.
  • mode_d (Valfritt, boolean): Ställ in på True om en mätare skickar data var några sekunder. Detta tvingar komponenten att fungera i läge D. I detta läge överförs aldrig data till en mätare. Om inställt, ignoreras alla andra inställningar utom receive_timeout. Glöm inte att ställa in UART baudhastighet som mätaren använder. Om du är osäker prova 2400 7E1 eller 9600 7E1.

WARNING

Batteridrivna mätare begränsar vanligtvis antalet avläsningar för att spara energi, t.ex. till 4 avläsningar per dag. Om en mätare inte har denna begränsning kan frekventa avläsningar avsevärt minska batteriets livslängd.

Sensor

Sensorn rapporterar det första värdet inom parentes från posten. För följande data

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

är sensorvärdet 6000.385. För att få det andra värdet (datum/tid i detta exempel) använd en Text Sensor.

Sensorn stöder endast decimala värden. Om posten innehåller data i något annat format måste du använda Text Sensor och eventuellt lambda för att konvertera det till ett nummer.

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 (Obligatorisk): OBIS-kod.
  • Alla andra alternativ från Sensor.

Text Sensor

Textsensorn tillhandahåller avläsningsdata som text. Till skillnad från Sensor kan du välja vilken del av avläsningen som rapporteras och till och med skicka hela dataposten tillbaka till 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 (Obligatorisk): OBIS-kod. Du kan definiera flera textsensorer med samma OBIS men en annan grupp.
  • group (Valfri, int): Värdegrupp, 0, 1 eller 2. Standard är 1. Om den är inställd på 0 rapporteras hela dataposten inklusive OBIS-kod. 1 rapporterar det första värdet, 2 det andra.
  • Alla andra alternativ är från Text Sensor.

Datakonvertering

Om en mätare rapporterar data som ett icke-decimalt värde kan du konvertera det automatiskt med en mall-sensor och lambda. Låt oss anta att mätaren skickar en post som följande med hex-kodade data:

text
0-0:96.8.0*255(ABCDEF00)

Först, skapa en mall-sensor som publicerar data som ett decimalt värde.

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

Skapa nu en textsensor som tar emot data som en sträng, konverterar den till decimal och publicerar.

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

Varje gång textsensorn får ett nytt värde, konverterar den det till ett decimaltal och publicerar det med sensorn med id hex_to_dec_sensor. Flaggan internal förhindrar att sensorn syns i Home Assistant. I loggen bör du se:

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

Samma resultat kan uppnås med hjälp av Home Assistant-lambdas. I detta scenario publicerar textsensorn ett hexadecimalt värde och Home Assistant templatesensor gör konverteringen.

Switch

Switch ger möjlighet att utlösa avläsning på begäran. När tillståndet ändras från OFF till ON initierar komponenten datatransmission från en mätare. Du kan använda switchen i automation.

Konfigurationsvariabler från Switch kan användas.

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

Du kan inte utlösa avläsning i läge D.

Binär sensor

Sätts till ON när transmission till en mätare börjar. OFF när transmissionen är avslutad.

Du kan använda alla konfigurationsvariabler från 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

Felsökning

  • Se till att sonden är korrekt justerad med de optiska elementen på mätaren.
  • Mätare är vanligtvis installerade i inte särskilt rena områden. Du kan behöva ta bort damm från det optiska gränssnittet då och då.
  • Om du stöter på överförings- och BCC-kontrollsummefel, minska baudhastigheten med inställningen baud_rate_max.
  • Om din enhet hanterar flera sensorer som spenderar mycket tid i uppdateringsloopen kan du behöva öka seriella portens buffertstorlek. Speciellt om du märker överföringsproblem när ytterligare sensorer är aktiverade men inte när de är inaktiverade.

Se även