Comme beaucoup de personnes de nos jours, je travaille dans un bureau à domicile et je suis souvent en appel vidéo sur mon MacBook Pro. Mon partenaire veut parfois venir dans mon bureau, mais ne veut pas interrompre un appel vidéo. Nous avons une ampoule Hue dans le couloir à l'extérieur de mon bureau, donc je me demandais si je pouvais l'utiliser pour montrer si je suis en appel. Est-ce que je peux déclencher une scène HomeKit en fonction de si la caméra de mon ordinateur portable est activée ou désactivée?
Réponses
Trop de publicités?Il ne semble pas possible de faire cela avec HomeKit, mais il est possible de créer un script qui communique avec IFTTT, et IFTTT communiquera directement avec Hue. Si vous avez un concentrateur Hubitat ou Home Assistant, cela fonctionnera également en tant que webhook au milieu.
J'ai réussi à passer la première partie facilement : recevoir une notification lorsque la caméra est ouverte ou fermée. Pour détecter l'activation de la caméra :
while true; do log stream | grep -o -m 1 "Post event kCameraStreamStop" > /dev/null && echo STOPPED; done
Et pour la désactivation de la caméra :
while true; do log stream | grep -o -m 1 "Post event kCameraStreamStart" > /dev/null && echo STARTED; done
Il est facile de convertir tout cela en un seul script silencieux qui se lance au démarrage. Pour communiquer avec les ampoules, nous remplacerons "echo STARTED/STOPPED" par un appel curl à un webhook IFTTT. Vous devez donc créer un compte IFTTT (si vous avez utilisé plus d'une de vos 3 règles gratuites, créez un autre compte à moins que vous ne payiez déjà pour le premium), et associez Hue avec un webhook. Curl appellera ce webhook et réglera votre ampoule Hue sur la couleur, la température Kelvin et la luminosité que vous souhaitez, ou l'éteindra. Si vous avez besoin de directives plus précises, je peux vous aider.
Avec l'application Raccourcis et son utilitaire en ligne de commande raccourcis
, il est maintenant possible de déclencher des raccourcis spécifiques qui contrôlent vos scènes et accessoires HomeKit.
Étapes générales
- Identifier les événements pour vos déclencheurs.
- Utiliser l'application Raccourcis pour créer des raccourcis qui déclenchent les actions HomeKit souhaitées.
- Créer un script qui déclenche des raccourcis lorsque la caméra s'allume/éteint.
- Exécuter le script manuellement ou automatiquement.
Identifier les événements pour vos déclencheurs
A partir de MacOS 12.1 Monterey, les événements kCameraStreamStart
et kCameraStreamStop
mentionnés dans la réponse de anonyme ne sont plus journalisés, mais il existe de nouveaux équivalents. Il est probable que les journaux d'événements puissent changer avec le temps, donc vérifiez d'abord s'ils sont toujours corrects.
Dans Terminal, exécutez ceci pour filtrer les journaux aux messages attendus jusqu'à présent sur Monterey :
log stream | /usr/bin/grep -E 'UVCAssistant:.*(stop|start) stream'
Pendant que c'est en cours, ouvrez l'application Photo Booth. Vous devriez espérer voir des lignes comme celles-ci s'afficher dans le flux de journal filtré lorsque la caméra démarre et s'arrête (quand vous quittez l'application).
2022-01-04 14:56:58.628006-0500 0xb35b3 Default 0x18025b 266 0 UVCAssistant: (UVCFamily) [com.apple.UVCFamily:device] UVCUSBDeviceStreamingInterface: 0x1000005a6 [0x7fcd7bd08260] [start stream] format : 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] format : UVCDeviceStreamFormat:[1280 * 720 (YUV420_420v)] [0x7fcd7bd08e90] [subtype 4] frameInterval : 333333
Si vous obtenez une sortie, vous avez terminé cette étape et pouvez utiliser les correspondances d'expressions rationnelles que je fournis dans les étapes suivantes.
Si vous n'obtenez aucune sortie, vous devrez élargir le filtre pour rechercher les journaux d'événements qui apparaissent lorsque la caméra démarre et s'arrête. Voici peut-être un bon point de départ :
log stream | /usr/bin/grep -iE 'UVCAssistant|camera|stream|tccd'
Assurez-vous que les événements que vous choisissez sont émis pour toute utilisation de la caméra (par exemple, Zoom, Meet), pas seulement PhotoBooth.
Vous aurez besoin de créer une expression régulière pour grep
qui ne correspond que lorsque votre caméra est activée ou désactivée. Si vous avez plusieurs caméras, vous voudrez peut-être également tester le basculement entre les caméras.
Créer des Raccourcis pour déclencher des actions HomeKit
Tout d'abord, confirmez que vous pouvez utiliser l'application Maison sur votre Mac pour déclencher des changements sur les accessoires ou scènes qui vous intéressent.
Dans l'application Raccourcis, créez un nouveau raccourci (+
bouton). Pour basculer une lumière, vous aurez besoin d'un raccourci séparé pour chaque état (par ex. allumé/éteint). Donnez au raccourci un nom tel que Allumer lampe.
Pour chaque raccourci, sélectionnez l'application Maison et ajoutez son action Contrôler à votre raccourci (glissez-déposez ou double-cliquez). Sélectionnez la scène ou l'accessoire spécifique que vous voulez contrôler, et sélectionnez un état pour le définir lorsque le raccourci s'exécute.
Une fois terminé, vous devriez voir vos raccourcis dans votre liste de raccourcis et être capable de les exécuter pour déclencher le comportement attendu.
Enfin, confirmez que vous pouvez déclencher ces raccourcis avec succès via la ligne de commande du Terminal :
raccourcis run 'Allumer lampe'
raccourcis run 'Éteindre lampe'
Déclencher des raccourcis sur l'état de la caméra
Créez un fichier de script (par ex. camera-lamp.sh
) qui, lorsqu'il s'exécute, basculera votre lumière en fonction du fonctionnement de la caméra. Un exemple de démarrage :
#!/bin/bash
exec log stream |
/usr/bin/grep -E --line-buffered 'UVCAssistant:.*(stop|start) stream' | # filtrer les événements du journal
tee /dev/stderr | # afficher les événements correspondants pour le débogage
/usr/bin/sed -Eu 's/.*(start|stop).*/\1/' | # réduire le message du journal à un seul mot identifiant l'événement/état
while read -r event; do # stocker ce mot dans la variable $event
echo "Caméra $event"
if [ "$event" = "start" ]; then
echo "Lumière allumée"
raccourcis run 'Lampe bureau allumer' &
else
echo "Lumière éteinte"
raccourcis run 'Lampe bureau éteindre' &
fi
done
Remplacez mes noms de raccourcis Lampe bureau allumer
et Lampe bureau éteindre
par les vôtres, si différents. N'hésitez pas à modifier les messages comme "Lumière allumée"
pour s'adapter à votre scénario.
Si vous avez dû choisir un filtre différent à l'étape 1 :
- remplacez l'expression régulière de
grep
par une qui correspond aux messages de journal pour l'allumage et l'extinction de la caméra, - remplacez l'expression régulière de substitution de
sed
par une qui correspond au mot équivalent indiquant l'état de la caméra, et - si ce mot n'est pas
démarrer
lorsque la caméra s'allume, mettez à jour la conditionif
qui correspond au motdémarrer
.
Exécuter le script
Exécutez le script et testez-le. Si vous l'avez nommé camera-lamp.sh
, exécutez
bash camera-lamp.sh
Pendant que le script s'exécute, vos raccourcis HomeKit devraient se déclencher à chaque fois que votre caméra s'allume ou s'éteint.
Étapes optionnelles :
-
Une fois que le script est stable, exécutez-le en arrière-plan et fermez le terminal.
bash camera-lamp.sh &
-
Supprimez l'extension, rendez le fichier exécutable et déplacez-le vers
/usr/local/bin
ou ailleurs dans votre$PATH
, afin de pouvoir simplement exécutercamera-lamp
en tant que commande. -
Trouvez un moyen d'exécuter le script en arrière-plan en tant que démon au démarrage. Comment accomplir cela dépasse le cadre de cette réponse. Toutefois, cela ne peut pas fonctionner comme un démon launchctl, car ces démons ne peuvent pas exécuter de raccourcis en raison de l'erreur
Erreur : Impossible de communiquer avec une application auxiliaire
. Si vous trouvez une bonne approche, n'hésitez pas à commenter.