Node-REDを使ってセンサーデータをCloudantに格納する

センサーデータをデータベースに保管して、後から使いたいというケースがあるかと思います。[Node-RED](http://nodered.org/)を使ってセンサーデータを受け取り、Cloudantに格納する手順についてまとめます。

## 前提
IBM Bluemix上でボイラープレート「Node-RED Starter」、または、「Internet of Things Foundation」がデプロイされていることとします。

## 作業の流れ
1. Cloudantにデータベースを作成する
2. Node-REDを使ってセンサーデータをCloudantに保管するフローを作成する
3. Cloudantにデータが保管されていることを確認する

## 1. Cloudantにデータベースを作成する
Bluemixのダッシュボードより、Node-REDのアプリケーションをクリックします。
![nodered-cloudant01.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/c66439a7-3e7f-1207-6b0d-4002f358fe7c.jpeg)

**Cloudant NoSQL DB**をクリックします。
![nodered-cloudant02.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/330e284f-9fc3-d538-f092-a475dc5ce045.jpeg)

右上にある**起動**をクリックし、Cloudantの管理コンソールを起動します。
![nodered-cloudant03.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/6d70d382-030f-a3c1-79fc-42662eaf43b6.jpeg)

Cloudant上にあるデータベースの一覧が表示されます。すでに*nodered*というデータベースが存在していますが、これは、Node-REDがフローの格納などに利用するデータベースです。
ここでは、センサーデータ用に新規のデータベースを作成します。右上の**Add New Database**をクリックします。
![nodered-cloudant04.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/917e08a8-c410-4cc9-4b43-1d362e03ede4.jpeg)

表示されるポップアップにデータベース名*sensordata*を入力し**Create**をクリックします。
![nodered-cloudant05.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/6f6bdc47-eaf5-98b4-79b4-d5c5ae1d064a.jpeg)

Cloudant上にセンサーデータを格納するためのデータベースを作成できました。

## 2. Node-REDを使ってセンサーデータをCloudantに保管するフローを作成する
Node-REDのフローエディターを使って、以下のフローを作成します。
![nodered-cloudant06.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/95f6e1a2-749e-6f93-cce7-3906616aeffa.jpeg)

以下の4つのノードを利用しています。

| ノード |  | 用途 |
|:--|:-:|:--|
|ibmiot（入力）ノード | ![nodered-ibmiot-input.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/cead87a6-4133-235c-8937-45e0f2dbe469.jpeg) | センサーデータの入力受付 |
| functionノード | ![nodered-function.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/b1d5e723-95bc-af84-b0de-e18ed6f2c25b.jpeg) | センサーデータの加工 |
| Cloudant（出力）ノード | ![nodered-cloudant-output.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/360ea226-18bc-4058-51a9-f8ecea5b41b0.jpeg) | Cloudantへのデータ格納 |
| Debugノード | ![nodered-debug.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/449ea1c7-f145-1318-2901-afb4a7afc6d1.jpeg) | センサーデータの加工結果確認 |

### ibmiotノードの構成
ibmiotは、[センサーシミュレーター](https://quickstart.internetofthings.ibmcloud.com/iotsensor/)を使用するように構成しています。

### functionノードの構成
センサーデータにタイムスタンプを追加するスクリプトを埋め込んでいます。[Node-RED小ワザ集](http://qiita.com/asmanabu/items/d9ba9ff0fca745c8c216)の[小ワザ2. センサーデータを加工してタイムスタンプを追加する](http://qiita.com/asmanabu/items/d9ba9ff0fca745c8c216#%E5%B0%8F%E3%83%AF%E3%82%B62-%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8A%A0%E5%B7%A5%E3%81%97%E3%81%A6%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)を参照してください。

### Cloudantノードの構成
Cloudantノードの設定は以下のとおりです。

| 設定項目 | 内容 |
| :-- | :-- |
| Service | Bluemix上に作成されたCloudantのサービス名を選択します |
| Database | Cloudantに作成したデータベース名である*sensordata*を入力します |
| Operation | insertを選択します。センサーデータだけを格納するため、**Only store msg.payload object?**にチェックを入れています。 |
| Name | ノードに付ける名前です。任意の値で問題ありません。 |

入力例は以下のとおりです。
![nodered-cloudant07.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/79027f85-9625-1e06-3ef4-683d2f0d43c6.jpeg)

### （参考）サンプルフローのインポート
以下のJSONを、[Node-RED小ワザ集](http://qiita.com/asmanabu/items/d9ba9ff0fca745c8c216)の[小ワザ1. フローのインポート](http://qiita.com/asmanabu/items/d9ba9ff0fca745c8c216#%E5%B0%8F%E3%83%AF%E3%82%B61-%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)の方法を使ってインポートすることで、サンプルフローを復元できます。

```
[{"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":[]}]
```

### フローのデプロイ
以上でフローの作成は完了です。フローエディター右上の ![nodered-cloudant08.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/68fa9359-0d5f-0b48-e39c-9f49a1c7da50.jpeg) をクリックして、フローをデプロイします。

## Cloudantにデータが保管されていることを確認する
フローをデプロイした時点から、Cloudantへのデータ保管が開始されています。保管されたデータを確認します。

Cloudantの管理コンソールに戻ります。
左メニューバーの**Databases**をクリックし、データベースの一覧を表示します。*sensordata*データベースのデータ数（# of Docs）の値が増えていることが確認できます。
![nodered-cloudant09.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/3617c55a-bc5e-1093-2ccb-ccf4ffd7558d.jpeg)

*sensordata*をクリックして、保管されたデータを見てみます。
右側に保管されているデータの一覧が表示されるため、どれでもいいので*id*の部分の文字列をクリックします。
![nodered-cloudant10.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/67ecb4f1-45fe-7dee-5a3e-2877c8f0a888.jpeg)


タイムスタンプとセンサーデータが保管されていることが分かります。
![nodered-cloudant11.jpg](https://qiita-image-store.s3.amazonaws.com/0/73397/f41b190b-dd85-10e7-5578-3232586f8dad.jpeg)