Мониторинг за котлом через USB камеру

Posted by

Не очень то и повезло мне, эти морозы начала 2017 года которые вроде как прошли но вроде и нет, в смысле самые первые январские. Так уж получилось что навалилось сразу все сразу, машина не заводится, бензиновый генератор тоже (стоит в не утепленном гараже), аккумуляторная батарея не держит 100% заряд, только 60%. Но это еще не слишком страшно, вот к примеру вчера 06.01 как всегда что-то случается под вечер — котел (Viessmann Vitopend 100) который установлен в моем доме начал задыхаться, а вызвано это было появление на дисплее ошибки с кодом F5. По мануалу это значит что что-то препятствует подаче кислорода. А вследствие остаться в доме который не отапливается что еще может быть хуже, но я нашел альтернативное решение которое как мне показалось в тот момент самым простым — это открутить воздуховод и чтобы воздух для камеры сгорания брался не с улицы, а из котельной.
Для чего все я это выше написал, а потому, что уже имел некоторый опыт работы с камерой и своими системами и у меня назрел некоторый план по мониторингу за состоянием своего котла чтобы в случае чего примчаться к нему и запустить его (сбросив ошибку), либо еще больше приоткрыть воздуховод. Цель, пока еще едет для этой цели raspberry pi 3 нацелить мой маленький лежавший без особой надобности и USB камеру чтобы следить за котлом, а уже подключившись ко всему этом комплексу из другой комнаты предпринять необходимые меры.
Сегодня я покажу что я сделал. Не спорю что решение желает желать лучшего, но в такую ситуацию это было первым что пришло на ум.
Все действия разворачиваются на системе .5 Desktop (но также могут быть применены на Ubuntu Trusty):

ekzorchik@eee:~$ sudo apt-get install v4l-conf -y
ekzorchik@eee:~$ ls /dev/video*

/dev/video0 /dev/video1

, где /dev/video0 → это встроенная камера в сам нетбук, а /dev/video1 → это подключенная к USB разъему на шнурке в 1.5 метра камера.
Из вывода по возможностям камер узнаю необходимые характеристики которые понадобятся мне в дальнейшем: ekzorchik@eee:~$ v4l-info /dev/video0

а именно:

  • description : «YUV 4:2:2 (YUYV)»
  • fmt.pix.width : 640
  • fmt.pix.height : 480

За инструментом по данной задаче я иду к утилите mjpg-streamer с целью организации простенького потокового видео вещания c USB камеры:
ekzorchik@eee:~$ sudo add-apt-repository ppa:altair-ibn-la-ahad/mjpg-streamer
ekzorchik@eee:~$ sudo apt-get update
ekzorchik@eee:~$ apt-cache show mjpg-streamer | grep Version

Version: 1.0+svn182-0ubuntu1

если выкачивать через SVN то редакция пакета точно такая же как и в добавленном репозитарии

ekzorchik@eee:~$ svn co svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer

Получена редакция 182.

ekzorchik@eee:~$ sudo apt-get install mjpg-streamer -y
ekzorchik@eee:~$ whereis

mjpg_streamer: /usr/bin/mjpg_streamer /usr/bin/X11/mjpg_streamer

Если просто запустить установленную утилиту то она поднимает порт 8080 где будет произведено вывод видео с USB камеры:

ekzorchik@eee:~$ mjpg_streamer

MJPG Streamer Version: svn rev:

o: www-folder-path…: disabled

o: HTTP TCP port…..: 8080

o: username:password.: disabled

o: commands……….: enabled

ekzorchik@eee:~$ sudo netstat -tulpn | grep :8080

[sudo] password for ekzorchik:

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18268/mjpg_streamer

tcp6 0 0 :::8080 :::* LISTEN 18268/mjpg_streamer

Ага как бы не так:

http://192.168.1.186:8080/?action=stream

404: Not Found!
Invalid input plugin number

, где 192.168.1.186 — это IP адрес моего нетбука EEE PC 901

Местонахождение библиотек:

ekzorchik@eee:~$ ls /lib | grep -E "input_uvc.so|output_http.so"

input_uvc.so

output_http.so

Итого чтобы вывести изображение с камеры для просмотра через браузер строка запуска установленной утилиты будет следующей:

ekzorchik@eee:~$ mjpg_streamer -i "input_uvc.so --help"

ekzorchik@eee:~$ mjpg_streamer -i "input_uvc.so -d /dev/video1 --fps 25 -r 640x480" -o "output_http.so -p 8080"

MJPG Streamer Version: svn rev:

i: Using V4L2 device.: /dev/video1

i: Desired Resolution: 640 x 480

i: Frames Per Second.: 25

i: Format…………: MJPEG

А открывая вкладка в браузере с URL адресом: http://192.168.1.186:8080/?action=stream выдает мне меня:

Доступ к USB камере через браузер - а на скриншоте Я сам.Как только я напротив камеры начинаю какое либо движение это движение тут же видоизменяется в браузере, отлично.

Также можно сделать скрипт который толкнув запустится вещание с USB камеры, в противовес набору длинной строки:

ekzorchik@eee:~$ mkdir www

ekzorchik@eee:~$ nano cam_stream

#!/bin/bash

RESOLUTION="640x480"

FRAMERATE="25"

VIDEO="/dev/video1"

MJPG_WEB_ROOT="./www"

PORT="8080"

mjpg_streamer -i "input_uvc.so -d $VIDEO --fps $FRAMERATE -r $RESOLUTION" -o "output_http.so -w $MJPG_WEB_ROOT -p $PORT"

ekzorchik@eee:~$ chmod +x cam_stream

ekzorchik@eee:~$ ./cam_stream

Для отладки чтобы убить запущенный процесс:

ekzorchik@eee:~$ killall mjpg_streamer

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

ekzorchik@eee:~$ mjpg_streamer -o "output_http.so --help"

Если сделать запрос через утилиту curl к данной URL ссылке то скриншот сохраняется:

ekzorchik@eee:~$ sudo apt-get install curl imagemagick libav-tools -y

ekzorchik@eee:~$ curl http://192.168.1.186:8080/?action=snapshot > ~/www/1

% Total % Received % Xferd Average Speed Time Time Time Current

Dload Upload Total Spent Left Speed

100 36199 0 36199 0 0 2208k 0 —:—:— —:—:— —:—:— 2356k

Задача: на полученное изображение нужно добавить информацию о текущей дате и времени в левый верхний угол:

ekzorchik@eee:~$ curl http://192.168.1.186:8080/?action=snapshot > ./www/out.jpg

% Total % Received % Xferd Average Speed Time Time Time Current

Dload Upload Total Spent Left Speed

100 36014 0 36014 0 0 1073k 0 —:—:— —:—:— —:—:— 1099k

ekzorchik@eee:~$ nano date_time_img

#!/bin/bash

timestamp=`stat -c %y out.jpg`

convert ./www/out.jpg -fill black -fill white -pointsize 15 -draw "text 5,15 '${timestamp:0:19}'" ./www/out_.jpg

ekzorchik@eee:~$ chmod +x date_time_img

ekzorchik@eee:~$ ./date_time_img

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

ekzorchik@eee:~$ nano cam

#!/bin/bash

while (true)

do

filename=$(perl -e "print time")

foldername=$(date --rfc-3339=date)

curl http://192.168.1.186:8080/?action=snapshot > $filename

timestamp=`stat -c %y $filename`

mkdir -p "$PWD/www/$(date --rfc-3339=date)/out"

convert $filename -fill black -fill white -pointsize 15 -draw "text 5,15 '${timestamp:0:19}'" /$PWD/www/$foldername/out/$filename.jpg

rm $filename

done;

ekzorchik@eee:~$ chmod +x cam

ekzorchik@eee:~$ crontab -e

* * * * * /home/ekzorchik/cam

Не подходит, т.к порой в одну секунду скрипт отрабатывает несколько раз.

while true; do ./cam; sleep 1; done

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

ekzorchik@eee:~$ while true; do ls "$PWD/www/$(date --rfc-3339=date)/out" | wc -l; sleep 5; done

321

321

325

330

ekzorchik@eee:~$ killall cam

Теперь нужно чтобы из сохраненного изображения за секунду в каталог склеить видеоряд:

ekzorchik@eee:~$ nano video_merge

#!/bin/bash
filename=$(date --rfc-3339=date)

foldername=$(date --rfc-3339=date)
i=0

for f in `ls -tr /$PWD/www/$foldername/out/*.jpg 2>/dev/null`

do

newf=`printf %06d $i`.jpg

echo $f "-->" $newf

mv $f $newf

i=$((i+1))

done

rm -Rf /$PWD/www/$foldername/out

avconv -r 10 -i %06d.jpg -r 10 -vcodec mjpeg -qscale 1 /$PWD/www/$foldername/$filename.avi

rm *.jpg

ekzorchik@eee:~$ chmod +x video_merge

Запускаю данный скрипт:

ekzorchik@eee:~$ ./video_merge

А на выходе получаю склеенный видео ряд:

ekzorchik@eee:~$ ls www/2017-01-07/

2017-01-07.avi

Если поставить SAMBA сервис то можно будет получить собранный видео файл. Как поднять сервис SAMBA читайте у меня на блоге.

Отлично, что мне и требовалось. Я смог разобрать по уже написанному но с ориентированностью на себя.

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

ekzorchik@eee:~$ crontab -e

* * * * * /home/ekzorchik/cam_stream

* * * * * /home/ekzorchik/cam

ekzorchik@eee:~$ sudo service cron restart

Все выше разобранное делает уже из коробки утилита motion

Для остановки:

ekzorchik@eee:~$ killall cam

ekzorchik@eee:~$ killall mjpg_streamer

На следующий день хоть и было холодно я начал при свете дня анализировать данную проблему с котлом и решение было найдено, на трубе снаружи дома образовалась наледь, чайник с кипяченой водой и кружка для обрызгивания/сбития наледи была успешна устранена и котел восстановил свое работу без каких либо ухищрений. Плохо лишь то что производитель не до конца продумал свою продукцию не оснастив котел звуковым датчиком если у него случается ошибка. Но я же системный администратор и пусть мое решение не столь элегантно но есть куда стремиться покуда Raspberry PI 3 еще в пути да и усовершенствовать нужно, точнее автоматизировать. А пока я прощаюсь, до новых встреч, с уважением автор блога Олло Александр aka ekzorchik.