Raspberry Pi上の人感センサーの値(1 = 反応あり、0 = 反応なし)をPubNub上にpublishするスクリプト
いずれかの方法で依存モジュールをインストールする
$ sudo apt-get install python-dev python-pip
$ sudo python setup.py build
$ sudo pip install pubnub
$ sudo pip install rpi.gpio
setting.jsonを設定する
{
"group":"${グループ名}",
"publish_key":"${PubNubのpublish key}",
"subscribe_key":"${PubNubのsubscribe key}",
"id":"${ワークスペースのID}",
"floor":"${ワークスペースのフロア名}",
"name":"${ワークスペース名}",
"duration":${センサーを確認する間隔 int 秒},
"on_resistance":${0から1への変わりにくさ(抵抗値) 1以上のint},
"off_resistance":${1から0への変わりにくさ(抵抗値) 1以上のint},
"GPIO":{
"sensor_pin":${センサーが繋がっているGPIOのPIN番号 int}
}
}
duration=>1 , on_resistance=>1, off_resistance=>10と設定した場合、
- 1秒に1回センサーの値を確認する
- センサーの値が"0"から"1"に変わった場合、すぐに"在席"と判断する
- センサーの値が"1"から"0"に変わった場合、その後"0"が10回続いた場合に"不在"と判断する
- "0"が10回続く前にセンサーの値が"1"に変わった場合、抵抗はリセットされる。次に"0"に変わってからさらに10回"0"が続いた場合、不在と判断する
という挙動になる。
GPIOに"and"もしくは"or"を設定することで、複数センサーの合議で判断するよう設定できる。
例:GPIOの12番、13番のいずれかが"1"の場合(or)、"1"と見做す
{
"group":"${グループ名}",
"publish_key":"${PubNubのpublish key}",
"subscribe_key":"${PubNubのsubscribe key}",
"id":"${ワークスペースのID}",
"floor":"${ワークスペースのフロア名}",
"name":"${ワークスペース名}",
"duration":${センサーを確認する間隔 int 秒},
"on_resistance":${0から1への変わりにくさ(抵抗値) 1以上のint},
"off_resistance":${1から0への変わりにくさ(抵抗値) 1以上のint},
"GPIO":{
"or":[
{"sensor_pin":12},
{"sensor_pin":13}
]
}
}
src/workspacesensor.pyの6行目を編集
変更 sensor_pinを-1に設定するとスタブモード。ソースの修正不要
# GPIOと接続するためにはroot権限が必要
$ sudo sh ./start.sh
$ sudo sh ./stop.sh
クライアント(Publish) => センサー(Subscribe)
任意
このメッセージをセンサー側が受け取ると、下記wkstatus_${グループ名}にセンサーの状態をPublishする
センサー(Publish) => クライアント(Subscribe)
{
"floor":"${フロア名}",
"id":"${ワークスペースのID}",
"name":"${ワークスペース名}",
"status":${0 (人がいない=> 使用可) / 1 => (人がいる=> 使用中)}
}
上記plzcast_${グループ名}をセンサーが受け取った時及び人感センサーの値が変わったタイミングで、クライアントに向けて現在のセンサーの状態をPublishする