Beiträge von mabam

    So, falls irgendwer mal ein ähnliches Problem hat, möchte ich meine letztendliche Konfiguration hier dokumentieren:


    Ich wollte mit sleepwatcher keinen externen Skript ausführen, obwohl das eigentlich so gedacht ist. Denn sonst muss ich neben dem Launch Agent unter /Library/LaunchAgents/org.mabam.wacom.sleepwatcher.plist noch irgendwo anders einen Skript unterbringen, der aber eigentlich zum Launch Agent gehört und ein recht einsames Dasein pflegen würde. Ich hab’ lieber übersichtlich alles in einem, damit ich auch Jahre später noch auf einen Blick sehen kann, was wozu gehört.


    Wenn ich im Launch Agent Variablen ins Argument hinter /usr/local/sbin/sleepwatcher schreibe, expandiert letzterer diese einmal und merkt sich den daraus resultierenden Wert für jegliche folgende Ausführung. Sollte ich in der Zwischenzeit das Intuos also in einen anderen USB-Port gesteckt haben, versagt sleepwatcher.


    Gelöst habe ich das, indem der Launch Agent beim Laden den benötigten Skript nach /tmp schreibt, wo sleepwatcher ihn dann ausführt. So werden die Variablen bei jedem Ausführen neu expandiert und ich kann das Intuos nach Lust und Laune umstöpseln. Beim Runterfahren wird der Skript vom System gelöscht und beim nächsten Hochfahren vom Launch Agent wieder erstellt (ein ewiger Kampf also … :)). Auf diese Weise ist alles Nötige einzig im Launch Agent enthalten.


    Das Problem, dass Dateien in /tmp nicht ausführbar gemacht werden können, wird umgangen, indem das Argument hinter /usr/local/sbin/sleepwatcher mit /bin/bash beginnt.


    Hier der Launch Agent:


    Ich habe inzwischen übrigens festgestellt, dass mein Dell 1704FPT-Monitor über ein per uhubctl schaltbares USB 2-Hub verfügt. Wenn ich das mit obiger Lösung verwende, wacht der Rechner jedoch sofort wieder auf, nachdem er im Sleep-Modus angelangt ist. Seltsam. Wenn ich das AmazonBasics-Hub (USB 3) verwende, funktioniert alles einwandfrei.

    So, nachdem ich das erste Hub beim Versuch, es mit einem PCI-Slotblech zu versehen verheizt habe (weil ich erst nach dem Durchbohren der Platine sah, dass es sich um eine Multilayer-Leiterplatte handelte und damit im Inneren wohl noch was Anderes als nur Masse erwischt habe :huh:), kam gestern das neue Hub und ist nun eingebaut:



    • Auf dem ersten Bild sieht man ganz unten einen Adapter USB 3-Pinheader –> 2 × USB A-Buchse, in den das Hub eingesteckt ist.
    • Auf dem zweiten Bild ist die Platine des USB-Hubs mit einen Slotblech verschraubt.
    • Auf dem dritten Bild sieht man das Ganze dann von außen.
      Das Slotblech hatte ich noch rumliegen. Es hat nur zwei Öffnungen, aber ich habe sonst genügend USB-Anschlüsse und zwei schaltbare reichen mir. (Zusätzliche Löcher im Slotblech wären mit meinem Werkzeug wohl relativ hässlich geworden, also hab ich’s lieber gelassen.)

    Vor dem Sleep Power ausschalten geht über:

    Code
    1. uhubctl=$(uhubctl); uhubctl -a off -el $(echo "$uhubctl" | grep 'USB 2' | cut -d ' ' -f 5) -p $(echo "$uhubctl" | grep Wacom | cut -d ' ' -f 4)

    So funktioniert es auch noch, sollte ich das Tablet mal am anderen Anschluss einstecken.


    Power per Befehl wieder einschalten ist nicht nötig, da macOS das nach dem Sleep automatisch macht.

    Screen Wakener ist im Prinzip auch nur ein Workaround. Ich habe nur einen Sicherheitsmechanismus eingebaut, der vielleicht etwas weiter geht als ein Workaround. Das führt schlimmstenfalls aber schlicht dazu, dass die automatische Konfiguration von Screen Wakener nicht funktioniert, um den Monitor nicht mit Einstellungen zu versehen, die nicht zu ihm passen.


    Wenn ich mir das Ganze aber recht anschaue, übernimmt der im Bundle inbegriffene displayplacer eigentlich den Sicherheitscheck (ich hatte zuerst vor, ein anderes Tool mitzuliefern, bevor ich displayplacer fand). Ich werde den Mechanismus also wohl in einer neuen Version rausschmeißen.


    Aber das gehört eigentlich in den anderen Thread.

    Ich habe mir jetzt doch das AmazonBasics USB Hub gekauft. Es wird von uhubctl einwandfrei erkannt (als zwei Hubs, eins mit USB 2 und eins mit USB 3, wie in der Beschreibung zu uhubctl erwähnt):

    Das Wacom Tablet an Port 1 wird erkannt und ich kann es per uhubctl -a off -p 1 aus- bzw. per uhubctl -a on -p 1 wieder einschalten.


    In der IO Registry sieht das Hub so aus:


    Das Netzteil des Hubs habe ich nicht angeschlossen, die Stromversorgung reicht wie erhofft auch so für das Wacom Tablet.


    Jetzt muss ich das Ganze noch über SleepWatcher konfigurieren, sodass das Tablet automatisch vor dem Sleep aus- und nach dem Wake eingeschaltet wird.


    Außerdem möchte ich das Gehäuse des Amazon-Hubs entfernen und die Anschlüsse mit dem restlichen Innenleben an einem PCI-Slotblech befestigen, damit ich es im Rechner anschließen und die vier Ports praktisch wie interne USB-Anschlüsse nutzen kann.



    EDIT:

    Nach dem Wake per uhubctl -a on -p 1 wieder einschalten ist nicht nötig, da macOS beim Aufwachen wohl automatisch alle Ports mit Strom versieht. Port 1 des 3.0-Hubs ist dann aber „disabled“. Vielleicht, weil das Wacom sich nur über USB 2.0 verbindet (?)

    Ich kann es vor dem Sleep aber mit uhubctl -a off -el 20-6 -p 1 ausschalten, dann wird nur Power für USB 2.0 und nicht für USB 3.0 ausgeschaltet.

    Solange du Auto-Login aktiviert hast, kannst du zum Testen mit SleepWatcher meinen Skript in /Applications/Screen\ Wakener.app/Contents/Resources/org.mabam.ScreenWakener.sh verwenden.


    Wenn es so läuft, wie es soll, ist es aber „sauberer“, ein paar Sachen aus dem Skript rauszuschmeißen. Allerdings verweist der Skript auch auf

    /Applications/Screen\ Wakener.app/Contents/Resources/ScreenWakenerLogSwitch,

    /Applications/Screen\ Wakener.app/Contents/Resources/ScreenWakenerPrefs und

    /Applications/Screen\ Wakener.app/Contents/Resources/displayplacer.


    Die Befehle zum Loggen kannst du dann rausschmeißen, wodurch die erste Zeile überflüssig wird. Wenn du die Preferences fest in den Skript einbaust, ist die zweite Zeile auch überflüssig. Ohne displayplacer in der dritten Zeile geht aber gar nichts. Den könntest du aber auch nach /usr/local/bin kopieren und root:wheel als Owner setzen, damit auch die dritte Zeile unnötig wird und du ScreenWakener.app komplett löschen kannst.


    Wenn dein Test mit SleepWatcher erfolgreich ist und du brauchst Hilfe, um den Skript für dauerhaften Betrieb „sauber“ einzustellen, dann gib bescheid.



    Danke für die Ausgabe des Skripts. Wenn ich diese Änderung einbaue, sollte auch die automatische Konfiguration von Screen Wakener auf deinem Rechner laufen. Ich habe aber von jemand anderem die Rückkopplung, dass dieser Teil-Skript auf seinem Rechner nicht läuft. Das muss ich mir also nochmal anschauen.


    Um Screen Wakener auch zum Aktivieren nach Sleep verwenden zu können, könnte ich SleepWatcher darin einbauen und in einem der Dialoge eine entsprechende Option anbieten. Weiß noch nicht, ob ich das mache. Erstmal möchte ich schauen, dass er auf allen Macs/Hacks lauffähig ist.

    Naja, wenn ein Dirty Hack funktioniert, darf es von mir aus auch ein Dirty Hack sein. Nur fliegt die Tastatur dann auch raus und kann ich den Rechner damit nicht mehr aufwecken, was ich eher doof fände.


    Ich glaube, es liegt wirklich am Wacom. Andere berichten vom selben Problem, auch unter Windows.


    EDIT:

    Es liegt definitiv am Wacom. Wenn es nach dem Wake aus bleibt (also das Lämpchen am Wacom nicht leuchtet), funktioniert es zwar nicht, aber es hat Strom und wird im System erkannt:

    Code
    1. $ uhubctl
    2. Current status for hub 20-4 [2109:2811 VIA Labs, Inc. USB2.0 Hub, USB 2.10, 4 ports]
    3. Port 1: 0103 power enable connect [056a:0374 Wacom Co.,Ltd. Intuos S 8BH00R2024087]
    4. Port 2: 0100 power
    5. Port 3: 0100 power
    6. Port 4: 0100 power



    Ein Gedanke:

    Wenn ich eine zusätzliche USB-Karte einbaue, die nur mit einem separaten Treiber funktioniert, dann müsste ich diesen doch per Skript unloaden und loaden können und damit das Problem beheben, oder?

    Nur welche Karte funktioniert nur mit separatem Treiber? Hat da wer einen Tipp?



    EDIT:

    Mal von hinten nach vorne aufgerollt:

    • Laut Systeminformationen benötigt das Tablet 500 mA.
    • Ohne eingesteckten Netzadapter ist das genau das Maximum, das das „AmazonBasics USB Hub 3.0 mit 4 Ports“ liefern kann.
    • Laut https://github.com/mvp/uhubctl ist das „AmazonBasics USB Hub 3.0 mit 4 Ports“ eines der wenigen USB-Hubs, bei dem sich USB Power sogar je Port softwaremäßig ein- und ausschalten lässt.
    • uhubctl kann mithilfe von Homebrew oder MacPorts auf macOS installiert werden und dient als Command Line Tool, um den Strom der USB-Ports ein- und auszuschalten.

    Ich glaube, ich habe einen bezahlbaren Workaround für mein Problem gefunden.


    EDIT 2:

    Laut https://github.com/mvp/uhubctl#usb-30-duality-note muss man mit uhubctl und USB 3.0 aufpassen. Das Tablet braucht sowieso nur USB 2.0, also nehme ich vielleicht doch besser das Belkin F5U701-BLK mit USB 2.0.

    Es gibt Tools, die alle USB Ports vor dem Sleep auswerfen. Wenn die Ports danach korrekt renitialisiert werden sollte ja alles passen.

    Danke für den Tipp. Nachdem ich mich inzwischen dusselig gesucht und nur Tools gefunden habe, die vor dem Sleep Laufwerke auswerfen, die Frage zurück an dich: Weißt du ein Tool, das auch andere Geräte als nur Laufwerke auswirft?

    Das Teil-Script läuft. Die Ausgabe lautet:

    {"1: Hersteller-ID: 1234 • Produkt-ID: 5678 • (AppleIntelFramebuffer@0)"}


    Ich nutze nur die RX 570 – die iGPU ist deaktiviert. Dort über DisplayPort hängt mein Monitor dran. Die EDID ist gepatched.

    herrfelix :

    Ich probiere jetzt doch, Screen Wakener auch für eGPUs und nicht nur iGPUs zum Laufen zu bringen. Ist nämlich glaube ich einfacher, als ich zuerst dachte.

    Wärst du bereit, den angehängten Teil-Skript mal bei dir laufen zu lassen und das Ergebnis hier zu posten? Das würde mir sehr helfen.

    Alles was der Skript tut ist, sich Infos zum Software Connector aus der IO Registry zu ziehen.


    @alle:

    Dieser Skript sollte eigentlich auf jedem Mac/Hack laufen. Wenn ihn noch andere hier im Forum testen möchten – gerne auch auf Rechnern mit mehreren Monitoren die am besten noch an sowohl iGPU als eGPU angeschlossen sind – wäre das ebenso hilfreich für mich.

    Ich habe hier ein ZBOX das mir mit unterschiedlichsten Konfigurationen den DUAL-Screen verweigert. Solltest du dich mal mittels TV austoben wollen, dann schreib mir bitte :)

    Da muss ich leider passen, weil ich mich da nicht auskenne – tut mir leid.


    Für Screen Wakener habe ich auch nur 1+1 zusammengezählt:

    Nachdem die iGPU mithilfe des eingangs erwähnten „General Framebuffer Patching Guide“ dann richtig lief, habe ich festgestellt, dass der manchmal schwarze Bildschirm sich aktivieren lässt, indem ich seine Konfiguration in den Systemeinstellungen ändere.


    Auf meiner Suche nach einem Tool, das sich per Shell steuern lässt und somit über einen Skript automatisieren (statt immer manuell in die Systemeinstellungen gehen zu müssen), fand ich displayplacer. Um den herum habe ich dann den AppleScript, Shell Skript und Launch Agent gebaut, um die nötigen Informationen zum Bildschirm aus dem System zu ziehen und displayplacer mit dem entsprechenden Befehl zu füttern. Das ist im Prinzip alles.


    Tiefergehende Kenntnisse zur Materie habe ich auch nicht, nur ein paar Erfahrungswerte, die sich auf das beziehen, was Screen Wakener tut.

    Nein, es hat sich leider nichts geändert: Nach längerem Sleep ist das Wacom aus und ich muss dessen USB-Stecker aus- und einstöpseln, damit es wieder funktioniert.


    Kann ich den zugehörigen USB-Port (oder notfalls alle USB-Ports) irgendwie softwaremäßig neu starten? Denn das ließe sich über SleepWatcher automatisieren.

    Du scheinst Auto-Login eingestellt zu haben. Das sieht soweit schonmal gut aus. D. h., der Monitor blieb jetzt nach dem Neustart nicht schwarz? Oder hast du das nur manchmal?


    Bleibt er bei dir auch nach dem Sleep schwarz? Das hatte ich selbst nie. Dann muss im Launch Agent was geändert werden. Schaue ich mir später an.



    EDIT (jetzt etwas ausführlicher):

    Nicht am Launch Agent muss dann was geändert werden, sondern das ließe sich über SleepWatcher bewerkstelligen.


    Der Eintrag im Log sagt übrigens nicht unbedingt aus, dass die Aktivierung auch funktioniert hat, sondern bedeutet normalerweise einfach, dass Screen Wakener den entsprechenden Befehl ausgelöst hat. Auf meinem Rechner hat das dann auch zur Folge, dass der Bildschirm aktiviert wurde. Auf anderen Rechnern eigentlich auch, aber das kann ich nicht mit Bestimmtheit sagen. Wenn dein Monitor nicht immer schwarz bleibt, sondern nur manchmal, kannst du es nur herausfinden, indem du Screen Wakener eine zeitlang verwendest. So habe ich das auch gemacht.


    Liege ich richtig in der oben geäußerten Annahme, dass du Auto-Login aktiviert hast? Das würde sich dann nämlich mit den an meinem Rechner gemachten Beobachtungen decken (sonst wäre im Log eine Kleinigkeit anders).


    Sorry für die Fragen, aber der eine Rechner ist nicht der andere und ich brauche zuerst bestimmte Erfahrungswerte mit dem Tool auf anderen Systemen, bevor ich manche Aussagen mit größerer Bestimmtheit treffen kann.


    Wenn du möchtest, können wir SleepWatcher gerne angehen. Der Skript, den SleepWatcher dann auslösen muss, wird entweder sehr ähnlich oder sogar derselbe sein wie der, den der jetzige Launch Agent auslöst (SleepWatcher hat für einen Skript mit anderer Funktion bei mir gut funktioniert, sollte also auch hierfür kein Problem sein). Bevor wir das angehen, würde ich allerdings zuerst sichergehen wollen, dass der manuell konfigurierte Screen Wakener bei dir sauber läuft. Daher die Fragen.



    EDIT 2:

    Vielleicht noch eine Anmerkung zur Verdeutlichung: „Login Screen“ ist offiziell nur der Anmeldebildschirm nach dem Booten des Rechners. Auch, wenn man einen gleichen oder ähnlichen auch nach dem Aufwachen aus Sleep bekommt (sofern man den in den Einstellungen nicht abgeschaltet hat), nennt Apple ihn offiziell nicht Login Screen. Für die Definition, wann ein Launch Agent auslösen soll, macht das einen entscheidenden Unterschied. Meines Wissens kann man einen Launch Agent nicht so einstellen, dass er nach dem Aufwachen aus Sleep auslöst. Darum habe ich SleepWatcher ins Spiel gebracht.

    Nachdem du außer deinem „schwarzen Monitor“ offensichtlich keinen anderen angeschlossen hast, ist in obiger Ausgabe auch nur einer zu finden. Das erleichtert die Auswahl :-)


    Wir brauchen die Contextual screen id, also „459095581“.


    Der aktuelle Modus ist „1“. Ich nehme an, dass das der Modus ist, auf den der Bildschirm auch nach dem Aktivieren wieder eingestellt werden soll?


    Dann nehmen wir als temporären Modus (denn wenn wir ihn nicht ändern, bleibt der Monitor schwarz) am besten „3“, würde ich vorschlagen. Denn zum Aktivieren muss die Auflösung und/oder Bildwiederholrate geändert werden. Über nur die Farbtiefe geht das nicht. Und über die Bildwiederholrate ist es unauffälliger :-)


    Wechsle in Terminal bitte nach …:

    cd /Applications/Screen\ Wakener.app/Contents/Resources/

    … und erstelle die Einstellungs-Datei:

    echo -e "DisplayID=459095581\ncurrentMode=1\ntempMode=3" > ./ScreenWakenerPrefs


    Und dann muss der Launch Agent in den entsprechenden Ordner kopiert werden …:

    sudo cp ./org.mabam.ScreenWakener.plist /Library/LaunchAgents/

    … und root als Eigentümer bekommen:

    sudo chown root:wheel /Library/LaunchAgents/org.mabam.ScreenWakener.plist


    Wenn es zwischen iGPU und eGPU nicht noch irgendwelche entscheidenden Unterschiede gibt, sollte der Bildschirm nach einem Neustart eigentlich aktiviert werden. Also im Login Window oder, wenn du Auto-Login eingestellt hast, nach dem automatischen Einloggen.


    Bin gespannt!


    Poste nach dem Neustart doch mal das Log:

    cat /Applications/Screen\ Wakener.app/Contents/Resources/ScreenWakenerLog.txt

    Okay, das bestätigt, dass es mit einer eGPU nicht geht. Der AppleScript lässt sich natürlich entsprechend ändern, aber das müsste dann wer auf einem Hack mit eGPU (und idealerweise auch aktivierter iGPU) machen.


    Wenn du den Launch Agent manuell mit dem Shell Script betreiben willst, helfe ich dir gerne. Sollte eigentlich eine Kleinigkeit sein. Screen Wakener muss aber an Ort und Stelle bleiben, da sich sowohl der Shell Script als auch die zugehörigen Einstellungen in „Screen Wakener.app“ befinden und der Launch Agent diese Dateien genau da erwartet.


    Also wenn du das möchtest, dann gib in Terminal das Folgende ein und poste hier die Ausgabe:

    /Applications/Screen\ Wakener.app/Contents/Resources/displayplacer list

    Meine erste Vermutung war, dass ein Fehler in der Logik ist, wenn keine EDID-Override-Datei existiert (oder sich darin kein Monitor-Name befindet). Aber wenn ich die bei mir lösche, läuft Screen Wakener trotzdem ohne Probleme.


    Ich habe den entsprechenden Teil aus dem Script rauskopiert und ein paar Variablen darin durch statische Werte ersetzt, damit er für sich lauffähig ist. Siehe anbei.


    Kannst du ihn mal bei dir laufen lassen und mir das Ergebnis mitteilen?



    EDIT:

    Moment: Laut deinem Profil hast du eine RX 570 Nitro+ 4GB. Nutzt du auch die iGPU? Und betreibst du den schwarzen Bildschirm an der Karte oder der iGPU?


    Ich habe nur eine iGPU und kann den Script daher nicht auf die Systeminformationen einer eGPU bzgl. der Software Connector abstimmen. Wenn dein Bildschirm an der eGPU hängt, würde das die Fehlermeldung erklären. In dem Fall bleibt mir nur, den Infos zu Screen Wakener hinzuzufügen, dass es nur für eine iGPU geeignet ist.


    Den Launch Agent und Shell Script zur automatischen Aktivierung deines Monitors müsstest du aber vermutlich trotzdem nutzen können. Nur musst du ihn halt einmalig manuell konfigurieren. Das sollte aber nicht schwierig sein.

    Danke für den Tipp, ich habe das SSDT-Add-on jetzt installiert.


    Wenn ich nach USBX suche, bekomme ich auch nichts anderes als das, was ich am 11. Mai gepostet habe.


    Aber ein Gerät „EC“ gibt es jetzt:

    Code
    1. +-o EC <class IOACPIPlatformDevice, id 0x1000001f8, registered, matched, active, busy 0 (12 ms), retain 9>
    2. | {
    3. | "name" = <"EC000000">
    4. | "_STA" = 18446744073709551615
    5. | }
    6. |
    7. +-o AppleBusPowerController <class AppleBusPowerController, id 0x100000292, registered, matched, active, busy 0 (0 ms), retain 6>


    Das heißt, ich lasse den Rechner jetzt nochmal länger in Sleep und schaue, ob das Tablet danach ohne Nachhelfen funktioniert?

    „Screen Wakener“ ist ein Workaround für Bildschirme, die (manchmal oder immer) nach dem Booten schwarz bleiben. Aber nur, wenn der Bildschirm in „Systemeinstellungen“ ▸ „Monitore“ erkannt wird (und z. B. aktiviert werden kann, indem man dort die Auflösung o. Ä. ändert – kann man natürlich nur über einen zweiten, funktionierenden Bildschirm überprüfen).


    Wenn das bei dir nicht der Fall ist, empfehle ich den „General Framebuffer Patching Guide (HDMI Black Screen Problem)“ (darf ich hier leider nicht verlinken, also googeln). Die Anleitung dort ist sehr klar geschrieben, wie ich finde, und half mir nach langer Suche, das Problem mit meinem schwarzen Monitor zum lösen (bevor er in den Systemeinstellungen sichtbar war).


    „Screen Wakener“ aktiviert den schwarzen Bildschirm vor dem Einloggen (oder danach, falls in den Systemeinstellungen „automatische Anmeldung“ aktiviert ist).


    Momentan funktioniert „Screen Wakener“ nur mit einer iGPU und für nur einen „Schwarzen Monitor“ gleichzeitig. Wenn deiner an eine eGPU angeschlossen ist und/oder du mehr als einen „Schwarzen Monitor“ hast, müssen Shell Script und Einstellungen manuell editiert werden.


    Mehr Infos und Download unter https://github.com/mabam/ScreenWakener bzw.

    https://github.com/mabam/ScreenWakener/releases.


    Ich empfehle, vor der Nutzung von „Screen Wakener“ die EDID zu patchen. Dazu gibt es verschiedene Anleitungen und Skripte. Einfach nach „EDID patch“ oder „EDID override“ googeln.


    Wenn deine Systemsprache deutsch ist, ist „Screen Wakener“ das auch. Ansonsten englisch.