0 votos

¿Puedo activar una escena de HomeKit cuando la cámara de mi computadora portátil se enciende o se apaga?

Como mucha gente hoy en día, tengo montada una oficina en casa y a menudo estoy en videollamadas en mi MacBook Pro. A veces mi pareja quiere entrar en mi oficina, pero no quiere interrumpir una videollamada. Tenemos una bombilla Hue en el aterrizaje fuera de mi oficina, así que me preguntaba si podría usarla para mostrar si estoy en una llamada. ¿Puedo activar una escena de HomeKit basada en si la cámara de mi laptop está encendida o apagada?

7voto

jmans Puntos 3018

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

  1. Identifica eventos para tus desencadenantes.
  2. Usa la aplicación Shortcuts para crear accesos directos que activen las acciones de tu HomeKit deseadas.
  3. Crea un script que active accesos directos cuando la cámara se encienda/apague.
  4. 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.

configuración de 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.

ambos accesos directos

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:

  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,
  2. 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
  3. 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.

1voto

SiliconChaos Puntos 73

No parece posible hacer esto con HomeKit, pero es posible hacer un script que se comunique con IFTTT, y IFTTT se comunicará directamente con Hue. Si tienes un concentrador Hubitat o Home Assistant, también funcionará como un webhook en el medio.

Logré pasar la primera parte fácilmente: recibir una notificación cuando se abre o se cierra la cámara. Para detectar que la cámara está encendida:

while true; do log stream | grep -o -m 1 "Post event kCameraStreamStop" > /dev/null && echo STOPPED; done

Y la cámara apagada:

while true; do log stream | grep -o -m 1 "Post event kCameraStreamStart" > /dev/null && echo STARTED; done

Estos pueden convertirse fácilmente en un único script silencioso que se inicia al arrancar. Para comunicarse con las bombillas, reemplazaremos "echo STARTED/STOPPED" con curl a un webhook de IFTTT. Así que necesitas crear una cuenta en IFTTT (si has usado más de una de tus 3 reglas gratuitas, crea otra cuenta a menos que ya estés pagando por premium), y vincular el Hue con un webhook. Curl llamará a este webhook y configurará tu bombilla hue con el color, Kelvin y brillo que desees o la apagará. Si necesitas una guía más específica, puedo ayudarte.

0 votos

Esta respuesta menciona que IFTTT funciona con Hue, pero ¿la pregunta pide HomeKit?

0 votos

Lo siento por la vaguedad, no creo que sea posible con HomeKit y necesita un webhook para funcionar, y la comunicación con HomeKit es muy difícil (usando Siri a través de la terminal, que implica pulsaciones de teclas virtuales). Para simplificar las cosas, descubrí que comunicarse con Hue a través de IFTTT en lugar de HomeKit funciona mejor

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X