[Из песочницы] Домашнее видеонаблюдение. Реализация с помощью 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:

c89d1576e93e476eaceac351d8cf9adc.png

Затем зайти в Options → System, и поставить галочку напротив OPT_USE_AUTH:

c6340afe4f184314abb5dae0fa45210f.png

Если этого не сделать, то Zoneminder позволяет зайти в веб-интерфейс или подключиться через клиентское приложение без запроса логина\пароля, что, естественно, небезопасно. Странно, что эта очень нужная галочка не отмечена по умолчанию.

Теперь настроим отправку электронной почты. Заходим в Optons → Email и настраиваем по аналогии:

a4a33e6f928245778132e33b7ebda91a.png

В поле EMAIL_BODY можно настроить формат уведомлений так, как нужно именно вам. Например, если в поле добавить %EI1%, то к сообщению будет прикреплен первый скриншот с момента срабатывания датчика движения. Полный список опций для уведомлений доступен здесь.

Добавление камер


Zoneminder умеет работать как с usb, так и с IP-камерами. На данный момент, мои камеры ещё в пути, поэтому в качестве тестово-настроечно-временного варианта камеры, я использую мой старый Android-смартфон Alcatel Pop C2, на котором установлено приложение IP Webcam, превращающее смартфон в Wi-Fi IP-камеру. После установки и запуска приложения (предварительно рекомендую выставить разрешение видеопотока в настройках приложения, я выставил 800×480), на дисплее смартфона отображается IP и порт, по которому можно зайти в веб-интерфейс и посмотреть, что здесь есть интересного:

c6b0112847f343b9a2f5c1e568a46054.png

Настроек, в общем, довольно много, но нас интересует адрес, по которому отдается видеопоток. И мы видим, что есть информация для настройки Zoneminder, что не может не радовать. А именно, указан Remote host path, путь, который нужно будет прописать в настройках Zoneminder — после IP камеры нужно добавить /video:

06107f34875040c3b59c31fdb48be5f6.png

Возвращаемся в веб-интерфейс Zoneminder, чтобы добавить камеру, выбираем Add New Monitor:

1f53f57f0e1e46f98fb744ff561f9bc0.png

В поле Name пишем желаемое имя, Source type → Remote:

fe49c3eb8bff451d868f5717256786f8.png

Во вкладке Source заполняем поля: Remote Host Name → IP смартфона, Remote Host Port → порт, на котором работает IP Webcam, Remote Host Path → путь, который мы подсмотрели в настройках IP Webcam, а также указываем разрешение видеопотока, которое должно совпадать с выбранным нами ранее в настройках IP Webcam:

edb332eaa0af41929a5c001c85ba250c.png

Сохраняем настройки → Save, и в главном меню Zoneminder видим добавленную нами камеру:

79be8b13496c4d208c3b7bf71b8f0f78.png

При нажатии на название которой, мы видим изображение:

658932b4bf8e48099191e344fe46a436.png

Камеры могут работать в нескольких режимах, который определяется параметром Function в главном меню:

f7bc37f45b0a4b00b91107ff71e2ba86.png

Режим, в котором запись ведется только при наличии движения в кадре, называется Modect, его и выберем. Теперь система не будет записывать видеопоток постоянно, а только при наличии веских на то причин. Но нам ведь ещё нужно уведомление о движении в кадре. Для это нужно настроить фильтр. Открываем Filters в главном меню Zoneminder, настраиваем согласно скриншоту, сохраняем под любым именем:

e06f677d87504372b4b2e6a256c2b029.png

И не забываем поставить галочку напротив Run filter in background:

fa0028000ace4cf09efc533db6c5a89a.png

Таким образом, если в кадре будет обнаружено движение, система запишет видео и отправит на почту уведомление.

Клиентские приложения


Если есть постоянный IP, ничто не мешает пробросить порты в маршрутизаторе и подключаться со смартфона извне через веб-интерфейс, тем более, что в настройках Zoneminder можно выбрать мобильную версию интерфейса, но, помимо этого, я решил поискать какое-нибудь мобильное приложение для этой цели. Поискав в Google Play по ключевому слову «zoneminder», я остановился на zmNinja, т.к. рейтинг достаточно высокий и скриншоты понравились. Приложение платное, триальной версии для предварительной оценки, увы, нет. Функционал более чем достаточный — просмотр видеопотока в реальном времени, просмотр архива, записанных событий, переключение режимов камер и т.д.

05a2c6466e07423cb4cab1c19441e1ea.png

3976d76883e74dd39c5c116dff87704a.png

41b8bb0802794b62927ac27d493e3cae.png

aa0145ebdc2647d09e10bc9d4b7d8ec3.png

ff9ecbaba4f64bb08b606ce1a05fb24c.png

Также есть десктопные версии zmNinja для Linux, Windows, Mac OS X — они распространяются бесплатно. Так выглядит версия для Linux, запущенная на моём Mint 18:

951e225dcbf648b692ff07c42dd32a42.png

В общем, для всех систем интерфейс единообразен.

На этом всё, спасибо за внимание.

© Geektimes