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