はじめに
今回は、Raspberry PiのNode-REDを使用してセンサーデバイスから取得したデータを処理し、サーバー側のクラウドプラットフォームにデータを送信する方法を実装します。
センサーデバイスには、Grove の温度/湿度センサーとRaspberry Piを使用します。
クラウド・プラットフォームには、IBMCloudを使用します。IBM Cloudは、IoTでMQTTブローカーとして機能するサービスであるWatson IoTPlatformを提供してます。利用にはIBM Cloudアカウントが必要となるので、お持ちでない場合は、IBMCloudアカウントを作成してください。
Watson IoT Platform
Watsonという名前ですが、Watson IoT PlatformはAPIではなく、IoTソリューションで使用されるツールとプラットフォームです。ここでは、エッジデバイスのセンサーデータをサーバー側(ここではIBM Cloud)に送信し、Watson IoT Platformを使用してそのデータを受け取ります。

Edge Device
今回、エッジデバイスとして利用するのはRaspberry Pi 3とそれに接続するGrove base HATとGrove Temperature and Humidity Sensor (SHT31)になります。こちらはネットショップで購入可能です。

Raspberry PiへのNode-REDのインストールはNode-RED公式サイトをご参照ください。
Raspberry Piでセンサー取得を試す
Groveの温度/湿度センサーモジュールからはデータを簡単に取得できます。以下の手順で、データが正常に取得できることを確認してください。
node-red-contrib-grove-base-hatノードをインストール
Raspberry Pi上のNode-REDにnode-red-contrib-grove-base-hatノードをインストールします。
パレットの管理から、インストールしてください。

データを取得するための簡単なフローを作成する
フローエディタの左側にあるパレットから、Injectノード、grove-temperature-humidity-sensor-sht3xノード、およびdebugノードの3つのノードを選択し、ワークスペースにドラッグアンドドロップして配置します。
配置後、下図のように順番に配線してください

grove-temperature-humidity-sensor-sht3xノードの設定を確認
grove-temperature-humidity-sensor-sht3xノードをダブルクリックして、設定画面を表示します。この設定画面で設定する値や項目はありません。ポートがI2Cとして示されていることを確認してください。確認後、設定画面を閉じてください。
そしてもう1つ、grove-temperature-humidity-sensor-sht3xノードの下部に青い正方形のアイコンとI2C文字が表示されていることを確認してください。これは、Grove Base Temperature / HumidityセンサーモジュールがRaspberryPiに正常に接続されていることを示しています。このアイコンの色が赤に変わった場合は、モジュールがI2Cポートに正しく接続されていないことを意味します。ハードウェアを正しく再接続してください。

フローを実行して結果を確認
すべての準備が完了したので、フローエディタの右上隅にある[Deploy]ボタンをクリックして、デプロイを完了します。デプロイが成功したら、Injectノードのスイッチをクリックしてフローを開始します。
取得したセンサーデータの値がフローエディターのデバッグウィンドウにJSONで表示されていることを確認できれば成功です。

サーバーサイド(クラウド)へのデータ送信(簡易版)
デバイス単体で、センサーデータを取得でき、それがNode-RED上で確認できることは分かりました。今度はそのデータをサーバーサイド(クラウド)へ送信するということをやりたいと思います。
Watson IoT Platform ノードのインストール
今回は、サーバーサイド(クラウド)にIBM Watson IoT Platformを使用します。Raspberry Pi上のNode-REDに、Watson IoT Platformのノードをインストールしましょう。

Watson IoTノードには、WatsonIoTプラットフォームに接続するための以下の2つのノードがあります。
- Watson IoT in:ノード内のWatson IoTは、Watson IoT Platformに接続し、IBM Watson IoT Platformからデバイスコマンドを受信します。
- Watson IoT out:Watson IoT outノードはWatson IoT Platformに接続し、デバイスイベントをIBM Watson IoT Platformに送信します。
これらの2つのノードは、フローエディタに同じノード名「WatsonIoT」として表示されます。 Watson IoT(in)ノードはパレットの入力カテゴリの下にあり、Watson IoT(out)ノードはパレットの出力カテゴリの下にあります。

データ送信
それでは、最後にRaspberryPiのセンサーデータをNode-RED経由でサーバーに送信しましょう。 サーバーはWatsonIoTプラットフォームです。 まずは難しいことは考えず、単純に送信できることを確認しましょう。したがって、ここではWatson IoT Platformのサービスの1つであるQuickstartを使用して、データ送信が正しく実行されているかどうかを確認します。
まず、WatsonIoTプラットフォームクイックスタートのサーバー側画面を確認しましょう。 以下のURLからアクセスしてください。
https://quickstart.internetofthings.ibmcloud.com/
Quickstartは、IoTを初めて実現するための非常に便利で簡単なツールです。 データの可視化は3つのステップで完了します。

次に、Raspberry Pi上のNode-REDで、次のようにフローを作成します。
前のステップで作成したフローのgrove-temperature-humidity-sensor-sht3xの後にWatsonIoT出力ノードを配置し、次の図のように配線します。

Watson IoT outノードをダブルクリックして、設定ウィンドウを開きます。 Watson IoT Platform Quickstartに接続するには、プロパティタブで次のように値を設定します。
Connect as: Device
Quickstart/Registered: Quickstart
Quickstart Id: <default on your node> *You need to copy this ID
Event type: event
Format: json

Quickstartで確認
以下の手順に従って、Raspberry Piから送信されたセンサーデータがWatson IoT Platform Quickstartで受信できることを確認します。
デバイスをWatsonIoTプラットフォームに設定
Quickstartの画面を表示します。画面を閉じてしまったた場合は、前述のURLから再度アクセスするか、Watson IoT出力ノード設定画面のQuickstartIdプロパティの右側にあるボタンをクリックしてアクセスできます。
クイックスタート画面の「IBMの利用規約」リンクから利用規約を確認し、「同意する」をチェックして、前にコピーしたQuickstart IDの値をその下の「デバイスID」テキストボックスに入力します。 [Go]ボタンをクリックして、グラフページを移動します。

[Go]ボタンをクリックすると、データのないチャート画面に「デバイスが接続されました」というメッセージが表示されます。

Raspberry PiのNode-REDから、作成したフローを実行
Injectノードのスイッチをクリックするだけです。 スイッチを1回クリックすると、センサーモジュールによって取得された温度/湿度値をJSON形式でQuickstartに1回送信します。 もう一度クリックすると、もう一度送信されます。
Injectノードには、繰り返し実行用のプロパティがあります。 ここでインターバル時間を設定することで、定期的にデータを自動取得して送信することができます。

Quickstartの画面を確認
Injectノードをクリックするたびに、Quickstart画面のグラフにデータがグラフとして表示されます。 クリックを繰り返すと、取得した温度と湿度がQuickstartのチャートにデータとして反映されます。
もちろん、Ingjectノードで繰り返しを設定すると、設定した間隔でデータがグラフに反映されます。

お疲れさまでした!これで、まずは一番かんたんなサンプルでエッジデバイスからサーバーサイドへデータを送ることができました。
デバイスが手元にない場合
今回はRaspberry Piを使っていますが、もし手元にIoTに使えそうなデバイスがない場合、QuickstartであればIBMが用意しているデバイスシミュレーターを利用することが可能です。
以下のサイトからデバイスシミュレーターを利用できます。http://quickstart.internetofthings.ibmcloud.com/iotsensor
こちらへアクセスすると、仮想デバイスがWebアプリケーションとしてブラウザで開きます。右上に自動で割り当てられたデバイスIDが表示されるので、これを利用してQuickstartを試してみてください。

詳細はこちらをご覧ください。
サーバーサイド(クラウド)へのデータ送信(正式版)
前の手順では、エッジデバイス(Raspberry Pi)に接続されている温度/湿度センサーのデータをクラウドに送信し、クラウド側でデータを取得できることを確認しました。IBM Watson IoT PlatformのQuickstartを使用したのは、「エッジデバイスからのデータの送信」に重点を置き、サーバー側の設定や処理を考えなくて済むためです。
ただし、IoTの仕組みを通常通りに実装しようとする場合、MQTTブローカー(データをリンクするためのサブスクライバーおよびパブリッシャーとして機能するツール)を正しく使用する必要があります。 そのためには、MQTTブローカーのアドレスを指定する必要があり、デバイスIDに加えて、デバイスタイプやトークンなどの資格情報が必要になります。
では、なぜ前のステップでアドレスも何も指定していないのに、サーバーにデータを送信できたのでしょうか。 実はQuickstartは、汎用MQTTブローカーの役割を担い、事前に指定されたサーバーにアクセスし、デバイスIDのみでデータを取得してたのです。
では、ここからは自分自身のIoT Platformを作成していきます。作成する場所はIBM Cloudです。以下の手順でサービスを作成してください。
IBMCloudにログイン
以下のURLにアクセスして、IBMCloudにログインします。
https://cloud.ibm.com
ダッシュボードが表示されます。

WatsonIoTプラットフォームを検索
ウィンドウの右上にある[Catalog/カタログ]ボタンをクリックし、「Internet of Things」という単語で検索します。Internet of Things Platform(IoTプラットフォーム)が、検索結果として表示されますので、タイルを選択します。

IoT Platform Serviceの作成
任意の地域を選択します。 (安定しているのでダラスをお勧めします)
アカウントの種類がライトアカウントの場合、ライトプランのみ選択できますので、選択してください。この料金プランは無料でご利用いただけます。
ただし、アカウントタイプがPAYG / PayGo(従量制)の場合は他の料金プランも選択できますので、注意して選択してください。これらの料金プランは従量制です。

Watson IoT Platform Toolを起動
IoT Platform Serviceが作成されたら、[Launch]ボタンをクリックしてWatson IoT Platform Toolを起動してください。

Watson IoT Platform Toolダッシュボード画面は、IBMCloudダッシュボードとは別のウィンドウとして表示されます。デバイスはまだないので、ここに独自のデバイスを追加します。

デバイスタイプを作成
次に、デバイスをWatson IoT Platformに登録します。デバイスを登録する前に、まずデバイスタイプを登録してください。デバイスタイプは、デバイスの登録時に必要なデバイスタイプのマスタデータのようなものです。
[Deveice Types]タブを選択した後、この画面の右上にある[Add Device Type]ボタンをクリックします。

[Type]セクションで[Device]を選択し、[Name]セクションで「device01」と入力してください。その後、[Next]ボタンをクリックします。

次の画面で、すべてのパラメータを入力する必要はありません。[Finish]ボタンをクリックします。

追加したデバイスタイプが[Device Types]リストに表示されます。

デバイスを登録
次に、自分のデバイスを登録します。 [Brows]タブの[Add Device]ボタンをクリックしてください。

[Register Devices]ボタンをクリックします。

[Device Type]セクションで「device01」を選択し、[デバイスID]セクションで任意の文字列をデバイスIDとして入力してください。ここでは例として「taiponrock9999」を入力しました。その後、[Next]ボタンをクリックします。

[Device Information]画面で、すべてのパラメータを入力する必要はありません。[Next]ボタンをクリックします。

セキュリティセクションで、認証トークンを設定します。これは任意の文字列にすることができます。ここで設定された認証トークンは、後でRaspberryPi側のNode-REDで使用されます。このサンプルでは、「node-red-iot」が設定されています。設定後、[Next]ボタンをクリックします。

デバイスの概要を確認して、[Finish]ボタンをクリックしてください。

ポリシー設定を確認
Watson IoTPlatformの左側にあるメニューバーから[Policies]を選択します。表示される3つの項目の上部にある接続セキュリティレコードの[編集]ボタン(鉛筆アイコン)をクリックします。

現在の接続セキュリティ設定がデフォルトルールとして表示されます。セキュリティレベルに注意してください。 「トークン認証付きTLS」以外を選択した場合は、「TLS with Token Authentication」に変更してください。
その後、[Back]ボタンをクリックして、Watson IoT Platformのメイン画面に戻ります。

RaspberryPiでのWatsonIoTノードの設定
次に、一旦Watson IoT Platformから離れて、Raspberry Pi上の設定を行います。 Raspberry Pi上のNode-REDフローエディターを開きます。このNode-REDフローエディターには、先程のステップで作成したフローが残っていると思います。もしこのフローを削除した場合、または作成していない場合は、このブログの最初からやり直してフローを作成してください。
フローを構成するWatson IoTノードをダブルクリックして、設定ウィンドウを開きます。前回はクイックスタートを使用しましたが、今回は自分のサーバー(自分で作成したWatson IoT Platform)に接続するので、「Quickstart/Registered」ラジオボタンで「Registered」を選択します。
次に、資格情報の右側にある編集ボタン(鉛筆マーク)をクリックして、Credentialsのプロパティを開きます。

各プロパティに次の値を入力してください。
組織:Watson IoT Platform URLの最初の部分を指定します。たとえば、「https://gcadjl.internetofthings.ibmcloud.com/」は「gcadjl」になります。
サーバー名:「https:// <組織> .messaging.internetofthings.ibmcloud.com」を指定します。この例では、「https://gcadjl.messaging.internetofthings.ibmcloud.com」になります。
デバイスタイプ:Watson IoT Platformで追加したデバイスのデバイスタイププロパティに指定した値を指定します。この章の例では、「device01」として設定されています。
デバイスID:Watson IoT Platformで追加したデバイス名を指定します。この章の例では、「taiponrock9999」として設定されています。
認証トークン:Watson IoT Platformにデバイスを追加したときに設定した認証トークンを指定します。この章の例では、「node-red-iot」として設定されています。
この設定については、次の画像を参照してください。

設定後、[Add]ボタンをクリックして、Watson IoTノードのメイン設定ウィンドウに戻ります。
メイン設定ウィンドウに戻ったら、[Connect as]プロパティで[Device]を選択し、前の手順で作成した資格情報を選択します。イベントの種類と形式はそのままにしておくことができます。 [Done]ボタンをクリックして設定を終了します。

接続を確認
Raspberry Piの設定は以上です。Node-REDのデプロイボタンをクリックしてデプロイします。デプロイ後、Watson IoTノードの下に「接続済み」のステータスが表示された場合は、Watson IoT Platformに正常に接続されているはずです。

このフローに流れたデータは先程サービスとして作成したIBM Cloud上のWatson IoT Platformに送られます
Watson IoT Platformでの接続確認
再びWatson IoT Platformに戻ります。たった今、Raspberry Pi上で接続が成功したことを確認しましたが、今度はWatson IoT Platformで接続が成功したかどうかを確認します。
Watson IoT PlatformのBrows Devices画面を確認します。左側のメニューバーの一番上からアクセスできます。以前に作成したデバイスをデバイスリストから確認すると、ステータスが「接続済み」であることがわかります。

このデバイスのレコードの左側にある「>」をクリックして、デバイスに関する詳細情報を表示します。その中の[Recent Events]タブを選択します。この時点では何も表示されませんが、Raspberry Pi上のNode-REDで、フローのInjectノードのスイッチを実行してみてください。この[Recent Events]タブの下に、Raspberry Piによって送信されたデータが表示されます。

これで、エッジデバイスとサーバー間の接続が完了しました。
IBM Cloud上のデータの可視化
ここまでで、エッジデバイスのRaspberry PiをIBM Cloud上のWatson IoT Platformに接続しました。
ここからは、Watson IoT Platform上でのデータの可視化を行います。具体的にはチャートとして表示させようと思います。以下の手順に従ってください。
IBMCloud上のデータを視覚化するためのチャートボードを作成
Watson IoT Platformの左側のメニューバーの上部にある[Board]を選択して、新しいボードを作成します。ボードは、さまざまなグラフをまとめたプロジェクトのようなユニットと考えてください。
ボード画面の「+」をクリックします。

ボード名には好きな名前を付けてください。ボードの表示名になります。次に、[次へ]ボタンをクリックします。

プロパティを変更する必要がないので、[Submit]ボタンをクリックします。

新しく作成したボードタイルを選択します。

[Add New Card]ボタンをクリックします。このカードとはチャートのことです。

任意のタイプのチャートを選択できます。ここでは、Line chart(折れ線グラフ)を選択します。

1つのデバイスのみを登録した場合は、このウィンドウにそのデバイスが表示されます。複数のデバイスを登録した場合は、ここにすべてのデバイスが表示されますので、チャートを作成するデバイスを選択してください。次に、[Next]ボタンをクリックします。

[Connect new data set]をクリックしてグラフを作成します。

Watson IoT Platformで受信したセンサーデータの詳細を次のように入力します。
Event: event
Property: temperature *You can select temperature or humidity getting from the device automatically.
Name: Temperature
Type: Number
Unit: °C
Min: 0
Max: 40
設定後、「Next」ボタンをクリックすると、次の画面に移動します。

チャート設定を構成します。ウィンドウサイズプロパティで「1 minute」を設定してください。このプルダウンリストから他の項目を変更できます。 [Next]ボタンをクリックします。

サイズS、M、L、XLからチャートカードサイズを選択します。このサンプルでは、Lサイズが選択されています。選択したら、[Next]ボタンをクリックします。

チャートカードの最後の設定です。お好みのチャートカードの色を選択してください。そして、[Submit]ボタンをクリックします。

Watson IoT Platformでチャートを確認
チャートを作成する手順の最後で[Submit]ボタンをクリックすると、Watson IoT Platformにチャートが表示され始めます。

お疲れさまでした!ついに、Watson IoT PlatformでRaspberry Piからのデータを可視化することができました。
まとめ
いかがでしたでしょうか?IoTというのは、触れたことが無い人にとってはちょっと取っ付きづらいところもあるかと思います。完全ソフトウェア屋さんの私もそうでした。しかし、今日ではRaspberry Piに代表されるような電子工作を簡易的に実現できるOS入りの基盤や、Watson IoT Platformのようにエッジデバイスとサーバーサイドを簡単につなげてくれるツール/サービスもたくさんありますので、是非体験して次へと進んで頂ければと思います。
このブログがお役に立てましたら何よりです。
ではでは!