Введение

В данной статье хотелось бы поделиться одним простым и доступным способом как мне удалось организовать видеонаблюдение за подъездом при помощи малинки и бытовой веб камеры. Думаю, у многих нынче в закромах завалялись уже не нужные вебки. Сужу по себе, раньше, в эпоху преобладания десктопов такая камера была вещью весьма необходимой для желающих показать себя собеседнику, а то и миру. Однако время идет, десктопы все больше заменяются ноутбуками, планшетами и телефонами, имеющими на борту свою камеру. Но зачем же добру лежать без дела?

История этого проекта началась с покупки Raspberry 3b+. После получения и первичной настройки сего чудо-девайса встал нетривиальный вопрос: "Хорошо, ну а дальше то что?". Ведь покупал я ее не с конкретной целью - а скорее как катализатор погружения в волшебный мир компьютерных технологий. Забегая вперед, скажу, что план оказался отличным и работает по сей день).

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

Итак на выходе мы получаем:

  1. Видеонаблюдение за подъездом/двором, да чем угодно)

  2. При обнаружении движения в поле зрения камеры включается запись видео с дальнейшей автоматической пересылкой его в Telegram

  3. Возможность просмотра картинки камеры в реальном времени в любой точке мира, где есть интерент

  4. Опыт в общении с linux, хоть и не большой, но идеальный для первого знакомства, кроме того подкрепленный полезным и реально работающим сервисом, созданным своими руками :)

Итак, приступим.

Предварительная настройка

Первоначальную настройку Raspberry Pi, заключающуюся в установке ОС и подключению к сети описывать пожалуй не стану, так как в сети достаточно туториалов по этой процедуре.

Я использую в качестве ОС Raspbian GNU/Linux 10 (buster), соответсвенно данный туториал будет гарантированно работать для данной версии ОС, однако, думаю и на других дистрибутивах на основе Debian все будет в порядке.

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

sudo v4l2-ctl --list-formats

Результат
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
        [1]: 'MJPG' (Motion-JPEG, compressed)

Камеры других моделей и производителей не проверял, но предполагаю, что аналогично заведется любая с протоколом Universal Plug and Play (UPnP) .

Для управления нашим серевером видеонаблюдения будем использовать пакет Motion — программа, которая отслеживает видеосигнал с одной или нескольких камер и способна определить, изменилась ли значительная часть изображения. Или, другими словами может обнаруживать движение. В случае обнаружения есть масса настроек что делать дальше. Можно сделать фото или записать видео, сохранить его на диск (для Raspberry скорее всего SD карту), а далее, с помощью команд, указываемых в файле конфигурации проделать с полученным контентом практически все, что угодно. Также Motion содержит в себе возможность поднятия стрима с камеры, то-есть появляется возможность наблюдения за происходящим в поле зрения камеры удаленно. Вообще, конфигурационный файл Motion позволяет производить весьма шаирокую настройку. Среди прочего можно задавать параметры изображения (яркость, контрастность и т.д.), парметры обнаружения движения (также присутствут возможность указания зоны, где обнаружение производиться не будет), параметры фотографий и видео, включая формат итогового видео, его битрейт, кодек, которым оно кодируется. Далее следуют настройки стриминга видео, действия, выполняемые на этапах с момента обнаружения движения до сохранения файла с записью, специфические настройки для моторизированных камер, на них я подробно останавливаться не буду, так как в файле конфига содержаться вполне исчерпывающие комментарии по каждой опции на английском языке.

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

Установка и настройка Motion

Для установки Motion пользуемся стандартным паттерном

sudo apt-get install motion

После установки в директории /etc/motion появляется файл motion.conf, который и является главным конфигурационным файлом. Его мы и будем сейчас редактировать

sudo nano /etc/motion/motion.conf

Вносим изменения в следующие строки:

# Включаем опцию, которая понадобиться для автозагрузки Motion при включении или перезагрузке
start_motion_daemon=yes
# Выставляем максимальное разрешение, которая поддерживает камера. 
width 1280
height 720
# Указываем частоту смены кадров. 
framerate 10
# Указываем количество пикселей, смена состояния которых активирует датчик движения
threshold 1000
# Значение ниже указывает на минимальное количество кадров, 
# при котором делается вывод о наличие движения
minimum_motion_frames 3
# Значение, указывающее максимальное количество кадров, при отсутвтии изменений 
# на которых делается вывод о прекращении движения
event_gap 10
# Указываем максимальную продолжительность одного видеофайла, по истечении которой 
# при продолжении движения создается следующий видеофайл
max_movie_time 20
# Если фотографии не нужны - отключаем их
output_pictures off
# Прописываем параметры видеофайлов. Подробно расписывать каждый не буду, скажу только,
# что, это оптимальный набор для возможности загрузки в Telegram и проигрывания в нем
ffmpeg_output_movies on
ffmpeg_output_debug_movies off
ffmpeg_timelapse 0
ffmpeg_bps 400000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mp4
ffmpeg_duplicate_frames true
# Выделять движущийся объект на видео
locate_motion_mode on
# Стиль выделения: красный квадрат. По подсказкам в конфиге можно выбрать другой цвет или фигуру
locate_motion_style redbox
# Указываем директорию, куда motion будет складывать отснятое. Директорию по умолчанию, 
# где лежат конфиги указывать не рекомендую в связи с необходимостью автоудаленя старых 
# видео (про это будет дальше)
target_dir /var/lib/motion
# Далее следуют настройки потоковой передачи видео. Порт не обязательно 90, желательно нестандартный
stream_port 90 
stream_quality 100
stream_maxrate 20
stream_localhost off
stream_limit 0
# Требовать авторизацию для доступа к потоку вещания (если не требуется указываем 0)
stream_auth_method 1
stream_authentication login:password
# Указываем, что сделать с видео (послать в Telegram, указывая эту строку я немного 
# забегаю вперед для того, чтобы вам не пришлось повторно возвращаться в этот файл)
on_movie_end /usr/local/bin/tg_video.sh Username %f

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Собственно, на этом настройка Motion завершена.

Теперь внесем некоторые дополнительные настройки, необходимые для корректной работы.

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

Запускам настройку планировщика событий crone:

sudo crontab -e

Добавляем в него следующую строку (Если нужно удалять файлы старше более двух дней меняем цифру после mtime соответственно на +2 и т.д.):

0 1 * * * find /var/lib/motion -mtime +1 -exec rm {} ;

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Пришло время установить и настроить Telegram

Установка и настройка Telegram

Для наших целей будем использовать консольную версию телеграм - Telegram CLI.

Для начала

Обновляем пакеты, и устанавливаем необходимые для работы Telegram CLI:

sudo apt update

sudo apt upgrade

sudo apt install -y libreadline-dev libconfig-dev libssl-dev sudo apt install -y lua5.2 liblua5.2-dev

sudo apt install -y libevent-dev libjansson-dev libpython-dev libssl1.0-dev

make git

Скачиваем Telegram CLI

cd ~

git clone --recursive https://github.com/kenorb-contrib/tg.git

Чтобы заставить CLI Telegram скомпилироваться на Raspberry Pi, нам сначала нужно изменить один из файлов исходного кода:

nano ~/tg/tgl/mtproto-utils.c

Нажимаем CTRL + W для поиска, затем вводим BN2ull и жмем ENTER. Попадаем к следующему блоку кода:

static unsigned long long BN2ull (TGLC_bn *b) {
  if (sizeof (unsigned long) == 8) {
    return TGLC_bn_get_word (b);
  } else if (sizeof (unsigned long long) == 8) {
    assert (0); // As long as nobody ever uses this code, assume it is broken.
    unsigned long long tmp;
    /* Here be dragons, but it should be okay due to be64toh */
    TGLC_bn_bn2bin (b, (unsigned char *) &tmp);
    return be64toh (tmp);
  } else {
    assert (0);
  }
}

В этом блоке кода мы хотим найти и заменить два вхождения assert(0), как показано ниже.

assert(0);

заменяем на

//assert(0);

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Теперь можем скомпилировать наш Telegram

cd ~/tg

./configure

make

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

Когда все описанные подготовительные процедуры завершены можно приступать к авторизации через коммандную строку.

cd ~/tg

bin/telegram-cli -k tg-server.pub -W

Телеграм запросит ваш телефонный номер в формате +(код страны)ХХХХХХХ, вводим, жмем ENTER и все, ваш телеграм готов отправлять сообщения (и не только) через коммандную строку.

Сообщение можно отправить при помощи следующей команды:

msg Username "текст сообщения"

Username, напоминаю, должен содержаться в списке контактов. Проверить его наличие можно командой:

contact_list

Для отправки видео существует похожая команда:

msg_video Username путь к файлу видео

Убедившись, что все работает и сообщения уходят и приходят к адресату, создадим небольшой bash скрипт для обращения к телеграму напрямую из командной строки, без необходимости запускать его коммандный интерфейс. Покидаем интерфейс телеграма при помощи сочетаня клавиш ctrl + c и приступаем к созданию bash скрипта:

sudo nano /usr/local/bin/tg_video.sh

В появившемся окне вводим следующий код:

#!/bin/bash
tgpath=/home/pi/tg
cd ${tgpath}
(sleep 3; echo "send_video $1 $2"; echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -W

Сохраняем файл при помощи ctrl + o и выходим ctrl + c. Теперь нам нужно дать права на выполнение нашего скрипта:

sudo chmod -R 0655 /usr/local/bin/tg_video.sh

Как это работает: помните, мы прописывали в файле конфигурации motion.conf строку, которая выполняется при окончании записи видеофайла?

on_movie_end /usr/local/bin/tg_video.sh Username %f

То-есть, при окончании записи видеофайла motion помещает его в переменную f и вызывает скрипт для отправки видео в telegram, передавая ему 2 параметра: Username (в нашем случае это контакт в телеграме, которому мы присылаем видео) и %f - сам файл.

На этом настройка отправки видео в телеграм завершена, можно запускать motion:

sudo systemctl enable motion

Убедиться, что он работает можно командой

sudo service motion status

Как только движение будет зафиксировано - в telegram начнут прилетать такие видео. Что удобно, в нем можно настроить их автопроигрывание прямо в окне - не нужно загружать, сохранять и т.д.

Немного про онлайн стриминг

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

192.168.0.106 - это адрес Raspberry, присвоенный ей моим роутером. Для того, чтобы он оставался все время одним и тем же необходимо установить привязку ip адреса к mac адресу на вашем роутере. После чего, вводим в браузере:

http://192.168.0.106:90/

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

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

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

Для просмотра вводим в браузере:

http://ваш_реальный_IP:9000/

Лично у себя я организовал все несколько иначе: малинка постоянно подключена по VPN к облачному серверу с реальным IP адресов. Стрим по локальному VPN IP адресу приходит в Motion, установленный на облачном сервере при помощи пункта motion.conf

netcam_url http://192.168.40.10:9000

Соответвенно в глобальный интернет стримит уже такой своеобразный "прокси" motion.

Вот собственно и все, надеюсь эта статья будет полезной в практическом плане и вдохновит на дальнейшее познание и разработку чего-нибудь нового :)

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


  1. Javian
    17.11.2022 13:35
    +3

    Raspberry 3b+ на сайте dns-shop стоит 15499 ₽. Наверное выгоднее купить пару IP камер и настроить на RPi видеорегистратор. Плюс возможна организация дополнительных функций - pihole, transmission, SMB, DLNA и т.д. что оправдает использование RPi в видеонаблюдении.


    1. Miecerinos Автор
      17.11.2022 17:42
      +2

      Както я пропустил такое их подорожание, раньше они тысячи по 3 стоили... Статья расчитана больше на тех, у кого она уже есть)

      А так на ней еще DLNA, Asterisk шлюз, отправлялка отчетов по работе, сервак для пары телеграм ботов, зеркало для сайта)


  1. turbidit
    17.11.2022 13:58
    +1

    # Значение, указывающее максимальное количество кадров, при отсутвтии изменений 
    # на которых делается вывод о прекращении движения
    event_gap 10
    

    Только не кадров, а секунд

    max_movie_time 20
    

    movie_max_time

    output_pictures off
    

    picture_output

    Вы специально что ли?


    1. Miecerinos Автор
      17.11.2022 17:31

      Не специально)) В разных релизах motion отличается


  1. Nikeware
    17.11.2022 14:01
    +3

    Моя "конструкция" - это обычный Андроид телефон с установленной IP Webcam Pro программой, которая транслирует поток по WiFi. В "чулане" стоит NVIDIA Jetson Nano DevKit B01. На нём много чего "крутится", но там еще есть самописная прога, которая на основе "jetson-inference" следит за видеопотоком и детектит только людей. Ну и потом всё это рассылается через собственный телеграм бот, где можно посмотреть фото, видео и повзаимодействовать с камерой удаленно.
    MotionEye я пробовал использовать, но "motion detection" там имеет много ложных срабатываний. Настроить нормально его я так и не смог. Например включения и выключения света в подъезде часто попадали как motion detected события.
    p.s. Глазок правда у меня как таковой, отсутствует, сразу прямое отверстие в в двери (старые дома, альтбау по немецки). Поэтому камера телефона "смотрит" прямо наружу. Из-за этого картинка без искажений.


    1. Didimus
      18.11.2022 13:56

      Есть проблемы с питанием телефона. Если постоянно на проводе, может испортиться аккумулятор


      1. Nikeware
        18.11.2022 15:04

        Мало того, может вздуться, а это опасно. Я чуть ниже уже ответил по этому поводу. Через программируемое реле Shelly этот вопрос легко решается. Уровень заряда контролируется программно и периодически телефон подзаряжается. Т.е. он у меня постоянно к зарядному устройству не подключен. Плюс с телефона есть информация с датчиков. По ней я вижу уровень заряда, напряжение и температуру самой батареи. По критическому порогу той же температуры телефон просто автоматически будет отключен от зарядного устройста. Новый аккумулятор на телефоне в таком режиме служит у меня в среднем года полтора.


  1. Nikeware
    17.11.2022 15:14

    Я правильно понимаю, что камера закреплена прямо на дверной глазок и в следствии этого посмотреть в него обычным способом невозможно?


    1. Miecerinos Автор
      17.11.2022 17:32

      Правильно, но это и не требуется) Проще открыть закладку в браузере и посмотреть так


      1. Nikeware
        18.11.2022 11:34
        +1

        Проще открыть закладку в браузере и посмотреть

        Э-э ... Не скажите! :-) Я когда свой монтировал, телефон брал именно для этого случая. Если там за дверью какой-то шум, проще подойти к двери и одним касанием активировать изображение на телефоне. Сразу всё как на ладони. А если кто-то звонит в дверь, бежать и открывать браузер чтобы посмотреть кто там? С точки зрения использования, всё выглядит естественно - звонок, подошёл к двери, одно касание и видно кто там снаружи.

        Плюс ещё в том, что у телефона две камеры и есть возможность удалённо контролировать как снаружи, так и внутри.

        p.s. В вашем случае в двери стоит обычный оптический дверной глазок. У него есть один неоспоримый плюс - угол обзора. Я пробовал такой комбинировать с телефоном. Но получить одновременно обычную картинку (без этой оптической "трубы") и большой угол обзора увы не получается. Мне интересно, можно ли с точки зрения физических законов оптики модифицировать этот обычный глазок так, чтобы в комбинации с телефоном (просто приставив его камеру) получит нормальное изображение? Ну там какую-то дополнительную линзу поставить, чтобы убрать эти искажения и приблизить картину? Провести корректировку типа как у телескопа Хабл :-)


        1. Miecerinos Автор
          18.11.2022 13:59

          По поводу просмотра в касание, есть вариант установить рядом с дверью дисплей с выводом картинки с камеры хоть беспрерывно, цена дисплеев для малинки от 200 до 3000 р. в зависимости от размера и т.д.

          Что касается оптики - думаю вполне реальная задача, потребуются 2 линзы. А вот рассчитать их и смонтировать - не тривиальная задача, хотя, если задаться целью то вполне реальная)


          1. Nikeware
            18.11.2022 14:38

            Да, конечно, можно и дисплей установить. Кстати есть много подобных готовых решений. Они правда стоят денег, иногда хороших. В моем случае "приделать" старый неиспользуемый телефон оказалось проще. Да и сделать/запрограммировать что-то своими руками было интересней :-) На всё про всё у меня ушло 5€ на саму программу, которая транслирует видеопоток с телефона и 14€ на Shelly - это такая релюшка, которая монтируется прямо внутри разетки и тоже управляется по WiFi. К этой разетки подключена зарядное от телефона. Зарядка тоже автоматически включается/выключается в зависимости от уровня батареи на телефоне. Вся конструкция выглядит как обычный телефон, подключенный к зарядке. Никаких других коробок или проводов рядом нет.


            1. Miecerinos Автор
              18.11.2022 19:15

              Не совсем понимаю, зачем wifi-реле, разве контроллер заряда аккумулятора в телефоне или самом аккумуляторе делает не то же самое?


              1. Nikeware
                19.11.2022 14:58
                +1

                Не знаю. В новых моделях телефонов может оно так и устроено. В начале у меня так и было, просто напрямую к питанию было подключено. Один аккумулятор через полтора месяца вздулся так, что аж заднюю крышку телефона вывернуло. Так и до пожара недалеко :-( Поэтому было решено периодически заряжать телефон в автоматическом режиме. Причем я его до 100% не поднимаю никогда. 35-85 - это тот диапазон, в котором я его постоянно держу. По собственным ощущениям видно, что он так меньше греется. Уже года 3 в таком режиме. Ещё не один аккумулятор не вздулся. Для литиевых, насколько я знаю, полный заряд (как и очень низкий) плохо сказывается на их сроке службы.


      1. Didimus
        18.11.2022 13:57
        +4

        Пришли гости, а ты им такой: вот сейчас операционка у глазка обновится, и я вас пущу!


        1. Miecerinos Автор
          18.11.2022 19:17

          Званым гостям можно не глядя открывать, а незваным хоть с глазком, хоть без не стоит))


  1. delphersf
    17.11.2022 15:55

    Была у меня идея старый Android смартфон закрепить камерой на обычном дверном глазке. Real-Time IP подключение есть (VNC или scrcpy и прочее).

    Кто-нибудь знает программу-видеорегистратор на Android c записью на сетевую smb шару или хотя бы на SD-карту? Не смог я найти такую.


    1. Nikeware
      17.11.2022 16:40

      Я использую IP Webcam (платная Pro стоит 5$). Она вроде может сохранять по указанному сетевому пути. На SD карту так точно.


    1. Didimus
      18.11.2022 13:58

      Поищите авто видеорегистраторы, может там что есть


  1. kosbic
    17.11.2022 17:32
    +2

    Не совсем понял зачем ставить telegram-cli, если можно видео отправлять ботом простой командой curl.

    Лично для себя я создал telegram чат, куда ботом отправляю видео примерно вот так:

    PATH="/tmp/video.mp4"
    TIMEOUT=10
    CHAT_ID=<chat_id>
    BOT_ID=<bot_id>
    
    curl --max-time ${TIMEOUT} --connect-timeout ${TIMEOUT} -s -F chat_id=${CHAT_ID} -F video=@${PATH} https://api.telegram.org/bot${BOT_ID}/sendVideo


    1. Miecerinos Автор
      17.11.2022 17:34

      Тоже об этом думал, но на момент, когда это воплощал первым попался telegram cli. Но вариант с ботом поудобнее, согласен!


  1. ZigFisher
    17.11.2022 18:27
    +4

    Наш небольшой международный проект OpenIPC (альтернативные прошивки для видеокамер) возможно будет интересен всем, кто не боится экспериментировать ;)


    1. ner0
      18.11.2022 11:32

      впервые год назад узнал об этом проекте, у них сайт был openipc.org

      Они делают прошивки для IP-камер на базе OpenWRT. Я хотел сделать проводно-беспроводную PoE камеру сделать видеонаблюдением на sd-карту и wifi точкой доступа, 2 в 1. Но так и не получилось найти подходящее железо под прошивку.


      1. ZigFisher
        18.11.2022 15:25

        Уже нет, сейчас всё делается на базе Buildroot, т.к. OpenWrt скожнее по концепции вписать, да и в апстрим там не пропихнуть, ибо надо иногда блобы бинарные подкидывать с драйверами на которые исходников нет.
        Поддерживаемый парк уже достаточно большой, главное процессор и сенсор, а собственно сам производитель не имеет значения.


  1. slog2
    19.11.2022 17:25

    Плохой это вариант видеонаблюдения. Когда-то я делал то же самое. Raspberry + Logitech C270. Первая камера проработала год и померла. Купил вторую. Её хватило тоже на год. За это время ещё и флэшка в Raspberry умирала, приходилось настраивать всё заново. Купил обычную китайскую IP-камеру и с тех пор забыл про все проблемы. Ну и за цену одной малины можно купить несколько IP-камер и не мучаться.