Raspberry Pi CCTV Discord bot

m0nochr0me
3 min readOct 28, 2020

--

Raspberry Pi 3B+

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!”

Об этом когда-нибудь в другой раз.

Спасибо за внимание.

--

--

m0nochr0me
m0nochr0me

Written by m0nochr0me

Поделки из шишек и жёлудей

No responses yet