センサーデータをデータベースに保管して、後から使いたいというケースがあるかと思います。Node-REDを使ってセンサーデータを受け取り、Cloudantに格納する手順についてまとめます。
前提
IBM Bluemix上でボイラープレート「Node-RED Starter」、または、「Internet of Things Foundation」がデプロイされていることとします。
作業の流れ
- Cloudantにデータベースを作成する
- Node-REDを使ってセンサーデータをCloudantに保管するフローを作成する
- Cloudantにデータが保管されていることを確認する
1. Cloudantにデータベースを作成する
Bluemixのダッシュボードより、Node-REDのアプリケーションをクリックします。
右上にある起動をクリックし、Cloudantの管理コンソールを起動します。
Cloudant上にあるデータベースの一覧が表示されます。すでにnoderedというデータベースが存在していますが、これは、Node-REDがフローの格納などに利用するデータベースです。
ここでは、センサーデータ用に新規のデータベースを作成します。右上のAdd New Databaseをクリックします。
表示されるポップアップにデータベース名sensordataを入力しCreateをクリックします。
Cloudant上にセンサーデータを格納するためのデータベースを作成できました。
2. Node-REDを使ってセンサーデータをCloudantに保管するフローを作成する
Node-REDのフローエディターを使って、以下のフローを作成します。
以下の4つのノードを利用しています。
ノード | 用途 | |
---|---|---|
ibmiot(入力)ノード | センサーデータの入力受付 | |
functionノード | センサーデータの加工 | |
Cloudant(出力)ノード | Cloudantへのデータ格納 | |
Debugノード | センサーデータの加工結果確認 |
ibmiotノードの構成
ibmiotは、センサーシミュレーターを使用するように構成しています。
functionノードの構成
センサーデータにタイムスタンプを追加するスクリプトを埋め込んでいます。Node-RED小ワザ集の小ワザ2. センサーデータを加工してタイムスタンプを追加するを参照してください。
Cloudantノードの構成
Cloudantノードの設定は以下のとおりです。
設定項目 | 内容 |
---|---|
Service | Bluemix上に作成されたCloudantのサービス名を選択します |
Database | Cloudantに作成したデータベース名であるsensordataを入力します |
Operation | insertを選択します。センサーデータだけを格納するため、**Only store msg.payload object?**にチェックを入れています。 |
Name | ノードに付ける名前です。任意の値で問題ありません。 |
(参考)サンプルフローのインポート
以下のJSONを、Node-RED小ワザ集の小ワザ1. フローのインポートの方法を使ってインポートすることで、サンプルフローを復元できます。
[{"id":"a096f3c0.8b2af","type":"ibmiot in","authentication":"quickstart","apiKey":"","inputType":"evt","deviceId":"a910e6c629f2","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"Sensor Simulator","service":"quickstart","allDevices":"","allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":"","x":125,"y":114,"z":"56be2dc6.6f2e4c","wires":[["b35ec10c.df9bc"]]},{"id":"b35ec10c.df9bc","type":"function","name":"Convert Payload","func":"var getCurrentTime = function () {\n var date = new Date();\n date.setHours(date.getHours() + 9);\n var d = date.getFullYear() + '-';\n d += ('0' + (date.getMonth() + 1)).slice(-2) + '-';\n d += ('0' + date.getDate()).slice(-2) + 'T';\n d += ('0' + date.getHours()).slice(-2) + ':';\n d += ('0' + date.getMinutes()).slice(-2) + ':';\n d += ('0' + date.getSeconds()).slice(-2) + 'Z';\n return d;\n};\n\nmsg.payload = {\n \"timestamp\": getCurrentTime(),\n \"temp\": msg.payload.d.temp,\n \"humidity\": msg.payload.d.humidity,\n \"objectTemp\": msg.payload.d.objectTemp\n};\n\nreturn msg;","outputs":1,"valid":true,"x":326,"y":114,"z":"56be2dc6.6f2e4c","wires":[["2bd52b43.6ff1fc"]]},{"id":"2bd52b43.6ff1fc","type":"debug","name":"Check Output","active":false,"console":"false","complete":"payload","x":521,"y":114,"z":"56be2dc6.6f2e4c","wires":[]}]
フローのデプロイ
以上でフローの作成は完了です。フローエディター右上の をクリックして、フローをデプロイします。
Cloudantにデータが保管されていることを確認する
フローをデプロイした時点から、Cloudantへのデータ保管が開始されています。保管されたデータを確認します。
Cloudantの管理コンソールに戻ります。
左メニューバーのDatabasesをクリックし、データベースの一覧を表示します。sensordataデータベースのデータ数(# of Docs)の値が増えていることが確認できます。
sensordataをクリックして、保管されたデータを見てみます。
右側に保管されているデータの一覧が表示されるため、どれでもいいのでidの部分の文字列をクリックします。