エッジアプリケーションを開発する¶
本ガイドでは、シンプルなエッジアプリケーションを作成する方法について学ぶことができます。
エッジアプリケーションの作成¶
まずはエッジアプリケーションの基礎として、エッジとセンサーを用いたシンプルなエッジアプリケーションを作成する方法を学びます。
本ガイドでは、サンプルとして下記のようなエッジアプリケーションを作成します。
エッジアプリケーション概要
My IoTエッジに接続された環境センサーから定期的にデータを取得し、エッジ上で整形してMy IoTデータストアへデータを送信するアプリケーション。
Step 1. 事前準備¶
本ガイドでは、エッジアプリケーションの開発に下記が必要となります。
作業用PC(Google Chromeがインストール済み)
My-IoTエッジ(メンテナンスモード)
ディスプレイ(My-IoTエッジ接続用)
マウス、キーボード(My-IoTエッジ接続用)
環境センサー(本ガイドでは、サンプルとしてOMRON社の環境センサー 2JCIE-BU を使用しています)
My-IoT ユーザーマニュアル を参照し、My-IoTエッジをセットアップしてMy-IoTに接続し、動作モードをメンテナンスモードに切り替えてください。
My-IoTエッジへ接続する方法については、 My-IoTエッジへのアクセス を参照してください。
また、本ガイドでは、環境センサーをUSB接続で使用します。
OSにシリアルデバイスとして認識させるために設定が必要となりますので、下記を参考にMy-IoTエッジ上で設定を行ってください。
rulesファイルの追加¶
今回使用するセンサーは、接続しただけではシリアルデバイスとして認識されないため、シリアルデバイスとして認識させる必要があります。
また、エッジアプリの開発に用いるNode-REDフローでは、センサーからデータを取得する際にデバイスファイルを使用するため、デバイスファイル名の固定化が必要になります。
ここでは、接続されたセンサーをシリアルデバイスとして認識させ、デバイスファイル名を2JCIE-BU
として固定するためのルールを作成します。
下記のファイルを作成し、/etc/udev/rules.d
ディレクトリに配置します。
80-rename-2JCIE-BU.rules
ACTION=="add", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", SYMLINK+="2JCIE-BU"
rulesファイルの適用¶
rulesファイルを作成しましたら、センサーを接続した際に、作成したルールが適用されるための設定を行います。
ここではudevadm
コマンドで作成したルールが適用されるように設定しています。
80-rename-2JCIE-BU.rules
ファイルを作成後、下記のコマンドを実行します。
sudo udevadm control --reload-rules
sudo udevadm trigger --action=add
My-IoTエッジに環境センサーをUSB接続し、環境センサーがシリアルデバイスとして認識されていることを確認してください。
以降は環境センサーが/dev/2JCIE-BU
として認識されていることを前提とします。
Step 2. コネクタの設計と登録¶
コネクタの設計¶
まずはじめに、My-IoTデータストアにデータを蓄積するためのコネクタを設計します。
コネクタとは、My-IoTデータストアに蓄積するデータ形式を定義したものです。
同一のコネクタを使用したエッジアプリケーションとクラウドアプリケーションを組み合わせることで、
同じ形式のデータを扱うことが可能となり、IoTシステムの構築が可能となります。
エッジアプリを開発する際は、ここで設計したコネクタ仕様に沿ったデータを出力するように、Node-REDフローを作成していきます。
既にIoTストアに登録されているコネクタを使用する場合は、設計は必要ありません。
エッジアプリ作成時にコネクタIDとJSONスキーマが必要になるので、登録済みのコネクタを使用する際は、コネクタIDとJSONスキーマをメモしておいてください。
本ガイドでは、例として新規にコネクタを設計してエッジアプリを作成していきます。
コネクタの定義には、JSON Schemaを使用します。コネクタおよびコネクタで使用できるJSON Schemaの詳細については、 コネクタ仕様 を参照してください。
今回は、センサーから取得できるデータより下記のようなJSON Schemaを定義します。
定義したJSON Schemaは、拡張子.json
のテキストファイルとして作成してください。
{
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"required": [
"connectorID",
"edgeID",
"timestamp",
"temperature",
"humidity",
"light",
"pressure",
"sound",
"etvoc",
"eco2",
"discomfortindex",
"heatstroke"
],
"properties": {
"connectorID": {
"type": "string"
},
"edgeID": {
"type": "string"
},
"timestamp": {
"type": "string"
},
"temperature": {
"type": "number"
},
"humidity": {
"type": "number"
},
"light": {
"type": "integer"
},
"pressure": {
"type": "number"
},
"sound": {
"type": "number"
},
"etvoc": {
"type": "integer"
},
"eco2": {
"type": "integer"
},
"discomfortindex": {
"type": "number"
},
"heatstroke": {
"type": "number"
}
},
"additionalProperties": false
}
コネクタの登録¶
コネクタの設計が完了しましたら、IoTストアへコネクタを登録します。
IoTストアへアクセスし、サイドメニューから [開発] - [コネクタ] を選択してください。
コネクタ一覧が表示されましたら、 [新規作成] ボタンを押下してください。
コネクタ新規作成ダイアログが表示されましたら、 [JSONスキーマ] の [選択] ボタンから、先ほど作成したJSONスキーマが記載されているテキストファイル(.json)を選択、コネクタ名と説明を入力、公開範囲を選択して、[登録] ボタンを押下します。
ダイアログが非表示になりましたら、コネクタの登録は完了です。
コネクタIDの確認¶
エッジアプリを作成する際には、エッジアプリで使用するコネクタのコネクタIDとJSONスキーマが必要となります。
コネクタ一覧画面からさきほど登録したコネクタのコネクタ名を選択し、コネクタ詳細画面を表示してください。
JSONスキーマが正しく設定されていることを確認してください。
コネクタIDと入力したJSONスキーマはNode-REDフローの作成時に使用するため、忘れずにコネクタIDをメモしてください。
この例では、 「03010eeb-76af-4416-80c8-bf0cf2af21ea」 がコネクタIDとなります。
Step 3. Node-REDフローの作成¶
コネクタを定義したら、Node-REDフローを作成していきます。
今回は、環境センサーからデータを取得してMy-IoTデータストアにデータを送信する機能を作成します。
My-IoTエッジへのアクセス を参照して、フローエディタへアクセスしてください。
My-IoTでは、フローエディタと呼ばれるNode-REDのプログラミング環境を用いて、エッジアプリケーション用のNode-REDフローを作成していきます。
本ガイドでは、Node-REDのプログラミングについての細かい説明は省略します。
Node-REDのプログラミングについての詳細は、 Node-RED日本ユーザ会 を参考にしてください。
必要なノードのインストール¶
本ガイドでは、環境センサーとシリアル通信を行うために、 node-red-node-serialport ノードを使用します。
フローを作成する前に、 パレットにノードを追加する を参考に、ノードをインストールしてください。
センサーへのリクエスト機能の実装¶
今回使用する環境センサーはUSBシリアルデバイスとして機能し、リクエストを受けてデータを送信する仕様となっています。
ここでは、1秒おきにNode-REDフローからセンサーへリクエストを行う機能を作成します。
パレットから inject ノードを配置し、下記の通り設定します。
[Node-RED起動後の0.1秒、以下を行う] にチェック
[繰り返し] から [指定した時間間隔] を選択し、時間間隔の入力欄に 1秒 と入力
次に、パレットから function ノードを配置し、下記の通り設定します。
[コード] に下記を入力する
var buf = new Buffer([0x52, 0x42, 0x05, 0x00,0x01,0x22,0x50,0xe2,0xbb ]);
msg.payload = buf;
return msg;
上記のコードでは、センサーの仕様に従ってリクエストのためのバイナリデータを作成しています。
センサーの詳細な仕様については、センサーのマニュアルを参照してください。
最後に、パレットから serial out ノードを配置し、下記の通り設定します。
[シリアルポート] から [新規に serial-port を追加...] を選択
[シリアルポート] のプルダウン横の編集アイコンを選択
センサーの仕様に従って、シリアルポートを設定する
各ノードを配置、設定したら、ノードをワイヤーで接続します。
injectノードの出力とfunctionノードの入力
functionノードの出力とserial outノードの入力
例ではわかりやすいようにcommentノードとdebugノードを追加しています。
これで1秒ごとに環境センサーへリクエストを送信する機能が実装できました。
センサーからのデータ受信機能とMy-IoTデータストアへの送信機能の実装¶
センサーからのデータを受信して加工し、My-IoTデータストアへ送信する機能を作成します。
この機能は、先ほど作成したノード群の下側に作成していきます。
パレットから serial inノードを配置し、下記の通り設定します。
シリアルポート のプルダウンから、先ほど作成したシリアルポートの設定を選択する
これでセンサーから送信されたデータを受信することができます。
受信したデータはバイナリ形式となっているため、functionノードを使用してデータをデコードし、Step.2で作成したコネクタの形式にデータを加工します。
パレットから function ノードを配置し、下記の通り設定します。
コードに下記を入力します。
var crc = 0xFFFF;
var odd;
for (var i = 0; i < msg.payload.readInt16LE(2)+2; i++) {
crc = crc ^ msg.payload[i];
for (var j = 0; j < 8; j++) {
odd = crc & 0x0001;
crc = crc >> 1;
if (odd) {
crc = crc ^ 0xA001;
}
}
}
if ( crc === msg.payload.readUInt16LE(msg.payload.readInt16LE(2)+2)){
temperature = msg.payload.readInt16LE(8)/100;
humidity = msg.payload.readInt16LE(10)/100;
light = msg.payload.readInt16LE(12);
pressure = msg.payload.readInt32LE(14)/1000;
sound = msg.payload.readInt16LE(18)/100;
etvoc = msg.payload.readInt16LE(20);
eco2 = msg.payload.readInt16LE(22);
discomfortindex = msg.payload.readInt16LE(24)/100;
heatstroke = msg.payload.readInt16LE(26)/100;
msg.payload = {
temperature: temperature,
humidity: humidity,
light: light,
pressure: pressure,
sound: sound,
etvoc: etvoc,
eco2: eco2,
discomfortindex: discomfortindex,
heatstroke: heatstroke,
};
return msg;
}
受信したデータをfor文でデコードし、設計したコネクタに合わせてデータを加工してmsg.payload
に設定し、次のノードへデータを渡しています。
データを渡す MyIoT out ノードでは、入力したpayloadにedgeID
、connectorID
、timestamp
を自動で付与するため、ここではプロパティを含めないでpayloadを作成します。
最後に、パレットから MyIoT ノードを配置して、下記の通り設定します。
[コネクタID] にStep2でメモしたコネクタIDを入力
[コネクタ定義] にStep2で入力したJSONスキーマを入力
ここで入力したコネクタIDのコネクタが使用され、スキーマに沿って送信データのチェックが行われます。
スキーマに沿わないデータはMy-IoTデータストアへ保存されませんので注意してください。
各ノードを配置、設定したら、ノードをワイヤーで接続します。
serial inノードの出力とfunctionノードの入力
functionノードの出力とMyIoTノードの入力
例では、commentノードやデバッグのためのdebugノードを追加しています。
これで、必要な機能が全て実装できました。
最終的な完成形は、下記のようになります。
デプロイと確認¶
フローが完成したらフローエディタ画面の右上にある [デプロイ] ボタンを選択してデプロイを行ってください。
デプロイ後、動作確認を行い正常にデータの受信、送信が行えていることなどを確認してください。
エッジアプリケーションの登録¶
エッジアプリケーションの開発が完了したら、エッジアプリファイルを作成してIoTストアにエッジアプリを登録します。
Step 1. エッジアプリファイルの作成¶
Node-REDフローが完成したら、IoTストアへエッジアプリとして登録するため、エッジアプリファイルを作成する必要があります。
エッジアプリファイルには、作成したフローのほか、インストールしたノードの情報などが含まれています。
エッジアプリケーションのインストール時には、このエッジアプリファイルに格納されているノード情報が読み込まれて自動的に必要なノードのインストールが行われます。
注釈
エッジアプリファイルを作成するには、My-IoTエッジへログインする必要があります。My-IoTエッジへのログインについては、 My-IoTエッジへのアクセス を参照してください。
My-IoTエッジへのログインが完了したら、ターミナルから下記のコマンドを実行します。
sudo myiot-get-flow-zip
コマンド実行後、正常に処理が完了するとホームディレクトリへflowTemplate.zip
が作成されます。
このzipファイルがIoTストアへ登録する際に必要なエッジアプリファイルとなりますので、作業用PCへコピーを行ってください。
注意
Step 2. エッジアプリケーション情報の入力¶
エッジアプリファイルの作成が完了したら、IoTストアにエッジアプリケーションを登録します。
IoTストアへアクセスし、サイドメニューから [開発] - [エッジ] - [エッジアプリ] を選択します。
エッジアプリ一覧画面が表示されますので、 [新規作成] ボタンを押下します。
エッジアプリ登録画面が表示されますので、必要な情報を入力していきます。
今回は最低限必要な項目のみを入力していきます。各項目の説明や操作方法の詳細については、 My-IoT ユーザーマニュアル を参照してください。
エッジアプリ基本情報の入力¶
まずは、エッジアプリの基本情報であるエッジアプリ名と説明、対応センサーを入力します。
エッジアプリ名
IoTストア上で公開される際に表示される名前です。既に登録済みの名前は使用できません。
説明
エッジアプリの説明を入力します。
対応センサー
エッジアプリが対応しているセンサーを選択します。今回は環境センサーを使用しているので、 [環境センサー] を選択します。
エッジアプリファイルの選択¶
エッジアプリ基本情報の入力が完了しましたら、エッジアプリファイルを選択します。
[エッジアプリファイル] の [選択] ボタンを押下して、Step 1で作成したエッジアプリファイルを選択してください。
エッジアプリファイルを選択すると、 [使用ソフトウェアバージョン] 、 [OS情報] 、[コネクタ] が表示されます。
これらの情報は、エッジアプリファイルを作成した環境や MyIoT out ノードで設定したコネクタIDに従って自動で入力されます。
公開範囲を選択する¶
エッジアプリの公開範囲をラジオボタンで選択します。
[公開]
全てのユーザにエッジアプリが公開されます
[テナント内のみ]
ログインしているユーザのテナント内のみでエッジアプリが公開されます
インストールスクリプトと配信ファイルの設定を行う¶
エッジアプリのインストール時に自動でセンサーを認識させるため、Step 1.事前準備で行ったセンサーのルール設定が自動実行されるようにする必要があります。
ここではインストールスクリプトと配信ファイルの機能を用いて、インストール時に自動でセンサーの設定が行われるようにします。
まず、インストールスクリプトの入力欄に、udevルールを更新するコマンドを直接記載するか、 [ファイル選択] ボタンからコマンドが記載されたシェルスクリプトファイルを選択します。
コマンド例
logger =====INSTALL SCRIPT START=====
sudo udevadm control --reload-rules
sudo udevadm trigger --action=add
logger =====INSTALL SCRIPT END=====
このスクリプトは、事前準備で行ったルールの適用を行うコマンドを記載したものです。
次に、 [配信ファイル] の [選択] ボタンを選択し、事前準備で作成したものと同様のrulesファイルを指定します。
80-rename-2JCIE-BU.rules
ACTION=="add", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", SYMLINK+="2JCIE-BU"
指定が完了したら、 [展開先ディレクトリ] に/etc/udev/rules.d
を記載します。
これで、エッジアプリのインストール時に、/etc/udev/rules.d
ディレクトリに80-rename-2JCIE-BU.rules
ファイルが展開され、インストールコマンドが実行されることにより環境センサーの設定が自動で行われます。
上記はあくまでも一例のため、ドライバインストールが必要なセンサーなどを利用する場合は、上記のようにインストールコマンドと配信ファイルの組み合わせや、エッジモジュールとしてドライバをインストールするなどの対応や考慮を行う必要があります。
インストールスクリプトの仕様や配信ファイルの仕様についての詳細は、 エッジアプリケーションの仕様 を参照してください。
注釈
Step 3. 登録・公開¶
エッジアプリ情報の入力が完了しましたら、画面下部の [登録] ボタンを押下します。
登録が完了しましたら、登録完了ダイアログが表示されエッジアプリ詳細画面が表示されます。
入力したエッジアプリの情報が表示されていることを確認してください。
これでIoTストアへのエッジアプリの登録は完了となり、全てのIoTストア利用者がエッジアプリを利用できるようになります。