Делаем кормушку для птиц с автоподачей корма и автоматической отправкой видео себе в Телеграмм.
Идея
Прошлым летом многие мои друзья повесили у себя на окне прозрачные кормушки из оргстекла, которые массово стали появляться на алиекспрессе, да и в обычных магазинах. Глядя на их сториз в инстаче, я тоже захотел смотреть на птичек.
Но самому, тем более на даче, сделать прикольнее, и за вечер я довольно быстро её сваял. Насыпал семечек, а птицы не летят. С дачи пора уезжать, а птиц всё нет. Мне начали не давать покоя мысли "А что если птицы прилетят, когда меня не будет?". Просто залипать в веб-камеру и ждать так же как перед окном, только перед монитором, мне показалось странно. Во всех камерах давно уже есть датчики движения.
Познакомившись с россыпью китайских приложений для видеонаблюдения я понял, что хочу что-нибудь удобнее. Что может быть удобнее, чем привычный телеграмм, из которого я не вылезаю. Я нагуглил, что бот может отправлять видео, и сделал простейший скрипт, который при появлении в папке видео-файла отправляет его мне в личку.
Птицы стали прилетать, и это оказалось очень круто! Видео с птицами из интернета, не смотря на лучшее качество, это совсем другое, а тут понимаешь, что оно происходит прям у тебя на окне - это удивительное чувство. Мне захотелось делиться видосами! Я кидал их в чаты, в личку друзьям и репостил в свой бложик. Видосов становилось больше, и я понял, что утомлю всех ими - их надо выводить на отдельную площадку. Так почему бы не постить их сразу в публичный канал.
Получилась такая как бы веб-камера (видео приходят примерно через минуту после события), но только когда что-то происходит. Зачем смотреть на пустую кормушку, если можно наблюдать только за самым интересным?
Птиц становилось больше. Стакан корма они съедали за 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 updatesudo apt-get install net-tools mc jq
Смотрим командой ifconfig IP адрес и подцепляемся с компьютера, на котором открыта эта статья, с помощью Putty.
Ура, можно копировать строчки в консоль. Добавляем репозиторий Zoneminder-а, ну и ставим сам ZoneMinder:
sudo add-apt-repository ppa:iconnor/zoneminder-1.34sudo apt-get dist-upgradesudo apt-get updatesudo apt-get install zoneminder
Ждём пока установится, даём необходимые разрешения, настраиваем апач и перезапускаем его. Запускаем сам ZoneMinder:
sudo chmod 740 /etc/zm/zm.confsudo chown root:www-data /etc/zm/zm.confsudo chown -R www-data:www-data /usr/share/zoneminder/sudo a2enmod cgisudo a2enmod rewritesudo a2enconf zonemindersudo a2enmod expiressudo a2enmod headerssudo systemctl reload apache2sudo systemctl enable zonemindersudo systemctl start zoneminder
Если всё прошло успешно, то открываем в браузере (поменяйте IP на свой!): http://192.168.1.61/zm
Соглашаемся с лицензией и попадаем в основное окно:
Пока у нас тут нет ни одной камеры. Сперва настроим важные и не очень пункты.
Можно поменять язык в Option-System-Lang_default, но переведено там не так много всего. Там же надо выставить TimeZone.
В разделе Storage добавьте новое место для хранения видео. Например, в домашнем каталоге:
Не забываем создать саму папку и права к ней:
mkdir -p /home/user/zoneminder/ptichkisudo 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.sh
chat_id="1234567"api_url="http://personeltest.ru/aways/api.telegram.org/bot1234567890:AbCDefGH123456789ABCDEFGHabcdefghtg"videopath="/home/user/zoneminder/ptichki"api_max_attempts=1send_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 donedone
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 day30 19 * * * sudo zmpkg.pl night
Результат
Ну и в результате получился канал с бесконечными видео из кормушки:
Вот ссылка на канал со скромными 43мя подписчиками =) https://t.me/PtichenkiNaDachke Мне будет приятно, если о нём узнают. Хотя, конечно, никакой популярности я от него не жду. Сейчас там синицы, лазоревки, снегири, сойки, сороки, дятлы, дрозды, полевые воробьи, зеленушки и даже белка. На заднем плане бывает видно наблюдающего кота. Так же иногда я помечаю тегами названия птиц.
Птицы - это отдельный мир. Как-то до этого они меня не особенно интересовали, а тут открылось сразу столько всего!
Прошло уже три месяца, но до сих пор и я и друзья, подписанные на канал, всё ещё в восторге и постоянно обсуждают и пересылают забавные видосы.
Получилась бесконечная залипательная дзен-лента с короткими видео про птиц. Можно открыть в транспорте, в очереди или любой другой момент и залипать на птиц.
Со мной делились, что видео с птичками странным образом успокаивает.
И что мамы показывают малым детям на планшете, как живут птички.
Из минусов - это съедает довольно много трафика и места в телефоне. Пришлось вынести в закреп инструкцию, как не разориться на мобильном трафике и как сделать, чтобы птицы не съели всю память телефона.
Иногда я или моя девушка замечаем интересные моменты и редактируем их с тегом #избранное или если это новая птица, то с названием птицы. Если вы тоже увидите что-то интересное - присылайте в личку, я отмечу соответствующим тегом.
Косяки реализации
Замеченные мной недостатки в данной системе:
Если за минуту записывается больше одного видео, то ролики приходят в случайном порядке. Так себе. Если кто-то может помочь с исправлением скрипта - буду рад.
Включение/выключение камеры было бы здорово привязать к рассвету и закату, а не к конкретному времени - я его периодически подправляю руками.
Окно бликует! Блики иногда очень мешают. А ещё птицы пачкают окно и его раз в пару недель приходится мыть. Иногда я вешаю чёрную футболку, что бы бликов становилось меньше.
Птицы загадили подсолнечной шелухой весь участок. Под соседними кустами будто тусовка гопников, лузгающих семки годами, а вовсе не синиц.
Камера захватывает дорожку к дому и иногда детектирует людей - ну тоже такое. Не очень приятно, что это происходит в публичном канале.
Странная работа ZoneMinder-а с длинным событием в кадре. Иногда, когда птица долго тусуется в кормушке, он может посчитать это за одно событие и прислать длинный минутный ролик - это круто и удобно. Но чаще присылает десяток по 15 секунд. Я долго гуглил, но так и не понял, какие настройки за это отвечают. Если кто-то подскажет - буду очень рад!
Если в качестве камеры - мобильник, то с одной стороны изображение гораздо лучше, чем с камеры, заточенной под видеонаблюдение. С другой стороны - куча проблем: нужно реализовать автовключение при подаче питания (ведь на даче частенько пропадает свет). Но основное - низкое значение FPS. И виной этому - пропускная способность канала WiFi. Всё-таки наблюдать за шустрыми пернатыми на видео 5 кадров в секунду - так себе.
Идеи на будущее
Конечно же распознавание птиц и подпись с тегом под видео! Если мне кто-то подскажет как вкатиться в нейросети на слабом железе и с чего вообще начинать - буду рад.
Трансляция в ютуб - в общем то надо сесть и сделать. Хочется, чтобы она не прерывалась и всегда была по одной ссылке. А ночью автоматически ставилась заглушка. Надо лучше гуглить (буду рад подсказкам в комментариях)
Реализация на мобильнике - очень хочется всё это реализовать, например, на стареньком рутованом андроидофоне. В нём же уже есть всё, что надо. Тогда и не нужен отдельный сервер вовсе. И качество изображения будет гораздо выше. Но там очень много своих тонкостей. Кажется, без написания приложения не обойтись.
P.S.
Это первая моя статья на Хабре, так что строго не судите, да и вообще первый большой подробный туториал. Хотел разбить её на две, но странно было бы первой статьёй начинать с DIY деревяшек и канализационных труб. Я проверял каждый шаг в процессе написания, но всё равно где-то мог ошибиться - пишите, если какая-то часть инструкции не работает - попробую помочь разобраться.
Спасибо тем, кто дочитал!