ハムチャンが起きたらラズパイで動体検知してスラックに動画送信してニッコリ

こんにちは。マネックス・ラボの田中です。
私事ですが、先日ジャンガリアンハムスターをお迎えしました。

ハムスターは夜行性のため昼間は基本寝ているのですが、たまにご飯やトイレで起きてきます。
ケージの前でずっと張っていたら見られるのですが、そういうわけにもいかないので、起きた時を激写して通知するシステムを作れないか考えました。

結果、ラズパイとmotionで結構簡単に作れました。

目次

用意するもの

  • ハムスター
  • Raspberry Pi
  • 暗視カメラ

f:id:PonT:20211024141819j:plain

かわE 越して かわF やんけ!

ラズパイの設定

OS(私はRaspbianにしました)をダウンロードして、SDカードに書き込みます。
SDカードと暗視カメラをラズパイにセットします。

ラズパイの電源を入れて、設定>Raspberry Piの設定 でカメラを有効にします。
ついでにWi-fiも設定しておきます。

ラズパイを再起動したあとターミナルを起動して、以下のコマンドで写真を撮ってみます。

raspistill -o test.jpg

すると、写真が撮れましたが……?

f:id:PonT:20211024153406p:plain

写真が真っ黒!!なぜ!?……と思ったら、カメラカバーをしたまま撮ってました(ポンコツ
あと位置的にカメラが上下逆だったので、180度回転させて写真を撮ります。

raspistill -o test2.jpg -rot 180

ホームディレクトリに写真が保存されます。

f:id:PonT:20211024153816p:plain

暗視カメラなのでピンクな雰囲気になっていますが、無事に写真が撮影できることを確認しました。

motionの設定

以下のコマンドを実行します。

# アップデートの確認
sudo apt update
sudo apt upgrade
# motionをインストール
sudo apt install motion
# motionの設定ファイルを編集する
sudo nano /etc/motion/motion.conf

設定を以下のように変更します。

daemon on
norm 1
rotate 180
width 640
height 480
framerate 20
threshold 15000
event_gap 10
stream_localhost off
ffmpeg_video_codec mp4
on_movie_end ./etc/motion/upload.sh %f

ラズパイ起動時にmotionを起動するように設定します。

sudo nano /etc/rc.local
if [ "S_IP" ] ; then
  printf "My IP address is %s\n" "S_IP"
fi
motion &
exit 0

ラズパイを再起動して、カメラの前で動いてみます⊂二二二( ^ω^)二⊃

動体検知すると、/var/lib/motion 以下に動画が保存されます。

f:id:PonT:20211024160951p:plain

Slackの設定

まず、Slack APIのtokenを取得します。
https://api.slack.com/apps にアクセスし、「Create New App」ボタンをクリックします。
アプリの名前と追加するワークスペースを選択します。
左側のメニューから「OAuth & Permissions」を選び、「Bot Token Scopes」でfiles:writeを選びます。
「Install to Workspace」をクリックして許可すると、ワークスペースにアプリがインストールされ、tokenが発行されます。
インストールしたアプリをチャンネルに追加しておきます。

次に、curlでAPIを使えることを確認します。
先ほど撮った動画をアップロードしてみます。

curl -F "file=@/var/lib/motion/01-20211024255907.mp4" -F channels="mira-test" -H "Authorization: Bearer xoxb-XXXX-XXXX-XXXX" https://slack.com/api/files.upload

{"ok":true,"file":{"id":...」のように返ってきて、動画ファイルがアップロードされていたら成功です。

ラズパイから動画をSlackに投稿

motionの動画撮影したときに実行してくれるシェルスクリプト(on_movie_endで指定)を使って、Slackに動画をアップロードします。
Slackerやhubotを使ってもいいと思います。

以下のスクリプトファイル/etc/motion/upload.shにcurlの操作を書きます。

#!/bin/sh
#APIのトークン
SLACK_API_TOKEN=xoxb-XXXX-XXXX-XXXX
#アップロードしたいファイルのパス(motionから引数で渡される)
filepath=$1
#アプリを追加したチャンネルの名前
channels="mira-test"
# curl実行
curl -F "file=@${filepath}" -F channels="$channels" -H "Authorization: Bearer ${SLACK_API_TOKEN}" https://slack.com/api/files.upload

Slackを確認してみます。

f:id:PonT:20211024214605p:plain

あくびしてるところ、出てくるところ、帰っていくところなどが見られます!!
これで外出していても安心です。

オマケ

以下のような動画が撮影されます。

田中 妙佳システム開発部 マネックス・ラボ