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


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

0. 前提事項

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

1. IBM Cloud 上に Node-REDの環境を構築する

1-1.IBM Cloudにログインするとダッシュボードのページが表示されると思います。このダッシュボードのページの上の方にカタログ(使用できるサービス)の検索ボックスがあるので「Node-RED」と入力して「Node-RED Starter」を選択します。

1-2. Cloud Foundryアプリの作成のページで以下を入力します。
①任意のアプリ名を入力します。②ホスト名を入力します。③ドメインを変えたい場合は、プルダウンから選択します。④デプロイする地域/ロケーションを選択して、下にスクロールします。

⑤SDK for Node.js ではライトを選択します。⑥Cloudant では Liteを選択します。⑦価格プランではライトを選択します。⑧最後に「作成」ボタンをクリックします。

1-3. 以下のページにリダイレクトします。「開始中」から「このアプリは稼働中です。」になるまでしばらくお待ちください。「このアプリは稼働中です。」になったら、「アプリURLにアクセス」をクリックします。

1-4.以下のページが表示されます。「NEXT」をクリックします。

1-5.以下のページで、Node-RedのエディターにアクセスできるユーザーIDとパスワードをセットします。「NEXT」をクリックします。

1-6.以下のページで「NEXT」をクリックします。

1-7.以下のページで「Finish」をクリックします。

1-8.「Go to your Node-RED flow editor」をクリックします。

1-9.認証画面が表示されますので、先ほど設定したユーザーIDとパスワードでログインします。

1-10.Node-REDのエディターが表示されました。

2. Watson IoT Platform を準備する

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

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

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

2-4. IoT Sensor(シュミレータ)が表示されます。右上に表示された文字列がデバイスIDです。これをコピーします。

3. Node-RED でフローを作成する。

3-1. Node-REDのエディターに戻ります。左側の「入力」から「ibmiot」を選んで、真ん中のパレットにドラッグ&ドロップします。

3-2. 追加したノードをダブルクリックして設定画面を開きます。先ほどコピーしておいたデバイスIDを設定して、「完了」をクリックします。

3-3. センサーで取得されるデータをデバッグモードで確認してみます。左側の「出力」から「debug」を選んで、真ん中のパレットにドラッグ&ドロップします。

3-4. 追加した2つのノードを繋ぎます。その後、「デプロイ」をクリックします。

3-5. デバッグメッセージを確認します。虫のアイコンをクリックしてください。

3-6. センサーから送信されたデータを確認することができます。

3-7. デバッグメッセージへの出力を一旦停止しておきたい場合は、debugノードの右側をクリックします。

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

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

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

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

4. センサーのノードとDb2のノードを繋ぐ

4-1. 左側の「ストレージ」から左側にのみコネクタが付いている「dashDB」を選んで、真ん中のパレットにドラッグ&ドロップします。

4-2. 追加したノードをダブルクリックして設定画面を開きます。「新規にdashDBを追加」の右横にある鉛筆アイコンをクリックします。

4-3. 接続情報を入力します。①Db2 on CloudのFully Qualified Domain Nameを入力します。② BLUDBと入力します。③Db2 on CloudのDBユーザー名を入力します。④パスワードを入力します。⑤ポート番号を指定します。non-SSLの場合は50000、SSLの場合は50001です。⑥「完了」をクリックします。

⑦表の名前を入力します。⑧「完了」をクリックします。

4-4. 「IBM IoT」と「dashDB」のノードを繋ぎます。その後、「デプロイ」をクリックします。

4-5. デバッグメッセージで以下のエラーが表示されます。これは、「IBM IOT」ノードから送られてきたデータに、NAME が無いと言っています。

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

5. センサーの送信データを整形する

5-1. 左側の「機能」から「function」を選んで、真ん中のパレットにドラッグ&ドロップします。「IBM IoT」と「dashDB」の線はマウスで選択してdeleteキーで削除します。

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


msg.payload =  {
    "NAME": msg.payload.d.name,
    "TEMP": msg.payload.d.temp,
    "HUMIDITY": msg.payload.d.humidity,
    "OBJECTTEMP": msg.payload.d.objectTemp
};
return msg;

5-3. 「IBM IoT」「function」「dashDB」のノードをつないで、デプロイします。デバッグメッセージになにも表示されなければDb2 on Cloudの表にデータが入っているはずです。

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

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

SELECT * FROM IOT_DATA;

6. 現在時刻を挿入する/データの流量を調整する

6-1. 現在時刻をIOT_DATA表に入れるには、はじめに表の定義を変更します。

ALTER TABLE IOT_DATA 
ADD COLUMN TIMESTAMP varchar(20);

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

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分に設定します。④「完了」をクリックします。

6-4. ノードをすべて繋ぎ、デプロイします。

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

SELECT * FROM IOT_DATA;

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