Tuto Zipabox: Faire un snapshot via votre caméra de surveillance
Il y’a encore peu de temps, il était possible d’utiliser la fonction « snapshot » dans l’éditeur de règle de la Zipabox, seulement cette fonction bien pratique à été dépréciée avec le nouveau firmware 🙁
Nous allons voir ensemble comment y remédier avec PHP.
Les pré-requis:
- Disposer d’une caméra IP de marque Foscam ou Ebode (les autre marque n’ayant pas été testées)
- disposer d’un serveur web acceptant PHP 5 (voir aussi cet article de Vincent : Tuto: héberger les scripts PHP sur son Raspberry).
1 – Le script PHP
Le fonctionnement du script est assez simple:
- Envois de la commande de snapshot à la caméra,
- Récupération et stockage de l’image reçue,
- Envois de l’image à la Zipabox via FTP.
Le code lui est légèrement plus compliqué car il permet de logger le déroulement du processus, et de paramétrer les point suivants:
- Timeout de la connexion FTP,
- Nombre de tentative de login,
- Nombre d’image à capturer,
- Délais entre les capture,
- « Source » appelant le script (pour plus de clarté dans le log).
Je ne vais pas détailler tout le code car les commentaires sont assez explicites :
<?php /*************************************************************************************** * * Script: snapshot_to_zipabox.php * * Auteur: Sébastien Albrech * * Version: v 1.10 * * Date de mise en production: 13/06/2013 * * Description: Créer un snapshop depuis une caméra IP et l'envois à la Zipabox * via FTP * * Paramètres: call_source [optionel] -> Source appelant le script ex= régles * zipabox, actioneur, etc.. * * nb_shoot [optionel] -> nombre de prises de vue * * shoot_interval [optionel] -> délais enchaque prise de vue * *************************************************************************************/ // Définition de l'encodage header('Content-Type: text/html; charset=ISO-8859-1 '); // Config de la caméra IP $cam_user = 'zipabox'; $cam_password = 'xxxxxxx'; $camera_ip= 'aa.bb.cc.dd:port'; $snapshot_url_parameters = 'snapshot.cgi'; $status_url_parameters = 'get_status.cgi'; // Config de la Zipabox $zipabox_FTP_server = 'my.zipato.com'; $zipabox_FTP_user = 'yyyyyyyyyyyyy'; $zipabox_FTP_password = 'zzzzzzzzzzzzz'; $zipabox_FTP_folder = 'alarm'; $zipabox_FTP_port = '21'; $FTP_timeout = '90'; // timeout de connexion FTP en secondes $FTP_max_login_retry = 5; // ########################################### DEBUT DU SCRIPT ############################################ // Initialisation des variables $enable_logging = true; $log_file = "snapshot_to_zipabox_fr.log"; $snapshot_url = 'http://' . $cam_user . ':' . $cam_password . '@' . $camera_ip . '/' . $snapshot_url_parameters; $cam_status_url = 'http://' . $cam_user . ':' . $cam_password . '@' . $camera_ip . '/' . $status_url_parameters; // Récupération du nom de la caméra $camera_name = get_cam_alias(); // Récupération et traitement des paramètres d'url if (isset($_GET[call_source])) { $call_source = utf8_decode($_GET[call_source]); $log_buffer = date('d/m/y H:i:s') . " Début de la capture depuis $camera_ip ($camera_name) initié par '" . $call_source . "'" . chr(13); } else { $nb_shoot = 1; $log_buffer = date('d/m/y H:i:s') . " Début de la capture depuis $camera_ip ($camera_name)" . chr(13); } if (isset($_GET[nb_shoot])) { $nb_shoot = $_GET[nb_shoot]; } else { $nb_shoot = 1; } if (isset($_GET[shoot_interval])) { $shoot_interval = $_GET[shoot_interval]; } else { $shoot_interval = 0; } // Connexion au serveur FTP $ftp = ftp_connect($zipabox_FTP_server, $zipabox_FTP_port); add_to_log_buffer($ftp, "Connexion au FTP $zipabox_FTP_server"); // Login FTP for ($i = 1; $i <= $FTP_max_login_retry; $i++) // comme il arrive que le login echoue, on fait plusieures tentatives { $ftp_login_res = ftp_login($ftp, $zipabox_FTP_user, $zipabox_FTP_password); add_to_log_buffer($ftp_login_res, "Authentification sur le FTP $zipabox_FTP_server [login: $zipabox_FTP_user | pass: $zipabox_FTP_password] (tentative $i sur $FTP_max_login_retry) "); if ($ftp_login_res == true) // si le login a réussit { // Ouverture du repertoire alarmde la zipabox $ch_dir_res = ftp_chdir($ftp, $zipabox_FTP_folder); add_to_log_buffer($ch_dir_res, "Ouverture du dossier '$zipabox_FTP_folder' sur $zipabox_FTP_server"); // Désactivation du mode passif $res_ftp_mode = ftp_pasv($ftp, false); add_to_log_buffer($res_ftp_mode, "Désactivation du mode passif FTP"); // ajout d'une info au log $log_buffer .= date('d/m/y H:i:s') . " INFO -> snapshot URL: $snapshot_url" . chr(13); // Prises de vue et upload des images for ($i = 1; $i <= $nb_shoot; $i++) { $temp_file_name = "snapshot_" . $i . ".jpg"; $FTP_filename = $camera_name . date('_d-m-y_H-i-s') . '.jpg'; $image_from_browser = file_get_contents($snapshot_url); // on met en mémoire le flux http add_to_log_buffer($image_from_browser, "Mise en mémoire du snapshot $i/$nb_shoot"); $download_res = file_put_contents($temp_file_name,$image_from_browser); // on ecrit le flux dans un fichier jpg add_to_log_buffer($download_res, "Sauvegarde du snapshot $i/$nb_shoot dans le fichier temporaire '$temp_file_name'"); // Upload de l'image sur le FTP zipato $upload_res = ftp_put($ftp, $FTP_filename, $temp_file_name, FTP_BINARY); add_to_log_buffer($upload_res, "Uploading de '$temp_file_name' vers '$FTP_filename' sur " . $zipabox_FTP_server . '/' . $zipabox_FTP_folder); // Suppression de l'image temporaire $res_remove_file = unlink($temp_file_name); add_to_log_buffer($res_remove_file, "Suppression de l'image temporaire $temp_file_name"); sleep($shoot_interval); } // Déconnexion du FTP $close_ftp_res = ftp_close($ftp); add_to_log_buffer($close_ftp_res, "Déconexion du FTP $zipabox_FTP_server"); break; // on sort de la boucle "for" car le login et le tranphert FTP sont ok } } // Ecriture du log if ($enable_logging == true) { $log_buffer .= date('d/m/y H:i:s') . " Fin de la capture" . chr(13) . '------------------------------------------------------------------------------------------------------------------------------------------' . chr(13); file_put_contents($log_file, $log_buffer, FILE_APPEND); echo "<b>Paramètres:</b><br> <ul> <li>Source appelante: $call_source</li> <li>Nombre de prise de vue: $nb_shoot</li> <li>Inteval de prise de vue: $shoot_interval Seconde(s)</li> </ul> <b>Résultat de la capture:</b> <br><br>" . nl2br($log_buffer); } // *************************************** FONCTIONS ******************************************* // Cette fonction ajoute une entrée au buffer du log function add_to_log_buffer($value_to_test, $str_to_add) { global $log_buffer; if ($value_to_test != false) { $log_buffer .= date('d/m/y H:i:s') . " $str_to_add => OK" . chr(13); } else { $log_buffer .= date('d/m/y H:i:s') . " $str_to_add => ECHEC" . chr(13); } } // Cette fonction récupère toute les infos système de la caméra et retourne son alias (nom) function get_cam_alias() { global $cam_status_url; $camera_info_from_browser = file_get_contents($cam_status_url); // on met en mémoire le flux http $temp_arr = explode(";", $camera_info_from_browser); foreach($temp_arr as $temp_key => $temp_value) { $key = trim(substr($temp_value, 4, strpos($temp_value, '=') - 4)); $value = substr($temp_value, strpos($temp_value, '=') + 1); $arr_cam_info[$key] = $value; } return str_replace("'", "", $arr_cam_info[alias]); } ?>
Le script est téléchargeable aussi ICI
Pour que le script fonctionne, il va falloir lui renseigner les paramètres de la caméra ainsi que les paramètres FTP de la Zipabox:
a) Paramètre de la caméra IP
– Connectez-vous sur le serveur web de configuration de votre caméra (voir manuel de la caméra)
– Allez dans la partie « utilisateur » ex sur ebode: « Système -> Propriétés Utilisateurs », et créer un nouvel administrateur »:
– Rebooter la caméra IP.
– Éditez le script php et remplacez-y les valeurs de configuration de la caméra (voir ci-dessous):
$cam_user = ‘zipabox’; Nom du nouvel admin de la caméra
$cam_password = ‘xxxxxxxxx’; Mot de passe du nouvel admin de la caméra
$camera_ip= ‘aa.bb.cc.dd:port’; Adresse IP et port de la caméra
Remarque: Si votre script est hébergé sur un serveur externe, vous devez renseigner l’IP externe de la caméra et avoir configuré un routage du port de la caméra sur votre routeur/box ADSL affin que cette dernière soit accessible de l’extérieur.
b) Paramètre FTP de la zipabox
– Connectez-vous sur my.zipato.com
– Cliquez sur l’icône de configuration correspondant à votre caméra
– Éditez le script php et remplacez-y les valeurs de configuration de la Zipabox (voir ci-dessous) par celles données par la Zipabox (encadrées rouge):
$zipabox_FTP_server = ‘my.zipato.com’;
$zipabox_FTP_user = ‘xxxxxxxxxxxxxxxxxxx’;
$zipabox_FTP_password = ‘yyyyyyyyyyyyyyyyyyy’;
$zipabox_FTP_folder = ‘/alarm/’;
Cela étant fait nous allons pourvoir tester notre script dans un browser.
Pour cela il suffit d’appeler l’URL du script ex « http://www.maison-de-geek/snapshot_to_zipabox.php »
(http://192.168.1.21/snapshot_to_zipa.php, si vous l’avez hébergé sur votre Raspberry).
et d’ouvrir le log dans un autre onglet/fenetre via l’url : http://www.maison-de-geek/snapshot_to_zipabox.log »
La consultation du fichier « .log », vous permettra de pourvoir consulter le bon déroulement du script :
– Retournez sur le dashboard de votre Zipa, retournez dans le widget des caméras et consultez le dossier des prises de vue.
Et là votre cliché apparait !!
*** INFO *** :
Avec le script, il est possible de passer des paramètres, tel que :
- Nombre de prise de vue avec le paramètre nb_shoot,
- Le délais entre deux prise de vue (en secondes) avec le paramètre shoot_interval,
- La source qui appelle le script avec le paramètre call_source (Veillez a mettre des ‘_’ a la place des espaces).
le format de l’appel est le suivant:
http://votre_serveur/snapshot_to_zipabox_fr.php?call_source=test&multishoot&nb_shoot=6&shoot_interval=10
Prenons un exemple concret
Nous voulons déclencher une capture de 10 photos à raison de une toutes les 5 secondes via un « virtual switch » de la zipabox nommé « snapshot caméra 1 » et nous voulons voir le nom du switch affiché dans le log.
L’url à appeler est donc http://votre_serveur/snapshot_to_zipabox_fr.php?call_source=Snapshot_caméra_1&multishoot&nb_shoot=10&shoot_interval=5
(Remplacez le votre_serveur par l’IP de votre où est hébergé le script)
et le log suivant sera renvoyé:
Paramètres: Source appelante: Snapshot_camera_1 Nombre de prise de vue: 10 Inteval de prise de vue: 5 Seconde(s) Résultat de la capture: 13/06/13 10:29:45 Début de la capture depuis aa.bb.cc.dd:81 (Camera1) initié par 'Snapshot_camera_1' 13/06/13 10:29:47 Connexion au FTP my.zipato.com => OK 13/06/13 10:29:47 Authentification sur le FTP my.zipato.com [login: xxxxxxxxx | pass: yyyyyyyy] (tentative 1 sur 5) => OK 13/06/13 10:29:48 Ouverture du dossier 'alarm' sur my.zipato.com => OK 13/06/13 10:29:48 Désactivation du mode passif FTP => OK 13/06/13 10:29:48 INFO -> snapshot URL: http://zipabox:xxxxxxxxxk@aa.bb.cc.dd:81/snapshot.cgi 13/06/13 10:29:49 Mise en mémoire du snapshot 1/10 => OK 13/06/13 10:29:49 Sauvegarde du snapshot 1/10 dans le fichier temporaire 'snapshot_1.jpg' => OK 13/06/13 10:29:49 Uploading de 'snapshot_1.jpg' vers 'Camera1_13-06-13_10-29-48.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:29:49 Suppression de l'image temporaire snapshot_1.jpg => OK 13/06/13 10:29:55 Mise en mémoire du snapshot 2/10 => OK 13/06/13 10:29:55 Sauvegarde du snapshot 2/10 dans le fichier temporaire 'snapshot_2.jpg' => OK 13/06/13 10:29:55 Uploading de 'snapshot_2.jpg' vers 'Camera1_13-06-13_10-29-54.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:29:55 Suppression de l'image temporaire snapshot_2.jpg => OK 13/06/13 10:30:01 Mise en mémoire du snapshot 3/10 => OK 13/06/13 10:30:01 Sauvegarde du snapshot 3/10 dans le fichier temporaire 'snapshot_3.jpg' => OK 13/06/13 10:30:02 Uploading de 'snapshot_3.jpg' vers 'Camera1_13-06-13_10-30-00.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:02 Suppression de l'image temporaire snapshot_3.jpg => OK 13/06/13 10:30:08 Mise en mémoire du snapshot 4/10 => OK 13/06/13 10:30:08 Sauvegarde du snapshot 4/10 dans le fichier temporaire 'snapshot_4.jpg' => OK 13/06/13 10:30:08 Uploading de 'snapshot_4.jpg' vers 'Camera1_13-06-13_10-30-07.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:08 Suppression de l'image temporaire snapshot_4.jpg => OK 13/06/13 10:30:14 Mise en mémoire du snapshot 5/10 => OK 13/06/13 10:30:14 Sauvegarde du snapshot 5/10 dans le fichier temporaire 'snapshot_5.jpg' => OK 13/06/13 10:30:14 Uploading de 'snapshot_5.jpg' vers 'Camera1_13-06-13_10-30-13.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:14 Suppression de l'image temporaire snapshot_5.jpg => OK 13/06/13 10:30:21 Mise en mémoire du snapshot 6/10 => OK 13/06/13 10:30:21 Sauvegarde du snapshot 6/10 dans le fichier temporaire 'snapshot_6.jpg' => OK 13/06/13 10:30:21 Uploading de 'snapshot_6.jpg' vers 'Camera1_13-06-13_10-30-19.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:21 Suppression de l'image temporaire snapshot_6.jpg => OK 13/06/13 10:30:27 Mise en mémoire du snapshot 7/10 => OK 13/06/13 10:30:27 Sauvegarde du snapshot 7/10 dans le fichier temporaire 'snapshot_7.jpg' => OK 13/06/13 10:30:27 Uploading de 'snapshot_7.jpg' vers 'Camera1_13-06-13_10-30-26.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:27 Suppression de l'image temporaire snapshot_7.jpg => OK 13/06/13 10:30:33 Mise en mémoire du snapshot 8/10 => OK 13/06/13 10:30:33 Sauvegarde du snapshot 8/10 dans le fichier temporaire 'snapshot_8.jpg' => OK 13/06/13 10:30:34 Uploading de 'snapshot_8.jpg' vers 'Camera1_13-06-13_10-30-32.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:34 Suppression de l'image temporaire snapshot_8.jpg => OK 13/06/13 10:30:40 Mise en mémoire du snapshot 9/10 => OK 13/06/13 10:30:40 Sauvegarde du snapshot 9/10 dans le fichier temporaire 'snapshot_9.jpg' => OK 13/06/13 10:30:40 Uploading de 'snapshot_9.jpg' vers 'Camera1_13-06-13_10-30-39.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:40 Suppression de l'image temporaire snapshot_9.jpg => OK 13/06/13 10:30:46 Mise en mémoire du snapshot 10/10 => OK 13/06/13 10:30:46 Sauvegarde du snapshot 10/10 dans le fichier temporaire 'snapshot_10.jpg' => OK 13/06/13 10:30:46 Uploading de 'snapshot_10.jpg' vers 'Camera1_13-06-13_10-30-45.jpg' sur my.zipato.com/alarm => OK 13/06/13 10:30:46 Suppression de l'image temporaire snapshot_10.jpg => OK 13/06/13 10:30:51 Déconexion du FTP my.zipato.com => OK 13/06/13 10:30:51 Fin de la capture
2 – Utilisation du script php avec la Zipa
Bon maintenant que nous avons le script, qu’il est hébergé, que vous connaissez son adresse d’activation, nous allons maintenant intégrer la prise de photo dans le créateur de règle.
Pour cela créez une règle avec un déclencheur, puis dans les actions, ajoutez la requête HTTP en utilisant la méthode GET, et dans l’URL, collez l’URL permettant d’activer votre script. (Comme vu plus haut, n’hésitez pas à coller l’URL personnalisée, avec les options que vous aurez choisies).
Voici la règle correspondante à notre exemple:
Autre exemple bien concret pour les heureux processeur de la sonnette Eversping UTSE03A (voir la présentation de ezpato.fr)
la règle ci dessous prend une photo lorsque l’on sonne à la porte
Et voilà, maintenant vous n’avez plus qu’à en abuser !!
Un merci à Vincent (le taulier), pour sont aide dans la rédaction de ce tuto, ces tests et ses suggestions qui on bien aider à l’élaboration du script.
Bonne journée à tous !
Encore un tres bon tuto ! Pour ma part j ai un peu laisser tomber. Ca devient plus que penible d avoir des fonctions qui apparaissent et disparaissent dans les versions suivantes, et tout ca sans la moindre info… Cette box me decoit de plus en plus au final.
C’est mais c’est un jeune produit, il doit murir encore pour se stabiliser. On essuie les platres mais c’est pour la bonne cause (j’espere lol)
Merci .
Fonctionne parfaitement sur Raspberry+Zibase
Juste un petit problème de droit corrigé ( ligne 128 ) en créant un sous dossier /var/www/temp ( chmod 777 ) sur le raspberry + ajouter à $temp_file_name (ligne 122 ) –> $temp_file_name = « temp/snapshot_ » . $i . « .jpg »;. !
Merci a toi pour le feedback sur zibase et pour la maj du scipt 🙂
Bonjour
Merci pour cet excellent article. Étant débutant dans la domotique et ayant l’intention d’achat une zipabox, je souhaiterai savoir s’il est possible d’héberger le script php sur un serveur extérieur comme par exemple à la racine de mon site perso hébergé chez free
Merci par avance
Oui sans aucun probleme pour l’hebergement exterieur si php est geré (chez free pas de soushis).
Tu devra aussi configurer ton routeur pour que la camip soit accessible de l’exterieur, je ferais un toto pour exliquer comment on fai cela avec une freebox revolution d’ici quelques semaines
Merci Sébastien pour ta disponibilité.
Christophe
Bonjour,
Est il possible de réaliser une sonnette intelligente avec ton script. je m’explique, un coup de sonnette, la zipabox donne l’ordre de capturer une image de la personne à la porte et de l’envoyer par email.
En fait, y a t il un moyen d’attacher un image à un email envoyé par une zipabox ?
Merci par avance pour votre aide.
Salut, je n’ai plus de zipabox donc je ne peux pas te dire pour le mail. Sur la eedomus je confirme qu’on peux associer la photo d’une cam au mail de notification d’une règle.
concernant la sonnette, si tu as l’everspring (UTSE03A) par exemple tu peux tester « carillon playing » dans tes règle et déclencher la prise de photos, c’est d’ailleurs pour cela que j’avais écris ce script au départ.
a+
Bonjour Sebastien
Je vois que tu es passée sur eedomus. J’ai zipabox et je suis un peu déçu de la gestion des cameras . De plus si on regarde plus précisément l’interface nous voyons que dans le futur que le stockage des image sera payant. Est ce que l’eedomus est un emilleur produit ? Qu’en penses tu ?
Bonjour,
oui effectivement j’ai vendu ma zipa pour passer sur Eedomus, c’est une box française et beaucoup stable que la zipa (en tout cas il y’a quelque mois au moment de mon switch).
Le seul avantage que la zipa à sur Eedomus, c’est le moteur de règle puzzle, et le fait que les config périphériques soit intégrés dans l’interfaces (sur Eedomus il faut ajouter manuellement les paramètres dont on à besoins).
Personnellement je suis hyper content de Eedomus, la box est stable, l’équipe est réactive, il y’a une communauté grandissante de jour en jour (du coup plein de tutos).
Il y’a aussi un service premium (voir http://www.eedomus.com/fr/wp-content/uploads/abonnements201210.pdf) mais franchement on peux s’en passer 😉
l’api et les actionneurs http fonctionnent sans problème, karotz et mirror sont géré en natif, etc..
Bref le jour ou Eedomus aura un moteur de règle plus user friendly, la zipa n’aura plus rien à lui envier
Bon dimanche à tous
Re bonjour,
Pour la zipabox, je pense la même chose que toi. Depuis deux jours je me bats avec leur serveur FTP pour uploader les images de mes cameras: toujours rien. De plus la documentation est inexistante !!!
Ou puis je trouver un vrai comparatif des box eedomus, zibase car je pense que je vais rapidement changer de box. Je n’arrive pas à déterminer quel est la bonne box pour mes projets. Je souhaiterai 1- Contrôler des camera ip 2- recevoir des images de celles ci sur email 3- faire des push sur portable 4- contrôler ma consommation …
Merci encore pour ton aide.
Concernant le comparatif, regarde ici: http://maison-et-domotique.com/comparatif-des-solutions-domotiques/
Tu peux aussi demander à Vincent (le taulier de MDG) car il a les 2 (zipa et eedomus), pour l’histoire on a essuiyer les platre avec la zipa quasi ensemble, et on a acheté nos eedomus ensemble aussi parcequ’on était maxi deçus de la zipa.
zibase je connais pas du tout donc je ne peux pas te donner d’avis dessus, dsl
Eedomus fait à prioris tous ce que veux, tu peux configurer du push mobile et email dans chaque règles et tu à une case à cocher pour joindre les images des cam ip, au mail.
pour controller ma cam ip (une ebode IP Vision 58) j’utilise les actionneur http, j’arrive sans problèmes à activer/desactiver ladetection de mouvement, prendre un snapshot, etc..)
Dans l’autre sens j’utilise l’api eedomus pour remonter l’état du capteur de présence de la cam.
a prioris foscam et ebode utilise les même api CGI, pour gérer les cam.
La seule chose que je n’ai pas eu l’occasion de tester c’est pilotage des caméras 360°, genre leur commander d’aller aà tel ou tel position puis de prendre une photo. d’après les doc des cgi foscam c’est faisable, reste plus qu’a demander une cam 360°au père noel.
y’a pas mal de tuto sur la gestion d’énergie via eedomus.
tu peux jeter un oeil ici: http://doc.eedomus.com/ y’a toules les infos dont tu a besoin.
j’espère que mes com vont t’aider dans ton choix
encore un lien sympa, une liste de tuto eedomus:http://doc.eedomus.com/view/Guides_pratiques_eedomus
http://www.eedomus.com/fr/index.php/guide-pratique-comment-realiser-un-thermostat-personnalise/
Impossible inscription sur « my.zipato.com ».