Raspberry Pi で監視カメラ

Raspberry PiにUSBのWebCameraをつけて室内の監視カメラにしてみました。

WebCameraはこれ

LOGICOOL ウェブカム HD画質 120万画素 C270

LOGICOOL ウェブカム HD画質 120万画素 C270

アプリは motion.

sudo apt-get install motion

使い方はここを参考に設定しました。
Linux + motion + webcamでライブ監視カメラを設置する

設定ファイルは /etc/motion/motion.conf。
変更した設定はこのあたり。
#この記事を書くために見直していたらtimelapse撮影/動画生成もあるみたい

# 静止画(JPEG)はbest shotのみ保存。
output_normal best
# 別PCからWebCamera映像を見れるように
webcam_localhost off
# 制御は別PCからできるけどuser/passwordで制限をつける
control_localhost off
control_authentication user_name:password

これで
http://192.168.0.2:8081/ とかでWebCameraの映像が見れるようになります。

ただ、監視カメラの目的が自分が不在時の部屋の監視なので、自分が家にいるときは撮影しなくていい。
また、そのうちドメインを取って外部から見れるようにしたいので、なおさら自分が部屋にいるときは撮る必要がない。
# セキュリティ的な見直しは必要だけれども

そこで、「自分が部屋にいるか判定」にスマホBlueTooth接続の有無で判断するにした。
部屋にいるときは、motion を stop、いないときは motion を start させる。
まず、BlueToothアダプタはこれを購入。

PLANEX Bluetooth USBアダプター Ver.4.0+EDR/LE(省エネ設計)対応 BT-Micro4

PLANEX Bluetooth USBアダプター Ver.4.0+EDR/LE(省エネ設計)対応 BT-Micro4

インストールとスマホとのペアリングは、ここを参照して実施。特に問題なく完了。
Raspberry PiでBluetoothを扱う - Programming Log

自分で仕組みを作る前にぐぐってみると、デスクトップをオフ(スクリンセーバーモードに移行?)できるアプリはあった。ただ、今回の目的には使えなさそう。
第267回 Bluetoothデバイスで離席管理する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

「自分が部屋にいるか判定」にスマホBlueTooth接続の有無で判断する
のにどうすれば一番いいかよくわからないけど、
力技で l2ping でスマホBlueToothから応答があれば、部屋にいると判定して motion のプロセスを止めることにした。こんな感じ。これをrootのcronで適当な間隔で回す。

#!/bin/bash

# 実際はスマホのbluetoothアドレスを設定
bt_addr='XX:XX:XX:XX:XX:XX'

resp_bt=`l2ping ${bt_addr} -c 1|grep ' 0% loss'`

if [ ${#resp_bt} != 0 ]; then
        echo "bt remote device exist."
        service motion stop
else
        echo "bt remote device doesn't exist."
        resp_motion=`ps auxww|grep '^motion.*/usr/bin/motion'`
#       echo ${#resp_motion}

        if [ ${#resp_motion} = 0 ]; then
                echo "motion isn't running."
                service motion start
        else
                echo "motion is aleady running."
        fi
fi

# もっとスマートに書けると思うのだが...

2014/02/01 追記

  • if-else文の中身が逆になってた(orz)のを直しました。すいません。
  • /var/run/motion/motion.pid ファイルが存在している場合は、motion が起動していると判断する方がセオリーぽい。

2014/04/29 追記

  • l2pingだとなぜか反応がないことがあるのでhcitool nameに変更。自分の環境ではこっちの方が安定動作しています。
  • motionの起動チェックは、/var/run/motion/motion.pidの存在チェックに変更
#!/bin/bash

# 実際はスマホのbluetoothアドレスを設定
bt_addr='XX:XX:XX:XX:XX:XX'

#resp_bt=`l2ping ${bt_addr} -c 1|grep ' 0% loss'`
resp_bt=`hcitool name ${bt_addr}`
#echo ${#resp_bt}

if [ ${#resp_bt} != 0 ]; then
	echo "bt remote device exist."
	service motion stop
else
	echo "bt remote device doesn't exist."
#	resp_motion=`ps auxww|grep '^motion.*/usr/bin/motion'`
#	echo ${#resp_motion}

	if [ -e /var/run/motion/motion.pid ]; then
		echo "motion is aleady running."
	else
		echo "motion isn't running now."
		service motion start
	fi
fi