Содержание

Дата написания: февраль 2023 г.
Автор: Graf

Сервер видеонаблюдения на базе ZoneMinder


Перед добавлением камер обязательно настраиваем аутентификацию, задаем пароль пользователю с правами админа, перезапускаем ZoneMinder и перезаходим под пользователем с правами админа, только потом добавляем камеры!

Установка

Используем Slackware Linux 15.0 64-bit без DE и всем, что с ними связанно.
Обновляем все доступные пакеты посредством slackpkg, в итоге получая ядро 5.15.80.
IP сервера куда всё устанавливаем и где настраиваем - 192.168.10.125
ZoneMinder версии 1.36.32

ffmpeg используем стоковый, идущий с дистрибутивом.

Устанавливаем vlc плеер от Alien, последний на день написания статьи 3.0.17.4.

# wget http://www.slackware.com/~alien/slackbuilds/vlc/pkg64/15.0/vlc-3.0.17.4-x86_64-1alien.txz
# upgradepkg --install-new ./vlc-3.0.17.4-x86_64-1alien.txz

Устанавливаем sbopkg, синхронизируемся с его репозиторием попутно соглашаясь с созданием отсутствующих каталогов. И устанавливаем необходимое.

# wget https://github.com/sbopkg/sbopkg/releases/download/0.38.2/sbopkg-0.38.2-noarch-1_wsr.tgz
# upgradepkg --install-new ./sbopkg-0.38.2-noarch-1_wsr.tgz
# sbopkg -r
# sbopkg -Bi "libjwt php-apcu"

Устанавливаем недостающие модули Perl.

# cpan Date::Manip LWP::UserAgent Sys::Mmap Sys::MemInfo Number::Bytes::Human Crypt::Eksblowfish::Bcrypt Data::Entropy::Algorithms

Собираем и устанавливаем сам ZoneMinder.
Смотрим релиз в https://github.com/ZoneMinder/zoneminder/releases
на сегодня это 1.36.32. Начинаем собирать и устанавливать пакет.

# git clone https://github.com/ZoneMinder/ZoneMinder.git
# cd ./ZoneMinder/
# git checkout 1.36.32
# git submodule update --init --recursive
# cmake -Wno-dev \ 
-DCMAKE_INSTALL_PREFIX=/usr \
-DZM_WEBDIR=/var/www/htdocs/zm \
-DZM_WEB_GROUP=apache \
-DZM_WEB_USER=apache \
-DZM_CGIDIR=/var/www/cgi-bin \
-DZM_CACHEDIR=/var/www/htdocs/zm/cache \
-DZM_CONTENTDIR=/var/www/htdocs/zm \
-DZM_CONFIG_DIR=/etc/zm \
-DZM_PATH_ZMS=/var/www/cgi-bin/nph-zms \
-DLIBJWT_INCLUDE_DIR=/usr/include \
-DLIBJWT_LIBRARY=/usr/lib64/libjwt.so \
# make
# make install DESTDIR=/tmp/ZoneMinder-1.36.32
# cd /tmp/ZoneMinder-1.36.32
# makepkg -l y -c n /tmp/ZoneMinder-1.36.32-x86_64-1.txz
# upgradepkg --install-new /tmp/ZoneMinder-1.36.32-x86_64-1.txz

Скачаем zm_1.36.32_indexphp.tar распакуем и заменим файл /var/www/htdocs/zm/index.php на файл из архива.
Файл взят с версии 1.36.26. При использовании родного index.php, во время добавления серверов, мониторов и прочего, вываливается ошибка:

web_php[1188].ERR [actions can no longer be performed without POST. Requested: save for server] at index.php line 200
web_php[1188].FAT [View 'server' does not exist] at index.php line 281

Создадим недостающие каталоги и дадим соответствующие права.

# mkdir -p /var/{run/zm,log/zm,www/htdocs/zm/{events,images,sounds,cache}}
# chown -R apache:apache /var/{run/zm,log/zm,www/htdocs/zm}

Скопируем скрипт старта-остановки и присвоим ему бит запуска.

# cp scripts/zm /etc/rc.d/rc.zm
# chmod +x /etc/rc.d/rc.zm

И, для автостарта при загрузке, пропишем в /etc/rc.d/rc.local

/etc/rc.d/rc.zm start

Всё необходимое поставили, перейдем к настройке.

Настройка

Так как MySQL (MariaDB) в Slackware Linux уже установлена, просто настроим ее и дадим пароль пользователю root

# mkdir /var/lib/mysql/mysql
# mysql_install_db
# chown -R mysql.mysql /var/lib/mysql
# chmod +x /etc/rc.d/rc.mysqld
# /etc/rc.d/rc.mysqld start
# mysql -u root
   MariaDB [(none)]> set password for 'root'@'localhost' = password('mypassword');
   Query OK, 0 rows affected (0.00 sec)
 
   MariaDB [(none)]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [(none)]> \q
   Bye

Войдем под пользователем root, создадим базу ZoneMinder, для работы с базой дадим соответствующие права пользователю zmuser.

# mysql -u root -p
   Enter password: 
   MariaDB [(none)]> source /usr/share/zoneminder/db/zm_create.sql;
   …
   Query OK, 1 row affected (0.00 sec)
   Query OK, 1 row affected (0.00 sec)

   MariaDB [(none)]> use zm;
   
   Database changed
   MariaDB [zm]> 

   MariaDB [zm]> grant all privileges on zm.* to 'zmuser'@localhost identified by 'zmpass';
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [zm]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [zm]> \q
   Bye

Редактируем /etc/httpd/httpd.conf.

# Убираем знаки комментария со строк:
LoadModule cgid_module lib64/httpd/modules/mod_cgid.so
LoadModule cgi_module lib64/httpd/modules/mod_cgi.so
LoadModule rewrite_module lib64/httpd/modules/mod_rewrite.so
Include /etc/httpd/mod_php.conf

# Дописываем.
#
# В данном случае, если нет FQDN, значение ServerName для работы в локальной сети.
ServerName 127.0.0.1

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Include /etc/httpd/extra/zm_httpd.conf

Создаем файл /etc/httpd/extra/zm_httpd.conf со содержимым:

<VirtualHost *:80>
    ServerName video-server.mydom.lan
    ServerAlias 192.168.10.125
 
    DocumentRoot /var/www/htdocs/zm
 
    ScriptAlias /cgi-bin /var/www/cgi-bin
    <Directory /var/www/cgi-bin>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        AllowOverride None
        Require all granted
    </Directory>
 
    Alias /cache /var/www/htdocs/zm/cache
    <Directory /var/www/htdocs/zm/cache>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
 
    <Directory /var/www/htdocs/zm>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
        DirectoryIndex index.php
    </Directory>
 
    <Directory /var/www/htdocs/zm/api>
        RewriteEngine On
        RewriteRule ^$ app/webroot/ [L]
        RewriteRule (.*) app/webroot/$1 [L]
        RewriteBase /api
 
    </Directory>
        <Directory /var/www/htdocs/zm/api/app>
        RewriteEngine On
        RewriteRule ^$ webroot/ [L]
        RewriteRule (.*) webroot/$1 [L]
        RewriteBase /api
    </Directory>
 
    <Directory /var/www/htdocs/zm/api/app/webroot>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
        RewriteBase /api
    </Directory>
 
    ErrorLog "/var/log/zm/zm_error_log"
    CustomLog "/var/log/zm/zm_access_log" common
 
</VirtualHost>

Запускаем Apache и ZM.

# chmod +x /etc/rc.d/rc.httpd
# /etc/rc.d/rc.httpd start
# /etc/rc.d/rc.zm start

Проверяем работоспособность API:

http://192.168.10.125/api/host/getVersion.json — должны увидеть

{"version":"1.36.32","apiversion":"2.0"}

И донастраиваем ZoneMinder в веб-интерфейсе по адресу: http://192.168.10.125

Русификация

Архив ru-ru-php_1.36.tar содержит 1 файл - ru_ru.php, в котором перевод интерфейса, описание параметров и помощи по ним.

Заменяем файл ru_ru.php в zm/lang файлом из архива, не забыв сделать копию оригинала.
Затем, заходим в веб-интерфейс и устанавливаем язык и локаль. Options → System

Всё, ZoneMinder русифицирован процентов на 95 :)
Перевод опций и помощи по ним, выполнен мной единолично, поэтому весьма вероятны не точности и ошибки. Пишите на форуме в специальной ветке обсуждения данной статьи, постараюсь своевременно их исправлять.

Обновление

Если есть старый рабочий ZoneMinder сервер , допустим 1.30.0 , то перед обновлением нужно сделать полную копию его базы:

# mysqldump -u root -p zm > zm-all-1300.sql

Полученный файл перенести на вновь установленную Slackware Linux 15.0 и ZoneMinder, по данной статье. Остановить ZoneMinder и Apache:

# /etc/rc.d/rc.zm stop
# /etc/rc.d/rc.httpd stop

Cкопировать кадры записей из /var/www/htdocs/zm/events

Если обновление делается на той же машине, то после полной копии базы, соблюдая версию Slackware Linux, обновить все необходимые пакеты - ffmpeg, vlc и весь список в sbopkg, собрать и обновить ZoneMinder.

«Подсунуть» данный файл мускулу:

# mysql -u root -p zm < /путь/до/файла/zm-all-1300.sql

или

# mysql -u root -p
   MariaDB [(none)]> use zm;
   MariaDB [zm]> source /путь/до/файла/zm-all-1300.sql;
   MariaDB [zm]> \q

и обновить базу

# zmupdate.pl

ответить на вопросы и получить базу равную 1.36.32 (на день написания статьи).

Обновить конфигурацию в базе данных.

# zmupdate.pl -f

Запустить Apache, ZoneMinder и проверить работоспособность.

# /etc/rc.d/rc.httpd start
# /etc/rc.d/rc.zm start

Заметки

Пользователи

Вновь хочу напомнить, что перед добавлением камер, включите аутентификацию, хеширование, API и TimeZone.
Всё это настраивается в «Параметры» → «Система». И настройте пользователя admin в «Параметры» → «Пользователи».


Придумайте пароль, сохраните и войдите под ним, для добавления и настройки камер. Если, вдруг, забыли ввести пароль, то по умолчанию для пользователя admin пароль admin.
Если, в последующем, необходимо ограничить пользователя только просмотром онлайн-видео, то у пользователя должны быть права на просмотр монитора и поток.

Камеры

Очередной раз напоминаю, перед добавлением камер, включите Аутентификацию.
После чего, заходим в «Параметры»→«Серверы». Здесь можно настроить нескольких серверов ZoneMinder, имеющих общую базу данных и использующих общий файловый ресурс для всех данных о событиях.
Один из вариантов использования данной вкладки, это обход ограничения браузеров в которых, при общем просмотре камер в прямой трансляции, показывается только 5-6 камер.
Т.е. используя один физический сервер (например: vm.mydom.ru) можно указать на него несколько поддоменов (например: vm1.mydom.ru, vm2.mydom.ru и т.д), путём настройки DNS.
А эти поддомены использовать в данной вкладке, как отдельные серверы. Причём, в таком случае, изменится только адрес сервера и его название.
Ну, и так как у нас всего один сервер без доменного имени, а только с IP-адресом, то его и добавляем нажав на кнопку «Добавить сервер».


Обратите внимание на пути! Они прописаны с учётом Настроек Apache. Т.е относительно пути в DocumentRoot и ScriptAlias для cgi-bin.
Название сервера может быть произвольным, латинскими буквами и цифрами.
Сохраняем настройки сервера и переходим к добавлению камер на главной странице или через меню «Сервер».
Нажимаем на «Добавить монитор» и попадаем во вкладку «Общие».

Вкладка "Общие"


Где:

Не выбран (None) - монитор в настоящее время отключен. Никакие потоки не могут быть просмотрены или сгенерированы события. Ничего не записывается.
Наблюдение (Monitor) - монитор доступен только для потокового вещания. Анализ изображения не производится, поэтому не генерируются сигналы тревоги или события, и ничего не записывается.
Запись при движении (Modect) - или MOtion DEteCTtion. Все захваченные изображения будут проанализированы, а при обнаружении движения будут сгенерированы события с записью видео.
Постоянная запись (Record) - монитор будет непрерывно записываться. События фиксированной длины будут генерироваться независимо от движения, аналогично обычному видеомагнитофону с временной задержкой. В этом режиме не происходит обнаружения движения.
Постоянная запись с обл. детекции (Mocord) - монитор будет вести непрерывную запись, при этом любое движение будет выделено в событиях.
Внешние триггеры (Nodect) - или No DEteCTtion. Это специальный режим, предназначенный для использования с внешними триггерами. В режиме Nodect не происходит обнаружения движения, но события записываются, если этого требуют внешние триггеры.
Если установлен режим отличный от Не выбран (None) и Наблюдение (Monitor), то появляются опции:

  1. Analysis Enabled - В режимах: «Запись при движении» (Modect), «Постоянная запись» (Record), «Постоянная запись с обл. детекции» (Mocord), «Внешние триггеры» (Nodect), процесс анализа может быть включен или выключен. Эта опция устанавливает состояние по умолчанию при запуске процесса. После запуска процесса эту опцию можно включить или выключить с помощью внешних триггеров zmtrigger, zmu или веб-интерфейса. Если опция не включена, то не будет выполняться обнаружение движения или проверка связанного монитора и не будут создаваться события.
  2. Decoding Enabled - В режиме «Постоянная запись» (Record) или «Внешние триггеры» (Nodect) и при использовании H264Passthrough без сохранения jpeg, есть возможность отключить декодирование пакетов H264/H265. Это значительно снизит потребление процессора, но сделает недоступным просмотр в реальном времени для текущего монитора. По умолчанию включено.

Вкладка "Источник"

Тип источника "Локальный"


Используется, если камеры физически подключены к серверу ZoneMinder.

Тип источника "Удаленный"


Тип источника "Файл"


Особенность этого типа в том, что в качестве источника изображений указывается один единственный файл в который идёт запись всех кадров изображений с камеры (например, в /home/images/camera1.jpg).
Помните!
Каждый кадр перезаписывает этот файл изображения. Указывается один файл, а не каталог со множеством файлов!

Тип источника "FFmpeg"


Рекомендуемый тип источника!
  1. В документации к камере;
  2. Попробовать новую функцию ONVIF в ZoneMinder;
  3. Использовать поисковые системы в Интернете для поиска сайтов, которые документируют такую информацию. Например, такие как ispyconnect.com;
  1. TCP - Использовать TCP (чередование в канале управления RTSP) в качестве транспортного протокола;
  2. UDP - Использовать UDP в качестве транспортного протокола. Камеры с высоким разрешением испытывают некоторые «размазывания» при использовании UDP, в этом случае поменяйте на TCP;
  3. UDP Multicast - Использовать UDP Multicast в качестве транспортного протокола;
  4. HTTP Tunnel - Использовать туннелирование HTTP в качестве транспортного протокола, полезно для прохождения прокси-серверов.
  1. allowed_media_types=video - набор типов данных запрашиваемых у камеры (audio, video, data);
  2. reorder_queue_size=nnn - количество пакетов в буфере для обработки переупорядочивания пакетов;
  3. loglevel=debug - уровень журналирования FFmpeg (quiet, panic, fatal, error, warning, info, verbose, debug).

Тип источника "cURL"


Тип источника «cURL» никак не зависит от ffmpeg!
Он поддерживает только камеры, передающие потоки по HTTP(s) используя библиотеку Libcurl!

Тип источника "Web Site"


Этот тип источника позволяет использовать произвольный веб-сайт в качестве интерактивного монитора. При этом типе источника, видео не записывается (не сохраняется) в ZoneMinder. Так же, сайты с самоподписанными сертификатами не будут отображаться, пока пользователь вручную не перейдет на сайт и не получит неподписанный сертификат. Обратите внимание, что некоторые сайты устанавливают опцию X-Frame в заголовке, что препятствует отображению таких сайтов во фрейме. ZoneMinder обнаружит это и выдаст предупреждение в журнале. В таком случае, пользователь может установить плагин или расширение для браузера, чтобы обойти эту проблему.

Тип источника "NVSocket"


Данный тип специально предназначен для работы с платформами NVIDIA Jetson (и, возможно, более новыми). Он берет необработанный видеопоток из сокета библиотек nvidia.

Тип источника "VNC"


Данный тип источника позволяет выполнять запись экрана Windows/Linux/Mac или любого другого компьютера на котором установлен VNC-сервер. Вам придётся самостоятельно подобрать частоту кадров в параметрах: Частота анализа (к/с), Максимальная частота кадров и Максимальная частота кадров для тревоги на вкладке "Общие". Обычно, 2-5 к/с достаточно.
Также обратите внимание, что для соединения, часто, имя пользователя не используется, достаточно только пароля. Это зависит от настроек на стороне VNC-сервера. Установка слишком большого разрешения может повлиять на производительность.

Вкладка "ONVIF"


Протокола ONVIF (Open Network Video Interface Forum) — это общепринятый протокол для совместной работы IP-камер, видеорегистраторов и программного обеспечения, например, если все устройства разных производителей.
Нужно убедиться:
- что подключаемые устройства имеют поддержку ONVIF, на некоторых устройствах он может быть выключен по умолчанию;
- что может быть отключена авторизация по ONVIF. Это значит, что логин/пароль будет всегда по умолчанию, независимо от логина/пароля для WEB-интерфейса;
- какой используется порт для работы по протоколу ONVIF;
- какой используется пароль для ONVIF-соединения. Иногда, он отличаться от пароля для WEB-доступа.

Вкладка "Хранилище"


Раздел позволяет настроить разрешения на запись видео и аудио, а также каким образом оно будет записываться и куда.
  1. Отключено - Видео не записывается в JPEG-файлы. Если выбран этот вариант, то необходимо включить параметр «Записывать видео», иначе запись видео не будет производиться, вообще;
  2. Только кадры - Видео записывается в виде отдельных кадров в формате JPEG;
  3. Только аналитические изображения (при наличии) - Видео записывается в виде отдельных кадров JPEG с наложением информации об анализе обнаружения движения. Обратите внимание, что это наложение остается постоянно видимым в кадрах;
  4. Кадры + аналитические изображения (при наличии) - Видео записывается дважды: один раз в виде обычных отдельных кадров JPEG, а другой раз в виде отдельных кадров JPEG с наложенной аналитической информацией.
  1. Отключено - Видео не записывается. Если выбран этот вариант, то должен быть включён параметр «Сохранить JPEG-и», иначе запись видео не будет производиться, вообще;
  2. Кодировать - Видео или кадры изображения, полученные с камеры, перекодируются в выбранный кодек и сохраняются как видео. Этот параметр полезен, если камера не может передавать потоковое видео в формате h264. При выборе этого варианта, становятся доступны опции:
    1. Кодек - Выбор необходимого кодека из списка;
    2. Кодировщик - Выбор необходимого кодировщика. Например, выбрать кодировщик с аппаратным ускорением.
  3. Прямо с камеры - Предполагается, что камера уже отправляет поток h264. Видео будет записано как есть, без какой-либо постобработки в ZoneMinder. Такие характеристики видео, как битрейт, режим кодирования и т.д., должны быть установлены непосредственно на камере. А так же полученное видео не будет включать наложение временной метки ZoneMinder, поэтому, если на видео нужно отображение даты и времени, то их необходимо включить и настроить на камере;

Вкладка "Метка_Времени"


Раздел относится к метке времени, которая отображается на каждом кадре.

Вкладка "Буферы"


Вкладка "Управление"


Эта вкладка и ее параметры появятся только в том случае, если вы выбрали опцию «Параметры» → «Система» → OPT_CONTROL, указывающую на то, что у вас подключены камеры, которыми можно управлять с помощью панорамирования/наклона/зума (PTZ) или других механизмов.

Вкладка "Х10"


Эта вкладка и ее опции появятся только в том случае, если установлен флажок в «Параметры» → «Х10» → «OPT_X10» указывающий о включении поддержки протокола домашней автоматизации «X10».

Вкладка "Разное"


Вкладка "Расположение"


На этой вкладке вводится координаты географического расположения камеры.
(Пока, не работает. прим. Graf)

Почта

Для отправки сообщений, при работе фильтров, необходимо настроить такую отправку и сам фильтр.
Но перед этим установим и настроим ssmtp в замен стокового sendmail при помощи которого будем отсылать сообщение на e-mail.
В данном примере показана настройка для корпоративной почты (@mydom.ru) на стороннем сервере (mailserver.ru) по защищённому протоколу SMTPS на порту 465.
По сути, аналог известных почтовых сервисов от yandex.ru, mail.ru и иже с ними для корпоративной почты.
Если будете использовать эти сервера «на прямую» (т.е. ваша почта @yandex.ru, @mail.ru и т.д.), то не забывайте, что теперь нужно создать «пароль для приложения» в этих сервисах, и вводить его в конфигурационный файл ssmtp.
Если у вас вой сервер, то настройки будут, соответственно, другими.

# sbopkg -i ssmtp
# /usr/sbin/generate_config /etc/ssmtp/ssmtp.conf
Please enter the mail name of your system.
This is the hostname portion of the address to be shown
on outgoing news and mail messages headers.
The default is srv1.mydom.lan, your system's host name.

Mail name [srv1.mydom.lan]: localhost
Please enter the SMTP port number [25]: 465

Please check the configuration file /etc/ssmtp/ssmtp.conf for correctness.

Переходим в каталог /etc/ssmtp и заполним ssmtp.conf

# Пользователь, который получает всю почту для userids < 1000
root=postmaster

# Полное имя машины
hostname=localhost

# Поле From: будет выставляться самим smtp переписывая значение вводимое скриптами
FromLineOverride=YES

# Пользователь на smtp-сервере (от кого шлем почту)
AuthUser=fromserver@mydom.ru

# Пароль входа на smtp-сервер для пользователя указанного в AuthUser
AuthPass=passwordforlogin

# Адрес и порт smtp-сервера
mailhub=smtp.mailserver.ru:465

# Перезапись домена на свой (если используется сторонний сервер, например от yandex)
rewriteDomain=mydom.ru

# Использовать SSL/TLS для аутентификации на smtp-сервере
UseTLS=YES

Тут же, в каталоге /etc/ssmtp изменим файл revaliases, если нет, то создадим.

# Некая защита от спама.
# root:ОТ_КОГО:ЧЕРЕЗ_КАКОЙ_SMTP_СЕРВЕР:SMTP_ПОРТ

root:fromserver@mydom.ru:smtp.mailserver.ru:465

Подменяем sendmail.

# mv /usr/sbin/sendmail /usr/sbin/sendmail.org 
# ln -s /usr/sbin/ssmtp /usr/sbin/sendmail

Проверим работу отправив тестовое письмо:

# echo test | mail -v -s "testing ssmtp" kakoyto-mail@yandex.ru
[<-] 220 smtp.mailserver.ru ESMTP
[->] EHLO localhost
[<-] 250 HELP
[->] AUTH LOGIN
[<-] 334 VXNlcm7hbWU7
[->] ZnJvbXNlcnZlckBtaWcta5NiLnJ5
[<-] 334 UGFzc7dvciQ7
[<-] 235 Authentication succeeded
[->] MAIL FROM:<fromserver@mydom.ru>
[<-] 250 OK
[->] RCPT TO:<kakoyto-mail@yandex.ru>
[<-] 250 Accepted
[->] DATA
[<-] 354 Enter message, ending with "." on a line by itself
[->] Received: by localhost (sSMTP sendmail emulation); Tue, 10 Jan 2023 12:58:41 +0300
[->] From: fromserver@mydom.ru
[->] Date: Tue, 10 Jan 2023 12:58:41 +0300
[->] To: kakoyto-mail@yandex.ru
[->] Subject: testing ssmtp
[->] User-Agent: Heirloom mailx 12.5 7/5/10
[->] MIME-Version: 1.0
[->] Content-Type: text/plain; charset=us-ascii
[->] Content-Transfer-Encoding: 7bit
[->] 
[->] test
[->] .
[<-] 250 OK id=1ewm7I-0004QJ-2Y
[->] QUIT

Работает.
Теперь заходим в ZoneMinder, переходим в «Параметры» → «Email» и настраиваем почту.
Пример на картинке демонстрирует настройки при наличии локального МТА, таких как sendmail(мы подменили ssmtp), postfix и т.д.
Если таковых нет локально и(или) не планируется использовать, то для отправки почтовых сообщений можно использовать ssmtp без подмены sendmail.
При этом, необходимо настроить адрес удалённого почтового сервера и последние пункты:


Макросы которые можно использовать не только в настройке почтовых сообщений, но и в фильтрах и прочих параметрах.

%EI%   Id события
%EN%   Название события
%EC%   Причина события
%ED%   Описание события
%ET%   Время события
%EL%   Длина события
%EF%   Количество кадров в событии
%EFA%  Количество кадров тревоги в событии
%EST%  Общая оценка события
%ESA%  Средний балл события
%ESM%  Максимальная оценка события
%EP%   Путь к событию
%EPS%  Путь к потоку событий
%EPI%  Путь к изображениям события
%EPI1% Путь к первому тревожному изображению события
%EPIM% Путь к (первому) изображению события с наивысшей оценкой
%EI1%  Прикрепить изображение первого тревожного события
%EIM%  Прикрепить (первое) изображение события с наивысшей оценкой
%EV%   Прикрепить видеозапись события в формате mpeg
%MN%   Название монитора
%MET%  Общее количество событий для монитора
%MEH%  Количество событий для монитора за последний час
%MED%  Количество событий для монитора за последний день
%MEW%  Количество событий для монитора за последнюю неделю
%MEM%  Количество событий для монитора за последний месяц
%MEA%  Количество архивных событий для монитора
%MOD%  Путь к изображению, содержащему обнаружение объекта
%MP%   Путь к окну монитора
%MPS%  Путь к потоку монитора
%MPI%  Путь к последнему изображению монитора
%FN%   Имя текущего фильтра, с которым произошло совпадение
%FP%   Путь к текущему фильтру, который совпал
%ZP%   Путь к консоли ZoneMinder

Теперь, для оправки сообщений по определённому расписанию и(или) событию, нужно настроить фильтр.
В меню выбираем «Фильтры» и создаем новый фильтр с названием «Send Email».
Тут же можно переопределить Получателя,Тему и Содержимое письма.

zmNinja

По сути, единственное приложение, которое работает с ZoneMinder. Начинал его писать и поддерживал, всего один человек, который занимался им с 22:00 до 02:00. Теперь zmNinja на попечении у команды ZoneMinder. Правда, с 2021 г. в приложение не внесено ни одной правки. Но, как утверждают разработчики ZoneMinder, ничего править не требуется, приложение работает со всеми версиями ZoneMonder, до сих пор, замечательно.
Бинарники и исходники можно скачать ТУТ.
Заметки:

zmninja-pro-1.6.9-linux-x86_64.AppImage --path=/path/to/instance1
zmninja-pro-1.6.9-linux-x86_64.AppImage --path=/path/to/instance2

Документация по zmNinja.

Полезное

Например, в журнале, бывают сообщения такого характера:

zmdc		1933	ERR     'zmc -m 5' exited abnormally, exit status 11	zmdc.pl
zmc_m5		464	ERR	Got signal 11 (Segmentation fault), crashing

Чтобы посмотреть подробно, что происходит, можно в консоли запустить отладчик и посмотреть:

# gdb --args zmc "-m 5"
(gdb) r
# /usr/bin/zmdc.pl restart zmc -m 5

Обсуждаем на форуме

Ссылки

При написании статьи использовались:
https://wiki.slackware.su/wiki:articles:zm
https://wiki.zoneminder.com
https://zoneminder.readthedocs.io/en/1.34.25/userguide
https://forums.zoneminder.com