Кормушка с видео в ленте телеграмма
Делаем кормушку для птиц с автоподачей корма и автоматической отправкой видео себе в Телеграмм.
Идея
Прошлым летом многие мои друзья повесили у себя на окне прозрачные кормушки из оргстекла, которые массово стали появляться на алиекспрессе, да и в обычных магазинах. Глядя на их сториз в инстаче, я тоже захотел смотреть на птичек.
Но самому, тем более на даче, сделать прикольнее, и за вечер я довольно быстро её сваял. Насыпал семечек, а птицы не летят. С дачи пора уезжать, а птиц всё нет. Мне начали не давать покоя мысли «А что если птицы прилетят, когда меня не будет?». Просто залипать в веб-камеру и ждать так же как перед окном, только перед монитором, мне показалось странно. Во всех камерах давно уже есть датчики движения.
Познакомившись с россыпью китайских приложений для видеонаблюдения я понял, что хочу что-нибудь удобнее. Что может быть удобнее, чем привычный телеграмм, из которого я не вылезаю. Я нагуглил, что бот может отправлять видео, и сделал простейший скрипт, который при появлении в папке видео-файла отправляет его мне в личку.
Птицы стали прилетать, и это оказалось очень круто! Видео с птицами из интернета, не смотря на лучшее качество, это совсем другое, а тут понимаешь, что оно происходит прям у тебя на окне — это удивительное чувство. Мне захотелось делиться видосами! Я кидал их в чаты, в личку друзьям и репостил в свой бложик. Видосов становилось больше, и я понял, что утомлю всех ими — их надо выводить на отдельную площадку. Так почему бы не постить их сразу в публичный канал.
Получилась такая как бы веб-камера (видео приходят примерно через минуту после события), но только когда что-то происходит. Зачем смотреть на пустую кормушку, если можно наблюдать только за самым интересным?
Птиц становилось больше. Стакан корма они съедали за 2 дня. Я уезжал с дачи и смотрел как птицы прилетают в пустую кормушку — это было невыносимо. Раз уж я автоматизировал просмотр, то автоматизировать надо и подачу корма. Была собрана первая версия на ESP8266 и серво-приводе. И заодно измерением уровня корма в контейнере. Корм в ней периодически всё равно застревал и уровень корма больше был похож на рандом.
Автоподачу было решено переделать на аналоговую. Из канализационных труб (я как раз присмотрел беленькие, в цвет кормушки). Теперь в неё входит 3 килограмма семечек и этого хватает примерно на 2 недели.
В морозы птиц стало ОЧЕНЬ много. 3–4 тысячи (!) видео в день и килограмм корма за 2 дня. Благо морозы продержались не долго. 90% видео — синицы. Так что следующая, пока не реализованная, идея — прикрутить нейросеть, которая бы уведомляла о новой незнакомой птице, потому что просматривать такое количество видео стало просто нереальным.
Изготовление кормушки
Я почитал в интернете советы какой должна быть идеальная кормушка, сделал поправки на то что она будет висеть на окне и в голове у меня нарисовалась вот такая картинка:
Покрутить в 3Д и посмотреть размеры можно вот здесь: https://a360.co/3rsSLRZ
Что понадобится:
Ножовка и стусло (или торцовка)
Доски шириной 120 и 150 мм
Рейка 2×3
Уголок 20×20 (можно заменить шпатиком)
Клей ПВА
4 самореза длинной 50–70 мм
Шуруповёрт
Свёрла по дереву 2 и 4 мм
Как раз у меня в хозяйстве появилась торцовка. С ней пилить доски — одно удовольствие. Но ножовку и стусло никто не отменял. Я напилил досок в размер, углы ставил 22.5 — так мне показалось изящнее всего. Сперва склеиваем две половинки крыши с помощью ПВА. Рейки к основанию и к крыше приклеил на ПВА и дополнительно посадил на саморезы (предварительно не забудьте просверлить 4 мм дырки в основании и крыше и 2 мм — в рейках). Уголок просто приклеил на ПВА.
Далее слегка пошкурил и покрасил белой морилкой, просто потому что она у меня была. Получилось симпатично (сорри, фото после покраски не сделал).
подбор вариантов как крепитьПрисоска — плохой вариант — она на ней сползает по стеклу. Так что снаружи верёвка крепится на крючочек, вкрученный в раму. Этого крепления оказалось достаточно. От рендера отличается дополнительным уголком сверху — он защищает стык (вообще то не от чего там защищать), но скорее является просто декоративным. И торцы крыши я тоже сделал под небольшим углом
Чем кормить, сколько ждать птиц?
Подсолнечные семечки — самое любимое их лакомство. И самое доступное (85р/кило на момент публикации) — продаются в овощных ларьках и на рынке, только обязательно уточняйте, не жареные и не солёные ли они.
Из кружки раз в день или по возможности я досыпаю смесь всех круп, что нахожу в доме — перловка (её особенно любят сойки и дрозды), геркулес, рис, гречка, пшено.
Можно повесить кусок сала на длинном саморезе. Оно висело у меня в кормушке, но имело довольно неприглядный вид — я перевесил напротив в зоне видимости кормушки, но зато очень смешно синицы висят на нём к верху ногами.
Отдельно на небольшом отдалении у меня висит лущилка с очищенным не жареным, не солёным арахисом.
Чем больше разнообразного корма, тем больше птиц заинтересуются кормушкой.
Птицы находят кормушку не сразу. Синицы у меня прилетели первые, на следующий день буквально. Сойки тоже прочухали почти сразу — день на третий. С трудом помещаясь в кормушку иногда залетают сороки. Довольно быстро появилась дроздиха — очень странно, она вообще то должна была улететь на юг, но кормилась у меня каждый день, пока не настало тепло. А вот снегирей мы ждали очень долго (хотя у соседей их было полно) — месяца 2. Так же месяца два назад стал регулярно прилетать дятел. И буквально на днях стали залетать сперва полевые воробьи (всегда парочкой), а затем и зеленушки (тоже парой).
Самой большой неожиданностью для нас явилась белка — она очень ловко забирается по наличникам и рамам и подолгу сидит на коньке крыши кормушки — как резная =)
Автоподача корма
Версию с ESP и сервоприводом показывать мне стыдно, так что сразу финальная аналоговая версия:
Для этого нам понадобятся фановые трубы:
Длинная 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-камера
Старый комп или 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
Соглашаемся с лицензией и попадаем в основное окно:
Пока у нас тут нет ни одной камеры. Сперва настроим важные и не очень пункты.
Можно поменять язык в Option-System-Lang_default, но переведено там не так много всего. Там же надо выставить TimeZone.
В разделе Storage добавьте новое место для хранения видео. Например, в домашнем каталоге:
Не забываем создать саму папку и права к ней:
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, устанавливаем предложенную надстройку, перезагружаем страницу, логинимся.
Можно ещё в сетевых службах попробовать поискать. Вот с такими настройками работает:
Открываем настройки по IP адресу в Internet Explorer, логинимся:
Возвращаемся в ZoneMinder, в главном окне (Сервер) нажимаем «Добавить монитор». Пробуем искать — в правом верхнем углу открывшегося окна нажимаем «Поиск ONVIF». Тут есть особенность: если окно открылось сразу — значит он даже не пробовал искать. Закрываем и нажимаем ещё раз. Если задумался — то ищет. И скорее всего найдёт. Если нет — можете попробовать проверить — установить на комп onvif device manager и поискать им.
Выбираем нашу камеру с профилем 1.2 и потоком MainStream. Он откроет новое, уже заполненное окно (старое можно закрыть), где выбирайте режим Modect — это и есть детектор движения. И важно выбрать нужное на вкладке Storage:
Если поиск 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. Его надо запомнить:
Можно проверить отправку себе сообщения так же из браузера: 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:
Структура папок: 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.shchat_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:
Затем в главном окне клик на функции камеры (слово modect) и снимаем галку с «Включён». Сохраняем:
Снова идём в меню состояния сервера (надпись «Выполняется») и сохраняем новый режим работы, обозвав его, например, night.
Сейчас в Петербурге светает примерно в 6:30, а темнеет в 19:30. Мы снова открываем sudo crontab -e и заносим туда строчки:
30 6 * * * sudo zmpkg.pl day
30 19 * * * sudo zmpkg.pl night
Результат
Ну и в результате получился канал с бесконечными видео из кормушки:
Вот ссылка на канал со скромными 43 мя подписчиками =) https://t.me/PtichenkiNaDachke Мне будет приятно, если о нём узнают. Хотя, конечно, никакой популярности я от него не жду. Сейчас там синицы, лазоревки, снегири, сойки, сороки, дятлы, дрозды, полевые воробьи, зеленушки и даже белка. На заднем плане бывает видно наблюдающего кота. Так же иногда я помечаю тегами названия птиц.
Птицы — это отдельный мир. Как-то до этого они меня не особенно интересовали, а тут открылось сразу столько всего!
Прошло уже три месяца, но до сих пор и я и друзья, подписанные на канал, всё ещё в восторге и постоянно обсуждают и пересылают забавные видосы.
Получилась бесконечная залипательная дзен-лента с короткими видео про птиц. Можно открыть в транспорте, в очереди или любой другой момент и залипать на птиц.
Со мной делились, что видео с птичками странным образом успокаивает.
И что мамы показывают малым детям на планшете, как живут птички.
Из минусов — это съедает довольно много трафика и места в телефоне. Пришлось вынести в закреп инструкцию, как не разориться на мобильном трафике и как сделать, чтобы птицы не съели всю память телефона.
Иногда я или моя девушка замечаем интересные моменты и редактируем их с тегом #избранное или если это новая птица, то с названием птицы. Если вы тоже увидите что-то интересное — присылайте в личку, я отмечу соответствующим тегом.
Косяки реализации
Замеченные мной недостатки в данной системе:
Если за минуту записывается больше одного видео, то ролики приходят в случайном порядке. Так себе. Если кто-то может помочь с исправлением скрипта — буду рад.
Включение/выключение камеры было бы здорово привязать к рассвету и закату, а не к конкретному времени — я его периодически подправляю руками.
Окно бликует! Блики иногда очень мешают. А ещё птицы пачкают окно и его раз в пару недель приходится мыть. Иногда я вешаю чёрную футболку, что бы бликов становилось меньше.
Птицы загадили подсолнечной шелухой весь участок. Под соседними кустами будто тусовка гопников, лузгающих семки годами, а вовсе не синиц.
Камера захватывает дорожку к дому и иногда детектирует людей — ну тоже такое. Не очень приятно, что это происходит в публичном канале.
Странная работа ZoneMinder-а с длинным событием в кадре. Иногда, когда птица долго тусуется в кормушке, он может посчитать это за одно событие и прислать длинный минутный ролик — это круто и удобно. Но чаще присылает десяток по 15 секунд. Я долго гуглил, но так и не понял, какие настройки за это отвечают. Если кто-то подскажет — буду очень рад!
Если в качестве камеры — мобильник, то с одной стороны изображение гораздо лучше, чем с камеры, заточенной под видеонаблюдение. С другой стороны — куча проблем: нужно реализовать автовключение при подаче питания (ведь на даче частенько пропадает свет). Но основное — низкое значение FPS. И виной этому — пропускная способность канала WiFi. Всё-таки наблюдать за шустрыми пернатыми на видео 5 кадров в секунду — так себе.
Идеи на будущее
Конечно же распознавание птиц и подпись с тегом под видео! Если мне кто-то подскажет как вкатиться в нейросети на слабом железе и с чего вообще начинать — буду рад.
Трансляция в ютуб — в общем то надо сесть и сделать. Хочется, чтобы она не прерывалась и всегда была по одной ссылке. А ночью автоматически ставилась заглушка. Надо лучше гуглить (буду рад подсказкам в комментариях)
Реализация на мобильнике — очень хочется всё это реализовать, например, на стареньком рутованом андроидофоне. В нём же уже есть всё, что надо. Тогда и не нужен отдельный сервер вовсе. И качество изображения будет гораздо выше. Но там очень много своих тонкостей. Кажется, без написания приложения не обойтись.
P.S.
Это первая моя статья на Хабре, так что строго не судите, да и вообще первый большой подробный туториал. Хотел разбить её на две, но странно было бы первой статьёй начинать с DIY деревяшек и канализационных труб. Я проверял каждый шаг в процессе написания, но всё равно где-то мог ошибиться — пишите, если какая-то часть инструкции не работает — попробую помочь разобраться.
Спасибо тем, кто дочитал!