2017-01-13

Domoticz utilise les caméras comme si elles étaient des appareils photographiques. Beaucoup de caméras de sécurité peuvent créer des photographies en même temps qu'elles émettent un flux vidéo. C'est le cas de la BlitzWolf SIC1, mais malheureusement, il semble qu'on ne puisse pas invoquer cette fonction avec une simple URL. Les logiciels qui prennent en charge ONVIF peuvent obtenir une image sur demande, ce qui indique qu'il faudrait utiliser cette interface. Ne sachant pas comment le faire, j'ai trouvé sur le Web une autre approche qui consiste à saisir une image de flux vidéo provenant de la caméra.

Tirer une image

On sait déjà l'adresse du flux RTSP de faible résolution rtsp://192.168.0.22:8554/2.3gp. Il s'agit d'utiliser ffmpeg (ou sa fourche avconv selon la version de Linux) pour extraire une image. J'ai vérifié avec mon ordinateur de bureau que ceci fonctionne.

michel@hp:~$ avconv -y -loglevel error -i "rtsp://192.168.0.22:8554/2.3gp" -s 640x360 -vframes 1 "snapshot.jpg"
L'image snapshot.jpg, de taille 640×360 en pixels, est crée d'un photogramme. Si l'on change l'option -loglevel error à -loglevel debug on apprend que le débit du flux vidéo, nominalement de 25 images à la seconde (25fps), est en réalité de 21,33 photogrammes ou images par seconde. Conséquemment, il faudrait un peu moins de 47 millisecondes pour obtenir une image. La connexion avec la caméra ne coïncidera pas avec la transmission du début d'une image dans la plus grande part des cas. Il pourrait s'écouler presque 94 millisecondes avant d'obtenir la première image complète. Un dixième de seconde est très court, mais le temps réel pour obtenir une image de cette façon est bien plus long. Il faut ajouter le temps pour démarrer avconv, le temps pour que le logiciel analyse la ligne de commande, le temps qu'il mette en place les modules nécessaires, le temps pour établir la connexion avec la caméra, le temps pour décoder l'image et la convertir en un JPEG et enfin le temps pour sauvegarder l'image dans un fichier. Tout cela fait en sorte que l'opération est très longue, en termes relatifs évidemment. J'avais ajouté l'option -an pour éliminer le flux audio, mais cela ne semble pas changer grand-chose, probablement parce qu'il n'y a pas d'audio dans le format de sortie JPEG et, qu'en plus, la caméra n'a pas d'audio.

On notera l'absence de sécurité; aucun mot de passe n'est nécessaire.

C'est avconv qu'on utilise actuellement avec la version Jessie de Linux sur le Raspberry Pi. Son installation est simple avec apt-get. J'en ai profité pour mettre à jour le système et pour créer un répertoire où seront stockées les photographies.

pi@rpi2b:~ $ sudo apt-get update pi@rpi2b:~ $ sudo apt-get upgrade ce qui peut prendre un temps considérable pi@rpi2b:~ $ sudo apt-get install libav-tools pi@rpi2b:~ $ mkdir snaps pi@rpi2b:~ $ avconv -y -loglevel error -i "rtsp://192.168.0.22:8554/2.3gp" -s 640x360 -vframes 1 "/home/pi/snaps/snapshot.jpg"

La dernière ligne est un test. On remarquera comment cette opération est plus lente encore sur un Raspberry Pi de deuxième génération.

Notification

En principe on devrait être capable d'envoyer l'image par courriel avec cURL qui est déjà installé sur le Raspberry Pi. Malheureusement, je n'y suis pas arrivé. En revanche, j'ai réussi avec sendEmail sur Ubuntu. Voici les options du logiciel dont nous avons besoin et un exemple qui utilise un compte GMail pour envoyer un message.

-f senderSender's full email address
-t recipientRecipient's full email address
-u sujetSujet du message
-m messageCorps du message
-s serveur[:port]Serveur de courriel avec le port si nécessaire
-o tls=yes|no|autoUtilisation du cryptage SSL/TLS
-xu utilisateurNom d'utilisateur du serveur de courriel
-xp mot de passeMot de passe de l'utilisateur du serveur de courriel
-a fichierNom du fichier à annexer au message

michel@hp:~$ sendemail -f moi@gmail.com \ > -t moi@yahoo.ca \ > -u "Test" \ > -m "Le corps du message " \ > -s smtp.gmail.com:587 \ > -xu moi@gmail.com \ > -xp 123456 \ > -a "image.jpg"

Pour que tout fonctionne sur le Raspberry Pi, qui héberge Domoticz, il faut installer sendEmail. Ce dernier, qui est un script Perl a besoin de deux bibliothèques (attention, on ne peut les installer sur le Rapsberry Pi à partir de CPAN). Voici comment procéder.

pi@rpi2b:~ $ sudo apt-get install libnet-ssleay-perl pi@rpi2b:~ $ sudo apt-get install libio-socket-ssl-perl pi@rpi2b:~ $ sudo apt-get install sendemail

Domesticz

Il s'agit maintenant de combiner ces deux éléments dans un script, /home/pi/domoticz/scripts/bash/snaps.sh qui sera utilisé dans Domoticz. Le but est de créer un interrupteur sur lequel on clique pour obtenir une image provenant de la caméra par courriel.

DATETIME=`date +"%Y-%m-%d %T"` avconv -y -loglevel error -rtsp_transport udp -i "rtsp://192.168.0.22:8554/2.3gp" -s 640x360 -vframes 1 "/home/pi/snaps/$DATETIME.jpg" sendEmail -f "moi@gmail.com" -t "moi@gmail.com" -m "Image $DATETIME de Domespic" -u "Domespic" -s "smtp.gmail.com:587" -xu "moi@gmail.com" -xp "123456" -o tls=yes -a "/home/pi/snaps/$DATETIME.jpg" find /home/pi/snaps/ -name '*.jpg' -mtime +2 -delete

Quand le script est invoqué, il sauvegarde une image tirée du flux vidéo de la caméra dans fichier jpeg avec comme nom la date et l'heure actuelle. Les images obtenues de la caméra sont stockées dans un dossier nommé /home/pi/snaps déjà créé. Puis toute image datant de plus de deux jours est éliminée pour empêcher un débordement de la capacité de la carte SD.

Dans Domoticz, j'ai ajouté un capteur virtuel (Réglages/Matériel) que j'ai nommé Caméra de sécurité. J'ai changé le type d'interrupteur à Push On Button j'en ai fixé le Délai d'extinction: à 2 secondes. Un délai plus court ne fonctionnait pas. Enfin, Action On: invoque le script défini ci-dessus.