Supprimer les fichiers vidéo et image de plus de deux jours

Supprimer les fichiers vidéo et image de plus de deux jours

Dans le premier article de cette série, , 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, .

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).

Lire un flux vidéo d’une webcam avec un Raspberry Pi

Lire un flux vidéo d’une webcam avec un 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

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.

Raspberry Pi (jessie) avec Motion comme un service

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.

J’ai installé de cette façon une deuxième caméra à partir d’une vieille tablette android : une caméra IP avec une vieille tablette android ?

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.

Motion bien configuré sur Raspberry Pi

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.

affichage (embed) du flux motion

Et maintenant ?

Dans l’article suivant de cette série , nous verrons comment configurer motion pour qu’il détecte les mouvements et alerte.