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

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

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

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

![Ambient structure](https://ambidata.io/wp/wp-content/uploads/2016/09/AmbientStructure.jpg)

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

![channel create](http://ambidata.io/wp/wp-content/uploads/2016/09/fig2-3.jpg)

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

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

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

![RaspberryPi_hdc1000](http://ambidata.io/wp/wp-content/uploads/2016/10/IMG_5471.jpg)

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

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

pi$ pip freeze | grep ambient
ambient==0.1.0
```

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

```Python
# 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](https://ambidata.io/wp/wp-content/uploads/2016/08/chart1-768x286.jpg)

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

* [AmbientのRaspberry Piサンプルプログラム](https://github.com/AmbientDataInc/ambient-python-lib)

AmbientではRaspberry Pi以外にもArduino用C++ライブラリー、mbed用C++ライブラリーを用意してあります。詳しくは[Ambientのドキュメント](https://ambidata.io/refs/)を御覧ください。

## 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](https://ambidata.io/wp/wp-content/uploads/2016/09/fig2-2-1.jpg)

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

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

```javascript
{"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にセンサーを繋いだ写真](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-2.jpg)

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](https://qiita-image-store.s3.amazonaws.com/0/120620/f6f6dc3d-a8d7-2a22-a3ec-088dc4fb351b.jpeg "20161206wionode-flow.jpg")

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

![sensor node](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-5.jpg)

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

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

join関数の出力は

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

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

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

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

```javascript
    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サイトでグラフでみることができます。この事例では温度と湿度を左の一つのグラフに表示し、右のグラフに明るさを表示しています。

![チャート](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-6.jpg)

## まとめ

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

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

是非一度、Ambientを使ってみてください。[Facebookの「Ambientラボ」](https://www.facebook.com/groups/ambientlab/)というグループで情報交換もしているので、覗いてみてください。