Node-REDとAmbientでIoTデーターを可視化する

  • 4
    いいね
  • 0
    コメント

IoTデーター可視化サービス「Ambient」と、Node-REDからの使い方について紹介します。

IoTデーター可視化サービス「Ambient」

Ambientはマイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)するクラウドサービスです。

Ambient structure

Ambientを使うにはユーザー登録(無料)が必要です。ユーザー登録し、ログイン後のページで「チャネルを作る」ボタンをクリックするとチャネルが生成され、「チャネルId」と「ライトキー」が設定されます。Ambientにデーターを送信する時は、この「チャネルId」と「ライトキー」を使います。

channel create

マイコンからセンサーデーターをAmbientに送り、可視化する

マイコンでセンサーを制御し、データーをAmbientに送信して可視化する事例を、Raspberry Piを例に説明します。

下の写真はRaspberry Pi3にHDC1000という温度・湿度センサーをつないだものです。

RaspberryPi_hdc1000

プログラムはPythonで書きました。PythonでAmbientにデーターを送るライブラリーをGithubに公開してあるので、Raspberry Pi上で次のようにライブラリーをインストールします。

pi$ sudo pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git

pi$ pip freeze | grep ambient
ambient==0.1.0

プログラムは次のような感じです。

# coding: utf-8

from time import sleep
import hdc1000
import ambient

hdc1000 = hdc1000.Hdc1000(0x40, 7)
ambi = ambient.Ambient(100, "your_writeKey") # ご自分のチャネルID、ライトキーに置き換えてください

print 'Manufacturer ID: 0x%04x' % hdc1000.readId()

while True:
    temp = hdc1000.getTemp()
    humid = hdc1000.getHumid()
    print 'temp: %.1f, humid: %.1f' % (temp, humid)

    r = ambi.send({"d1": temp, "d2": humid})
    print 'Status code: %d' % r.status_code

    sleep(300)

このプログラムを動かすと、Raspberry Piから5分ごとに温度・湿度・気圧データーがAmbientに送られます。Ambientはデーターを受信し、蓄積し、グラフ化します。Ambient側は何も設定しなくても、次のようなグラフが生成されます。

default chart

プログラムはGithubに公開しました。

AmbientではRaspberry Pi以外にもArduino用C++ライブラリー、mbed用C++ライブラリーを用意してあります。詳しくはAmbientのドキュメントを御覧ください。

Node-REDからAmbientにデーターを送る

Node-REDからAmbientにデーターを送るためにはAmbientノードを使います。AmbientノードはNode-REDライブラリに登録してあるので、次のようにnpmでインストールできます。

$ cd $HOME/.node-red
$ npm install node-red-contrib-ambient

インストールすると、Node-REDのパレットの「advanced」カテゴリーにAmbientノードが追加されます。

Ambient Node

ワークスペースにAmbientノードをドラッグし、Ambientノードをダブルクリックして、データーを送信するチャネルの「チャネルId」と「ライトキー」を設定すれば準備完了です。

Ambientにデーターを送信する時は、データーを次のようなJSON形式でmsg.payloadにセットします。データーは8種類、"d1"から"d8"まで送ることができます。

{"d1":データー1, "d2":データー2, "d3":データー3, ...}

センサーデーターをWio nodeからNode-RED経由でAmbientに送る

Groveセンサーが二つ繋げられて、WiFiで通信できるWio nodeという小型マイコンボードがあります。Wio nodeを制御するNode-REDのノードを使って、Wio nodeに繋いだセンサーデーターをNode-RED経由でAmbientに送って可視化した事例を紹介します。今回、センサーとしては温湿度センサーと光センサーを接続しました。

Wio nodeにセンサーを繋いだ写真

Flowの大まかな流れは次のようになっています。

1.Node-REDのInjectionノードで5分毎にイベントを発生させ、3つのWio nodeのsensorノードを起動する
2.各sensorノードがWio nodeのセンサーデーター(温度、湿度、明るさ)を要求する
3.Wio nodeからセンサーデーターがNode-REDのsensorノードに返される
4.3つのsensorノードからのデーターをjoinノードで同期させて一つのメッセージにまとめる
5.functionノードでメッセージの形を変換し、Ambientノードにデーターが渡される
6.AmbientノードがAmbientにデーターを送信し、Ambientがデーターをグラフ表示する

Wio nodeのsensorノードは温湿度センサーのように複数のデーターを返すセンサーであっても、そのうちのどれか一つの値を返すように作られています。そこで三つのsensorノードを置き、それぞれで温度、湿度、明るさデーターを取得し、その後にjoin関数で三つのデーターが揃うのを待つようにしました。

20161206wionode-flow.jpg

sensorノードは次のように設定しています。

sensor node

OutputのデフォルトはParsed Valueですが、これだと出力が数値だけになってしまい、三つの出力をjoinした時に温度か湿度か明るさか区別がつきません。そこでOutputをRaw Objectに設定しました。三つのsensorノードの出力はそれぞれ次のような形式になります。

温度: {"celsius_degree": 値}
湿度: {"humidity": 値}
明るさ: {"lux": 値}

join関数の出力は

{"celsius_degree": 値, "humidity": 値, "lux": 値}

という形式になります。Ambientに渡すデーターは

{"d1": 値, "d2": 値, "d3": 値, ...}

という形式ですので、データー形式を変換する次のような関数を書きました。

    var data = {
        "d1": msg.payload.celsius_degree,
        "d2": msg.payload.humidity,
        "d3": msg.payload.lux
    }
    msg.payload = data;
    return msg;

出来上がったflowをDeployして動かすと、Wio nodeのセンサーで測定した温度、湿度、明るさがAmbientサイトでグラフでみることができます。この事例では温度と湿度を左の一つのグラフに表示し、右のグラフに明るさを表示しています。

チャート

まとめ

ご紹介したように、Ambientは簡単に使い始められるIoTデーター可視化サービスです。Node-REDからも簡単に使えて、データーを直感的に、分かりやすく表示することができます。

設定なしでも十分使えますが、Ambientでは複数のデーターを一つのグラフにまとめたり、ある期間の平均値や合計値を計算して表示したりといったカスタマイズが可能です。

是非一度、Ambientを使ってみてください。Facebookの「Ambientラボ」というグループで情報交換もしているので、覗いてみてください。