Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
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
03.04.19
17: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.“
Hilfreich?
0
Kommentare
rmayergfx
03.04.19
17: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 !“
Hilfreich?
+1
Caliguvara
03.04.19
17: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.“
Hilfreich?
0
Caliguvara
04.04.19
14: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.“
Hilfreich?
0
Zikade
04.04.19
17: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
Hilfreich?
0
Caliguvara
04.04.19
18: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.“
Hilfreich?
0
MikeMuc
04.04.19
18: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?
Hilfreich?
0
MikeMuc
04.04.19
19: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
Hilfreich?
+1
Caliguvara
04.04.19
19: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.“
Hilfreich?
0
Zikade
04.04.19
20: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
Hilfreich?
0
Zikade
04.04.19
21: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?
Hilfreich?
0
Zikade
04.04.19
21: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
Hilfreich?
0
Caliguvara
04.04.19
21: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.“
Hilfreich?
0
Zikade
04.04.19
21: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
Hilfreich?
0
Caliguvara
04.04.19
22: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.“
Hilfreich?
0
Zikade
04.04.19
22: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.
Hilfreich?
+1
Caliguvara
04.04.19
22: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.“
Hilfreich?
0
Zikade
04.04.19
22: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
Hilfreich?
0
Caliguvara
04.04.19
22:55
Funktioniert genauso gut 😃
„Don't Panic.“
Hilfreich?
0
rmayergfx
05.04.19
11: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 !“
Hilfreich?
+2
Caliguvara
05.04.19
13: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.“
Hilfreich?
+1
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.
Time Machine auf SSD – schneller und langlebige...
iPad Pro M4 wird grün – Displayfehler bei immer...
Kurz: Bausatz für eMac in M4-Design +++ Amazon ...
Apple Silicon M4: Die versteckte Innovation der...
iPhones und Speicherupgrades: Kunden greifen se...
Samsung präsentiert die neuen Galaxy-Flaggschif...
iPhone 17 "Air"
Steht das Apple-Board vor großen Veränderungen ...