Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Musik>Script: Name des genutzten AirPlay Devices

Script: Name des genutzten AirPlay Devices

Caliguvara
Caliguvara03.04.1917:15
Hallo zusammen,

Ich versuche, mittels Apple oder Shell Script, den Namen des genutzten AirPlay receivers zu bekommen.

Mit Apple Script komme ich auf folgendes Theater:
tell application "iTunes"
    set currentDevices to get name of AirPlay devices
    return currentDevices
end tell
Klappt zwar, gibt mir aber alle AirPlay Geräte, nicht nur das gerade verwendete.

tell application "iTunes"
    set currentDevices to get name of current AirPlay devices
    return currentDevices
end tell
Resultiert in: iTunes got an error: Can’t get name of current AirPlay devices." number -1728 from name of current AirPlay devices

tell application "iTunes"
    get current AirPlay devices
end tell
Gibt mir die AirPlay device id des angespielten Receivers was zwar süß, aber für mich nutzlos ist.

Hat da jemand nen Tipp? Danke!
~Caliguvara
„Don't Panic.“
0

Kommentare

rmayergfx
rmayergfx03.04.1917:23
Schau mal hier:

Frage dazu, was möchtest du denn damit umsetzen, vllt. gibt es ja schon eine Lösung dazu.
„Der Computer soll die Arbeit des Menschen erleichtern, nicht umgekehrt !“
+1
Caliguvara
Caliguvara03.04.1917:55
Ist ganz doof, für meine TouchBar via BetterTouchTool (hier der Link dazu). Ich bin dabei einen Button zu erstellen, der das aktuell angespielte AirPlay Gerät anzeigt - angetippt öffnet er eine weitere Gruppe, die alle verfügbare AirPlay Geräte anzeigt, und diese auf Befehl verwendet.
Die Gruppe steht. Nur halt der Name des aktuell genutzten Gerätes nicht.

In dem Code in Deinem ersten Link ist auch schon die entscheidende Zeile:
set listOfAirPlayNames to (get name of every AirPlay device whose selected is true)
Danke Dir! 🙂
„Don't Panic.“
0
Caliguvara
Caliguvara04.04.1914:29
Kurze weitere Frage: wie vergleiche ich zwei Variablen?

Was ich erreichen will
Wenn der AirPlay Receiver AirPods sind, dann möchte ich einen weiteren Teil des Scripts ausführen (nämlich auch noch deren Batteriestand abfragen und anzeigen).

Was ich bisher mache
tell application "iTunes"
    set AirPlayName to name of every AirPlay device whose selected is true
    if AirPlayName is equal to LclAirPodsName then
        return checkBattery()
    else
        return AirPlayName
    end if
end tell

[…]
LclAirPodsName ist dabei eine Variabel die ich vorher im Script definiert habe (aus den BetterTouchTool Files abgegriffen, sie enthält den Namen der AirPods - das funktioniert problemlos).

Was ich bekomme
Grundsätzlich nur den Namen des AirPlay Empfängers. Egal ob das das TV, die AirPort Express, oder meine AirPods sind.

Vergleiche ich die zwei Variablen falsch?
„Don't Panic.“
0
Zikade
Zikade04.04.1917:05
Die Zeile
set AirPlayName to name of every AirPlay device whose selected is true
geht auch einfacher mit
set AirPlayName to current AirPlay devices
Was auch immer du nutzt, beide geben eine Liste der Namen zurück, heißt hier müsstest du noch den richtigen Namen heraussuchen. So was in der Art:

repeat with aName in AirPlayName
    if aName = LclAirPodsName then
        return checkBattery()
    else
        return aName
    end if
end repeat
(auch da gibt es viele andere Wege nach Rom, aber das spare ich mir
0
Caliguvara
Caliguvara04.04.1918:16
set AirPlayName to current AirPlay devices
Geht, spuckt Dir aber die AirPort ID und nicht den Namen des Gerätes aus. Daher der Umweg 🙂

AirPlayName = LclAirPodsName läuft bei mir leider auch aufs gleiche hinaus ☹️
Auch wenn ich AirPlayName = "Name meiner AirPods" setze bekomme ich leider nicht das gewünschte Ergebnis.

Hier mal das ganze Script:

--set your AirPods name, needs to be modified
set YourAirPodsName to "ENTER_YOUR_AIRPODS_NAME_HERE"

--GET AIRPLAY RECEIVER'S NAME AND COMPARE IT TO THE AIRPODS' NAME
tell application "iTunes"
    set AirPlayName to name of every AirPlay device whose selected is true
    if AirPlayName = YourAirPodsName then
        return checkBattery()
    else
        return AirPlayName
    end if
end tell

on checkBattery()
    set OUTPUT1 to do shell script "
OUTPUT1='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentRight\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT1=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT1}\";
fi"
    
    set OUTPUT2 to do shell script "
OUTPUT2='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentLeft\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT2=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT2}\";
fi"
    
    return YourAirPodsName & "
" & "Ⓛ" & OUTPUT2 & "Ⓡ" & OUTPUT1
    
end checkBattery

--thanks to @yyuuiko for parts of the code!

Bin ich mit der AirPort Express "MusicWall" verbunden hätte ich als Ergebnis halt gerne
MusicWall
Und bin ich mit den AirPods "AirBeat" verbunden gerne
AirBeat
Ⓛ87% Ⓡ88%
(Den Ladezustand in der zweiten Zeile halt).
Momentan bekomme ich auch da stur
AirBeat
angezeigt ☹️
„Don't Panic.“
0
MikeMuc04.04.1918:59
Bevor ich anfange zu denken...
Du willst den Namen des Gerätes, welches dir im Menüsymbol für Ton unter Ausgabegerät (mit Häkchen) angezeigt wird?
0
MikeMuc04.04.1919:19
Wenn du mir per PM deine Mailadresse schickst, dann kriegst du dieses Script
---audiodevice output "HP Z30i"
--set destDevice to "Logitech USB Headset"
--audiodevice input "HP Z30i"

set sourceOutput to do shell script "/Applications/audiodevice output"
log sourceOutput

set sourceInput to do shell script "/Applications/audiodevice output"
log sourceInput

try
    --do shell script "/Applications/audiodevice output " & quoted form of destDevice
    --do shell script "/Applications/audiodevice input " & quoted form of destDevice
on error
    log " passendes device nicht gefunden"
end try

und eine ausführbare Datei die das von dir gewünschte aus dem System ausliest. Wo genau die herkommt, weiß ich nicht. Aber sie lebt schon sehr lange auf meinem Rechner und funktioniert zumindest mit 10.13.6 noch.
Für alle anderen kann ich nur diesen Link mit geben: http://whoshacks.blogspot.com/2009/01/change-audio-devices-v ia-shell-script.html
+1
Caliguvara
Caliguvara04.04.1919:30
Ganz genau 🙃

Ist ganz doof für die TouchBar.
Ich hab de ne Gruppe, die mir links meinen aktuellen iTunes Audioausgang anzeigt.

Tippe ich diese an bekomme ich alle meine verfügbaren Airplay Geräte angezeigt:

Tippe ich da zB Little White Box an spielt iTunes automatisch diesen AirPlay Empfänger an, und die vorherige Gruppe sieht so aus.

Wird mein Gehirn jetzt über die AirPods AirBeat mit mehr oder weniger melodischen Tönen berauscht oder gekrängt, dann sieht das bis her so aus:

Den Batteriestand der AirPods kann ich problemlos auslesen, mache ich schon an anderer Stelle. Jetzt finde ich es aber intelligenter alles am selben Fleck zu haben, und hätte das Ergebnis gerne so aussehend:

Und genau da hackts halt.

(Mehr übrigens wie oben schon verlinkt hier.)
„Don't Panic.“
0
Zikade
Zikade04.04.1920:59
Probiers mal so:
tell application "iTunes"
    set AirPlayNames to name of every AirPlay device whose selected is true
    repeat with AirPlayName in AirPlayNames
        if AirPlayName = YourAirPodsName then
            return checkBattery()
        end if
        set theName to AirPlayName
    end repeat
    return theName
end tell
0
Zikade
Zikade04.04.1921:16
Das blöde bei der Geschichte ist ja, dass du in jedem Fall eine Liste mit mindestens einem, oder eben auch mehrere Werte erhältst. Kann ja sein, dass mehrere AirPlay-Geräte spielen.
Wo und wie wird das Skript denn aufgerufen? Und was wird denn als Rückgabe erwartet?
0
Zikade
Zikade04.04.1921:34
OK, stehe wohl auf dem Schlauch...
wie wär's mit:
tell application "iTunes"
    set AirPlayName to name of every AirPlay device whose selected is true
    if AirPlayName contains YourAirPodsName then
        return checkBattery()
    else
        return AirPlayName
    end if
end tell
0
Caliguvara
Caliguvara04.04.1921:45
@Zikade:

Danke! Damit sind wir schon mal weiter, das Script erkennt korrekt ob die AirPods verbunden sind oder was anderes.

Allerdings bekomme ich jetzt die Fehlermeldung "iTunes got an error: Can’t continue checkBattery."
Aber warum verstehe ich nicht 🤔
„Don't Panic.“
0
Zikade
Zikade04.04.1921:46
Wer lesen kann ist klar im Vorteil. Mist, bin ich heute doof....
set returnValue to {}
tell application "iTunes"
    set AirPlayNames to name of every AirPlay device whose selected is true
    repeat with AirPlayName in AirPlayNames
        if AirPlayName contains YourAirPodsName then
            copy {(AirPlayName & (checkBattery() of me))} to the end of returnValue
        else
            copy {AirPlayName} to the end of returnValue
        end if
    end repeat
    return returnValue
end tell

on checkBattery()
    set OUTPUT1 to do shell script "\nOUTPUT1='';\nBLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);\nSYSTEM_PROFILER= $(system_profiler SPBluetoothDataType); \nMAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); \nCONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); \nBLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); \nBATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentRight\"); \n\nif [[ \"${CONNECTED}\" ]];\n then \n for I in \"${BATTERY_LEVELS[@]}\";\n  do \n  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";\n   [[ ! -z \"${!I}\" ]] && \n   OUTPUT1=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";\n    done;\n    printf \"%s\" \"${OUTPUT1}\";\nfi"
    
    set OUTPUT2 to do shell script "\nOUTPUT2='';\nBLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);\nSYSTEM_PROFILER= $(system_profiler SPBluetoothDataType); \nMAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); \nCONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); \nBLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); \nBATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentLeft\"); \n\nif [[ \"${CONNECTED}\" ]];\n then \n for I in \"${BATTERY_LEVELS[@]}\";\n  do \n  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";\n   [[ ! -z \"${!I}\" ]] && \n   OUTPUT2=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";\n    done;\n    printf \"%s\" \"${OUTPUT2}\";\nfi"
    
    return "\n" & "Ⓛ" & OUTPUT2 & "Ⓡ" & OUTPUT1
    
end checkBattery
0
Caliguvara
Caliguvara04.04.1922:07
Super Danke Dir!!
War fast richtig, ein par kleine Änderungen hab ich gemacht - in Deiner Version checkt er jedes verfügbare Gerät. Wenn die AirPods verbunden sind klappt das super, sind sie es nicht läuft das Script für mich ins leere (Antwort: item 1 of {"Computer"}).
Damit klappts:
--set your AirPods name
set YourAirPodsName to "YOUR_AIRPODS_NAME"

set returnValue to {}
tell application "iTunes"
    set AirPlayNames to name of every AirPlay device whose selected is true
    if AirPlayNames contains YourAirPodsName then
        set returnValue to {(AirPlayNames & (checkBattery() of me))}
    else
        set returnValue to AirPlayNames
    end if
    return returnValue
end tell

on checkBattery()
    set OUTPUT1 to do shell script "
OUTPUT1='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentRight\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT1=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT1}\";
fi"
    
    set OUTPUT2 to do shell script "
OUTPUT2='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentLeft\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT2=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT2}\";
fi"
    
    return "
" & "Ⓛ" & OUTPUT2 & " Ⓡ" & OUTPUT1
    
end checkBattery
Danke nochmal 😃
„Don't Panic.“
0
Zikade
Zikade04.04.1922:17
Kommt alles darauf an welche Rückgabe die aufrufende Funktion versteht. Da Grundsätzlich mehrere Geräte verbunden sein können wird von
set AirPlayName to name of every AirPlay device whose selected is true
immer eine Liste von Strings zurückgegeben, auch wenn diese Liste nur einen Eintrag enthält.
Daher läuft ein Vergleich zwischen einem String und einer Liste immer ins leere - sind einfach zwei verschiedene Dinge.
if AirPlayName is equal to LclAirPodsName then
Hier ist AirPlayName eine Liste von Strings und LclAirPodsName ein String - das wird nix.
Was ich zuvor geschrieben habe,
if AirPlayName contains YourAirPodsName then
fragt nur, ob in der Liste ein String enthalten ist dessen Wert gleich dem von YourAirPodsName ist. Sollte also eines der verbundenen AirPlay-Devices auch dein AirPod sein wird das immer der Fall sein.
So viel dazu

Zu der Fehlermeldung:
Der Fehler kommt daher, dass die Funktion checkBattery() erstmal unbekannt ist, bzw. die Script Engine nicht weiß, was du von ihr willst. Der richtige Aufruf heißt hier
checkBattery() of me
Das 'of me' am Ende sagt dem Interpreter, dass die Funktion in diesem Skript definiert wird.
+1
Caliguvara
Caliguvara04.04.1922:24
Stimmt, ist richtig.
Leider kann BetterTouchTool mit dem Output
item 1 of {"Computer"}
nichts anfangen, und zeigt mir in dem Fall nur Stur den Namen des Scripts an.
Deswegen muss ich die multiplen Airplay Ausgänge leider kurzschließen 😕
„Don't Panic.“
0
Zikade
Zikade04.04.1922:47
Hm... bin fast versucht das mal hier auszuprobieren

Aber, wenns nur um eines geht sollte doch auch das gehen:
tell application "iTunes"
    set AirPlayName to name of the first AirPlay device whose selected is true
    if AirPlayName contains YourAirPodsName then
        set returnValue to (AirPlayName & (checkBattery() of me)) as string
    else
        set returnValue to AirPlayName
    end if
    return returnValue
end tell
0
Caliguvara
Caliguvara04.04.1922:55
Funktioniert genauso gut 😃
„Don't Panic.“
0
rmayergfx
rmayergfx05.04.1911:25
Hallo ihr beiden. Sehr schönes Thema, kann gar nicht so viele Daumen dafür vergeben. Wie wäre es denn wenn ihr zu dem Thema ein Journal macht, und die verschiedenen Parameter und Funktionsweisen auch für Dummies erklärt ? Bitte dann auch das Script dort vollständig zur eigenen Anpassung hinterlegen, ich bin mir sicher das dies auch noch von einigen anderen gerne genutzt werden würde, die sich aber einfach überfordert fühlen so etwas ohne Hilfe auf die Beine zu stellen.
„Der Computer soll die Arbeit des Menschen erleichtern, nicht umgekehrt !“
+2
Caliguvara
Caliguvara05.04.1913:02
Hi,
Ist eigentlich ganz einfach. Das finale Script sieht so aus:

set LclAirPodsName to "YOUR_AIRPODS_NAME"

set returnValue to {}
tell application "iTunes"
    set AirPlayName to name of the first AirPlay device whose selected is true
    if AirPlayName contains LclAirPodsName then
        set returnValue to (AirPlayName & (checkBattery() of me)) as string
    else
        set returnValue to AirPlayName
    end if
    return returnValue
end tell

on checkBattery()
    set OUTPUT1 to do shell script "
OUTPUT1='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentRight\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT1=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT1}\";
fi"
    
    set OUTPUT2 to do shell script "
OUTPUT2='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentLeft\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT2=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT2}\";
fi"
    
    return & "
" & "Ⓛ" & OUTPUT2 & " Ⓡ" & OUTPUT1
    
end checkBattery

Stück für Stück aufgedröselt st es, wie so oft im Nachhinein, eigentlich ganz einfach:
set LclAirPodsName to "YOUR_AIRPODS_NAME"
Das muss jeder selbst bearbeiten. Damit bestimmst Du den Namen Deiner AirPods, damit das Script weiß wie diese heißen. Darum geht es uns ja.

tell application "iTunes"
    set AirPlayName to name of the first AirPlay device whose selected is true
iTunes soll mir sagen, welcher Airplay Device (AirPlayName) gerade genutzt wird. Genauer gesagt fragt das Script iTunes welche AirPlay Geräte gerade genutzt werden, und gibt mir das erste aus der Liste wieder - das ist das Manko des Scripts, da es nur ein Airplay Gerät wiedergibt. Da muss ich später rann, wenn ich weiß wie ich das mit BetterTouchTool in Verbindung kriege (mehr dazu später).

if AirPlayName contains LclAirPodsName then
Das Script gleicht als nächstes den erhaltenen Namen mit dem Namen der AirPods ab, und geht je nach Ergebnis (sind die AirPods oder nicht) einen anderen Weg.

    if AirPlayName contains LclAirPodsName then
        set returnValue to (AirPlayName & (checkBattery() of me)) as string
Sind AirPlay Name und AirPods name also die gleichen (sprich werden gerade die AirPods angespielt), dann wird das was das Script mir sagen soll definiert als
- Name des AirPlay Gerätes (AirPlayName, sprich den der AirPods - LclAirPodsName).
- Sowie, daran angehängt, das Ergebnis des ellenlangen "checkBattery" Script aus:
on checkBattery()
    set OUTPUT1 to do shell script "
OUTPUT1='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentRight\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT1=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT1}\";
fi"
    
    set OUTPUT2 to do shell script "
OUTPUT2='';
BLUETOOTH_DEFAULTS=$(defaults read /Library/Preferences/com.apple.Bluetooth);
SYSTEM_PROFILER=$(system_profiler SPBluetoothDataType); 
MAC_ADDR=$(grep -b2 \"Minor Type: Headphones\"<<<\"${SYSTEM_PROFILER}\"|awk '/Address/{print $3}'); 
CONNECTED=$(grep -ia6 \"${MAC_ADDR}\"<<<\"${SYSTEM_PROFILER}\"|awk '/Connected: Yes/{print 1}'); 
BLUETOOTH_DATA=$(grep -ia6 '\"'\"${MAC_ADDR}\"'\"'<<<\"${BLUETOOTH_DEFAULTS}\"); 
BATTERY_LEVELS=(\"BatteryPercentCombined\" \"HeadsetBattery\" \"BatteryPercentSingle\" \"BatteryPercentLeft\"); 

if [[ \"${CONNECTED}\" ]];
 then 
 for I in \"${BATTERY_LEVELS[@]}\";
  do 
  declare -x \"${I}\"=\"$(awk -v pat=\"${I}\" '$0~pat{gsub (\";\",\"\"); print $3}'<<<\"${BLUETOOTH_DATA}\")\";
   [[ ! -z \"${!I}\" ]] && 
   OUTPUT2=\"${OUTPUT}$(awk '/BatteryPercent/{print substr($0)}'<<<\"${I}\")${!I}%\";
    done;
    printf \"%s\" \"${OUTPUT2}\";
fi"
    
    return & "
" & "Ⓛ" & OUTPUT2 & " Ⓡ" & OUTPUT1
    
end checkBattery
Welches am Ende nur in einer zweiten Zeile die Symbole Ⓛ und Ⓡ anzeigt, jeweils gefolgt von dem Batteriezustand des jeweiligen Kopfhörers. Das checkBattery Script kann ich Dir nicht im Detail erklären, da dieses Shell basiert ist, welches ich nur in geringem Umfang beherrsche. OUTPUT2 gibt Dir den Batteriewert des Linken AirPods, OUTPUT1 den des rechten.

Das passiert also wenn der AirPlay Receiver AirPlayName sowie der AirPod Name LclAirPodsName übereinstimmen (im Script haben wir die Variablen nicht als übereinstimmend angegeben, sondern es reicht wenn ein Teil des AirPlay Names den Namen der AirPods enthält, was ja stimmt wenn die AirPods verbunden sind). Und wenn die beiden Namen nicht die gleichen sind?
    else
        set returnValue to AirPlayName
    end if
    return returnValue
Dann wird das was das Script mir sagen soll (returnValue) definiert als Name des AirPlay Devices (AirPlayName) und basta. 🙂


Das Script habe zum Einsatz in BetterTouchTool in der TouchBar erdacht. Da wird mir dann das angezeigt, was ich weiter oben gepostet habe 🙂 Man könnte es in gewissen Maßen umschreiben, um das Ergebnis auch in einem kleinen Fenster zu sehen, aber das ist dann auch irgendwie wieder weniger effizient als iTunes direkt zu bemühen.

Das Script kommt, wenn Zikade damit einverstanden ist, auf jeden Fall auch in das nächste Update meines TouchBar Presets. Ich poste hier genre nochmal einen Kommentar wenn es soweit ist 😉
„Don't Panic.“
+1

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.