[Из песочницы] Домашнее видеонаблюдение. Реализация с помощью Zoneminder и Debian 8
Введение
Доброго времени суток.
Имея в наличии домашний NAS, который работает под управлением Debian 8 (ранее я использовал Ubuntu Server 12.04 и 14.04), возникла идея возложить на него, помимо прочего, роль сервера видеонаблюдения. В качестве серверной части был выбран Zoneminder. Алгоритм работы видеонаблюдения должен быть такой: круглосуточная запись не нужна, но требуется в случае необходимости возможность включения записи по наступлению события — срабатывание на движение, с последующей отправкой уведомления на электронную почту со скриншотами с места события. Это нужно чтобы обеспечить контроль за квартирой в момент отсутствия кого-либо дома. Ну и, конечно, нужна возможность удалённо подключиться и проверить — всё ли в порядке.
На сайте разработчика я нашёл подробнейшую Wiki, посвященную именно установке на Debian 8 64-bit. Соответственно, инструкцию по установке я возьму оттуда, пояснив некоторые моменты своими комментариями.
Установка Zoneminder
Итак, у нас есть сервер с установленным в минимальной конфигурации Debian 8 64-bit (я использовал netinstall). Сначала нужно отредактировать sources.list, добавив в него Jessie backports:
sudo nano /etc/apt/sources.list
В конец файла добавим:
deb http://http.debian.net/debian jessie-backports main
Либо раскомментируем эту строку, если она там уже есть, то есть удалим # в начале строки. Обновляем индекс пакетов:
sudo apt-get update
Теперь всё готово для установки Zoneminder, что мы и сделаем:
sudo apt-get install zoneminder
В процессе установки будут также автоматически установлены Apache, MySQL, PHP.
После завершения установки, создаём базу MySQL:
sudo mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
В процессе создания базы, будет предложено выбрать пароль root базы. Далее выполняем последовательно следующие команды (через sudo), вводя пароль в случае запроса:
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
mysqladmin -uroot -p reload
chmod 740 /etc/zm/zm.conf
chown root:www-data /etc/zm/zm.conf
Включаем автозапуск Zoneminder:
systemctl enable zoneminder.service
Добавляем пользователя www-data в группу sudo, это нужно для доступа к локальным видеокамерам:
adduser www-data sudo
Запускаем Zoneminder:
systemctl start zoneminder.service
Проверяем, что Zoneminder запущен:
systemctl status zoneminder.service
Если всё в порядке, вывод команды должен быть, примерно, такой:
● zoneminder.service - ZoneMinder CCTV recording and surveillance system
Loaded: loaded (/lib/systemd/system/zoneminder.service; enabled)
Active: active (running) since Вс 2016-07-10 18:48:30 IRKT; 5h 31min ago
Process: 6413 ExecStop=/usr/bin/zmpkg.pl stop (code=exited, status=0/SUCCESS)
Process: 6455 ExecStart=/usr/bin/zmpkg.pl start (code=exited, status=0/SUCCESS)
Main PID: 6474 (zmdc.pl)
CGroup: /system.slice/zoneminder.service
├─6474 /usr/bin/perl -wT /usr/bin/zmdc.pl startup
├─6507 /usr/bin/perl -wT /usr/bin/zmfilter.pl
├─6514 /usr/bin/perl -wT /usr/bin/zmaudit.pl -c
└─6521 /usr/bin/perl -wT /usr/bin/zmwatch.pl
Настраиваем Apache:
a2enmod cgi
a2enmod rewrite
a2enconf zoneminder
Добавляем свой часовой пояс в PHP:
sudo nano /etc/php5/apache2/php.ini
Ищем секцию [Date] и меняем date.timezone на нужный:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Irkutsk
Сохраняем — Ctrl+O, выходим — Ctrl+X.
Перезапускаем Apache:
service apache2 restart
Чтобы была возможность управлять Zoneminder через Internet Explorer, нужно установить Cambozola:
cd /usr/src && wget http://www.andywilcock.com/code/cambozola/cambozola-latest.tar.gz
tar -xzvf cambozola-latest.tar.gz
replace 936 with cambozola version downloaded
cp cambozola-0.936/dist/cambozola.jar /usr/share/zoneminder
На этом установка Zoneminder завершена. Теперь нужно настроить почтовый транспорт для того, чтобы Zoneminder мог уведомлять о событиях по электронной почте.
Настройка почтового транспорта
Для отправки уведомлений, Zoneminder умеет использовать ssmtp, его и установим:
sudo apt-get update
sudo apt-get install ssmtp
Заодно установим mailutils, если этот пакет ещё не установлен:
sudo apt-get install mailutils
Теперь настроим параметры почты, от имени которой будут идти уведомления. Предположим, что ящик находится на gmail.com. Открываем ssmtp.conf:
sudo nano /etc/ssmtp/ssmtp.conf
и приводим к такому виду, указав, соответственно, ваши данные:
root=mymail@gmail.com
mailhub=smtp.gmail.com:587
hostname=localhost
RewriteDomain=gmail.com
UseSTARTTLS=YES
UseTLS=YES
AuthUser=mymail@gmail.com
AuthPass=myverystrongpassword
Правим revaliases:
sudo nano /etc/ssmtp/revaliases
приводим к такому виду:
root:pp@gmail.com:smtp.gmail.com:587
www-data:pp@gmail.com:smtp.gmail.com:587
И проверяем корректность настроек, отправив тестовое письмо:
echo "Hello, World" | mail -s "My email check" mne@napochtu.ru
Если тест прошёл успешно, переходим к следующему шагу — установка MIME: Lite и Net: SMTP. Проверим, установлены ли эти компоненты:
perl -MMIME::Lite -e "print \"Module installed.\\n\";"
perl -MNet::SMTP -e "print \"Module installed.\\n\";"
Устанавливаем, зайдя в оболочку perl:
sudo perl -MCPAN -e shell
install MIME::Lite
install Net::SMTP
Сейчас нужно внести очень важные изменения, без которых почтовый транспорт от Zoneminder работать не будет. Обратите внимание, что эти изменения нужно вносить только в том случае, если версия установленного Zoneminder — 1.29 или ниже. Начиная с версии 1.30, эти действия производить не нужно.
Откроем в редакторе файл zmfilter.pl:
sudo nano /usr/bin/zmfilter.pl
Перейдя на строку 1179, мы видим следующее:
### Send the Message
MIME::Lite->send( "smtp", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
$mail->send();
Закомментируем строки
MIME::Lite->send( "sendmail", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
и
$mail->send();
и добавим под ними строку
$mail->send('sendmail','/usr/sbin/ssmtp',$Config{ZM_EMAIL_ADDRESS});
В итоге, начиная со строки 1179 (в моём случае, но не обязательно именно этот номер строки), код должен выглядеть так:
### Send the Message
#MIME::Lite->send( "sendmail", $Config{ZM_EMAIL_HOST}, Timeout=>60 );
#$mail->send();
$mail->send('sendmail','/usr/sbin/ssmtp',$Config{ZM_EMAIL_ADDRESS});
Сохраняем, выходим. На этом работа с терминалом завершена.
Веб-интерфейс Zoneminder
Управление доступно по адресу ip.adress.servera/zm, заходим. Первое, что нужно сделать, это зайти в Options → Users, и задать пароль пользователю admin:
Затем зайти в Options → System, и поставить галочку напротив OPT_USE_AUTH:
Если этого не сделать, то Zoneminder позволяет зайти в веб-интерфейс или подключиться через клиентское приложение без запроса логина\пароля, что, естественно, небезопасно. Странно, что эта очень нужная галочка не отмечена по умолчанию.
Теперь настроим отправку электронной почты. Заходим в Optons → Email и настраиваем по аналогии:
В поле EMAIL_BODY можно настроить формат уведомлений так, как нужно именно вам. Например, если в поле добавить %EI1%, то к сообщению будет прикреплен первый скриншот с момента срабатывания датчика движения. Полный список опций для уведомлений доступен здесь.
Добавление камер
Zoneminder умеет работать как с usb, так и с IP-камерами. На данный момент, мои камеры ещё в пути, поэтому в качестве тестово-настроечно-временного варианта камеры, я использую мой старый Android-смартфон Alcatel Pop C2, на котором установлено приложение IP Webcam, превращающее смартфон в Wi-Fi IP-камеру. После установки и запуска приложения (предварительно рекомендую выставить разрешение видеопотока в настройках приложения, я выставил 800×480), на дисплее смартфона отображается IP и порт, по которому можно зайти в веб-интерфейс и посмотреть, что здесь есть интересного:
Настроек, в общем, довольно много, но нас интересует адрес, по которому отдается видеопоток. И мы видим, что есть информация для настройки Zoneminder, что не может не радовать. А именно, указан Remote host path, путь, который нужно будет прописать в настройках Zoneminder — после IP камеры нужно добавить /video:
Возвращаемся в веб-интерфейс Zoneminder, чтобы добавить камеру, выбираем Add New Monitor:
В поле Name пишем желаемое имя, Source type → Remote:
Во вкладке Source заполняем поля: Remote Host Name → IP смартфона, Remote Host Port → порт, на котором работает IP Webcam, Remote Host Path → путь, который мы подсмотрели в настройках IP Webcam, а также указываем разрешение видеопотока, которое должно совпадать с выбранным нами ранее в настройках IP Webcam:
Сохраняем настройки → Save, и в главном меню Zoneminder видим добавленную нами камеру:
При нажатии на название которой, мы видим изображение:
Камеры могут работать в нескольких режимах, который определяется параметром Function в главном меню:
Режим, в котором запись ведется только при наличии движения в кадре, называется Modect, его и выберем. Теперь система не будет записывать видеопоток постоянно, а только при наличии веских на то причин. Но нам ведь ещё нужно уведомление о движении в кадре. Для это нужно настроить фильтр. Открываем Filters в главном меню Zoneminder, настраиваем согласно скриншоту, сохраняем под любым именем:
И не забываем поставить галочку напротив Run filter in background:
Таким образом, если в кадре будет обнаружено движение, система запишет видео и отправит на почту уведомление.
Клиентские приложения
Если есть постоянный IP, ничто не мешает пробросить порты в маршрутизаторе и подключаться со смартфона извне через веб-интерфейс, тем более, что в настройках Zoneminder можно выбрать мобильную версию интерфейса, но, помимо этого, я решил поискать какое-нибудь мобильное приложение для этой цели. Поискав в Google Play по ключевому слову «zoneminder», я остановился на zmNinja, т.к. рейтинг достаточно высокий и скриншоты понравились. Приложение платное, триальной версии для предварительной оценки, увы, нет. Функционал более чем достаточный — просмотр видеопотока в реальном времени, просмотр архива, записанных событий, переключение режимов камер и т.д.
Также есть десктопные версии zmNinja для Linux, Windows, Mac OS X — они распространяются бесплатно. Так выглядит версия для Linux, запущенная на моём Mint 18:
В общем, для всех систем интерфейс единообразен.
На этом всё, спасибо за внимание.