自家発電+BLE BeaconスイッチのSmart Button SwitchをRaspberry Pi Node-REDでBLE受信してみたメモ

自家発電+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を送るというおもしろいネタです。

image

ちなみに、購入時のサムネイルを見た限りだと、もうちょっと大きいかと思ったんですが、実物はRaspberry Piよりもちょっと小さいというコンパクトさも兼ね備えたデバイスでした!

まずテストしてみる

まず動作確認してみました。

image

Androidタブレットで、Bluetooth LE Scannerというツールで待ち受けてやってみます。

image

事前にSmart Button Switchのページにあるとおりで、QRコードからUUIDを読み取って確認しやすくしておきます。

image

image

こんな感じでUUIDがハイフンつきできます。この時点でテキストでも保存しておきましょう。Node-REDでの判別時に重要です。

image

なお、判別だけなら末端の数桁を見ておけば判別できます。

image

何度かボタンを押していると無事見つかりました!

ちょっと見つかりづらかったので、SCAN側のタイミングかなと思います。(Node-REDで取得してみると、キビキビ送られてきたので、そうわかりました)

Node-REDで受信してみる

Raspberry Pi 3 の Node-RED で読み込んでみます。

image

BLE Beaconを扱うにはnode-red-contrib-bleaconをノード追加します。

その上でこのようなフローを書きます。

image

フローは分かりやすい構造です。scanBeaconで受け入れたデータをJSON化し、さきほどのQRコードなりで把握した該当のuuidで絞り込んだ上で、BLEデータがかなり連続で受信されてしまうのをtriggerでデータ整理して 1 or 0 で、押した感覚通りにデータを流せるようにしています。

また、はじめscanBeaconは on という文字列で起動するということが分からなくて最初動作しなくてハマりました。このあたりはnode-red-contrib-bleaconにサンプルのフローがあり理解できました。

injectノード

image

injectノードの設定です。

image

起動時に on という文字列を送る形でscanBeaconノードを起こします。

scanBeaconノード

image

scanBeaconノードです。

image

なにも設定せず、周辺のBeaconデータをすべて受け入れます。

JSONノード → switchノード

image

JSONノードでデータをJSON化したあとにswitchノードでUUIDベースで絞り込みます。

image

JSON化して何度もボタンを押してみるとこのようなデータが来ます。UUIDが小文字になってハイフンがないものが来ています。

image

switchノードの設定に反映しましょう。

image

msg.payload.uuidを判別し、該当UUIDとそれ以外で分岐させています。画像では 1 のスイッチほうに、先ほどのJSONデータで分かったUUIDを小文字+ハイフンがなしで入力してます。

triggerノードの設定

image

この状態でボタンを何度も押すとかなり連続してデータが飛ばされます。なんとなく来るだけなら良いのですが、正確にボタンを押したという感覚に合ったものではありませんでした。なので、triggerノードでほどよくデータをせき止めて整理して、普段のボタンを押した感覚に近づけます。

image

このように設定します。これを置くだけで、ミリ秒レベルで連続でくるデータをいいかんじに整理できます。送信データを、扱いやすくするため、数字の1/0にしています。

これで、デプロイして動作確認してみましょう。

動作確認

image

ボタンを押してみます。

image

しっかり押したときに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": []
    }
]

まとめ

ということで、指でボタンを押したり離したりする振動で発電してデータを飛ばせるというSmart Button Switchを、Raspberry Pi Node-REDでBLE受信してみました。

これができると、BLE Beaconというメジャーな規格を使って、追加の電源を考えずに、自由に現実世界にきっかけを作ることが出来ます。Smart Button Switchのベース技術である振力発電のデバイスはほかにも色々あるようですので、この構造で応用がききそうですね。

それでは、よき Node-RED & IoT Lifeを!