FUNIX

Mettez un manchot dans votre PC


Encourager FUNIX

La consultation du site est totalement libre et gratuite, sans publicités. Les dons sont néanmoins appréciés pour payer l'hébergement et encourager son auteur


Systèmes de vidéosurveillance

Systèmes de vidéo surveillance

Dernière modification 1er septembre 2024


Présentation

Cette page a pour objectif de vous présenter différents outils pour monter un système de vidéosurveillance basé sur Linux avec l'utilisation de caméras de surveillance indépendantes (IP ou Wifi), analogique, numérique ou de simples webcams. Sont présentés deux logiciels, zoneminder et motionplus, les deux permettant d'intégrer un large panel de caméras, de faire de la détection automatique de mouvement et de créer des évènements, ils sont basés également sur un serveur web, permettant via un navigateur de les configurer, de visualiser en temps réel les caméras et de gérer les évènements. Zoneminder est de prime abord plus complexe avec beaucoup plus de fonctionnalités que motionplus plus simple et moins lourd.

Cette page est appelée à s'étoffer au fur et à mesure de l'installation, de la montée en gamme et en perfectionnement de mon propre système.

Le hardware

On trouve de tout dans le domaine des caméras de surveillance à des prix plus ou moins abordables, elles sont généralement fournies avec un logiciel dédié propriétaire fonctionnant forcément sous windows, le fait de le faire fonctionner sous Linux ne permet pas toujours de pouvoir profiter pleinement de toutes leurs fonctionnalités, on se contentera du standard et toute l'intelligence logicielle étant déportée dans le logiciel de supervision.

Sans vouloir faire de la publicité pour telle ou telle marque, je cherchais une caméra IP pour la placer à l'extérieur, j'ai d'abord fait mon choix sur la marque Reolink, mais j'ai été incapable de la faire fonctionner sous Linux et même sous windows ! Et rien n'est fait de la part de ce constructeur pour les utilisateurs linux, donc retour à l'envoyeur et je me rabats sur la marque Annke.


Dans un cas comme un autre ces caméras IP sont alimentées via le câble Ethernet (PoE Power over Ethernet) et cela nécessite un routeur ou un adaptateur particulier comme celui qu'on peut voir sur la photo ci-dessus.

Petit bémol, j'ai dû passer au moins une fois par windows pour l'activer avec le logiciel maison en fixant un mot de passe et l'adresse IP mais ensuite toute la configuration peut se faire d'un navigateur sous linux en tapant simplement l'adresse IP dans la barre d'URL. Les screenshots ci-dessous ont été faits avec Firefox sur Linux/Mageia 9.


Une fois qu'on a saisi son login, on tombe sur la page de visualisation en temps réel qui ne fonctionne pas sous linux mais ce n'est pas grave car on n'en pas l'utilité.

En revanche la page de configuration fonctionne parfaitement et c'est bien là l'intérêt, on a accés à tous les paramètres possibles à partir du navigateur.


La visualisation se fait simplement en tapant dans un shell

ffplay rtsp://admin:password@192.168.2.110

Streamer le flux vidéo d'une caméra en rtsp

Si votre caméra n'est pas équipée de base d'un serveur de flux vidéo compatible rtsp, vous pouvez monter en monter un qui pourra marcher avec une simple webcam. Mon choix s'est porté sur mediamtx qui est bien plus qu'un simple serveur rtsp. Le site officiel est https://github.com/bluenviron/mediamtx, on y récupère la dernière release qu'on décompresse en tapant

tar xvfz mediamtx-1.8.5.tar.gz

cela donne le répertoire mediamtx-1.8.5, les sources se compilent avec le langage go qu'il faudra avoir préalablement installé (package golang-bin sur ma mageia 9). Dans le répertoire on tape successivement

go generate ./...
CGO_ENABLED=0 GOOS=linux  go build .

cela va donner un binaire mediamtx que vous pouvez très bien déplacé ensuite sous /usr/local/bin. On le lance d'abord sans être nécessairement root

mediamtx

voilà les traces

2024/08/17 09:13:20 INF MediaMTX v0.0.0
2024/08/17 09:13:20 INF configuration loaded from /usr/local/linux/multimedia/mediamtx-1.8.5/mediamtx.yml
2024/08/17 09:13:20 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2024/08/17 09:13:20 INF [RTMP] listener opened on :1935
2024/08/17 09:13:20 INF [HLS] listener opened on :8888
2024/08/17 09:13:20 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2024/08/17 09:13:20 INF [SRT] listener opened on :8890 (UDP)

on lance le flux vidéo avec ffmpeg avec comme source /dev/video0 qui correspond à la webcam sur une adresse rtsp correspondant à la machine sur laquelle mediamtx est lancé

ffmpeg -f v4l2 -framerate 24 -video_size 640x480 -i /dev/video0 -f rtsp -rtsp_transport tcp rtsp://tetiaroa.kervao.fr:8554/monflux

voilà ce que le serveur renvoie

2024/08/17 09:29:19 INF [RTSP] [conn 192.168.2.19:37574] opened
2024/08/17 09:29:19 INF [RTSP] [session 9132306b] created by 192.168.2.19:37574
2024/08/17 09:29:19 INF [RTSP] [session 9132306b] is publishing to path 'monflux', 1 track (MPEG-4 Video)

on peut visualiser le flux vidéo de n'importe quelle machine du réseau, en tapant

ffplay rtsp://tetiaroa.kervao.fr:8554/monflux

voilà la trace du serveur

2024/08/17 09:31:01 INF [RTSP] [conn 192.168.2.16:55664] opened
2024/08/17 09:31:01 INF [RTSP] [session bd9fc103] created by 192.168.2.16:55664
2024/08/17 09:31:01 INF [RTSP] [session bd9fc103] is reading from path 'monflux', with UDP, 1 track (MPEG-4 Video)

La webcam pourra être intégrée et utilisée dans les outils de vidéosurveillance présentés plus bas.

[retour haut de la page]

Zoneminder

Installation

Zoneminder est considéré comme le logiciel opensource de vidéosurveillance de référence. Le site officiel est https://zoneminder.com.

Butant pour l'instant au link lors de la compilation des sources, je me suis rabattu sur le package de la Mageia 9 tainted, mais comme je dispose déjà d'un serveur apache+PHP+MariaDB personnalisé, pas question de l'installer en doublon. Je l'installe donc sans prendre en compte les dépendances.

rpm -ivh --nodeps zoneminder-1.36.33-2.mga9.tainted.x86_64.rpm

On veillera toutefois à installer tous ces packages perl

- perl-Apache-Test-1.430.0-2.mga9.noarch
- perl-AppConfig-1.710.0-7.mga9.noarch
- perl-Archive-Zip-1.680.0-2.mga9.noarch
- perl-Astro-SunTime-0.60.0-5.mga9.noarch
- perl-BSD-Resource-1.291.100-10.mga9.x86_64
- perl-Class-Inspector-1.360.0-3.mga9.noarch
- perl-Class-Load-0.250.0-4.mga9.noarch
- perl-Class-Mix-0.6.0-5.mga9.noarch
- perl-Class-Singleton-1.600.0-2.mga9.noarch
- perl-Class-Std-0.13.0-6.mga9.noarch
- perl-Class-Std-Fast-0.0.8-14.mga9.noarch
- perl-Convert-BinHex-1.125.0-5.mga9.noarch
- perl-Crypt-Eksblowfish-0.9.0-23.mga9.x86_64
- perl-Crypt-Rijndael-1.160.0-4.mga9.x86_64
- perl-Data-Entropy-0.7.0-10.mga9.noarch
- perl-Data-Float-0.13.0-5.mga9.noarch
- perl-Data-Flow-1.20.0-10.mga9.noarch
- perl-Data-OptList-0.113.0-1.mga9.noarch
- perl-Data-UUID-1.227.0-1.mga9.x86_64
- perl-Date-Manip-6.900.0-1.mga9.noarch
- perl-DateTime-1.590.0-1.mga9.x86_64
- perl-DateTime-Locale-1.370.0-1.mga9.noarch
- perl-DateTime-TimeZone-2.600.0-1.mga9.noarch
- perl-DBD-mysql-4.50.0-8.mga9.x86_64
- perl-Device-SerialPort-1.40.0-26.mga9.x86_64
- perl-File-ShareDir-1.118.0-2.mga9.noarch
- perl-HTTP-Lite-2.440.0-6.mga9.noarch
- perl-IO-Interface-1.90.0-14.mga9.x86_64
- perl-IO-SessionData-1.30.0-9.mga9.noarch
- perl-IO-Socket-Multicast-1.120.0-26.mga9.x86_64
- perl-JSON-MaybeXS-1.4.4-1.mga9.noarch
- perl-Linux-Pid-0.40.0-24.mga9.x86_64
- perl-List-AllUtils-0.190.0-2.mga9.noarch
- perl-List-SomeUtils-0.590.0-1.mga9.noarch
- perl-List-UtilsBy-0.120.0-1.mga9.noarch
- perl-MIME-tools-5.510.0-1.mga9.noarch
- perl-Net-SFTP-Foreign-1.930.0-2.mga9.noarch
- perl-Number-Bytes-Human-0.110.0-5.mga9.noarch
- perl-Params-Classify-0.15.0-11.mga9.x86_64
- perl-Params-Util-1.102.0-4.mga9.x86_64
- perl-PHP-Serialization-0.340.0-11.mga9.noarch
- perl-Pod-POM-2.10.0-7.mga9.noarch
- perl-SOAP-Lite-1.270.0-3.mga9.noarch
- perl-SOAP-WSDL-3.4.0-3.mga9.noarch
- perl-Sub-Install-0.929.0-1.mga9.noarch
- perl-Sys-CPU-0.610.0-20.mga9.x86_64
- perl-Sys-MemInfo-0.990.0-13.mga9.x86_64
- perl-Sys-Mmap-0.200.0-6.mga9.x86_64
- perl-Task-Weaken-1.60.0-4.mga9.noarch
- perl-Template-Toolkit-3.101.0-1.mga9.x86_64
- perl-Time-ParseDate-2015.103.0-6.mga9.noarch
- perl-URI-Encode-1.1.1-4.mga9.noarch
- perl-X10-0.30.0-10c.mga9.noarch

Il faut commencer par créer une base de données mysql en tapant:

mariadb -u root -p < /usr/share/zoneminder/db/zm_create.sql

on vérifie si la base est bien créée, elle se nomme simplement zm et on crée un utilisateur privilégié zmuser sur la base zm

mariadb -u root -p

voilà le résultat

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 25
Server version: 11.4.2-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+---------------------+
| Database            |
+---------------------+
| MyMusic82           |
| MyMusic83           |
| MyVideos121         |
| MyVideos131         |
| digikam             |
| digikam_similarites |
| digikam_vignettes   |
| digikam_visages     |
| information_schema  |
| mysql               |
| performance_schema  |
| phpmyadmin          |
| roundcubemail       |
| spamassassin        |
| syncstorage_rs      |
| sys                 |
| tokenserver_rs      |
| zm                  |
+---------------------+
18 rows in set (0,096 sec)

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> CREATE USER 'zmuser' IDENTIFIED BY 'zmpass';
Query OK, 0 rows affected (0,087 sec)

MariaDB [mysql]> GRANT ALL ON zm.* TO 'zmuser'@'localhost';
Query OK, 0 rows affected (0,201 sec)

maintenant j'ai modifié le fichier /usr/lib/systemd/system/zoneminder.service qui contiendra

[Unit]
Description=ZoneMinder CCTV recording and security system
After=network.target mysqld.service httpd.service
Requires=mariadb.service httpd.service

[Service]
User=apache
Type=forking
ExecStart=/usr/bin/zmpkg.pl start
ExecReload=/usr/bin/zmpkg.pl reload
ExecStop=/usr/bin/zmpkg.pl stop

[Install]
WantedBy=multi-user.target

Attention le user doit correspondre au propriétaire du processus Apache httpd. La mise à jour du fichier doit être prise en compte en tapant systemctl daemon-reload

Le mot de passe zmpass devra être changé

[retour haut de la page]

Le fichier de configuration /etc/zm/zm.conf ressemble à ça

# ==========================================================================
#
# ZoneMinder Base Configuration
#
# ==========================================================================
#
# *** DO NOT EDIT THIS FILE ***
#
# To make custom changes to the variables below, create a new configuration
# file, with an extention of .conf, under the /etc/zm/conf.d
# folder, containing your desired modifications.
#

# Path to installed data directory, used mostly for finding DB upgrade scripts
ZM_PATH_DATA=/usr/share/zoneminder

# Path to ZoneMinder binaries
ZM_PATH_BIN=/usr/bin

# Path to ZoneMinder libraries (none at present, for future use)
ZM_PATH_LIB=/usr/lib64

# Path to ZoneMinder configuration (this file only at present)
ZM_PATH_CONF=/etc/zm

# Path to ZoneMinder web files
ZM_PATH_WEB=/usr/share/zoneminder/www

# Path to ZoneMinder cgi files
ZM_PATH_CGI=/usr/share/zoneminder/cgi-bin

# Username and group that web daemon (httpd/apache) runs as
# utilisateur et groupe propriétaire du daemon apache httpd
ZM_WEB_USER=apache
ZM_WEB_GROUP=apache

# ZoneMinder database type: so far only mysql is supported
ZM_DB_TYPE=mysql

# ZoneMinder database hostname or ip address and optionally port or unix socket
# Acceptable formats include hostname[:port], ip_address[:port], or
# localhost:/path/to/unix_socket
# le nom du serveur sur lequel tourne le serveur mariadb
ZM_DB_HOST=mariadb-serveur

# ZoneMinder database name
ZM_DB_NAME=zm

# ZoneMinder database user
ZM_DB_USER=zmuser

# ZoneMinder database password
# le mot de passe tel que défini dans mariadb
ZM_DB_PASS=zmpass

# SSL CA certificate for ZoneMinder database
ZM_DB_SSL_CA_CERT=

# SSL client key for ZoneMinder database
ZM_DB_SSL_CLIENT_KEY=

# SSL client cert for ZoneMinder database
ZM_DB_SSL_CLIENT_CERT=

# Do NOT set ZM_SERVER_HOST if you are not using Multi-Server
# You have been warned
#
# The name specified here must have a corresponding entry
# in the Servers tab under Options
ZM_SERVER_HOST=

il faudra veiller à ce que l'utilisateur apache soit bien propriétaire de certains répertoires nécessaires au fonctionnement de zoneminder

chown -R apache:apache /var/log/zm
chown -R apache:apache /var/lib/zoneminder
chown -R apache:apache /usr/share/zoneminder/www
chown -R apache:apache /var/cache/zoneminder

accessoirement j'ai créé le lien suivant

ln -s /var/cache/zoneminder/ /usr/share/zoneminder/www/cache

il faudra ensuite modifier la configuration du serveur Apache httpd dans le fichier /usr/local/apache2/conf/httpd/conf, tout d'abord la liste de modules utiles et nécessaires

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php_module         modules/libphp.so

(...)

# le propriétaire du daemon apache/httpd

User apache
Group apache

(...)

#directives spécifiques zoneminder
<Directory "/usr/share/zoneminder/www">
   Options -Indexes +FollowSymLinks
   AllowOverride All
   Require all granted
</Directory>

<Directory "/var/cache/zoneminder">
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Directory "/usr/share/zoneminder/cgi-bin">
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    AllowOverride All
    Require all granted
</Directory>

<Directory "/usr/share/zoneminder/www/api">
   RewriteEngine on
   RewriteRule ^$ app/webroot/ [L]
   RewriteRule (.*) app/webroot/$1 [L]
   RewriteBase /zm/api
</Directory>

<Directory "/usr/share/zoneminder/www/api/app">
   RewriteEngine on
   RewriteRule ^$ webroot/ [L]
   RewriteRule (.*) webroot/$1 [L]
   RewriteBase /zm/api
</Directory>

<Directory "/usr/share/zoneminder/www/api/app/webroot">
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    RewriteBase /zm/api
</Directory>

#alias zoneminder dans cet ordre précis
ScriptAlias /zm/cgi-bin "/usr/share/zoneminder/cgi-bin"
Alias /zm/cache "/var/cache/zoneminder"
Alias /zm "/usr/share/zoneminder/www"

on veillera également à ce que la variable de la zone horaire du fichier /usr/local/apache2/conf/php.ini soit bien initialisée

date.timezone = Europe/Paris

on relance Apache httpd pour la prise en compte de la mise à jour de ces deux derniers fichiers

systemctl httpd restart

et on lance zoneminder en tapant

systemctl start zoneminder

et voilà ce que renvoie la commande

systemctl status zoneminder

● zoneminder.service - ZoneMinder CCTV recording and security system
     Loaded: loaded (/usr/lib/systemd/system/zoneminder.service; disabled; preset: disabled)
     Active: active (running) since Fri 2024-08-09 16:03:47 CEST; 11s ago
    Process: 3570 ExecStart=/usr/bin/zmpkg.pl start (code=exited, status=0/SUCCESS)
   Main PID: 3578 (zmdc.pl)
      Tasks: 5 (limit: 9239)
     Memory: 91.5M
        CPU: 2.077s
     CGroup: /system.slice/zoneminder.service
             ├─3578 /usr/bin/perl -wT /usr/bin/zmdc.pl startup
             ├─3606 /usr/bin/perl -wT /usr/bin/zmfilter.pl --filter_id=1 --daemon
             ├─3610 /usr/bin/perl -wT /usr/bin/zmfilter.pl --filter_id=2 --daemon
             ├─3616 /usr/bin/perl -wT /usr/bin/zmwatch.pl
             └─3620 /usr/bin/perl -wT /usr/bin/zmstats.pl

août 09 16:03:44 ultra.kervao.fr systemd[1]: Starting zoneminder.service...
août 09 16:03:47 ultra.kervao.fr systemd[1]: Started zoneminder.service.


Utilisation

Voilà l'écran principal avec une caméra rajoutée à partir de la commande Ajouter Caméra avec le mode Modect, c'est à dire qu'il va détecter les mouvements et créer un évènement pour chacun.

Il aura fallu définir la source vidéo de la vue, en mettant le chemin

Puis on définit les caractéristiques de la caméra à partir de la source


Et en revenant au tableau de bord, en cliquant sur la caméra on a la vue en temps réel


Les évènements sont affichés dans une liste en dessous de la vue générale


Pour visualiser un évènement particulier, il faut cliquer dessus


On dispose d'outils de rejeu vidéo pour visualiser l'évènement en question, ou également un mode image


Détecter des mouvements avec motionplus

Installation

Le programme motionplus est un utilitaire de détection de mouvement à partir de diverses sources vidéo, webcam, flux vidéo, caméra IP, wifi ou que sais-je encore disposible sur le réseau. Il intègre un serveur httpd où les vidéos peuvent être visualisées en temps réel, on peut également visualiser les évènements, c'est à dire tout mouvement ayant fait l'objet d'un enregistrement. L'utilisation d'une base de donnée est nécessaire pour gérer les évènements.

Le site officiel est https://motion-project.github.io/ on y découvre le programme d'origine motion et une version refondue appelée motionplus présentée ici dans cette page. La dernière release 0.2.1 n'est pas compatible avec les versions récentes de ffmpeg, on récupère donc le master de la version en développement qu'on décompresse en tapant

unzip motionplus-master.zip

cela donne le répertoire motionplus-master on récupérera préalablement les packages lib64microhttpd-devel et lib64camera-devel, on verra plus loin comment utiliser un serveur Apache httpd. On revient dans le répertoire dans lequel on tape

autoreconf -fiv;./configure

Voilà le résultat

   **************************
      Configure status      
      motionplus 0.2.0-gitUNKNOWN
   **************************

CPPFLAGS:  -D_THREAD_SAFE    -I/usr/include/p11-kit-1  -I/usr/include/webp  -I/usr/include/libcamera  -I/usr/local/include  -I/usr/include/opencv4  -I/usr/include/mysql/   -D_REENTRANT    -W -O3 -Wall -Wextra -Wconversion -Wformat -Wshadow -Wpointer-arith -Wwrite-strings -Wredundant-decls -ggdb -g3

LIBS:  -pthread   -ljpeg  -lmicrohttpd  -lwebpmux -lwebp -lsharpyuv  -lcamera -lcamera-base  -L/usr/local/lib -lavutil -lavformat -lavcodec -lswscale -lavdevice  -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core  -L/usr/lib64/ -lmariadb  -lsqlite3  -lpulse -pthread  -lpulse-simple  -lasound  -lfftw3

LDFLAGS:


OS                    : linux-gnu
pthread_np            : no
pthread_setname_np    : yes
pthread_getname_np    : yes
XSI error             : yes
V4L2                  : yes
webp                  : yes(1.3.0)
libcamera             : yes(0.2.0)
FFmpeg                : yes(61.1.100)
OpenCV                : yes(4.6.0)
SQLite3               : yes(3.40.1)
MYSQL                 : no
PostgreSQL            : no
MariaDB               : yes(3.3.10)
ALSA                  : yes(1.2.9)
PulseAudio            : yes(16.1)
FFTW                  : yes(3.3.10)

Install prefix        : /usr/local

La base de données est nécessaire pour gérer les évènements, pour ffmpeg voir la page outils de base pour la vidéo et pour MySQL la page correspondante. On tape maintenant

make

puis en tant que root make install. On crée ensuite la base de donnée motionplus

mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10952
Server version: 11.4.2-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database motionplus;
Query OK, 1 row affected (0,001 sec)

[retour haut de la page]

A présent on va modifier le fichier de configuration, un fichier de configuration motionplus-dist.conf par défaut a été créé sous /usr/local/etc/motionplus/ on le renomme motionplus.conf. Vous trouverez ci-dessous les modifications qui ont été opérées

;*************************************************
;*****   Camera
;*************************************************
device_name
device_id
target_dir /emile/photo/motion

La variable target_dir pointe à l'endroit où seront stockés snapshots et vidéos, je l'ai placé dans l'arborescence de mon serveur Apache pour qu'ils puissent être visibles.

(...)

;*************************************************
; Device config files - One for each device.
;*************************************************
camera /usr/local/etc/motionplus/camera1.conf
camera /usr/local/etc/motionplus/camera2.conf

Définition des caméras qui seront utilisées et qui seront décrites dans les fichiers mentionnés ci-dessus

(...)

;*************************************************
;*****   Scripts
;*************************************************
on_event_start
/usr/local/bin/motionmail
on_event_end

script à lancer s'il y a un évènement en cours. Le script contient simplement

#!/bin/bash
mail -s "Evenement motion" olivier.hoarau@funix.org

(...)

;*************************************************
;*****   Picture
;*************************************************
picture_output off
picture_filename %v-%Y%m%d%H%M%S-%q

;*************************************************
;*****   Movie
;*************************************************
movie_output on
movie_max_time 120
movie_quality 45
movie_container mkv
movie_filename %v-%Y%m%d%H%M%S

pour chaque évènement c'est une vidéo utilisant le conteneur MKV (et le codec x265) qui sera utilisée, il faut mettre picture_output à on pour avoir des snapshots

(...)

;*************************************************
;*****   Base de donnée
;*************************************************

database_type mariadb
database_dbname motionplus
database_host mariadb-serveur
database_port 3306
database_user root
database_password password

Ces dernières directives permettent d'accéder à la base de données motionplus. Le logiciel n'intègre pas par défaut de système d'alerte par mail ou sms, en revanche on dispose du paramètre on_motion_detected qui permettra de lancer un script qui pourra faire cette alerte.

Maintenant pour une connexion sécurisée avec mot de passe et chiffrement TLS on rajoutera les lignes suivantes

;*****   Web Control
;*************************************************
webcontrol_port 8080
webcontrol_localhost off
webcontrol_parms 3
webcontrol_auth_method digest
webcontrol_authentication user:motdepasse
webcontrol_tls on
webcontrol_cert /etc/ssl/public/apache.crt
webcontrol_key /etc/ssl/apache/apache.key

je me suis servi du certificat perso et de la clé définis par ici.

Pour davantage de détails sur le fichier de configuration, voir cette page https://motion-project.github.io/motionplus_config.html

On définit maintenant les fichiers de configuration des caméras, exemple ci-dessous avec une caméra IP accessible via rtsp et une webcam.

; /usr/local/etc/motionplus/camera1.conf
;
; This config file was generated by motionplus 0.2.0-gitUNKNOWN

;*************************************************
; Configuration options specific to camera 1
;*************************************************

;*************************************************
;*****   Camera
;*************************************************
device_name MyCam1
device_id 101

;*************************************************
;*****   Source
;*************************************************
netcam_url rtps://admin:password@192.168.2.110

;*************************************************
;*****   Image
;*************************************************
width 1280
height 720

;*************************************************
;*****   Overlays
;*************************************************
text_left CAMERA 1

;*************************************************
;*****   Movie
;*************************************************
movie_filename CAM01_%t-%v-%Y%m%d%H%M%S

et le fichier pour la deuxième caméra

; /usr/local/etc/motionplus/camera2.conf
;
; This config file was generated by motionplus 0.2.0-gitUNKNOWN

;*************************************************
; Configuration options specific to camera 2
;*************************************************

;*************************************************
;*****   Camera
;*************************************************
device_name Patio
device_id 102

;*************************************************
;*****   Source
;*************************************************
v4l2_device /dev/video0

;*************************************************
;*****   Image
;*************************************************
width 352
height 288

;*************************************************
;*****   Overlays
;*************************************************
text_left Camera2
text_right Patio\n%Y-%m-%d\n%T-%q

;*************************************************
;*****   Movie
;*************************************************
movie_filename CAM02_%t-%v-%Y%m%d%H%M%S

[retour haut de la page]

Utilisation

On lance maintenant motionplus, le propriétaire du process doit pouvoir écrire dans le répertoire désigné par target_dir (évitez root...). Voilà le résultat

[NTC][ALL][motionplus] conf_process: Processing config file /usr/local/etc/motionplus/motionplus.conf
[NTC][ALL][motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera1.conf
[NTC][ALL][motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera2.conf
[NTC][ALL][motionplus] set_log_file: Logging to syslog
[NTC][ALL][motionplus] mytranslate_init: Language: English
[NTC][STR][motionplus] webu_start: Starting webcontrol on port 8080
[NTC][STR][motionplus] start_daemon_port1: Started webcontrol on port 8080
[NTC][ALL][motionplus] motpls_allcams_init: No stream_preview_location for cam 101
[NTC][ALL][motionplus] motpls_allcams_init: No stream_preview_location for cam 102
[NTC][ALL][motionplus] motpls_allcams_init: Creating default stream preview values
[NTC][ENC][motionplus] motpls_av_init: libavcodec  version 61.3.100
[NTC][ENC][motionplus] motpls_av_init: libavformat version 61.1.100
[NTC][ALL][motionplus] main: Motionplus pid: 115284
[NTC][VID][ml00:MyCam1] cls_netcam: Norm: Opening Netcam
[NTC][VID][ml01:MyCam2] start_cam: Opening V4L2 device
[NTC][VID][ml01:MyCam2] device_open: Opening video device /dev/video0
[NTC][VID][ml01:MyCam2] set_input: Name = "Camera 1"- CAMERA
[NTC][VID][ml01:MyCam2] pixfmt_try: Unable to use palette YU12 (352x288)
[NTC][VID][ml01:MyCam2] palette_set: Configuration palette index 17 (YU12) for 352x288 doesn't work.
[NTC][VID][ml01:MyCam2] pixfmt_list: Supported palettes:
[NTC][VID][ml01:MyCam2] pixfmt_list: (0) MJPG (Motion-JPEG)
[NTC][VID][ml01:MyCam2] pixfmt_list: (1) YUYV (YUYV 4:2:2)
[NTC][VID][ml01:MyCam2] pixfmt_try: Testing palette YUYV (352x288)
[NTC][VID][ml01:MyCam2] pixfmt_set: Using palette YUYV (320x240)
[NTC][VID][ml01:MyCam2] palette_set: Selected palette index 15 (YUYV)
[NTC][ALL][ml01:MyCam2] mlp_ring_resize: Resizing buffer to 4 items
[NTC][ALL][ml01:MyCam2] mlp_init: Camera 102 started: motion detection Enabled
[NTC][ALL][ml00:MyCam1] mlp_ring_resize: Resizing buffer to 4 items
[NTC][NET][nc02:MyCam1] handler: Norm:Camera handler started
[NTC][NET][nc02:MyCam1] connect: Norm:Camera (MyCam1) connected
[NTC][NET][nc02:MyCam1] connect: Norm:Netcam capture FPS is 21.
[NTC][NET][nc02:MyCam1] connect: Norm:Camera source is 20 FPS
[NTC][ALL][ml00:MyCam1] mlp_init: Camera 101 started: motion detection Enabled

Vous constaterez qu'en passant devant la webcam les vidéos s'accumulent sous /emile/photo/motion, ça marche !! Le log donnera la ligne suivante à chaque mouvement identifié comme évènement.

[NTC][ALL][ml01:MyCam2] mlp_detected_trigger: Motion detected - starting event 1

L'application dispose d'une interface web visible à l'URL http://localhost:8080/. On y voit en temps réel les différentes vues

La configuration est possible de l'interface

Les évènements sont accessibles via Recordings


Tout d'abord pour que motionplus soit lancé via systemd, on veillera que le paramètre daemon soit bien à off dans le fichier de configuration

;*************************************************
;*****   System
;*************************************************
daemon off
;log_file
log_level 6
log_type ALL

On va créer ensuite le ficher /usr/lib/systemd/system/motionplus.service qui contiendra

[Unit]
Description=Motion - monitor live video, trigger responses, record video/stills.
After=local-fs.target network.target

[Service]
User=apache
EnvironmentFile=-/usr/local/etc/motionplus
ExecStart=/usr/local/bin/motionplus -n
Type=simple
ExecReload=@KILL@ -HUP $MAINPID
Restart=on-failure
RestartSec=5
# Don't restart if unconfigured / misconfigured  e.g. daemon disabled
# in defaults file.  See also /usr/include/sysexits.h or sysexits(3)
RestartPreventExitStatus=78

[Install]
WantedBy=multi-user.target

Et on lancera motionplus en tapant

systemctl start motionplus

la commande suivante

systemctl status motionplus

donnera

motionplus.service - Motion - monitor live video, trigger responses, record video/stills.
     Loaded: loaded (/usr/lib/systemd/system/motionplus.service; disabled; preset: disabled)
     Active: active (running) since Sat 2024-08-31 20:02:06 CEST; 3min 31s ago
   Main PID: 1265738 (mp00)
      Tasks: 6 (limit: 9239)
     Memory: 78.0M
        CPU: 2min 20.137s
     CGroup: /system.slice/motionplus.service
             └─1265738 /usr/local/bin/motionplus -n

août 31 20:02:07 ultra.kervao.fr motionplus[1265738]: [NTC][ENC][mp00] av_init: version du format libav 61.1.100
août 31 20:02:07 ultra.kervao.fr motionplus[1265738]: [NTC][STR][mp00] startup: Démarrage de WebControl sur le port 8080
août 31 20:02:07 ultra.kervao.fr motionplus[1265738]: [NTC][VID][mp00] cls_netcam: Norm: Opening Netcam
août 31 20:02:07 ultra.kervao.fr motionplus[1265738]: [NTC][STR][mp00] start_daemon_port1: Webcontrol démarré sur le port 8080
août 31 20:02:08 ultra.kervao.fr motionplus[1265738]: [NTC][ALL][mp00] ring_resize: Redimensionnement du tampon à 4 éléments
août 31 20:02:08 ultra.kervao.fr motionplus[1265738]: [NTC][NET][mp00] handler: Norme:Camera handler started
août 31 20:02:10 ultra.kervao.fr motionplus[1265738]: [NTC][NET][mp00] connect: Norme:Camera (camera-sud) connected
août 31 20:02:10 ultra.kervao.fr motionplus[1265738]: [NTC][NET][mp00] connect: Norme:Netcam capture FPS is 21.
août 31 20:02:10 ultra.kervao.fr motionplus[1265738]: [NTC][NET][mp00] connect: Norme:Camera source is 20 FPS
août 31 20:02:10 ultra.kervao.fr motionplus[1265738]: [NTC][ALL][mp00] init: Caméra 101 démarrée : détection de mouvement Activé

pour le rendre actif en permanence on tapera

systemctl enable motionplus

Maintenant vous pouvez ouvrir les port de votre serveur pour que l'interface web motionplus soit accessible sur internet.
Pour que les fichiers enregistrés n'explosent pas le disque vous pouvez créer une tâche cron qui à intervalle régulier va supprimer les fichiers qui ont plus de 5 jours (par exemple), voilà le contenu du fichier exécutable nettoyage  à rajouter dans /etc/cron.weekly (exécution une fois par semaine)

#!/bin/bash
find /emile/photo/motion -type f -name "*.mkv" -mtime +5 -exec rm {} \;
 
[Retour page d'accueil FUNIX] [retour haut de la page ]