Raspberry Piに接続したWebカメラで撮った画像をSlackに自動投稿する簡単な監視カメラシステムを作ってみます!
Webカメラで10分おきに撮影し、撮影日時と画像とSlackに投稿するシステムをラズパイに構築します。基本的にはラズパイでPythonを実行するだけでなのでとても簡単なシステムになってます。
実際にラズパイからSlackへ投稿された監視カメラの画像は下記になります。
10分おきに自動でラズパイで撮った写真がSlackに投稿されております。
ラズパイでWebカメラ撮影の設定
ラズパイでWebカメラで写真を撮影するのにPythonを使っても良いですが、OpenCVのインストールが少々面倒なので今回はfswebcam
を使って行います。詳しくは「Webカメラを接続する方法」をご覧ください。
コマンドで撮影確認
ひとまずは撮影ができることを確認します。ターミナルを起動してコマンドラインに下記を入力します。
$ fswebcam --no-banner -F -50 image.jpg
image.jpgが保存されていればOKです!
subprocess
のインストール
上記のターミナルコマンドをPythonから操作するためにsubprocess
をpip
でインストールしておきます。
$ pip3 install subprocess
Pythonで撮影確認
Pythonでsubprocess
を使ってターミナルを操作するには下記のようにすることで、ターミナルと同じ結果が得られます。
import subprocess
subprocess.run(['fswebcam', '--no-banner', '-F', '50', 'image.jpg'])
Slack投稿の設定
Webカメラで撮影した写真をラズパイからSlackに投稿をします。
Slack APIでAppを作成することで簡単にPythonを使ってラズパイからSlackにテキストや画像を投稿することができます。詳しくは「ラズパイでSlackに投稿する方法」をご覧ください。
今回は撮影した時の日時と画像を投稿することにします。
Pythonのコードを作成
ここまで設定が済んだらラズパイで撮影とSlack投稿をするプログラムをPythonで作成してみます。
基本はWhile文の無限ループの中でif分を使って時刻を10分刻みのときだけ撮影するし投稿する形になっております。
今回は撮影と投稿をPythonで行ったので10分ごとの判定もPythonで行いましたが、crontabなどと使えば一定時間ごとにプログラムを実行したりできるのでそちらでおこなっても良いと思います。
TokenとIDの設定
プログラムの下記の部分はご自身の環境に合わせて設定をしてください。
token = 'Slack App Token' # 作成したAppのToken
channel = 'channel ID' # Slack ChannelのID
Pythonコードの保存
今回はsecuritycamera.pyという名前でプログラムを保存しました。
from timeit import default_timer
import requests
import subprocess
from pathlib import Path
import time
import datetime
class SecurityCamera:
def __init__(self, token, channel):
self.token = token
self.channel = channel
def send_message(self, text):
url = "https://slack.com/api/chat.postMessage"
data = {
"token": self.token,
"channel": self.channel,
"text": text
}
requests.post(url, data=data)
def send_picture(self, imgpath):
url = "https://slack.com/api/files.upload"
data = {
"token": self.token,
"channels": self.channel,
# "initial_comment": "This is a cat"
}
files = {'file': open(str(imgpath), 'rb')}
requests.post(url, data=data, files=files)
def capture(self):
subprocess.run(['fswebcam', '--no-banner', '-F', '50', str(Path(__file__).parent.joinpath('image.jpg'))])
if __name__ == '__main__':
time.sleep(30) # wait time for stand up raspi system
token = 'Slack App Token' # 作成したAppのToken
channel = 'channel ID' # Slack ChannelのID
cam = SecurityCamera(token=token, channel=channel) # インスタンス
cam.send_message('起動') # 起動メッセージ送信
try:
while(True): # 無限ループ
dt_now = datetime.datetime.now() # 現在時刻の取得
if dt_now.minute%10==0 and dt_now.second==0: # 10分おきの条件分岐
cam.send_message(dt_now.strftime('%Y年%m月%d日 %H:%M:%S')) # 撮影時刻をメッセージ送信
cam.capture() # 画像撮影
cam.send_picture(Path(__file__).parent.joinpath('image.jpg')) # 画像送信
time.sleep(30)
except KeyboardInterrupt:
print('stop!')
cam.send_message('停止') #停止メッセージ送信
プログラムの動作確認
動作確認のためにターミナルを起動してコマンドラインに入力します。
$ python3 securitycamera.py
Slackに「起動」のメッセージが投稿され、時刻が10分刻みに画像が投稿されます。またCtrl + C
でプログラムを停止することができ、「停止」とSlackにメッセージが投稿されます。
これでほぼ完成です。しかしこのままでは監視カメラシステムを実行するためにはターミナルにコマンドを打ち込む必要があります。あとはラズパイに電源を入れたら自動的にプログラムが実行されるように設定を行います。
スタートアップの設定
最後にRaspberry Piの電源を入れたら監視カメラのシステムが起動するように設定を行います。今回はcrontabを使ってラズパイ起動したときにPythonのプログラムが実行されるように設定を行います。
シェルスクリプトを作成
ソースファイルのあるディレクトリに移動してからPythonを叩く流れをシェルスクリプトに書きます。作成したシェルスクリプトはsecuritycamera.shとしユーザー直下に保存します。
cd /home/pi/project
python3 securitycamera.py
crontabの設定
ターミナルを起動してコマンドラインに下記を入力し、crontabの設定を行います。
$ crontab -e
設定に下記を記載します。
@reboot bash securitycamera.sh
先ほど作成したシェルスクリプトをラズパイ起動時に実行する命令になります。
設定が反映されているか確認します。
$ crontab -l
@reboot bash securitycamera.sh
あとはラズパイを再起動させればプログラムが実行されます。先ほどと同じようにSlackに「起動」メッセージが投稿され、10分ごとに画像が投稿されます。
終了したい場合はラズパイの電源を落とすだけでOKです!
まとめ
今回はRaspberry PiでSlackに自動投稿する監視カメラを実装してみました。
ペットがいる方は外出中のペットの様子を定点観測することができたりしますね!
ラズパイ初心者の私でも簡単に作れたので良かったです!Slack APIの設定など少し手間はかかりますが、一度設定してしまえば他のシステムにも使えたりするので幅が広がります!
まだまだラズパイでやれることはたくさんあるのでチャレンジしてみようと思います。
コメント