или отправляем в Телеграм фото и видео событий с видеорегистратора NetSurveillance
Введение
Ещё в 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, а в окне FileZilla увидим обращения от видеорегистратора в виде текстовых строк, которые нам необходимо сохранять в лог файлы:
Перейдём в раздел Logging в конфигурации сервера (иконка с шестерёнкой) FileZilla и установим флажок Enable logging file.
далее...
Настраиваем тревожное событие
Возвращаемся к настройкам регистратора, переходим в раздел Тревога и кликаем Умный движение, выбираем канал, устанавливаем флажки: Вкл, Обнаружение, FTP. Напротив Запись канала и Снимок устанавливаем номер, соответствующий нашему текущему каналу из выпадающего списка. Это необходимо для того, чтобы во время срабатывания события на данной камере на FTP сервер не закачивались файлы с других каналов, в противном случае получим много лишних файлов.
далее...
Тест детектора движения
Сохраняем настройки и бежим проверять: гуляем под камерами, машем руками, корчим рожи, разминаемся перед финальной настройкой.
Если настроили правильно, регистратор начнет лить на FTP сервер фото и видео. Видео загружается с расширением .h264, что не мешает его открывать на компе в любимом плеере, а вот в браузере через Yandex.Disk - увы, не показывает.
Размер каталога загрузки будет расти по мере срабатывания детектора движения, поэтому нужно предусмотреть достаточный объем хранилища на ПК под ваши условия.
Яндекс Диск для чего?
По сути Яндекс Диск в данной связке используется только для оперативного доступа к видеофрагментам и в роли внешнего архива. Изображения отправляются в Telegram как есть и не требуют привязки к Диску. Если же видеофайлы вам необходимы, то настраиваем диск по инструкции https://yandex.ru/support/disk-desktop-windows/reserve-copy.html
Настройка Telegram-бота
Первым делом установим Open Server Panel, инструкция на сайте https://ospanel.io/docs/#ustanovka
По умолчанию он устанавливается C:\OSPanel. После установки кликаем ярлык OSPanel на рабочем столе, в трее рядом с часами, появится иконка приложения. Клик правой кнопки мыши по красному флажку открывает меню:
Отрываем Папку с проектами и переходим в папку localhost
Распаковываем в нее файлы из скаченного архива с GitHub https://github.com/webxed/nvr-to-tg
Для настройки Telegram-бота в текстовом редакторе открываем файл filezilla_log_parser.settings (в комплекте с OSPanel доступен текстовый редактор Sublime в разделе Программы)
Создаем бота в 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';
Скрипт сконфигурирован!
Запуск скрипта
Правой кнопкой мыши кликаем по иконке OSPanel и нажимаем Запустить
После того, как флаг OSPanel перешел из красного состояния в зеленый, открываем браузер и переходим по ссылке: http://localhost/filezilla_log_parser.php
Если все настройки корректные, по завершению выполнения скрипта в браузере отобразятся ответы 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)
uhf
27.04.2024 13:53+3Такие камеры (это XM) еще можно полноценно настраивать через софт VMS V2.0.1.18.T, чтобы не мучиться с IE.
rostislav-zp
27.04.2024 13:53Похожую задачу решил установкой xpenology (DVA1622 который с видеоаналитикой) и установкой отправки в telegram.hickvision моя камера тоже только через IE настраивается,но в эдже есть возможность открытия конкретных адресов в режиме совместимости с IE - отлично работает. github
a322294525
27.04.2024 13:53Вы можете закинуть свой регистратор в приложении и смотреть за этими событиями в приложении телефона без белого адреса, через китайские сервера. Настройки-система-сетевые службы вкладка cloud (приложение xmeye) впишите серийный номер из вкладки cloud
webxed Автор
27.04.2024 13:53Приложения - отличная подмога в просмотре архива камер, но наблюдать за событиями в TG удобней, чем крутить временную ленту.
OXOTHuK76
27.04.2024 13:53+2Делал подобную задачу, но по другому. Читал rtsp поток, дальше отсылал на codeproject ai сервер для детекции объектов и номеров авто. В случае наличия объектов записываем короткое видео и отсылаем прямиком в телеграмм. Ночью из всех детектированных кадров делается саммори за день и в видео видео тоже отсылается в телегу. Мини PC на 6900hx справляется с 10 камерами "на ура".
kekekk
27.04.2024 13:53А вы свой проект выкладывали где-нибудь?
OXOTHuK76
27.04.2024 13:53Нет, не выкладыавл. Не хватает терпения вести проект, а для себя можно и тяп ляп :)
Описывал сам проект с некоторыми ссылками на пикабу
https://pikabu.ru/story/videonablyudenie_nablyudeniya_10606736
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, то в их взаимодействии ничего не изменится.
PaulZi
27.04.2024 13:53Я делал ровно тоже самое, только php и ftp - все крутится на роутере keenetic)
Pavel7
27.04.2024 13:53+1Из готовых решений для этой задачи можно отметить:
OpenIPC поддерживает много разных китайских плат и, из коробки, умеет слать в telegram - даже регистратор не нужен.
Frigate NVR c Google Coral/OpenVINO/NVidia TensorRT + Home Assistant - и вот у вас уже софтварный видеорегистратор не ограниченный ничем по своему функционалу и работающий с любыми камерами, которые умеют RTSP
fouriki
27.04.2024 13:53+1Оверинжениринг.
Эти реги настраиваются через приложение cms, через него можно даже ИП поменять, если другая подсесть
-
Эти реги умеют в ртсп. Мне когда то надо было сделать таймлапс с такой камеры, сделал на Линукс машинке через ffmpeg, чтобы дергало кадры
активикс эт чёт прям перебор
UksusoFF
27.04.2024 13:53У меня похожая реализация, только на Raspberry PI - там крутиться Home Assistant.
Регистратор выгружает файлы по ФТП на HA, у HA есть плагин который мониторит директории на изменения и через свои механизмы отправляет файлы в телеграм.
BlaZz1ng
Вы сами до всего этого дошли, или где то подглядели? Выглядит интересно затея)
webxed Автор
Я старый разработчик всяких нестандартных решений )
Технологии их , сращивание моё )
alexandrtumaykin
Первую версию аналогичной идеи делал через установку ftp сервера на линукс, и несколько воркеров на питоне: один сканировал новые файлы в каталоге сервера и закидывал пути к ним в очередь, другой воркер брал из очереди путь к файлу и отправлял в телегу.
Спустя некоторое время решил оптимизировать. На go за 1-2 часа пишется более простое решение. Берем на гитхабе пример ftp сервера на go, на событие окончания записи файла добавляем отправку файла в tg через простой http запрос. На выходе имеем решение в виде одного исполняемого файла. Ещё можно сделать запись файлов в память, чтобы не мучить диск. В моём случае камеры пишут видео файлы с лимитом 10МБ, чтобы их можно было быстро отправить в телегу и чтобы телега их быстро открывала
webxed Автор
По поводу хранения файлов в памяти - хорошая мысль, сам стал задумываться, что при высокой частоте записи файлов SSD диск стоит пожалеть.
Как вариант воспользоваться RAM-disk приложением для FTP каталога.
https://habr.com/ru/companies/kingston_technology/articles/395315/
Нужно будет добавить в скрипт опцию удаления файлов.
Правда сильно не хочется заморачиваться с контролем свободного места на диске (
alexandrtumaykin
Не совсем понятно зачем их хранить. Если используется регистратор, то на нем и так должны быть записи. А если вместо регистратора, то задачу нужно немного иначе решать.
У меня удаление происходит сразу после отправки в телеграм. С размером видео до 10МБ в телеге еще и превью показывается, поэтому удобно полистать и смотреть только те видео, которые заинтересовали. Пробовал делать размер файла больше, превью в телеге уже не работали. Нужно было загружать каждое видео, чтобы понять что там
Еще перед таким решением ставил цель, что если отключат электричество, то камеры, роутер и mini PC будут еще несколько часов работать от АКБ и я таким образом все равно быстро получу уведомления в телегу. И интернет на роутере был мобильный с небольшой скоростью
kekekk
А у вас эта же модель регистратора или какая-то другая?
alexandrtumaykin
другая модель, плюс в камерах microSD стоят.