概要
Slackにラズパイのhubotを常駐させておき、Slack上で写真撮影の指示を受けたらラズパイに接続されたカメラで写真を撮影する。
前提
- ラズパイにWebカメラを接続して写真を撮影できること
- ラズパイにhubotをインストールしてセットアップが済んでいること
- Slackにラズパイのhubotを連携させていること
過去のQiita
Raspberry PiにLogicool Webcam C270 を接続してカメラ画像を取得してみる
[Raspberry PiにhubotをインストールしてSlackから呼び出すまでの手順] (https://qiita.com/s_harada/items/c10b1322daec5521b261)
使用するハードウェア
- Raspberry Pi 2 Model B
- Logicool Webcam C270
使用するソフトウェア
- hubot
- fswebcam
ざっくりした処理の流れ
やるべきこと
- fswebcamで写真を撮影するシェルスクリプトを作成
- 写真撮影のシェルスクリプトを実行するcoffeeスクリプトを作成
fswebcamで写真を撮影するシェルスクリプトを作成
作成したシェルスクリプト
fswebcamに引数を渡せるようにしておく。
!/bin/sh
echo "fswebcam $@"
fswebcam $@
動作確認
take_photo.shを実行して写真を撮影できるか確認する。
写真撮影シェルスクリプトを実行するcoffeeスクリプトを作成
試作版スクリプト
いきなり難しいことをしようとすると躓くポイントが多いので、とりあえず写真撮影用のシェルスクリプトを実行して、実行結果の出力を返すだけのcoffeeスクリプトを作成してみる。
作成したcoffeeスクリプト
Node.jsでOSのコマンドを実行したい場合は、child_processのexecで実行するらしい。
module.exports = (robot) ->
robot.respond /写真撮って/i, (msg) ->
@exec = require('child_process').exec
command = "sudo -u pi sh ./scripts/sh/take_photo.sh 001.jpg"
msg.send "写真を撮ってるよ。ちょっと待ってね。"
msg.send "Command: #{command}"
@exec command, (error, stdout, stderr) ->
msg.send error if error?
msg.send stdout if stdout?
msg.send stderr if stderr?
動作確認
Raspberry Piでhubotを再起動し、Slackから動作確認をする。
現時点の問題としては。。。
- 写真のファイル名が001.jpg固定になっている。年月日時分秒などのユニークなファイル名にしたい。
- 写真の出力先がhubotのルートディレクトリになっている。写真保存用のディレクトリに保存したい。
- 写真のサイズがデフォルトのままになっている。もっと大きめに撮影してほしい。
- 写真を撮り終えたら、撮り終えたことをhubotから通知してほしい。
改善版スクリプト
上記の問題点を考慮して、改善版のスクリプトを作成してみた。
作成したcoffeeスクリプト
module.exports = (robot) ->
robot.respond /写真撮って/i, (msg) ->
# 写真ファイルのパスとファイル名を定義
dt = new Date()
year = dt.getFullYear()
month = ("0"+( dt.getMonth() + 1 )).slice(-2)
date = ("0"+dt.getDate()).slice(-2)
hour = ("0"+dt.getHours()).slice(-2)
min = ("0"+dt.getMinutes()).slice(-2)
sec = ("0"+dt.getSeconds()).slice(-2)
file_path = "/home/pi/Pictures/"
file_name = "#{year}#{month}#{date}#{hour}#{min}#{sec}.jpg"
# 写真の解像度を指定
resolution = "1280x720"
# fswebcamコマンドを実行
@exec = require('child_process').exec
command = "sudo -u pi sh ./scripts/sh/take_photo.sh -r #{resolution} #{file_path}#{file_name} "
msg.send "写真を撮ってるよ。ちょっと待ってね。"
# msg.send "Command: #{command}"
@exec command, (error, stdout, stderr) ->
if error != null
msg.send "写真撮影に失敗しちゃったよ。。。"
return;
msg.send "写真を撮ったよ。ファイル名は #{file_name} だよ。"
動作確認
Raspberry Piでhubotを再起動し、Slackから動作確認をする。
指定したパスに、年月日時分秒のファイル名で写真ファイルが作成できている。
coffeeスクリプトを書いているときの罠ポイント
JavaScriptと比べると、coffeeスクリプトの書き方はいろいろ異なるところがあるので注意。
今回作成した改善版スクリプトでちょっと嵌った罠ポイントとしては。。。
- if句に
()
や{}
は不要 - 関数の定義にはアロー演算子
->
を使用する - 日付の文字列フォーマットがよくわからん。。。
要勉強ですね。。。