Das großartige WLED-Projekt bringt nicht nur jede Menge eingebauter Effekte und Farbkombinationen mit, sondern lässt sich auch über eine ganze Reihe von Netzwerkprotokollen steuern. Eins davon ist die UDP-Echtzeitsteuerung. Damit setzt man einzelne LEDs direkt von außen, zum Beispiel aus einem PowerShell-Skript.
Das Protokoll ist binär, die Datenbytes muss man also selbst zusammenbauen. Dafür brauchte ich eine Menge (hässlicher) Typumwandlungen nach [byte[]]. Vielleicht geht das eleganter, aber das Ganze ist ohnehin nur ein Proof of Concept: Es soll zeigen, dass und wie es funktioniert, mehr nicht.
Aufbau eines Pakets
<1> Protokollkennung
<5> nach fünf Sekunden zurück zum normalen WLED-Betrieb
<0> Index der LED, 0 ist die erste
<Rot>
<Grün>
<Blau>
<1> Index der LED, 1 ist die zweite
<Rot>
<Grün>
<Blau>
<2> Index der LED, 2 ist die dritte
<Rot>
<Grün>
<Blau>
...
Ein Abschlusszeichen braucht es nicht, und die LED-Indizes müssen nicht lückenlos aufeinander folgen.
Beispiel in PowerShell
Das Skript schaltet die ersten 10 LEDs rot, wartet eine Sekunde, schaltet die nächsten 10 grün, wartet wieder und schaltet dann weitere 10 blau. Nach fünf Sekunden ist alles wieder wie vorher. Die IP-Adresse des WLED-Controllers muss man anpassen; sie steht in der WLED-App oder im Router.
# IP des WLED-Controllers
$WledIP = '192.168.178.96'
# UDP-Port (21324 ist der Standard)
$WledPort = 21324
# Socket anlegen
$client = new-object net.sockets.udpclient(0)
# die ersten 10 LEDs (Index 0 bis 9) in einem Rotton
$data = [byte[]]( [byte[]](1,5) + [byte[]] (0..9 | foreach {[byte[]]($_,200,30,30)}) )
[void] $client.send($data, $data.length, $WledIP, $WledPort)
sleep -seconds 1
# die nächsten 10 LEDs (Index 10 bis 19) in einer Art Grün
$data = [byte[]]( [byte[]](1,5) + [byte[]] (10..19 | foreach {[byte[]]($_,30,200,30)}) )
[void] $client.send($data, $data.length, $WledIP, $WledPort)
sleep -seconds 1
# weitere 10 LEDs (Index 20 bis 29) in Blau
$data = [byte[]]( [byte[]](1,5) + [byte[]] (20..29 | foreach {[byte[]]($_,30,30,200)}) )
[void] $client.send($data, $data.length, $WledIP, $WledPort)
Fünf Sekunden nach dem letzten Paket kehrt der Controller zu seinem normalen Programm zurück.
Getestet habe ich das Skript unter Windows mit PowerShell 5 und PowerShell 7.
Ausführen
Wer noch nie ein PowerShell-Skript gestartet hat, hat zwei Möglichkeiten.
Einfügen: PowerShell öffnen (Startmenü, „PowerShell“ eintippen), den Code kopieren und mit einem Rechtsklick ins Fenster einfügen. Die Zeilen laufen sofort durch. Das ist der schnellste Weg zum Ausprobieren.
Als Datei: Den Code in einer Textdatei mit der Endung .ps1 speichern, zum Beispiel wled.ps1. Windows PowerShell 5 verweigert das Ausführen von Skriptdateien standardmäßig. Für einen einzelnen Aufruf lässt sich das umgehen, ohne die Einstellung dauerhaft zu ändern:
powershell -ExecutionPolicy Bypass -File .\wled.ps1
Mit PowerShell 7 heißt der Befehl pwsh statt powershell:
pwsh -File .\wled.ps1
Viel Spaß damit!
Den Beitrag gibt es ursprünglich als Gist auf GitHub. Mehr zu WLED: ein leuchtender Mond mit WLED und WLED im IKEA-Malm-Bett.