エッジプログラムを利用したエッジアプリケーションを開発する

本ガイドでは、フローとエッジプログラムを連携させたエッジアプリケーションを作成する方法について学ぶことができます。

エッジプログラムを利用したフローの作成

エッジアプリケーションの応用として、フローとエッジプログラムを連携させたフローの作成方法を学びます。
フローとエッジプログラムを連携させることにより、フローだけでは実装が難しいようなエッジアプリケーションや、既存のプログラムを活用したエッジアプリケーションの開発を行うことができます。

フローとエッジプログラムを連携させるには、エッジプログラムとフロー間でのデータのインターフェースを考慮して設計する必要があります。
例えば、フローからプログラムをexecノードで起動してデータを渡し、結果を標準出力を受け取る方法や、UDPやTCPポートを介して通信を行うなどの方法が考えられます。

本ガイドでは、サンプルとして下記のようなエッジアプリケーションの作成を作成します。

  • エッジアプリケーション概要
    エッジプログラムでセンサーデータを取得し、Node-REDフローでデータを整形してMy-IoTデータストアに送信するアプリケーション。
    エッジプログラムはPythonで作成し、フローとエッジプログラム間のデータの受け渡しには標準出力を用いる。

Step 1. 事前準備

本ガイドでは、エッジアプリケーションの開発に下記が必要となります。

  • 作業用PC(Google Chromeがインストール済み)

  • My-IoTエッジ(メンテナンスモード)

  • ディスプレイ(My-IoTエッジ接続用)

  • マウス、キーボード(My-IoTエッジ接続用)

My-IoT ユーザーマニュアル を参照し、My-IoTエッジをセットアップしてMy-IoTに接続し、動作モードをメンテナンスモードに切り替えてください。

My-IoTエッジへ接続する方法については、 My-IoTエッジへのアクセス を参照してください。

今回は実際にセンサーとの通信は行わず、Pythonプログラム側であらかじめ用意したデータを使用します。

Step 2. コネクタの設計と登録

まずはじめに、My-IoTデータストアにデータを蓄積するためのコネクタを設計します。
コネクタの設計と登録についての詳細は、開発ガイドの エッジアプリケーションを開発する を参照してください。

既にIoTストアに登録されているコネクタを使用する場合は、IoTストアで使用するコネクタのコネクタIDとJSONスキーマをメモしておいてください。

今回は、下記のようなコネクタを定義して、IoTストアに新規登録します。

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "type": "object",
    "required": [
        "connectorID",
        "edgeID",
        "timestamp",
        "temperature",
        "humidity"
    ],
    "properties": {
        "connectorID": {
            "type": "string"
        },
        "edgeID": {
            "type": "string"
        },
        "timestamp": {
            "type": "string"
        },
        "temperature": {
            "type": "number"
        },
        "humidity": {
            "type": "number"
        }
    },
    "additionalProperties": false
}

コネクタをIoTストアに登録しましたら、登録したコネクタのコネクタIDとJSONスキーマをメモしておいてください。

Step 3. エッジプログラムの作成

センサーと通信してデータを読み出し、標準出力に出力するPythonアプリケーションを作成します。
今回はサンプルとして、プログラム内で定義したsensordataデータを出力するプログラムとします。

import json

def main():
    # センサーからデータを受け取る処理
    # サンプルとして変数で定義
    sensordata = {
        "temperature": 20.5,
        "humidity": 60.0
    }

    # 標準出力にデータを出力する
    try:
        print(json.dumps(sensordata))
    except:
        print('Error')

センサーデータはJSON文字列として出力するようにしています。
プログラムの開発が完了しましたら、Pythonプログラムをwhlパッケージとして作成します。
開発したPythonプログラムは、pipを用いてインストールしておきます。

Pythonプログラムの詳細な作成方法については、本ガイドでは割愛します。
My-IoTで利用できるPythonプログラムの仕様については、エッジプログラムの仕様を参照してください。

Step 4. Node-REDフローの作成

エッジプログラムの開発が完了したら、Node-REDフローを作成していきます。
今回は、Step 3で作成したPythonプログラムを呼び出して、センサーデータを受け取りMy-IoTデータストアへ送信する機能を作成します。

Node-REDフローでは、My-IoTエッジのプロビジョニング時に発行されたデバイス証明書と、あらかじめインストールされているMy-IoTデータストアノードを使用することで、簡単にMy-IoTクラウドとのセキュアな通信が可能です。
エッジプログラムとNode-REDフローを連携することで、既存アプリケーションの活用や、他のプログラミング言語で提供されているSDKやライブラリを使用したセンサーとの通信や各種処理の実装を行いつつ安全にMy-IoTクラウドへデータを送信することができます。

My-IoTエッジへのアクセス を参照して、フローエディタへアクセスしてください。
My-IoTでは、フローエディタと呼ばれるNode-REDのプログラミング環境を用いて、エッジアプリケーション用のNode-REDフローを作成していきます。
本ガイドでは、Node-REDのプログラミングについての細かい説明は省略します。

Pythonプログラムの呼び出し

今回はPythonプログラムからの標準出力をNode-REDフローで受け取り、連携を行います。
ここでは10秒おきにPythonプログラムを起動し、センサーデータを受信する機能を作成します。

まずはPythonプログラムを起動させるためのトリガーとなる、 inject ノードを配置します。
パレットから inject ノードを配置し、下記の通り設定します。

inject

  • [Node-RED起動後の0.1秒、以下を行う] にチェック

  • [繰り返し] から [指定した時間間隔] を選択し、時間間隔の入力欄に 10秒 と入力

次に、Pythonプログラムを起動するノードを作成します。
パレットから exec ノードを配置し、下記のように設定を行ってください。

exec

  • [コマンド] にPythonプログラムを呼び出すコマンドを記載

各ノードを配置、設定したら、ノードをワイヤーで接続します。

  • injectノードの出力とexecノードの入力

exec_python

例ではcommentノードや、Pythonプログラムの標準出力と標準エラー出力を確認するためのdebugノードも接続しています。

センサーデータの加工とMy-IoTデータストアへの送信機能の実装

続けて、My-IoTデータストアへ送信する機能を作成します。

MyIoT outノードにデータを入力するため、Pythonプログラムから標準出力で受けとったJSON文字列を Javascriptオブジェクトへ変換する json ノードを配置します。

json

サンプルのPythonアプリでは、出力データがそのままコネクタで定義したJSONスキーマの形式になっているため、変換したJavascriptオブジェクトをそのまま MyIoT out ノードへ入力します。

パレットから MyIoT out ノードを配置して、下記の通り設定します。

datastore

  • [コネクタID] にStep2でメモしたコネクタIDを入力

  • [コネクタ定義] にStep2でメモしたコネクタのJSONスキーマを入力

ここで入力したコネクタIDのコネクタが使用され、スキーマに沿って送信データのチェックが行われます。
スキーマに沿わないデータはMy-IoTデータストアへ保存されませんので注意してください。

全てのノードを配置して設定を行いましたら、各ノードをワイヤーで接続していきます。

  • execノードの出力とjsonノードの入力

  • jsonノードの出力とMyIoT outノードの入力

flow

最終的なフローの完成形は、上記のような形になります。
例ではデバッグのためのdebugノードを追加しています。

これで、Pythonプログラムからセンサーデータを受信し、Node-REDフローでデータを加工してMy-IoTデータストアに送信するフローが完成しました。

デプロイと確認

フローが完成したらフローエディタ画面の右上にある [デプロイ] ボタンを選択してデプロイを行ってください。
デプロイ後、動作確認を行い正常にデータの受信、送信が行えていることなどを確認してください。

エッジプログラムの登録

開発したエッジアプリケーションの登録の前に、フローで利用しているPythonプログラムをエッジプログラムとしてIoTストアに登録します IoTストアへアクセスし、サイドメニューから [開発] - [エッジ] - [エッジプログラム] を選択します。

edge_prg_list

エッジプログラム一覧画面が表示されますので、 [新規作成] ボタンを押下します。

edge_prg_register

エッジプログラム登録画面が表示されましたら、今回はPythonプログラムを登録するため、 [種類] プルダウンから [Pythonプログラム] を選択します。

Pythonプログラム

Pythonプログラムを選択しますと、Pythonプログラム情報の入力が可能になります。
画面の項目に従ってPythonプログラムの情報を入力していきます。

python_reg

最初に、IoTストア上で公開される際に表示されるエッジプログラム名を入力します。
既に使用されている名前は使用できないので注意してください。

次に、[wheelファイル][追加] ボタンを選択します。ファイルの選択画面が表示されますので、エッジプログラムとして登録するPythonプログラムの.whlファイルを選択します。

whlファイルを選択しますと、 [バージョン] 欄にsetup.pyに記載されているバージョン情報が自動で入力されます。

whlファイルの選択が完了しましたら、次に [インプットプロトコル] / [アウトプットプロトコル] のプルダウンから、エッジプログラムのインターフェースを選択します。
ここで選択したプロトコルはエッジアプリの登録時、エッジプログラムを選択する際に参照されます。

今回のエッジプログラムは標準出力を利用していますが、選択できるプロトコルに存在しないため、 [対応プロトコルなし] を選択します。
UDPやHTTPなどを使用してデータの受け渡しをするプログラムを登録する場合は、該当のプロトコルを選択します。

python_reg_comp

入力が完了したら、画面下部の [登録] ボタンを押下します。
登録が完了しましたら、登録完了ダイアログが表示されエッジプログラム詳細画面が表示されます。
入力したエッジプログラムの情報が表示されていることを確認してください。

edge_prg_detail

これでIoTストアへのエッジプログラムの登録は完了となります。

エッジアプリケーションの登録

Step 1. エッジアプリファイルの作成

Node-REDフローの開発が完了しましたら、IoTストアへ登録するためにエッジアプリファイル一式を作成します。
My-IoTエッジへログインし、ターミナルから下記のコマンドを実行します。

sudo myiot-get-flow-zip

コマンド実行後、正常に処理が完了するとホームディレクトリへflowTemplate.zipが作成されます。
このzipファイルが、My-IoTへ登録する際に必要なエッジアプリファイルとなります。

注意

必ず上記の方法でエッジアプリファイルを作成してください。
その他の方法で作成したエッジアプリファイルはIoTストアへ登録できません。

Step 2. エッジアプリケーション情報の入力

エッジプログラムの登録が完了したら、IoTストアへエッジアプリケーションを登録します。
本ガイドでは、エッジプログラムをエッジアプリケーションに紐づける方法を解説します。
エッジアプリケーションの基本的な登録方法については、 My-IoT ユーザーマニュアル および、開発ガイドの エッジアプリケーションを開発するを参照してください。

IoTストアにアクセスし、サイドメニューから [開発] - [エッジ] - [エッジアプリ] を選択します。

edge_app_list

エッジアプリ一覧が表示されましたら、 [新規作成] ボタンを押下します。

edge_app_register

エッジアプリ登録画面が表示されますので、エッジアプリ名や説明などの基本的な情報を入力し、エッジアプリファイルを選択します。

edge_app_basic

情報の入力とエッジアプリファイルの選択が完了したら、エッジプログラムの選択を行います。
エッジプログラムを選択するには、 [エッジプログラム][追加] ボタンを押下します。

edge_prg_dialog

エッジプログラム追加画面が表示されましたら、先ほど登録したエッジプログラムを選択し、 [OK] を選択します。

注釈

フロー中に存在するインプット/アウトプットノードに応じたエッジプログラムのみ選択可能です
エッジプログラムが表示されない場合は、エッジプログラムのインプット/アウトプットプロトコルに対応したノードがフロー中に存在するか確認してください。

edge_prg_selected

選択したエッジプログラムが表示されていることを確認します。
今回は一つのエッジプログラムのみ選択しましたが、複数選択した場合はドラッグ&ドロップで並び順を変更することができます。複数選択時はここに表示されている順番に従って、エッジプログラムがインストールされます。

エッジプログラムの選択が完了したら、画面下部の [登録] ボタンを押下します。

register

登録が完了しましたら、登録完了ダイアログが表示されエッジアプリ詳細画面が表示されます。 入力したエッジアプリの情報が表示されていることを確認してください。

これでIoTストアへのエッジアプリの登録は完了となり、全てのIoTストア利用者がエッジアプリを利用できるようになります。