IBM Cloud の Node-REDを使ってセンサーデータを Db2 on Cloud にいれるよ

IBM Cloud で無償で使える Node-RED と Db2 on Cloud を 使ってセンサーデータを蓄積する仕組みを作成したいと思います。Db2 on Cloudの表へデータを入れる際にちょっとしたコツがあったのでまとめました。


### 0. 前提事項
- 事前に [IBM Cloud](https://cloud.ibm.com/login) の アカウントを作成しておきます。

- Db2 on Cloud を作成しておきます。こちらをご参考ください。
    - [IBM Cloud で無償枠のDb2 on Cloudを使ってみる](https://qiita.com/Asuka_Saito/items/c40a17f02a588953f576)
    - 無償で使えるのはLiteプランのみで、容量200MBまでとなります。
- 今回センサーは [IBM Watson IoT Platform が提供するシュミレーター](https://quickstart.internetofthings.ibmcloud.com/#/)を使用します。


##### 参考にさせていただいたBlogや記事

- @dotnsf さんの[センサー付き IoT シミュレータ](http://dotnsf.blog.jp/archives/1022031024.html)
- @asmanabu さんの[Node-RED小ワザ集](https://qiita.com/asmanabu/items/d9ba9ff0fca745c8c216)
- @makaishi2 さんの[Node-RED超入門](https://qiita.com/makaishi2/items/5c7b1b6a72b6938cf3d2)


### 1. IBM Cloud 上に Node-REDの環境を構築する
1-1.IBM Cloudにログインするとダッシュボードのページが表示されると思います。このダッシュボードのページの上の方にカタログ(使用できるサービス)の検索ボックスがあるので「Node-RED」と入力して「Node-RED Starter」を選択します。
![Node-RED_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/7261d1e2-37a6-9beb-a24e-aa475abf4f88.png)

1-2. Cloud Foundryアプリの作成のページで以下を入力します。
①任意のアプリ名を入力します。②ホスト名を入力します。③ドメインを変えたい場合は、プルダウンから選択します。④デプロイする地域/ロケーションを選択して、下にスクロールします。
![Node-RED_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/9864b900-5b7d-5673-b7c2-1bcb4407a4c9.png)


⑤SDK for Node.js ではライトを選択します。⑥Cloudant では Liteを選択します。⑦価格プランではライトを選択します。⑧最後に「作成」ボタンをクリックします。
![Node-RED_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/99384c23-44c5-9a1b-7d0e-29cffea239cd.png)

1-3. 以下のページにリダイレクトします。「開始中」から「このアプリは稼働中です。」になるまでしばらくお待ちください。「このアプリは稼働中です。」になったら、「アプリURLにアクセス」をクリックします。
![Node-RED_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/72a7174f-3e56-0434-5421-c8e0c7d23f1f.png)

1-4.以下のページが表示されます。「NEXT」をクリックします。
![Node-RED_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/6a48b1a4-7118-c028-3d2e-68e27e52e02b.png)

1-5.以下のページで、Node-RedのエディターにアクセスできるユーザーIDとパスワードをセットします。「NEXT」をクリックします。
![Node-RED_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/4734d804-12e4-b468-ca5d-0c444cfe0486.png)

1-6.以下のページで「NEXT」をクリックします。
![Node-RED_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/4439704e-727a-950e-ec72-2325bc1ad8e3.png)

1-7.以下のページで「Finish」をクリックします。
![Node-RED_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/fa863d37-e80d-5dce-5b98-cadd4e447c17.png)

1-8.「Go to your Node-RED flow editor」をクリックします。
![Node-RED_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/044cc61c-6a73-0962-73b5-26f14642a99d.png)

1-9.認証画面が表示されますので、先ほど設定したユーザーIDとパスワードでログインします。
![Node-RED_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/26b13b4b-210d-7e59-32d9-3e54e9440516.png)

1-10.Node-REDのエディターが表示されました。
![Node-RED_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/3382f80a-ef04-755e-24c1-4ec0cde59ebf.png)

### 2. Watson IoT Platform を準備する

今回は 物理デバイスではなく、Watson IoT Platform が用意しているセンサーのシュミレーターを使用したいと思います。物理デバイスでのセンシングは準備中。

2-1. 以下のページにアクセスします。「デバイスがない場合」の「詳細について」をクリックします。
https://quickstart.internetofthings.ibmcloud.com/#/

![WatsonIoT_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/177d4751-8918-a7bf-29eb-392b6e142c68.png)


2-2. シュミレータの解説ページが表示されます。中程にある以下のURLにアクセスします。
http://quickstart.internetofthings.ibmcloud.com/iotsensor

2-4. IoT Sensor(シュミレータ)が表示されます。右上に表示された文字列がデバイスIDです。これをコピーします。
![WatsonIoT_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/aba1988d-ac7a-8207-2fb4-427a12b74874.png)

### 3. Node-RED でフローを作成する。
3-1. Node-REDのエディターに戻ります。左側の「入力」から「ibmiot」を選んで、真ん中のパレットにドラッグ＆ドロップします。
![Node-RED-Editor_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/7b93d7de-214c-dc18-6d99-6941b1fa3e7b.png)

3-2. 追加したノードをダブルクリックして設定画面を開きます。先ほどコピーしておいたデバイスIDを設定して、「完了」をクリックします。
![Node-RED-Editor_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/49dbc522-8de4-ca86-1ab1-3ac6f744718c.png)

3-3. センサーで取得されるデータをデバッグモードで確認してみます。左側の「出力」から「debug」を選んで、真ん中のパレットにドラッグ＆ドロップします。
![Node-RED-Editor_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/8fa2707a-962d-04dc-9e68-6e4acf05f018.png)

3-4. 追加した２つのノードを繋ぎます。その後、「デプロイ」をクリックします。
![Node-RED-Editor_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/2120d377-deae-6ff5-a760-a429988e134d.png)

3-5. デバッグメッセージを確認します。虫のアイコンをクリックしてください。
![Node-RED-Editor_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/cacab4e2-b876-d5b4-2be7-c64cbacec988.png)

3-6. センサーから送信されたデータを確認することができます。
![Node-RED-Editor_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/324e48f9-d370-9a5b-9643-4fa9f3ccac74.png)

3-7. デバッグメッセージへの出力を一旦停止しておきたい場合は、debugノードの右側をクリックします。
![Node-RED-Editor_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/ef6c4f31-da52-b49d-f757-ed7d2596c2e6.png)



### 3. センサーデータを保管する表を Db2 on Cloud上 に作成する

3-1. Db2 on Cloudにログインし、左側のメニューをクリックして「RUN SQL」をクリックします。

3-2. 以下のDDLを実行します。

```terminal
CREATE TABLE IOT_DATA
(
name VARCHAR(20),
temp integer,
humidity integer,
objecttemp integer
)
```


### 4. センサーのノードとDb2のノードを繋ぐ
4-1. 左側の「ストレージ」から左側にのみコネクタが付いている「dashDB」を選んで、真ん中のパレットにドラッグ＆ドロップします。
![Node-RED-Editor_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/010cb3f7-8fde-d4e9-b846-329670553883.png)

4-2. 追加したノードをダブルクリックして設定画面を開きます。「新規にdashDBを追加」の右横にある鉛筆アイコンをクリックします。
![Node-RED-Editor_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/4dd5d0a7-0157-23bd-428c-668e17541a03.png)

4-3. 接続情報を入力します。①Db2 on CloudのFully Qualified Domain Nameを入力します。② BLUDBと入力します。③Db2 on CloudのDBユーザー名を入力します。④パスワードを入力します。⑤ポート番号を指定します。non-SSLの場合は50000、SSLの場合は50001です。⑥「完了」をクリックします。
![Node-RED-Editor_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/86662e97-5687-08d7-93a8-7d985af87faf.png)

⑦表の名前を入力します。⑧「完了」をクリックします。
![Node-RED-Editor_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/80b14e24-956a-2c49-3138-85f42d695563.png)

4-4. 「IBM IoT」と「dashDB」のノードを繋ぎます。その後、「デプロイ」をクリックします。
![Node-RED-Editor_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/e4fbad64-a698-c443-46ce-36b065e71523.png)

4-5. デバッグメッセージで以下のエラーが表示されます。これは、「IBM IOT」ノードから送られてきたデータに、NAME が無いと言っています。
![Node-RED-Editor_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/82d7a310-d146-8db1-6d2f-6cab5fcaa070.png)

3-6で確認しましたが、nameは送信されています。なので、dashDBに連携する際に送信されるデータを大文字にしてあげる必要がありそうです。


### 5. センサーの送信データを整形する
5-1. 左側の「機能」から「function」を選んで、真ん中のパレットにドラッグ＆ドロップします。「IBM IoT」と「dashDB」の線はマウスで選択してdeleteキーで削除します。
![Node-RED-Editor_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/839dde8f-6ebc-26a9-b566-a33c6faf6994.png)


5-2. 追加したノードをダブルクリックして設定画面を開きます。
以下のコードを上書きで貼り付けて、「完了」をクリックします。(名前は設定しなくても大丈夫です。)

```javascript

msg.payload =  {
    "NAME": msg.payload.d.name,
    "TEMP": msg.payload.d.temp,
    "HUMIDITY": msg.payload.d.humidity,
    "OBJECTTEMP": msg.payload.d.objectTemp
};
return msg;
```
![Node-RED-Editor_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/3170c013-bdfe-f776-c4d9-4f3678312816.png)

5-3. 「IBM IoT」「function」「dashDB」のノードをつないで、デプロイします。デバッグメッセージになにも表示されなければDb2 on Cloudの表にデータが入っているはずです。
![Node-RED-Editor_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/b4d93911-5a07-0365-1bdf-2667aafbc9bc.png)

*データの挿入を止めるには、ノードの線を削除してデプロイします。

5-4. Db2 on Cloudの画面で「RUN SQL」から以下を実行して確認してみてください。

```
SELECT * FROM IOT_DATA;
```


### 6. 現在時刻を挿入する/データの流量を調整する
6-1. 現在時刻をIOT_DATA表に入れるには、はじめに表の定義を変更します。

```terminal
ALTER TABLE IOT_DATA 
ADD COLUMN TIMESTAMP varchar(20);
```

6-2. IBM IoT ノードの payload メッセージを整形する function を以下のもので上書きします。

```javascript
var getCurrentTime = function () {
    var date = new Date();
    date.setHours(date.getHours() + 9);
    var d = date.getFullYear() + '-';
    d += ('0' + (date.getMonth() + 1)).slice(-2) + '-';
    d += ('0' + date.getDate()).slice(-2) + 'T';
    d += ('0' + date.getHours()).slice(-2) + ':';
    d += ('0' + date.getMinutes()).slice(-2) + ':';
    d += ('0' + date.getSeconds()).slice(-2) + 'Z';
    return d;
};

msg.payload =  {
    "NAME": msg.payload.d.name,
    "TEMP": msg.payload.d.temp,
    "HUMIDITY": msg.payload.d.humidity,
    "OBJECTTEMP": msg.payload.d.objectTemp,
    "TIMESTAMP": getCurrentTime()
};

return msg;


```

6-3. データの挿入の流量を調整します。左側の「機能」から「delay」を選んで、真ん中のパレットにドラッグ＆ドロップします。ダブルクリックして設定画面を開きます。

①「動作」は「メッセージの流量制限」を選択します。②「すべてのメッセージ」を選択します。③「流量」で　1メッセージ1分に設定します。④「完了」をクリックします。
![Node-RED-Editor_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/e3760085-5795-c433-003b-1aaf5255c3b1.png)

6-4. ノードをすべて繋ぎ、デプロイします。
![Node-RED-Editor_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/89bdd349-4ea7-cca1-3fae-71eb52c3ee4c.png)


Db2 on Cloudの画面で「RUN SQL」から以下を実行して確認してみてください。

```
SELECT * FROM IOT_DATA;
```
![Node-RED-Editor_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/f927052d-9f01-f8a7-3bc2-4a5b205b3744.png)


以上、IBM Cloud の Node-REDを使ってセンサーデータを Db2 on Cloud にいれるよ、でした。
:smiley_cat: :smiley_cat: