大島です。

温湿センサー(DHT11)とRaspberry Pi(node.js)、そしてBluemix(node-red)を使って簡単にIoTを体験出来る記事を書いていきましたが、今回の記事でラストとなります。
1回目(Raspberry Piのセットアップ)2回目(DHT11センサーのセットアップ)の記事で、Raspberry Pi上から温度と湿度情報を取得出来るようになりました。
今回の記事では、Raspberry Pi上で取得した温湿情報をBluemixへ送信し、表示させるまでを行いたいと思います。

概要

Bluemixとは

改めてBluemixについて簡単に説明したいと思います。
BluemixはIBMが提供しているPaaSサービスで、アプリケーション開発に必要なRuntime環境を提供してくれます。
そのため、より迅速にアプリケーション開発環境を準備する事が出来るサービスとなっています。
bluemix概要

開発環境について

今回はBluemix上でNode-REDと呼ばれるアプリケーション開発環境を準備し、ラズパイから送られてきたデータを表示するプログラムを作りたいと思います。
ただ、プログラムといってもNode-REDはエディターでがっちがっちにプログラムを組むわけではなく、Node-REDが提供しているGUI画面上でノードと呼ばれるブロックをつなげていく事で、簡単アプリケーションが作成できる開発環境です。
また、Node-REDはIoTに関わる機能も保有しており、これからIoTのデモアプリを作っていくという方にもおすすめです。
node-red-screenshot-sm
※出典画像:Node-REDニホンユーザ会 https://nodered.jp/ 2016/05/10

結合図

Raspberry PiからBluemixまでの結合図は以下の通りです。
Raspberry Pi上でBluemixへデータを送信するプログラム(2回目に作成したnode.jsを拡張)を実行し、Bluemix上でデータの受け取り、更に受け取った情報を基に表示するプログラムを作成していきたいと思います。
ラズパイからBluemixまでは、MQTTプロトコルで通信されます。
image002

開発環境の準備

Internet of Things Platformの準備

まず初めに、ラズパイから送信された温湿情報を受け取るためのInternet of Things Platform(IoTPlatform)をBluemix上に構築します。
ラズパイはBluemix上のIoTPlatformへMQTTプロトコルを使って情報を送信します。
IoTPlatformは情報を受け取るためのMQTTブローカーの役目を担っています。
MQTTに関する詳細についてはネット等で検索頂ければ簡単に解説しているサイトが幾つもありますので、そちらを確認下さい。

image001
出典画像:IBM https://www.ibm.com/developerworks/jp/cloud/library/cl-mqtt-bluemix-iot-node-red-app/ 2016/05/10

それでは、IoTPlatformの環境を構築していきます。
Bluemixへログインします。
(未作成の方は)スペースを作成してください。
作成方法は、左上に表示された「スペースの作成」をクリックし、「スペース名の入力」欄にお好きな名前を記入頂き作成ボタンをクリックして下さい。
demo01
スペースの作成が完了したら、ページ右上にある「カタログ」をクリックして下さい。
WS000000

画面左側のメニューから「モノのインターネット」にチェックをいれ、画面右側に表示された「Internet of Things Platform」をクリックして下さい。
WS000005

画面が切り替わるとオーダー画面が表示されますが、初期設定のまま「作成」ボタンをクリックして下さい。
「こんにちは。 Internet of Things Foundation へようこそ。」といった画面が表示されたら、環境の構築は完了です。

次に、Raspberry Piから送信される情報をIoTPlatformで受け取るための設定を行います。
画面左側の「ダッシュボードの起動」をクリックして下さい。
WS000007
ダッシュボードが起動されたら、ベージ内にある「Add Device」をクリックして、接続するRaspberry Piの情報を登録します。
WS000008

表示された画面から「デバイスた・タイプの作成」をクリック、遷移した画面で再度「デバイス/タイプの作成」をクリックします。
WS000010

次に、「一般情報」の画面で「名前」と「説明」に適当な情報を記入し、右下の「次へ」ボタンをクリックします。(名前:raspi / 説明:demo app と記載)
WS000011

「テンプレートの定義」画面にて、「クラス」にチェックをいれ「次へ」ボタンをクリックします。
WS000012

「クラス」に適当な情報を入力し、「次へ」ボタンをクリックします。(クラス:raspi と記載)
WS000013

メタデータについては未記入のまま、「作成」ボタンをクリックして下さい。
作成が完了すると、「デバイス・タイプの選択」画面で先ほど作成したタイプが表示されます。
(今回は、raspiというデバイス・タイプを作成しました。このタイプは自由に作成出来るので、皆様のご自由な名前で登録して下さい)
WS000014

「raspi」が選択された状態で、「次へ」ボタンをクリックします。
「デバイス情報」画面にて、「デバイスID」を入力します。
入力が終わりましたら、「次へ」ボタンをクリックして下さい。
(デバイスIDも自由に値を入力することが可能です)
WS000015

「メタデータ」画面では未記入のまま、「次へ」ボタンをクリックして下さい。
「セキュリティ」画面については、「トークンを指定する」の欄にパスワードを記載します。
(Raspberry PiからIoTPlatformにデータを送信する際に必要となるパスワードになります)
「次へ」ボタンをクリックして下さい。
WS000023

最後に「要約」画面が表示されますので、問題が無ければ「追加」ボタンをクリックして下さい。
WS000016

「追加」ボタンクリック後、ラズパイからIoTPlatformへデータを送信する際に必要な認証情報(APIKey)が表示されます。
ラズパイ上で実行するPythonプログラムと、Bluemix上で温湿情報を表示するためのNode-REDで作成したプログラムで必要なので、メモして下さい。
WS000017

以上でIoTPlatform側での設定作業は終了となります。
お疲れ様でした。

Node-REDの準備

次に、IoTPlatformが受け取った温湿情報をBluemix上で表示するためのアプリケーション実行環境の1つである、Node-REDを準備していきます。
先ほどと同じで、ページ右上に表示された「カタログ」をクリックして下さい。
画面が切り替わったら、「ボイラープレート」カテゴリ内に表示されている「Node-RED Starter」をクリックして下さい。
WS000001

画面が切り替わり、「Node-RED Starter」のオーダー画面が表示されます
画面右側の設定画面で、「名前」と「ホスト」を自由に記入頂き、作成ボタンをクリックして下さい。
(その他の設定値はデフォルトのままで問題ありません)
(名前・ホストはBluemixを利用している全ユーザと被らないネーミングにする必要が有りますので注意下さい)
WS000002

作成ボタンをクリック後、画面上に「アプリケーションをステージングしています~」といった文章が表示されますので、構築が完了するまで休憩になります。
実際にNode-REDの開発環境が構築終了すると「アプリは稼働しています。」と表示されます。
WS000004

一旦、ページ右上の「ダッシュボード」をクリックします。
Top画面に戻りましたら、ダッシュボードの「アプリケーション」内に表示されたNode-REDのアイコンをクリックします。
WS000018

Node-REDの管理画面が表示されたら、「サービスまたはAPIのバインド」をクリックします。
WS000019

先ほど作成した「Internet of Things~」が表示されますので、左横のチェックボックスにチェックを付け、「追加」ボタンをクリックします。
(この作業によりNode-REDのアプリケーション稼働環境からIoTPlatformの環境にアクセス出来るようになります。)
WS000020

最後に、Node-REDの再起動を求められる「再ステージ」に関する注意画面が表示されますので、「再ステージ」ボタンをクリックして下さい。
WS000021

Node-REDの再起動が終了すると、ページ右横に「アプリは稼働しています」と表示されますので、表示が変更された事を確認しましょう。
WS000022

以上でBluemix上での環境構築は終了となります。
お疲れ様でした。
次は、プログラム作成に移りますので頑張っていきましょう。

Raspberry PiからBluemixへ温湿情報を送信するためのプログラムを作成

2回目(DHT11センサーのセットアップ)の記事で作成した、node.jsプログラムを拡張して、Bluemix上の開発環境へ温湿情報を送信したいと思います。
まず、温湿情報を送信するためのモジュールibmiotfをインストールします。
下記のコマンドを実行して下さい。

sudo npm install ibmiotf
cd /<個々のディレクトリ>/node_modules/node-dht-sensor
node-gyp configure
node-gyp build

※ibmiotfをインストールすると、「node-dht-sensor」の再ビルドが必要になります。

コマンドを実行すると下記のワーニング情報が表示されるかもしれませんが、今回は無視してかまいません。

gyp WARN EACCES user "root" does not have permission to access the dev dir ~
gyp WARN EACCES attempting to reinstall using temporary dev dir ~
npm WARN enoent ENOENT: no such file or directory, open '/work/dhtapp/package.json'
npm WARN dhtapp No description
npm WARN dhtapp No repository field.
npm WARN dhtapp No README data
npm WARN dhtapp No license field.

前回の記事で作成したdhtapp01.jsをコピーして新しくdhtapp02.jsを作りたいと思います。
下記のコマンドを実行して下さい。

pi@raspberrypi:/work/dhtapp
$ sudo cp -p dhtapp01.js dhtapp02.js

dhtapp02.js内のソースコードは以下に書き換えて下さい。
※先頭の「var config」配下で、「<組織 ID>」・「<デバイス ID>」・「<デバイス・タイプ>」・「<認証方式>」・「<認証トークン>」はIoTPlatformの環境を構築した際に表示された認証情報(APIKey)になります。それぞれ書き換えてプログラムを作成して下さい。

var sensorLib = require('node-dht-sensor');
var Client = require("ibmiotf").IotfDevice;

var config = {
"org" : "<組織 ID>",
"id" : "<デバイス ID>",
"type" : "<デバイス・タイプ>",
"auth-method" : "<認証方式>",
"auth-token" : "<認証トークン>"
};

var client = new Client (config);
client.connect();

client.on("connect", function () {
var sensor = {
initialize: function () {
return sensorLib.initialize(11, 4);
},read: function () {
var dateObj = new Date() ;
var year = dateObj.getFullYear() ;
var month = dateObj.getMonth() + 1 ;
var date = dateObj.getDate() ;
var hour = dateObj.getHours() ;
var minute = dateObj.getMinutes() ;
var second = dateObj.getSeconds() ;
var date = year + "/" + month + "/" + date + "-" + hour + ":" + minute + ":" + second + "" ;
var readout = sensorLib.read();
console.log('nowdate: '+ date +
', tem: ' + readout.temperature.toFixed(2) + 'C, ' +
'hum: ' + readout.humidity.toFixed(2) + '%'
);
payload = JSON.stringify({d : { tem : readout.temperature.toFixed(2),
hum : readout.humidity.toFixed(2),
nowdate : date }});
client.publish ("eid", "json", payload);
setTimeout(function () {
sensor.read();
},1500);
}
};

ソースコードの書き換えが完了したら、早速実行してみましょう。
以下のコマンドを実行して結果を確認して下さい。
画面に、時間・温度・湿度情報が表示されたら、正常にセンサーから情報が取得できている事とIoTPlatformに情報を送信出来ている証拠になります。
(今回のソースコードでは温度と湿度情報に合わせて時間も取得するように修正しております)

pi@raspberrypi:/work/dhtapp
$ sudo node ./dhtapp02.js
nowdate: 2016/5/10-22:39:24, tem: 28.00C, hum: 93.00%
nowdate: 2016/5/10-22:39:26, tem: 28.00C, hum: 93.00%
nowdate: 2016/5/10-22:39:28, tem: 28.00C, hum: 36.00%
nowdate: 2016/5/10-22:39:30, tem: 28.00C, hum: 35.00%
nowdate: 2016/5/10-22:39:33, tem: 28.00C, hum: 35.00%
nowdate: 2016/5/10-22:39:36, tem: 28.00C, hum: 35.00%

上手く実行出来ましたか?
因みにIoTPlatformの管理画面にアクセスし、接続ログを確認することでラズパイから送信されたデータが届いているか確認する事も出来ます。
WS000024

補足ですが、IoTPlatformへのデータ送信が失敗すると下記の様なエラー情報が表示されます。
ソースコード内で認証情報の記載等に誤りが無いか確認してみましょう。

pi@raspberrypi:/work/dhtapp
$ sudo node ./dhtapp02.js
Iotfclient is offline. Retrying connection
Iotfclient is offline. Retrying connection
Iotfclient is offline. Retrying connection
Iotfclient is offline. Retrying connection
Iotfclient is offline. Retrying connection

ソースコードの補足

サンプルプログラムとして作成したdhtapp02.jsですが、実際にIoTPlatformに対して情報送信を行っているコードは以下の部分になります。
payload変数に送信したい情報をJSON形式で格納し、client.publish関数を使い情報をパブリッシュしています。
ibmiotfの詳しい使い方については、下記のサイトへアクセスしてドキュメントを確認してみて下さい。
また、webにもIBMが公開している記事や、Qiita等で有志の方々が公開している記事がありますので、検索して参照下さい。
https://docs.internetofthings.ibmcloud.com/ja/nodejs/node-js_devices.html

payload = JSON.stringify({d : { tem : readout.temperature.toFixed(2),
hum : readout.humidity.toFixed(2),
nowdate : date }});
client.publish ("eid", "json", payload);

更に補足すると、TeraTermの画面に温湿情報を表示しているのは「console.log(~)」が担ってます。

console.log('nowdate: '+ date +
', tem: ' + readout.temperature.toFixed(2) + 'C, ' +
'hum: ' + readout.humidity.toFixed(2) + '%'
);

Bluemix上でRaspberry Piから送信された温湿情報を表示するためのプログラム

Raspberry PiからBluemix上のIoTPlatformへ無事に温湿情報を送信することが出来ました。
次は、IoTPlatformに送信された温湿情報をNode-REDで受け取り表示するためのプログラムを作成します。
Bluemixのダッシュボード画面に表示されたNode-REDのアイコンから、「URLを開く」マークをクリックします。
WS000025

Node-REDのGUI画面が開きますので、「Go to your Node-RED flow editor」ボタンをクリック、エディター画面が表示された事を確認して下さい。
WS000026
WS000027

エディター画面が表示されましたら、画面左から必要な機能を持ったノードを画面中央にドラッグアンドドロップしてプログラムを構成していきます。
まずは最初にRaspberry Pi上から送信された温湿情報をNode-REDのDebug画面に表示する方法を記載します。
早速画面左から「ibmiot」と書かれたノードを画面中央に配置して下さい。
WS000028

次に「IBMIot」ノードをダブルクリックして下さい。
以下の情報を入力し、「OK」ボタンをクリックして下さい

項目 設定値
Authnetication Bluemix Service
Input Type Device Event
Debice Type IoTPlatformで設定したDeviceType(今回の例では[raspi])
Device ID IoTPlatformで設定したDeviceId(今回の例では「raspi001」)
Event All
Format json
Name 自由(ノード名を記載する箇所です)

WS000033

続いて、「Debug」ノードを選択し、画面中央に配置します。配置後、「IBM IoT」ノードと「Debug(msg.payload)」ノードを繋げます。
(繋ぎ方は、ノード右横の灰色の四角形を左クリックしながら、繋げたいノードの灰色四角形までカーソルを合わせて下さい)
WS000030

以上でプログラムは終わりです。
それではプログラムを実行したいと思います。画面右上の「Deploy」ボタンをクリックして下さい。
画面上に「Successfully~」と表示されたら、正しくプログラムの実行ができている状態です。

WS000031

この状態でRaspberry Piにアクセスして頂き「dhtapp02.js」実行してみてください。

pi@raspberrypi:/work/dhtapp
$ sudo node dhtapp02.js

「debug」タブに温湿情報が表示されていたら無事成功です。
おめでとうございます。

WS000034

まとめ

皆様如何だったでしょうか。
ラスト記事が一番長くなりましたが、振り返ってみると実はそんなに大変な作業は無かったと思います。
今回の記事ではラズパイから送られた情報をDebugとして表示させる所までで終わりとなり、若干の物足りなさもあるかもしれません。
もし宜しければ次のステップとして、Twilioと連携してSMSで温湿情報を通知するといったプログラムをNode-REDで実施してみるのは如何でしょうか。

今後も、ラズパイやBluemixを使った記事を多く書いていきたいと思いますので、是非お時間あるときに読んで頂けたら幸いです。
以上で「【2016年度版】DHT11+Raspberry Pi+BluemixでIoTを体験」は終りとなります。
ありがとうございました。