Die Problemstellung
In meinem PC steckt eine ASUS ROG Ryuo III, eine AIO-Wasserkühlung, bei der auf der Pumpe eine kleine LED-Matrix sitzt.
Dieses Mini-LED-Array besteht aus 255 einzelnen LEDs, rundlich angeordnet. Ein hübsches Ding, und ich mag das Retro-Flair, wenn Dinge darauf projiziert werden. Unter Windows lässt sich die Matrix mit der Herstellersoftware von Asus bespielen. Statische Bilder, Animationen oder auch Systeminformationen wie die CPU-Temperatur.
Nun bin ich aber seit geraumer Zeit unter Linux unterwegs.
Das Ergebnis: Das Display bleibt schwarz oder zeigt an, was zuletzt unter Windows eingestellt wurde.

Die ersten Versuche, das mit bekannten Tools zu ändern, waren nicht erfolgreich.
liquidctl kennt das Gerät nicht, OpenRGB auch nicht. Das zugehörige Issue hängt dort seit Juni 2024 fest. Also dachte ich mir: Dann probiere ich es eben selbst. Mein PC, Hostname „PurpleThunder“, erstrahlt in leuchtenden Lila-, Pink- und Blautönen. Dann sollte das Display auch mitspielen dürfen.
Die Abkürzung
Ich wollte nicht unter Windows den USB-Verkehr mitschneiden. Zum Glück hatte jemand anderes schon vorgearbeitet: Im öffentlichen Plugin-Repository von SignalRGB lag ein Plugin, das den Ryuo III ansteuert. SignalRGB selbst ist keine Open-Source-Software, die Plugins dafür liegen aber offen im Netz. Dort hat jemand versucht, die Pumpe über ein Plugin zum Laufen zu bringen.
Inzwischen unterstützt SignalRGB den Ryuo III offiziell. Das erklärt wohl auch, warum das Plugin nicht mehr weiterentwickelt wurde. Für mich war es trotzdem Gold wert, diese Fragmente noch im Netz zu finden. Ohne sie hätte ich das Protokoll mühsam selbst herausfinden müssen.
Einen Haken gab es auch: Das Plugin steckt nur im Branch Development. Der Branch master ist seit 2023 eingefroren und kennt das Gerät nicht. Wer nur dort sucht, findet nichts und denkt, es gäbe keine Vorlage.
Wie die Matrix spricht
Das Protokoll ist überraschend übersichtlich. Pro Bild gibt es zwei kurze Kommandos an die Pumpe, danach folgt ein Block mit 768 Byte, der die Farben enthält. Die Farbkanäle liegen dabei nicht Pixel für Pixel nebeneinander, sondern getrennt: erst alle Rotwerte, dann alle Grünwerte, dann alle Blauwerte, in Häppchen zu je 16 LEDs. Frei nachgebaut nach dem SignalRGB-Plugin sieht das so aus:
for idx, (r, g, b) in enumerate(colors):
base = (idx // 16) * 48
pos = idx % 16
frame[base + pos] = r
frame[base + 16 + pos] = g
frame[base + 32 + pos] = b
Dabei ist mir noch etwas aufgefallen: Im Plugin überspringt die Namensliste „LED 233“ und zählt trotzdem bis 256. Die echte Positionsliste hat aber nur 255 Einträge. Es gibt also eine LED weniger, als die Beschriftung behauptet. Bei einer Vollfarbe merkt man das nicht, bei einem Bild schon.
Damit mein normaler Benutzer ohne root auf das Gerät zugreifen darf, brauchte es noch eine udev-Regel. Die habe ich nach dem Muster von OpenRGB gebaut, mehr braucht es dafür nicht.
Der App-Prototyp
Der erste Test war ein kleines Skript, das die ganze Matrix rot färbt. Es hat funktioniert, und die Pumpe leuchtete rot. Das war der Moment, in dem ich wusste, dass das Protokoll stimmt.
Daraus ist dann eine kleine Vibecoded-App geworden. Sie kann:
- Bilder und animierte GIFs anzeigen, mit einer Vorschau in der echten Anordnung der LEDs
- einzelne LEDs per Mausklick malen, live auf der Pumpe
- die Matrix wieder ausschalten (das klingt banal, ist aber wichtig)
Dazu habe ich eine Binary für Linux gebaut, sodass sie auch ohne Python läuft.
Die App ist noch ein Prototyp, die Positionstabelle stimmt noch nicht, aber die grundlegende Kommunikation mit dem Display funktioniert.

Das große Rätsel
Dann kam der Dämpfer. Als ich im Malen-Tab ein Quadrat gezeichnet habe, erschien auf der Pumpe eine verschmierte Linie. Ein Regenbogen, der in einer Zeile laufen sollte, verteilte sich senkrecht. Und bei einem Test mit fünf Punkten (oben, unten, links, rechts, Mitte) landeten die linken und rechten Punkte beide nahe der Mitte.
Die Erkenntnis: Die Koordinaten aus dem Plugin waren offenbar nur eine grobe Näherung für den eigenen Zweck und keine echte Adresstabelle der LEDs. Oder es wird ein anderes System genutzt, nicht einfach von links nach rechts und Zeile für Zeile. Vielleicht ein radiales Modell? Das bedeutet: Derzeit reicht es für Farbverläufe und Effekte, für Bilder, Text oder Gesichter leider gar nicht.
Der Kalibrierungsversuch
Wenn die Tabelle nicht stimmt, messe ich eben selbst. Und weil ich weder Lust hatte, 255 LEDs von Hand zu vermessen, noch Bildverarbeitung aus dem Handgelenk schüttle, habe ich die KI gefragt, wie man so etwas angeht. Der Plan, den wir zusammen entwickelt haben: Ich schalte immer 17 LEDs in jeweils eigener Regenbogenfarbe ein, fotografiere die Pumpe, und ein Skript sucht die Leuchtpunkte im Foto und ordnet sie den LEDs zu. Das Ganze 15 Mal, bis alle 255 LEDs einmal dran waren. Die Skripte hat die KI geschrieben, die Fotos habe ich gemacht.
Das hat sogar halb funktioniert, alle Indizes wurden zugeordnet. Zusammengesetzt war das Ergebnis aber Rauschen. Der Grund war ziemlich banal, und er geht eher auf mein Konto als auf das der KI: Ich habe die Kamera frei in der Hand gehalten.
In a nutshell
- Das Protokoll ist verstanden und läuft.
- Die App läuft, Effekte und Farbverläufe sehen gut aus.
- Bilder und Text gehen noch nicht, weil mir die echte Positionstabelle fehlt.
Der nächste Versuch kommt entweder mit einem Stativ, dunklem Raum und ausgeschalteter Gehäusebeleuchtung. Dann sollten alle 15 Fotos denselben Bildausschnitt haben, und die Rechnerei wird einfacher. Oder ich nutze vielleicht eine Live-Webcam und gebe der KI für das Herausfinden des Musters damit quasi ein Auge in der echten Welt.
Zum Mitnehmen
- Was habe ich gelernt? Wenn du Hardware unter Linux zum Laufen bringen willst, schau auch in Plugins und Treiber anderer Projekte, selbst wenn die eigentliche Software dahinter nicht quelloffen ist. Und schau in den Entwicklungs-Branch, nicht nur in
master. - Alte Fragmente im Netz sind mehr wert, als man denkt. Wer so etwas veröffentlicht, ahnt oft nicht, wem er damit später hilft.
Quellen
- SignalRGB, Plugin für den Ryuo (Branch
Development):Plugins/Asus/ASUS_Ryuo_AIO_Controller.js, Commit „Ryuo 3 support“ vom 28.08.2025, übernommen am 03.09.2025. Die Vorlage für Protokoll und Positionsliste. - SignalRGB, Plugin-Repository: gitlab.com/signalrgb/signal-plugins. Der Branch
masterkennt das Gerät nicht und ist seit 2023 eingefroren. - OpenRGB, Issue #3851: Asus ROG Ryuo III 360 ARGB White Edition, offen seit Juni 2024.
- liquidctl: github.com/liquidctl/liquidctl. Unterstützt den Ryuo III nach meinen Erkenntnissen nicht.
- OpenRGB, udev-Regeln: Die Regel für den Zugriff ohne root habe ich nach dem Muster der Datei
60-openrgb.rulesgebaut. - SignalRGB, offizielle Unterstützung des Ryuo III – Version 2.5.13-Beta 9/4/2025: https://signalrgb.developerhub.io/changelogs
