Zum Inhalt

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.


Schritt 2 — WattWächter anschließen

  1. Setze den WattWächter am Stromzähler auf (bei Gen.1 zuvor das Gehäuse schließen)
  2. Verbinde den WattWächter über das USB-C-Kabel mit einem freien USB-Port deines Computers oder Raspberry Pi
  3. 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-ManagerAnschlü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)