Node-REDを使ってKEYAKIにデータをアップロードした話

この記事は 『CRESCO Advent Calendar 2017』 17日目の記事です。

こんにちは、データアナリティクスチームのハガーです。

「Advent Calendar」という言葉ですが、私は中学生の頃にヨースタインゴルデル著の「アドヴェント・カレンダー 24日間の不思議な旅」という本を読んで初めて知りました。内容が面白かったのもありますが、この本をきっかけに実際にAdvent Calendarを買った思い出もあり、私の中では強く記憶に残っている言葉です。

さて、今回はNode-REDの話です。

先日ぷらっとホーム社のOpenBlocks IoT EX1を購入しました。弊社のKEYAKIにデータをアップロードするためにLinux用のSDKを入れようとしたのですが、OpenBlocks の管理がWebUIから実施し易かったこともあり、できるだけブラウザだけで設定を完結させるべく、Node-REDを使用してKEYAKIにデータをアップロードしてみました。

Node-REDとは

ブラウザ上で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とは

弊社が提供しているIoTプラットフォームとなります。

前回ちょろっと書いた記事はこちら。

KEYAKIとElastic Stackを連携してみた

Node-REDで実際に描いてみた

それでは、手元にあったビーコンのデータをKEYAKIにアップロードしてみようと思います。

まずは、完成系から。

説明すると、

①Beaconへ接続して情報を取得する部分

取得するデータによって2パターンに分けており、

1.Immidiate、Near、Farのデータ:scanBeaconノードを使用して取得

2.In、Outのデータ:OpenBlocksのデータ収集>ビーコンの送信設定で設定可能な「インアウトステータストランスファー」を使用して取得

OpenBlocksでNode-REDと連携する場合は、プロセス間通信を使用するため、IPCノードを使用しています。

②KEYAKIのAPIに合わせてデータを加工する部分

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と呼ばれるツールが優秀で、データの加工部分は本ツールにかなり頼っています。

③KEYAKIのAPIキーを追加して、データをアップロードする部分

HTTP(S)のヘッダーにKEYAKIのAPIキーを追加して、http requestノードにてKEYAKIにPOSTします。

まとめ

実際にKEYAKIアップロードするのはHTTP(S)のPOST部分だけではあるのですが、データの加工などを考慮しても簡単に実装できました。

もう少し使い込んでみると、もっとシンプルに書けるような気がします。

別センサーでも直ぐに対応できるようにしてみたいですね。

 

『CRESCO Advent Calendar 2017』 18日目もお楽しみに!