Tech Sketch Bucket of Technical Chips by TIS Inc.

話題のEdisonを使ってみよう2 Intel IoT PlatformのAnalytics Dashboardへデータ送信

Pocket

前回は使いはじめるための環境構築まで行いました。今回は実際にEdisonを利用してセンサーデータをクラウド上のサービスに連携してみようと思います。

今回やってみること

前回はセットアップとBluetoothで接続可能なセンサーデバイスであるSnesorTagとの接続までやってみました。今回はセンサーから取得できた値を、Edisonからクラウド上のサービスに送ってみたいと思います。

利用するのはIntelのIntel IoT Platformで提供されているIoT Analytics Dashboardです。IoT PlatformはIoTを構成するデバイスとソフトウェアを組み合わせIoT関連の新たなサービス開発を容易に進められるようにすることを目的とした基盤で、Intel自身が提供しているものです。

現在はDashboardで基本的なデバイスの管理・操作とデータの取得、チャートによる可視化などの機能が提供されています。それでは早速実際にデバイスを登録してセンサーデータを送信してみます。

SensorTagからのデータを送ってみる

実際に送ってみる中身ですが、前回せっかくSensorTagを接続するところまでやってみたので、SensorTagから取得可能なデータにしてみようと思います。具体的には気温と気圧の値になります。

事前の確認とやっておくこと

当然ですが、Edisonはセットアップ済みで、Wifi、有線いずれかでインターネットに接続できている状態にします。

また、IoT Platformを利用するには、事前にアカウントの登録が必要です。登録はIoT Platformローカルのアカウント登録フォームから行うか、もしくは、よくあるWebのサービスと同様に他サービスの認証機能を利用して登録するかのどちらかです。認証に利用できるサービスは現在Facebook、Google、Githubとなっています。ガイドのドキュメントに従って進めれば、説明の必要な特別な操作はない、いたって普通のアカウント登録ですので、詳細な説明は割愛します。

デバイスをPlatformに登録

さて、EdisonをPlatformに接続するには、事前にEdisonのデバイスをPlatformに登録する必要があります。登録を行う前に必要な確認やその他の手順についてはガイドのドキュメントに詳細が書かれていますので、ここでは主要な登録の操作のみ説明しておきます。

Edison側からの接続に必要なエージェントプログラムや、諸々の操作・管理に必要なツール、実際にプログラムを作成する際に必要なライブラリ群はIoT kitとして、すでにEdisonにプリインストールされています。デバイスの登録操作も提供されているツールを利用して行います。

利用するのはiotkit-adminコマンドです。登録の手順は以下の通り

PlatformのダッシュボードサイトからActivation Codeを取得

Activation Codeはダッシュボードのアカウントメニューから取得できます。PCなどからブラウザでアクセスし、Actication Codeをコピーしておきます。発行したActivation Codeの有効期間は1時間ですので、発行後1時間以内にデバイス登録を実行します。もし期限切れの通知が赤字で表示されていたら、Activation Codeのフォーム横の再生性ボタンで再生成します。

intel_iot_platform_account

Edisonからiotkit-adiminコマンドでActivationを実行

あらかじめEdisonにシリアルでのコンソールか、SSHを利用して接続し、操作可能な状態にしておきます。先ほどコピーしたActivation Codeを利用してコマンドラインから以下の通りコマンドを実行します。

上記の通りメッセージが表示され、Activation CodeがEdison側からPlatformに送信されてエラーなく登録が終了したら、ダッシュボードから確認してみます。ダッシュボードのメニューの「Devices」を選択して画面を開くと、デバイスのリストに先ほどActivationを実行したEdisonが追加されているはずです。

intel_iot_platform_devicelist

正確に確認するのにはDevice Idを利用します。Edisonのコマンドラインで以下のコマンドを実行し、表示されたDevice IdがデバイスリストのIdと一致しているか確認しておきます。

これでデバイスの登録まではできました。

センサーの登録

次に具体的な値を送ってくるセンサーを登録する必要があります。センサーはPlatform上、コンポーネントとして登録する形になっています。コンポーネントは特定のセンサーやアクチュエータを表すもので、Platform上のカタログにComponent Typeを登録しておくことで、複数の同一のセンサーやアクチュエータを同一のパラメータ定義(データ型やフォーマット)で利用することができるようになっています。こちらも詳細はガイドに譲るとして、主要な操作のみ説明します。

使用するセンサーに合わせた新規のコンポーネント登録

デフォルトでは、すでに温度、湿度、電源スイッチのComponent Typeが登録されている状態ですが、今回は新たに気圧コンポーネントを追加しておきます。コンポーネントの登録はダッシュボードのAccountページで、Catalogタブから行います。Add New Catalog Itemボタンを押下して、表示されるフォームから、センサーに合わせて必要なパラメータを選択・記述して作成します。

intel_iot_platform_componentdef

intel_iot_platform_compolist

Edison側からの登録

Edison側からセンサーに合わせて利用するコンポーネントの登録を実行します。今回は新規にコンポーネントを登録していますので、Edison上で起動しているエージェントはまだ追加されたコンポーネントを把握していない状態です。いったんエージェントを再起動してから登録を実行します。コンポーネントを新たに追加していない場合は、特にエージェントの再起動は必要ありません。エージェントの再起動と登録のコマンドは以下の通りです。

コンポーネントについては、それぞれtemp、pressというエイリアスを付けています。今後Edisonからデータを送信する際などに、こちらのエイリアスを利用することができます。

プログラムからデータの送信

それではSensorTagから取ったセンサー値をプログラムから送信してみたいと思います。今回はJavaScript(Node.js)でセンサー値の送信プログラムを書きます。EdisonはデフォルトでNode.jsが利用できるようになっているのと、前回SensorTagとの接続でNode上で利用できるモジュールを利用しましたのでこちらを採用することにしました。他にはPythonも利用することができます。

API自体はRESTのAPIとして公開されており、各言語での実装例がgithub上で公開されており、それらを参考に実装することができます。JavaScriptでの実装例はnpmでインストールすることでiotenable-pumpモジュールとして利用することができるようになります。今のところiotenable-pumpでは、上記で行ってきたデバイスやコンポーネントの登録まで全てAPI経由で行った上で、センサーデータを送るという実装になっています。今回は先にコマンドラインやダッシュボードからデバイスの登録やコンポーネントの登録は済ませていますのでiotenable-pumpの実装を参考にしつつ、センサー値の送信部分だけを記述しました。

ソースは以下のようなものになります。

センサー値を送っている処理はsendObservationです。送り先のURLはhttps://dashboad.us.enableiot.com/v1/api/data/[deviceId]となります。deviceIdは上記で登録した際にふられたものです。オプションでは、bodyに実際のセンター値が格納されるobservationを、headersのAuthorizationの値として、デバイスのアクティベーションを実行した際発行されたdeviceTokenをそれぞれ渡しています。それ以外のオプションは読んで字のごとくなので、ここでは説明を割愛します。

observationはmakeObservationで作成しています。中身はaccountId、送信時間のミリ秒値(on)、送信するデータの配列(data)です。送信データはmakeDataで作成しています。こちらの中身はcomponentId、送信時間のミリ秒値(on)、センサー値(value)です。

headersのAuthorizedで指定しているdeviceTokenとobservationで指定しているaccountIdは、それぞれ/usr/share/iotkit-agent/certs/token.jsonファイルから取得しています。iotkit-agentコマンドでデバイスのアクティベーションを実行した場合は、こちらのファイルにdeviceToken等が記録されるようです。

SensorTagから値を取るための一連の処理は66行目〜120行目になりますが、こちらは前回の記事で紹介したsensortagモジュールを利用した実装です。詳細な説明は割愛しますが、asyncモジュールの諸々のコントロールフローを使って、BLEでのSensorTagとの接続から、センサー値の取得までを実行しています。センサー値は連続してとりますので、コントロールフローのforeverを利用して1分に1回で取得するようにしています。

それぞれ値を入れたらrequestモジュールを利用して送信します。プラットフォームはMQTTにも対応しているようですが、今回は単純にHTTPで送信しています。また、今回は説明の便宜上使いませんでしたが、iotenable-pumpではPubSubモデルでの実装例があります。イベント毎に送信するといった処理を行いたい場合は、こちらの実装を参考にするとよいと思います。

実際に実行してセンサー値がプラットフォームへ送られると、ダッシュボードのメニューのチャートを選択すると送信されたセンサー値のチャート表示を見ることができます。画像では、ラインチャートで1時間の中での変化を見るためのチャートが表示されています(オフィスの中ですが、室温との関係もあって、気圧もけっこう変化してるものですね)。

edison_temp

edison_press

まとめ

今回はSensorTagから取ったセンサー値をIntel IoT PlatformにEdisonから送ってみました。ここでの行ってみた実装以外にもいろいろ実装例はあるので、公式のドキュメントを参考にしつつ、Arduinoベースで実装した場合やPythonで実装した場合なども見てみるとよいと思います。次回はモーターの制御などを試してみます。

エンジニア採用中!私たちと一緒に働いてみませんか?