Zoneminder ist eine auf Linux basierende Open Source Videoüberwachungssoftware, mit der diverse Videoquellen wie IP Kameras, USB Kameras, TV Kameras, LAN/WLAN Kameras uvm. Genutzt werden können und auch professionellen Ansprüchen genügt. Die Bedienung der Zoneminder Software erfolgt über eine kommerzielle Android-App oder ein Webinterface und funktioniert, im Falle des Webinterfaces, daher mit allen gängigen Browsern und Endgeräten (Linux, Windows, Mac, Android). Zoneminder verfügt über viele verschiedene Zusatzfunktion wie beispielsweise den automatischen Mail- oder SMS-Versand, softwarebasierten Bewegungsmeldern uvm.
- Konfiguration – Webinterface
- Konfiguration – Kameras
- Konfiguration – Datenspeicher
- Konfiguration – Alarmzonen ( Bewegungssensoren )
- Tipps und Tricks
Software – Installation
Bei der Zoneminder Software handelt es sich um eine stark modularisierte Applikation. Neben Video4Linux für die Unterstützung der Kameras und TV-Karten, einem Apache-Webserver sowie MySQL, PHP und Perl müssen auf dem Rechner für die Aufnahme von Stand- und Bewegtbildern die ffmpeg- und Libjpeg-Pakete installiert sein. Erfreulicherweise findet sich Zoneminder inzwischen in den Repositories aller gängigen Linux-Distributionen und deren Derivaten, sodass das Programm ohne aufwendiges manuelles Kompilieren installiert werden kann. Im Zoneminder eigenen Wiki werden die Installationen für versch. Linux Distributionen beschrieben.
Debian 12 (Wenn der Fehler „ERR [Error reconnecting to db: errstr:Access denied for user ‚www-data’@’localhost‘ error val:]“ auftritt sind die Berechtigungen für die Konfigurationsdatei falsch gesetzt => chgrp -c www-data /etc/zm/zm.conf )
Debian 10/11 – Zoneminder 1.36.X aus den Backports
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# add repo echo deb https://zmrepo.zoneminder.com/debian/release-1.36 buster/ | sudo tee -a /etc/apt/sources.list wget -O - https://zmrepo.zoneminder.com/debian/archive-keyring.gpg | sudo apt-key add - sudo apt update # install selected version ( 1.36.33 ) sudo apt install zoneminder=1.36.33-buster2 # prevent zoneminder from update for Debian 10 sudo apt-mark hold zoneminder # set config file permissions chgrp -c www-data /etc/zm/zm.conf # configure system services sudo systemctl enable zoneminder.service sudo a2enconf zoneminder sudo a2enmod rewrite sudo a2enmod cgi sudo systemctl reload apache2 sudo systemctl start zoneminder |
Konfiguration – Webinterface
Als erstes empfiehlt es sich ein Passwort für den Admin Nutzer zu setzen:
- Optionen => System: OPT_USE_AUTH aktivieren
- Optionen => Benutzer: Admin auswählen und Passwort vergeben
Das Zoneminder Webinterface unterstützt verschiedene Sprachen, die in den Optionen ausgewählt werden können:
- Optionen => System => LANG_DEFAULT
Konfiguration – Kameras
Kameras werden durch Klicken auf die „Neuer Monitor“ Schaltfläche in Zoneminder eingebunden. Es gibt zwei grundlegende Möglichkeiten dies zu realisieren:
- Direkt am Host angeschlossenen Kameras => Allgemeines => Quellentyp => Lokal
- Über das Netzwerk erreichbare Kameras => Allgemeines => Quellentyp => Remote
Die Konfiguration der Netzwerkadresse, Bildgröße, Farbeinstellungen, Zugangsdaten und Pfade etc erfolgt unter dem Menüpunkt Quelle:
- Zugriffsart auf Bildquelle ( http oder Stream ) => Remote Protokol => <HTTP|RTSP>
- Netzwerkadresse der Kamera => Remote Hostname => <IP|URL>
- Port der Netzwerkkamera => Remote Hostport => <Port>
- Pfad der Video-, Bildquelle => <Remote Hostpfad>
- Benutzte Bildgröße ( Breite ) => Erfassungsbreite => <Pixelanzahl>
- Benutzte Bildgröße ( Höhe ) => Erfassungsbreite => <Pixelanzahl>
- Lagenanpassung des Kamerabildes ( Drehen, Spiegeln etc. – 180° Drehung : Invertiert ) => Ausrichtung => <Wert>
Für Lokale am Host angeschlossene Kameras werden andere Angaben benötigt:
- Anschlusspfad bzw. Gerätedatei der Kamera => Gerätepfad => </dev/video1-x>
- Verwendetes Linux Videosystem => Erfassungsmethode => VFL2 ( für ältere Systeme VFL1 )
- Für Quellen mit mehreren Kameraausgaben verwendeter Kanal => Gerätekanal => 0-X ( TV Karten für den Anschluss analoger Kameras )
- Verwendetes Bildübertragungsformat => Geräteformat => <PAL|NTSC> ( TV Kartenformat für den Anschluss analoger Kameras )
- Verwendeter Übertragungsmodus der Kamera => Erfassungsfarbpalette => MJPEG ( komprimierte Bildübertragung, muss von Kamera unterstützt werden )
- Verwendete Farbtiefe => Zielfarbbereich => <24|32Bit> ( 24 Bit sind in der Regel ausreichend und reduzieren den benötigten Speicher )
- Benutzte Bildgröße ( Breite ) => Erfassungsbreite => <Pixelanzahl>
- Benutzte Bildgröße ( Höhe ) => Erfassungsbreite => <Pixelanzahl>
- Lagenanpassung des Kamerabildes ( Drehen, Spiegeln etc. – 180° Drehung : Invertiert ) => Ausrichtung => <Wert>
Zoneminderspezifische Aufzeichnungsoptionen der jeweiligen Kamera werden unter dem Menüpunkt Puffer konfiguriert. Die verschiedenen Optionen bieten Konfigurationsmöglichkeiten für Vor- und Nachlaufbilder von Aufzeichnungen oder div. Puffereinstellungen. Weitere Konfigurationsmöglichkeiten sind größtenteils selbsterklärend.
Um Optionen bereits konfigurierter Kameras zu ändern, genügt ein Klick auf den Link in der Quellenspalte der Zoneminderübersicht für die entsprechende Kamera.
Konfiguration – Datenspeicher
Die Aufzeichnungen sollten aufgrund des Datenumfangs und der vielen Zugriffe auf das Speichermedium nicht auf chipbasierten Speichermedien, wie SSDs oder Speicherchips erfolgen. Die Speicherpfade können entweder über Symlinks des Hostsystems oder direkt in der Zoneminderkonfiguration (Optionen => Pfade) geändert werden. Dabei ist zu beachten, dass der Zoneminder Benutzer Vollzugriff auf das entsprechende Verzeichnis benötigt (www-data.www-data). Bei der Nutzung von Netzlaufwerken sollte aufgrund von technisch bedingten Instabilitäten von WLAN Anbindungen sowie Cloudspeichern verzichtet werden. Kabel basierte NAS Systeme haben sich bewährt und bieten bei räumlicher Trennung und korrekter Konfiguration keine Möglichkeit des Zugriffs auf den Datenspeicher, um diesen zu zerstören oder zu manipulieren.
Netzlaufwerke
Die Datenspeicherung auf Netzlaufwerken via sshfs erfordert einige spezielle Parameter. Das Remoteverzeichniss muss als www-data user incl der www-data Gruppe eingehängt werden. Die Ids (i.d.R ID 33) können aus der /etc/passwd und der /etc/groups ausgelesen werden (grep www /etc/passwd /etc/group). Die Option <follow-symlinks> darf nicht gesetzt werden, da Zoneminder selbst mit Symlinks arbeitet. Daraus ergibt sich folgendes Beispiel zum Einhängen eines Remoteverzeichnisses auf den Zoneminderhost:
1 |
sshfs <user>@<host>:<storage_dir> <mount_point> -o gid=33,uid=33,IdentityFile=/home/<user>/.ssh/id_rsa,allow_other |
Konfiguration – Alarmzonen (Bewegungssensoren)
Zur Reduzierung des benötigten Datenspeichers ist eine Aufzeichnung, die nur Bewegungen oder Ereignisse in den überwachten Bereichen aufzeichnet, sinnvoll. Der dabei benutzte softwareseitige „Bewegungsmelder“ funktioniert durch den Vergleich zweier oder mehr Bilder anhand von verschiedenen Filtern und Faktoren, die zum Auslösen des Bewegungsalarms und damit zur Aufzeichnung der Kamerabilder führen. Die Konfiguration der Filter bietet eine Vielzahl an Kombinationen, um nur wirklich relevante Ereignisse aufzuzeichnen und Fehlalarme wie z.B. wankende Bäume oder Baumschatten zu unterbinden.
Zeitabhängige Betriebsmodi
Die Erstellung eines Zeitplans, um einzelne Modi, wie z.B. Monitor oder Aufnahme zu aktiveren, erfordert einen Zeitplan für den jeweiligen Betriebszustand. Dabei werden Konfigurationsvorlagen erstellt und diese mittels cronjobs aktiviert bzw. deaktiviert.
- crontab -e
- 0 7 * * 1-5 /usr/bin/zmpkg.pl day
- 0 18 * * 1-5 /usr/bin/zmpkg.pl night
- * * * * 0,6 /usr/bin/zmpkg.pl night
Diese Einstellung sagt aus das die Kameras ab Minute 0 Stunde 7 Tag 1-5(Mo-Fr) den Zustand day haben und das ganze ab 18 Uhr auf night geändert wird. Für Samstag und Sonntag ist die ganze Zeit die Aufnahme aktiv.
Tipps und Tricks
Konfiguration zurücksetzen
Um die Zoneminder Konfigurationen zurückzusetzen, wird alte Datenbank gelöscht und die default Datenbank erneut importiert:
1 2 3 4 |
# delete old database mysql -uroot zm -e "DROP DATABASE zm" # restore install database mysql -u zm -p<password> zm < /usr/share/zoneminder/db/zm_create.sql |
Datenbank Logspeicher manuell leeren:
Zoneminder speichert Logeinträge in der Datenbank und Syslog. Folgender Befehl löscht sämtliche Logeinträge in der Datenbank:
1 |
mysql -uroot zm -e "truncate table Logs" |
ReoLink IP Kameras konfigurieren
-
- Main Stream: rtsp://USER:PASSWORD@IPADDRESS:554/h264Preview_01_main
- Sub Stream: rtsp://USER:PASSWORD@IPADDRESS:554/h264Preview_01_sub
-
- Main Stream: rtmp://IPADDRESS/bcs/channel0_main.bcs?channel=0&stream=0&user=USER&password=PASSWORD
- Sub Stream: rtmp://IPADDRESS/bcs/channel0_sub.bcs?channel=0&stream=1&user=USER&password=PASSWORD
- Ext Stream: rtmp://IPADDRESS/bcs/channel0_ext.bcs?channel=0&stream=2&user=USER&password=PASSWORD
URL Beispiele Reolink IP Kameras ( https://camlytics.com/camera/reolink ):
Storage Pfade ändern
Der voreingestellte Speicherpfad (/var/cache/zoneminder) ist in meisten Fällen auf der gleichen Partition wie das Wurzelverzeichnis (WZV). Um das WZV nicht voll laufen zu lassen, empfiehlt es sich den Speicherpfad zu ändern. In den Zoneminder Einstellungen des Webinterfaces kann zwar ein Pfad hinterlegt werden, jedoch ignoriert Zoneminder alle Eingaben bis auf /var/cache/zoneminder. Remapping mit Hilfe von Symlinks auf ein Alternativverzeichnis ist ohne Weiteres keine dauerhafte Lösung, da Zoneminder Updates den Symlinks wieder durch ein Verzeichnis ersetzen (D10/ZM1.36.33). Folgendes Script prüft auf Symlink oder Verzeichnis und ersetzt das Verzeichnis wieder durch den Symlink. Das Prüfinterval wird via Cronjob festgelegt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#!/bin/bash # name : zm-storage_check_storage_symlink # desciption : replace the default zoneminder storage in /var/cache/zoneminder by a symlink # autor : speefak # licence : (CC) BY-NC-SA VERSION=0.0.5 #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ####################################### define global variables ######################################## ############################################################################################################ #------------------------------------------------------------------------------------------------------------ SourceDir="/var/cache/zoneminder" StorageDir="/mnt/fstab_UUID_System_storage/zoneminder/" #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ########################################### define functions ############################################ ############################################################################################################ #------------------------------------------------------------------------------------------------------------ # check for root permission if [ "$(whoami)" = "root" ]; then printf "";else printf "\n\nAre You Root ?\n\n";exit 1;fi #------------------------------------------------------------------------------------------------------------ ############################################################################################################ ############################################# start script ############################################# ############################################################################################################ #------------------------------------------------------------------------------------------------------------ if [[ -d $SourceDir ]]; then if [[ -n $(ls -l "$SourceDir" 2>/dev/null | grep "^l") ]]; then printf " existing symlink detected: /$(ls -l "$SourceDir" | cut -d "/" -f2-50) \n" elif [[ -z $(ls -d "$SourceDir" 2>/dev/null | grep "^l") ]]; then printf " existing directory detected: $(ls -d "$SourceDir")\n" printf " backup existing directory: $SourceDir ${SourceDir}_$(date +%s)\n\n" mv $SourceDir ${SourceDir}_$(date +%s) Status=modified fi else printf " no symlink or directory detected\n" Status=modified fi # apply changes if [[ $Status == modified ]]; then printf " create symlink: \n" printf " $StorageDir -> $SourceDir\n" ln -s $StorageDir $SourceDir # set storage dir permissions printf " set storage directory permissions: www-data.www-data ($StorageDir) \n" chown -R www-data.www-data $StorageDir # restart zoneminder printf " restarting zoneminder ...\n" systemctl restart zoneminder printf "\n\n" fi #------------------------------------------------------------------------------------------------------------ exit 0 |
Cronjobeintrag, Intervall eine Minute:
1 |
*/1 * * * * /usr/local/bin/./zm-storage_check_storage_symlink > /dev/null |
Manuelle SQL Datenbank Konfiguration für Zoneminder:
Der Benutzer (zmuser) sowie die Datenbank (zm) muss unter Umständen bei der Installation von Zoneminder manuell angelegt werden. Die Grundstruktur der Datenbank muss ebenfalls manuell importiert und in der Datei /etc/zm/zm.conf dementsprechend der Datenbankzugriff konfiguriert werden. Ein MySQL Benutzer (zm) mit der dazugehörigen Datenbank (zm) wird wie folgt angelegt:
1 |
mysql -u zm -p<password> zm < /usr/share/zoneminder/db/zm_create.sql |
oder
1 |
mysql -u zm -p zm < /usr/share/zoneminder/db/zm_create.sql |
Datenbank manuell anlegen:
Um die Zoneminder Datenbank (/usr/share/zoneminder/db/zm_create.sql) manuell einzurichten, wird ein Zoneminder Benutzer mit entsprechender Datenbank und Zugriffsrechten auf dem SQL Server benötigt. Der Datenbankname (Vorgabe: zm) kann vor dem Import in der o.g. Datenbankdatei (zm_create.sql) geändert werden. Der Datenbankname des SQL Servers muss mit dem in der zm_create.sql Datenbank übereinstimmen.
- Datenbank und Benutzer anlegen (Benutzer: zmuser Passwort: zmpass / Datenbankname: zm_database):
-
123sudo mysql -e "CREATE USER 'zmuser'@'localhost' IDENTIFIED BY 'zmpass';"sudo mysql -e "CREATE DATABASE zm;"sudo mysql -e "GRANT ALL PRIVILEGES ON zm.* TO 'zmuser'@'localhost';"
- Datenbank vorbereiten ( nicht nötig wenn der Datenbankname „zm“ genutzt wird ):
12sudo cp /usr/share/zoneminder/db/zm_create.sql .sudo sed 's/`zm`/`'zm_database'`/g' -i zm_create.sql - Datenbank in SQL Server laden:
1sudo mysql -uzmuser -pzmpass zm < /usr/share/zoneminder/db/zm_create.sql - Zoneminder Konfiguration anpassen:
123sudo sed 's/ZM_DB_USER=.*/ZM_DB_USER='zmuser'/g' -i /etc/zm/zm.confsudo sed 's/ZM_DB_PASS=.*/ZM_DB_PASS='zmpass'/g' -i /etc/zm/zm.confsudo sed 's/ZM_DB_NAME=.*/ZM_DB_NAME='zm'/g' -i /etc/zm/zm.conf
Oben genannte Schritte als Script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#!/bin/bash # set default vars zm_user="zm_user" zm_pass="zm_pass" zm_database="zm_db" # read user input read -e -p " Enter database username: " -i "$zm_user" zm_user read -e -p " Enter database password: " -i "$zm_pass" zm_pass read -e -p " Enter database name: " -i "$zm_database" zm_database # check user input echo "" echo " Create SQL database containig following values :" echo "" echo " User: $zm_user" echo " Pass: $zm_pass" echo " Database: $zm_database" echo "" request_loop () { Request= read -n1 -e -p " Create database (y/N)? " Request if [[ "$Request" == [yY] ]]; then printf " creating database ... " elif [[ "$Request" == [nN] ]]; then printf " creation canceled ... exit\n" exit 1 else request_loop fi printf "" } request_loop # write database sudo mysql -e "CREATE USER '$zm_user'@'localhost' IDENTIFIED BY '$zm_pass';" sudo mysql -e "CREATE DATABASE $zm_database;" sudo mysql -e "GRANT ALL PRIVILEGES ON $zm_database.* TO '$zm_user'@'localhost';" sudo cp /usr/share/zoneminder/db/zm_create.sql . sudo sed 's/`zm`/`'$zm_database'`/g' -i zm_create.sql sudo mysql -u$zm_user -p$zm_pass $zm_database < zm_create.sql sudo sed 's/ZM_DB_USER=.*/ZM_DB_USER='$zm_user'/g' -i /etc/zm/zm.conf sudo sed 's/ZM_DB_PASS=.*/ZM_DB_PASS='$zm_pass'/g' -i /etc/zm/zm.conf sudo sed 's/ZM_DB_NAME=.*/ZM_DB_NAME='$zm_database'/g' -i /etc/zm/zm.conf # check config file permission chgrp -c www-data /etc/zm/zm.conf # restart zoneminder sudo service zoneminder restart |
Alle Aufzeichnungen löschen
Um Aufzeichnungen, im Falle von Dateninkosistenzen ( Daten auf Festplatte oder Datenbank stimmen nicht mehr überein ) aus der Datenbank sowie von der Festplatte manuell zu löschen, kann mittels Zoneminder Webinterface fehlschlagen. In diesem Fall werden Datenbank-, und Pfadoperationen direkt über das Host OS verarbeitet:
Zoneminder – Manuelle Bereinigung von Ereignissen
Speefak | github.com | wiki.zoneminder.com | www.claudiokuenzler.com