Pilotage des Cameras IMOU

Bonjour la communauté.

Je vous partage mes scripts de pilotage pour les caméras Imou.

Je cherchai le moyen d’activer automatiquement la caméra quand je sors de chez moi (et la désactiver quand je rentre).

Après avoir cherché par des plug in Jeddom et command web je me suis tournée vers les API clound IMOU.

Je ne suis pas développeur. Désolé les scripts sont certainement très mal écrits, mais fonctionnent chez moi depuis 4 mois.

Vous devez ouvrir un compte développeur gratuit sur Imou cloud Imou Life Open API , récupérer votre appId, appSecret, deviceID (numero de serie)

et renseigner dans les scripts les valeurs pour appId, appSecret, deviceID et CamPass (en dessous de la cam).

Bien entendu les scripts doivent être adaptés à votre besoin. Toutes les commandes sont disponibles ici Development specification · Development documentation

J’ai passé beaucoup de temps pour trouver cette solution, j’espère que ça pourra vous servir.

00-WebCamSalonOFF.php.log (5,8 Ko)

00-WebCamSalonON.php.txt (8,4 Ko)

4 « J'aime »

Super !
Enfin une avancée pour ces caméras.

Merci pour le travail et le partage.

Bonjour,
Super boulot…
J’arrive bien a ouvrir et fermer la caméra et éteindre et allumer la LED. Cependant je n’arrive pas a activer/désactiver la détection de mouvement ( ni la détection d’humanoïde ! ) Auriez vous une idée de ce que je rate ?
Le modèle est « Rex 3D 3MP »

Bonjour Ambass

J’ai utilisé API d’appelle générique setDeviceCameraStatus
la liste des switch est ici Device capability switch · Development documentation
Vous trouverez dans mon script le code complet pour activer la détection de mouvement.


////////////////////////////////////////
//           SET MOTION DETECTION     //
////////////////////////////////////////

$url = $APIurl.'setDeviceCameraStatus' ;

$params = [
		'enableType'=>'motionDetect',
        	'enable'=>true,
        	'deviceId'=>$deviceID,
        	'channelId'=>'0',
        	'token'=>$openidToken
];

$system = CreatSystemParams ($appId,$appSecret);

$data = json_encode([
	'system'=>empty($system)? new stdClass():$system,
  	'params'=>empty($params)? new stdClass():$params,
  	'id'=>'08'
]);

$ret = curl_post($data, $url);
$utf8 = iconv('utf-8', 'UTF-8', $ret);
//echo '<br>MOTION DETECTION  RESULT:<br>'.nl2br($utf8 ).'<br>';

////////////////////////////////////////
//         SET HUMAM DETECTION        //
////////////////////////////////////////

$url = $APIurl.'setDeviceCameraStatus' ;

$params = [
		'enableType'=>'headerDetect',
        	'enable'=>true,
        	'deviceId'=>$deviceID,
        	'channelId'=>'0',
        	'token'=>$openidToken
];

$system = CreatSystemParams ($appId,$appSecret);

$data = json_encode([
	'system'=>empty($system)? new stdClass():$system,
  	'params'=>empty($params)? new stdClass():$params,
  	'id'=>'09'
]);

$ret = curl_post($data, $url);
$utf8 = iconv('utf-8', 'UTF-8', $ret);
//echo '<br>SET HUAMAN DETECTION RESULT:<br>'.nl2br($utf8 ).'<br>';

Autrement il y a aussi des API spécifiques plus directe et dédié a la gestion de l’alarme et détection de mouvement.
[Equipment dynamic inspection configuration · Development documentation]

Bonjour,
on dirait que ça avance un peu, mais hélas, un peu compliqué pour moi.
Est-ce que quelqu’un pourrait me dire si c’est possible de piloter les mouvements de la caméra à l’aide d’une commande envoyée par jeedom? Quelle serai(en)t-elle(s)?
Et positionner 1, 2 ou 3 PTZ.

Merci de votre aide.
Bob :slight_smile:

Bonjour,
merci beaucoup pour ce code !
par contre je n’arrive pas à trouver une info :
comment récupérer l’info quand la caméra a détecté un mouvement ?

merci beaucoup pour votre retour

Bonjour, je dispose de camera IMOU que je souhaiterais intégrer de votre façon. Mais étant très débutant je n’arrive pas à recréer vos scripts.
Pourriez-vous me dire de comment vous remplissez les champs dans le plugin script.
Merci d’avance.

Bonsoir,

Pas besoin du plugin script. Le plus simple est de créer un virtuel pour chaque caméra et de mettre le script PHP de @ripod dans un bloc code d’un scénario. Ça fonctionne tel quel.

J’ai légèrement adapté le script pour :
– récupérer le deviceID et le campass de la caméra qui déclenche le scénario ;
– lancer la commande virtuelle cacher, montrer, redémarrer la caméra ;
– déplacer la vue vers le haut, bas, droite ou gauche…

Ce dernier point est moyennement utilisable compte tenu de la latence.

Avec juste deux scénarii, un pour cacher/montrer et l’autre pour le PT sans le Z car mes cameras ne le gèrent pas, je peux gérer autant de cameras que je veux.

Je vais essayer de détailler tout ça de façon claire durant le weekend.

Super merci de votre réponse.

Tout d’abord, merci à @ripod qui a fourni l’essentiel du code utilisé ici, je me suis contenté d’adapter cela à mes besoins propres. Il est possible d’ajouter certaines fonctionnalités de l’API en fonction des besoins. Notamment, dans mon implémentation il est facile, depuis l’app téléphone ou pécé, de modifier l’état d’une caméra sans que cela ne soit remonté dans Jeedom. Dans l’idéal, il faudrait interroger l’API pour connaitre l’état de la caméra et le répercuter dans Jeedom. Cela ne correspondait pas à mes besoins immédiats mais reste envisageable pour une prochaine évolution.

Pour la vidéo, les cameras sont installées dans le plugin-camera.

Dans le plugin-virtual créer un virtuel nommé imouApi avec deux infos texte/autre : appId et appSecret. Ce virtuel doit être placé dans une pièce/objet nommée Système pour être retrouvé par les scripts (ce serait à améliorer pour retrouver ce virtuel peu importe l’objet dans lequel il est rangé…)


Créer ensuite un virtuel pour chaque camera (le plus simple étant d’en créer un puis de le dupliquer et changer le peu qui doit l’être) avec :
— deux infos texte/autre nommées deviceID et CamPass (le nom doit être respecté y compris la casse car utilisé pour retrouver les infos dans le scenario). Elles doivent être renseignées avec les valeurs propres à la caméra ;
— deux infos numériques nommées state et move (en minuscules idem ci-dessus) ;


— trois commandes action/défaut modifiant l’info state et nommées on, off et reboot (le nom a normalement moins de contraintes car non utilisé dans le scenario) ;

— quatre commandes action/défaut nommées up, down, left et right affectant respectivement les valeurs 0, 1, 2 et 3 à l’info move.

Coté scenario, en créer un provoqué qui se lance selon les changements d’état des différentes infos state :

Le scenario comprend un unique bloc code dans lequel il faut coller le script de @ripod légèrement modifié :
— au début, je récupère l’objet qui a déclenché le scénario ainsi que ses différentes informations (cdeviceId et camPass) et la valeur de state ou move selon le scenario) :

$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$cmd = cmd::byString($trigger);
$cmd_mame = $cmd->getName();
$eqLogicName = $cmd->getEqLogic()->getName();
$eqLogic = eqLogic::byId($cmd->getEqLogic()->getId());
$object = $eqLogic->getObject()->getName();
$cmd_value = $cmd->execCmd();

//$scenario->setLog($object); // nom de l'objet
//$scenario->setLog($eqLogicName); // nom de l'équipement
//$scenario->setLog($cmd_mame); // nom de la commande Info
//$scenario->setLog($cmd_value); // valeur de la commande Info
$deviceId=cmd::byString("#[$object][$eqLogicName][deviceID]#")->execCmd();
$camPass=cmd::byString("#[$object][$eqLogicName][CamPass]#")->execCmd();
//$scenario->setLog(cmd::byString("#[$object][$eqLogicName][deviceID]#")->execCmd());


$appId=cmd::byString("#[Système][imouApi][appId]#")->execCmd();
$appSecret=cmd::byString("#[Système][imouApi][appSecret]#")->execCmd();
$deviceID=$deviceId;
$CamPass=$camPass;
$SubAccount="12345674567";
$APIurl = 'https://openapi-fk.easy4ip.com:443/openapi/';

et plus loin (ligne 173 et suivantes) :


switch ($cmd_value) {    // Selon la valeur de la commande qui a déclenché...
  case 0:               // Cache l'objectif
	$url = $APIurl.'setDeviceCameraStatus' ;
    $params = [
		'enableType'=>'closeCamera',
        'enable'=>true,
        'deviceId'=>$deviceID,
        'channelId'=>'0',
        'token'=>$openidToken
	];
	break;

  case 1: 				// Active l'objectif
	$url = $APIurl.'setDeviceCameraStatus' ;
    $params = [
		'enableType'=>'closeCamera',
        'enable'=>false,
        'deviceId'=>$deviceID,
        'channelId'=>'0',
        'token'=>$openidToken
	];
	break;
    
  case -1:				// Reboot la caméro
    $url = $APIurl.'restartDevice' ;

	$params = [
//		'enableType'=>'closeCamera',
//      'enable'=>true,
        'deviceId'=>$deviceID,
		//        	'channelId'=>'0',
        'token'=>$openidToken
	];
	break;
}
$system = CreatSystemParams ($appId,$appSecret);

Pour les mouvements de caméra, créer un deuxième scenario avec comme déclencheur les changements des informations move des cameras :

Les modifications par rapport au script d’@ripod sont aux mêmes endroits.
Les déplacements de caméra sont quand même très lents (plusieurs longues secondes), j’ai réglé la variable vitesse à 250 ms qui m’a semblé correspondre à la réactivité que je pouvais supporter, cela peut être réglé directement dans le code PHP :
$vitesse=250; // durée du mouvement en millisecondes

Dans le cas du redémarrage de la caméra, afin d’avoir un affichage correct de l’état (voir widget plus loin) dans Jeedom, j’ai ajouté une remise à 1 au bout d’une minute quand state est forcé à -1 :

Pour un affichage sympa (du moins selon mes goûts personnels et sans y passer des heures) j’ai créé un widget (menu Outils/Widgets) :
image

La dernière ligne, <i class='icon kiko-reload-arrow icon_orange flashes'></i>, flashes est la reprise de @Phpvarious dans ce post.

Je me sers essentiellement des commandes d’activation/désactivation de certaines caméras en fonction des personnes présentes ou non dans la maison plugin-networks ou quand la caméra n° 5 n’affiche plus rien (c’est la seule à qui cela arrive) pour la redémarrer…

Dans mon design principal j’ajoute juste la commande state pour chaque caméra, avec ouverture au survol de l’équipement virtuel de la camera, cela donne :
image
ou
image

Code pour les scenarii à copier/coller dans les blocs codes correspondant :
scenario_imoü_api.txt (7,5 Ko)
scenario_imoü_api_ptz.txt (6,9 Ko)

Bonsoir,
merci beaucoup pour ce tuto et le travail réalisé. Pour qu’il fonctionne chez moi il faut que je renseigne appID et appSecret directement dans le script.
Je vais essayer de mettre en place un scénario pour que les caméras s’activent et se désactivent avec le statut de l’alarme.

Pour qu’il fonctionne chez moi il faut que je renseigne appID et appSecret directement dans le script.

Effectivement, j’avais zappé ce point, la mise en place remontant déjà à quelques semaines :frowning:

J’avais créé un virtuel avec ces infos pour ne pas avoir à les répéter pour chaque caméra (ce serait aussi un moyen simple de gérer ces données).

J’ai mis à jour le tuto.

Grace à vous, je peux commander mes caméras de la marque IMOU en fonction de l’état de mon alarme. Juste si on veut contrôler plusieurs caméras dans un scénario, bien penser à mettre un « sleep » entre chaque action de caméra car sinon seule la première commande est envoyée.

Effectivement, j’ai mis un wait de 15 secondes entre les caméras.

Dans ton scénario, tu peux rajouter un sinon dans ton premier si et y déplacer l’activation de tes cameras.

Ça ne changera pas fondamentalement le fonctionnement ni la vitesse d’exécution. Mais dans un scénario plus complexe ça permet une meilleure lisibilité.