Con la aplicación Shortcuts y su utilidad de línea de comandos shortcuts
, ahora es posible activar accesos directos específicos que controlen tus escenas y accesorios HomeKit.
Steps generales
- Identifica eventos para tus desencadenantes.
- Usa la aplicación Shortcuts para crear accesos directos que activen las acciones de tu HomeKit deseadas.
- Crea un script que active accesos directos cuando la cámara se encienda/apague.
- Ejecuta el script manualmente o automáticamente.
Identifica eventos para tus desencadenantes
A partir de MacOS 12.1 Monterey, los eventos Post event kCameraStreamStart
y kCameraStreamStop
mencionados en la respuesta de anónimo ya no se registran, pero hay equivalentes nuevos. Es probable que los registros de eventos cambien con el tiempo, así que primero verifica que estos sigan siendo correctos.
En Terminal, ejecuta esto para filtrar los registros a los mensajes esperados según Monterey:
log stream | /usr/bin/grep -E 'UVCAssistant:.*(stop|start) stream'
Mientras se ejecuta eso, abre la aplicación Photo Booth. Esperanzadamente verás líneas como estas producidas desde el registro filtrado cuando la cámara se encienda y se apague (cuando salgas de la aplicación).
2022-01-04 14:56:58.628006-0500 0xb35b3 Default 0x18025b 266 0 UVCAssistant: (UVCFamily) [com.apple.UVCFamily:device] UVCUSBDeviceStreamingInterface: 0x1000005a6 [0x7fcd7bd08260] [start stream] formato : UVCDeviceStreamFormat:[1280 * 720 (YUV420_420v)] [0x7fcd7bd08e90] [subtype 4] frameInterval : 333333
2022-01-04 14:57:31.179027-0500 0xb2227 Default 0x1803a4 266 0 UVCAssistant: (UVCFamily) [com.apple.UVCFamily:device] UVCUSBDeviceStreamingInterface: 0x1000005a6 [0x7fcd7bd08260] [stop stream] formato : UVCDeviceStreamFormat:[1280 * 720 (YUV420_420v)] [0x7fcd7bd08e90] [subtype 4] frameInterval : 333333
Si obtienes resultados, has completado este paso y puedes usar los buscadores de expresiones regulares que proporciono en los siguientes pasos.
Si no obtienes resultados, necesitarás ampliar el filtro para buscar registros de eventos que aparezcan cuando la cámara se encienda y se apague. Este podría ser un buen punto de partida:
log stream | /usr/bin/grep -iE 'UVCAssistant|camera|stream|tccd'
Asegúrate de que los eventos que elijas se emitan para cualquier uso de la cámara (por ejemplo, Zoom, Meet), no solo PhotoBooth.
Necesitarás crear una expresión regular para grep
que coincida solo cuando tu cámara se encienda o apague. Si tienes múltiples cámaras, es posible que también desees probar cambiando entre cámaras.
Crea accesos directos para activar acciones de HomeKit
Primero, confirma que puedes usar la aplicación Home en tu Mac para activar cambios en los accesorios o escenas en los que estás interesado.
En la aplicación Shortcuts, crea un nuevo acceso directo (botón +
). Para alternar una luz, necesitarás un acceso directo diferente para cada estado (por ejemplo, encendido/apagado). Dale al acceso directo un nombre como Encender lámpara.
Para cada acceso directo, selecciona la aplicación Home y agrega su acción Control a tu acceso directo (arrastra o haz doble clic). Selecciona la escena o accesorio específico que deseas controlar y el estado al que deseas configurarlo cuando se ejecute el acceso directo.
Cuando hayas terminado, deberías ver tus accesos directos en tu lista de accesos directos y poder ejecutarlos y activar el comportamiento esperado.
Por último, confirma que puedes activar estos con éxito mediante el terminal de línea de comandos:
shortcuts run 'Encender lámpara'
shortcuts run 'Apagar lámpara'
Activar accesos directos en el estado de la cámara
Crea un archivo de script (por ejemplo, camera-lamp.sh
) que, mientras se ejecuta, alternará tu luz según si la cámara está en funcionamiento. Un ejemplo inicial:
#!/bin/bash
exec log stream |
/usr/bin/grep -E --line-buffered 'UVCAssistant:.*(stop|start) stream' | # filtra eventos de registro
tee /dev/stderr | # muestra eventos coincidentes para depuración
/usr/bin/sed -Eu 's/.*(start|stop).*/\1/' | # reduce el mensaje del registro a una sola palabra que identifique el evento/estado
while read -r event; do # almacena esa palabra en la variable $event
echo "Cámara $event"
if [ "$event" = "start" ]; then
echo "Lámpara encendida"
shortcuts run 'Encender lámpara' &
else
echo "Lámpara apagada"
shortcuts run 'Apagar lámpara' &
fi
done
Reemplaza mis nombres de accesos directos Encender lámpara
y Apagar lámpara
por los tuyos, si son distintos. Siéntete libre de cambiar mensajes como "Lámpara encendida"
para que se ajusten a tu escenario.
Si necesitaste elegir un filtro diferente en el paso 1:
- reemplaza la expresión regular de
grep
con una que coincida tanto con los mensajes de registro de eventos de encendido de la cámara como de apagado,
- reemplaza la expresión regular de sustitución de
sed
con una que coincida con la palabra equivalente que indique el estado de la cámara, y
- si esa palabra no es
start
cuando la cámara se encienda, actualiza la condición del if
que coincida con la palabra de start
.
Ejecuta el script
Ejecuta el script y pruébalo. Si lo nombraste camera-lamp.sh
, ejecuta
bash camera-lamp.sh
Mientras el script se está ejecutando, tus accesos directos de HomeKit deberían activarse cada vez que tu cámara se encienda o apague.
Pasos opcionales:
-
Una vez que el script sea estable, ejecútalo en segundo plano y cierra el terminal.
bash camera-lamp.sh &
-
Elimina la extensión, haz que el archivo sea ejecutable y reubícalo en /usr/local/bin
u otro lugar en tu $PATH
, para que puedas simplemente ejecutar camera-lamp
como un comando.
-
Encuentra una manera de ejecutar el script en segundo plano como un demonio al iniciar sesión. Cómo lograrlo está más allá del alcance de esta respuesta. No obstante, es importante saber que esto no puede ejecutarse como un demonio de launchctl, ya que estos demonios no pueden ejecutar accesos directos debido a Error: Couldn’t communicate with a helper application
. Si encuentras un buen enfoque, siéntete libre de comentar.
Actualización
Si utilizas el filtrado interno de log
en lugar de grep
, el uso de CPU disminuirá, según el comentario de @alloy.
#!/bin/bash
exec log stream --predicate 'process == "UVCAssistant" && (eventMessage CONTAINS "start stream" || eventMessage CONTAINS "Stop Stream")' |
/usr/bin/grep -vE --line-buffered '^Filter' | # filtra la salida informativa al iniciar
tee /dev/stderr | # muestra eventos coincidientes para depuración
/usr/bin/sed -Eu 's/.*(start|stop).*/\1/' | # reduce el mensaje del registro a una sola palabra que identifique el evento/estado
while read -r event; do # almacena esa palabra en la variable $event
echo "Cámara $event"
if [ "$event" = "start" ]; then
echo "Lámpara encendida"
shortcuts run 'Encender lámpara' &
else
echo "Lámpara apagada"
shortcuts run 'Apagar lámpara' &
fi
done
Consulta https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html para la sintaxis de predicado de log
.