Введение


Доброго времени суток.

Имея в наличии домашний 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
           L-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:



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

На этом всё, спасибо за внимание.
Поделиться с друзьями
-->

Комментарии (40)


  1. wayf1nder
    13.07.2016 12:30

    Когда-то пользовался Zoneminder'ом. Вначале работает хорошо, но со временем по непонятным причинам начинает тормозить все сильнее до полного отказа. Помогает очистка базы MySQL и видеоархива. Надеюсь, в свежих версиях проблема решена.


  1. memtew
    13.07.2016 12:40

    Я для для домашнего видеонаблюдения использую самосборный пк с ОС от nas synology. Работает без нареканий уже год.


    1. KDorokhov
      13.07.2016 14:58

      Сам сейчас решаю вопрос с регистратором. Сейчас работает на оригинальном синолоджи, но аналитика так себе. DSM 4
      В стороннем ПО побогаче будет — пересечение линии, распознавание лица.


    1. MAXXL
      13.07.2016 19:53

      У них же вроде только одна камера подключается бесплатно, а за остальные нужно доплачивать?


      1. memtew
        14.07.2016 00:08

        1 или 2 камеры бесплатно, зависит от модели. Большее число можно получить просто отредактировав 1 файл в hex редакторе.


  1. webhamster
    13.07.2016 13:16

    Ну как там, в новом Zoneminder появился таймлайн с графиком активности перед камерой?


    1. kvaps
      13.07.2016 18:44

      График есть, но управление им дико нелогичное. Приходится мириться, т.к. без него никуда.
      Правда, со временем привыкаешь.


  1. PaulZi
    13.07.2016 13:44

    sanrega, а вы какие-нибудь другие приложения использовали, кроме ZoneMinder, motion например? Буквально в ближайшие дни буду тоже заниматься настройкой это добра, хотелось бы советов от опытных людей.


    1. aleyer
      13.07.2016 15:16
      +1

      Когда мне нужно было настроить видеонаблюдение в нескольких помещениях, искал человеческий в плане работы, настройки и интерфейса проигрывателя вариант. Zoneminder под эти критерии, на мой взгляд, не подпадает. Остановился на бесплатном Ivideon без подключения к их облаку, работает с 2013 года без вмешательств, пишет по детектору, смотреть видео удобно, разве что, если правильно помню, для мобильных устройств приложение работает только с облаком. Даже частичный выход из строя одного диска в lvm-массиве из 3 дисков на 3ТБ не помешали вручную удалить часть видеозаписей, перенести все на один рабочий диск, вручную поправить SQLite базу, убрав оттуда упоминания удаленных записей и перенести все это потом на рабочий массив.
      Собственно, благодаря наличию блога на хабре, о них и узнал.


      1. silverjoe
        13.07.2016 16:49

        Мобильное приложение вполне себе работает без подключения тарифов — онлайн просмотр камер и локального архива, без облачного архива.


    1. buggykey
      13.07.2016 15:20
      +2

      У меня дома motion на древнющем компе с процом AMD Athlon 900 МГц и памятью DDR-1 512 МБ крутится круглосуточно уже почти год. Удобно, что можно обвешать собственными скриптами. Стабильно, как утюг. Не падало ни разу.


    1. nikolaynnov
      14.07.2016 02:15
      +1

      Вот здесь я своим опытом делился по настройке SecurOS.


    1. Vadimner
      15.07.2016 15:31
      +1

      Около двух лет назад организовал виденоаблюдение за своим двором (с тех пор как начал ставить там машину) с помощью Ubuntu 14.04 и motion, работает без нареканий. Настроилось все лекго и быстро хотя на тот момент опыта работы с Линкусом было чуть больше нуля.


    1. sanrega
      21.07.2016 09:22

      Использовал Xeoma. В общем и целом очень удобная система, хоть и не opensource и с ограничениями при использовании бесплатной лицензии, для полноценного использования в формате клиент-сервер нужна коммерческая лицензия, которая рассчитывается из количества камер. Но мне не понравились некоторые моменты, из-за которых я отказался от этого продукта.


  1. SchmeL
    13.07.2016 14:02

    Да, настройка ZM тот еще праздник. А вот от телефона в качестве камер пришлось к сожалению отказаться, так как при постоянном подключении зарядного устройства, через пару месяцев батареи сдохли — на 2х аппаратах вздулись, а на других просто не включались.


    1. sanrega
      21.07.2016 09:42

      Согласен, именно поэтому ко мне едут IP-камеры. Телефон использовался только для настройки и тестирования.


  1. SamoilowAlex
    13.07.2016 14:24

    Преобразование набора изображений(а именно так zabbix хранит видео с камер) в полноценные видео файлы каким образом решали? Или не решали?


    1. sanrega
      21.07.2016 09:38

      В режиме просмотра событий через браузер есть штатная функция экспорта в видеофайл.


      1. SamoilowAlex
        21.07.2016 11:54

        Тьфу, во первых извеняюсь что перепутал zabbix и zonemonder, только заметил.

        А если надо хранить видео с 20 камер несколько месяцев, очень быстро закончатся inod'ы и в целом тупить будет от большого числа мелких файлов. Имеет смысл все что старше недели переводить в видео(например по 12 часов длинной) и отправлять в бекап. Когда о решал данную проблему через ffmpeg, но он не умеет regexp и группу файлов надо указывать через некий fprint, вот было бы интересно иные варианты решения почитать.


        1. sanrega
          21.07.2016 13:44

          Никак не могу прокомментировать практическую реализацию по этим требованиям, т.к. не было задач хранения больших объёмов архивной видеоинформации. ZM, собственно, через ffmpeg преобразует jpeg в видео, настройках. В Options -> Images -> Path to (optional) ffmpeg mpeg encoder у меня указан /usr/bin/ffmpeg, а также в Formats to allow for ffmpeg video generation указано mp4, только вот не помню на каком этапе настройки я его туда прописывал, но точно помню что это делал я сам, а не было предустановлено.

          Если бы у меня возникла задача, подобная вашей, я бы копал в сторону настройки Filters, ну и, возможно, где-то понадобится вручную скрипт прикрутить. Но, может быть, и по другому можно решить. У меня такой задачи нет, т.к. всего лишь маленькая домашняя система видеонаблюдения =)


  1. miron36357
    13.07.2016 14:25
    +1

    Я никак не могу написать на хабре про собственную поделку, созданную как раз из-за убогости Zoneminder.

    Это кому же в голову пришло сохранять архив в куче JEPG?
    Камеры стримят в удобнейшем H264, сказка же, берем и кладем в контейнер. И нагрузка на процессор минимальна. А если, допустим, на сервере идет запись с 1080P камер?

    У меня ZM на ВМ с одним ядром Xeon E5345 не справилась даже с двумя потоками. При том что самопис-обертка над ffmpeg загружает ядро на 2% на одну камеру.


    1. Stronix
      13.07.2016 15:21
      +1

      С удовольствием ознакомился бы.


    1. rstepanov
      13.07.2016 15:29

      А у вас анализ движения в кадре то есть?


      1. miron36357
        14.07.2016 00:41

        Неа, руки не дойдут написать, но если можете, с радостью отправляйте пулл реквест :)
        https://github.com/mironoff111/PartCCTV


        1. rstepanov
          14.07.2016 10:19

          Несколько лет назад ковырял motion, там это одной функцией было сделано, не особо сложно. Другое дело, что для этого сначала делается декомпрессия кадра и сравнение с предыдущим, в результате использование процессора быстро вернется к показателям ZM, если только не сумеете оптимизировать за счет какого нибудь расширенного набора инструкций процессора…


          1. miron36357
            14.07.2016 15:25

            В современных айпи камерах обычно по 2 потока, можно обернуть motion так, чтобы ему посылать легкий стрим, но да, тут уже близко к ZM по нагрузке будет. Далее, помню, в большинстве нормальных камерах (Axis, Hikvision) детектор движения встроенный, вроде бы по ONVIF работает. Только этот ONVIF такооой сложный, но если разобраться, то всё можно. Еще можно копать в сторону аппаратного декодирования, но это фишка будет требовать видеокарты в сервере записи.

            P.S. Я в PartCCTV обходил стороной запись по движению, просто необходимости не было. Есть двухтерабайтник, так его на 30 дней непрерывной записи хватает.

            В любом случае, буду рад пулл реквестам. Вместе мы спасем мир :)


    1. lopatoid
      13.07.2016 17:09

      Zoneminder хорош для аналоговых камер, которые не стримят в удобнейшем H264.


      1. k0ldbl00d
        14.07.2016 07:32

        А аналоговые камеры куда потом подключаются? Правильно — к плате захвата, которая оцифровывает потоки и, в большинстве случаев, даёт на выходе всё тот же h264 (или MPEG2, если плата очень старая).


  1. Urshulyak
    13.07.2016 16:53

    Использую дома настройку над Motion — Ccrisan/Motioneye:
    4 камери, 3 usb (2usb orangepi + 1usb raspberry pi2), 1 IP camera

    Работает в Docker контейнере на виртуалке (KVM),
    По ресурсах — объективно где-то 15% CPU от i5 6600.


    1. SchmeL
      13.07.2016 17:30

      Пробовал как-то, но огорчает то, что motion не умеет забирать поток по rtsp.


      1. Urshulyak
        14.07.2016 08:42

        У меня IP камера работает через rtsp://xxx.xxx.xxx.xxx:554/11.
        Версия программы: 0.31.3


  1. kvaps
    13.07.2016 18:41

    Есть еще один интересный проект: MJPG-streamer
    Если есть необходимость подключить удаленую камеру без мозгов, можно экспортировать ее поток в mjpeg и подключить в zoneminder.


  1. edgi
    13.07.2016 21:55

    Есть вот такой открытый проект. github.com/kerberos-io/machinery
    Можно подключать несколько ip камер. по возможностям уступает конечно zoneminder


    1. KonstantinSpb
      13.07.2016 22:48

      Да, но парни проект потихоньку развивают.


  1. AVictor
    14.07.2016 11:49

    Если нужно подключить до 4-х камер, то есть приложения намного лучше. Мне очень нравится Avreg. Устанавливается из репов, удобен в настройке, ip-камеры по протоколу onvif определяет автоматически. Есть еще программа XEOMA (она кстати тоже от отечественного разработчика).


  1. lolipop
    14.07.2016 12:34

    Что люди не придумывают, лишь бы не ставить локальный(локальный!!! если не хочется облака от ивидеона — можно без него) ivideon-сервер. и это не реклама, эта штука реально работает из коробки, с любыми камерами, что usb, что ip, идеально работает определение движения в кадре, для транляции через облако — две камеры бесплатно. локальных камер(с видеоархивом, можно настроить запись только движения в архив) можно хоть 100 повесить.
    да, не опенсорс, ну, можно и пережить. я просто в виртуалке его кручу для собственного спокойствия.


    1. Strange
      14.07.2016 14:19

      Please note that Ivideon Server for Linux is intended to be run in a graphical desktop environment. The current version doesn’t support configuration over a LAN yet, though we’ll certainly add this feature in the future—keep an eye out for updates.

      Радует, что планируют фиксить.


      1. lolipop
        14.07.2016 14:38

        форвард иксов не так уж и сложно настроить. один раз настроил через гуй, дальше запуск безголовый(headless).


    1. KonstantinSpb
      14.07.2016 14:46

      И работает на не х86 платформах? Т.е. на Raspberry подобных? На сайте пишут, что пока только для х86, и нафига такое чудо нужно.


    1. dkv
      14.07.2016 17:53

      И этот распиаренный ivideon до сих пор не умеет работать с onvif (и не предполагает уметь, как ответили они мне на форуме), в связи с чем детект движения делается через декомпрессию кадра с соответствующей нагрузкой на систему.