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 :
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 {} \;
l’ajouter au cron (voir les instructions pour le Raspberry Pi sur le site officiel du Pi).
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 :
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) :
Août 2022 : L'article ci-dessous est mis à jour sur la façon de sélectionner ce que l'on veut installer. J'ai également ajouté deux liens vers des articles qui exposent d'autres manière de faire fonctionner un raspberry Pi de manière "headless", sans y connecter de clavier, souris et ecran.
Pour pouvoir communiquer avec un Raspberry Pi sans avoir à le connecter à un clavier, une souris et un écran, le plus simple est d’utiliser une interface pour communiquer en « SSH » (Secure Shell – voir sur Wikipedia) depuis un ordinateur. Voici la méthode pour installer Cygwin sur un ordinateur Windows (7 à 10) et faire sa première connexion au Pi.
Exécuter setup.exe (en tant qu’administrateur) et suivre les instructions.
Pendant l’installation, on pourra s’aider de « setting up cygwin« . Voici les principaux choix que j’ai fait :
il vaut mieux installer pour « tous les utilisateurs » afin d’éviter d’éventuels problèmes, même si on est seul à utiliser cygwin.
install directory : c:/cygwin64
Local Package Directory : un répertoire distinct du répertoire d’installation. J’ai utilisé un sous-répertoire de « téléchargement ».
C’est au moment de choisir les paquets à installer que c’est assez difficile. Il ne faut choisir que ce dont on a besoin, dans chaque catégorie de paquets. Pour moi, c’est :
Admin cygrunsrv
Admin shutdown
Net openSSH
X11 tout
J’avoue que je ne suis pas certaine du rôle des deux premiers paquets. Le troisième permet d’utiliser des commandes SSH dans notre console Cygwin. Le quatrième permet d’afficher l’écran du Pi en mode graphique (voir détails ci-dessous).
MAJ d’août 2022 : Pour choisir il faut cliquer sur la flèche à droite des items à installer comme dans la copie d’écran dessous (ici pour l’ensemble des paquets relatifs à X11). Pour les éléments isolés, il faut choisir une version et pas « passe ».
Ensuite on clique sur « installer » et nous disposons d’une console pour commander le Pi directement dans notre ordinateur habituel.
Se connecter en ssh au Pi
Il suffit de taper la commande ssh pi@nautilus , puis le mot de passe correspondant pour se connecter :
Que faire en cas d’erreur @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ?
La solution vient d’ici. Il suffit de taper ssh-keygen -R 192.168.1.8 dans l’invite de commande Cygwin. Ensuite, on peut de nouveau se connecter en ssh à l’adresse 192.168.1.8 avec ssh pi@192.168.1.8 et ça fonctionne de nouveau.
cygstart xwin # will open another window for the graphic display
# cygstart xwin -screen 0 1440x900@1 -wgl would open
# a 1440x900 window wirh OpenGL accelerated graphics
export DISPLAY=:0.0 # Cygwin is aware of the new remote display
ssh -Y pi@address # SSH to your PI
lxsession # start the windows manager.
# it takes a few seconds, then you have the Pi GUI
On peut maintenant interagir avec le Pi en mode graphique :
Dans la copie d’écran ci-dessus, j’ai cliqué sur le bouton en bas à gauche pour pouvoir voir la liste des menus.
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.
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 quehttp://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWDpermet 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.
Note si on a plus d’une caméra, il faut régler motion.conf et ajouter autant de fichier thread.conf qu’il y a de caméra : voir les précisions (en anglais) de l’auteur de motion ici. Tout à la fin de motion.conf, il y a des instructions aussi.
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).
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.
Cet article fait partie d’une série Niveau d’une cuve de fioul. Ici, j’indique des références que nous pourrons utiliser pour mener notre projet. (suite…)
Cet article fait partie d’une série Niveau d’une cuve de fioul. Dans le premier article, je décrivais le projet. Ici, j’indique ce que j’ai acheté comme composants.
Commentaires récents