Intel Edisonからのセンサデータをお手軽にグラフプロットするIoT Analyticsの使い方
このエントリの概要
Intel Edison にくっつけたセンサのデータを, IoT AnalyticsというIntelのサービスへPublishし,リアルタイムにグラフとしてプロットする方法について説明します.
以下の様なグラフを簡単に作ることができます.
IoT Analyticsの利点
まだ開発段階だと思うので,全ての機能が正常に動作してるかがわかりません(というかそもそもHow to 的なものが整備されていない……).手探りで触ってみて感じた利点は以下.
Edisonを使ってデータを収集するまでのハードルがめちゃくちゃ低い
ネットワーク越しのセンサデータをリアルタイムにグラフにプロットして確認できる
- CSVもリアルタイムに得られるから他の分析ツールへ移行しやすい
- 閾値などを使ってルールを記述して,マッチするときにアラートをメールで送れる?(と思うんだけどエラーが出ていて利用できてない……説明もない)
- サーボとかもこれを通して操作できる??(と思うんだけどエラーが出て利用できていない……説明もない)
手順
- IoT Analytics アカウントをつくる
- EdisonをIoT Analyticsに登録する
- Edisonで取得したデータをPublishするためにEdisonのセットアップを行う
- dataをPublishする
- Publishされたデータを閲覧する
- CSVで取得してExcelでプロットしてみる
- 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を定義するための画面が表示されます.ここでは図にあるように,mm単位で距離を出力する距離センサを定義してみます.
Saveをボタンを押すとComponentが保存されます.確認のためにもう一度アカウントメニューのCatalogタブを開いてみます.さきほど作成した距離センサが作成されました.
定義した距離センサをさきほど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を実行すれば良いでしょう.
6. CSVで取得してExcelでプロットしてみる
グラフ上部のshareボタンを押すとCSVでエクスポートすることができます.
これを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メニューから,デバイスのアクチュエータを操作する方法
例えばサーボとかの動作角度を指定してサーバから動作させるとかができると思うんだけど,全然使い方がわからない…
Rulesメニューからルールを登録する方法
デバイスのComponentのデータを監視して,設定しておいた閾値以上になるとアラートをメールで送るとか,そういうルールが記述できると思うんだけど,最後の登録のところでエラーがでる…