или отправляем в Телеграм фото и видео событий с видеорегистратора NetSurveillance

IP видеорегистратор с Aliexpress
IP видеорегистратор с Aliexpress

Введение

Ещё в 2021 году для пассивной охраны загородного дома, я приобрёл и установил китайский IP видеорегистратор (NVR - Network Video Recorder). Устройство хорошо справляется с возложенной на него задачей. Из функций отправки оповещений о событиях на его борту присутствуют EMAIL/SMTP, FTP протоколы. Выполнение произвольных сценариев и механизмов, типа curl, в регистраторе не заложено, соответственно прикрутить оповещения в Telegram без костылей не представляется возможным.

Конфигурация NVR и пример сообщения на Email
Сетевые службы
Сетевые службы
Меню настроек Тревога
Меню настроек Тревога

Функция Тревога->Обнаружение лиц оповещает только через электронную почту. Довольно много приходит писем и они превращаются в SPAM. Скриншоты лиц очень низкого качества, польза данных оповещений равна нулю.

Пример оповещения на почту
Пример оповещения на почту

Дополнительное неудобство создает настройка регистратора. Если у вас нет отдельного монитора с VGA входом, как это было у меня, то настройка возможна только через браузер на компьютере и только через старый добрый Internet Explorer (не Edge). IE умеет запускать ActivX приложения, для этого нужна OS Windows. Для меня стало очевидно, что вся обертка для данной задумки будет работать в этой среде. Используем в качестве сервера старый компьютер. Заодно решим проблему с удаленным доступом - провайдер в деревне не выделяет внешние адреса.

Итак, мы открываем управление нашего видеорегистратора в браузере:

Панель управления видеорегистратором
Панель управления видеорегистратором

далее...

Собираем необходимые компоненты:

  • Очевидно, что устанавливаем Telegram на компьютер или телефон.

  • Устанавливаем FileZilla FTP server для получения файлов по протоколу FTP https://filezilla.ru/documentation/FileZilla_FTP_Server

  • Для отправки сообщений в Telegram потребуется PHP и CRON (запуск скрипта по интервалу времени), установим готовое решение Open Server Panel https://ospanel.io/download/

  • В качестве внешнего хранилища файлов изображений и видео используем Yandex.Disk https://yandex.ru/support/disk-desktop-windows/installation.html

  • Скачиваем скрипты с GitHub https://github.com/webxed/nvr-to-tg (Code>Download ZIP)

    Думаю, процесс установки первых компонентов описывать смысла нет, на Youtube достаточно видео по теме.

    Yandex.Disk выступает в качестве внешнего хранилища файлов, т.к. провайдер не выделяет внешние IP адреса.

Настройка FTP соединения на сервере и видеорегистраторе

Для получения от нашего видеорегистратора фотографий и видеофрагментов тревожных событий по протоколу FTP в установленном FileZilla FTP server создадим нового пользователя и укажем каталог для хранения файлов. В средней колонке установим флажки прав доступа на запись файлов (Files/Read, Write, Append) и каталогов (Directories/Create, List, +Subdirs).

Настройка FTP пользователя
Настройка FTP пользователя

Второй шаг - возвращаемся в браузер к настройкам видеорегистратора в меню Система -> Сетевые службы, указываем параметры соединения с нашим FTP сервером.

Настройка FTP соединение с локальным сервером
Настройка FTP соединение с локальным сервером

Для проверки корректности настроек нажимаем тест. По завершению проверки соединения появится надпись - Успех теста FTP, а в окне FileZilla увидим обращения от видеорегистратора в виде текстовых строк, которые нам необходимо сохранять в лог файлы:

Включение записи логов FileZilla
Включение записи логов FileZilla

Перейдём в раздел Logging в конфигурации сервера (иконка с шестерёнкой) FileZilla и установим флажок Enable logging file.

далее...

Настраиваем тревожное событие

Возвращаемся к настройкам регистратора, переходим в раздел Тревога и кликаем Умный движение, выбираем канал, устанавливаем флажки: Вкл, Обнаружение, FTP. Напротив Запись канала и Снимок устанавливаем номер, соответствующий нашему текущему каналу из выпадающего списка. Это необходимо для того, чтобы во время срабатывания события на данной камере на FTP сервер не закачивались файлы с других каналов, в противном случае получим много лишних файлов.

Настройка тревожного события на канале видеорегистратора
Настройка тревожного события на канале видеорегистратора

далее...

Тест детектора движения

Сохраняем настройки и бежим проверять: гуляем под камерами, машем руками, корчим рожи, разминаемся перед финальной настройкой.

Если настроили правильно, регистратор начнет лить на FTP сервер фото и видео. Видео загружается с расширением .h264, что не мешает его открывать на компе в любимом плеере, а вот в браузере через Yandex.Disk - увы, не показывает.

Размер каталога загрузки будет расти по мере срабатывания детектора движения, поэтому нужно предусмотреть достаточный объем хранилища на ПК под ваши условия.

Яндекс Диск для чего?

По сути Яндекс Диск в данной связке используется только для оперативного доступа к видеофрагментам и в роли внешнего архива. Изображения отправляются в Telegram как есть и не требуют привязки к Диску. Если же видеофайлы вам необходимы, то настраиваем диск по инструкции https://yandex.ru/support/disk-desktop-windows/reserve-copy.html

Настройка Telegram-бота

  1. Первым делом установим Open Server Panel, инструкция на сайте https://ospanel.io/docs/#ustanovka

По умолчанию он устанавливается C:\OSPanel. После установки кликаем ярлык OSPanel на рабочем столе, в трее рядом с часами, появится иконка приложения. Клик правой кнопки мыши по красному флажку открывает меню:

Клик по Папке с проектами
Клик по Папке с проектами
  1. Отрываем Папку с проектами и переходим в папку localhost

  2. Распаковываем в нее файлы из скаченного архива с GitHub https://github.com/webxed/nvr-to-tg

  3. Для настройки Telegram-бота в текстовом редакторе открываем файл filezilla_log_parser.settings (в комплекте с OSPanel доступен текстовый редактор Sublime в разделе Программы)

  4. Создаем бота в Telegram через @BotFather (https://t.me/BotFather), данный шаг расписан в куче гайдов на Хабре и Youtube

Настраиваем переменные в filezilla_log_parser.settings:

$chatID - ID нашего чата с ботом

// Use https://t.me/myidbot > /getgroupid@myidbot for Telegram groups
// https://api.telegram.org/bot[токен_бота]/getUpdates
$chatID   = '';

$botToken - приватный ключ нашего бота, полученный от @BotFather

// Take BotToken from https://t.me/BotFather
$botToken = 'xxxxxxx:xxxxxxxxxxxxxxxxxx-xxxxxxx';

$http_url - ссылка на внешний сервис хранения наших файлов

// Exteranl web-server for files (Yandex Disk, Google Drive and etc.)
// paste shared access url
$http_url = 'https://disk.yandex.ru/';

$ftp_root - путь к корневой папке FTP сервера, который мы прописали в разделе Настройки FTP-соединений

// Set full FTP path for files
$ftp_root = "C:\\Users\\user\\YandexDisk-user\\Folder";

$ftp_root_sub - подкаталог в корневой папке, он создаётся видеорегистратором

// Set unique subfolder, which set up yours video recorder
$ftp_root_sub = '/192.168.0.36_001241aa67dd/';

$ftp_user_name - имя пользователя, которое мы казали в Настройках FTP-соединения

// Set FTP user name
$ftp_user_name  = 'video';

$fz_logs_folder - путь к папке с логами FileZilla server

// Set path to FileZilla logs (setup FileZila Options / Logging - Use a different logfile each day, without size limit)
$fz_logs_folder = "C:\\Program Files (x86)\\FileZilla Server\\Logs";

$fz_log_id_file - имя файла для хранения настроек не изменяем, если нет необходимости

// script data file
$fz_log_id_file = 'filezilla_log_id.save';

Скрипт сконфигурирован!

Запуск скрипта

  1. Правой кнопкой мыши кликаем по иконке OSPanel и нажимаем Запустить

  2. После того, как флаг OSPanel перешел из красного состояния в зеленый, открываем браузер и переходим по ссылке: http://localhost/filezilla_log_parser.php

  3. Если все настройки корректные, по завершению выполнения скрипта в браузере отобразятся ответы Telegram API, а в чат Telegram прилетят изображения и ссылки на видео файлы.

Пример сообщений от бота
Пример сообщений от бота
Пример сообщений от бота

ID FTP сессии - значение для контроля корректного парсинга лога FTP сервера. Через "-" указывается время создания файла, которое можно сопоставить со временем сообщения от бота и вычислить задержку в работе.

Настройка CRON

Для регулярной работы скрипта настраиваем CRON в OSPanel > Настройки > Планировщик заданий:

Настройка планировщика заданий
Настройка планировщика заданий

Устанавливаем периодичность запуска скрипта */5 - каждые 5 минут. Строку вызова скрипта вставляем в поле Выполнить и нажимаем кнопку Добавить.

 */5 * * * * %progdir%\modules\wget\bin\wget.exe -q --no-cache http://localhost/tg_send_tempdata.php -O %progdir%\userdata\temp\tg_tempsend.txt

При проверке работы - интервал можно сократить до одной минуты */1

Проверяем в комплексе

Бежим с телефоном к камере и ловим сообщения бота в чате!

P.S.

Надеюсь, данная инструкция будет доступной для начинающих, но уверенных пользователей. Именно так я себе представил владельца загородного дома, который решил обзавестись системой видеонаблюдения для своего участка. Буду рад ответить на вопросы и внести корректировки, если потребуется.

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


  1. BlaZz1ng
    27.04.2024 13:53

    Вы сами до всего этого дошли, или где то подглядели? Выглядит интересно затея)


    1. webxed Автор
      27.04.2024 13:53
      +1

      Я старый разработчик всяких нестандартных решений )

      Технологии их , сращивание моё )


      1. alexandrtumaykin
        27.04.2024 13:53

        Первую версию аналогичной идеи делал через установку ftp сервера на линукс, и несколько воркеров на питоне: один сканировал новые файлы в каталоге сервера и закидывал пути к ним в очередь, другой воркер брал из очереди путь к файлу и отправлял в телегу.

        Спустя некоторое время решил оптимизировать. На go за 1-2 часа пишется более простое решение. Берем на гитхабе пример ftp сервера на go, на событие окончания записи файла добавляем отправку файла в tg через простой http запрос. На выходе имеем решение в виде одного исполняемого файла. Ещё можно сделать запись файлов в память, чтобы не мучить диск. В моём случае камеры пишут видео файлы с лимитом 10МБ, чтобы их можно было быстро отправить в телегу и чтобы телега их быстро открывала


        1. webxed Автор
          27.04.2024 13:53

          По поводу хранения файлов в памяти - хорошая мысль, сам стал задумываться, что при высокой частоте записи файлов SSD диск стоит пожалеть.

          Как вариант воспользоваться RAM-disk приложением для FTP каталога.

          https://habr.com/ru/companies/kingston_technology/articles/395315/

          Нужно будет добавить в скрипт опцию удаления файлов.

          Правда сильно не хочется заморачиваться с контролем свободного места на диске (


          1. alexandrtumaykin
            27.04.2024 13:53

            Не совсем понятно зачем их хранить. Если используется регистратор, то на нем и так должны быть записи. А если вместо регистратора, то задачу нужно немного иначе решать.

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

            Еще перед таким решением ставил цель, что если отключат электричество, то камеры, роутер и mini PC будут еще несколько часов работать от АКБ и я таким образом все равно быстро получу уведомления в телегу. И интернет на роутере был мобильный с небольшой скоростью


            1. kekekk
              27.04.2024 13:53

              А у вас эта же модель регистратора или какая-то другая?


              1. alexandrtumaykin
                27.04.2024 13:53

                другая модель, плюс в камерах microSD стоят.


  1. uhf
    27.04.2024 13:53
    +3

    Такие камеры (это XM) еще можно полноценно настраивать через софт VMS V2.0.1.18.T, чтобы не мучиться с IE.


  1. rostislav-zp
    27.04.2024 13:53

    Похожую задачу решил установкой xpenology (DVA1622 который с видеоаналитикой) и установкой отправки в telegram.hickvision моя камера тоже только через IE настраивается,но в эдже есть возможность открытия конкретных адресов в режиме совместимости с IE - отлично работает. github


  1. a322294525
    27.04.2024 13:53

    Вы можете закинуть свой регистратор в приложении и смотреть за этими событиями в приложении телефона без белого адреса, через китайские сервера. Настройки-система-сетевые службы вкладка cloud (приложение xmeye) впишите серийный номер из вкладки cloud


    1. webxed Автор
      27.04.2024 13:53

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


  1. OXOTHuK76
    27.04.2024 13:53
    +2

    Делал подобную задачу, но по другому. Читал rtsp поток, дальше отсылал на codeproject ai сервер для детекции объектов и номеров авто. В случае наличия объектов записываем короткое видео и отсылаем прямиком в телеграмм. Ночью из всех детектированных кадров делается саммори за день и в видео видео тоже отсылается в телегу. Мини PC на 6900hx справляется с 10 камерами "на ура".


    1. kekekk
      27.04.2024 13:53

      А вы свой проект выкладывали где-нибудь?


      1. OXOTHuK76
        27.04.2024 13:53

        Нет, не выкладыавл. Не хватает терпения вести проект, а для себя можно и тяп ляп :)

        Описывал сам проект с некоторыми ссылками на пикабу

        https://pikabu.ru/story/videonablyudenie_nablyudeniya_10606736


  1. FanatPHP
    27.04.2024 13:53

    По части корректировок, из того что увидел при беглом просмотре. Не очень понятно, что такое tg_send_tempdata.php и зачем вызывать php скрипт через wget. Я бы предложил написать просто

     */5 * * * * php /путь/к/filezilla_log_parser.php > %progdir%\userdata\temp\tg_tempsend.txt  

    и тогда будет не нужно будет тащить на винду ни веб-сервер, ни wget.

    Так же я бы убрал собачку перед вызовом file(). И опять же, непонятно, зачем TGapi extends MyCURL. Эти классы совершенно никак между собой не связаны, и если заменить parent:: на MyCURL, то в их взаимодействии ничего не изменится.


  1. PaulZi
    27.04.2024 13:53

    Я делал ровно тоже самое, только php и ftp - все крутится на роутере keenetic)


  1. Pavel7
    27.04.2024 13:53
    +1

    Из готовых решений для этой задачи можно отметить:

    1. OpenIPC поддерживает много разных китайских плат и, из коробки, умеет слать в telegram - даже регистратор не нужен.

    2. Frigate NVR c Google Coral/OpenVINO/NVidia TensorRT + Home Assistant - и вот у вас уже софтварный видеорегистратор не ограниченный ничем по своему функционалу и работающий с любыми камерами, которые умеют RTSP


  1. riferma1988
    27.04.2024 13:53

    как вы к этому пришли, весьма интересно


  1. fouriki
    27.04.2024 13:53
    +1

    Оверинжениринг.

    1. Эти реги настраиваются через приложение cms, через него можно даже ИП поменять, если другая подсесть

    2. Эти реги умеют в ртсп. Мне когда то надо было сделать таймлапс с такой камеры, сделал на Линукс машинке через ffmpeg, чтобы дергало кадры

      активикс эт чёт прям перебор


  1. Wesha
    27.04.2024 13:53

    через Telegram

    И снова:
    Неужели взвести свой экземпляр apache так сложно?..
    Неужели взвести свой экземпляр apache так сложно?..


  1. UksusoFF
    27.04.2024 13:53

    У меня похожая реализация, только на Raspberry PI - там крутиться Home Assistant.
    Регистратор выгружает файлы по ФТП на HA, у HA есть плагин который мониторит директории на изменения и через свои механизмы отправляет файлы в телеграм.


  1. Teemon
    27.04.2024 13:53

    Как насчёт движения снега/ дождя/ листьев а кадре и спама с картинками? Знакомый говорит ложные сработки задолбали


    1. Jasik
      27.04.2024 13:53

      Есть с камеры с функционалом детекции человека