Wio node + Groveセンサー + Node-RED + Ambientで超簡単IoT


Wio nodeという小型マイコンボードがあります。Groveセンサーが二つ繋げられて、WiFiで通信できます。Wio nodeを制御するNode-REDのノードを使って、Wio nodeに繋いだセンサーデーターをNode-RED経由でAmbientに送ってグラフ化しました。とても手軽にIoTのプロトタイプシステムが作れます。

![Wio nodeの写真](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-1.jpg)

## つなぐモノの紹介

### Wio node

Wio nodeはSeeed Studio社が開発したマイコンボードです(上の写真。右は大きさの比較に置いた単3乾電池)。ESP8266というマイコンチップを搭載し、Groveセンサーが二つ繋げられ、WiFiで通信ができます。今回、センサーとしては温湿度センサーと光センサーを接続しました。

![Wio nodeにセンサーを繋いだ写真](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-2.jpg)

Wio nodeとGroveセンサーの設定は[こちらのページ](http://codezine.jp/article/detail/9654)を参考にしました。

Wio nodeをNode-REDで扱う方法は[こちらのページ](http://codezine.jp/article/detail/9624)を参考にしました。

### [Ambient](https://ambidata.io)

[Ambient](https://ambidata.io)はマイコンから送られるセンサーデーターなどを受信し、蓄積し、可視化(グラフ化)するIoTデーター可視化サービスです。[Ambientのユーザー登録や使い方はこちら](https://ambidata.io/docs/gettingstarted/)をご覧ください。

## 全体の構成と流れ

全体の構成は次の図のようになっています。

![全体構成](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-3.jpg)

最初、Node-REDはMacで動かし、後でIBM Mluemix上でも動かしてみました。

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

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

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

sensorノードにはWio nodeとの通信処理が含まれます。通信がエラーになった場合を考慮し、join関数ではただ待つのではなく、タイムアウトを設定し、一定時間以内に三つのデーターが揃わなかった場合、タイムアウトして一つまたは二つのデーターで処理を継続するようにしました。

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

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

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

OutputのデフォルトはParsed Valueですが、これだと出力は数値だけになってしまい、三つの出力をjoinした時に扱いにくいので、Raw Objectに設定しました。三つのsensorノードの出力はそれぞれ次のような形式になります。

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

join関数の出力は

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

という形式になるのに対し、Ambientに渡すデーターは

```
{"d1": 値1, "d2": 値2, "d3": 値3, ...}
```

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

```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)

## IBM Bluemix で動かす

ここまでは、Node-REDはMac上で動かしていました。このシステムを常時動かすにはNode-REDをクラウドで動かしたほうが便利です。IBM Bluemixは高機能なクラウドサービスで、コンポーネントの一つとしてNode-REDが用意されているので、今回のシステムをBluemixで動かしてみました。

Bluemix上のNode-REDにサードパーティー製のWio nodeノードやAmbientノードをインストールする方法は少し分かりにくかったのでメモを残します。

### BluemixのNode-REDにサードパーティー・ノードをインストールする

1.Bluemixのダッシュボードで「Gitの追加」をクリックする。ダイアローグが現れるので、「継続」「閉じる」をクリックするとGitリポジトリーが作られる。

![dashboard](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-7.jpg)

2.「コードの編集」をクリックする。

![edit](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-8.jpg)

3.package.jsonを選択し、その中のdependenciesに追加したいサードパーティー・ノードを追加する。今回は次の2行を追加しました。

```
        "node-red-contrib-wio-seeed":"0.1.x",
        "node-red-contrib-ambient":"0.0.x"
```

![package.json](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-9.jpg)

4.「BUILD&DEPLOY」をクリックする。

![build-deploy](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-10.jpg)

5.Gitのcommitとpushを促されるので、commitしてpushすると、BUILDされ、DEPLOYされる。

![deploy](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-11.jpg)

6.ダッシュボードに戻り、アプリを再起動し、Node-REDページをリドローすると、パレットにwio nodeノードとambientノードが追加されている

![パレット](http://ambidata.io/wp/wp-content/uploads/2016/10/fig3-12.jpg)

## まとめ

Groveセンサーには豊富な種類のセンサーが用意されているので、アイデア次第で様々なIoTシステムを短時間に組み立てることができます。

ただし、Wio nodeはREST APIでデーターをやり取りするサーバーとして動作しており、CPUをDeep Sleepさせて低消費電力で待つといった使い方ができません。バッテリーで長時間動かすのは厳しく、実験やプロトタイプなどで使うのに適しているようです。