Schon länger spiele ich mit dem Gedanken den Stromverbrauch im Haus genauer unter die Lupe zu nehmen. Die meisten modernen digitalen Stromzähler haben eine optische Datenschnittstelle, über die sie ihren Verbrauch im SML-Format (Smart Messaging Language) per Infrarot ausgeben – und die lässt sich mit einem Raspberry Pi und einem einfachen Fototransistor prima auslesen. In diesem Artikel zeige ich euch, wie das mit aktuellem Raspberry Pi OS Bookworm und einem Pi 4 oder Pi 5 funktioniert.
Voraussetzungen: Hat euer Zähler eine optische Schnittstelle?
Bevor ihr Hardware kauft, prüft ob euer Stromzähler eine optische Datenschnittstelle D0 nach DIN EN 62056-21 hat. Die meisten ab ca. 2010 eingebauten digitalen Zähler (Hersteller: Landis+Gyr, Iskra, EMH, ABB u.a.) haben diese Schnittstelle. Sie überträgt Verbrauchswerte im SML-Format via Infrarot-LED.
Einfacher Test: Macht mit eurem Smartphone ein Foto des Zählers. Auf dem Bild sollte ein blinkender Lichtpunkt an der IR-LED sichtbar sein – Smartphone-Kameras sehen Infrarotlicht.
Manche Zähler müssen per PIN freigeschaltet werden, den ihr bei eurem Netzbetreiber unter Angabe der Zählernummer anfordern könnt.
Hinweis Intelligentes Messsystem (iMSys): Neuere Smart Meter mit Kommunikationsmodul (Rollout ab 2025 verpflichtend für Verbraucher >6.000 kWh/Jahr) haben teils eine andere Schnittstelle. Die hier beschriebene Methode gilt für den verbreiteten optischen D0/SML-Ausgang klassischer digitaler Zähler.
Hardware
Raspberry Pi
- Raspberry Pi 4 Model B oder Raspberry Pi Zero 2 W (kompakter, günstiger)
- USB-C Netzteil (Pi 4: 5V/3A; Pi Zero 2 W: Micro-USB 5V/2,5A)
- MicroSD-Karte 32 GB – alternativ empfehle ich für Dauerbetrieb eine NVMe SSD oder USB-SSD (SD-Karten halten im 24/7-Betrieb oft nur Monate)
- Optional: Ethernet-Kabel oder PowerLine-Adapter (falls kein WLAN im Zählerschrank)
Schaltung für den Fototransistor
- Mini-Steckbrett
- Jumper-Kabel Male/Female
- 1k-Ohm-Widerstand
- Fototransistor TEKT5400S oder SFH309 (bei Reichelt oder Conrad erhältlich)
Alternative: Fertiger USB-Lesekopf
Wer sich die Schaltung sparen möchte, greift zu einem fertigen optischen Lesekopf mit USB-Anschluss. Diese werden direkt per USB mit dem Pi verbunden, tauchen als serieller Port (/dev/ttyUSB0) auf und funktionieren ohne Lötarbeit. Beliebt sind Modelle von Volkszähler.org-Unterstützern oder günstige Varianten aus der Community.
Verkabelung der Schaltung
Der Aufbau ist simpel: Fototransistor und Widerstand werden mit dem UART-RXD-Pin des Pi verbunden. Das Mini-Steckbrett lässt sich mit doppelseitigem Klebeband im Zählerschrank befestigen.
Pinbelegung:
- Rot: 3,3V – PIN 1
- Schwarz: GND – PIN 6
- Blau: RXD – PIN 10
- Kollektor des Fototransistors an RXD (blau) und über 1k-Ohm an 3,3V (rot)
- Emitter an GND (schwarz)
Wichtig: Kollektor und Emitter nicht vertauschen – mit Blick auf die Linse ist der Emitter links, der Kollektor rechts.
Raspberry Pi OS Bookworm einrichten
Ich verwende Raspberry Pi OS Bookworm (64-bit), das aktuelle Standardsystem. Richtet euren Pi wie im Einsteiger-Guide beschrieben ein. Alle weiteren Schritte erledigt ihr per SSH oder direkt am Terminal.
Zuerst System aktualisieren:
|
1 |
sudo apt update && sudo apt upgrade -y |
Hardware Serial Port aktivieren (UART)
Wir nutzen den UART-RXD-Pin (PIN 10) des Raspberry Pi. Standardmäßig ist dieser an Bluetooth gebunden oder als Konsole konfiguriert – das müssen wir ändern.
Schritt 1: Serial-Konsole deaktivieren via raspi-config
|
1 |
sudo raspi-config |
In Raspberry Pi OS Bookworm navigiert ihr zu:
- 3 Interface Options
- I6 Serial Port
- Erste Frage („Login shell über serial?“) → No
- Zweite Frage („Serial Port Hardware aktivieren?“) → Yes
- Bestätigen mit OK → Finish
Schritt 2: Bluetooth deaktivieren, Hardware-UART freigeben
Öffnet die Konfigurationsdatei – Achtung: seit Bookworm liegt diese unter /boot/firmware/config.txt (nicht mehr /boot/config.txt):
|
1 |
sudo nano /boot/firmware/config.txt |
Fügt am Ende folgende Zeile hinzu:
|
1 |
dtoverlay=disable-bt |
Hinweis: Für Pi 4 und Pi 5 lautet der Overlay disable-bt (nicht mehr pi3-disable-bt wie beim alten Pi 3).
Speichern mit STRG+X, Y, ENTER. Dann den Bluetooth-Systemdienst deaktivieren:
|
1 2 |
sudo systemctl disable hciuart sudo reboot |
Nach dem Neustart ist der Hardware-UART unter /dev/ttyAMA0 (bzw. Symlink /dev/serial0) verfügbar.
Schritt 3: UART-Port prüfen
|
1 |
ls -la /dev/serial* |
Ausgabe sollte zeigen: /dev/serial0 → ttyAMA0
Fototransistor testen mit minicom
|
1 2 |
sudo apt install minicom -y sudo minicom -s |
- Serial port setup wählen
- A → Serial Device:
/dev/ttyAMA0eingeben, Enter - E → Bps/Par/Bits:
9600 8N1wählen (C, L, V, W) - Save setup as dfl → Exit
Wenn ihr im Minicom-Fenster wirre Zeichen seht, empfängt der Fototransistor korrekt SML-Daten. Minicom beendet ihr mit CTRL+A, Q, ENTER.
Anschließend UART-Parameter festlegen:
|
1 |
sudo stty -F /dev/ttyAMA0 9600 cs8 -cstopb -parenb |
vzlogger installieren
Der vzlogger liest die SML-Daten aus und leitet sie weiter. Unter Bookworm könnt ihr ihn direkt als Paket installieren:
|
1 |
sudo apt install vzlogger -y |
Falls die Paketversion veraltet ist oder Probleme macht, alternativ aus dem Quellcode kompilieren (Build-Script von volkszaehler.org):
|
1 2 3 4 5 6 7 |
sudo apt install git cmake build-essential libssl-dev libcurl4-openssl-dev \ libgnutls28-dev libsasl2-dev libtool uuid-dev libsml-dev -y git clone https://github.com/volkszaehler/vzlogger.git cd vzlogger && mkdir build && cd build cmake .. make -j$(nproc) sudo make install |
vzlogger konfigurieren
Schritt 1: OBIS-Kennzahlen ermitteln
Erstellt zunächst eine Testkonfiguration, um zu sehen welche Werte euer Zähler sendet:
|
1 |
sudo nano /etc/vzlogger.conf |
Inhalt:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "retry" : 0, "daemon": true, "verbosity": 15, "log": "/var/log/vzlogger.log", "local": { "enabled": false, "port": 8080, "index": true, "timeout": 30, "buffer": 600 }, "meters": [{ "enabled": true, "protocol": "sml", "device": "/dev/ttyAMA0" }] } |
vzlogger starten und Log beobachten:
|
1 2 |
sudo systemctl start vzlogger tail -f /var/log/vzlogger.log |
Ihr seht jetzt die empfangenen OBIS-Kennzahlen, z.B.:
|
1 2 3 |
[mtr0] Reading: id=1-0:1.7.0*255 value=2172.00 ← Aktuelle Leistung (Watt) [mtr0] Reading: id=1-0:1.8.1*255 value=6353884 ← Zählerstand Tarif 1 (Wh) [mtr0] Reading: id=1-0:2.8.0*255 value=123456 ← Einspeisung (falls Photovoltaik) |
Die wichtigsten OBIS-Kennzahlen:
| OBIS-Kennzahl | Bedeutung | Einheit |
| 1-0:1.7.0 | Momentanleistung Bezug | Watt |
| 1-0:1.8.0 | Zählerstand Bezug gesamt | Wh |
| 1-0:1.8.1 / 1.8.2 | Zählerstand Tarif 1 / Tarif 2 | Wh |
| 1-0:2.8.0 | Einspeisung (Photovoltaik) | Wh |
| 1-0:16.7.0 | Wirkleistung (alle Phasen) | Watt |
Schritt 2: Volkszähler-Kanäle anlegen
Öffnet das Volkszähler-Webinterface im Browser unter http://<ip-des-pi>/ und legt für jede OBIS-Kennzahl einen Kanal an. Notiert euch nach dem Erstellen die UUID jedes Kanals – ihr braucht sie für die vzlogger-Konfiguration.
Schritt 3: vzlogger Endkonfiguration
Editiert /etc/vzlogger.conf und tragt die UUIDs der Kanäle ein:
|
1 |
sudo nano /etc/vzlogger.conf |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ "retry": 0, "daemon": true, "verbosity": 10, "log": "/var/log/vzlogger.log", "local": { "enabled": false, "port": 8080, "index": true, "timeout": 30, "buffer": 600 }, "meters": [{ "enabled": true, "protocol": "sml", "device": "/dev/ttyAMA0", "aggtime": 10, "aggmode": "avg", "channels": [{ "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "middleware": "http://localhost/middleware.php", "identifier": "1-0:1.7.0" }, { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "middleware": "http://localhost/middleware.php", "identifier": "1-0:1.8.1" }, { "uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "middleware": "http://localhost/middleware.php", "identifier": "1-0:1.8.2" }] }] } |
Tipp: Die Parameter aggtime und aggmode reduzieren die Schreibhäufigkeit in die Datenbank deutlich – sonst werden alle 2 Sekunden Einträge erzeugt, was mehrere MB pro Tag ergibt und SD-Karten schnell verschleißt.
vzlogger neu starten:
|
1 2 |
sudo systemctl restart vzlogger sudo systemctl enable vzlogger |
Im Volkszähler-Webinterface sollten jetzt live Daten erscheinen:
Alternative: Home Assistant mit SML-Integration
Wer Home Assistant betreibt, kann den Stromzähler direkt ohne Volkszähler einbinden. Home Assistant bietet eine native SML-Integration, die vzlogger und die Volkszähler-Middleware komplett ersetzt:
- Fototransistor-Schaltung wie oben aufbauen (oder USB-Lesekopf nutzen)
- In Home Assistant: Einstellungen → Geräte & Dienste → Integration hinzufügen → SML
- Serielles Gerät (
/dev/ttyAMA0oder/dev/ttyUSB0) auswählen - HA erkennt die OBIS-Kennzahlen automatisch und legt Sensoren an
Die Verbrauchsdaten landen dann direkt im Home Assistant Energie-Dashboard – inklusive Tages-/Monatsauswertung, Kostenberechnung und Vergleichsdiagrammen. Das ist heute für die meisten der komfortablere Weg.
Hinweise für den Raspberry Pi Zero 2 W
Der Pi Zero 2 W ist aufgrund seiner Größe ideal für den Einsatz im Zählerschrank. Er hat nur einen Micro-USB-Anschluss, über den er mit Strom versorgt wird. UART-Konfiguration und Pinbelegung sind identisch mit Pi 4. Da der Zero 2 W nur über WLAN verfügt (kein Ethernet), müsst ihr WLAN vorher im Raspberry Pi Imager einrichten oder einen WLAN-Extender in der Nähe des Zählerschranks nutzen.
Fazit
Mit einem Raspberry Pi und einem einfachen Fototransistor habt ihr für unter 30 Euro ein vollständiges Stromverbrauchs-Monitoring für euer Zuhause. Der Volkszähler bietet eine bewährte, lokale Lösung – wer Home Assistant nutzt, kann die SML-Integration aber noch einfacher und direkt einbinden. Wichtig für 2025: den neuen Konfig-Pfad /boot/firmware/config.txt und den Overlay disable-bt nutzen – damit klappt die UART-Aktivierung unter Bookworm reibungslos.



