前回の、この記事の続きです:
Bluemix の Node-RED サービスで IoT アプリを作る(1/2)


前回は IBM Bluemix 上の Node-RED サービスの初歩的な使い方を中心に説明し、IoT センサーシミュレータと接続し、送られてくるセンサーの値を取得して表示する、というシンプルなワークフローを作りました。 今回は Node-RED の他のブロック機能を組み合わせて、もう少し実用に近いワークフローを記述してみます。

具体的には、以下の様な分岐処理を含むワークフローを Node-RED エディタで記述します:
- IoT センサーから、機器温度の値を取得して、
- 機器温度が40度以下であれば、(安全な状態とみなして)その値を画面に出力して終了
- 機器温度が40度を超えている場合、警告メッセージを画面に出力し、
- 同時にその時の状態をデータベースに記録する


最初に Node-RED エディタでの、上記ワークフローの完成形を示しておきます。前回のシンプルなものと比べると、スタートは IoT デバイスになっていて変わりませんが、プロセスが長くなり、途中に条件分岐が含まれていたり、見たことのない記号のブロックがあったりと、それなりに複雑なフローになっていることがわかると思います:
2015032301


では実際に Node-RED エディタ上でこのワークフローを作っていきます。まずは前回の内容を参照して、Node-RED Starter ボイラープレートを使ってプロジェクトを作ります。この図ではアプリケーションの名称は dotnsf-nodered としましたが、実際には個別の名前を付けることになります。なお、このボイラープレートに含まれる Cloudant データベースサービスの名称が dotnsf-nodedred-cloudantNoSQLDB となっていることを確認しておきます(この名称を後で使います):
2015032401


アプリケーションから Node-RED エディタを開き、"iotibm" ブロックをキャンバスに1つ追加します。このあたりは前回の内容と同じです:
2015032407


iotibm ブロックをダブルクリックして編集状態に移り、このデバイスの属性を入力します。デバイスID(Device Id)欄にはこのデバイスの MAC アドレスを指定しますが、これは最後に入れるので空にしておいても構いません。これが(仮想の) IoT デバイスであり、ここから送られてくるセンサーの値を使ってワークフローを記述します:
2015032402


次にワークフローを進める中でセンサーの機器温度を何度も調べるのは効率が悪いため、「センサーの機器温度だけを取り出す」という処理を最初に行っておきます。こうすることでいちいち JSON テキストを解析することなく、一度取り出した機器温度の値を多くの処理の中でそのまま使うことができるようになるからです。キャンバスの左ペイン内 function カテゴリから "function" と書かれたブロックを1つ追加し、先ほどの "iotibm" ブロックと線で結びます:
2015032408


追加した function ブロックをダブルクリックして編集状態にして、下図のように msg.payload.d.objectTemp(機器温度)に payload という名前を付けて返す、という関数処理を加えます。これによってこの次のブロックからははメッセージの payload プロパティを参照することで機器温度を取得することができるようになります:
2015032401


次のブロックを追加します。同様に function カテゴリから "switch" と書かれたブロックを1つ追加し、先ほどの "function" ブロックと線で結びます:
2015032409


追加した switch ブロックをダブルクリックして編集状態にして、下図のような分岐ルールにします(2つ目のルールは +rule と書かれたボタンをクリックして追加します)。これによって msg.payload の値(=機器温度)が 40 を超えている(=警告)場合はルート1へ、40以下(=正常)の場合はルート2へ、処理を分岐するようにしています:
2015032403


次は分岐の正常処理を用意します。正常処理の場合は単純に画面に機器温度を出力するだけとします。パレットに output カテゴリから "debug" と書かれたブロックを1つ追加し、switch ブロックの下側(ルート2)から線で結びます:
2015032410


追加した debug ブロックをダブルクリックして編集状態にして、下図のような内容(msg.payload の値を debug タブに出力する)にします。機器温度が正常範囲内と判断された場合はこれだけです:
2015032404



次に分岐の警告処理を用意します。警告処理の場合は画面への出力内容にも "Warning!" という文字列を追加して出力し、更にその温度を Cloudant にも記録するようにします。まずは出力内容の文字列を変更するために function カテゴリから "template" ブロックを1つ追加し、switch ブロックの上側(ルート1)から線で結びます。更に追加した template ブロックから、先ほど追加した debug ブロックに向けて線を結びます:
2015032411



追加した template ブロックをダブルクリックして編集状態にして、下図のような内容に書き換えます。payload の値の前に "Warning!: " という文字列を付加するような処理を施しています:
2015032405



更に、この警告時の機器温度をデータベースに追加するためのブロックを追加します。storage カテゴリ内の右側にコネクタがない "Cloudant" ブロックを1つ追加し、template ブロックから線で結びます。なお右側にコネクタがある "Cloudant" ブロックはデータを検索する処理で、検索結果を次のブロックに渡します。右側にコネクタがない "Cloudant" ブロックは単純なデータ追加処理です。今回は後者のブロックを使います:
2015032412


追加した Cloudant ブロックをダブルクリックして編集状態にして、下図のような内容に書き換えます。今回の処理では警告メッセージを、Bluemix のボイラープレートに含まれる Cloudant サービス(dotnsf-nodered-cloudantNoSQLDB)内の iotdata というデータベース内に insert します:
2015032406


この時点で Node-RED エディタのキャンバスに必要なパーツは全て揃いました。

ただ、ここで指定した Cloudant 内の iotdata というデータベースは標準で存在しているわけではないので、このままデータを挿入しようとしてもエラーとなります。そのためこのデータベースを事前に作成しておきます。

改めて Bluemix のダッシュボード画面に戻り、目的のアプリケーション(この例では dotnsf-nodered)を開きます。そして Cloudant サービスのアイコン部分をクリックします:
2015032402


Cloudant NoSQL データベースの説明ページが表示されたら、右上の "LAUNCH" ボタンをクリックして、このデータベースの管理機能にアクセスします:
2015032403


このサービスで利用中の Cloudant データベースの管理画面が表示されます。このボイラープレートを使った時点で "nodered" という名前のデータベースが作られているはずです。今回は新たに機器情報格納用のデータベースを作りたいので、右上の "Add New Database" ボタンをクリックします:
2015032404


追加したいデータベースの名前(今回は "iotdata")を指定して、"Create" ボタンをクリックします:
2015032405


iotdata データベースが追加されたことが確認できたら、Cloudant 側の準備は完了です。この段階ではまだ中身がないのでデータ数(# of Docs)はゼロのはずです:
2015032406


最後に機器温度データを送信する(仮想) IoT 機器の MAC アドレスを指定します。今回は仮想 IoT シミュレータを使うことにしますので、このページにアクセスして仮想 IoT 機器を表示し、右にスワイプして "Object Tempreture"(機器温度)と書かれた画面まで移動します。デフォルト値の 24 度(40度以下)になっていることを確認し、そして画面右上に書かれた MAC アドレスをメモします:
2015032401


この MAC アドレスのコロンを省略して大文字を小文字に変換したものを、Node-RED エディタに最初に追加した IoT Sensor のデバイス ID として指定します。IoT Sensor をダブルクリックし、Device Id 欄に指定して OK をクリックします:
2015032402


これで今回作成した IoT 機器アプリのワークフローは完成です。では実際に動かしてみましょう。Node-RED エディタの右ペインで debug タブを選んだ上で、右上の "Deploy" ボタンをクリックして実行します:
2015032403


画面上部に "Successfully deployed" と表示されれば実行成功です:
2015032404


すぐに画面右ペインの debug タブ内に指定した IoT 機器から送られてくるセンサー情報の機器温度(何も変えていなければ24度)が2秒おきに表示されます:
2015032405


この時点で Cloudant の管理画面を更新しても、まだ(警告になるデータが送られてきていないので) iotdata データベースにはデータが格納されていないはずです:
2015032406


では仮想 IoT 機器の機器温度が上がった状態をシミュレートしてみます。シミュレータのボタンをクリックして、機器温度を45度まで少しずつ上げてみます:
2015032407



41度以上になったタイミングから、ワークフロー内で記述した分岐処理で警告状態と判断され、表示メッセージがカスタマイズされたものに切り替わります:
2015032408


また、41度以上のデータについては Cloudant に格納する、というブロックも追加していました。この状態で iotdata データベースを更新すると、いくつかのデータが格納されていることを確認できます。 詳細を確認してみるには iotdata と書かれた箇所をクリックします:
2015032409


iotdata データベースに格納された情報が一覧表示されます。この状態のままだと個別データが表示されないので、どれか1つ選んで右上の鉛筆マークをクリックしてみます:
2015032410


選択したデータの全情報が表示されます。"payload" 値として設定した通りの "Warning: XXX" という警告メッセージが格納されていることを確認できます:
2015032411



以上、前回よりは少し複雑なワークフロー処理を Node-RED エディタを使って実現してみました。事実上、コーディング処理は1行も記述していませんが、IoT 機器からのセンサーデータを受け取って、特定の条件にもとづいてデータベース内に格納する、という処理が実現できました。


2回に分けて小出しにしたつもりでしたが、いずれもブログエントリとしては大作になってしまいました。ただコーディングを行うような手続きはほとんどなく、画面のドラッグ&ドロップと属性値の設定程度でこのくらいはできてしまったことになります。この手軽感を多くの人に体験してほしいと思っています。

また、この Node-RED エディタには今回紹介した以外にも色々な処理や格納、他サービスとの連携などがやはりコーディング処理を行うことなく実現できる便利なブロックが多く用意されています。機会があれば、もう少し違った Node-RED の使い方も今後紹介していこうと思っています。