TS-WLCEで push 通知

ImageMagickで簡易画像処理を行い、差分を検出する試み

前記事

ではカメラ主導でのpush通知について述べましたが、スクリプト側からスナップショットを撮り、差分を計算して、一定の閾値以上であればDiscordで通知するようなことも可能です。

まず今のスナップショット(静止画)を得るのは、curlを使うと、

curl --digest -o /mnt/nas/images/now.jpg -u id:password http://192.168.0.82/snapshot.jpg

と書けます。id:passwordは読者のものを入れてください。カメラがTS-WLCE以外ならば、仕様書を参考に読み替えてください。だいたいこれで行けると思います。これで現在のディレクトリにsnapshot.jpgができます。ImageMagickにも色々なパッケージが含まれていますが、以下のスクリプトを使っています。差分を取るのは、

composite -compose difference /mnt/nas/images/last.jpg /mnt/nas/images/now.jpg /mnt/nas/images/diff.jpg

のところですね。

#!/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 id:password http://192.168.0.82/snapshot.jpg
        mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
else

curl --digest -o /mnt/nas/images/now.jpg -u id:password http://192.168.0.82/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 -s -o /dev/null https://discord.com/api/v10/channels/yourserver_channel/messages -H "Authorization:Bot MTM0NDE3MTM1MjQxMTg2NTA4OA.GUC08m.V4SwEdneuwlG5qOEYeQjBx1XHfc2tvzAfbVq3o" -H "Content-Type:multipart/form-data" -F "file=@\"/mnt/nas/images/last.jpg\"" -F "payload_json={\"content\":\"Detected something\"}"
        echo "trig'd"
fi
mv /mnt/nas/images/now.jpg /mnt/nas/images/last.jpg
fi

これをscr.shとすると、

0,30 4,5,6 * * * /home/nao/scr.sh >> /mnt/nas/images/diff.log 2> /dev/null

というように、毎朝4時、5時、6時の0分と30分に起動して、テキスト出力をnasの所定ディレクトリのdiff.logに追記するということになります。実際のlog(一部)とDiscordに送られてきたメッセージの例を以下に示します。

08/22 午前 04:30:01	2237
08/22 午前 05:00:01	3135
08/22 午前 05:30:01	27733
trig'd
08/22 午前 06:00:02	3193
08/22 午前 06:30:01	11677
trig'd
older file
08/23 午前 04:30:01	2111
08/23 午前 05:00:01	3581
08/23 午前 05:30:01	23932
trig'd
08/23 午前 06:00:01	3869
08/23 午前 06:30:01	2249

閾値は、9500なので、これを超えるとtrig’dになります。その時点でのsnapshotが、

こんなふうに送られてきます。

コメント