{"id":218,"date":"2012-07-02T18:05:00","date_gmt":"2012-07-02T18:05:00","guid":{"rendered":"http:\/\/hoper.dnsalias.net\/atdc\/index.php\/2012\/07\/02\/20120702foscam-fi8918w-motion-bricolage-perso\/"},"modified":"2017-05-30T14:42:29","modified_gmt":"2017-05-30T12:42:29","slug":"20120702foscam-fi8918w-motion-bricolage-perso","status":"publish","type":"post","link":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/2012\/07\/02\/20120702foscam-fi8918w-motion-bricolage-perso\/","title":{"rendered":"Foscam FI8918W + Motion : bricolage perso"},"content":{"rendered":"<div class=\"post-content\">\n<h3>Le besoin<\/h3>\n<p>Tout en sachant parfaitement que mes bricolages <a href=\"http:\/\/blog.guiguiabloc.fr\/index.php\/2012\/04\/27\/neutralisation-des-alarmes-domotiques-z-wave\/\">ne remplaceraient jamais<\/a> un v\u00e9ritable syst\u00e8me d&rsquo;alarme, je voulais mettre en place quelque chose qui me pr\u00e9vienne lors de la d\u00e9tection d&rsquo;un mouvement chez moi. Bien sur, le syst\u00e8me devait \u00eatre le plus automatis\u00e9 possible, et facilement pilotable depuis un smartphone. Au niveau mat\u00e9riel, je disposai de mes serveurs, de cam\u00e9ras usb et d&rsquo;une <a href=\"http:\/\/forum.hardware.fr\/hfr\/HardwarePeripheriques\/Webcam\/fi8908w-fi8918w-fi8910w-sujet_50586_1.htm\">cam\u00e9ra IP<\/a>.<\/p>\n<h3>D\u00e9tection de mouvement<\/h3>\n<p>Premier gros soucis, je ne suis pas parvenu \u00e0 faire fonctionner la foscam avec Zoneminder. (D&rsquo;autres semblent pourtant y parvenir sans probl\u00e8mes&#8230;) D&rsquo;apr\u00e8s les messages d&rsquo;erreurs, les images jpeg qu&rsquo;elle envoi sont corrompues. Une mise \u00e0 jour du firmware n&rsquo;a strictement rien chang\u00e9. Heureusement que d&rsquo;autre logiciels, \u00e0 commencer par motion, sont plus tol\u00e9rants, et parviennent \u00e0 r\u00e9cup\u00e9rer le flux vid\u00e9o (m\u00eame si des warning en mode debug indiquent la aussi tr\u00e8s clairement que la \u00ab\u00a0syntaxe\u00a0\u00bb des fichiers jpg n&rsquo;est pas respect\u00e9).<\/p>\n<p>Param\u00e9trer motion pour qu&rsquo;il utilise la cam\u00e9ra se fait sans difficult\u00e9\u00a0:<\/p>\n<pre> netcam_url http:\/\/ip_fixe\/videostream.cgi?user=LOGIN&amp;pwd=PWD&amp;resolution=32&amp;rate=3<\/pre>\n<p>Pour conna\u00eetre la liste des arguments possible et ainsi pouvoir r\u00e9gler la r\u00e9solution et la fr\u00e9quence de capture, je vous invite \u00e0 aller lire <a href=\"http:\/\/www.zoneminder.com\/wiki\/index.php\/Foscam\">ceci<\/a>.<\/p>\n<p>Le vrai soucis \u00e9tait plut\u00f4t le param\u00e9trage li\u00e9 \u00e0 la d\u00e9tection de mouvement. La, je vous laisse le soin de lire la documentation de motion avec attention. En ce qui me concerne, j&rsquo;ai du par exemple indiquer \u00ab\u00a0minimum_motion_frames 15\u00a0\u00bb, autrement dit, le soft ne consid\u00e8re qu&rsquo;il y a un vrai mouvement qu&rsquo;a partir de 15 images diff\u00e9rentes. A une fr\u00e9quence de 10 images par seconde, cela signifie qu&rsquo;un mouvement ne sera d\u00e9tect\u00e9 que si il dure plus d&rsquo;une seconde et demi. Un param\u00e9trage qui n&rsquo;est pas optimal, mais qui permet de limiter le nombre d&rsquo;alarmes inutiles (g\u00e9n\u00e9ralement du \u00e0 une modification de la luminosit\u00e9, et cela malgr\u00e9 l&rsquo;utilisation d&rsquo;un autre param\u00e8tre\u00a0: lightswitch 100.<\/p>\n<h3>Un peu d&rsquo;automatisation<\/h3>\n<p>D\u00e9tecter les mouvements c&rsquo;est fait. Assembler les images pour cr\u00e9er un fichier .mp4, motion sait aussi le faire en standard. Par contre, pour mettre \u00e0 disposition la vid\u00e9o et envoyer un petit mail avec le bon lien, la un petit script de quelques lignes est n\u00e9cessaire. Petit soucis, dans le fichier de configuration de motion, on ne peut donner qu&rsquo;un seul argument au script que l&rsquo;on appel. Pour passer plusieurs parametres (le num\u00e9ro de la cam\u00e9ra, le nom du fichier etc) il faut donc ruser un peu en concat\u00e9nant les arguments, avant de les r\u00e9-d\u00e9couper dans le script. Cela donne par exemple dans le fichier motion.conf<\/p>\n<pre> on_movie_end \/etc\/motion\/scripts\/movie_end \"%t@%f\"<\/pre>\n<p>Ici j&rsquo;assemble %t et %f, en utilisant un @ comme s\u00e9parateur. Dans le script, il suffit de r\u00e9-d\u00e9couper\u00a0:<\/p>\n<pre>CAMERA=`echo $1 | cut -d'@' -f1` \r\nPATH_FILE=`echo $1 | cut -d'@' -f2`\r\n<\/pre>\n<p>Une fois les arguments r\u00e9cup\u00e9r\u00e9s, on fait bien ce que l&rsquo;on veut (envoi de mail, upload des vid\u00e9os, mise \u00e0 disposition sur un serveur web etc).<\/p>\n<h3>Motorisation<\/h3>\n<p>Il y a des gens qui n&rsquo;ont <a href=\"http:\/\/korben.info\/webcam-hacking.html\">pas confiance<\/a> dans la s\u00e9curit\u00e9 de leur machine. Et malgr\u00e9 tout le soin et le s\u00e9rieux que j&rsquo;ai mis \u00e0 s\u00e9curiser la solution (ajouts de reverse proxy https, etc), personne n&rsquo;est totalement infaillible. Surtout, je peux comprendre qu&rsquo;il n&rsquo;est pas tr\u00e8s agr\u00e9able de se sentir observ\u00e9 24h\/24. Il fallait donc faire en sorte que la cam\u00e9ra se tourne lorsque le syst\u00e8me de d\u00e9tection n&rsquo;\u00e9tait pas op\u00e9rationnel. Pour cela il suffit d&rsquo;utiliser les \u00ab\u00a0presets\u00a0\u00bb. On commence par r\u00e9gler la cam\u00e9ra pour qu&rsquo;elle regarde pr\u00e9cis\u00e9ment la zone \u00e0 surveiller, et on enregistre la position (position 1). Ensuite, on fait tourner la cam\u00e9ra pour qu&rsquo;elle regarde totalement ailleurs (le plafond ou ce que vous voulez) et on enregistre une position 2. Pour passer d&rsquo;une position \u00e0 l&rsquo;autre, il suffira alors d&rsquo;une simple commande wget\u00a0:<\/p>\n<pre> wget -q -O \/dev\/null \"http:\/\/ip\/decoder_control.cgi?command=31&amp;user=X&amp;pwd=PWD\"<\/pre>\n<p>La encore, je vous renvoi \u00e0 <a href=\"http:\/\/forum.hardware.fr\/hfr\/HardwarePeripheriques\/Webcam\/fi8908w-fi8918w-fi8910w-sujet_50586_1.htm\">cette page<\/a>. Les mouvements de la cam\u00e9ra sont donc tr\u00e8s facilement scriptable (sur la FI8918W, le preset 0 est en fait le premier, le premier est le second etc).<\/p>\n<h3>Contr\u00f4le \u00e0 distance<\/h3>\n<p><img decoding=\"async\" class=\"aligncenter\" title=\"control_camera.jpg, juil. 2012\" src=\"https:\/\/hoper.dnsalias.net\/tdc\/public\/.control_camera_m.jpg\" alt=\"control_camera.jpg\" \/><\/p>\n<p>Il \u00e9tait facile, via la crontab, d&rsquo;automatiser le syst\u00e8me pour qu&rsquo;il s\u2019enclenche et se d\u00e9sactive \u00e0 une heure donn\u00e9e. Mais il faut aussi pouvoir piloter le tout \u00e0 distance. Pour cela, un peu de php \u00e0 \u00e9t\u00e9 n\u00e9cessaire. (Note\u00a0: Je suis admin sys, pas d\u00e9veloppeur web&#8230; donc oui, c&rsquo;est probablement TRES moche comme code et je suis ouvert \u00e0 toutes les suggestions). Sur un serveur https correctement prot\u00e9g\u00e9, ajouter les deux pages suivantes\u00a0:<\/p>\n<p>La page d&rsquo;index\u00a0:<\/p>\n<pre>&lt;html&gt;\r\n&lt;font size=7&gt;\r\n&lt;?php\r\nexec('ps -eaf | grep -v grep | grep motion',$sortie,$code_retour);\r\nif ( $code_retour == 0 ) { print \"&lt;p align=center&gt; Surveillance ACTIVE &lt;\/p&gt;\";}\r\nif ( $code_retour == 1 ) { print \"&lt;p align=center&gt; Surveillance desactivee &lt;\/p&gt;\";}\r\n?&gt;\r\n&lt;form method=\"post\" action=\".\/traitement.php\"&gt;\r\n&lt;p align=\"center\"&gt;\r\n&lt;input type=\"submit\" name=\"on\" value=\"ON\" style=\"height: 200px; width: 600px\" \/&gt;\r\n&lt;\/p&gt;\r\n&lt;p align=\"center\"&gt;\r\n&lt;input type=\"submit\" name=\"off\" value=\"OFF\" style=\"height: 200px; width: 600px\"\/&gt;\r\n&lt;\/p&gt;\r\n&lt;\/form&gt;\r\n&lt;\/font&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>La page de traitement du \u00ab\u00a0formulaire\u00a0\u00bb\u00a0:<\/p>\n<pre>&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;meta http-equiv=\"refresh\" content=\"3;url=index.php\" \/&gt;\r\n&lt;\/head&gt;\r\n&lt;font size=7&gt;\r\n&lt;?php\r\nerror_reporting (E_ALL ^ E_NOTICE);\r\n\r\nif ( $_POST['on'] == \"ON\" )\r\n{\r\n    $cmd = \"\/etc\/motion\/scripts\/goto_pos1\" ;\r\n    $id = shell_exec($cmd);\r\n    sleep (17);\r\n    $cmd = \"sudo \/etc\/init.d\/motion start\" ;\r\n    $id = shell_exec($cmd);\r\n}\r\nif ( $_POST['off'] == \"OFF\" )\r\n{\r\n    $cmd = \"sudo \/etc\/init.d\/motion stop\" ;\r\n    $id = shell_exec($cmd);\r\n    sleep (4);\r\n    $cmd = \"\/etc\/motion\/scripts\/goto_pos2\" ;\r\n    $id = shell_exec($cmd);\r\n}\r\n?&gt;\r\n\r\n&lt;p align=center&gt;C'est fait !&lt;\/p&gt;\r\n&lt;\/font&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Pour que cela fonctionne, il faut que le serveur web ai le droit de lancer ou d\u2019arr\u00eater motion. Prenez bien soin de lui donner <strong>uniquement<\/strong> ce droit la. A propos de s\u00e9curit\u00e9, si vous voyez la moindre faille dans ces deux bouts de code, merci de me le signaler \ud83d\ude42<\/p>\n<h3>Conclusion<\/h3>\n<p>Lorsque j&rsquo;ai montr\u00e9 ce bricolage \u00e0 ma femme, en lui expliquant comment activer ou d\u00e9sactiver la surveillance \u00e0 partir de son t\u00e9l\u00e9phone, elle l&rsquo;a dit que j&rsquo;\u00e9tais fou. Mais&#8230; je crois qu&rsquo;elle m&rsquo;aime bien quand m\u00eame \ud83d\ude42 Il me reste quelques d\u00e9tails \u00e0 peaufiner. Automatiser la purge des photos et de vid\u00e9os captur\u00e9s par exemple. Et surtout mettre en place un syst\u00e8me de synth\u00e8se vocale pour pr\u00e9venir les intrus que leur tronche est d\u00e9j\u00e0 upload\u00e9e sur le net et qu&rsquo;ils se sont tromp\u00e9s de maison&#8230; Cela fera, peut \u00eatre, le sujet d&rsquo;un autre billet.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Le besoin Tout en sachant parfaitement que mes bricolages ne remplaceraient jamais un v\u00e9ritable syst\u00e8me d&rsquo;alarme, je voulais mettre en place quelque chose qui me pr\u00e9vienne lors de la d\u00e9tection d&rsquo;un mouvement chez moi. Bien sur, le syst\u00e8me devait \u00eatre le plus automatis\u00e9 possible, et facilement pilotable depuis un smartphone. Au niveau mat\u00e9riel, je disposai [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-218","post","type-post","status-publish","format-standard","hentry","category-geekitude"],"_links":{"self":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/comments?post=218"}],"version-history":[{"count":2,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/218\/revisions"}],"predecessor-version":[{"id":799,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/218\/revisions\/799"}],"wp:attachment":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/media?parent=218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/categories?post=218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/tags?post=218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}