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.
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=WasserB
- Kanal, 0=kein Kanal verfügbarC
- physikalischer Wert, zum Beispiel Strom, Spannung, Temperatur.D
- Messart,E
- Tarif, 0=gesamt, 1=Tarif #1, 2=Tarif #2 und so weiterF
- 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:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
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.
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 auf0
. Auf diese Weise können Sie die maximal mögliche Baudrate von19200
verwenden, wenn der Zähler dies unterstützt. Für ESP8266 verwenden Sie die Software-UART auf4800
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ßerreceive_timeout
ignoriert. Vergessen Sie nicht, die UART-Baudrate einzustellen, die der Zähler verwendet. Wenn Sie sich nicht sicher sind, versuchen Sie2400 7E1
oder9600 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
oder2
. Standardmäßig1
. Wenn auf0
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.