Кормушка с видео в ленте телеграмма

Делаем кормушку для птиц с автоподачей корма и автоматической отправкой видео себе в Телеграмм.

3af394de26a87841144363a354f76638.jpg

Идея

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

Но самому, тем более на даче, сделать прикольнее, и за вечер я довольно быстро её сваял. Насыпал семечек, а птицы не летят. С дачи пора уезжать, а птиц всё нет. Мне начали не давать покоя мысли «А что если птицы прилетят, когда меня не будет?». Просто залипать в веб-камеру и ждать так же как перед окном, только перед монитором, мне показалось странно. Во всех камерах давно уже есть датчики движения.

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

Птицы стали прилетать, и это оказалось очень круто! Видео с птицами из интернета, не смотря на лучшее качество, это совсем другое, а тут понимаешь, что оно происходит прям у тебя на окне — это удивительное чувство. Мне захотелось делиться видосами! Я кидал их в чаты, в личку друзьям и репостил в свой бложик. Видосов становилось больше, и я понял, что утомлю всех ими — их надо выводить на отдельную площадку. Так почему бы не постить их сразу в публичный канал.

Получилась такая как бы веб-камера (видео приходят примерно через минуту после события), но только когда что-то происходит. Зачем смотреть на пустую кормушку, если можно наблюдать только за самым интересным?

Птиц становилось больше. Стакан корма они съедали за 2 дня. Я уезжал с дачи и смотрел как птицы прилетают в пустую кормушку — это было невыносимо. Раз уж я автоматизировал просмотр, то автоматизировать надо и подачу корма. Была собрана первая версия на ESP8266 и серво-приводе. И заодно измерением уровня корма в контейнере. Корм в ней периодически всё равно застревал и уровень корма больше был похож на рандом.

Автоподачу было решено переделать на аналоговую. Из канализационных труб (я как раз присмотрел беленькие, в цвет кормушки). Теперь в неё входит 3 килограмма семечек и этого хватает примерно на 2 недели.

В морозы птиц стало ОЧЕНЬ много. 3–4 тысячи (!) видео в день и килограмм корма за 2 дня. Благо морозы продержались не долго. 90% видео — синицы. Так что следующая, пока не реализованная, идея — прикрутить нейросеть, которая бы уведомляла о новой незнакомой птице, потому что просматривать такое количество видео стало просто нереальным.

Изготовление кормушки

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

cdac0246ae554e0ceb4c8bcf8a04ab14.png

Покрутить в 3Д и посмотреть размеры можно вот здесь: https://a360.co/3rsSLRZ

Что понадобится:

  • Ножовка и стусло (или торцовка)

  • Доски шириной 120 и 150 мм

  • Рейка 2×3

  • Уголок 20×20 (можно заменить шпатиком)

  • Клей ПВА

  • 4 самореза длинной 50–70 мм

  • Шуруповёрт

  • Свёрла по дереву 2 и 4 мм

Как раз у меня в хозяйстве появилась торцовка. С ней пилить доски — одно удовольствие. Но ножовку и стусло никто не отменял. Я напилил досок в размер, углы ставил 22.5 — так мне показалось изящнее всего. Сперва склеиваем две половинки крыши с помощью ПВА. Рейки к основанию и к крыше приклеил на ПВА и дополнительно посадил на саморезы (предварительно не забудьте просверлить 4 мм дырки в основании и крыше и 2 мм — в рейках). Уголок просто приклеил на ПВА.

Далее слегка пошкурил и покрасил белой морилкой, просто потому что она у меня была. Получилось симпатично (сорри, фото после покраски не сделал).

подбор вариантов как крепитьподбор вариантов как крепить

Присоска — плохой вариант — она на ней сползает по стеклу. Так что снаружи верёвка крепится на крючочек, вкрученный в раму. Этого крепления оказалось достаточно. От рендера отличается дополнительным уголком сверху — он защищает стык (вообще то не от чего там защищать), но скорее является просто декоративным. И торцы крыши я тоже сделал под небольшим углом

Чем кормить, сколько ждать птиц?

Подсолнечные семечки — самое любимое их лакомство. И самое доступное (85р/кило на момент публикации) — продаются в овощных ларьках и на рынке, только обязательно уточняйте, не жареные и не солёные ли они.

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

Можно повесить кусок сала на длинном саморезе. Оно висело у меня в кормушке, но имело довольно неприглядный вид — я перевесил напротив в зоне видимости кормушки, но зато очень смешно синицы висят на нём к верху ногами.

Отдельно на небольшом отдалении у меня висит лущилка с очищенным не жареным, не солёным арахисом.

Чем больше разнообразного корма, тем больше птиц заинтересуются кормушкой.

Птицы находят кормушку не сразу. Синицы у меня прилетели первые, на следующий день буквально. Сойки тоже прочухали почти сразу — день на третий. С трудом помещаясь в кормушку иногда залетают сороки. Довольно быстро появилась дроздиха — очень странно, она вообще то должна была улететь на юг, но кормилась у меня каждый день, пока не настало тепло. А вот снегирей мы ждали очень долго (хотя у соседей их было полно) — месяца 2. Так же месяца два назад стал регулярно прилетать дятел. И буквально на днях стали залетать сперва полевые воробьи (всегда парочкой), а затем и зеленушки (тоже парой).

Самой большой неожиданностью для нас явилась белка — она очень ловко забирается по наличникам и рамам и подолгу сидит на коньке крыши кормушки — как резная =)

Автоподача корма

Версию с ESP и сервоприводом показывать мне стыдно, так что сразу финальная аналоговая версия:

4d5d26d439c18bea3f532625c2d50723.jpg

Для этого нам понадобятся фановые трубы:

  • Длинная 110я труба (1.5–2 метра) — это собственно резервуар

  • Муфта 110я

  • Переход с 110 на 50 трубу

  • Кусок 50й трубы (полметра-метр в зависимости как далеко от кормушки будет резервуар)

  • Два отвода 45°

  • Заглушка 110й трубы — крышка.

  • Хомут стальной для 110й трубы

  • Очень желательно — силиконовая смазка для канализационных труб (без неё соединять, и особенно разъединять, их очень трудно)

Собственно схема сборки видна на картинке. Расскажу про особенности, поскольку у самого получилось не с первого раза:

Это автоподавалка для подсолнечных семечек — для них подходят именно 50е трубы. Сперва я пробовал 32е, затем 40е — в них семки застревают. Под более мелкую крупу надо брать трубы тоньше.

Белые трубы называются «для внутренней канализации с шумопоглощением». Если внешний вид не важен — можно использовать более дешёвые серые.

После того как конструкция готова — рекомендую закрепить короткими (13–16 мм) саморезами все соединения. Герметичность нам не важна, а вот птицы могут шатать кормушку. Так же во входном раструбе выньте резинку — так будет проще закрывать крышку-заглушку. Засыпаю корм я со второго этажа — специально проделал дыру в подшивке свеса крыши.

Что бы соединить переход 110–50 и уголок — используйте обрезок 50й трубы — получается такая внутренняя муфта.

Ну и может быть под ваши реалии лучше подойдёт другая конструкция — например в качестве накопительного резервуара можно использовать 160ю трубу.

Камера и видео-сервер

Камера подойдёт любая. Так же подойдёт старый мобильник с установленным IP Webcam. Или веб-камера, подключенная по USB. Отлично крепится на двухсторонний скотч к стеклу:

Завалявшаяся у меня без дела IP камера HikWisionЗавалявшаяся у меня без дела IP камера HikWision

Нам понадобятся:

  • Любая IP-камера

  • Старый комп или Raspberry Pi в качестве видео-сервера.

  • Россыпь проводов, или WiFi, если камера умеет (но провода конечно лучше)

  • Флешка, на которую зальём образ убунты

У меня в качестве видео-сервера используется старый компьютер, кажется аж на core2duo c 2 гб оперативки. На нём стоит Debian без графической оболочки и zoneminder в качестве видео-сервера.

ZoneMinder довольно неплох, и главное, что он умеет — детектировать движение в кадре и складывать видео с ним в папку — это всё, что нам нужно для отправки в Телеграмм.

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

Итак, ставим убунту, можно без графического интерфейса,

(уж простите, процесс установки вы найдёте где угодно. К тому же сейчас он сводится к далее-далее-готово)

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

Я буду повторять уже имеющееся на чистой виртуальной машине, чтобы ничего важного не пропустить и ещё раз перепроверить. В примере я беру рекомендованную документацией zoneminder-а серверную версию: 18.04. В моменте, где спрашивает, установить ли SSH-сервер отвечаю — установить. Обязательно дожидаемся, пока он установит все security updates.

После успешной установки системы устанавливаем для удобства net-tools и mc, и ещё нам понадобится jq:

sudo apt-get update
sudo apt-get install net-tools mc jq

Смотрим командой ifconfig IP адрес и подцепляемся с компьютера, на котором открыта эта статья, с помощью Putty.

Ура, можно копировать строчки в консоль. Добавляем репозиторий Zoneminder-а, ну и ставим сам ZoneMinder:

sudo add-apt-repository ppa:iconnor/zoneminder-1.34
sudo apt-get dist-upgrade
sudo apt-get update
sudo apt-get install zoneminder

Ждём пока установится, даём необходимые разрешения, настраиваем апач и перезапускаем его. Запускаем сам ZoneMinder:

sudo chmod 740 /etc/zm/zm.conf
sudo chown root:www-data /etc/zm/zm.conf
sudo chown -R www-data:www-data /usr/share/zoneminder/

sudo a2enmod cgi
sudo a2enmod rewrite
sudo a2enconf zoneminder
sudo a2enmod expires
sudo a2enmod headers

sudo systemctl reload apache2

sudo systemctl enable zoneminder
sudo systemctl start zoneminder

Если всё прошло успешно, то открываем в браузере (поменяйте IP на свой!): http://192.168.1.61/zm

Соглашаемся с лицензией и попадаем в основное окно:

247113eb3adf168058b4d6787c25400d.png

Пока у нас тут нет ни одной камеры. Сперва настроим важные и не очень пункты.

Можно поменять язык в Option-System-Lang_default, но переведено там не так много всего. Там же надо выставить TimeZone.

В разделе Storage добавьте новое место для хранения видео. Например, в домашнем каталоге:

5dcc39f0c4e4ffede92e4128db3705f8.png

Не забываем создать саму папку и права к ней:

mkdir -p /home/user/zoneminder/ptichki
sudo chown -R root:www-data /home/user/zoneminder/
sudo chmod -R 775 /home/user/zoneminder

Ну и давайте наконец-то добавим камеру!

Самое простое — если камера поддерживает протокол ONVIF — видеорегистратор её найдет самостоятельно. Часто, даже если поддержка есть, то она по умолчанию выключена. Я приведу примеры трёх разных камер:

  • Китайский ноунейм, характерный признак этого типа камер — заявленная поддержка приложением XMEye (назовём их просто китайскими)

  • Камеры HikVision

  • Приложение под андроид IP Webcam

Что характерно — настройки китайских камер и Hikvision открываются только в Internet Explorer (Серьёзно!), да ещё и с установкой какого-то сомнительной надстройки.

В китайских, как правило, ONVIF включен по умолчанию. Если нет:

Открываем по IP в Internet Explorere, устанавливаем предложенную надстройку, перезагружаем страницу, логинимся.

27f6df5c8bf40023af506ddd714296aa.png

Можно ещё в сетевых службах попробовать поискать. Вот с такими настройками работает:

06388fd3bf797cff478a84abf49cdeec.png
Hikvision

Открываем настройки по IP адресу в Internet Explorer, логинимся:

ecf4b9b7395af1384a6cb2d92dd41b40.png
IP Webcam
00731e4ac6ed1b78ceab6d849e303c0d.png

Возвращаемся в ZoneMinder, в главном окне (Сервер) нажимаем «Добавить монитор». Пробуем искать — в правом верхнем углу открывшегося окна нажимаем «Поиск ONVIF». Тут есть особенность: если окно открылось сразу — значит он даже не пробовал искать. Закрываем и нажимаем ещё раз. Если задумался — то ищет. И скорее всего найдёт. Если нет — можете попробовать проверить — установить на комп onvif device manager и поискать им.

1238b8d81a140f3984a1e9c140420127.png

Выбираем нашу камеру с профилем 1.2 и потоком MainStream. Он откроет новое, уже заполненное окно (старое можно закрыть), где выбирайте режим Modect — это и есть детектор движения. И важно выбрать нужное на вкладке Storage:

34430e61f7d2e6e3839fb043f5f713e9.png

Если поиск ONVIF не сработал, то путь к видео с камеры прописывается во вкладке «Источник». Приведу на всякий случай примеры строки «Путь к источнику» для разных камер:

Путь к видео-потоку

Китайские камеры:

rtsp://admin:pass@192.168.1.31:554/user=admin_password=vRnLzCDX_channel=1_stream=0.sdp?real_stream

HikVision:

rtsp://admin:password@192.168.1.32:554/Streaming/Channels/101?transportmode=mcast&profile=Profile_1

IP Webcam:

rtsp://:@192.168.1.33:8080/h264_ulaw.sdp
Пример заполненного окнаПример заполненного окна

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

Отправка в Телеграмм

Теперь самое интересное — отправка в телегу.

Для того, чтобы отправить в телеграмм видео-файл нам нужно завести своего бота и отправить cURL-ом запрос на api.telegram.org, указав в качестве аргумента путь к файлу.

Регистрация бота описана слишком много раз и очень простая, поэтому максимально вкратце:

Пишем @botfather и получаем от него токен в виде 1234567890: AbCDefGH123456789ABCDEFGHabcdefghtg

Не забудьте запустить бота. Нужно написать ему сообщеньку и прочитать её, просто открыв в браузере: https://api.telegram.org/bot1234567890: AbCDefGH123456789ABCDEFGHabcdefghtg/getUpdates оттуда узнаём свой ID. Его надо запомнить:

173ecda6570bf7261c64b24830cfe803.png

Можно проверить отправку себе сообщения так же из браузера: https://api.telegram.org/bot1234567890: AbCDefGH123456789ABCDEFGHabcdefghtg/sendMessage? chat_id=1234567&text=Привет%20 мир

Собственно, нам надо проделать то же самое, только с видео, передав в качестве аргумента путь к файлу. Делается это утилитой cURL

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

curl -s -X POST \
	   -F chat_id=1234567 \
	   -F text=TEST \
	    https://api.telegram.org/bot1234567890:AbCDefGH123456789ABCDEFGHabcdefghtg/sendMessage

Пришло? В выводе должен быть JSON-овский ответ, начинающийся с {«ok»: true

Теперь пробуем с видео-файлом. Сперва найдём его. Я воспользуюсь mc:

c32e06d1e56d963bae0ce4346085a6d5.png

Структура папок: 1 — это номер камеры, затем дата и порядковый номер события — у меня 14е (нумерация сквозная на все камеры). Значит аргументы для cURL-а будут выглядеть вот так (не забудьте заменить данные на свои):

curl -X POST \
	   -F chat_id=1234567 \
	   -F video=@/home/user/zoneminder/ptichki/1/2021-03-28/14/14-video.mp4 \
	   https://api.telegram.org/bot1234567890:AbCDefGH123456789ABCDEFGHabcdefghtg/sendVideo

Я расписываю всё так подробно, потому что сам довольно долго бился над тем, как это всё работает — хочется что бы тот, кто повторял проект — тоже понимал происходящее под капотом.

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

Готовый скрипт мне помогла написать @yiv, без неё я бы возился очень долго и получилось бы коряво.

В консоли пишем

nano ~/telega.sh 

и вставляем туда (предварительно поменяв в первых двух строчках данные на свои):

telega.sh
chat_id="1234567"
api_url="https://api.telegram.org/bot1234567890:AbCDefGH123456789ABCDEFGHabcdefghtg"

videopath="/home/user/zoneminder/ptichki"
api_max_attempts=1

send_video() {
                request='sendVideo'
                args="-F video=@$videofile -F caption=$videofile"
         echo `curl -s -F chat_id=$chat_id $args -X POST $api_url/$request | jq -r '.ok'`
}

for videofile in `find $videopath -depth -name "*.mp4" -mmin -10`; do
        for msg_type in 'video'; do
                echo 'Sending '$msg_type' for '$videofile
 				for attempt in  $(seq 1 $api_max_attempts); do
                        echo 'Attempt #', $attempt, 'in while loop'
                        snd_result="$(send_video $msg_type)"
                        echo $snd_result
                        if [ $snd_result == 'true' ]
                                then
                                        if [ $msg_type == 'video' ]
                                                then
                                                        echo 'ok, removing ', $videofile
                                                        rm -f $videofile
                                         fi
                                        break
                                fi
                        sleep 5
                done
        done
done

Ctrl-X — выйти, Y — сохранить.

Собственно, скрипт ищет все файлы с расширением *.mp4 в указанной папке, включая вложенные. Стоит ограничение по времени — видео старше 10 минут игнорирует. Может делать несколько попыток отправки (переменная api_max_attempts=1) и подписывает видео именем файла.

Помахайте перед камерой ещё раз, чтобы получить свежее видео и пробуем запустить:

 sudo bash /home/user/telega.sh

Вот тут я не до конца разобрался с правами и sudo требуется лишь для того, что бы удалить видео. Должно прилететь видео!

Ну и последнее — создаём задачу в кроне:

sudo crontab -e

Вставляем туда:

 * * * * * sudo bash /home/user/telega.sh

Снова махаем перед камерой, ждём минуту — видео прилетает! Ура!

Немного доработок

Чтобы ночью вам не прилетали видео от случайных бликов — можно камеру отключать по времени. Делается это в ZoneMinder-е довольно удивительно:

В главном окне мы кликаем на большую надпись «Выполняется» и пишем в поле «Новое состояние» например «day» -дневной режим работы, нажимаем «Сохранить». Теперь это состояние нашего сервера под названием day:

f0b14338a7225b97c1c7045b015f3be9.png

Затем в главном окне клик на функции камеры (слово modect) и снимаем галку с «Включён». Сохраняем:

a873caa01b20f156f02ed4c76c2de2f3.png

Снова идём в меню состояния сервера (надпись «Выполняется») и сохраняем новый режим работы, обозвав его, например, night.

Сейчас в Петербурге светает примерно в 6:30, а темнеет в 19:30. Мы снова открываем sudo crontab -e и заносим туда строчки:

30 6 * * * sudo zmpkg.pl day
30 19 * * * sudo zmpkg.pl night

Результат

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

198e6b32a78d3a350584795b87b2cd51.jpg

Вот ссылка на канал со скромными 43 мя подписчиками =) https://t.me/PtichenkiNaDachke Мне будет приятно, если о нём узнают. Хотя, конечно, никакой популярности я от него не жду. Сейчас там синицы, лазоревки, снегири, сойки, сороки, дятлы, дрозды, полевые воробьи, зеленушки и даже белка. На заднем плане бывает видно наблюдающего кота. Так же иногда я помечаю тегами названия птиц.

Птицы — это отдельный мир. Как-то до этого они меня не особенно интересовали, а тут открылось сразу столько всего!

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

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

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

И что мамы показывают малым детям на планшете, как живут птички.

Из минусов — это съедает довольно много трафика и места в телефоне. Пришлось вынести в закреп инструкцию, как не разориться на мобильном трафике и как сделать, чтобы птицы не съели всю память телефона.

Иногда я или моя девушка замечаем интересные моменты и редактируем их с тегом #избранное или если это новая птица, то с названием птицы. Если вы тоже увидите что-то интересное — присылайте в личку, я отмечу соответствующим тегом.

Косяки реализации

Замеченные мной недостатки в данной системе:

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

Включение/выключение камеры было бы здорово привязать к рассвету и закату, а не к конкретному времени — я его периодически подправляю руками.

Окно бликует! Блики иногда очень мешают. А ещё птицы пачкают окно и его раз в пару недель приходится мыть. Иногда я вешаю чёрную футболку, что бы бликов становилось меньше.

Птицы загадили подсолнечной шелухой весь участок. Под соседними кустами будто тусовка гопников, лузгающих семки годами, а вовсе не синиц.

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

Странная работа ZoneMinder-а с длинным событием в кадре. Иногда, когда птица долго тусуется в кормушке, он может посчитать это за одно событие и прислать длинный минутный ролик — это круто и удобно. Но чаще присылает десяток по 15 секунд. Я долго гуглил, но так и не понял, какие настройки за это отвечают. Если кто-то подскажет — буду очень рад!

Если в качестве камеры — мобильник, то с одной стороны изображение гораздо лучше, чем с камеры, заточенной под видеонаблюдение. С другой стороны — куча проблем: нужно реализовать автовключение при подаче питания (ведь на даче частенько пропадает свет). Но основное — низкое значение FPS. И виной этому — пропускная способность канала WiFi. Всё-таки наблюдать за шустрыми пернатыми на видео 5 кадров в секунду — так себе.

Идеи на будущее

Конечно же распознавание птиц и подпись с тегом под видео! Если мне кто-то подскажет как вкатиться в нейросети на слабом железе и с чего вообще начинать — буду рад.

Трансляция в ютуб — в общем то надо сесть и сделать. Хочется, чтобы она не прерывалась и всегда была по одной ссылке. А ночью автоматически ставилась заглушка. Надо лучше гуглить (буду рад подсказкам в комментариях)

Реализация на мобильнике — очень хочется всё это реализовать, например, на стареньком рутованом андроидофоне. В нём же уже есть всё, что надо. Тогда и не нужен отдельный сервер вовсе. И качество изображения будет гораздо выше. Но там очень много своих тонкостей. Кажется, без написания приложения не обойтись.

P.S.

Это первая моя статья на Хабре, так что строго не судите, да и вообще первый большой подробный туториал. Хотел разбить её на две, но странно было бы первой статьёй начинать с DIY деревяшек и канализационных труб. Я проверял каждый шаг в процессе написания, но всё равно где-то мог ошибиться — пишите, если какая-то часть инструкции не работает — попробую помочь разобраться.

Спасибо тем, кто дочитал!

© Habrahabr.ru