4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

enebularを使ってセンサデータ収集/可視化システムを作ってみる

Last updated at Posted at 2019-04-14

はじめに

 株式会社ウフルでは、IoTシステムを構築するためのクラウドサービスであるenebularを提供しています。enebularでは、Node-REDフローの開発、そのフローのクラウドやデバイスへの配布を行なうことでIoTシステムを構築できます。さらに、enebularではInfoMotionというデータの可視化機能も提供しており、これを利用することでIoTシステムで集めたデータを可視化することもできます。
 この記事では、センサデータを入出力するサーバ機能の開発と、そのサーバ機能に蓄積したセンサデータをInfoMotionで可視化する方法を示します(デバイスからセンサデータを出力する部分についてはダミーとします)。サーバ機能の実装にはクラウドアプリケーションプラットフォームであるherokuを利用します。

image01.png

 InfoMotionで可視化するデータは、FirebasePubNub、API Gateway(AWSのAPI Gatewayを使って作成したサーバ機能を想定)のData Sourceに蓄積することを想定していますが、Node-REDフローを使ってもData Sourceであるサーバ機能を作成できることを説明したいと思います。

開発するNode-REDフローはenebular上で確認することができます。必要に応じご自分のenebularのProjectにImportしてご利用ください。

準備

利用するサービスのユーザ登録

 開発を始める前に以下のクラウドサービスのアカウントを取得します。

  • enebular
    上記リンクをクリックし、右上の新規登録からユーザ登録を行ってください。
  • heroku
    上記のリンクをクリックし、新規登録からユーザ登録を行ってください。

今回の開発はどちらも無料利用の範囲で試すことができます。

herokuのアプリケーション追加

 enebularで作成したNode-REDフローを配置する場所となるherokuのアプリケーションを追加します。herokuにログインし、Dashboardからアプリケーションを追加します。センサデータを保存するサーバ機能になるのでアプリケーションの名前をsensor-data-repoとしました。ただし、herokuの名前は重複できないため、試す際には別の名前をご指定ください。
 次にPostgreSQLを準備します。herokuのsensor-data-repoのOverview画面からConfigure Add-onsをクリックします。検索欄にHeroku Postgresと入力し、PlanをHobby Dev - Freeを選んでProvisionを押します。

次にこのPostgreSQLのデータベースにテーブルを追加します。下記の記事等を参考に実施されると良いと思います。

今回は、データベースにテーブルを作るときに利用するSQLは下記とします。
これは部屋毎(roomname)にその部屋の温度(temperature)を記録し、記録した時刻(ts)を保存するためのテーブルを作るSQLです。

-- Table Definition ----------------------------------------------

CREATE TABLE sensordata_tbl (
    id SERIAL PRIMARY KEY,
    temperature numeric NOT NULL,
    roomname text,
    ts bigint NOT NULL
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX sensordata_tbl_pkey ON sensordata_tbl(id int4_ops);

開発

センサデータを蓄積するサーバ機能

 enebularのNode-REDのWeb Editorを使用して、センサデータを蓄積するサーバ機能を開発します。
 まず、enebularにサインインし、Projectを作成します。画面上部のProjectsをクリックし、右上のCreate Projectをクリックして適当なProject名を入力してSubmitボタンを押下します。
 次にFlowを作成します。左のメニューからFlowsをクリックします。右下の+ボタンを押下し、表示されたCreate Flowダイアログに適当な名前を入力してContinueボタンを押下します。表示された画面にあるEditボタンを押下するとNode-REDのWeb Editorが開きます。Web Editorでフローを編集した場合、右上のデプロイボタンを押下して保存します。このデプロイは、編集したフローをWeb Editor上で有効化することを意味し、クラウドやデバイスに配置するには、別途デプロイ作業が必要となります。

Web Editorでは以下の処理を開発します。

  • センサデータの配信  
    PostgreSQLに保存したセンサデータをHTTP(GET)で配信します。InfoMotionでは、HTTPリクエスト時にURLに以下のように開始時刻と終了時刻を指定することで可視化したい範囲の時間帯を指定します。時間は1970/1/1 00:00:00.000(GMT)からの経過ミリ秒数で指定します。
    https://<サーバ名>/<path>?start=<開始時刻のミリ秒数>&end=<終了時刻のミリ秒数>

  • センサデータの受信  
    HTTPリクエスト(POST)でセンサデータを受け取りPostgreSQLに保存します。

作成するNode-REDフローは次のようになります。

スクリーンショット 2019-04-14 7.40.42.png

 PostgreSQLを利用するノードは標準では含まれないため、node-red-contrib-re-postgresのノードをインストールします。[右上のメニュー]-[パレットの管理]-[ノードを追加]をクリックする。検索欄にnode-red-contrib-re-postgresと入力し、ノードを追加をクリックします。
 各処理について説明します。

2021/5/8: node-red-contrib-postgresが利用できなくなっていたため同様の機能を提供するnode-red-contrib-re-postgresを利用するように修正しました

センサデータの配信

httpノード

httpノードにより、データ取得のリクエストを受け付けます。
プロパティを以下のように設定します。
メソッド: GET
URL: /apigw-datasource

これは上記URLにHTTPのGETリクエストを受け付けることを表しています。

functionノード(query)

 PostgreSQLに対するqueryを行なうSQLを作る処理を行います。functionノードのプロパティに下記のJavaScriptを記載します。

const start = msg.payload.start;    // startに設定された時刻を取得
const end = msg.payload.end;        // endに設定された時刻を取得
const apiKey = msg.req.headers["x-api-key"];  // 認証に利用するx-api-keyヘッダの値を取得する
if( apiKey == null || apiKey != "test-api-key") {  // 認証の値が一致するか確認する
    node.error("authentication error", msg);  // test-api-keyに一致しないならエラーとする
    return;
}
if( start == null || end == null) {
    node.error("parameter error", msg);  // start又はendに値が設定されていなければエラーとする
} else {
    msg.payload = "select * from sensordata_tbl where ts > " + start + " and ts < " + end + ";";  // msgにSQLを格納する(次のノードで利用する)
    return msg;
}

postgresノード

 上のfunctionノードで作成したSQLをPostgreSQLで実行します。
 このノードには、PostgreSQLにアクセスするための情報をherokuのDashboardから取得し登録します。
 herokuにログインし、sensor-data-repoのOverview画面を表示し次のようにリンクを辿ります。[Heroku Postgres]-[上部のSettings]-[右のView Credentials...]により、Credentials情報を表示します。

 次にpostgresノードを配置して、ダブルクリックすると表示されるプロパティのServer項目の右にある鉛筆をクリックします。
 herokuのCredential情報を参照し、表示された各入力欄に値を入力します。
 Receive query output ?をチェックします。これにより、SQLの実行が終わったら次のノードが呼ばれるようになります。

functionノード(convert)

PostgreSQLから取得したデータをInfoMotionが読める形式に変換します。functionノードのプロパティに下記のJavaScriptを記載します。

let list = [];
const results = msg.payload;
results.forEach((val, index, arr) => {
    const obj = {
        temperature: Number(val.temperature),
        roomname: val.roomname,
        ts: Number(val.ts)
    };
    list.push(obj);
})
msg.payload = list;
return msg;

roomname(部屋名)、温度(temerature)、時刻(ts)を含むJavaScriptのオブジェクトを作成しています。

http responseノード

 生成したJavaScriptオブジェクトを呼び出し元に返します。HTTPでは正常終了時の状態コードは200にするルールであるため、プロパティの状態コードは200とします。

センサデータの受信

httpノード

httpノードにより、センサデータを受信します。
プロパティを以下のように設定します。
メソッド: POST
URL: /sensordata

これは上記URLにHTTPのPOSTリクエストを受け付けることを表しています。

functionノード(insert)

 PostgreSQLに受信したデータをinsertするSQLを作る処理を行います。functionノードのプロパティに下記のJavaScriptを記載します。

const roomname = msg.payload.roomname;
const temperature = msg.payload.temperature;
const apiKey = msg.req.headers["x-api-key"];
if( apiKey == null || apiKey != "test-api-key") {
    node.error("authentication error", msg);
    return;
}
if( temperature == null) {
    node.error("parameter error", msg);
} else {
    msg.payload = "insert into sensordata_tbl (roomname, temperature, ts) values ('" + roomname + "', " + temperature + ", " + Date.now() + ");";
    return msg;
}

postgresノード

 センサデータを保存するSQLを使ってPostgreSQLのデータベースに保存します。この設定内容は、センサデータの配信のために設置したpostgresノードと同じ内容とします。

出力のhttp responseノード

 正常完了時の応答を返します。プロパティの状態コードに200を設定します。

エラーが発生したときの処理

catchノード

 センサデータの配置センサデータの受信の処理の中で発生したエラーを捕まえるためのノードです。上記で記したfunctionノードに記載したJavaScriptの中で以下のように書いた箇所でエラーが出力され、これを捕まえることができます。

node.error("parameter error", msg);

機能のtemplateノード

呼び出し元に応答するエラーの内容を定義します。プロパティ画面には以下のように定義します。

スクリーンショット 2019-04-15 1.02.21.png

http responseノード

 templateノードで生成したJSONを呼び出し元に返します。HTTPの異常終了時の状態コードは内容により種類がありますが、今回は内部エラーを表す500をプロパティの状態コードに設定します。

herokuへのデプロイ

 enebularを使って、作成したNode-REDフローをherokuに配置します。enebularのドキュメントのFrow Deploymentを参照し進めてください。

ダミーのセンサデータ送信

 今回は、温度センサの代わりにダミーのNode-REDのフローを定義します。作成するフローを以下に示します。

スクリーンショット 2019-04-14 9.14.09.png

injectノードを使って定期的(10秒毎)にイベントを発生させます。

スクリーンショット 2019-04-15 1.17.25.png

次のfunctionノード(ダミーデータ生成)ではダミーのセンサデータをランダムに作成します。プロパティに記載するJavaScriptを下記します。

const roomnames = ["living", "bedroom", "balcony"]
const roomname = roomnames[Math.floor(Math.random()*roomnames.length)]
msg.payload={roomname: roomname, temperature:15+Math.random()*5}
msg.headers = {"x-api-key":"test-api-key"}  // 認証に用いるAPIキーを設定する
return msg;

http requestノードでは、上記で作成したデータをherokuに配置したセンサデータの受信機能に送付します。以下のように設定します。

スクリーンショット 2019-04-15 1.24.04.png

URLは以下のように設定します。
https://sensor-data-repo.herokuapp.com/apigw-datasource

実行するには、上部のDeployボタンを押下した後、injectノードの左のボタンを押下すると10秒毎にランダムデータを生成し、そのデータをセンサデータの受信機能に送付するようになります。

InfoMotionの作成

 格納したセンサデータを可視化するためにenebularの機能の一つであるInfoMotionを使います。

 まずData Sourceを作成します。enebularにサインインし、次のようにリンクを辿ります。
 [上部のProjects]-[作成したProject名]-[左のメニューのData Sources]-[右下の+ボタン]
 表示されたダイアログのTitle(自由に決めてください)を入力し、Data Source TypeにはAPI Gatewayを入力します。EndpointAPI Keyの入力欄が表示されますので、下記のように入力します。

Endpoint: https://sensor-data-repo.herokuapp.com/apigw-datasource
API Key: test-api-key

 次に、可視化に用いるInfoTypeをImnportします。enebularの上部にあるDiscoverをクリックします。検索欄にlinechartと入力し、enebularの帯が表示されたInfoTypeをクリックします。Preview画面が表示されますので、右上のImportボタンをクリックし、今回作成したProject名を選択してInfoTypeを取得します。

 次に、左のメニューからInfoMotionsをクリックし、右下の+ボタンを押下します。表示されたダイアログで、Nameと必要に応じDescriptionを入力します。

[Manage Graphsボタン]-[Create Graphボタン]を押下し、次のように設定します。

スクリーンショット 2019-04-15 2.09.46.png

 Saveボタンを押下し、作られたGraphをAddするとDashboardにグラフが追加されます。表示した例を以下に示します。

スクリーンショット 2019-04-15 1.31.19.png

 上部の時刻表示をクリックすると表示する時間帯を選択できます。また、Dashboardのレイアウトを保存したい場合はSave Layoutボタンを押下します。

まとめ

 heroku等の他社サービスをプラットフォームとして利用してはいますが、enebularの機能を主に利用してセンサデータの収集と、そのデータを可視化する機能を、ほぼプログラミングレスで開発できることを示しました。
 今回はダミーで実現したセンサデバイス側の開発も、enebularではNode-REDを利用して実現できるため、センサデータの収集や可視化も含めたIoTシステムを全体を少ない手間で開発できます。
 是非enebularの利用をご検討頂ければ幸いです。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?