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

Intel Edisonで iotkit-commを使うその3:Service SpecificationsとService Queriesについて.

前回のエントリの続き.
前回の説明ではJSONのサンプルとしてしか触れていなかった,Service SpecificationsとService queriesについてのもう少し詳しい説明.

もっと詳しいことを学ぶその3. Service Specifications と queriesについて

Service Specifications と queriesは,分散アプリケーションの開発をシンプルにするiotki-commライブラリの使い方を理解するためのキーだ.iotkit-commで記述された分散アプリケーションは,基本的にサーバとクライアントで構成される.
開発者はService を以下のステップで開発する.

  1. service specification を記述する
  2. specification に基づいたServiceを生成するために,iotkit-commライブラリへリクエストを行う

また,開発者はClientを以下のステップで開発する.

  1. Service query の記述
  2. queryに記述されたAttributesにマッチするServiceの発見と接続をiotkit-commへリクエストする

Service Specifications と queriesはとてもよく似ています.コードについて言えば,Service Specificationsオブジェクトは,Service queryの子となっています.しかし,これらの2つには,根本的な違いが2つあります.

  1. queryはClientによってのみ利用されるのに対して, specificationsはClient,Serverの両者で利用される.Specificationsが初期化や,Serviceへの接続に利用されるが,queryはServiceの発見のみに利用される.
  2. queryはIPアドレスやPortを含むことができないが,対して,Service Specificationは含むことができる.なのでこれらの情報は事前に共有されていないと考えたほうが良い.

ここで,少し脱線するけど,ネットワーク上のServiceを発見することが,どういうことなのかについて詳しく説明をする.
Service発見の機能にともなって,nameやProtocolによる検索を行い,IPアドレスやポート番号を獲得する.Serviceはネットワークでの最初のAdvertiseによってのみ発見される.Service Specificationsのうちの1つがService queryにマッチした時,Serviceを発見した,と言う.Service SpecificationsのAdvertisingとService Queryとのマッチングを管理するプロトコルは,mDNS(Multicast DNS)と呼ばれる.mDNSのコンセプトに基づくために,Service Specifications, query,それらのマッチングはiotkit-commによって抽象化されていることを覚えておいてください.

続いて,Service SpecificationsとQueryの書き方について説明します.これらはJSONで記述されます.

Service Specifications

以下はService Specificationsの例です. 例に続いて各Attributeの説明を行います.

Server Specificationsの例

{
    "name": "/my/home/thermostat/temperature_sensor",
    "advertise": {"locally": true, "cloud": false},
    "type": {
        "name": "zmqpubsub",
        "protocol": "tcp"
    },
    "type_params": {"ssl": false},
    "address" : "127.0.0.1",
    "port": 8999,
    "properties": {"dataType": "float", "unit": "F", "sensorType": "ambient"}
}

各フィールドについての説明

  • name(例外を除いてオプション): 文字列.なるべくユーザフレンドリなものを.Service namesは他のアプリケーションでも表示される可能性がある.
    ※ nameは,もしネットワーク上でServiceがAdvertiseされる場合には設定しなければならない.

  • advertise(オプション): このオプションが設定されない場合,ServiceはLAN内でAdvertiseを行います. ※ 現在のiotkit-commはクラウドでのAdvertising Serviceをサポートしていません.そのため現在は,”cloud”フィールドは無視されてしまいます.

  • type(必須): メッセージの送信受信方法は typeフィールドによって設定されます.typeフィールドは通常,”name”と,”communication plugin”を含みます.iotkit-commでは,プラグインがどのようにメッセージが送信されるかを抽象化するので,開発者はメッセージの内容にフォーカスすることができる.

    • name(必須): このServiceが話すプロトコルの名前を示す.これはまた,利用する通信プラグインの名前にもなる.
    • protocol(必須): トランスポートプロトコルの種別を示す.”tcp”もしくは”udp”のみがサポートされている.
  • type_params(オプション): 通信プラグインがサポートできる設定パラメータ.iotkit-commはこのパラメータをそのまま通信プラグインに引き渡す.

  • port(必須): サーバが動作するポート番号.
  • properties(オプション): Serviceが持つユーザプロパティ.各プロパティは,”name”: valueのペアで記述されなければならない.この場合の例では,センサが周囲の温度を華氏で,FloatでPublishする,という設定を行っている.
  • address(オプション): サーバが動作するアドレス.記述しなければlocalhostが利用される.

このSpecificationはmodule:main.createServiceに渡すことができ,最終的には指定されたアドレスとポートで動作しているServiceのインスタンスを返します.

Service Query

以下にService queryの例を示し,続いて各Propertyの説明を行います.

Server Queriesの例

{
    "name": ".*temperature_sensor",
    "type": {
        "name": "zmqpubsub",
        "protocol": "tcp"
    }
}

このqueryは,Service Specificationセクションで示したSpecificationsと一致していることが大事です.さらに,このqueryはzmqpubsubプロトコルを利用して通信を行う,LAN内の全ての温度センサを発見しに行きます.以上を念頭において各Attributeについて見てみましょう.

各フィールドの説明

  • name(オプション): 正規表現を利用可能.
  • type(必須)
    • name(必須): Serviceが利用する高レイヤの通信プロトコル.これによりClientは,数あるServiceの中から通信可能なものを探すことができる.例えば,type.nameフィールドに zmqpubsub を指定した場合,zmqsubscriber はzmq publishers のみを探すことができる.
    • protocol(必須): トランスポートプロトコル.”tcp”もしくは”udp”のみ利用可能.

このqueryはmodule:main.createClientに渡すことができ,最終的にはServiceに接続されたClientインスタンスが返されます.

Intel Edisonで iotkit-commを使うその2:ServerとClientについて.

前回のiotki-commチュートリアルの "4.もっと詳しいことを学ぶ" の続きです.

もっと詳しいことを学ぶその1. server(Service)の書き方

iotkit-commのチュートリアルその1,Clientについて

以下の3つのステップでService(Server)を作成する

  1. Service Specificationを記述する
  2. 1で決めたSpecificationにもとづいてServiceを作成する
  3. Serviceを実行する

以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.

1. Service Specificationを記述する

Service SpecificationはJSONとして記述する.このJSONには,Serivceが動作するポート,Serviceの名前,通信時に利用するプロトコルといったAttributesを記述する.ここでは例として,以下の “server-spec.json”を記述してみる.

{
    “name”: “/ndg/temperature/cpuTemp”,
    “type:”: {
        “name”:”zmqreqrep”,
        “protocol”: “tcp”
    },
    “port”: 8333,
    “properties”: {“dataType”: “float”, “unit”: “F”},
    “advertise”: {“locally”: true, “cloud”: false}
}

2. 1で決めたSpecificationにもとづいてServiceを作成する

例として以下のServiceを作成する(server.js)

var iotkit-comm = require(‘iotkit-comm’);
var path = require(‘path’);
var spec = new iotkit.ServiceSpec(path.join(__dirname, “server-spec.son”);

iotkit.createService(spec, function(service){
    service.comm.setReceivedMessageHandler(function(client, msg, context){
        cnosole.log(“received from client: “ + msg.toString());
        service.comm.sendTo(client, “hi”);
    });
});

※Serviceでは,どのような内容のメッセージかのみを記述するため,そのメッセージが届くかどうかは気にする必要がありません. type.nameフィールドでの記述があれば,iotkit-commはどのようにメッセージを送信すればよいかを判断することができます.(今回の例でいうと”zmqreqrep”) ※ zmqreqrep: ZeroMQ is a high-performance asynchronous messaging library

通信の詳細は,通信プラグインによって処理されます.今回の例で言うと,通信プラグイン(service.comm)は, zmqreqrepプラグインインスタンスです.通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.

3. Serviceを実行する

これまでに記述した server-spec.json と, server.js を同じディレクトリに置き,以下のコマンドを実行すればServiceが起動します

node server.js

もっと詳しいことを学ぶその2. client の書き方

iotkit-commのチュートリアルその2,Clientについて

以下の3つのステップでClientを作成する

  1. Service queryを記述する
  2. ServiceのためのQueryにもとづいてClientを作成する
  3. Clientを実行する

以下でその例について述べる ※以下で示すサンプルコードは,/usr/share/iotkit-comm/examples/node/basic-client-serverに配置されています.

1. Service queryを記述する

Service QueryはJSONとして記述する.このJSONには,Clientが接続したいServerのAttributesが記述されている.ここでは例として,以下の “server-query.json”を記述してみる.

{
    "name": "/ndg/temperature/cpuTemp",
    "type": {
        "name": "zmqreqrep",
        "protocol": "tcp"
    },
    "properties": {"dataType": "float", "unit": "F"}
}

2. ServiceのためのQueryにもとづいてClientを作成する

例として以下のclientを作成する(client.js)

var iotkit = require('iotkit-comm');
var path = require('path');
var query = new iotkit.ServiceQuery(path.join(__dirname, "server-query.json"));
iotkit.createClient(query, function (client) {
    client.comm.setReceivedMessageHandler(function (message, context) {
        console.log("received from server: " + message.toString());
        client.comm.send("hello");
    });
    client.comm.send("hello");
});

※ ServiceのIPアドレスや,Serviceとの通信方法をClientが知っている必要はありません.代わりに,Service queryがそのような詳細について管理してくれます.例えば,ClientではServiceの名前とServiceが利用するプロトコル(この場合zmqreqrep)を記述します.Serviceが見つかると,iotkit-commは適切に初期化された通信ハンドル(client.comm)をClientオブジェクトとともに返します.このハンドルは,Serviceに接続されたzmqreqrepプラグインインスタンスです.
通信プラグインの詳細は後述しますが,ここでは,通信プラグインは send や,sendTo といったファンクションを提供すると考えてください.
様々な通信プラグイン間の主な違いは,send や, sendTo といったファンクションのコールによって何が起こるかである(例えば,パケットフォーマットやヘッダが異なる).標準でいくつかの通信プラグインがiotkit-commにバンドルされているが,必要に応じて独自の通信プラグインを書くことも簡単にできる.

3. Clientを実行する

これまでに記述した server-query.json と, client.js を同じディレクトリに置き,以下のコマンドを実行すればClientが起動します

node server.js

動作確認

Tutorial: Server で作成したServerと,このセクションで作成したClientを起動させると,以下のような実行結果が得られます.

f:id:concre_shiitake:20141026234929p:plain

Intel Edisonで iotkit-commを使う:サーモスタットサンプルによるGetting Started

IoTIoT言うとりますけども.
という感じでIntel Edisonに提供されているiotkit-comm.
いかにも!という感じがするライブラリ名だけど,解説記事が全然ないので,ひとまずGettingStartedを訳しながら試してみた.
というわけで,公式ドキュメントを参考にして,話を進めます.

iotkit-comm Getting Started

概要

iotkit-commは以下の様な機能を提供します.これを使うと,クライアント,サーバによって構成される分散アプリケーションの開発ができるようになります.

  • ネットワークに接続されたデバイスの発見
  • ネットワークに接続されたデバイス同士での通信
  • ネットワークに接続されたデバイスとクラウド間での通信

Intel Edison向けのプラットフォームとして設計されていますが,他のプラットフォームでも同様に動作しています.
iotkit-commは,CとNode.js向けのライブラリが存在しますが,以下ではNode.js向けの説明をします.

このドキュメントの読み方

2つのセクションがあるので,目的に応じて利用します.

  • APIリファレンスを閲覧するためのセクションは,”Modules”セクションです.

    • “main”モジュールから読み始めることをおすすめします
  • APIの利用方法についてのチュートリアルを閲覧するためのセクションは,”Tutorial”セクションです.

※ このドキュメントは,Modulesが,Classes, Methods, Variablesのどのような論理構成により実現されるのかを示したものであり,あくまでドキュメントであることに注意してください.コードベースでiotkit-commを説明したものではありません.

このドキュメントでの前提条件

  • Edisonがインターネットアクセス可能であること
    • 前回のエントリを参考にWiFi設定を行いましょう.
  • SampleプログラムやコマンドがEdison上で動作可能であること.
    • 後で記述する,iotkit-commにおけるHelloWorldを試してみましょう.

iotkit-comm ドキュメント(Tutorial編)

Start Here

iotkit-commライブラリを使って開発を行うために,以下のように学習していきます.

  1. iotkit-commのインストール
  2. hello world”プログラムを書いて実行する(オプション)
  3. 付属のサンプルプログラムを実行する(オプション)
  4. もっと詳しいことを学ぶ(オプション)

1. iotkit-commライブラリのインストール

  • Intel Edisonデバイスにはもうインストール済みだからこの手順は必要ないです.

    • 他のプラットフォームへのインストール方法は後日公開予定.
  • ただし,以下の方法でIoT Developer Kit librariesに関するアップデートだけしておきましょう.

$ echo "src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf
$ opkg update
$ opkg upgrade

2. Write “hello world”プログラムを書いて実行する

  • “helloworld.js”というJavascriptファイルを作成し,以下のプログラムを記述します.
var iotkit = require(‘iotkit-comm’);
console.log(iotkit.sayhello());
  • 記述した”helloworld.js”の動作をターミナルで確認します.
$ node helloworld.js
# 以下の文字が出力される
>Hello Edison user!

3. サンプルプログラムの実行

  • ※ 公式ページのディレクトリ構成は最新ファームと異なります.以下では,2014/10/26現在での最新ファームである,edison-weekly_build_68_2014-09-08_13-49-07 でのディレクトリ構成を基に話を進めます.
  • この章ではサーモスタットプログラムを試してみましょう.

3-1. 利用するサンプルの概要と補足情報

いくつかの温度センサからのデータを受信するサーモスタットプログラムを試してみます.このプログラムは公式リファレンスでは以下のディレクトリにあるとされていますが,

  • /usr/share/iotkit-comm-js/examples

現在のファームでは以下のディレクトリに移動しています.

  • /usr/share/iotkit-comm/examples/node/distributed-thermostat

3-2. 温度センサの実行

$cd /usr/share/iotkit-comm/examples/node/distributed-thermostat
# 温度センサの起動
$ node temperature-sensor.js
# ターミナル上には特に何も出力されません.

3-3. サーモスタットの実行

  • 3-2とは異なるターミナルを開き,サーモスタットを実行します.
    • 1つのEdison上で実行する場合は,2つのターミナルを開き,それぞれのターミナルからsshでEdisonへ接続すると良いです.
$cd /usr/share/iotkit-comm/examples/node/distributed-thermostat
# サーモスタットの起動
$ node thermostat.js 

3-4. 動作の確認

サーモスタットと温度センサを同時に実行すると,温度センサ(temperature-sensor.js)から送信される温度データを,サーモスタット側(thermostat.js)で受信し,ターミナル上で以下の様な出力が得られます.

# 温度センサ1台数の時
Found new temperature sensor - 127.0.0.1:20408
Received sample temperature 90 from 127.0.0.1:20408
New average ambient temperature (cumulative): 45
Received sample temperature 79 from 127.0.0.1:20408
New average ambient temperature (cumulative): 56.333333333333336
Received sample temperature 67 from 127.0.0.1:20408
New average ambient temperature (cumulative): 59
Received sample temperature 83 from 127.0.0.1:20408
New average ambient temperature (cumulative): 63.8
Received sample temperature 72 from 127.0.0.1:20408
New average ambient temperature (cumulative): 65.16666666666667
Received sample temperature 62 from 127.0.0.1:20408
New average ambient temperature (cumulative): 64.71428571428571

新しいセンサが追加された際も,発見と通信が自動で行われます.

# 途中から温度センサを追加した時
# Found new temperature sensor という所で新しいセンサが検出されています
eceived sample temperature 79 from 127.0.0.1:20408
New average ambient temperature (cumulative): 74.21212121212122
Received sample temperature 63 from 127.0.0.1:20408
New average ambient temperature (cumulative): 73.88235294117646
Received sample temperature 71 from 127.0.0.1:20408
New average ambient temperature (cumulative): 73.8
Found new temperature sensor - 127.0.0.1:54187
Received sample temperature 73 from 127.0.0.1:20408
New average ambient temperature (cumulative): 73.77777777777777
Received sample temperature 61 from 127.0.0.1:54187
New average ambient temperature (cumulative): 73.43243243243244
Received sample temperature 78 from 127.0.0.1:20408
New average ambient temperature (cumulative): 73.55263157894737
Received sample temperature 88 from 127.0.0.1:54187
New average ambient temperature (cumulative): 73.92307692307692
# 温度センサとサーモスタットプログラムをそれぞれ別のEdisonから実行した時.
Received sample temperature 85 from 192.168.11.13:13304
New average ambient temperature (cumulative): 73.75862068965517
Received sample temperature 85 from 192.168.11.13:13304
New average ambient temperature (cumulative): 73.94915254237289

# さらにサーモスタットが動作するEdison上でも温度センサを動作させる
Found new temperature sensor - 127.0.0.1:54453
Received sample temperature 90 from 192.168.11.13:13304
New average ambient temperature (cumulative): 74.21666666666667
Received sample temperature 64 from 127.0.0.1:54453
New average ambient temperature (cumulative): 74.04918032786885
Received sample temperature 87 from 192.168.11.13:13304
New average ambient temperature (cumulative): 74.25806451612904
Received sample temperature 71 from 127.0.0.1:54453
New average ambient temperature (cumulative): 74.2063492063492

4. もっと詳しいことを学ぶ

以下の様な手順で学んで行こう,とされています.後日追記予定.

  1. server の書き方
  2. client の書き方
  3. Service Specifications と queriesについて(重要)
  4. iotkit-commを使って分散アプリケーションを書く方法
  5. cloudにデータをPublishする方法
  6. iotkit-commを利用したソースのUnitテスト方法(未公開)
  7. iotkit-commアーキテクチャについて(未公開)

Intel EdisonのGetting startedその2.(Arduino IDEからの転送,Edison初期設定)

Getting Started Edison

  • このエントリは以下の2つの事項について説明します.

    • Arduino IDEからのプログラムの書き込み方法
    • Edisonの初期設定(デバイス名,パスワード,WiFi設定)を行う方法
  • これも公式の訳+アルファです.

  • 購入してからファームウェアを更新していない場合は,1つ前のエントリを参考にしてファームウェアの更新を行ってください.

step 1. Connectiong Edison

  • 箱から出したedisonをボードに接続する.順番としては前回エントリのファームウェア更新よりも前ですね〜

step 2. Download Edison Arduino IDE

step 2-1. Edison 用Arduino IDEのインストール

  • 公式ページから,Edison用のArduino IDEをダウンロードしてインストール
    • Macの場合,アプリ名が”Arduino.app”となっており,本家Arduinoと競合するので,”Arduino edison.app”とかにでもリネームしておきましょう.

step 2-2. テストとしてBlinkプログラムをEdisonへ書き込む

HWでのHello, World!であるBlink(LED点滅)プログラムを書き込みます.

  1. Arduino IDEを起動して,File -> Examples -> Basics -> Blink を開く
  2. Tools -> Board で”Intel Edison”を選択
  3. Tools -> Serial Portで,”/dev/cu.usbmodemxxxx”を選択

    • xxxx部分は各環境により異なります.
    • ttyではなくcuのものを選択します.
  4. IDE左上のチェックマークのアイコンをクリックしてビルドする

  5. チェックマークアイコンの隣の矢印アイコンを押してEdisonへプログラムを転送する

    • No, such file or directory というエラーが出たら指定しているSerial Portが間違っているので,3に戻ってSerial Portの選択を行います
  6. Arduinoボード上のLEDが点滅すればOKです.

    • Break out boardの場合は該当するGPIOにLEDつないで確認するのかな?未確認です!

Step 4. 初期設定(デバイス名,SSID名,パスワード,Wifi設定)

  • edisonの設定を行うために,”configure_edison”というコマンドが提供されている.さらに,setupオプションを付けることで初期設定を一括でできる.
# 初期設定の実施
 # configure_edison --setup
# これで実行される設定は以下の3つ.
# 1. デバイス名の設定.これはSSIDとしても利用されるようです.
# 2. rootパスワードの設定.これはSSIDパスワードとしても利用されるようです.
# 3. WiFiの設定.初回は失敗したけど,2回目でAPが見えるようになりました.
# 最後に表示されるIPかURLを使ってブラウザからアクセスするとEdisonに関する情報が確認できます.
# 各設定で間違えたら,以下の補足にあるようにconfigure_edisonコマンドのオプションを変えて実行しましょう.

補足

ちなみに,”configure_edison”コマンドのオプションは以下のようになっている.

# configure_edison --help
usage: configure_edison [-h] [--server]
                        [[--setup | --name | --password | --wifi]
                        [--showWiFiIP | --version | --latest-version | --upgrade | --disableOneTimeSetup | --enableOneTimeSetup | --flash <version> [<release name> ...]
                        | --showNames]

optional arguments:
  -h, --help            show this help message and exit
  --server              Starts the server (testing only)
  --setup               Goes through changing the device name, password, and
                        wifi options
  --name                Changes the device name
  --password            Changes the device password
  --wifi                Changes the wifi options
  --showWiFiIP          IP address associated with the wireless interface
  --version             Gets the current firmware version
  --latest-version      Gets the latest firmware version
  --upgrade             Downloads the latest firmware
  --disableOneTimeSetup
                        Disable one-time setup and WiFi access point
  --enableOneTimeSetup  Enable one-time setup and WiFi access point
  --flash <version> [<release name> ...]
                        Downloads and flashes an image
  --showNames           Show device name and SSID

wifi接続先を追加するときとか,Edisonの名前(SSID)変えたい時とかも使えますね.
例えばwifiの設定変更なら以下のようになります

# configure_edison --wifi

きたぞ!ぼくらのIntel Edison!けどファームが古いクソ野郎だったので更新する.

Edison,まあこういうデバイスの発売日としてはありがちで,ファームウェアが古い.
シリアルで送受信する文字のとりこぼしとかが気になる. 購入したらまずは新しいファームウェアを書き込むべきだと思う.

Edisonのファームをアップデートする.

step 1. Connecting Edison

  • 2本のmicro USB ケーブルを使ってEdisonボードとPCを接続します.
    • Arduino Boardの場合,micro USBコネクタとUSBコネクタの間にスイッチがありますが,これをmicro USBコネクタ側にしておくようにしてください.
    • 補足:J3 -> J16の順にPCと接続する必要があります.
  • 接続が成功すると,FinderにEdisonがドライブとして現れます.

step 2. Remove old images

  • ターミナルを開き,以下のコマンドを順に実行します.
# Edisonのドライブを開く
$ cd /Volumes/Edison
# Edisonに入っている全てのファイルを削除(不可視ファイルも削除する).
$ rm -rf *
$ rm -rf \.*
# lsして全てのファイルが消えていることを確認(何も表示されなければOK)
$ ls 

step 3. Download the latest image

step3-1. 下準備(ファイルシステムの変更)

  • 出荷時にはEdisonのファイルフォーマットはFAT16に設定されています.MacではFAT16への書き込みができないため,ファイルシステムを変更します.

    • Windowsの場合には問題ないのでStep3-1は飛ばして良いです.また,Macの場合でもファイルシステムがすでに変更されていれば飛ばします.
  • アプリケーションディレクトリ内のユーティリティディレクトリにある,ディスクユーティリティ.appを起動します.

  • 左のカラムにある,”Linux File—CD Gadget Media”を選択.
  • 右のカラムの,”消去(Partition)”タブの,”Format”を”MS-DOS(FAT)”に変更します

step3-2. イメージのダウンロードと展開

  • Intel のサポートページから,”Edison Yocto complete image”をダウンロードし,解凍します.
  • 解凍したディレクトリの中にある全てのファイルを,Edisonのドライブ(/Volumes/Edison)へコピーします.

step 4. Flashing Edison

  • ターミナルを開き,以下のようにコマンドを入力し,実行します
# 以下のコマンドを入力し,Enterではなく,”tab”キーを押す.
$ screen /dev/cu.usbserial
# すると,以下のような形でコマンドの~usbserial以降が自動補完される
# “A102GW3T”は各自の環境により異なります.
$ screen /dev/cu.usbserial-A102GW3T
# さらにボーレートをオプションとしてコマンドへ追加しEnterを押して実行.
$ screen /dev/cu.usbserial-A102GW3T 115200 -L
# screenコマンドを実行すると黒い画面が表示されるので,Enterを2回入力すると以下の様な文字が表示されます.
> Poky (Yocto Project Reference Distro) 1.6 edison ttyMFD2

> edison login:
# >edison loginの後に,”root”を入力しEnter
> edison login: root
# 再起動して,Edisonドライブへ展開したimageを書き込む(※ これを実行すると,以前に設定していた,userアカウント,パスワード,WiFiなどの設定は初期化されます)
# 書き込みには3分くらいかかります.画面表示が止まっていても辛抱強く待ちましょう.
 # reboot ota
  • 書き込みが成功すると,以下の画面のようにログイン画面が表示されます.

  • ちなみにバージョンの確認方法は以下

$ cat /etc/version
> edison-weekly_build_68_2014-09-08_13-49-07
# 2014/10/26現在の最新ファームのバージョンです.

Punch Through の Light Blue Bean がようやっとやって来た!

タイトルのとおり,Punch Through のBeanがやって来た.
http://punchthrough.com/bean/
たぶんMakeかなんかを見て1年半くらい前に注文(投資)したと思うんだけど,ようやっと来た.
小さいしかわいい感じだし,スマホなんかのアプリと連携するシンプルなデバイスのプロトタイプ作るには良さそうだと思う.


で,こいつはArduino IDEからプログラム書き込めるんだけど,
その準備に微妙に手間取ってしまってだるい感じだった.
あとでまとめたい.
http://punchthrough.com/bean/getting-started/

注意点としてはざっくり3つあって,
1.Arduino IDEは1.0.5を使う
2.Arduino IDEを起動した状態でTeensyduinoとBean Loaderのプラグインを入れる.で,その後再起動
3.Bean Loaderは以下の写真のディレクトリにあるんだけど,特に気にする必要はなくて,ArduinoIDEで対象のマイコンボードをBeanにして,Verifyしてあげれば勝手に立ち上がる.


あと,Macから4台同時に見えることがなくって,どれか1台だけが見えてる状態が基本なんだけどこれなんなんだろう.
うちにはMacが3台あるんだけど,全部同じ状態.
こいつらBluetoothのヘッドホンも見えないし,Mac側のBluetoothが腐ってるんだろうか.
iPadからは全然問題なく4台同時に見えるし,ヘッドホンもつながる.
とてもだるい.