Skip to content

ESPHome IEC 62056-21 Komponente

IEC 62056-21 ist ein internationaler Standard für ein Protokoll zum Austausch von Daten mit Zählgeräten. Hauptsächlich für Elektrizität, aber auch für Wasser-, Wärme- und andere Zähler. Es war zuvor als IEC 61107 bekannt.

Die iec62056-Komponente ermöglicht das Auslesen von Daten aus jedem kompatiblen Zähler. Sie erfordert einen seriellen Anschluss und eine externe optische Schnittstelle. Der Datenaustausch erfolgt über einen Infrarot-Optikkanal. Kompatible Zähler sind mit einer charakteristischen runden Metallplatte mit zwei Opto-Elementen ausgestattet. Das Protokoll könnte mit anderen Transportschichten verwendet werden, z.B. Stromschleife, aber die Komponente wurde nur mit der optischen Schnittstelle getestet.

Es unterstützt 4 Modi von IEC 62056-21: A, B, C und D. Modus E wird nicht unterstützt.

Die Komponente unterstützt keine Programmierung. Das Setzen von Zählerkonfigurationsparametern erfordert ein geheimes Passwort, was die Nutzung durch gewöhnliche Benutzer unmöglich macht.

Die Schnittstelle an einem Zähler. Metallring für einen Magneten und zwei optische Elemente innen.

Es gibt andere Standards für intelligente Zähler, die dieselbe optische Schnittstelle verwenden. Obwohl sie einige gemeinsame Konzepte teilen, sind sie nicht kompatibel.

Installation

Fügen Sie den folgenden Code zur ESPHome YAML-Konfigurationsdatei hinzu, um die externe Komponente zu referenzieren.

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

Funktionsweise

Die Komponente arbeitet in 2 Hauptmodi:

  • Bidirektionale Kommunikation mit einem Zähler. In diesem Modus sendet ein Zähler Daten nur auf Anfrage. Es erfordert einen IR-Empfänger und -Sender. Dies entspricht den Modi A, B und C gemäß IEC 62056-21.
  • Unidirektionale Kommunikation, bei der ein Zähler von Zeit zu Zeit Daten an eine Sonde sendet. Es erfordert nur einen IR-Empfänger. In der Terminologie von IEC 62056-21 ist dies der Modus D.

Modi A, B, C

Die Komponente liest Daten zum ersten Mal 15 Sekunden nach dem Start aus. Zuerst sendet sie eine Identifikationsanfrage mit 300 bps. Der Zähler gibt die maximale Baudrate zurück, die er verarbeiten kann. Danach wird die Baudrate des seriellen Ports auf den vom Zähler bereitgestellten Wert oder den durch die Option baud_rate_max konfigurierten Wert geändert. Der Zähler überträgt Datenregister mit zugehörigen OBIS-Codes.

Wenn die Übertragung fehlgeschlagen ist (schlechte Prüfsumme oder ungültiges Format), versucht die Komponente, die Daten erneut zu lesen, diesmal jedoch mit einer langsameren Übertragungsgeschwindigkeit. Bei jedem erneuten Versuch wird die Geschwindigkeit verringert. Die Anzahl der Wiederholungen und Verzögerungen kann konfiguriert werden.

Wenn der Zähler batteriebetrieben ist, kann eine spezielle Aufwecksequenz angewendet werden. Dies geschieht nur, wenn battery_meter auf True gesetzt ist.

Modus D

Für Zähler, die im Modus D arbeiten, benötigen Sie nur einen IR-Empfänger, da die Übertragung zu einem Zähler nicht unterstützt wird. In diesem Modus sendet der Zähler alle paar Sekunden Daten ohne Anfrage. Sie sollten den seriellen Port so konfigurieren, dass er dem Übertragungsformat des Zählers entspricht. Im Gegensatz zu den Modi A, B und C, die automatisch erkannt werden, muss Modus D manuell aktiviert werden, indem mode_d=True in der Plattformkonfiguration gesetzt wird.

Modus E

Dieser Modus wird nicht unterstützt. Modus E verwendet binäre Kodierung über HDLC-Verbindung.

Die Komponente versucht, Modus C für Zähler zu verwenden, die Modus E melden. Dies sollte funktionieren, wenn der Zähler sowohl die Modi E als auch C unterstützt. Für Zähler, die nur den Modus E unterstützen, ist das Auslesen nicht möglich.

OBIS-Codes

Der OBIS (Object Identification System) Code identifiziert die verschiedenen Messwerte eines Zählers. Der Code besteht aus bis zu 6 Gruppenunterkennungen. Der Code ist wie folgt formatiert: A-B:C.D.E*F, wobei:

  • A - Medium: 0=abstrakte Objekte, 1=Elektrizität, 6=Wärme, 7=Gas, 8=Wasser
  • B - Kanal, 0=kein Kanal verfügbar
  • C - physikalischer Wert, zum Beispiel Strom, Spannung, Temperatur.
  • D - Messart,
  • E - Tarif, 0=gesamt, 1=Tarif #1, 2=Tarif #2 und so weiter
  • F - Abrechnungszeitraum

A, B und F können weggelassen werden. Codes können hexadezimale Ziffern verwenden, zum Beispiel könnte der Code 15.8.0 als F.8.0 dargestellt werden.

Die Codes sind standardisiert, aber Geräte senden eine unterschiedliche Anzahl von Codes. Um eine Liste der von Ihrem Zähler unterstützten Codes zu erhalten, aktivieren Sie das DEBUG-Protokoll für die iec62056-Komponente und beobachten Sie die Protokollausgabe. Beispielausgabe:

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

Der Sensor-OBIS-Code muss genau mit dem übereinstimmen, was von einem Zähler übertragen wird. Dies ist der Teil vor der ersten Klammer (.

Wenn ein OBIS-Code nur aus zwei Ziffern besteht, sollten Sie im Konfigurationsdatei Anführungszeichen verwenden; zum Beispiel "1.2" anstelle von nur 1.2.

Für eine Liste von OBIS-Codes für Stromzähler können Sie folgende Seiten besuchen:

Hardware

Um mit einem Zähler zu kommunizieren, müssen Sie eine optische Schnittstelle an den seriellen Port anschließen. Die Schnittstelle besteht aus einer Infrarot-LED und einem Fototransistor. Zusätzlich muss das Gerät mit einem Ringmagneten ausgestattet sein, um es mit dem Zähler auszurichten.

Wenn der Zähler im unidirektionalen Modus D arbeitet, wird nur ein IR-Fototransistor benötigt.

Sonde

Der Standard definiert die maximalen Abmessungen der Sonde, die an einen Zähler angeschlossen werden kann. Sie muss mit einem Magneten ausgestattet sein, da dies die einzige Möglichkeit ist, die Sonde in einer stabilen Position zu halten.

Optische Sondenabmessungen

Konfiguration

Um Zählerdaten in Home Assistant anzuzeigen, müssen Sie einen Sensor oder Textsensor mit dem entsprechenden OBIS-Code definieren. Beachten Sie, dass Zähler unterschiedliche Sets von OBIS-Codes unterstützen. Standardmäßig definiert die Komponente keine Sensoren.

Serieller Port

Die Komponente erfordert UART-Bus. Der serielle Port muss in den meisten Fällen als 7E1 konfiguriert werden. Wenn mode_d=True, muss die Baudrate auf einen vom Zähler unterstützten Wert eingestellt werden. Normalerweise 2400 oder 9600 bps. Für andere Modi (mode_d=False) wird die Übertragungsgeschwindigkeit mit einem Zähler ausgehandelt. baud_rate wird ignoriert und kann jeden Wert haben.

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 wird dringend empfohlen, die Hardware-UART zu verwenden. Software-UART kann keine Übertragungen schneller als 4800 bps verarbeiten.

Möglicherweise müssen Sie das Logging deaktivieren, wenn die optische Sonde an den seriellen Port angeschlossen ist, der von der Logger-Komponente verwendet wird.

yaml
# Setzen Sie baud_rate auf 0, um das Logging über UART zu deaktivieren.
logger:
    baud_rate: 0

Plattform

Um die Komponente zu verwenden, müssen Sie den Abschnitt iec62056 in der Konfigurationsdatei definieren. Er besteht aus grundlegenden Einstellungen.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Beispiel für eine Plattformkonfiguration für unidirektionale Kommunikation
iec62056:
  mode_d: True

Konfigurationsvariablen

  • update_interval (Optional, Time): Das Intervall, um Daten von einem Zähler zu lesen. Standardmäßig 15min. never deaktiviert Updates. In diesem Fall sollte ein Schalter verwendet werden, um das Auslesen auszulösen. Um kontinuierliche Messwerte zu erhalten, verwenden Sie einen kleinen Wert wie 1s.
  • baud_rate_max (Optional, int): Begrenzt die maximale Übertragungsgeschwindigkeit auf den angegebenen Wert. Standardmäßig ist sie auf 9600 eingestellt, da dies eine stabile Verbindung bietet. Um es zu deaktivieren, setzen Sie es auf 0. Auf diese Weise können Sie die maximal mögliche Baudrate von 19200 verwenden, wenn der Zähler dies unterstützt. Für ESP8266 verwenden Sie die Software-UART auf 4800 oder niedriger.
  • receive_timeout (Optional, Time): Maximale Zeit, die die Komponente auf Daten von einem Zähler wartet, bevor ein Übertragungsfehler gemeldet wird. Standardmäßig 3s.
  • battery_meter (Optional, boolean): Auf true setzen, wenn ein Zähler batteriebetrieben ist. Auf diese Weise wird eine spezielle Einschaltsequenz verwendet.
  • retry_delay (Optional, Time): Im Falle eines Übertragungsfehlers, die Zeit, die gewartet wird, bevor die Übertragung erneut versucht wird. Standardmäßig 15s.
  • retry_counter_max (Optional, int): Im Falle eines Übertragungsfehlers, die maximale Anzahl von Wiederholungsversuchen. Standardmäßig 2.
  • uart_id (Optional, ID: Manuell die ID der UART-Komponente angeben, wenn Sie mehrere UART-Busse verwenden möchten.
  • mode_d (Optional, boolean): Auf True setzen, wenn ein Zähler alle paar Sekunden Daten sendet. Dies zwingt die Komponente, im Modus D zu arbeiten. In diesem Modus werden niemals Daten an einen Zähler übertragen. Wenn gesetzt, werden alle anderen Einstellungen außer receive_timeout ignoriert. Vergessen Sie nicht, die UART-Baudrate einzustellen, die der Zähler verwendet. Wenn Sie sich nicht sicher sind, versuchen Sie 2400 7E1 oder 9600 7E1.

WARNING

Batteriebetriebene Zähler begrenzen typischerweise die Anzahl der Ablesungen, um Energie zu sparen, z.B. auf 4 Ablesungen pro Tag. Wenn ein Zähler diese Begrenzung nicht hat, können häufige Ablesungen die Batterielebensdauer erheblich verkürzen.

Sensor

Der Sensor meldet den ersten Wert in Klammern aus dem Datensatz. Für die folgenden Daten

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

ist der Sensorwert 6000.385. Um den zweiten Wert (Datum/Uhrzeit in diesem Beispiel) zu erhalten, verwenden Sie einen Text Sensor.

Der Sensor unterstützt nur Dezimalwerte. Wenn der Datensatz Daten in einem anderen Format enthält, müssen Sie Text Sensor und optional Lambda verwenden, um ihn in eine Zahl zu konvertieren.

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

Konfigurationsvariablen

  • obis (Erforderlich): OBIS-Code.
  • Alle anderen Optionen von Sensor.

Text Sensor

Der Textsensor liefert Ablesedaten als Text. Im Gegensatz zum Sensor können Sie auswählen, welcher Teil der Ablesung gemeldet wird, und sogar den gesamten Datensatz an Home Assistant zurücksenden.

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

Konfigurationsvariablen

  • obis (Erforderlich): OBIS-Code. Sie können mehrere Textsensoren mit demselben OBIS, aber einer anderen Gruppe definieren.
  • group (Optional, int): Wertgruppe, 0, 1 oder 2. Standardmäßig 1. Wenn auf 0 gesetzt, wird der gesamte Datensatz einschließlich OBIS-Code gemeldet. 1 meldet den ersten Wert, 2 den zweiten.
  • Alle anderen Optionen sind von Text Sensor.

Datenkonvertierung

Wenn ein Zähler Daten als nicht-dezimalen Wert meldet, können Sie diese automatisch mit einem Vorlagensensor und Lambda konvertieren. Angenommen, der Zähler sendet einen Datensatz wie den folgenden mit hex-kodierten Daten:

text
0-0:96.8.0*255(ABCDEF00)

Erstellen Sie zuerst einen Vorlagensensor, der Daten als Dezimalwert veröffentlicht.

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

Erstellen Sie nun einen Textsensor, der Daten als Zeichenfolge empfängt, in Dezimal umwandelt und veröffentlicht.

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

Jedes Mal, wenn der Textsensor einen neuen Wert erhält, wandelt er ihn in eine Dezimalzahl um und veröffentlicht ihn mit dem Sensor mit der ID hex_to_dec_sensor. Das internal-Flag verhindert, dass der Sensor in Home Assistant sichtbar ist. Im Log sollten Sie sehen:

log
[I][iec62056.component:127]: Konvertierte HEX 'ABCDEF00' zu 2882400000 Dezimal

Die gleichen Ergebnisse können mit Home Assistant Lambdas erzielt werden. In diesem Szenario veröffentlicht der Textsensor den hexadezimalen Wert und der Home Assistant Template-Sensor führt die Umwandlung durch.

Schalter

Der Schalter bietet die Möglichkeit, die Abfrage auf Anfrage auszulösen. Wenn der Zustand von OFF auf ON geändert wird, initiiert die Komponente die Datenübertragung von einem Zähler. Sie können den Schalter in der Automatisierung verwenden.

Konfigurationsvariablen von Schalter können verwendet werden.

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

Sie können die Abfrage im Modus D nicht auslösen.

Binärsensor

Wird auf ON gesetzt, wenn die Übertragung zu einem Zähler beginnt. OFF, wenn die Übertragung abgeschlossen ist.

Sie können alle Konfigurationsvariablen von Binärsensor verwenden.

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

Fehlerbehebung

  • Stellen Sie sicher, dass die Sonde richtig mit den optischen Elementen auf dem Zähler ausgerichtet ist.
  • Zähler sind normalerweise in nicht sehr sauberen Bereichen installiert. Möglicherweise müssen Sie von Zeit zu Zeit Staub von der optischen Schnittstelle entfernen.
  • Wenn Sie Übertragungs- und BCC-Prüfsummenfehler feststellen, verringern Sie die Baudrate mit der Einstellung baud_rate_max.
  • Wenn Ihr Gerät mehrere Sensoren verarbeitet, die viel Zeit in der Aktualisierungsschleife verbringen, müssen Sie möglicherweise die Puffergröße des seriellen Ports erhöhen. Besonders wenn Sie Übertragungsprobleme feststellen, wenn zusätzliche Sensoren aktiviert sind, aber nicht, wenn sie deaktiviert sind.

Siehe auch