В данной статье мы рассмотрим основные принципы работы telegram-бота для видеонаблюдения.



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


Железо


В отличие от подхода автора указанной статьи, я целенаправленно закупал необходимое оборудование для организации видеонаблюдения в квартире с целью дополнительной безопасности. Я купил IP-камеру которая умела следить за движением в кадре, складывать в папку на ftp и даже отправлять на email. Но всё это было, во-первых, неудобно, во-вторых, в прошивке была ошибка, что отправка на e-mail не работала должным образом, ну и, наконец, было много ложных срабатываний. Поэтому, решено было написать telegram-бота, как самый удобный способ для оповещения и управления наблюдением.


Итак, из железа у меня — камера фирмы IPEYE, которая умеет брать питания через сеть (POE), POЕ-инжектор, небольшой сервачок на Ubuntu Server, интернет с резервированием через USB-модем, ну и UPS для поддержки питания всей системы.


Определяем открытие двери


У меня всего одна камера, направленная на входную дверь. В идеале, мне хотелось, чтобы я получал изображение входящего в эту дверь человека. Сначала я пробовал настроить детекцию движения силами самой камеры:




Но к сожалению, как я ни крутил ползунки, камера в полумраке сходила с ума и начинала постоянно оповещать о движении в кадре при переходе из дневного в ночной режим и наоборот. Можно было, конечно, поднять motion, он следит за движением в кадре гораздо аккуратнее. Но мне не хотелось поднимать дополнительный сервис, поэтому я решил оставить стандартную возможность камеры складывать изображения на ftp, и проверять на ложность срабатывания уже своими силами.

Для этого я написал простенький демон на php, который следит за папкой на предмет появления новых изображений, открывает их и анализирует разницу в освещённости заранее выбранных областей, примерно так (области специально выбраны выше, чтобы человек случайно не закрывал области):




Если разница превышает экспериментально подобранный порог, значит дверь действительно открыта.

Настраиваем бота


Итак, наш демон определил, что движение в кадре есть и дверь открыта. Дальше надо отправить это изображение в чат telegram. Для этого нам надо зарегистрировать нового бота через BotFather и получить API-ключ. Для взаимодействия с API Telegram я использовал библиотеку longman/telegram-bot. Телеграм предоставляет два способа получения новых сообщений long-polling и веб-хук. Второй способ мне показался предпочтительнее, но для его работы потребуется статичный URL с SSL-сертификатом. Для этого используем letsencrypt или самоподписанный сертификат который надо отправить BotFather. Подробнее о регистрации ботов можно почитать в документации телеграма.


Анализ wi-fi клиентов


Когда получаешь много сообщений, начинаешь их просто игнорировать, поэтому необходима была некая автоматизация, чтобы оповещения отправлялись только тогда, когда никого нет дома. Сделать это можно очень просто, достаточно просканировать сеть на наличие в ней определённых wi-fi клиентов. Для этого надо установить arp-scan (sudo apt-get install arp-scan), тогда определить что клиент с необходимым мак-адресом подключён можно так:


$output = exec("arp-scan -q --retry=1 --timeout=500 --numeric --destaddr={$mac} {$ip} | grep -oP --color=never \"{$mac}\"");
$result = $output === $mac;

Здесь я специально указываю конкретный ip-адрес, чтобы не сканировать всю сеть. Но для этого надо зафиксировать в DHCP ip-шник для этого MAC-адреса. Но, в принципе, указывать ip необязательно.



Запись видео


Фотографии это, конечно, хорошо. Но лучше всего покажет входящего человека — видео. Т. к. видео у нас никуда не пишется, "раздобыть" его можно только записав поток. К счаcтью, моя камера предоставляет несколько rtsp потоков закодированных в h264. Чтобы отправить видео, надо записать поток, и отправить его как файл. Для этого воспользуемся avconv (форк ffmpeg в Ubuntu):


$ffmpeg = "avconv -rtsp_transport tcp -i rtsp://user:password@192.168.1.10/1/h264major -t 10 -an -vcodec copy {$file}";
$mv     = "mv {$file} {$out}";
passthru("nohup sh -c '{$ffmpeg} && {$mv}' > /dev/null 2>&1 &");

Здесь я пишу видео в фоне, после чего перемещаю его в папку для слежения. Демон подхватит новый файл и отправит его как видео. Т. к. звука в видео у меня нет, Telegram автоматически конвертирует его в gif на desktop-клиенте, что очень удобно.


Автоподнятие демона


Демон написан на php, и хотя он может работать месяцами, от ошибок никто не застрахован. Поэтому, хорошо бы следить, что демон не завершил процесс. Можно, было бы, конечно, настроить supervisor, но я решил сделать просто автоподнятие по cron-у. Если процесс жив, демон повторно не запускается:


passthru("ps -p $pid > /dev/null", $result);
return !$result;

Заключение


Благодаря всем проделанным действиям, бот оповещает меня о входящем человеке двумя фотографиями и пятисекундным видео. Как бонус, бот также может оповещать о времени ухода и прихода определённых wi-fi клиентов, и находятся ли они сейчас дома.


С результатом вы можете ознакомиться на github.

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


  1. little-brother
    01.12.2017 04:19

    Если чат-бот крутится на что-то подобном Raspberry Pi, имеющем GPIO, то можно было бы добавить PIR-датчик и датчик открытия двери, и писать видео по их срабатыванию. Мне кажется это более надежным, чем обработка видео-потока.


  1. akass
    01.12.2017 08:41

    Telegram автоматически конвертирует его в gif на desktop-клиенте, что очень удобно.

    А на остальных клиентах?
    Идея отдавать rtsp в telegram весьма интересна.


  1. rmrelativity
    01.12.2017 12:53

    Бедная жена. Любовника фиг приведешь уже


    1. DracoWF
      01.12.2017 17:20

      Так телефон жены приконнектится к вай-фаю ещё до открытия двери и система не будет ничего слать, разве не так? =)


      1. AntonioKharchenko
        01.12.2017 22:47

        Только жене не говорите


        1. DracoWF
          01.12.2017 23:11

          Хорошо =) Только чьей?
          Можно изменить концепцию — чинать запись «видео» сразу при обнаружении устройства…
          Но это шутки всё — всем крепких семей ;)


  1. Mixalych
    01.12.2017 15:05

    отправлялись только тогда, когда никого нет дома. Сделать это можно очень просто, достаточно просканировать сеть на наличие в ней определённых wi-fi клиентов.


    Отличная идея, кстати.

    Сталкивался с подобной задачей: как-то было решение у оператора Б. и М., которое по ммс отсылало информацию на номер. Но вот проекты они прикрыли (я тогда об этом не знал). Поиски в нашем городе альтернатив не дали, ждать времени не было. Сразу возникла мысль малинка+веб-камера(поиграться с ИК диодами тоже можно было бы)+приемник 433 МГц, китайский беспроводной датчик двери на той же частоте и отправка в телеграмм по срабатыванию датчика. Аля своего рода альтернативная версия ip-камеры, да и потом — поле для расширения большое, там таких 20 надо. А если учесть, что проводов вообще можно не тащить (питание к распбери от китайской зарядки, вафля — usb-свисток). Но ждать тоже приходилось бы из Китая малинку. В итоги с клиентом пришли к решению отправки на e-mail с какой-то нонейм камеры, которая была в наличии в России. А так интересный был бы проект, дополнительно переезд в новый город не дали ему свершиться. Но мысль не дает покоя, можно же в свободное время поиграться и на новом месте для себя.

    И по цене: камера с возможностью детектирования и отправки по ммс — от 7 к. руб., в наличии в стране нет, внешне — «моноблок», размером чуть больший, чем коробка спичек, камера — отстой, вариант от опсосов (жаль, что прикрыли, на предыдущей работе приходилось с ними играться — вполне сносное решение за меньшие деньги — ~6000, так в комлекте датчик движения, открытия двери, пульт, сирена и пр. Точно уже не помню, в инете комплектацию можно посмотреть, но она достаточная для такой цены). Китайские решения дешевле гораздо, но пробема у них такая же, как и у всех предыдущих вариантов — нет возможности залезть внутрь (изменить прошивку или алгоритм действия). Был проект — агрегировать с таких сигналок инфу по смс на номер (федеральный входящий), так вот — факт события определялся (да простят меня боги) по тексту сообщения. А теперь представьте зоопарк сигналок, помноженный на кол-во смс. Уже тогда были закуплены малинки и привязаны к ним датчики от китайских сигналок (Б. не исключение — у них этот экспериментальный проект был), и появлялось для связи три канала — gps, lan и wi-fi, причем все три могут быть от разных операторов, и по-сути, дублировать друг друга. Все это можно управлять и мониторить с приложения, реакцию на тревогу передавать в ближайший пункт охраны и т. д. Эх, аж с грустью вспоминаешь… Ладно, на этом все, а то коммент получится больше статьи.