「Advent Calendar」という言葉ですが、私は中学生の頃にヨースタイン・ゴルデル著の「アドヴェント・カレンダー 24日間の不思議な旅」という本を読んで初めて知りました。内容が面白かったのもありますが、この本をきっかけに実際にAdvent Calendarを買った思い出もあり、私の中では強く記憶に残っている言葉です。
さて、今回はNode-REDの話です。
先日ぷらっとホーム社のOpenBlocks IoT EX1を購入しました。弊社のKEYAKIにデータをアップロードするためにLinux用のSDKを入れようとしたのですが、OpenBlocks の管理がWebUIから実施し易かったこともあり、できるだけブラウザだけで設定を完結させるべく、Node-REDを使用してKEYAKIにデータをアップロードしてみました。
ブラウザ上でNodeと呼ばれる機能を繋ぐだけで、Node.jsアプリの開発ができるプログラミングツールです。
Node-Red公式:https://nodered.org/
インターネット上でも記事が多いので、Node-REDの詳細についてはここでは省きます。
OpenBlocksのNode.js、Node-REDを使用するのですが、デフォルトのバージョンが低かったため(できるだけブラウザだけで設定を完結させるといっておきながら)手動でバージョンアップしています。
インストールしたバージョンはNode.js:v8.9.1、Node-RED:v0.17.5になります。
それでは、手元にあったビーコンのデータをKEYAKIにアップロードしてみようと思います。
まずは、完成系から。
説明すると、
取得するデータによって2パターンに分けており、
1.Immidiate、Near、Farのデータ:scanBeaconノードを使用して取得
2.In、Outのデータ:OpenBlocksのデータ収集>ビーコンの送信設定で設定可能な「インアウトステータストランスファー」を使用して取得
OpenBlocksでNode-REDと連携する場合は、プロセス間通信を使用するため、IPCノードを使用しています。
KEYAKIとはHTTP(S)で通信するのですが、BODYには最低限以下のデータがJSON形式で含まれている必要があります。
・Immidiate、Near、Far、In、Outのデータ
・UUID、major、minorのデータ
・ビーコンのデータを示すフラグデータ
上記のデータをAPIの形式に合わせて変更するために、jsonノード、switchノード(フィルター代わり)、changeノードなどを組み合わせてデータを加工しています。Outのデータはタイミングによって取得できる情報が異なるため、switchノードで分岐させてそれぞれ処理しています。
Node-REDのv0.16からchangeノードとswichノードで使用できるようになったJSONataと呼ばれるツールが優秀で、データの加工部分は本ツールにかなり頼っています。
HTTP(S)のヘッダーにKEYAKIのAPIキーを追加して、http requestノードにてKEYAKIにPOSTします。
実際にKEYAKIアップロードするのはHTTP(S)のPOST部分だけではあるのですが、データの加工などを考慮しても簡単に実装できました。
もう少し使い込んでみると、もっとシンプルに書けるような気がします。
別センサーでも直ぐに対応できるようにしてみたいですね。
『CRESCO Advent Calendar 2017』 18日目もお楽しみに!