Ich habe mittlerweile selbst eine Lösung gefunden: Da meine Steckdose via Homebridge läuft, kann ich sie mittels cURL-Befehlen ein- und ausschalten. Wie das genau geht, ist
hier beschrieben. Jetzt habe ich folgendes Script geschrieben und unter ~/Scripts/stereo.sh abgelegt:
Code:
#!/bin/bash
while true
do
ps_out=`ps -ef | grep "Music.app/Contents/MacOS/Music" | grep -v 'grep' | grep -v $0` # Prüft, ob Music.app läuft
result=$(echo $ps_out | grep "$1")
if [[ "$result" != "" ]];then # wenn ja, Steckdose einschalten
`curl -X PUT http://homebridge:port/characteristics --header "Content-Type:Application/json" --header "authorization: xxx-xx-xxx" --data "{\"characteristics\":[{\"aid\":8,\"iid\":11,\"value\":1}]}"`
else # wenn nein, Steckdose ausschalten
`curl -X PUT http://homebridge:port/characteristics --header "Content-Type:Application/json" --header "authorization: xxx-xx-xxx" --data "{\"characteristics\":[{\"aid\":8,\"iid\":11,\"value\":0}]}"`
fi
sleep 4 # nach vier Sekunden neuen Durchlauf starten
done
Wie man AID und IID für das jeweilige Gerät herausfindet, steht ebenfalls im oben verlinkten Beitrag beschrieben.
Durch eine neue Datei com.stereo.plist in ~/Library/LaunchAgents wird sichergestellt, dass das Script beim Start automatisch geladen wird:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:</string>
</dict>
<key>Label</key>
<string>com.stereo</string>
<key>Program</key>
<string>/Users/martin/Scripts/stereo.sh</string>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/startup.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/startup.stderr</string>
<key>UserName</key>
<string>martin</string>
<key>GroupName</key>
<string>martin</string>
<key>InitGroups</key>
<true/>
</dict>
</plist>
Damit läuft’s im Grunde schon: Sobald Music geladen wird, dauert’s maximal vier Sekunden, bis die Stereoanlage Strom bekommt. Umgekehrt schaltet sich die Stereoanlage automatisch aus, sobald Music geschlossen wurde.
Einziges Manko: Das Script läuft auch im Ruhezustand weiter. Das bedeutet, wenn Music geschlossen und das MacBook im Ruhezustand ist, schaltet es trotzdem konsequent die Stereoanlage aus, wenn sie anderweitig eingeschaltet wurde, etwa, weil ich über mein iPhone Musik darauf streamen möchte. Diese Problem habe ich via Sleepwatcher gelöst, das ich zunächst via Homebrew installiert habe:
Code:
brew install sleepwatcher
Dann ein zweites Script stereo_sleep.sh angelegt, das den laufenden stereo.sh abschießt:
Code:
#!/bin/bash
kill $(ps aux | grep '[/]bin/bash /Users/martin/Scripts/stereo.sh' | awk '{print $2}')
Sleepwatcher beauftragen wir nun damit, beim Aktivieren des Ruhezustands stereo_sleep.sh auszuführen und beim Aufwachen wieder stereo.sh zu starten. Dazu legen wir eine neue com.sleepwatcher.plist unter ~/Library/LaunchAgents an:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyLi>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.sleepwatcher</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sleepwatcher</string>
<string>-V</string>
<string>-s ~/Scripts/stereo_sleep.sh</string>
<string>-w ~/Scripts/stereo.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Nach einem Neustart läuft nun alles wie gewünscht: Zunächst wird regulär stereo.sh geladen. Wird das MacBook in den Ruhezustand geschaltet, schießt Sleepwatcher stereo.sh zunächst ab, um es dann beim Aufwachen wieder erneut zu laden.
Ich gebe zu, die Lösung ist ein wenig quick und dirty: Alle vier Sekunden prüft mein Macbook nun, ob die Music-App läuft oder nicht, und feuert nun alle vier Sekunden einen HTTP-Request an die Homebridge, die (vermutlich?) wiederum alle vier Sekunden ein Zigbee-Signal an die Steckdose auslöst. Der Ressourcenverbrauch dürfte aber minimal und daher vernachlässigbar sein. Wenn jemand Ideen zur Optimierung hat, immer gerne her damit.