Homekit: Stereoanlage anschalten, wenn Apple Music läuft

jazzesnee

Mitglied
Thread Starter
Dabei seit
22.08.2003
Beiträge
55
Reaktionspunkte
4
Ich habe meine alte Stereoanlage ein wenig „smart“ gemacht, indem ich sie an eine Homekit-fähige Steckdose gehängt habe. Nun würde ich diese gerne automatisch einschalten lassen, sobald auf meinem MacBook mit macOS Monterey die Apple Music-App gestartet wird. Sobald der Prozess nicht mehr läuft, soll die Anlage wieder ausgeschaltet werden. Hat jemand eine Idee, wie man das am besten bewerkstelligt? „Kurzbefehle“ kann zwar Homekit-Geräte steuern, scheint aber keine Möglichkeit zu haben, den Programmstatus zur Bedingung dafür zu machen.

Solltet hier jemand eine Idee haben: Besten Dank im Voraus! :)
 
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. :)
 
  • Gefällt mir
Reaktionen: Johanna K, rembremerdinger und Lor-Olli
Welch komplizierte Lösung für ein einfaches Problem, das eigentlich gar keines ist. Ich würde einfach die Anlage einschalten, wenn ich sie brauche. :LOL:
 
  • Gefällt mir
  • Traurig
Reaktionen: Tommac187, rembremerdinger, pk2061 und 2 andere
Welch komplizierte Lösung für ein einfaches Problem, das eigentlich gar keines ist. Ich würde einfach die Anlage einschalten, wenn ich sie brauche. :LOL:
Das käme mir aber nicht „smart“ vor. :-D
 
  • Gefällt mir
Reaktionen: rembremerdinger
Selbst wenn jemand eine andere Lösung bevorzugt, gehört jazzesnee Dank für die Anleitung, die zeigt zum einen was MÖGLICH ist, zum anderen wie man konkret vorgeht. Für meine Anlage brauche ich das nicht, aber ich habe da auch schon ein Projekt im Sinn… ;)
 
  • Gefällt mir
Reaktionen: jazzesnee und rembremerdinger
Selbst wenn jemand eine andere Lösung bevorzugt, gehört jazzesnee Dank für die Anleitung, die zeigt zum einen was MÖGLICH ist, zum anderen wie man konkret vorgeht. Für meine Anlage brauche ich das nicht, aber ich habe da auch schon ein Projekt im Sinn… ;)
Das war genau der Grund, warum ich das gestern gepostet habe. Mir hat’s Spaß gemacht, das für mich rauszufinden und umzusetzen, und möglicherweise profitiert ja jemand anderes davon – wenn auch nicht mit Music und Stereoanlage, dann vielleicht in einer anderen Konstellation. :)
 
Zurück
Oben Unten