¿Cómo puedo activar una aplicación Applecript o Automator cuando un dispositivo bluetooth específico entra dentro del alcance?

Tengo un Applescript que conecta un altavoz bluetooth a mi Mac y cambia "Reproducir efectos de sonido a través de:" a "Altavoces internos".

Quiero que este script se ejecute cada vez que enciendo mi altavoz bluetooth. Actualmente estoy activando la secuencia de comandos manualmente con un atajo de teclado cada vez que enciendo el altavoz, pero sería aún más conveniente si pudiera configurar la secuencia de comandos para que se ejecute automáticamente cada vez que el altavoz bluetooth esté disponible para la Mac, preferiblemente sin usar terceros. software de fiesta

¿Hay alguna forma de hacer esto?

Addictivetips de terceros.com/mac-os/…

Respuestas (1)

Esta es una especie de cosa difícil de hacer si no desea utilizar software de terceros. Sin embargo, con algunos scripts de bash y plist podemos hacer que funcione.

Primero, en su ~/Library/LaunchAgentscarpeta cree el siguiente archivo .plist (en este caso lo he nombrado com.my.bluetoothdetector.plist; si cambia el nombre, asegúrese de cambiar también la línea 4 en el archivo):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
        <string>com.my.bluetoothdetector</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/Users/YOURUSERNAME/Desktop/script.sh</string>
    </array>
        <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/com.apple.Bluetooth.plist</string>
    </array>
</dict>
</plist>

El archivo anterior llamará a cualquier secuencia de comandos que se encuentre /Users/YOURUSERNAME/Desktop/script.shcuando haya un cambio en el entorno de Bluetooth. Por supuesto, puede cambiar la ubicación del archivo llamado desde el escritorio a donde desee (asegurándose de que sea una ruta completa).

Ahora, crearemos un script bash que, cuando lo active nuestro com.my.bluetoothdetector.plistarchivo, verificará si su dispositivo está conectado. En este caso, guardaremos este archivo en /Users/USERNAME/Desktop/script.sh:

#!/bin/bash

connectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/{f=1}/Connected:/ && f{print $2; exit}')"

if [ "$connectedyesorno" == "Yes" ]
then
  open /Applications/YOURAPPNAME.app
elif [ "$connectedyesorno" == "No" ]
then
  echo "Not connected..."
else
  echo "ERROR"
fi

Aquí, sustituya BLUETOOTHDEVICENAMEel nombre de su dispositivo y la /Applications/YOURAPPNAME.appparte del open /Applications/YOURAPPNAME.appcomando por la ubicación de la aplicación Automator/AppleScript que desea ejecutar. También puede reemplazar esta línea por completo para ejecutar cualquier script de shell que desee cuando el dispositivo esté conectado, lo que puede anular la necesidad de tener una aplicación AppleScript/Automator separada para llamar.

Finalmente, usa el comando:

launchctl load ~/Library/LaunchAgents/com.my.bluetoothdetector.plist

Esto iniciará el proceso que verificará el cambio en el entorno de Bluetooth y luego llamará script.bashcuando se detecte.

Ahora, con suerte, cuando conecte el dispositivo Bluetooth a su computadora, después de solo unos segundos, ¡su archivo AppleScript/Automator debería ejecutarse!

Tengo un Applescript que conecta un altavoz bluetooth a mi Mac...

Los dispositivos bluetooth conectados previamente deberían conectarse automáticamente a una Mac cuando estén disponibles. Si este no es su caso, tal vez haya algún tipo de problema relacionado con la configuración de su bluetooth. Echa un vistazo a este artículo si el problema persiste.

PD En el futuro, si desea eliminar esto, ejecute los siguientes comandos:

launchctl unload ~/Library/LaunchAgents/com.my.bluetoothdetector.plist
rm -r ~/Library/LaunchAgents/com.my.bluetoothdetector.plist
rm -r ~/Desktop/script.sh
Gracias por la ayuda. Cuando llego al comando launchctl, aparece el error "lista de propiedades no válida".
@Macrod Eso es extraño, nunca recibí ese error durante mi prueba; ¿Te has asegurado de haberlo pegado exactamente? También puede usar Atom para crear el archivo si ha estado usando TextEdit o un programa similar. Sin embargo, después de algunas búsquedas en Google, me encontré con algunas personas que tenían problemas similares. He editado la respuesta original con una de las soluciones vinculadas. ¡Espero que esto resuelva tu pregunta! Si no, simplemente busque en Google tratando de encontrar qué es exactamente en el .plistarchivo que está creando el error. Mejor
Por cierto, uso un programa llamado EventScripts by Mousedown, sin embargo, ya no está disponible en la App Store de EE. UU. (en este momento de todos modos). Sin embargo, es bueno saber cómo solucionarlo si la versión actual que tengo deja de funcionar en macOS Mojave, cuando actualizo.
@ user3439894 No había oído hablar de ese programa antes, pero tendré que investigarlo porque parece que tiene muchas funciones. ¿No hay una forma de obtenerlo desde otro lugar que no sea la App Store? Me alegro de haber podido brindarle una posible solución, suponiendo que su programa deje de funcionar cuando actualice. Como mencioné en la respuesta, todo el proceso se simplificaría al usar una aplicación de terceros como la suya, pero se solicitó específicamente usar solo recursos integrados.
@ user3439894 Además, estoy seguro de que con algunos ajustes a mi respuesta, podría modificarla para que se active cuando ocurran otros eventos relacionados con Bluetooth, como un cambio de SSID. PD: todavía estoy confundido en cuanto a por qué el archivo '.plist' original y defectuoso funcionó para mí, pero no para la persona que hizo la pregunta ... extraño.
Cuando lo compré por primera vez, estaba en la App Store de EE. UU. Todavía puedo descargarlo, pero puede que no sea el último. En cuanto a obtenerlo en otro lugar, probablemente tendría que ser una tienda de aplicaciones de otro país, ya que no está disponible directamente desde el sitio web para compras individuales. Aunque puede contactarlos si necesita versiones que no sean de la App Store de cualquiera de sus aplicaciones para distribución empresarial. No estoy afiliado a Mousedown, solo soy un usuario. En cuanto a la plist que no funciona sin el encabezado, puede depender de la versión de OS X/macOS, no puedo decirlo con seguridad sin probarlo, lo cual no estoy dispuesto a hacer.
@ user3439894 Desafortunadamente, parece que Mousedown tampoco está disponible en mi App Store :( ¿Espera que su funcionalidad actual cese al actualizar a macOS Mojave? De hecho, es extraño que el archivo plist funcione en mi computadora sin ningún problema. Más -así que he estado usando el formato incorrecto durante algunos años (ahora tengo el macOS más nuevo) y nunca he experimentado un problema. Supongo que no estaría mal si comenzara a formatear correctamente todas mis plists el manera correcta incluso si no hay diferencia para mí.
En cuanto a "¿Espera que su funcionalidad actual cese al actualizar a macOS Mojave?"... Parece que con cada versión importante del sistema operativo, y algunas versiones menores también, algunos software de terceros tienen problemas menores para romperse por completo. Entonces, si tiene problemas o fallas y no puedo obtener una versión que funcione, usaré la base presentada en su respuesta para implementar mis propias soluciones para las que actualmente uso Script Events. Gracias.
Actualización, intenté nuevamente usando Atom y el problema desapareció pero el script no se ejecuta cuando el dispositivo está encendido. Pero después de reiniciar, el altavoz Bluetooth ahora se conecta automáticamente como debería en MacOS. Si alguien puede aclarar por qué no se ejecutó el script, esta respuesta podría ser útil para otros.
@Macrod Eso es extraño. En caso de que no lo haya visto, actualicé el formato del .plistarchivo en mi respuesta original de acuerdo con la documentación oficial de Apple. ¿Recibes algún error al ejecutar el launchctlcomando? Además, si solo se ejecuta system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/,0' | grep "Connected" | head -1 | sed 's/.*Connected: //'solo (asegurándose de reemplazar SOLOBLUETOOTHDEVICENAME ), ¿obtiene al menos un No/ Yes??
@Macrod Además, ¿en qué versión de macOS estás?
Olvidé mencionar esto el otro día, si va a usar awk, entonces realmente no hay necesidad de invocar las 3 pipesutilidades adicionales y 3 adicionales, grepy headno sedson necesarias. Por cierto, en este caso, el uso grep -m 1 "Connected"niega la necesidad de, | head -1sin embargo, los siguientes usos awkpor sí mismos para hacer lo que estaban haciendo los pipes grepadicionales :headsedconnectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/{f=1}/Connected:/ && f{print $2; exit}')"
O si desea construir sobre su awk comando existente , puede usar lo siguiente:connectedyesorno="$(system_profiler SPBluetoothDataType | awk '/BLUETOOTHDEVICENAME/,0 {if(/Connected:/){print $2; exit}}')"
@user3439894 ¡Ah, gracias por eso! Tengo que decir; No soy un experto con sed, grep, awketc. ¡Por lo general, me muevo hasta que funciona! :) Sin embargo, editaré mi respuesta original para cambiar el comando más antiguo e ineficiente con el que sugirió para que sea más limpio.