zigbeehome-assistantraspberry-pi

Zigbee-Koordinator übers Netzwerk: Sonoff-Dongle + ser2net

/Veröffentlicht am/Aktualisiert am

Mein Home-Assistant-Server steht im Technikraum im Keller. Mein Zigbee-Netz lebt im Erdgeschoss und im Garten. Das ist das Problem: Der Koordinator steckt genau dort, wo er am wenigsten nützt — im Blechschrank, neben einem USB-3-Gehäuse, drei Betondecken von den Geräten entfernt, die er versorgen soll.

Das Symptom kannte ich irgendwann auswendig: Ein Gerät reagiert, dann wieder nicht, und in den Logs steht „device did not respond”. Keine sauberen Fehler, nur Timeouts. Bei einem batteriebetriebenen Ventil im Schacht draußen war es reproduzierbar nach ein paar Schaltvorgängen vorbei.

Die Lösung, die ich am Ende gefahren bin, ist nicht elegant, aber sie hält: Der Dongle bleibt nicht am Server. Er wandert dorthin, wo das Zigbee-Netz ist, und Home Assistant redet über das LAN mit ihm — serial over IP.

Wie das funktioniert

Wichtig zum Verständnis: Der Raspberry Pi, an dem der Dongle hängt, macht kein Zigbee. Er kennt weder Geräte noch Netzwerkschlüssel. Er reicht schlicht die serielle Schnittstelle über TCP durch. Die komplette Koordinator-Logik läuft weiterhin in ZHA auf deinem HA-Host.

Pi (mit Dongle) → ser2net → TCP/IP → Home Assistant (ZHA)

Das heißt auch: Du behältst dein bestehendes Zigbee-Netz, solange du den selben physischen Dongle umsteckst. Ein neuer Dongle bedeutet neues Netz und Neuanlernen aller Geräte.

Was du brauchst

Teil Warum
Sonoff ZBDongle-P oder -E Der Koordinator selbst. Meldet sich als CP210x (10c4:ea60).
Raspberry Pi Zero 2 W Reicht völlig. Der originale Zero W reicht nicht.
USB-Verlängerung Dongle weg vom Pi-Gehäuse und WLAN-Antenne.
Feste IP / DHCP-Reservierung Sonst verliert ZHA den Koordinator beim nächsten Lease.

Konkret im Einsatz bei mir: Sonoff Zigbee 3.0 USB Dongle Plus* am Raspberry Pi Zero 2 W*, dazwischen eine aktive USB-2.0-Verlängerung*.

Nimm den Pi Zero 2 W, nicht den alten Zero W

Das ist keine Geschmacksfrage. Der originale Pi Zero W ist ein Single-Core-ARMv6 und für diesen Job schlicht zu langsam und zu unzuverlässig. Der Zero 2 W ist Quad-Core und läuft stabil. Wenn du noch einen alten Zero W in der Schublade hast: liegen lassen.

Schritt 1: ser2net installieren

Auf dem Pi:

sudo apt update
sudo apt install -y ser2net

Dann den Dongle finden. Und zwar nicht über /dev/ttyUSB0, denn diese Nummer verschiebt sich, sobald ein zweites USB-Serial-Gerät dazukommt:

ls -l /dev/serial/by-id/
# usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_xxxxxxxx-if00-port0

Diesen stabilen Pfad nimmst du in die Konfiguration. Zur Kontrolle, ob der CP210x-Treiber greift:

udevadm info -q all -n /dev/ttyUSB0 | grep -iE 'ID_MODEL|ID_USB_DRIVER'
# E: ID_MODEL=Sonoff_Zigbee_3.0_USB_Dongle_Plus
# E: ID_USB_DRIVER=cp210x

Schritt 2: ser2net konfigurieren

/etc/ser2net.yaml:

connection: &zigbee
  accepter: tcp,6638
  connector: serialdev,/dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_xxxxxxxx-if00-port0,115200n81,local
  options:
    max-connections: 1
    kickolduser: true

Drei Dinge, die hier wirklich zählen:

  • 115200n81 ist richtig. Sowohl ZBDongle-P als auch ZBDongle-E laufen unter ZHA sauber mit 115200 Baud.
  • max-connections: 1 — es darf immer nur ein Prozess auf dem Koordinator sitzen. Zwei parallele Verbindungen ergeben genau das Chaos, das du nicht debuggen willst.
  • kickolduser: true — nach einem HA-Neustart hängt sonst die alte, tote Session noch auf dem Port und blockiert die neue.

Starten und aktivieren:

sudo systemctl enable --now ser2net
sudo systemctl restart ser2net
sudo ss -tlnp | grep 6638

Wenn ss den Port zeigt, steht die halbe Miete.

Schritt 3: Feste IP vergeben

Das ist kein optionaler Feinschliff. ZHA speichert den Pfad als feste Zeichenkette. Ändert sich die IP des Pi, ist der Koordinator weg — und du suchst den Fehler garantiert an der falschen Stelle.

Am saubersten machst du eine DHCP-Reservierung im Router auf die MAC-Adresse des Pi. Dann bleibt die Adresse zentral verwaltet, statt in einer Datei auf dem Pi zu verstauben.

Schritt 4: ZHA umstellen

Vorher: Backup. Einstellungen → System → Sicherungen. Der Wechsel des Koordinator-Pfads ist eine Migration, kein Klick. Wenn dabei etwas schiefgeht und du kein Backup hast, lernst du dein halbes Haus neu an.

Dann in ZHA den Koordinator-Pfad setzen:

socket://192.168.1.50:6638

Ein schneller Test von der HA-Maschine aus, bevor du überhaupt in die UI gehst:

nc -zv 192.168.1.50 6638

Was nicht funktioniert

Hier sind die Punkte, an denen ich Zeit verloren habe.

WLAN als Transport ist der Klassiker. ser2net über WLAN kann den seriellen Link abreißen lassen — und das produziert exakt die „device did not respond”- Timeouts, die du eigentlich loswerden wolltest. Du tauschst dann ein RF-Problem gegen ein Netzwerkproblem und hältst es für dasselbe. Kabel schlägt WLAN, immer. Ein USB-Ethernet-Adapter am Pi Zero 2 W ist der zuverlässigste Weg. Muss es WLAN sein, dann nur mit wirklich sattem Empfang am Standort des Pi.

Zwei Verbindungen gleichzeitig. Zigbee2MQTT und ZHA parallel auf denselben Port — geht nicht. Ein Koordinator, ein Consumer.

Den Dongle direkt am Pi lassen. Wenn du ihn ohne Verlängerung ins Pi-Gehäuse steckst, sitzt er neben der WLAN-Antenne. Dann hast du den Koordinator nur umgezogen, nicht das Störproblem gelöst.

Der Dongle ist nicht der Fehler, wenn ein Batteriegerät wegfällt. Ein schlafendes End Device verliert seinen Parent, weil in seiner Nähe kein Router steht. Dagegen hilft eine netzbetriebene Zigbee-Steckdose neben dem Gerät — nicht ein umgezogener Koordinator.

Ehrlich: Wann du das nicht machen solltest

Ich würde diesen Aufbau bei den meisten Lesern gar nicht empfehlen.

Wenn dein Problem nur „Dongle steckt neben der SSD und stört” ist, dann kauf dir eine USB-2.0-Verlängerung für ein paar Euro und häng ihn 1–2 Meter weg. Das löst einen großen Teil aller Zigbee-Störungsfälle und du hast keinen zusätzlichen Rechner im Signalweg, der irgendwann nachts ein Update zieht und dein Zigbee gleich mit.

Wenn ein einzelnes Gerät am Rand des Netzes schwächelt, ist die richtige Antwort ein netzbetriebener Zigbee-Router in dessen Nähe. Das repariert den Rückweg Gerät → Koordinator, den ein umgezogener Koordinator gar nicht adressiert.

ser2net lohnt sich genau dann, wenn HA-Host und Zigbee-Netz baulich getrennt sind und du das nicht ändern kannst. Für alles andere baust du dir freiwillig eine weitere Ausfallstelle ein, und zwar eine selbstgebastelte: Wenn der Pi neu startet, das Netzwerk hustet oder ser2net hängt, ist dein komplettes Zigbee weg — nicht nur ein Gerät.

Checkliste zum Nachbauen

  1. Pi Zero 2 W, per Ethernet angebunden, DHCP-Reservierung gesetzt
  2. ser2net installiert, Gerät über /dev/serial/by-id/ referenziert
  3. max-connections: 1 und kickolduser: true gesetzt
  4. Port 6638 von der HA-Maschine aus mit nc erreichbar
  5. ZHA-Backup gezogen, dann auf socket://<ip>:6638 umgestellt
  6. Nach ein paar Tagen LQI-Werte prüfen — vorher/nachher vergleichen

Bei mir läuft das seit Monaten stabil. Aber die ehrliche Reihenfolge bleibt: erst Verlängerungskabel, dann Router in die Nähe der Problemgeräte, und erst wenn das nicht reicht, der Koordinator übers Netz.

Ich bin René, CTO aus Pasching bei Linz. Wenn dein Problem größer ist als ein Rollladen — Streaming, Cloud, lokale LLMs, Technikführung — dann steht hier, was ich beruflich mache.