Raspberry Pi CCTV Discord bot
Sup
Сегодня мы будем строить систему видеонаблюдения, которая будет присылать в дискорд смешные видосы (иногда с нашим участием) при обнаружении движения в охраняемой области.
Я использовал Raspberry Pi 3B+ и веб-камеру Logitech C270. Дополнительно на камере закреплена небольшая широкоугольная линза.
Motion
Для обнаружения движения на изображении с камеры используется пакет motion
.
$ yay -Sy motion
$ sudo systemctl enable motion.service
By the way I am using Archlinux. И обертку yay для pacman’а. В вашем любимом дистре команды установки пакетов могут быть другими.
И я предполагаю, что первоначальная настройка RPi уже выполнена — вы установили и обновили ОС и подключились к сети.
Приведу полностью свой /etc/motion/motion.conf
:
Описание опций можно посмотреть в документации к motion.
Так как видеофайл создается сразу же когда обнаружится движение, то прежде чем отправлять его, нам нужно дождаться, пока он будет создан полностью.
Для этого motion вызывает простой скрипт, перемещающий готовый файл в другую директорию, которую периодически проверяет бот.
Скрипт /opt/motion_scripts/mvfin.sh
:
Чтобы всё работало, motion должен иметь права на запись в директории /opt/CAM1
и /opt/FIN1
. А так же иметь права выполнять скрипт.
$ cd /opt && sudo mkdir CAM1 FIN1
$ sudo chown -R motion:video CAM1 FIN1 motion_scripts
$ sudo chmod -R o-rwx CAM1 FIN1 motion_scripts
$ sudo chmod g+w FIN1
$ sudo usermod -a video YourUserName $ ls -l
drwxr-x--- 2 motion video 3488 Oct 27 09:29 CAM1
drwxrwx--- 2 motion video 3488 Oct 27 09:29 FIN1
drwxr-x--- 2 motion video 3488 Oct 26 11:55 motion_scripts $ ls -l motion_scripts/mvfin.sh
-rwxr-x--- 1 motion video 61 Oct 26 11:55 motion_scripts/mvfin.sh
Бот, который будет запущен от обычного пользователя должен иметь право удалять файлы из директории /opt/FIN1
, поэтому её права установлены в 770, а мой пользователь добавлен в группу video
.
Теперь motion можно запускать и проверить, что в /opt/FIN1
появляются файлы.$ sudo systemctl start motion.service
Python
Для работы бота потребуется установить пакет discord.py$ yay -S python-discord
Возможно, вы предпочтёте создать venv и ставить пакеты pip’ом.
Создаем директорию ~/cctv
, и в ней два файла:
config.py
bot.py
Следуя инструкции, создаем бота, и пишем его токен в конфиг.
Создаем в дискорде сервер, в котором не будет никаких лишних участников. И добавляем текстовый канал для уведомлений от бота. ID этого канала тоже пишем в конфиг.
ID копируется через контекстное меню канала
Добавляем бота на созданный сервер, по той же инструкции.
Стартуем бота$ python ~/cctv/bot.py
Если всё сделано правильно, бот напишет свой логин в терминал и начнет отправлять в канал сообщения с видео, которые успели накопиться с запуска motion’a.
Сообщения будут приходить в канал, если
CHECKHOST
в сети не доступен.
Я это сделал, чтобы не получать видео когда нахожусь в мастерской.
Чтобы получать сообщения всегда, достаточно удалитьif
из функцииcheck_vid_task
Автозапуск
Чтобы бот стартовал сам после загрузки RPi создадим пользовательский юнит ~/.config/systemd/user/cctvbot.service
[Unit]
Description=CCTV Discord Bot[Service]
ExecStart=python /home/YourUserName/cctv/bot.py[Install]
WantedBy=default.target
Включаем его:
$ systemctl --user --now enable cctvbot.service
$ sudo loginctl enable-linger YourUserName
Еще для автозапуска можно использовать supervisor
Примеры работы
Заключение
Функционал бота можно при необходимости легко расширить.
Например, научить его реагировать на команды в канале, дёргать GPIO (а к нему подключить серву, соединенную со спуском арбалета >_>), воспроизводить записанный звуковой файл “Stop right there, criminal scum!”
Об этом когда-нибудь в другой раз.
Спасибо за внимание.