OpenRGB nach Hibernate automatisch neu starten

Vor kurzer Zeit habe ich ja einen neuen PC gebaut. Der blinkt. Und wie. Um das Blinken zu kontrollieren gibt es unter Windows diverse Möglichkeiten. Entweder Hersteller Software wie RGB Fusion von Gigabyte, Mystic Light RGV von MSI, Corsair’s iCue oder - wie in meinem Fall - Asus Armoury Crate. Nun sind das alles nicht gerade leichtgewichtige Tools und auch nicht unbedingt interoperabel, weshalb es auch noch Kauf-Software wie SignalFX oder JackNet RGB sync gibt. Oder eben die OpenSource Lösung OpenRGB, auf die ich vor kurzem umgestellt habe. Ich habe davon berichtet .

Wie das aber so oft mit OpenSource Software ist funktioniert alles prima, aber manche Dinge sind eben ein wenig umständlich oder anders gelöst, als anderswo. So auch bei OpenRGB. Aber fangen wir vorne an.

Das Problem

Mein RAM leuchtet in den schönsten Farben. Zur Zeit hauptsächlich in Pink. Ob meine Töchter da mit Ihrem Farbgeschmack auf mich abgefärbt haben (no pun intended) weiß man nicht, in jedem Fall ist das zur Zeit die Beleuchtungsfarbe meiner Wahl.

Gehäuse mit Fenster und pinken LEDs
(Gehäuse mit Fenster und pinken LEDs)

Lieder merkt sich mein RAM aber bei einem Neustart nicht, dass es Pink war, sondern wechselt wieder auf die Werkseinstellung. Und das ist leider ein wilder Farbwechsel, der bei schwächeren Mägen sicher auch schon zu Übelkeit geführt hat. Das ist aber ein bekanntes “Problem” - ich glaube nur Corsair’s Vengeance (und wahrscheinlich auch) Dominator RGB Pro’s speichern sich ihr RGB Profil in Hardware.

Die Tools der Hersteller lösen das, indem Sie als Service laufen und bei jedem Start das Profil im Hintergrund laden - so endet wildes Blinken dann meist mit dem Windows Login Prompt. OpenRGB tut das aber leider nicht - oder glücklicherweise, denn wer möchte schon die ganze Zeit irgendwelche Dienste mit Systemrechten im Hintergrund laufen lassen. Die noch dazu nicht gerade klein sind (bis zu dem Punkt, dass Armoury Crate es schaffte, mein gesamtes System lahmzulegen).

Dementsprechend setzte sich das Blinken mit OpenRGB erst mal fort, bis man händisch eingriff.

Die Lösung

Für den normalen Systemstart bringt OpenRGB Bordmittel mit, die ganz wunderbar funktionieren. In den Einstellungen kann man OpenRGB so konfigurieren, dass es sich automatisch mit Windows startet und dabei das entsprechende Profil lädt (Pink, in meinem Fall). OpenRGB startet zwar erst nach dem Login, aber das ist kein großes Problem. Einfach so lange die Augen zu halten oder nicht zum Fenster im Gehäuse schauen.

OpenRGb Einstellungen
(OpenRGb Einstellungen)

Nach dem Aufwachen aus dem Hibernate klappt das aber leider nicht, denn OpenRGB wird ja nicht wirklich neu gestartet. Es läuft also einfach weiter, als wäre nichts gewesen. Die Hardware war aber komplett aus. Also blinken die RAM Riegel weiter vor sich hin und man muss OpenRGB öffnen, um das Profil zu laden. Schlimmer noch, man muss erst mal einen Re-scan der Hardware anwerfen, damit OpenRGB das Profil überhaupt wieder korrekt laden kann. Auch dieser Scan würde bei einem Neustart von OpenRGB automatisch passieren.

OpenRGb Profile
(OpenRGb Profile)

Das Problem, das es zu lösen galt, war also, wie man OpenRGB dazu bringt, das Profil automatisch neu zu laden, wenn der Rechner aus dem Hibernate kommt. Nach ein wenig darüber nachdenken (und Googlen, ja) liegt die Lösung auf der Hand. Der Weg zum Glück führt über den Windows Task Scheduler. Und wer hätte gedacht, dass ich so einen Satz jemals sage. Ich jedenfalls nicht.

Task Scheduler also. Das Prinzip ist einfach:

  1. Alten OpenRGB Prozess abschießen
  2. Neuen OpenRGB Prozess starten, der dann automatisch ein Profil laden kann

Diese beiden Schritte sind auch schnell umgesetzt. Für das abschießen von Prozessen gibt es taskkill (hier ist die Dokumenation), für das Starten von OpenRGB gibt es dessen Kommandozeile und zugehörige Dokumentation. Beides zusammen können wir in eine neue Task werfen. Kein Angst, Ihr müsst jetzt nichts aus Screenshots abtippen oder aus Listings kopieren. Am Ende des Artikels verlinke ich euch noch den exportieren Task und zeige, wie ihr sie importieren könnt.

Task Properties im Task Scheduler
(Task Properties im Task Scheduler)

Was hier jetzt einfach aussieht hat mich eine ganze Weile gekostet, denn mit einem einfach Starten der jeweiligen Tools ist es nicht getan. Bestenfalls führt das zu dem Aufflackern von Command Prompts. Im OpenRGB fall sogar dazu, dass die Task immer als “Running” angezeigt wird, denn OpenRGB “daemonized” nicht (wenn es so etwas unter Windows gibt). Um das zu Lösen, habe ich am Ende zur Powershell gegriffen. Again! Wer hätte das jemals gedacht, dass ich mit der Powershell irgendwas löse! Mit der Powershell ist es nämlich möglich, einen Prozess zu starten, ohne auf diesen zu warten, und noch dazu ohne ein neues Shell Fenster anzuzeigen - oder es zumindest zu verstecken. Fensterflackern adé.

Die Schritte in meiner Task sind demnach also die folgenden:

powershell -WindowStyle Hidden taskkill.exe /im OpenRGB.exe
powershell -WindowStyle Hidden -Command Start-Process -FilePath OpenRGB.exe -WorkingDirectory 'C:\Program Files\OpenRGB Windows 64-bit' -ArgumentList '--noautoconnect --startminimized --gui -p pink'

Was am Ende dann komplizierter aussieht, als es ist. Bleibt noch herauszufinden, wie diese Task denn ausgeführt werden kann, wenn der Rechner aus dem Hibernate kommt. Glücklicherweise gibt es ein System Event Kernel-Power mit der vielsagenden Event ID 107, zu welcher wir die Task ausführen können. Das scheint der Event zu sein, den Windows zu der Gelegenheit in seine Logs schreibt. Das lässt sich im Event Viewer von Windows relativ einfach herausfinden. Dazu werft ihr einfach mal einen Blick unter Windows Logs > System und schaut nach, welche Events da direkt nach dem Aufwachen aus dem Hibernate so auftauchen.

Event Viewer
(Event Viewer)

Das geht wohl auch aus dem Sleep über Event-ID 1 des Power-Troubleshooter, aber da ich nie Sleep benutze habe ich das nicht probiert. In jedem Falle müsst ihr dann nur noch das entsprechende event als Trigger im Task Scheduler eintragen, und fertig.

Trigger im Task Scheduler
(Trigger im Task Scheduler)

Zuletzt stellt ihr noch unter General die Security Options auf Run only when user is logged in. Ihr könnt OpenRGB auf im Hintergrund starten mittels Run whether user is logged in or not, das hat aber den Nachteil, dass ihr dann keinen Zugriff aufs GUI habt - oder ich hatte ihn zumindest nicht, weil OpenRGB dann nicht im Tray angezeigt wird. Eventuell könnte man da eine Lösung mit einem OpenRGB Server im Hintergrund und einem Client im Vordergrund bauen. Aber hey, soviel Langeweile und Zeit habe ich dann doch nicht.

Schnellstart

Damit Ihr das jetzt nicht alles von Hand machen müsst findet ihr hier eine xml Datei mit der vorkonfigurieren Task inklusive Trigger: ResetOpenRGB.xml . Diese könnt Ihr einfach im Task Scheduler importieren.

Task importieren
(Task importieren)

Ich hoffe das hilft dem ein oder anderen OpenRGB Nutzer. Ich bin jetzt jedenfalls richtig zufrieden mit der Lösung und werde weiter mit OpenRGB herumspielen. Vielleicht finden sich ja noch ein paar nützliche Plugins, mit denen man tolle Dinge machen kann.