TUTO - Comment intégrer la detection de mouvement dans Homebridge?

Suite à la nouvelle version sortie hier par notre ami @nebz, des modifications sont apparu pour la partie Camera.
Je vous invite à lire le changelog si ce n’est pas encore fait : https://nebzhb.github.io/jeedom_docs/plugins/homebridge/fr_FR/changelog

Dans ce tutoriel, nous allons voir comment mettre en place la réception de notifications dans l’application Apple Maison lors d’une detection par une détecteur de mouvement.
Merci de bien lire la procédure, tout est indiqué. Si vous faites mal une étape, cela ne fonctionne pas.

Pré-requis :

1/ Configuration dans Homebridge

  1. Aller dans la configuration du plugin Homebridge

  2. Ouvrir « Plateforme Homebridge supplémentaire » qui doit contenir entre autre vos caméras

  3. Définir le port sur lequel Motion va écouter (dans mon exemple le port 36333) au niveau de la plateforme - Penser a verifier que le port que vous choisissez n’est pas déjà utiliser avec la commande (en root) netstat -natp | grep « :36333 »

  4. Configurer pour chaque camera souhaité, le motion (true) et le motionTimeout (1). Vous pouvez configurer le doorbell (true) si votre caméra agit comme un portier video.

  5. Sauvegardez les changements et relancer le démon.

2/ Activation des notifications sur vos caméras

  1. Lancer Apple Maison

  2. Aller sur la/les cameras souhaité

  3. Aller dans la configuration de la caméra (roue crantée)

  4. Aller dans notification et activez les

3/ Informer Homebridge des mouvements détectés

Une version alternative existe pour faire un scénario par caméra, plus simple a appréhender pour certain : TUTO - Comment intégrer la detection de mouvement dans Homebridge? - #2 par mguyard

Maintenant il faut que votre détecteur de mouvement configuré dans Jeedom, alerte Homebridge qu’un mouvement a était détecté.
Pour cela, nous allons utilisé un scénario qui utilisera votre commande de detection de mouvement comme déclencheur.

  1. Créé un nouveau Scenario au nom de votre choix.
  2. Autoriser le multi-lancement (utile si vous pouvez avoir plusieurs détecteurs de mouvement qui se déclencherais en même temps)
  3. Mettre le mode de scénario en Provoqué
  4. Spécifier toutes les commandes de vos détecteurs de mouvement (que vous souhaitez utiliser conjointement avec vos caméras) dans les déclencheurs.

Vous pouvez a ce niveau filter la valeur qui déclenchera le scénario
Exemple : #[Camera][Portail][Notifications]# == 1

  1. Aller dans le scénario et créé un bloc code avec le bouton « Ajouter bloc » en haut à droite
  2. Remplir le bloc code avec le contenu ci-dessous
// Author : Marc GUYARD (mguyard)
// Version : 1.1
// Date : 20201108
// Fonction : Lancer des notifications sur detection de mouvement vers les camera Homebridge

// Indiquez le port que vous avez configuré dans la plateforme Homebridge
$motionPort="36333";

// Crée la relation entre le detecteur et la caméra
// La partie avant => correspond au nom du détecteur dans Jeedom (qui est aussi le déclencheur du scénario)
// La partie après => correspond au nom de la caméra dans la plateforme Homebridge (avec les options motion et doorbell)
$detecteurToCamera = array(
	'Portail' => array(
      	'camName' => 'Caméra Portail',
      	'motion' => true,
      	'doorbell' => true
    ),
    'Terrasse' => array (
      	'camName' => 'Caméra Terrasse',
      	'motion' => true,
      	'doorbell' => true
    )
);

/* -------------------------------------------------------------------------- */
/* NE PAS TOUCHER APRES CETTE LIGNE SANS SAVOIR EXACTEMENT CE QUE VOUS FAITES */
/* -------------------------------------------------------------------------- */

// Recupère la commande TRIGGER (déclenchant le scénario)
$cmd = cmd::byId(str_replace('#', '', $scenario->getRealTrigger()));
$scenario->setLog("Trigger = ".$cmd->getHumanName());
// Recupère la valeur du trigger
$triggerValue = $cmd->execCmd();
$scenario->setLog("Trigger Value = ".$triggerValue);
// Recupère l'ID de l'équipement associé a la commande TRIGGER
$eqLogicId = $cmd->getEqLogic_id();
$eqLogic = eqLogic::byId($eqLogicId);
$detectorName = $eqLogic->getName();
$scenario->setLog("Equipement = ".$detectorName."(".$eqLogic->getId().")");

// Verifie que le detecteur est associé à une camera
if (isset($detecteurToCamera[$detectorName]) && is_array($detecteurToCamera[$detectorName])) {
  $cameraName = $detecteurToCamera[$detectorName]['camName'];
  $scenario->setLog("La caméra HomeBridge notifié est '".$cameraName."'");
  // Lancement de la notification version HomeBridge
  if ($detecteurToCamera[$detectorName]['motion']) {
      $callMotionURL = "http://localhost:".$motionPort."/motion?".rawurlencode($cameraName);
      call($scenario, $callMotionURL);
  }
  if ($detecteurToCamera[$detectorName]['doorbell']) {
      $callDoorbellURL = "http://localhost:".$motionPort."/doorbell?".rawurlencode($cameraName);
      call($scenario, $callDoorbellURL);
  }
} else {
  $scenario->setLog("Aucune caméra trouvée pour le déclencheur '".$detectorName."'");
}

// Fonction d'appel Homebridge
function call($scenario, $callURL) {
  $scenario->setLog("URL called : ".$callURL);
  $motionCall = curl_init();
  curl_setopt($motionCall, CURLOPT_URL, $callURL);
  curl_setopt($motionCall, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($motionCall, CURLOPT_TIMEOUT,        15);
  curl_setopt($motionCall, CURLOPT_CONNECTTIMEOUT, 15);
  $motionCallReturn = curl_exec($motionCall);
  $motionCallHTTPCode  = curl_getinfo($motionCall, CURLINFO_HTTP_CODE);
  curl_close($motionCall);
  // Retourne le résultat dans le log du scénario
  if($motionCallHTTPCode == 200) {
    $scenario->setLog("Homebridge a validé la demande : '".$motionCallReturn."'");
  } else {
    $scenario->setLog("/!\ ERROR : Homebridge a répondu '".$motionCallReturn."' avec code de retour HTTP ".$motionCallHTTPCode);
  }
}

Le code peut sembler complexe (hein @nebz :slight_smile: ) mais il est prévu pour gérer dans un seul scénario toutes vos détecteurs/cameras. Vous pouvez bien évidement faire autrement. Mais celui-ci ne nécessite que peut de changement pour fonctionner.
Les seule choses à modifier sont :

  • La variable $motionPort (ligne 7) : Indiquer le port que vous avez configuré dans l’étape 1.3
  • Le tableau $detecteurToCamera

Le tableau $detecteurToCamera est dans ce format :

'NomDuDetecteur' => array(
      	'camName' => 'NomDeLaCamera',
      	'motion' => true,
      	'doorbell' => true
    )

Il est important d’avoir une virgule entre 2 déclarations de détecteur.
Dans le cas d’une camera seulement :

$detecteurToCamera = array(
	'Portail' => array(
      	'camName' => 'Caméra Portail',
      	'motion' => true,
      	'doorbell' => true
    ) // Pas de virgule ici
);

Pour 3 caméras :

$detecteurToCamera = array(
	'Portail' => array(
      	'camName' => 'Caméra Portail',
      	'motion' => true,
      	'doorbell' => true
    ), // Virgule ici
    'Terrasse' => array (
      	'camName' => 'Caméra Terrasse',
      	'motion' => true,
      	'doorbell' => false
    ), // Virgule ici
    'Patio' => array (
      	'camName' => 'Caméra Patio',
      	'motion' => true,
      	'doorbell' => false
    ) // Pas de virgule ici
);

Pour activer les notifications Motion d’une camera, le motion doit être à true, false dans le cas contraire
Pour activer les notifications Doorbell d’une camera, le doorbell doit être à true, false dans le cas contraire

4/ Test

Passer devant votre détecteur et vous devriez recevoir une notification (ou 2 si vous avez activé motion et doorbell)

et en restant appuyé sur la notification, vous voyez la capture effectuée (si vous cliquez sur la capture vous affichez le live de la caméra).

Dans le cas du Doorbell, vous pouvez aussi voir la notification sur votre AppleTV et avoir un carillon sur votre HomePod

Le scénario génère des logs.
Avant de dire « Ca marche pas à l’aide », regardez les logs et analysez le.

Exemple de log qui marche :

[2020-11-10 12:32:09][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Camera][Portail][Notifications].
[2020-11-10 12:32:09][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-11-10 12:32:09][SCENARIO] Exécution d'un bloc code
[2020-11-10 12:32:09][SCENARIO] Trigger = [Camera][Portail][Notifications]
[2020-11-10 12:32:09][SCENARIO] Trigger Value = NOC-movement
[2020-11-10 12:32:09][SCENARIO] Equipement = Portail(159)
[2020-11-10 12:32:09][SCENARIO] La caméra HomeBridge notifié est 'Caméra Portail'
[2020-11-10 12:32:09][SCENARIO] URL called : http://localhost:36333/motion?Cam%C3%A9ra%20Portail
[2020-11-10 12:32:09][SCENARIO] Homebridge a validé la demande : 'Motion switched on.'
[2020-11-10 12:32:09][SCENARIO] URL called : http://localhost:36333/doorbell?Cam%C3%A9ra%20Portail
[2020-11-10 12:32:09][SCENARIO] Homebridge a validé la demande : 'Doorbell switched on.'
[2020-11-10 12:32:09][SCENARIO] Fin correcte du scénario

ET VOILA !!!

11 « J'aime »

Version alternative du scénario (gère un seul détecteur vers une camera)

Si vous voulez un scénario plus simple :

Maintenant il faut que votre détecteur de mouvement configuré dans Jeedom, alerte Homebridge qu’un mouvement a était détecté.
Pour cela, nous allons utilisé un scénario qui sera appelé lors d’un changement de valeur de votre détecteur de mouvement

  1. Créé un nouveau Scenario au nom de votre choix.
  2. Mettre le mode de scénario en Provoqué
  3. Aller dans le scénario et créé un bloc code avec le bouton « Ajouter bloc » en haut à droite
  4. Remplir le bloc code avec le contenu ci-dessous
// Author : Marc GUYARD (mguyard)
// Version : 1.0
// Date : 20201108
// Fonction : Lancer des notifications sur detection de mouvement vers les camera Homebridge

// Indiquez le port que vous avez configuré dans la plateforme Homebridge
$motionPort="36333";
$cameraName="Caméra Portail";
$motion=true;
$doorbell=true;

/* -------------------------------------------------------------------------- */
/* NE PAS TOUCHER APRES CETTE LIGNE SANS SAVOIR EXACTEMENT CE QUE VOUS FAITES */
/* -------------------------------------------------------------------------- */


// Lancement de la notification version HomeBridge
if ($motion) {
  	$callMotionURL = "http://localhost:".$motionPort."/motion?".rawurlencode($cameraName);
  	call($scenario, $callMotionURL);
}
if ($doorbell) {
	$callDoorbellURL = "http://localhost:".$motionPort."/doorbell?".rawurlencode($cameraName);
  	call($scenario, $callDoorbellURL);
}

// Fonction d'appel Homebridge
function call($scenario, $callURL) {
  $scenario->setLog("URL called : ".$callURL);
  $motionCall = curl_init();
  curl_setopt($motionCall, CURLOPT_URL, $callURL);
  curl_setopt($motionCall, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($motionCall, CURLOPT_TIMEOUT,        15);
  curl_setopt($motionCall, CURLOPT_CONNECTTIMEOUT, 15);
  $motionCallReturn = curl_exec($motionCall);
  $motionCallHTTPCode  = curl_getinfo($motionCall, CURLINFO_HTTP_CODE);
  curl_close($motionCall);
  // Retourne le résultat dans le log du scénario
  if($motionCallHTTPCode == 200) {
    $scenario->setLog("Homebridge a validé la demande : '".$motionCallReturn."'");
  } else {
    $scenario->setLog("/!\ ERROR : Homebridge a répondu '".$motionCallReturn."' avec code de retour HTTP ".$motionCallHTTPCode);
  }
}

Modifiez les éléments suivants :

  • La variable $motionPort (ligne 7) : Indiquer le port que vous avez configuré dans l’étape 1.3
  • La variable $cameraName avec le nom de la caméra dans Homebridge

Attention, il faudra faire un scénario par Camera

  • La variable $motion (true si active / false pour désactiver)
  • La variable $doorbell (true si active / false pour désactiver)

Il faut ensuite lié le lancement du scénario a la commande de votre détecteur de mouvement.
Pour cela, aller dans la configuration de votre commande de détecteur de mouvement, allez dans l’onglet configuration, puis configuré la partie Action sur la valeur

Ainsi, quand la commande de votre détecteur de mouvement va correspondre à la valeur souhaitée (souvent 0 ou 1 mais là c’est dépendant des modules donc à vous de tester), il lancera le scénario qui alertera la caméra spécifié dans le scénario.

3 « J'aime »

Un tout grand merci à toi pour ce tuto, c’est vraiment quelques chose qui me manquait lorsque l’on sonnait à ma porte, d’avoir une capture avec la notification.

Cela fonctionne parfaitement :ok_hand:t2:

Merci à toi et @nebz pour le plugin HomeBridge :wink:

1 « J'aime »

Bonjour,
Merci pour ce super tuto, mais je bloque à la notification, en effet je n’ai pas dans l’app maison l’option: « notifications de mouvement »
Pourtant j’ai bien mis toutes les options à savoir le port d’écoute et les deux options:
« motion »: true,
« motionTimeout »: 1,
Une idée?

EDIT: Pour info cela fonctionne quand même (je n’ai pas de détecteur directement sur la caméra)

C.

Bonjour,

Tu es bien en version iOS au moins en version 13 ?

oui je suis en 14.2

tu peux faire un screen ?

le voici:

T’as bien redémarrer le démon Homebridge après la configuration ?
Tu as bien des motionSensor qui sont apparu dans la meme pièce ?

Ou la aussi, (moi c’est 3 car j’ai mis les switches, mais sinon c’est 1)

1 « J'aime »

oui j’ai bien les capteurs et oui j’ai bien redémarré le démon:

J’avais le même problème, je n’avais pas l’option « notification de mouvement » mais en fait c’était dû au fait que ma sonde était un virtual… j’ai donc ajouté toutes les sondes réelles qui doivent déclencher la notification dans le tableau (array) et cela fonctionne maintenant avec « notification sur cet iPhone » activée.

Bonjour,

J’ai du mal a comprendre pourquoi ?
En effet le tableau est juste la pour relié un détecteur de mouvement avec une camera.
Que ce détecteur soit un équipement ou un virtuel.
Tu as des log avant (virtuel) et après (reel) du scénario que tu peux me partager ?

Logs du scénario avec utilisation d’un virtuel d’alarme: on voit qu’il ne trouve pas la caméra:

*[2020-11-09 17:54:01][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Etage][Camera mezzanine][Mouvements].*
*[2020-11-09 17:54:01][SCENARIO] Exécution du sous-élément de type [condition] : if*
*[2020-11-09 17:54:01][SCENARIO] Evaluation de la condition : [1 == 1  OU 0 == 1  ] = Vrai*
*[2020-11-09 17:54:01][SCENARIO] Exécution du sous-élément de type [action] : then*
*[2020-11-09 17:54:01][SCENARIO] Exécution de la commande [Etage][Alarme mezzanine][On]*
*[2020-11-09 17:54:01][SCENARIO] Exécution d'un bloc élément : 557*
*[2020-11-09 17:54:01][SCENARIO] Exécution du sous-élément de type [action] : code*
*[2020-11-09 17:54:01][SCENARIO] Exécution d'un bloc code*
*[2020-11-09 17:54:01][SCENARIO] Trigger = [Etage][Caméra mezzanine][Mouvements]*
*[2020-11-09 17:54:01][SCENARIO] Trigger Value = 0*
*[2020-11-09 17:54:01][SCENARIO] Equipement = Caméra mezzanine(257)*
*[2020-11-09 17:54:01][SCENARIO] La caméra HomeBridge notifié est ''*
*[2020-11-09 17:54:01][SCENARIO] Fin correcte du scénario*

Code:
$detecteurToCamera = array(
‹ Alarme mezzanine › => array(
‹ camName › => ‹ Caméra Mezzanine ›,
‹ motion › => true,
‹ doorbell › => false
)
);

Je précise que je mettais [Alarme mezzanine] à 1 juste avant d’executer le code

Et la j’ai remplacé le virtuel par les 2 sondes qui déterminent l’état du virtuel

*[2020-11-09 18:04:42][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Etage][Camera mezzanine][Mouvements].*
*[2020-11-09 18:04:42][SCENARIO] Exécution du sous-élément de type [condition] : if*
*[2020-11-09 18:04:42][SCENARIO] Evaluation de la condition : [1 == 1  OU 0 == 1  ] = Vrai*
*[2020-11-09 18:04:42][SCENARIO] Exécution du sous-élément de type [action] : then*
*[2020-11-09 18:04:42][SCENARIO] Exécution de la commande [Etage][Alarme mezzanine][On]*
*[2020-11-09 18:04:42][SCENARIO] Exécution d'un bloc élément : 557*
*[2020-11-09 18:04:42][SCENARIO] Exécution du sous-élément de type [action] : code*
*[2020-11-09 18:04:42][SCENARIO] Exécution d'un bloc code*
*[2020-11-09 18:04:42][SCENARIO] Trigger = [Etage][Caméra mezzanine][Mouvements]*
*[2020-11-09 18:04:42][SCENARIO] Trigger Value = 0*
*[2020-11-09 18:04:42][SCENARIO] Equipement = Caméra mezzanine(257)*
*[2020-11-09 18:04:42][SCENARIO] La caméra HomeBridge notifié est 'Caméra Mezzanine'*
*[2020-11-09 18:04:42][SCENARIO] URL called : http://localhost:36333/motion?Cam%C3%A9ra%20Mezzanine*
*[2020-11-09 18:04:42][SCENARIO] Homebridge a validé la demande : 'Motion switched on.'*
*[2020-11-09 18:04:42][SCENARIO] Fin correcte du scénario*

Code:
$detecteurToCamera = array(
‹ Caméra mezzanine › => array(
‹ camName › => ‹ Caméra Mezzanine ›,
‹ motion › => true,
‹ doorbell › => false
),
‹ Sonde mezzanine plafond › => array(
‹ camName › => ‹ Caméra Mezzanine ›,
‹ motion › => true,
‹ doorbell › => false
)
);

Mais maintenant que j’y pense, c’est peut-être lié au Trigger !? vu que mon virtuel ne correspond pas au trigger

En effet, tu mettait en trigger l’équipement « Alarme mezzanine » alors que c’était « Caméra mezzanine »

1 « J'aime »

Je viens de mettre à jour le scénario en v1.1 dans le 1er sujet pour afficher un log si on trouve pas le détecteur dans le tableau (et par conséquence on trouvera pas la caméra associé)
Ce qui était ton cas @methraton

@methraton tu disais avoir ajouté une condition dans le scénario.
Le plus propre c’est de faire ca : image

:+1: Tu peux aussi simplement ajouter un commentaire dans ton code indiquant que le nom doit correspondre au trigger du scénario

Le détecteur de mouvement est obligatoirement le trigger. Ca coule de source
Sinon comment le scénario se lancerait.
C’est justement parce que le détecteur de mouvement a changé de statut que le scénario se lance.
A partir de là, le scénario cherche la caméra associé au détecteur de mouvement (qui du coup est le déclencheur du scénario) pour demander a Homebridge de notifier les iPhone.