Stromzähler auslesen: IR-Lesekopf mit ESPHome und SML
Stromzähler auslesen mit IR-Lesekopf, ESP32 und ESPHome: SML-Komponente einrichten, OBIS-Codes aus dem Log lesen und Zählerstand ins Energy Dashboard holen.
- Stand
- Lesezeit
- 8 Min.
- Blatt
- 54 von 54
- Thema
- ESPHome

Werbung / Affiliate-Links: Mit * markierte Links sind Affiliate-Links. Beim Kauf über diese Links erhalten wir eine kleine Provision — für dich ändert sich am Preis nichts. Als Amazon-Partner verdienen wir an qualifizierten Verkäufen.
Dein digitaler Stromzähler kennt Bezug, Einspeisung und oft auch die aktuelle Leistung. Er zeigt sie nicht nur im Display, sondern sendet sie über eine optische Schnittstelle auf der Front. Mit einem IR-Lesekopf, einem ESP32 und ESPHome holst du den Zählerstand 1.8.0 direkt vom Zähler nach Home Assistant. Diese Anleitung führt dich von der Freischaltung bis zum Energy Dashboard.
Was du für das Auslesen brauchst
Dieser Artikel gilt nur für Zähler mit optischer SML-Ausgabe (Smart Message Language). Ob dein Zähler SML sendet, steht im Handbuch oder Datenblatt deines Modells. Optische Schnittstellen mit anderem Protokoll, etwa IEC 62056-21 ohne SML, deckt diese Konfiguration nicht ab. Laut ESPHome-Doku kommt das SML-Telegramm etwa alle 2 bis 4 Sekunden, die Komponente sml liest es passiv mit.
- Lesekopf: Er sitzt magnetisch auf der optischen Schnittstelle. Wir nehmen die TTL-Variante ohne eigene WLAN-Firmware, zum Beispiel den Hichi TTL IR Lesekopf*. Laut Produktbeschreibung enthält er IR-Diode, Fototransistor und Ringmagnet, läuft mit 3 bis 5 V und gibt die Daten per UART aus. Die WLAN-Varianten mit Tasmota-Firmware brauchst du für ESPHome nicht.
- Auswerteeinheit: Ein ESP32-Board wie das ESP32-DevKitC-32E*. Wie du ein Board grundsätzlich in Home Assistant einbindest, steht in unserer Anleitung zu ESP32 und ESPHome.
- Dazu: vier Jumper-Kabel, ein USB-Kabel und ein USB-Netzteil für den Dauerbetrieb.
So haben wir verglichen: Auswahlkriterien waren ein TTL-Ausgang und die Anbindung an ESPHome. Datenbasis sind Herstellerangaben, die Produktbeschreibungen und die offizielle ESPHome-Doku. Die Produkte haben wir nicht selbst getestet.
Die Doku empfiehlt für den Eigenbau einen Fototransistor wie den BPW40 (Emitter an Masse, Kollektor an RX). Der fertige Lesekopf erspart dir diese Bastelei. Die Zählerkompatibilität bleibt trotzdem Foren-Erfahrung: Ob dein Zähler mit deinem Kopf sauber liest, garantiert kein Hersteller.
Zählerzugang freischalten
Viele Zähler senden die Daten nur, wenn die Schnittstelle freigeschaltet ist. Laut FAQ eines Herstellers von Zählerzubehör bekommst du dafür beim Messstellenbetreiber eine vierstellige PIN, meist telefonisch angefordert und per Post geschickt. Je nach Modell gibst du sie per Taster oder Lichtsignal ein. Bei manchen Geräten muss zusätzlich der erweiterte Datensatz im Menü „InF“ oder „Info“ auf „ON“ stehen. Die genauen Schritte stehen im Handbuch deines Zählers. Maßgeblich ist dein Messstellenbetreiber.
Sicherheit: Zähler bleibt zu
- Der Lesekopf kommt nur magnetisch auf die optische Schnittstelle. Öffne den Zähler nicht und entferne keine Plomben.
- Am 230-V-Netz fasst du nichts an. Der Zählerkasten ist Sache von Netzbetreiber und Elektrofachkraft.
- Der ESP32 hängt nur an USB (5 V). Zum Erstflashen steckst du das Board per USB an deinen Rechner, den Lesekopf ziehst du dabei ab. Spätere Änderungen laufen per OTA über WLAN.
- Wenn der Zähler dem Netzbetreiber oder Vermieter gehört, klär vorher, ob ein Lesekopf zulässig ist.
Verkabelung am ESP32
Der Lesekopf hat vier Anschlüsse: VCC, GND, TX und RX. Zum Mitlesen reichen drei:
| Lesekopf | ESP32 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| TX | GPIO16 (RX des ESP32) |
Der TX-Ausgang des Kopfes geht an den Empfangspin des ESP32. Die Beschriftung stimmt nicht bei jedem Kopf. Im Easymeter-Thread der simon42-Community lag der Fehler nach Nutzerangaben an vertauschten TX-/RX-Pins. Kommt später nichts an, tausche die Leitung testweise.
ESPHome-Konfiguration für die SML-Komponente
Lege in ESPHome ein neues Gerät an und trag diese Konfiguration ein. Die Schlüssel api_key_stromzaehler und ota_stromzaehler musst du vorher in der secrets.yaml anlegen: ein gültiger, gerätespezifischer API-Schlüssel und ein OTA-Passwort. Alternativ behältst du die vom Geräteassistenten erzeugten Secret-Namen bei. Zuerst läuft der Log auf DEBUG, damit du die OBIS-Codes siehst.
esphome:
name: stromzaehler
esp32:
board: esp32dev
logger:
level: DEBUG
api:
encryption:
key: !secret api_key_stromzaehler
ota:
- platform: esphome
password: !secret ota_stromzaehler
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
uart:
id: uart_bus
rx_pin: GPIO16
baud_rate: 9600
data_bits: 8
parity: NONE
stop_bits: 1
sml:
id: mysml
uart_id: uart_bus
Die Doku nennt 9600 Baud mit 8N1 oder 7E1. Siehst du Prüfsummenfehler im Log, stell parity: EVEN und data_bits: 7 ein. Flashe das Gerät einmal per USB, wie im Abschnitt zur Sicherheit beschrieben. Setz dann den Lesekopf auf die Schnittstelle.
OBIS-Codes aus dem Log ermitteln
Öffne in ESPHome das Log des Geräts. Sobald der Zähler sendet, listet die Komponente Server-ID und OBIS-Codes mit ihren Rohwerten. Das Format ist [server_id] OBIS-Code [Hexwert]. Typisch sind:
1-0:1.8.0: Wirkenergie Bezug gesamt1-0:2.8.0: Wirkenergie Einspeisung gesamt (nur bei Zählern mit Einspeisung)1-0:16.7.0: aktuelle Wirkleistung gesamt
Welche Codes dein Zähler tatsächlich sendet, steht in deinem Log. Zähler ohne Einspeisemessung liefern keinen sinnvollen Wert für 2.8.0. Übernimm nur Codes, die dort auftauchen.
Sensoren definieren
Ergänze die Konfiguration um die Sensoren. Der Faktor multiply rechnet den Rohwert in kWh um. Das Doku-Beispiel nutzt 0.0001, weil dort der Rohwert in Zehntel-Wattstunden vorliegt. Vergleiche das Ergebnis mit dem Display deines Zählers und passe den Faktor an.
sensor:
- platform: sml
name: "Zählerstand Bezug"
sml_id: mysml
obis_code: "1-0:1.8.0"
unit_of_measurement: kWh
accuracy_decimals: 1
device_class: energy
state_class: total_increasing
filters:
- multiply: 0.0001
- platform: sml
name: "Zählerstand Einspeisung"
sml_id: mysml
obis_code: "1-0:2.8.0"
unit_of_measurement: kWh
accuracy_decimals: 1
device_class: energy
state_class: total_increasing
filters:
- multiply: 0.0001
- platform: sml
name: "Wirkleistung"
sml_id: mysml
obis_code: "1-0:16.7.0"
unit_of_measurement: W
device_class: power
state_class: measurement
Hat dein Zähler keine Einspeisung, streich den zweiten Block. Bei mehreren Zählern am selben Lesekopf brauchst du zusätzlich die server_id. Für sehr große Zählerstände empfiehlt die Doku einen text_sensor mit Template-Sensor in Home Assistant, damit keine Rundungsfehler entstehen. Danach setzt du das Log auf INFO zurück.
Typische Stolpersteine
- Kopf sitzt schief: Der Fototransistor muss mittig vor der IR-Diode des Zählers liegen. Der Ringmagnet rastet meist von selbst ein, bei Zählern mit Kunststoffring prüf die Position im Log.
- Fremdlicht: Direkte Sonne auf der Schnittstelle kann den Empfang stören. Bei Aussetzern probier eine andere Montageposition oder schatte die Stelle ab.
- Leerer Log: Zeigt das Debug-Log nur Verbindungsmeldungen, aber keine OBIS-Codes, liegt es fast immer an Freischaltung, Pinbelegung oder Parität.
- Zählerstand springt: Ein falscher Faktor bei
multiplyfällt sofort auf, wenn du den Wert mit dem Display vergleichst. Prüf das, bevor die Daten ins Energy Dashboard laufen. Falsche Statistikwerte lassen sich nachträglich nur umständlich korrigieren. - WLAN-Abbruch: Bricht die Verbindung ab, fehlen in dieser Zeit Messwerte. Der Zählerstand selbst bleibt im Zähler erhalten.
Einbindung ins Energy Dashboard
Das Gerät erscheint in Home Assistant über die ESPHome-Integration. Öffne dann Einstellungen → Dashboards → Energie. Unter Stromnetz → Netzanschluss hinzufügen wählst du „Zählerstand Bezug“ als aus dem Netz bezogene Energie und bei Bedarf „Zählerstand Einspeisung“. Beide Sensoren haben Einheit, device_class: energy und state_class: total_increasing. Laut Home-Assistant-Doku muss ihr Wert außerdem vom Recorder erfasst werden. Taucht ein Sensor in der Auswahl nicht auf, prüf die Recorder-Einstellungen und die Statistik. Die Einrichtung in Ruhe erklärt unser Artikel zum Energy Dashboard.
Den Stromverbrauch einzelner Geräte oder Stromkreise misst du so nicht. Dafür eignen sich Steckdosen mit Messfunktion oder Klemmen-Sensoren. Mehr dazu in Stromverbrauch messen mit dem ESP32 und beim Shelly 3EM, der per Klemmen im Verteiler misst. Der Einbau dort ist Sache einer Elektrofachkraft.
Tasmota statt ESPHome
Alternativ gibt es Tasmota mit SML-Skript. Es liest dieselbe Schnittstelle, die Einrichtung läuft über ein Skript statt YAML. Die Unterschiede der beiden Firmwares beschreibt der Vergleich Tasmota gegen ESPHome. Wer ohnehin ESPHome nutzt, bleibt am besten dabei.
FAQ
Der Zähler sendet nichts. Woran liegt das? Häufigste Gründe: Schnittstelle nicht freigeschaltet (PIN), TX/RX vertauscht, Kopf sitzt schief oder die Parität passt nicht. Prüf der Reihe nach, mit dem Debug-Log als Maßstab.
Brauche ich eine Genehmigung für den Lesekopf? Der Lesekopf verändert den Zähler nicht. Bei Miet- oder Messstellenverträgen kann trotzdem eine Zustimmung nötig sein. Frag im Zweifel den Messstellenbetreiber.
Wie genau sind die Werte? Die Daten stammen vom Zähler. Die in Home Assistant angezeigte Genauigkeit hängt aber von der übermittelten Auflösung, dem Skalierungsfaktor und möglichen Rundungsfehlern in ESPHome ab, die die Doku bei großen Werten nennt. Gleiche die Werte mit dem Zählerdisplay ab, gleiche Genauigkeit ist nicht garantiert. Die Aktualisierung folgt dem Telegrammtakt von etwa 2 bis 4 Sekunden.
Funktioniert jeder Lesekopf mit jedem Zähler? Nein. Kompatibilität ist Community-Erfahrung und nicht garantiert. Lies im Zweifel Berichte zu deinem Zählermodell.
Fazit
Der Aufbau lohnt sich für Eigentümer und Mieter mit digitalem Zähler und ESPHome-Grundkenntnissen, die den Gesamtverbrauch ohne Eingriff in den Zählerkasten erfassen wollen. Für die Einzelmessung pro Stromkreis ist er nicht gedacht. Wer sich gar nicht mit YAML befassen will, nimmt ein Fertiggerät mit fertiger Firmware. Plane einen Abend für Freischaltung, Log und Faktor ein, der Rest ist in einer halben Stunde erledigt.


