ソフトウエア編 その2 TS-WLCEへAPIでアクセスして静止画像を得るアプローチ
前回のTS-WLCEがトリガーしたタイミングで送られてくるメールを使う方法がいわばpush型の通知だとすると、今回述べるのはpull型のやり方です。つまり、割り込み処理ではなくポーリング(用語が古いですか?笑)です。ま、とにかくこちらのタイミングでTS-WLCEが今記録している画像を取ってきます。そのためには仕様書が必要ですが、IO-DATAさんはありがたいことに、ある程度きちんとした仕様書を発行してくれてます。まず、”IO-DATA ネットワークカメラ”とかのキーワードで検索すると、
が、見つかります(https://www.iodata.jp/product/lancam/lancam/)ので、右上の方の”カメラAPIダウンロード”をクリックし、以下のページへ進みます。
ここで左下のAPIダウンロードをクリック。色々と入力項目がありますが、最終的にはqwatch_api_v1_12.zipというファイルがダウンロードできます。静止画を取得するのに必要なAPIを記述した部分だけ抜き出すと、
となっていますから。Linuxからcurlを使って試してみましょう。
curl --digest -o /mnt/nas/images/now.jpg -u uname:passwd http://192.168.0.112/snapshot.jpg
uname:passwdの部分は実際のものに置き換えてください。あらかじめTS-WLCEの設定画面で登録しておくことが必要です。TS-WLCEのIPAddressも実際のものにしておきます。取ってきたばかりのnow.jpgを以下に示します。
郵便物の出現を検知するためには、画像の差分を取る必要がありますので、そのためにコマンドラインから実行可能な画像処理ないし解析パッケージで著名な ImageMagick を使います。その脆弱性が問題となる場面もあるようですから、気をつけて使います。Debianでのインストールは、packageがあるので、いつものaptから
apt install imagemagick
さて現行のシェルスクリプトは、前記事のカメラトリガーの場合の処理とは違い、役割分担をしています。カメラトリガーは明るい場面ないし時刻で確実に事象(郵便物到来、投函)を捉えているようですが、早朝薄暗い環境下ではトリガーしにくいようなので、その時間帯での動作を考えました。
基本動作は、30分毎に静止画を記録し、差分を取り、その明るさが一定閾値以上の場合に、notifyすることにしました。動作時間は、cronで、まずそのcrontab -lは、
0,30 4,5,6 * * * /home/nao/scr.sh >> /mnt/nas/images/diff.log 2> /dev/null
ここでのscr.shがシェルスクリプトの本体で、
#!/bin/bash
thresh=9500
tthresh=43200
ymd=`date +%s`
ymd2=`date +%s -r /mnt/nas/images/last.jpg`
timediff=$(expr $ymd - $ymd2)
if [ $timediff -gt $tthresh ]; then
echo "older file"
curl --digest -o /mnt/nas/images/now.jpg -u name:passwd http://192.168.0.112/snapshot.jpg
mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
else
curl --digest -o /mnt/nas/images/now.jpg -u name:passwd http://192.168.0.112/snapshot.jpg
cp /mnt/nas/images/now.jpg /mnt/nas/images/`date +"%I-%M-%S"`.jpg
composite -compose difference /mnt/nas/images/last.jpg /mnt/nas/images/now.jpg /mnt/nas/images/diff.jpg
cp /mnt/nas/images/diff.jpg /mnt/nas/images/diff-`date +"%d-%I-%M-%S"`.jpg
(date +"%m/%d %p %I:%M:%S"; identify -format "%[mean]" /mnt/nas/images/diff.jpg | awk '{printf("%d\n",$1 + 0.5)}') | paste - -
RETCODE=`identify -format "%[mean]" /mnt/nas/images/diff.jpg | awk '{printf("%d\n",$1 + 0.5)}'`
#echo $RETCODE
if [ $RETCODE -gt $thresh ]; then
curl -X POST -H "Authorization: Bearer yourtoken" -F "message=Alt: Detected something" -F "imageFile=@/mnt/nas/images/last.jpg" https://notify-api.line.me/api/notify 1> /dev/null 2> /dev/null
echo "trig'd"
fi
mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
fi
となってます。少し長いですが、imagemagickからはcompsiteやidentifyあと古典的awkも使っています。動作logも残しますので、今日のは、
older file
11/16 午前 04:30:02 1253
11/16 午前 05:00:01 1760
11/16 午前 05:30:01 1349
11/16 午前 06:00:01 1320
11/16 午前 06:30:01 14200
trig'd
6:30のタイミングで計算結果が閾値(9500)を超えたので、notifyしたということですね。6:00と6:30の画像の差分でトリガーしたということです。6:00のは、
6:30のは、
差分は、
でした。
コメント
[…] TS-WLCEをいじるプログラムないしスクリプトのシリーズで、少し前の静止画をcurlで得る回によると具体的なcurlのコマンドラインは、 […]