Intel Edisonからのセンサデータをお手軽にグラフプロットするIoT Analyticsの使い方

このエントリの概要

Intel Edison にくっつけたセンサのデータを, IoT AnalyticsというIntelのサービスへPublishし,リアルタイムにグラフとしてプロットする方法について説明します.
以下の様なグラフを簡単に作ることができます.

graph

IoT Analyticsの利点

まだ開発段階だと思うので,全ての機能が正常に動作してるかがわかりません(というかそもそもHow to 的なものが整備されていない……).手探りで触ってみて感じた利点は以下.

  • Edisonを使ってデータを収集するまでのハードルがめちゃくちゃ低い

    • これはiotkit-commの恩恵が主かな?
    • サーバの準備,サーバクライアント間のプロトコル選定,収集プロトコル,グラフ化プログラムなどなどが準備済み
  • ネットワーク越しのセンサデータをリアルタイムにグラフにプロットして確認できる

  • CSVもリアルタイムに得られるから他の分析ツールへ移行しやすい
  • 閾値などを使ってルールを記述して,マッチするときにアラートをメールで送れる?(と思うんだけどエラーが出ていて利用できてない……説明もない)
  • サーボとかもこれを通して操作できる??(と思うんだけどエラーが出て利用できていない……説明もない)

手順

  1. IoT Analytics アカウントをつくる
  2. EdisonをIoT Analyticsに登録する
  3. Edisonで取得したデータをPublishするためにEdisonのセットアップを行う
  4. dataをPublishする
  5. Publishされたデータを閲覧する
  6. CSVで取得してExcelでプロットしてみる
  7. CSVで取得してPythonでSciPy, matplotlibを使ってプロットしてみる

1. IoT Analytics アカウントをつくる

IoT Analyticsへアクセスする.OAuth使うと問題が起きるみたいなコメントがどっかにあった気がするけど実際どうなんだろう.不安だったのでメルアドで登録した.

2. EdisonをIoT Analyticsに登録する

下図を参照.AccountメニューのDetailsタブにアクティベーションキーがあるのでメモしておく.更新ボタンを押してから1時間アクティベーションキーが有効になる.目のボタンを押すとキーが見えるようになる.

アクティベーションキーの場所

アクティベーションキーを取得したら,そのキーを用いてEdisonをIoT Analyticsへ登録するためにEdison上で下記コマンドを実行する.

# [activation-key]は先ほどメモしたアクティベーションキーに置き換える
$ iotkit-admin activate [activation-key]

以下の様な表示がされたら登録は完了.

2014-11-02T14:40:07.571Z - info: Activating ...
2014-11-02T14:40:09.146Z - info: Saving device token...
2014-11-02T14:40:09.159Z - info: Sending attributes...

以下の様なエラーが出るときはアクティベーションキーが間違ってます.
ぼくはI(大文字アイ)l(小文字エル)を間違えてました.フォント的に見難い.

2014-11-02T14:39:58.188Z - error: Activation Rejected:  {"code":1410,"message":"Invalid Activation Code"}  --> error
2014-11-02T14:39:58.194Z - error: Error in the activation process ... 300

3. Edisonで取得したデータをPublishするためにEdisonのセットアップを行う

iotkit-agentを有効にして起動します.

$ systemctl enable iotkit-agent
$ systemctl start iotkit-agent

4. dataをPublishする

iotkit-commを使ってClientアプリケーションを記述します.iotkit-commについて分からなければ,以前のエントリを参考にしてください.

4-1. Service Specificationを記述する

まず,IoT Analyticsを使ったService Specificationを作ります(enableiot-cloud-spec.json)

//enableiot-cloud-spec.json
{
    “type”: {
        “name”: “enableiot-cloud”,
        “protocol”: “tcp”,
    },
    “address”: “127.0.0.1”,
    “port”: 1844
}

4-2. データをPublishするコードを書く

次に,データをIoT AnalyticsへPublishするためのコードを書きます.
公式のチュートリアルはデータを1回送って終わりだからグラフにした時におもしろくないので,5秒ごとにランダムなデータを送信するように修正します.

//temperature_sensor.js
var iotkit = require(‘iotkit-comm’);
var spec = new iotkit.ServiceSpec(“enableiot-cloud-spec.json”);
var sensor_value;

iotkit.createClient(spec, function(client){
    client.comm.registerSensor(“garage”, “temperature.v1.0”);

    setInterval(function(){
        sensor_value = 40 + Math.floor(Math.random() * 31);
        client.comm.publish(JSON.stringify({“n”: “garage”, “v”: sensor_value}));
    }, 5000);
});

コードを書いたら,node.jsを使って実行します.

node temperature_sensor.js

ここでのポイントは2つです.

  • client.comm.registerSensor() を使って利用するセンサの種別と名前(ID)を登録する.
  • cilent.comm.publish() を使ってデータをPublishする.データの形式は,client.comm.registerSensor()で登録した名前と,valueのペアで構成されるJSONです.

つまり,IoT Analytics側でセンサの持つ意味を判別するためのニックネーム(ID)をセンサ種別(温度,湿度など)と合わせて保持しておき,Publishする際にはどのセンサからのデータなのかということをIDを使ってIoT Analyticsへ教えてあげるということになります. ここで,センサのことをComponentと呼び,ひとつのデバイスは複数のComponentを持つことができます.

補足:接続確認

IoT Analyticsへ接続できているかを以下のコマンドで確認できる.うまくいかない場合の切り分けに.

$ iotkit-admin test
補足:Componentの初期化

センサを登録していくと,そのうち使わないやつばっかりになってくることがある.そんなときはデバイスに登録しているComponentを初期化してやる.個別に削除する方法は分かってない.

iotkit-admin initialize  
iotkit-admin reset-components 

4-3. 補足:センサ種別について

デフォルトで定義されているセンサーは,以下の3つです. - 温度センサ:temperature.v1.0 - 湿度センサ:humidity.v1.0 - 電源状態:Powerswitch.v1.0

4-4. 補足:独自センサをIoT Analyticsへ登録する

もし,上記の3つ以外のセンサを扱いたい場合,事前に登録をしておく必要があります.ここでは距離データ(mm)を得ることができる距離センサを登録してみましょう.

AccountページのCatalogタブを開くと,そのアカウントの中で定義されているセンサ種別が表示されます(正確にはアクチュエータも含まれますが,今回はセンサに絞って話を進めます).画面下部にあるAdd a new Catalog Itemというボタンをクリックします. Componentページ

すると,下図のように新しいComponentを定義するための画面が表示されます.ここでは図にあるように,mm単位で距離を出力する距離センサを定義してみます. Componentページ

Saveをボタンを押すとComponentが保存されます.確認のためにもう一度アカウントメニューのCatalogタブを開いてみます.さきほど作成した距離センサが作成されました. Componentページ

定義した距離センサをさきほど4-2で作成したコード中で以下のように記述すれば,距離センサから取得したデータをIoT AnalyticsへPublishすることができます.

client.comm.registerSensor(“living_tv”, “distance.v1.0”);
client.comm.publish(JSON.stringify({“n”: “garage”, “v”: distance_value}));

5. Publishされたデータを閲覧する

ChartメニューからグラフへプロットするDeviceとComponentを選択すると,取得したデータのグラフが表示されます.グラフ上部のボタンと,グラフ下部のスライダーを使って表示する時間幅を調整することができます.自動更新はされないので更新ボタンを押すことで新しいデータを確認する必要があります.リフレッシュボタンを押すと呼ばれる関数を定期的にコールするJavascriptを実行すれば良いでしょう.

graph

6. CSVで取得してExcelでプロットしてみる

グラフ上部のshareボタンを押すとCSVでエクスポートすることができます.

csv

これをExcelで読み込んで線グラフとしてプロットしてみます. excel

7. CSVで取得してPythonでSciPy, matplotlibを使ってプロットしてみる

今度はPythonを使ってプロットしてみる.scipyとmatplotlibを使う.

>>> import scipy as sp
>>> data = sp.genfromtxt("data.csv", delimiter=",")
>>> x = data[:, 5]
>>> y = data[:, 6]
>>> x = x[~sp.isnan(y)]
>>> y = y[~sp.isnan(y)]
>>> import matplotlib.pyplot as plt
>>> plt.plot(x, y, 'bo-')
[<matplotlib.lines.Line2D object at 0x109f73bd0>]
>>> plt.grid()
>>> plt.show()

グラフ

確認中のこと.

Controlメニューから,デバイスのアクチュエータを操作する方法

例えばサーボとかの動作角度を指定してサーバから動作させるとかができると思うんだけど,全然使い方がわからない… control

Rulesメニューからルールを登録する方法

デバイスのComponentのデータを監視して,設定しておいた閾値以上になるとアラートをメールで送るとか,そういうルールが記述できると思うんだけど,最後の登録のところでエラーがでる… rules