Все как обычно — сам поставил для себя задачу, сам и решаю. И так — захотелось мне сделать себе дома подсветку парковки, да не простую, а немного умную. Требования на первый взгляд были довольно простые, а именно:

  • Подсветка включается только при открытии откатных ворот
  • Подсветка включается только когда на улице темно

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

Можно было конечно пойти другим путём — установить концевики на ворота, протащить провода (перекопав половину парковки)… Я выбрал другой метод — более интеллектуальный, а именно сделать так что бы по изображению с камеры видеонаблюдения определялось движение в заданной области, при его появлении включался виртуальный датчик движения, а дальше уже мозги умного дома принимают решение о включении или не включении света.

Для всего этого понадобится следующее:

  • Любой ПК/мини ПК с linux’ом на бору. В моём случае Raspberry Pi 2
  • IP камера видеонаблюдения и ИК подсветкой
  • Система умного дома. В моём случае Domoticz

Установка пакета motion

Все до неприличия просто:

sudo apt-get install motion

После установки нам необходимо настроить файл /etc/motion/motion.conf. Если у Вас будет только одна камера, остальные файлы можно удалить. В нём нужно кое что подправить. Я буду писать итоговые строчки с комментариями, так будет проще. Я просто правил под себя конфиг по умолчанию.

# Start in daemon (background) mode and release terminal (default: off)
daemon on

Ставим on для того что бы служба стартовала автоматически после перезапуска ПК

netcam_url rtsp://you_ip:554/ISAPI/Streaming/Channels/2
netcam_userpass admin:you_password

Параметры для подключения к камере видеонаблюдения. В моём случае это камера Hikvision DS-2CD2642FWD-IS. С неё берется второй видеопоток. Этому 2 причины — первый поток занят видео сервером, второе — этот поток более низкого качества и как следствие меньшая нагрузка на ПК во время анализа изображения. В случае если камера у Вас другая — ищите для неё адрес RTSP потока.

# Image width (pixels). Valid range: Camera dependent, default: 352
width 640
# Image height (pixels). Valid range: Camera dependent, default: 288
height 360

Размеры картинки с видеопотока. Проверить можно очень просто — открыть в VLC RTSP поток с камеры и посмотреть его свойства. Повторюсь — для слабых ПК лучше брать маленькие потоки, анализ например FullHD видеопотока просто приведёт к зависанию из за нехватки ресурсов

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
framerate 5

Максимальное количество кадров в секунду для захвата. Подбирать методом тыка, анализируя загрузку процессора ПК. Сильно зависит от того в каком месте вы пытаетесь определить движение

# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 200

Количество изменившихся пикселей в зоне обнаружения движения, которые приведут к срабатыванию датчика. Грубо говоря если при сравнении прошлого кадра и текущего оказалось изменено более 200 пикселей — значит произошло движение. Подбирается методом тыка, у меня ушло 2 часа что бы подобрать значение при котором не было ложных срабатываний, но и событие четко определялось

# PGM file to use as a sensitivity mask.
# Full path name to. (Default: not defined)
mask_file /home/pi/domoticz/scripts/vorota.pgm

Самое интересное. Маска области где будет определяться движение. Нормально PGM файл у меня получилось сделать только в GIMP’е, Photoshop немного не так сохраняет файл и пакет motion его не читает. Маску сделать просто, берем кадр с видеопотока (скриншот средствами VLC), в моём случае он выглядел так:

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

Сохраняем полученный файл в формате PGM и закидываем по пути, указанному чуть выше. Здесь хочу сделать маленькую ремарку — изначально областью для отслеживания движения я сделал сами ворота, но как показала практика — это было не самое верное решение. Причины две — собака, попадающая периодически в кадр и засветка от фонарей на доме. Из за этого были ложные срабатывания. В конечном итоге областью для определения движения стал маленький квадратик — лампочка на воротах, которая мигает при движении ворот. Не самое изящное решение — но оно работает 🙂

# Event Gap is the seconds of no motion detection that triggers the end of an event.
# An event is defined as a series of motion images taken within a short timeframe.
# Recommended value is 60 seconds (Default). The value -1 is allowed and disables
# events causing all Motion to be written to one single movie file and no pre_capture.
# If set to 0, motion is running in gapless mode. Movies don't have gaps anymore. An
# event ends right after no more motion is detected and post_capture is over.
event_gap 10

Время события. Через сколько после начала движения оно считается «завершенным», подбирается опять же методом тыка и исходя из ваших задач — лично мне хватило 10 секунд, дальнейшие события все равно отрабатывает умный дом.

# Output 'normal' pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to 'first', only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to 'best'.
# Picture with motion nearest center of picture is saved when set to 'center'.
# Can be used as preview shot for the corresponding movie.
output_pictures off

Отключаем сохранение картинок с камеры при обнаружении движения. Мне просто не нужно, все равно эта же камера пишет видео с первого потока в FullHD 25fps

############################################################
# FFMPEG related options
# Film (movies) file output, and deinterlacing of the video input
# The options movie_filename and timelapse_filename are also used
# by the ffmpeg feature
############################################################

# Use ffmpeg to encode movies in realtime (default: off)
ffmpeg_output_movies off

Видео так же отключаем.

# Command to be executed when an event starts. (default: none)
# An event starts at first motion detected after a period of no motion defined by event_gap
on_event_start /usr/bin/curl -s "http://Domoticz_IP:8080/json.htm?type=command&param=switchlight&idx=НОМЕР_IDX&switchcmd=On"

# Command to be executed when an event ends after a period of no motion
# (default: none). The period of no motion is defined by option event_gap.
on_event_end /usr/bin/curl -s "http://Domoticz_IP:8080/json.htm?type=command&param=switchlight&idx=НОМЕР_IDX&switchcmd=Off"

И финальная настройка — действия при срабатывании. В Domoticz’е у меня сделан виртуальный датчик с подтипом Motion Sensor, его статус и изменяет motion при обнаружении движения. При получении сигнала о срабатывании виртуального датчика движения — умный дом проверяет текущее время (у меня настроено что подсветка включается только в темное время суток, данные берутся со втроенного астро-таймера) и посылает сигнал о включении лампы на парковке на три минуты.

Поделиться: