Python (Raspberry Pi · Linux · macOS · Windows)¶
Der WattWächter WiFi/USB lässt sich – sowohl Gen.2 als auch Gen.1 – über die USB-C-Schnittstelle direkt mit Python auslesen. Ist die USB-Datenausgabe aktiviert, gibt der WattWächter den rohen SML-Datenstrom des Zählers (9600 Baud, 8N1) über USB-C aus. Das USB-Kabel dient dabei gleichzeitig als Stromversorgung und Datenleitung.
Wir verwenden pyserial zum Einlesen der seriellen Schnittstelle und smllib zum Dekodieren der Telegramme.
Funktioniert mit Gen.2 und Gen.1
Die USB-Datenausgabe ist bei beiden Generationen identisch – nur die Aktivierung unterscheidet sich (Gen.2 per Softwarebefehl, Gen.1 per Jumper). Das Beispiel-Skript ist für beide gleich.
Voraussetzungen am Zähler
Damit der Zähler die vollständigen Momentanwerte (Leistung, Phasen) sendet, muss am Zähler meist die PIN deaktiviert und der erweiterte Infomodus (Inf → On) aktiviert sein. Die PIN erhältst du bei deinem Netzbetreiber. Siehe Vorbereitung des Zählers.
Schritt 1 — USB-Datenausgabe aktivieren¶
Wie die Daten per USB ausgegeben werden, hängt von der Generation deines WattWächters ab. Welche du hast, erkennst du an der Produktübersicht.
- Gen.2: Der Wi-Fi-Modus ist immer aktiv. Die USB-Datenausgabe aktivierst du zusätzlich per Softwarebefehl (
sensor53 u1) — eine Jumper-Konfiguration entfällt. Siehe Inbetriebnahme → USB-Datenausgabe aktivieren (Gen.2). - Gen.1: Stecke die Jumper auf der Platine in den USB-Modus um. Siehe Inbetriebnahme → Betriebsmodus festlegen (Gen.1).
Schritt 2 — WattWächter anschließen¶
- Setze den WattWächter am Stromzähler auf (bei Gen.1 zuvor das Gehäuse schließen)
- Verbinde den WattWächter über das USB-C-Kabel mit einem freien USB-Port deines Computers oder Raspberry Pi
- Das USB-Kabel dient gleichzeitig als Stromversorgung und Datenleitung
Schritt 3 — Seriellen Port ermitteln¶
Der WattWächter meldet sich beim Betriebssystem als USB-Seriell-Gerät (Chip 1a86 / CH340).
ls /dev/ttyUSB*
# z. B. /dev/ttyUSB0
Stabiler Gerätepfad
Verwende für dauerhafte Skripte den Pfad unter /dev/serial/by-id/... (z. B. /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0). Dieser bleibt auch nach einem Neustart oder Wechsel des USB-Ports erhalten — im Gegensatz zu /dev/ttyUSB0.
ls /dev/tty.usbserial*
# z. B. /dev/tty.usbserial-XXXX
Öffne den Geräte-Manager → Anschlüsse (COM & LPT). Der WattWächter erscheint als USB-SERIAL CH340 (COMx), z. B. COM3.
Schritt 4 — Bibliotheken installieren¶
pip install pyserial smllib
Beispiel-Skript¶
import serial
from smllib import SmlStreamReader
# --- Serielle Schnittstelle -------------------------------------------------
# Linux / Raspberry Pi: /dev/ttyUSB0
# macOS: /dev/tty.usbserial-XXXX
# Windows: COM3
PORT = "/dev/ttyUSB0"
# OBIS-Codes, die uns interessieren (Kurzform -> Bezeichnung)
OBIS = {
"1.8.0": "Bezug", # Wh, aus dem Netz bezogen
"2.8.0": "Einspeisung", # Wh, ins Netz eingespeist
"16.7.0": "Leistung", # W, aktuelle Wirkleistung (vorzeichenbehaftet)
}
ser = serial.Serial(PORT, baudrate=9600, bytesize=8,
parity="N", stopbits=1, timeout=2)
stream = SmlStreamReader()
print(f"Lese WattWächter WiFi/USB an {PORT} ...")
while True:
data = ser.read(ser.in_waiting or 1)
if not data:
continue
stream.add(data)
frame = stream.get_frame()
if frame is None:
continue # Telegramm noch nicht vollständig
for entry in frame.get_obis():
name = OBIS.get(entry.obis.obis_short)
if name is None:
continue
value = entry.get_value() # bereits skaliert (Wert × 10^Scaler)
if entry.obis.obis_short in ("1.8.0", "2.8.0"):
print(f"{name:12s}: {value / 1000:.3f} kWh")
else:
print(f"{name:12s}: {value:.0f} W")
print("-" * 30)
Beispiel-Ausgabe:
Lese WattWächter WiFi/USB an /dev/ttyUSB0 ...
Bezug : 12345.678 kWh
Einspeisung : 4321.000 kWh
Leistung : 437 W
------------------------------
Weitere Werte auslesen
Ergänze das OBIS-Dictionary um weitere Codes (z. B. 36.7.0, 56.7.0, 76.7.0 für die Phasenleistungen oder 32.7.0, 52.7.0, 72.7.0 für die Phasenspannungen). entry.get_value() liefert den Wert bereits korrekt skaliert, entry.unit enthält den Einheiten-Code. Eine Übersicht gängiger OBIS-Codes findest du unter Weitere OBIS-Kennzahlen.
Fehlerbehebung¶
| Problem | Mögliche Ursache / Lösung |
|---|---|
Kein /dev/ttyUSB* bzw. kein COM-Port |
USB-Datenausgabe nicht aktiviert (Gen.2: sensor53 u1, Gen.1: Jumper im USB-Modus); USB-Kabel erneut verbinden. Unter Windows ggf. CH340-Treiber installieren |
Permission denied auf /dev/... |
Benutzer zur Gruppe dialout hinzufügen: sudo usermod -aG dialout $USER, danach neu anmelden |
Keine Daten / frame bleibt None |
Lesekopf nicht korrekt über der IR-Schnittstelle des Zählers positioniert; USB-Datenausgabe nicht aktiv; falscher Port |
| Nur Energiezähler, keine Leistung/Phasen | Am Zähler PIN deaktivieren und Inf → On setzen |
| Werte um Faktor 10/100 falsch | In seltenen Fällen get_obis() durch parse_frame() ersetzen (siehe smllib-Doku) |