こんにちは。マネックス・ラボの田中です。
私事ですが、先日ジャンガリアンハムスターをお迎えしました。
ハムスターは夜行性のため昼間は基本寝ているのですが、たまにご飯やトイレで起きてきます。
ケージの前でずっと張っていたら見られるのですが、そういうわけにもいかないので、起きた時を激写して通知するシステムを作れないか考えました。
結果、ラズパイとmotionで結構簡単に作れました。
目次
用意するもの
- ハムスター
- Raspberry Pi
- 暗視カメラ
ラズパイの設定
OS(私はRaspbianにしました)をダウンロードして、SDカードに書き込みます。
SDカードと暗視カメラをラズパイにセットします。
ラズパイの電源を入れて、設定>Raspberry Piの設定 でカメラを有効にします。
ついでにWi-fiも設定しておきます。
ラズパイを再起動したあとターミナルを起動して、以下のコマンドで写真を撮ってみます。
raspistill -o test.jpg
すると、写真が撮れましたが……?
写真が真っ黒!!なぜ!?……と思ったら、カメラカバーをしたまま撮ってました(ポンコツ)
あと位置的にカメラが上下逆だったので、180度回転させて写真を撮ります。
raspistill -o test2.jpg -rot 180
ホームディレクトリに写真が保存されます。
暗視カメラなのでピンクな雰囲気になっていますが、無事に写真が撮影できることを確認しました。
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 以下に動画が保存されます。
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を確認してみます。
あくびしてるところ、出てくるところ、帰っていくところなどが見られます!!
これで外出していても安心です。
オマケ
以下のような動画が撮影されます。