par Anne-Laure DELPECH | 1 Juil 2016 | Raspberry Pi
Dans le premier article de cette série, Caméra de surveillance et Raspberry Pi, nous avons lu le flux d’une caméra IP dans un Raspberry Pi. Dans cet article, nous allons voir comment supprimer automatiquement les fichiers, vidéos ou images, sauvegardés au fil du temps.
Il y a urgence !
J’ai installé motion sur mon Raspberry Pi le 22 juin. On est le 1er juillet et le répertoire de stockage des images et vidéos représente déjà plus de 1 Go et 40 000 fichiers.
Il faut donc que j’automatise la suppression d’images de plus de deux jours (cet article) et aussi que je règle mieux motion pour qu’il ne stocke que les images et vidéos de véritables mouvements détectés (le prochain article de cette série, Caméra de surveillance et Raspberry Pi.
Supprimer des fichiers manuellement
Dans les FAQ de motion, ici, on voit comment déclencher la suppression de fichiers en fonction de leur localisation, leur extension et leur date. Ainsi, la commande suivante trouve et supprime tous les fichiers en jpg vieux de plus de 1 jour :
find /home/jf/motion -maxdepth 1 -name '*.avi' -type f -mtime +2 -exec rm {} \;
Mais on ne veut pas aller taper cette commande tous les jours dans notre Pi. Il faut donc planifier la commande.
Crontab pour planifier des actions
Comme indiqué dans Wikipedia, « cron est un programme qui permet aux utilisateurs des systèmes Unix d’exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiées à l’avance, ou selon un cycle défini à l’avance. […] crontab est le nom du programme qui permet d’éditer des tables de configuration du programme cron. Ces tables spécifient les tâches à exécuter et leur horaire d’exécution avec éventuellement une périodicité. »
Ce qui suit provient aussi des FAQ de motion, ici :
- créer un script bash (/home/jf/exec/camera-delete-cron.sh) comme celui-ci (note du 25/01/2018, j’ai corrigé et ça fonctionne correctement maintenant) :
#!/bin/bash
# /home/jf/motion/camera–delete–cron.sh
# connaître les variables d'environnement du cron, pour deboguer
# printenv ;
# me dit que HOME et PWD = /home/jf
# efface les fichiers avi et jpg de plus de 14 jours
find /home/jf/motion/foscam/ -name '*.avi' -type f -mtime +14 -exec rm {} \;
find /home/jf/motion/foscam/ -name '*.jpg' -type f -mtime +14 -exec rm {} \;
la ligne de commande dans crontab
Le schéma ci-dessous traduit les instructions du site officiel du Pi.
# * * * * * commande à exécuter
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── jour de la semaine (0 - 7) (dimanche est 0 ou 7, lundi est 1)
# │ │ │ └────────── mois (1 - 12)
# │ │ └─────────────── jour du mois (1 - 31)
# │ └──────────────────── heure (0 - 23)
# └───────────────────────── minute (0 - 59)
# └───────────────────────── /xx = toutes les xx minutes
J’ai créé le script bash ci-dessus et l’ai appelé camera-delete-cron.sh . Je lui ai donné les droits 764. Evidemment, ses fins de ligne doivent être au format unix.
Je vérifie qu’il fonctionne avec les commandes suivantes :
cd /home/jf/exec
./camera-delete-cron.sh
Je veux l’exécuter tous les jours à 1h00. J’ai utilisé le générateur de commande cron de ce site pour définir ma commande cron. En principe j’écrirai donc :
#env
SHELL=/bin/bash
HOME=/home/jf
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* 1 * * * bash /home/jf/exec/camera-delete-cron.sh
Avant j’ai indiqué l’environnement d’exécution des commandes. Voir ci-dessous si vous devez adapter. Attention, il doit y avoir une ligne vide à la fin du crontab…
On édite crontab en tapant crontab -e dans la console. On y ajoute la ligne suivante (SHIFT + INSER pour coller). Attention, il doit obligatoirement y avoir une ligne vide à la fin du contenu de crontab.
Noter le « bash » devant le fichier à exécuter.
Le cron ne s’exécutera automatiquement qu’après un redémarrage du Pi. Donc
Déboguer le cron si nécessaire
Ce n’est pas simple de déboguer si un cron ne s’éxécute pas correctement. Le plus probable est que l’environnement d’éxécution du cron n’est pas le même que celui de la ligne de commande.
Un cron job se déclenche dans un environnement différent de celui d’un lancement manuel !
Dans le script on peut ajouter printenv
, qui affiche toutes les variables d’environnement. Un fichier log recueillerales données issues du cron job si la ligne est (ici exécution toutes les 10 minutes d’un script camera-test.sh et envoi des résultats dans un répertoire cron.log) :
*/10 * * * * bash /home/jf/exec/camera-test.sh OK > /home/jf/snd/cron.log 2>&1
Et le premier job envoie toutes les informations recueillies dans/home/jf/snd/cron.log
, ce qui permet de voir ce qui se passe.
Le fichier /var/log/syslog
contient également beaucoup d’informations sur ce qui se passe dans le pi.
Dans mon cas le cron fonctionne et efface tous les fichiers de plus de deux jours (c’est à dire 3 jours et plus).
par Anne-Laure DELPECH | 19 Juin 2016 | Raspberry Pi
Je veux qu’un Raspberry Pi lise et serve un flux vidéo issu d’une caméra IP (en wifi ou ethernet). J’ai choisi d’installer motion car il me permettra de détecter les mouvements puis de déclencher des alertes. Dans cet article, j’explique seulement comment installer motion puis visualiser le flux vidéo sur une page web, en streaming.
Ce qu’il faut
- un Raspberry Pi (un B+, avec une carte sd qui contient tout ce qui a été créé dans l’article Mise en service d’un Raspberry Pi – ie pour moi avec l’image radio-pi-2016-06-10-8h.img et Raspbian Jessie)
- une caméra web, pour moi connectée par cable ethernet, une Foscam FI8905W, avec une IP fixe).
Changer le nom du Pi et vérifier
regarder l’adresse IP du pi sur le routeur local (pour moi 192.168.1.16)
se connecter au pi en ssh et changer son nom (hostname)
ssh root@192.168.1.16
raspi-config
puis dans 9- advanced options, aller dans A2 hostname et renommer le Pi (pour moi, « nautilus »). Finir et accepter le Reboot
Maintenant je peux me connecter à ce pi avec ssh root@nautilus .
Noter que je me connecte en root, ce qui n’est pas conseillé. Mais ça m’évite de taper « sudo » devant chaque commande !
Installer motion
on installe des utilitaires nécessaires puis motion.
apt-get install -y libjpeg62-turbo libjpeg62-turbo-dev libavformat-dev libavcodec-dev libavutil-dev libc6-dev zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5
apt-get install motion
apt-get update
apt-get upgrade
Ca prend pas mal de temps (plusieurs minutes).
Pendant ce temps, préparer la page html qui servira à débugger et vérifier.
Préparer une page html de débogage et vérification
Créer un fichier page-test.html sur un PC, qui contient le code suivant :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>premier test d'affichage caméra</title>
<link href="A-style.css" rel="stylesheet" media="all" type="text/css">
</head>
<body>
<H1>Tableau de bord maison</h1>
<section class="streaming">
<h3>streaming caméra IP Foscam FI8905W</h3>
<p>en continu - directement de la caméra (IP fixe 192.168.1.201)</p>
<img name="FoscamCamera" src="https://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD" width="600" height="450" alt="Live Feed" style="background-color: #009999" />
</section>
<section class="streaming">
<h3>streaming caméra IP Foscam FI8905W via pi nautilus</h3>
<p>en continu - directement à la caméra</p>
<img src= "http://nautilus:8081/?action=stream" width="640" height="480" title="Camera devant maison"/>
</section>
</body>
</html>
Evidemment, il faut remplacer USER et PWD par les bons codes de la caméra utilisée.
Dans le même répertoire, placer un fichier A-style.css
html, body {
background-color: #d8da3d ;
margin: 0;
padding: 0;
}
body {
padding-left: 11em;
font-family: Georgia, "Times New Roman",
Times, serif;
color: purple;
background-color: #d8da3d
}
h1 {
font-family: Helvetica, Geneva, Arial,
SunSans-Regular, sans-serif }
a:link {
color: blue
}
a:visited {
color: purple
}
Et maintenant, dans l’explorateur de fichiers, cliquer à droite sur page-test.html et choisir ouvrir avec votre navigateur favori (chrome pour moi).
On voit le flux vidéo de la caméra en direct mais évidemment pas celui qui passe par le pi puisqu’on n’a pas encore fini d’installer et de configurer motion.

page web de test et deboguage de motion sur Raspberry Pi
Evidemment, si la première partie de la page n’affiche pas le flux vidéo de la caméra, chercher comment régler la caméra. Pour moi ça fonctionne avec une caméra Foscam FI8905W réglée comme suit :
- adresse IP fixe 192.168.1.201
- un administrateur (il faudrait sans doute que ce soit seulement un visiteur pour limiter les risques) nommé USER avec mot de passe PWD
- firmware version 11.35.2.63
- Device Embeded Web UI Version 2.4.20.11
Il est impératif de vérifier que http://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD permet bien la visualisation du flux vidéo provenant de la caméra. Sinon la configuration de motion ne fonctionnera pas !
installer motion comme un « service »
Redémarrer le pi avec init 6 ou reboot .
On veut que motion démarre en même temps que le Pi . Pour cela motion doit être installé comme un service.
Dans /etc/default/motion (attention si vous n’utilisez pas Raspbian Jessie, je crois que c’est un autre répertoire), modifier la ligne suivante (no devient yes) :
start_motion_daemon=yes
Pour donner les bons droits d’accès aux fichiers et répertoires nécessaires à motion (les fichiers et répertoires sont ceux qui sont définis dans motion.conf) :
# /etc/motion/motion.conf et thread_.conf en 775 et propriétaire root/motion
chown -R root:motion /etc/motion/
chmod -R 775 /etc/motion/ #664 will not work when motion runs as a service
# /usr/bin/motion : 755
chmod 755 /usr/bin/motion
#var/run/motion (pour motion.pid)
mkdir /var/run/motion
touch /var/run/motion/motion.pid
chmod 755 /var/run/motion/motion.pid
#/home/al/motion/ en niveau 777 et propriétaire root / motion
# dans /home/al/motion/ créer le fichier motion.log en niveau 777
# thread0.conf (foscam) : /home/jf/motion/log/foscam
# thread1.conf (tablette) : /home/jf/motion/log/galaxy
mkdir /home/jf/motion
mkdir /home/jf/motion/log
mkdir /home/jf/motion/log/galaxy
mkdir /home/jf/motion/log/foscam
touch /home/jf/motion/log/motion-log.log
chown -R root:motion /home/jf/motion/
chmod -R 755 /home/jf/motion/
chmod 777 /home/jf/motion/log/motion-log.log
Redémarrer le pi avec init 6 ou reboot .
Maintenant, on doit voir motion parmi tous les services en cours de fonctionnement, avec un « + » devant :
service --status-all
Une liste de services s’affiche, en ordre alphabétique. Lorsqu’il y a [+] devant le service est démarré, sinon il y a [-] devant.

On voit dans cette copie d’écran que motion est démarré.
et si on veut voir le statut de motion
service motion status –l
Logiquement il y a des lignes en rouge, en particulier [ALR] [VID] vid_v4lx_start: Failed to open video device /dev/video0: . C’est normal puisqu’on n’a pas configuré motion.
Dans ce qui suit, on utilisera les commandes suivantes pour arrêter, démarrer ou redémarrer le service motion :
service motion stop
service motion start
service motion restart
Maintenant, il nous reste à configurer motion.
configurer motion
Nous voulons que motion lise le flux vidéo de la caméra à l’adresse IP 192.168.1.201 et qu’il autorise l’accès par un appareil sur le réseau.
Avant de modifier /etc/motion/motion.conf, en faire une copie qu’on appellera par exemple motion.conf.OLD. motion.conf doit avoir des droits d’accès en 664.
Editer motion.conf et régler les lignes comme suit, dans l’ordre du contenu du fichier (pour moi This config file was generated by motion 3.2.12+git20140228 , ça m’indique la version de motion pour lesquelles cette configuration fonctionne).
Pour mieux comprendre les options de réglages que l’on a, voir le wiki de l’auteur de motion, ici.
daemon on
logfile /home/jf/motion/log/motion-log.log
log_level 6 # on le laisse à ce niveau par défaut pour l'instant
v4l2_palette 8 # 17 ne marche pas correctement
width 640 #320 # lié à la caméra pour moi 640
height 480 # lié à la caméra
framerate 2 #2 image par seconde
# pour netcam_url, remarquer le ';' devant et le supprimer !
netcam_url http://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD
; netcam_userpass value # laisser en commentaire avec ; devant
netcam_keepalive on
ffmpeg_output_movies on
; si on ne commente pas, erreur [0] [ALR] [ALL] conf_cmdparse: Unknown config option "sdl_threadnr"
; erreur pas grave mais remplit le fichier log
# sdl_threadnr 0
target_dir /home/jf/motion/log # Target base directory for pictures and films
# on utilise la commande http qui fonctionne en direct dans notre page web de déboguage
stream_port 8081
stream_localhost off # permet l'accès en local
webcontrol_port 8085
webcontrol_localhost off # on bloque l'accès
Ensuite on redémarre motion avec service motion restart . Puis Puis service motion status -l nous indique si tout va bien.

Tout va bien mais erreur Unknown config option « sdl_threadnr ». Je n’ai pas trouvé comment la résoudre et ça ne paraît pas géner le fonctionnement de motion.
Tester le bon fonctionnement
Si le flux de la caméra ne s’affiche pas correctement dans la deuxième partie de notre page de test page-test.html , ouvrir /home/al/tmp/motion.log et identifier l’erreur qui bloque motion.
on peut aussi arrêter le service motion (service motion stop ) et taper seulement motion , qui affiche des indications d’erreurs éventuelles.

Et maintenant ?
Dans l’article suivant de cette série Caméra de surveillance et Raspberry Pi, nous verrons comment configurer motion pour qu’il détecte les mouvements et alerte.
Commentaires récents