VidéoSurveillance avec MotionEye sur Raspbian Stretch et plusieurs Caméras

Ayant la volonté de réaliser un cours/tutoriel/tutoral complet sur MotionEye depuis longtemps, je suis un peu poussé à le faire suite à quelques demandes ; notamment iPapy 🙂

Alors, je m’y mets vraiment cette fois.

–> Le sujet est “simple” (en théorie) :
Réaliser un système de vidéosurveillance qui va tourner sur un Raspberry Pi au moyen du très simple système MotionEye (le Démon Motion accompagné de son interface graphique).

–> La réalisation de l’article sera plus longue.
En effet, on va aborder plusieurs points:

  1. Installation de Raspbian Strech
  2. Installation de MotionEye
  3. Intégration des Caméras (et paramétrage pour envoyer des courriels, prendre des photos, …)
  4. Mise en place d’un système d’alerte sonore locale (le Raspberry Pi va parler dans la maison/appartement) avec alarme (un bruit de sirène) et (si vous avez un forfait FreeMobile) une notification par SMS.

Compte tenu du travail à fournir, ce tuto sera réalisé au fil de l’eau …
Car, je souhaite vraiment détailler chaque partie avec des captures d’écran.

Pour tenter de faire un tuto de qualité, je vais essayer de tout reprendre à zéro.
N’hésitez pas à me reprendre/corriger/compléter via les commentaires ou par courriel.

Installation de Raspbian Strech

Téléchargez Raspbian Desktop depuis le site officiel

Depuis la version “2018-06-27” de Raspbian Stretch, certaines améliorations sont intéressantes pour les non-initiés.

 

Donc, on télécharge l’image officielle depuis le vrai site, c’est à dire https://www.raspberrypi.org/downloads/raspbian/ et pas depuis n’importe où sur le Net.
Le choix va se porter sur “Raspbian Stretch with desktop” qui est l’image avec un bureau graphique basée sur Debian Stretch (à l’heure de l’écriture de l’article, on est à la version de juin 2018).
Personnellement, je préfère toujours télécharger mes images via le système Torrent car ça accélère les choses + évite d’avoir une image ne venant que d’un endroit + participe à la diffusion de cette image.
Mais il est vrai que je fonctionne sous Linux et suis habitué au images de Linux partagées par Torrent.

Maintenant, il faut écrire (installer) cette image sur la carte microSD.
Vous devrez utiliser un outil d’écriture d’image pour écrire cette image.
Sous LinuxMint/Ubuntu, on a “créateur de clef USB” qui fonctionne, mais je conseille (pour Windows, Mac et Linux), l’excellent programme Etcher.

Capture d'écran de l'application Etcher en train d'écrire l'image de Raspbian sur Clef USB
Écriture de l’image de raspbian avec etcher

En effet, Etcher est un outil d’écriture graphique qui fonctionne sur Mac OS, Linux et Windows et (cerise sur le gâteau) qui vérifie que l’écriture a bien été réalisée + vérifie la carte SD (ou la clef USB) + ne nécessite aucun dézippage. Le bonheur quoi 🙂

Téléchargez Etcher depuis le site officiel et installez-le selon votre système d’exploitation.

Ensuite, il suffit de connecter votre carte SD puis de lancer Etcher.
Le programme demande de sélectionner le fichier à écrire et le support sur lequel écrire.
Voici un exemple avec une écriture sur clef USB (mon Raspberry Pi3 tourne avec clef USB et pas avec carte SD).
(Cette capture a été faite en Avril pour un autre tuto)

Une fois l’image écrite, insérez la carte SD (ou la clef USB si votre Rpi sait démarrer dessus), connectez un clavier, une souris, un écran et allumez le Raspberry Pi.

La nouveauté de cette version est que vous allez être invité automatiquement a réaliser diverses modifications.
Je trouve que cela est beaucoup plus sécurisé/sérieux car cela demande notamment de changer le mot de passe et lance une recherche des mises à jour !

En simplifiant, on passe tout en Français, on change le mot de passe, on active le SSH, la caméra et le VPN ; ensuite, on applique les mises à jour et on redémarre.

Compte tenu de l’heure (et du fait que la bande passante est prise), je ne vais pas lancer le démarrage de la nouvelle image maintenant mais je vous mettrai des images par la suite. (sinon, je vais encore me coucher à “pas d’heure”).

Pouf, magie de la TV … heu de l’Internet … C’est déjà réalisé 🙂

Écran d’accueil suite au premier démarrage de Raspbian
Écran de configuration des locales (en anglais par défaut)
Écran de configuration des locales passées en Fr
Mise en application des localisations
Demande de modification du mot de passe
Intégration du nouveau mot de passe (conseil = avec majuscules+chiffres+minuscules au minimum)
Recherche du réseau Wifi ; perso, je passe cette étape avec skip (suis en RJ45)
Écran de recherche des Mise à Jour de Raspbian lors de la configuration initiale
Vérification des mises à jour à réaliser
Lecture de la liste des mises à jour
Comparaison entre les listes locales et distantes
Obtention des mises à jour
Téléchargement des mises à jour à appliquer
Installation des mises à jour
Écran de confirmation de la fin de la mise à jour
Invitation à effectuer un redémarrage (Reboot) suite aux MàJ
Premier écran après redémarrage ; information que le système est à jour
Désactivation de l’Overscan afin de couvrir la totalité de l’écran (ici = passer de 1824×984 à 1920×1080)
Activation de la Caméra, du SSH et de VNC
Invitation à redémarrer pour application des modification de configuration

On passe donc à la seconde partie.

Installation de MotionEye

Alors, là, je vais reprendre un de mes précédents articles justement intitulé Installation de MotionEye sur Raspbian Strech sur Raspberry Pi3

Je n’ai absolument RIEN inventé. Ce protocole est en fait l’installation de MotionEye selon la méthode de Calin Crisan, le créateur du programme. J’ajoute juste des sudo apt-get update car j’ai déjà eu des erreurs de fichiers non trouvés et je préfère forcer les mises à jour des listes de fichiers (ceci est vrai de manière générale ; pas que pour MotionEye).

Attention, faites toutes ces commandes en faisant des [copier/coller] pour éviter les erreurs.
Pour copier, c’est facile, c’est la combinaison des touches “Ctrl” + “C” si vous travaillez directement sur votre Raspberry.
Mais, pour coller dans le Terminal, il faudra faire la combinaison “Maj” + “Ctrl” + “V” (ou “⇧” + Ctrl” + “V”)
(Vous pouvez voir mon article sur les [copier/coller] pour plus d’informations)

Préparation de l’installation :

sudo apt-get update
sudo apt-get install ffmpeg v4l-utils
sudo apt-get install libmariadbclient18 libpq5

Récupération et installation de Motion (le cœur du programme :

sudo apt-get update
wget https://github.com/Motion-Project/motion/releases/download/release-4.1.1/pi_stretch_motion_4.1.1-1_armhf.deb
sudo dpkg -i pi_stretch_motion_4.1.1-1_armhf.deb

Installation des dépendances nécessaires :

sudo apt-get update
sudo apt-get install python-pip python-dev libssl-dev libcurl4-openssl-dev libjpeg-dev libz-dev

Récupération et installation de la partie GUI pour avoir MotionEye (GUI = Graphical User Interface soit « interface graphique » en Français) :

sudo pip install motioneye

Configurations nécessaires au bon fonctionnement :

sudo mkdir -p /etc/motioneye
sudo cp /usr/local/share/motioneye/extra/motioneye.conf.sample /etc/motioneye/motioneye.conf
sudo mkdir -p /var/lib/motioneye
sudo cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service

Automatisation de lancement du programme au démarrage du Raspberry Pi (MotionEye sera actif dès le démarrage du Raspberry ; ça devient automatique) :

sudo systemctl daemon-reload
sudo systemctl enable motioneye
sudo systemctl start motioneye

A noter que pour faire une mise à jour de MotionEye (puis une relance du programme MotionEye), on procède ainsi :

sudo apt-get update
sudo pip install motioneye --upgrade
sudo systemctl restart motioneye
Première connexion à MotionEye via http://localhost:8765

Par défaut, le port choisi par le créateur du programme est 8765, donc, vous pouvez (depuis votre Raspberry Pi) taper cette adresse dans le navigateur : http://localhost:8765/
Pour se connecter, la première fois, il faut juste entrer le nom de l’administrateur (“admin”) et valider puisqu’il n’y a pas de mot de passe pour le moment).

Pour le moment, entrez juste admin et validez.
Ne cochez pas Remember Me puisque nous allons modifier en mettant un mot de passe immédiatement.

Enfin, là, je vais gérer le lave vaisselle et aller au lit.

A demain !

Intégration des Caméras et divers paramétrages

Explications à suivre … Des images basiques pour le moment. Je vais rédiger les commentaires de chaque image par la suite.
A noter que les captures ont été relativement “anonymisées” par modification à la main, une par une, avec Gimp (oui, sacré boulot).

Premier écran de connexion à MotionEye
Il suffit de renseigner “admin” et de valider (sans mot de passe)
A ce stade, pas grand chose à part qu’il n’y a rien à voir 🙂 … et … que le programme nous invite à ajouter une caméra
Attention, par défaut, MotionEye propose une caméra locale mais de type USB (V4L2)
Il faudra bien choisir “Local MMAL Camera” si vous avez le module camera sur port CSI (Camera Serial Interface)
Une fois le type de caméra choisi, la caméra est proposée automatiquement
Arrivée sur la page de paramétrage de base où il reste pas mal de choses à régler
Je commence par passer la mise en page en 1 ou 2 colonnes
Après, d’emblée, je conseille d’activer les “Paramètres Avancés” (Advanced Settings) pour devenir le chef !
On peut alors changer les Noms d’Utilisateur (Username) et les mots de passe (Password) et valider avec “Apply”
Une fois les modifications validées (avec “Apply” en orange en haut), il faut se reconnecter (logique)
Là, on peut demander la sauvegarde du couple “User/Password” pour rendre la chose plus rapide par la suite
A la reconnexion, on tombe sur la vidéo en grand sans voir les paramètres. On va donc cliquer sur Settings (les 3 lignes à gauche)
Et voilà l’accès aux réglages plus fins pour mettre la surveillance vraiment en action
Modification de la qualité de la vidéo ; je ne pousse pas trop ; ce n’est pas utile et c’est un Raspberry Pi 😉
Zone de modification du stockage des images (là, on ne touche à rien, mais je vous montre tout de même 😉 … Je suis cool)
Ici, on accède aux modifications des “tampons” (stamps) incrustés sur les images ; souvent je passe la date en jj-mm-aaaa
Modification des règles de sauvegarde des images. Sélectionnez l’option “Motion Triggered” pour capturer des images en cas de détection de mouvement. C’est la seule option possible pour faire des photos tout au long des alertes
Réglage du temps de maintien en mémoire des images (là, je sélectionne juste 1 mois pour purger ni trop tôt ni trop tard)
Message d’alerte informant que toutes les images du dossier “Camera1” seront effacées par la tache cron créée par “Preserve Pictures”, même celles non prises par MotionEye (raison pour laquelle, on ne modifie pas le lieu de stockage précédemment)
Réglage du seuil de modification de l’image pour activer la détection. Souvent, je mets le curseur à 3%
Déroulement de “Motion Notifications” où il est possible de choisir différentes possibilités notamment la réception de courriels.
Réglages à utiliser pour Gmail. (Évidemment, ces adresses sont fausses 😉 ; c’est pour être explicite) A noter le choix de 3 secondes pour laisser le temps d’ajouter des images dans le courriel ; vous affinerez si besoin.
Il est possible de tester les paramètres pour vérifier que ça fonctionne. Ici, vous avec la notification de réussite.
Maintenant, n’oubliez pas de valider en cliquant sur le “Apply” pour appliquer les modifications !
Pour ajouter une autre caméra, il faut cliquer sur la caméra actuelle et choisir “Add Camera” ; tout simplement.
Exemple pour une caméra réseau (dans le cas présent, un Rpi Zéro tournant avec MotionEyeOS en “simple flux”). Il faut cependant bien choisir “Network Camera”. Parfois les bons paramètres ne sont pas si faciles à trouver. Patience et courage 😉
Et voilà la seconde caméra en visuel. C’est un Raspberry Zero doté d’un module noIR avec LED infrarouges = vision nocturne.
Enregistrement d’images si détection de mouvement + effaçage automatique après 1 mois (comme pour la première caméra)
Réglage des paramètres de détection. Je laisse souvent tout d’origine (sauf le 3%).
Ajout d’une troisième caméra. Celle-ci est une caméra IP de marque Heden qui a 6 ans. Elle possède une vision nocturne mais une qualité visuelle limitée (640×480). Avec les Caméra IP, le plus dur est de trouver l’adresse du flux vidéo exploitable.
Et voilà ce que ça donne avec 3 caméras (je suis repassé en “Layout” avec 2 colonnes pour l’exemple). Il y a 1 module caméra connecté au Raspberry Pi + 1 caméra réseau (un RpiZero sous MotionEye) + 1 Camera IP du commerce (marque HEDEN)
Ho ; j’ai cru voir un M&M’s … Ha mais oui, j’ai bien vu un M&M’s !!! Nous allons donc illustrer une intrusion
Et là, vous voyez que MotionEye est passé en mode “Alarme” ou “Détection” car il passe en rouge et prend donc des photos
Sur cet écran, vous voyez le retour à l’état d’origine suite à la disparition de l’intru ; c’est à dire le disparition du cadre rouge
Ici, je fais afficher les photos prises lors de l’alerte au M&M’s. Il y a 1 image par seconde avec une photo avant la détection.
Voici la première image enregistrée ; vous voyez que c’est l’état AVANT l’intrusion ; c’est pratique pour voir ce qui a changé
Et voilà donc l’objet du délit. Un M&M’s qui ne se mange pas ; franchement ; fallait le dénoncer !
Lorsque nous demandons l’effacement des images, nous avons une demande de confirmation par sécurité.
Retour automatique à l’écran de base une fois que les images précédentes ont été purgées.
Pour l’exemple, voici comment laisser le Raspberry Pi en fonctionnement mais couper la surveillance : il suffit de taper la commande “sudo systemctl stop motioneye” dans le Terminal. Et on relance avec un simple “sudo systemctl start motioneye” (voir ci-dessous)
Pour supprimer une caméra de MotionEye, on la sélectionne puis on clique sur la corbeille à droite de son nom (Remove Camera)
Demande de confirmation avec de supprimer cette entrée vidéo
On a bien supprimé totalement la caméra n°3 de MotionEye. Tous les paramètres sont purgés ; il faudra tout refaire (sauf si on a fait une sauvegarde avec “Backup”)

Mise en place d’un système de notifications

Le concepteur de MotionEye a bien fait les choses ; il a prévu moult options (moult est invariable) et il a même prévu que nous pouvions … en prévoir d’autres 🙂

Je vous propose d’utiliser l’option “Run A Command” que j’ai encadrée en rouge sur la capture ci-dessous.
Cela permet de demander au programme de lancer une commande personnalisée en cas de détection de mouvement.

L’option “Run A Command” est désactivée par défaut ; il suffit de l’activer.
On active simplement l’option en cliquant sur le “off” qui se transforme en “on” et laisse apparaitre une zone de texte.
Et là, on inscrit la commande à exécuter ; ici, c’est un script mis dans un dossier spécifique (plus logique)

Attention : n’oubliez pas de valider en cliquant sur “Apply”.

Oui, je sais … Comment cela va-t-il pouvoir fonctionner puisque rien de tout cela n’existe ???

OK ; vous avez raison et c’est pour cela que nous passons à la partie “programmation”.

Tout va débuter par la création du dossier “notifications” avec cette simple ligne :

mkdir notifications

Comme on n’a rien précisé, le dossier “notifications” sera créé où nous sommes. Mais nous pouvons aussi donner le chemin complet si vous préférez :

mkdir /home/pi/notifications

Vous vous demandez peut-être “Mais, Alban, pourquoi diable avoir créé un dossier et pas juste un fichier ?

La réponse est simple : “Hé, c’est qui le chef ?” ; “C’est lui, c’est moi, c’est nous !” ; “Et nous, on aime bien les dossiers !!!

Bon, en fait, plus objectivement, l’idée est simpliste = avoir un dossier pour y mettre tout ce qui nous sera nécessaire pour les notifications.
En effet, dans mon propre système, j’ai 4 caméras différentes et chaque caméra dispose de son propre script.
Le dossier “nofitications” contient donc les scripts notification.sh ; notification02.sh ; notification03.sh et notification04.sh … mais aussi le fichier son “alarme.mp3” et la phrase d’alerte “lue” par le Raspberry Pi.

Pour la réalisation du script, on va faire soit en ligne de commande soit en mode graphique.

Pour le mode graphique, faites :

sudo leafpad /home/pi/notifications/notification.sh

Et ça ouvrira l’éditeur de texte.

Sinon,faites :

sudo nano /home/pi/notifications/notification.sh

Et vous pourrez alors le faire à la méthode du “Linuxien de la mort qui tue“.

Quelques soit la méthode, le fichier va ressembler à ça :

#!/bin/sh

# 01 - Script pour envoyer une notification SMS avec FreeMobile lors d'une détection de mouvement par 'MotionEyeOs'

wget --no-check-certificate "https://smsapi.free-mobile.fr/sendmsg?user=XxXxXxXxX&pass=XxXxXxXxXxX&msg=Alarme%20Cam_IP%20garage%20!!!%20"

# 02 - Script pour jouer un son d'alarme

mplayer /home/pi/notifications/alarme.mp3

# 03 - Script pour lire une phrase d'alerte

mplayer /home/pi/notifications/alerte.wav

01 – Évidemment, il faut avoir un forfait de téléphone chez FreeMobile pour bénéficier de ce service. C’est une option gratuite à activer sur son compte. Cela permet d’envoyer un SMS sur son portable grâce à un simple navigateur en tapant https://smsapi.free-mobile.fr/sendmsg?user=XxXxXxXxX&pass=XxXxXxXxXxX&msg=LeTexteVoulu et en validant … mais, surtout, cela permet d’utiliser cette focntion dans des système de domotique ou équivalent.
Dans notre cas, on utilise la fonction “wget” qui permet d’interpréter le “https:…” sans avoir à recourir à un navigateur (puisque c’est un script).
Pour le texte à envoyer par SMS, il faut noter “%20” pour réaliser un espacement entre les mots.
Ainsi “LeTexteVoulu” sera plus facile à lire sur le téléphone si vous codez “Le%20Texte%20Voulu”.

02 – Pour jouer le son, on va installer mplayer (qui est un lecteur hyper léger) en faisant:

sudo apt-get install mplayer

02 bis – Et faudra vous trouver un fichier son que vous renommerez en “alarme.mp3” (essayer ce lien respectueux de votre vie privée)

03 – Pour lire la phrase, il va falloir réaliser 2 actions : donner la parole à votre Raspberry Pi puis créer un fichier à lire.
Vous allez donc installer un programme (connu dans le monde Linux) nommé SVOX Pico TTS (TTS signifie Text To Speach).
L’installation est d’une simplicité enfantine avec :

sudo apt-get install libttspico-utils

Ensuite, il vous reste à créer une phrase avec pico2wave -l fr-FR -w /home/pi/notifications/alerte.wav "... Hé, zy va l'intru ; on t'a vu ! Arrache toi d'là si tu veux pas goûter à mes catana"
(Pour l’exemple, j’ai laissé DeadPool parler ; DeadPool, c’est un mec cool 🙂 Surtout si on l’énerve)
A noter l’usage de « … » en début de phrase pour laisser au Raspberry Pi le temps nécessaire à la mise en lecture (sinon, il bouffe le début)

Maintenant, il vous appartient de réaliser autant de scripts que nécessaire.

Perso, j’ai séparé les choses pour que MotionEye m’envoie “Alarme Cam_IP garage !!!” quand la caméra du garage détecte un mouvement ; “Alarme Cam_IP cuisine !!!” quand c’est la caméra de la cuisine qui est solicitée ; “Alarme Raspberry Zéro” quand … (je pense que vous avez un peu percuté, non ?!?)

Par contre, tous les scripts lisent le même son et la même phrase.

On pourrait améliorer la chose en faisant en sorte de séparer les SMS du système sonore (alarme et alerte) afin de laisser chaque caméra envoyer un SMS mais de faire en sorte que si l’alarme et l’alerte sont exécuter par une caméra, ils ne puissent pas être lancé avant X secondes.
En effet, actuellement, on peut avoir chevauchement de son car 2 caméras peuvent détecter à quelques secondes près une intrusion et le système de sons est alors un brin “de la purée de pois”.

Conclusion :

Et voilà.
Si vous avez bien tout suivi sans faire d’erreur, vous avez un système de vidéosurveillance parfaitement autonome et automatique.

(si erreur il y a, partons du principe que le problème = c’est vous … mais bon, autant m’en parler 😉 On ne sait jamais).

A partir de maintenant, il suffit d’allumer le Raspberry Pi et tout est fonctionnel ; elle n’est pas belle la vie ?!?

Du coup, je vous entends déjà dire :
Merci Alban ; t’es trop cool avec nous ! Passer des heures à installer, faire des captures d’écran, retravailler tes captures et rédiger cet article, vraiment, c’est classe de ta part”.
Et nous (ou lui ou moi, faut voir) de répondre :
“Ho, mais pas de quoi ; avec plaisir ! Vous pouvez me remercier en m’aidant à améliorer des articles, en me donnant des vieilles machines (ou même des neuves évidemment), en m’envoyant un petit mot d’encouragement/remerciement, en me faisant un don minime de principe sur Paypal ou Leetchi, en me léguant votre fortune, en venant boire un café, en pensant vraiment que je suis le meilleur, en étant respectueux avec les cyclistes (sauf avec les cons qui grillent les feux), en sortant de ma tête, en …”.

Comme je suis vraiment cool, j’ajoute un truc :
Évitez le son par le biais d’un écran HDMI car les écrans se mettent en veille au bout d’un moment … et … cela coupe le son ; pas cool (bon, les SMS fonctionnent toujours).
Il faut avoir des Hauts Parleurs. Toutefois, il en faut avec un système d’amplification afin que le son soit audible.
Et, il faudra modifier la sortie son en “analog” (en faisant clic-droit sur le dessin du Haut Parleur en haut à droite).

Dans un prochain article, j’explorerai l’idée d’un script pour commander les ports GPIO afin qu’une mitraillette puisse tirer de manière automatique après la phrase de sommation.
Ça sera cool, non ?!? 😀

En attendant, rappelez-vous :
Sourions, on ne pourra pas tous les tuer …

A propos de Alban

Papa de 4 enfants étant lui même resté un enfant. Tombé par obligation dans l'informatique à 22 ans pour le boulot et s'étant "un peu" pris au jeu ... Pas un génie de l'informatique (loin de là), mais intéressé et carrément orienté Linux et entraide.

4 commentaires à propos de “VidéoSurveillance avec MotionEye sur Raspbian Stretch et plusieurs Caméras”

  1. Merci Alban ; t’es trop cool avec nous ! Passer des heures à installer, faire des captures d’écran, retravailler tes captures et rédiger cet article, vraiment, c’est classe de ta part.
    Je vais essayer ça avec mes camera ip.

    • Avec plaisir !
      Faudra voir si tu peux choper le flux de tes cam.
      J’ai tenté d’aider des gens ayant des Foscam … mais … le flux était totalement embarqué = impossible de les intégrer dans MotionEye malgré des heures et des heures de tests !!! :-s
      Cochonnerie de formats propriétaires !
      Vive l’OpenSource ; vive le Libre ; vive les Manchots ! 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*