自己発電+BLE BeaconスイッチのSmart Button SwitchをRaspberry Pi Node-REDでBLE受信してみたメモです。
Smart Button Switchとは
今回使うのは、最近スイッチサイエンスから発売されたSmart Button Switchです。
このような説明がされています。
指でボタンを押したり離したりする振動で発電する自己発電ユニット「振力電池」に、BLE送信モジュールSPB-160001-Bを搭載した製品です。Bluetooth Low Energyによってデータを簡単に無線送信できます。
とのことで、EnOceanとはちょっと仕組みが違いますが、単体で押したときだけ自己発電した電力で、BLE Beaconを送るというおもしろいネタです。
ちなみに、購入時のサムネイルを見た限りだと、もうちょっと大きいかと思ったんですが、実物はRaspberry Piよりもちょっと小さいというコンパクトさも兼ね備えたデバイスでした!
まずテストしてみる
まず動作確認してみました。
Androidタブレットで、Bluetooth LE Scannerというツールで待ち受けてやってみます。
事前にSmart Button Switchのページにあるとおりで、QRコードからUUIDを読み取って確認しやすくしておきます。
こんな感じでUUIDがハイフンつきできます。この時点でテキストでも保存しておきましょう。Node-REDでの判別時に重要です。
なお、判別だけなら末端の数桁を見ておけば判別できます。
何度かボタンを押していると無事見つかりました!
ちょっと見つかりづらかったので、SCAN側のタイミングかなと思います。(Node-REDで取得してみると、キビキビ送られてきたので、そうわかりました)
Node-REDで受信してみる
Raspberry Pi 3 の Node-RED で読み込んでみます。
BLE Beaconを扱うにはnode-red-contrib-bleaconをノード追加します。
その上でこのようなフローを書きます。
フローは分かりやすい構造です。scanBeaconで受け入れたデータをJSON化し、さきほどのQRコードなりで把握した該当のuuidで絞り込んだ上で、BLEデータがかなり連続で受信されてしまうのをtriggerでデータ整理して 1 or 0 で、押した感覚通りにデータを流せるようにしています。
また、はじめscanBeaconは on という文字列で起動するということが分からなくて最初動作しなくてハマりました。このあたりはnode-red-contrib-bleaconにサンプルのフローがあり理解できました。
injectノード
injectノードの設定です。
起動時に on という文字列を送る形でscanBeaconノードを起こします。
scanBeaconノード
scanBeaconノードです。
なにも設定せず、周辺のBeaconデータをすべて受け入れます。
JSONノード → switchノード
JSONノードでデータをJSON化したあとにswitchノードでUUIDベースで絞り込みます。
JSON化して何度もボタンを押してみるとこのようなデータが来ます。UUIDが小文字になってハイフンがないものが来ています。
switchノードの設定に反映しましょう。
msg.payload.uuidを判別し、該当UUIDとそれ以外で分岐させています。画像では 1 のスイッチほうに、先ほどのJSONデータで分かったUUIDを小文字+ハイフンがなしで入力してます。
triggerノードの設定
この状態でボタンを何度も押すとかなり連続してデータが飛ばされます。なんとなく来るだけなら良いのですが、正確にボタンを押したという感覚に合ったものではありませんでした。なので、triggerノードでほどよくデータをせき止めて整理して、普段のボタンを押した感覚に近づけます。
このように設定します。これを置くだけで、ミリ秒レベルで連続でくるデータをいいかんじに整理できます。送信データを、扱いやすくするため、数字の1/0にしています。
これで、デプロイして動作確認してみましょう。
動作確認
ボタンを押してみます。
しっかり押したときに1として反応してくれます。0が来るタイミングは、現状では指を離した時ではなく、1が来てすぐに自動的に1が来る仕組みですが用途は満たしています。今回のデバイスのBLE Beaconデータはボタンを押したときの電力による「発信」に強いようなので、それに合わせています。
今回のNode-RED JSONフロー
今回のフローも置いておきます。
[ { "id": "d544062d.2ada98", "type": "inject", "z": "38f9aa23.c3e836", "name": "", "topic": "", "payload": "on", "payloadType": "str", "repeat": "", "crontab": "", "once": true, "x": 370, "y": 280, "wires": [ [ "c7fe3723.0e15c8" ] ] }, { "id": "237fa826.94b638", "type": "inject", "z": "38f9aa23.c3e836", "name": "", "topic": "", "payload": "off", "payloadType": "string", "repeat": "", "crontab": "", "once": false, "x": 370, "y": 360, "wires": [ [ "c7fe3723.0e15c8" ] ] }, { "id": "794d4ae8.c6c714", "type": "json", "z": "38f9aa23.c3e836", "name": "", "x": 690, "y": 320, "wires": [ [ "59c1adb3.50eb34" ] ] }, { "id": "c7fe3723.0e15c8", "type": "scanBeacon", "z": "38f9aa23.c3e836", "name": "", "beacon_uuid": "", "beacon_major": "", "beacon_minor": "", "x": 530, "y": 320, "wires": [ [ "794d4ae8.c6c714" ] ] }, { "id": "71b07090.605ee", "type": "debug", "z": "38f9aa23.c3e836", "name": "", "active": true, "console": "false", "complete": "false", "x": 1230, "y": 380, "wires": [] }, { "id": "59c1adb3.50eb34", "type": "switch", "z": "38f9aa23.c3e836", "name": "該当のuuid絞り込み", "property": "payload.uuid", "propertyType": "msg", "rules": [ { "t": "eq", "v": "uuid", "vt": "str" }, { "t": "else" } ], "checkall": "true", "outputs": 2, "x": 740, "y": 400, "wires": [ [ "b3d8bec9.f4d0b" ], [] ] }, { "id": "b3d8bec9.f4d0b", "type": "trigger", "z": "38f9aa23.c3e836", "op1": "1", "op2": "0", "op1type": "num", "op2type": "num", "duration": "250", "extend": false, "units": "ms", "reset": "", "name": "連続受信をほどよく整理 trigger", "x": 1010, "y": 380, "wires": [ [ "71b07090.605ee" ] ] }, { "id": "c7422692.e97648", "type": "comment", "z": "38f9aa23.c3e836", "name": "起動時にscanBeaconをONにする", "info": "", "x": 423, "y": 226, "wires": [] } ]
Raspberry Pi内のバージョン情報
基本的なバージョン情報は以下に記載しております。
2017年後半のRaspberry Pi関連の設定情報をまとめておくメモ – 1ft-seabass.jp.MEMO
まとめ
ということで、指でボタンを押したり離したりする振動で発電してデータを飛ばせるというSmart Button Switchを、Raspberry Pi Node-REDでBLE受信してみました。
これができると、BLE Beaconというメジャーな規格を使って、追加の電源を考えずに、自由に現実世界にきっかけを作ることが出来ます。Smart Button Switchのベース技術である振力発電のデバイスはほかにも色々あるようですので、この構造で応用がききそうですね。
それでは、よき Node-RED & IoT Lifeを!