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

31 octobre 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, autrement appelé CCTV. Sont présentés dans cette page 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, que ce soit sur un poste fixe ou sur un mobile. Zoneminder est bien plus évolué et dispose de fonction d'apprentissage automatique et de reconnaissance d'objet, contrairement à motionplus qui est un outil bien plus simple et moins lourd à mettre en œuvre.

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.9.3, les sources se compilent avec le langage go qu'il faudra avoir préalablement installé (package golang-bin sur ma mageia). 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 copiera également le fichier de configuration mediamtx.yml sous /usr/local/etc. On le lance d'abord sans être nécessairement root

mediamtx

voilà les traces

2024/10/25 16:45:46 INF MediaMTX v0.0.0
2024/10/25 16:45:46 INF configuration loaded from /usr/local/etc/mediamtx.yml
2024/10/25 16:45:46 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2024/10/25 16:45:46 INF [RTMP] listener opened on :1935
2024/10/25 16:45:46 INF [HLS] listener opened on :8888
2024/10/25 16:45:46 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2024/10/25 16:45:46 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/10/25 16:47:16 INF [RTSP] [conn 192.168.2.16:39506] opened
2024/10/25 16:47:16 INF [RTSP] [session 23cd16d2] created by 192.168.2.16:39506
2024/10/25 16:47:16 INF [RTSP] [session 23cd16d2] 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 mariadb.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

chown -R apache:apache /etc/zm

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 des 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


A noter le paramètre % fusion image référence qui va jouer sur le taux de détection, pour une caméra extérieure il est recommandé de mettre 12,5%. Pour déclencher une alarme on pourra mettre une valeur différence, elle correspond au pourcentage de l'image qui a bougé par rapport à l'image de référence.

Avec plusieurs caméras cela donne


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 de la caméra sélectionnée


Pour visualiser un évènement particulier, il faut cliquer dessus, l'évènement en question est marqué dans la timeline en rouge


On dispose d'outils de rejeu vidéo pour visualiser l'évènement en question, on pourra les supprimer au niveau précédent.
Pour avoir un mur d'images avec la caméra, on ira sur Montage


Le menu Options permettra de pouvoir accéder aux différentes options


Les évènements sont sauvegardés sous /var/lib/zoneminder/www/events, vous pouvez rajouter un espace supplémentaire  en cliquant sur Add new storage


Vous avez tout intérêt à faire un ménage régulier pour ne pas exploser le disque, c'est possible de le faire automatiquement à partir du menu Filtres en sélectionnant PurgeWhenFull avec un nettoyage lancé à partir d'une occupation de 95% du disque.


Pour être prévenu par mail au moindre évènement on configurera l'option Email dans les Options


mais ce n'est pas suffisant il faut créer ensuite un filtre qui déclenchera l'envoi de mail quand le score de détection atteint au moins 5.


Pour affiner encore plus les réglages on peut définir des zones de détection avec des réglages particuliers pour chaque zone, il faut faire glisser les 4 point verts au angle pour la matérialiser.



Pour chaque caméra on pourra donc définir plusieurs zones de détection, ci-dessous il y  a 3 zones actives et 5 zones inactives où aucun évènement ne sera remonté.


Pour plus de détail sur les zones, vous pouvez consulter la documentation officielle ainsi que cette page du wiki et celle là (en anglais), cette page en français est également d'une aide précieuse pour comprendre les types de zone et leur paramétrage.

On peut retenir qu'il existe plusieurs méthodes de déclenchement d'alarme, Alarmed Pixels, Filtered Pixels et blobs sans rentrer dans le détail qui est donné dans les pages citées plus haut, la dernière méthode blobs est donnée pour être la plus efficace. On définira ensuite les seuils de détection à partir de la taille des objets détectés.

Les caméras extérieures restent les plus délicates à régler. J'ai pas mal galéré pour trouver le bon réglage pour ma caméra qui vise le portail qui est plutôt lointain, elle ne détectait rien du tout jusqu'à ce que je reprenne les réglages de cette page qui ont été un bon point de départ, sans que ça soit totalement satisfaisant pour des objets de la taille d'une personne proche du portail.



Dans ce cas il faudra privilégier l'unité pixels plutôt que pourcentage qui permet un réglage plus fin. Dans mon cas (ci-dessous) la surface de la zone fait 204040 pixels, soit vu la forme de ma zone en trapèze, à peu près un rectangle de 900x225 pixels à partir de la il faut s'imaginer la taille d'une personne pour en déduire sa taille en pixel (on peut s'aider de gimp), dans mon cas ça fait à peu près une taille de 25x60pixels, soit 1500pixels qu'on va retrouver dans le champ min de Surface en alarme


Il faut procéder ensuite en tâtonnant pour le reste des paramètres. Maintenant à la détection d'un évènement la ou les zones concernées seront indiquées



Aller encore plus loin avec ZMES

Le serveur de notification d'évènement "Event Notification Server" ou ZMES est un outil complémentaire à zoneminder, il dispose d'une "machine learning" ou d'un apprentissage automatique qui lui permet de reconnaître les objets, qu'ils soient des personnes ou des voitures par exemples.

Le site officiel est  https://github.com/ZoneMinder/zmeventnotification on y récupère les sources qu'on décompresse en tapant

tar xvfz zmeventnotification-6.1.29.tar.gz

cela donne le répertoire zmeventnotification-6.1.29. On installera d'abord les packages perl-Crypt-MySQL, perl-Module-Build-Tiny et perl-CPAN-DistnameInfo. Puis avec CPAN

perl -MCPAN -e "install Crypt::Eksblowfish::Bcrypt"
perl -MCPAN -e "install Protocol::WebSocket"
perl -MCPAN -e "install Net::WebSocket::Server"

Maintenant on tape en tant que root

zmeventnotification-6.1.29/install.sh

Il faudra modifier ou créer des fichiers sous /etc/zm tout d'abord secrets.ini qui contiendra

[secrets]

# l'URL pour accéder à zoneminder https://ultra.kervao.fr/zm est à adapter, l'utilisateur et le mot de passe de connexion sont définis dans la page de configuration système

ZMES_PICTURE_URL=https://ultra.kervao.fr/zm/index.php?view=image&eid=EVENTID&fid=objdetect&width=600
ZM_USER=zm-user
ZM_PASSWORD=password

ZM_PORTAL=https://ultra.kervao.fr/zm
ZM_API_PORTAL=https://ultra.kervao.fr/zm/api

# certificat et clé pour une connexion ssl, j'ai réutilisé celles de mon serveur apache
ES_CERT_FILE=/etc/ssl/public/apache.crt
ES_KEY_FILE=/etc/ssl/apache/apache.key

#clé pour la reconnaissance des plaques d'immatriculation, il faudra créer un compte sur ce site https://platerecognizer.com/
PLATEREC_ALPR_KEY=cb5ece0dhkhg1bea8dfd08408ec6cb8370d6c3b5c

On modifiera maintenant le fichier /etc/zm/objectconfig.ini qui contiendra

# portal/user/password are needed if you plan on using ZM's legacy
# auth mechanism to get images

# l'URL pour accéder à zoneminder ainsi que l'utilisateur et mot de passe de connexion

portal=https://ultra.kervao.fr/zm
user=zm-user
password=password

# api portal is needed if you plan to use tokens to get images
# requires ZM 1.33 or above
api_portal=https://ultra.kervao.fr/zm/api

(...)

# connexion à un serveur mlapi, je m'en sers pas mais les champs ne doivent pas être vides

ml_user=mlapi-user
ml_password=password

(...)

# la clé pour la reconnaissance des plaques, idem au fichier secrets.ini
alpr_key=cb5ece0dhkhg1bea8dfd08408ec6cb8370d6c3b5c

On modifier maintenant /etc/zm/zmeventnotification.ini

[ssl]
# Enable SSL (default: yes)
enable = yes

#idem clé dans le fichier secrets.ini
cert = /etc/ssl/public/apache.crt
key = /etc/ssl/apache/apache.key

Maintenant dans les options et configuration système on cochera les cases OPT_USE_API  et OPT_USE_EVENTNOTIFICATION

On relance zoneminder et on lance ZMES en tapant

sudo -u apache /usr/bin/zmeventnotification.pl

voilà le résultat

Use of uninitialized value $first_arg in string eq at ./zmeventnotification.pl line 62.
27/10/2024 17:31:03.690121 zmeventnotification[163691].INF [main:330] [Running on WebSocket library version:0.004]
27/10/2024 17:31:07.018532 zmeventnotification[163691].INF [main:1010] [PARENT: using config file: /etc/zm/zmeventnotification.ini]
27/10/2024 17:31:07.833499 zmeventnotification[163691].INF [main:1010] [PARENT: using secrets file: /etc/zm/secrets.ini]
Use of uninitialized value $es_debug_level in numeric ge (>=) at ./zmeventnotification.pl line 999.
Use of uninitialized value $es_debug_level in numeric ge (>=) at ./zmeventnotification.pl line 999.
Use of uninitialized value $skip_monitors in split at ./zmeventnotification.pl line 543.
Use of uninitialized value $es_debug_level in numeric ge (>=) at ./zmeventnotification.pl line 999.
Use of uninitialized value $hook_skip_monitors in split at ./zmeventnotification.pl line 732.

avec un évènement

27/10/2024 17:31:26.558583 zmeventnotification[163691].INF [main:1010] [PARENT: Push enabled via FCM]
27/10/2024 17:31:26.558734 zmeventnotification[163691].INF [main:1010] [PARENT: MQTT Disabled]
27/10/2024 17:31:26.558814 zmeventnotification[163691].INF [main:1010] [PARENT: |------- Starting ES version: 6.1.29 ---------|]
Can't ignore signal CHLD, forcing to default.
27/10/2024 17:31:49.322211 zmeventnotification[163691].INF [main:1010] [PARENT: Event Notification daemon v 6.1.29 starting]
27/10/2024 17:31:50.349988 zmeventnotification[163691].INF [main:1010] [PARENT: Re-loading monitors]
Use of uninitialized value in concatenation (.) or string at ./zmeventnotification.pl line 1453.
27/10/2024 17:31:54.071086 zmeventnotification[163691].INF [main:1010] [PARENT: New event 380 reported for Monitor:4 (Name:Camera-4) Motion[last processed eid:]]
27/10/2024 17:31:56.427281 zmeventnotification[163691].INF [main:1010] [PARENT: Secure WS(WSS) is enabled...]
27/10/2024 17:31:56.427365 zmeventnotification[163691].INF [main:1010] [PARENT: Web Socket Event Server listening on port 9000]

pour l'activer en tant que service systemd, on va créer le fichier /usr/lib/systemd/system/zmes.service qui contiendra

[Unit]
Description=ZMES
After=zoneminder.service
Requires=zoneminder.service httpd.service

[Service]
User=apache
Type=simple
ExecStart=/usr/bin/zmeventnotification.pl
Restart=on-failure

[Install]
WantedBy=multi-user.target

on l'activera en tapant

systemclt enable zmes

on le lance en tapant

systemctl start zmes

voici son statut en tapant

systemctl status zmes

● zmes.service - ZMES
     Loaded: loaded (/usr/lib/systemd/system/zmes.service; disabled; preset: disabled)
     Active: active (running) since Thu 2024-10-31 10:43:42 CET; 36s ago
   Main PID: 243499 (zmeventnotifica)
      Tasks: 1 (limit: 9239)
     Memory: 46.3M
        CPU: 784ms
     CGroup: /system.slice/zmes.service
             └─243499 /usr/bin/perl -T /usr/bin/zmeventnotification.pl

oct. 31 10:43:42 ultra.kervao.fr systemd[1]: Started zmes.service.
oct. 31 10:43:42 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $first_arg in string eq at /usr/bin/zmeventnotification.pl line 61.
oct. 31 10:43:43 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $es_debug_level in numeric ge (>=) at /usr/bin/zmeventnotification.pl line 998.
oct. 31 10:43:43 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $es_debug_level in numeric ge (>=) at /usr/bin/zmeventnotification.pl line 998.
oct. 31 10:43:43 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $skip_monitors in split at /usr/bin/zmeventnotification.pl line 542.
oct. 31 10:43:43 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $es_debug_level in numeric ge (>=) at /usr/bin/zmeventnotification.pl line 998.
oct. 31 10:43:43 ultra.kervao.fr zmeventnotification.pl[243499]: Use of uninitialized value $hook_skip_monitors in split at /usr/bin/zmeventnotification.pl line 731.
oct. 31 10:43:44 ultra.kervao.fr zmeventnotification.pl[243505]: Can't ignore signal CHLD, forcing to default.

Et voilà ce que ça va donner au niveau de l'interface, on voit qu'il a identifié des personnes et un véhicule (truck).


Et au niveau du menu Audit Events Report, on pourra cliquer sur les liens où un objet a été identifié

l'objet en question est entouré, ici une personne
Si vous avez l'erreur suivante dans les logs

requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://ultra.kervao.fr/zm/api/host/login.json

c'est qu'il manque l'extension apcu à PHP, on va la récupérer ici https://github.com/krakjoe/apcu/releases, on décompresse en tapant

tar xvfz apcu-5.1.24.tar.gz
cd apcu-5.1.24
phpize
./configure --enable-apcu
make

et en tant que root make install

on modifiera /usr/local/apache2/conf/php.ini en rajoutant

extension=apcu
apc.enabled=1
apc.enable_cli=1
on relance apache. Pour cette autre erreur

oct. 27 16:10:04 ultra.kervao.fr zm_detect.py[149699]: ERR [zmesdetect_m4] [Turning DB logging off. Could not connect to DB, message was:(mysql.connector.errors.DatabaseError) 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
                                                       (Background on this error at: http://sqlalche.me/e/13/4xp6)]

cela vient du fait que j'utilise mariadb qui n'a pas repris certains paramétrages de MySQL, j'ai dû remplacer les occurences de utf8mb4_0900_ai_ci par utf8mb4_unicode_520_ci dans les fichiers

/usr/local/lib64/python3.10/site-packages/mysql/connector/aio/charsets.py
/usr/local/lib64/python3.10/site-packages/mysql/connector/charsets.py

la commande ci-dessous permettra de voir si tout fonctionne correctement, il faudra indiquer un numéro d'évènement et de caméra.

sudo -u apache /var/lib/zmeventnotification/bin/zm_detect.py --config /etc/zm/objectconfig.ini --eventid 375 --monitorid 4 --debug

Quelques sites pour davantage d'informations
et bien sur le forum https://forums.zoneminder.com/

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, qu'on décompresse en tapant

tar xvfz motionplus-release-0.2.2.tar.gz

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 --with-ffmpeg=/usr/local/lib --with-mariadb=/usr/local/mysql

L'option with-ffmpeg pointe vers le répertoire où se trouvent les bibliothèques de ffmpeg  compilées par mes soins pour éviter qu'il utilise la version du système. Voilà le résultat

   **************************
      Configure status      
      motionplus 0.2.2
   **************************

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/local/mysql/include/mysql/   -D_REENTRANT  

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/local/mysql/lib/ -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             : no
webp support          : yes
V4L2 support          : yes
libcamera support     : yes
FFmpeg support        : yes
  libavformat version : 61.1.100
OpenCV                : yes
  version             : 4.6.0
SQLite3 support       : yes
MYSQL support         : no
PostgreSQL support    : no
MariaDB support       : yes
ALSA support          : yes
PulseAudio support    : yes
FFTW support          : yes

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
camera /usr/local/etc/motionplus/camera3.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 mp4
movie_filename %v-%Y%m%d%H%M%S

pour chaque évènement c'est une vidéo utilisant le conteneur mp4 (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.2

;*************************************************
; 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.2

;*************************************************
; 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

oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/motionplus.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_edit_stream_preview_method: Invalid stream_preview_method combined
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera1.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera2.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera3.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: Logging to syslog
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: MotionPlus 0.2.2 started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: Using log type (ALL) log level (NTC)
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] mytranslate_init: Language: English
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][STR][00:motionplus] webu_init_webcontrol: Starting webcontrol on port 8080
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][STR][00:motionplus] webu_init_webcontrol: Started webcontrol on port 8080
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ENC][00:motionplus] motpls_av_init: libavcodec  version 61.3.100
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ENC][00:motionplus] motpls_av_init: libavformat version 61.1.100
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][00:ml00:camera-sud] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][02:ml02:Piece2] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] main: Motionplus pid: 1331263
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][01:ml01:Piece1] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_handler: Norm: Camera handler thread [5] started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][01:ml01:Piece1] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_handler: Norm: Camera handler thread [6] started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Camera (Piece2) connected
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Camera (Piece1) connected
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc:
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: ******************************************************
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: The network camera is sending pictures at 0x0
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: resolution but config is 1280x720. If possible change
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: the netcam or config so that the image height and
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: width are the same to lower the CPU usage.
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: ******************************************************
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc:
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:ml00:camera-sud] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_handler: Norm: Camera handler thread [3] started
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_init: Camera 103 started: motion detection Enabled
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][01:ml01:Piece1] mlp_init: Camera 102 started: motion detection Enabled
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Camera (camera-sud) connected
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Netcam capture FPS is 21.
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Camera source is 20 FPS
oct. 25 17:09:37 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:ml00:camera-sud] 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 Fri 2024-10-25 17:09:33 CEST; 52min ago
   Main PID: 1331263 (motionplus)
      Tasks: 17 (limit: 9239)
     Memory: 120.2M
        CPU: 42min 59.330s
     CGroup: /system.slice/motionplus.service
             └─1331263 /usr/local/bin/motionplus -n

oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_handler_reconnect: Norm: Reconnecting with camera....
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Camera (Piece1) connected
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_handler_reconnect: Norm: Reconnecting with camera....
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Camera (Piece2) connected
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_detected_trigger: Motion detected - starting event 17
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][EVT][02:ml02:Piece2] on_movie_start_command: File saved to: /media/motion/CAM03_103-17-20241025180117.mp4

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 supprimer les fichiers à partir de l'interface ou alors 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 {} \;

Attention il faudra supprimer les évènements correspondant dans la base de donnée mariadb.
 
[Retour page d'accueil FUNIX] [retour haut de la page ]