3.4. Node-REDフローサンプル¶
ICE Core SDKの中に、Node-REDフローのサンプルを同梱しています。
3.4.1. センサデータを加工・送信するサンプル¶
3.4.1.1. 概要¶
温度センサ、湿度センサから温湿度を取得し、不快指数を算出してしきい値を超えたときにバックエンドに通知するサンプルです。
3.4.1.2. 構成¶
ICE Core SDKに同梱されている以下のファイルを使用します。
core/
+-- samples/
+-- native/app/
| +-- thermometer_sample/ # 疑似温度(摂氏)センサ
| +-- hydrometer_sample/ # 疑似湿度センサ
|
+-- node-red/
discomfort.json # 温度センサ、湿度センサのデータを元に不快指数を算出・通知するフロー
本サンプルのフローは下記のような構成となっています。
- ice device in 1
- thermometer_sampleのイベントデータを受け取ります。
- ice device in 2
- hydrometer_sampleのイベントデータを受け取ります。
- delay 1
- メッセージの流量を10秒あたり1メッセージに調整します。
- delay 2
- メッセージの流量を10秒あたり1メッセージに調整します。
- join
- thermometer_sampleとhydrometer_sampleのイベントデータを一つのメッセージにマージします。
- function
- 温湿度の値から不快指数を算出し、メッセージにセットします。
- switch
- 不快指数の値がしきい値(80)を超えた場合のみメッセージを流すように制御します。
- ice backend out
- 不快指数の値をイベントデータとしてバックエンドに送信します。
3.4.1.3. 実行手順¶
ICE Coreを停止します。
$ sudo systemctl stop ice-edge-core
ICE Core SDKをセットアップします。
thermometer_sampleとhydrometer_sampleを以下のコマンドでコピーします。
$ sudo cp -r {ICE_HOME}/samples/native/app/thermometer_sample {ICE_HOME}/native/user/ $ sudo cp -r {ICE_HOME}/samples/native/app/hydrometer_sample {ICE_HOME}/native/user/
thermometer_sampleとhydrometer_sampleをビルドします。
$ cd {ICE_HOME}/native/user/thermometer_sample $ sudo make $ cd {ICE_HOME}/native/user/hydrometer_sample $ sudo make
ICE Coreを起動します。
$ sudo systemctl start ice-edge-core
ブラウザから下記URLにアクセスして、Node-REDエディタを表示します。
http://{エッジのアドレス}:22408/
Node-REDエディタの右上メニューの[読み込み - クリップボード]を選択し、
${ICE_HOME}/samples/node-red/discomfort.json
の内容をコピー&ペーストし、「読み込み」ボタンをクリックします。フローがインポートされたのを確認し、Node-REDエディタの「デプロイ」を実行します。
フローが動作し始め、10秒に一度不快指数の算出が行われます。しきい値(80)を超えた場合にバックエンドに通知されるので、Backend APIの下記APIで通知内容を確認します。
$ curl -X GET http://{バックエンドのアドレス}/api/backend/event_data
3.4.2. デバイスアクチュエーションのサンプル¶
3.4.2.1. 概要¶
空調機器、照明機器に対して室温・照度を調節するアクチュエーションを実行するサンプルです。
3.4.2.2. 構成¶
ICE Core SDKに同梱されている以下のファイルを使用します。
core/
+-- samples/
+-- native/app/
| +-- air_conditioning_sample/ # 空調機器を想定したエミュレータ
| +-- lighting_sample/ # 照明機器を想定したエミュレータ
|
+-- node-red/
device_actuation.json # 空調、照明にアクチュエーションするフロー
本サンプルのフローは下記のような構成となっています。
- ice backend in
- バックエンドからのアクチュエーションを受信します。
- switch
- アクチュエーションのデータをチェックし、空調機器と照明機器にデータをルーティングします。
- rbe 1
- 同じアクチュエーションを何度も実行しないように、前回からの差分をチェックします。
- rbe 2
- 同じアクチュエーションを何度も実行しないように、前回からの差分をチェックします。
- ice device out 1
- air_conditioning_sampleにアクチュエーションを送信します。
- ice device out 2
- lighting_sampleにアクチュエーションを送信します。
- ice device in 1
- air_conditioning_sampleのイベントデータを受け取ります。
- ice device in 2
- lighting_sampleのイベントデータを受け取ります。
- ice backend out
- バックエンドにイベントデータを送信します。
3.4.2.3. 実行手順¶
ICE Coreを停止します。
ICE Core SDKをセットアップします。
air_conditioning_sampleとlighting_sampleを以下のコマンドでコピーします。
$ sudo cp -r {ICE_HOME}/samples/native/app/air_conditioning_sample {ICE_HOME}/native/user/ $ sudo cp -r {ICE_HOME}/samples/native/app/lighting_sample {ICE_HOME}/native/user/
air_conditioning_sampleとlighting_sampleをビルドします。
$ cd {ICE_HOME}/native/user/air_conditioning_sample $ sudo make $ cd {ICE_HOME}/native/user/lighting_sample $ sudo make
ICE Coreを起動します。
ブラウザから下記URLにアクセスして、Node-REDエディタを表示します。
http://{エッジのアドレス}:22408/
Node-REDエディタの右上メニューの[読み込み - クリップボード]を選択し、
${ICE_HOME}/samples/node-red/device_actuation.json
の内容をコピー&ペーストし、「読み込み」ボタンをクリックします。フローがインポートされたのを確認し、Node-REDエディタの「デプロイ」を実行します。
フローが動作し始め、10秒に一度室温と照度がバックエンドに送信されるようになります。バックエンドに届いたイベントデータはBackend APIの下記APIで確認できます。
$ curl -X GET http://{バックエンドのアドレス}/api/backend/event_data
Backend APIの下記APIを実行し、室温・照度を変更します。
室温を10に変更する場合。
$ curl -X PUT -H 'Content-Type:application/json' -d '{"equipment":"air_conditioning","value":"10"}' http://{バックエンドのアドレス}/api/edge/{エッジID}/device/nodered?op_type=actuate
照度を800に変更する場合。
$ curl -X PUT -H 'Content-Type:application/json' -d '{"equipment":"lighting","value":"800"}' http://{バックエンドのアドレス}/api/edge/{エッジID}/device/nodered?op_type=actuate
アクチュエーションの実行結果が返信されるので、Backend APIの下記APIで確認します。
$ curl -X GET http://{バックエンドのアドレス}/api/backend/op_result
手順9と同様のAPIで、室温・照度が変更されていることを確認します。
3.4.3. AWS IoTと連携するサンプル¶
3.4.3.1. 概要¶
「デバイスアクチュエーションのサンプル」同様のシナリオで、AWS IoTのThing Shadowと連携するサンプルです。
3.4.3.2. 構成¶
ICE Core SDKに同梱されている以下のファイルを使用します。
core/
+-- samples/
+-- native/app/
| +-- air_conditioning_sample/ # 空調機器を想定したエミュレータ
| +-- lighting_sample/ # 照明機器を想定したエミュレータ
|
+-- node-red/
aws_thingshadow.json # AWS IoTのThing Shadowと連携するフロー
本サンプルのフローは下記のような構成となっています。
- ice backend in
- AWS IoTのThing Shadowと通信し、deltaを受信します。
- switch
- deltaの内容をチェックし、空調機器と照明機器にデータをルーティングします。
- function 1
- deltaから室温の値を取り出し、air_conditioning_sampleに渡すメッセージを作成します。
- function 2
- deltaから照度の値を取り出し、lighting_sampleに渡すメッセージを作成します。
- ice device out 1
- air_conditioning_sampleにアクチュエーションを送信します。
- ice device out 2
- lighting_sampleにアクチュエーションを送信します。
- ice device in 1
- air_conditioning_sampleのイベントデータを受け取ります。
- ice device in 2
- lighting_sampleのイベントデータを受け取ります。
- rbe 1
- 同じデータを何度も送信しないように、前回からの差分をチェックします。
- rbe 2
- 同じデータを何度も送信しないように、前回からの差分をチェックします。
- function 3
- Thing Shadowのupdateメソッドで送信するデータを作成します。
- delay
- AWS IoTへのデータ送信頻度を1秒あたり1メッセージまでに流量制御します。
- ice backend out
- AWS IoTのThing Shadowと通信し、updateメソッドを実行します。
3.4.3.3. 実行手順¶
ICE Coreを停止します。
ICE Core SDKをセットアップします。
air_conditioning_sampleとlighting_sampleを以下のコマンドでコピーします。
$ sudo cp -r {ICE_HOME}/samples/native/app/air_conditioning_sample {ICE_HOME}/native/user/ $ sudo cp -r {ICE_HOME}/samples/native/app/lighting_sample {ICE_HOME}/native/user/
air_conditioning_sampleとlighting_sampleをビルドします。
$ cd {ICE_HOME}/native/user/air_conditioning_sample $ sudo make $ cd {ICE_HOME}/native/user/lighting_sample $ sudo make
AWS IoTの「管理」メニューで、モノの登録を行います。モノの名前に、ICE CoreのエッジIDを指定してください。
ICE Coreを起動します。
ブラウザから下記URLにアクセスして、Node-REDエディタを表示します。
http://{エッジのアドレス}:22408/
Node-REDエディタの右上メニューの[読み込み - クリップボード]を選択し、
${ICE_HOME}/samples/node-red/device_actuation.json
の内容をコピー&ペーストし、「読み込み」ボタンをクリックします。Node-REDエディタの右上メニューの[ノードの設定]を選択し、ice-aws-iot-configの「thing」をダブルクリックします。
ノード編集画面が表示されるので、「Endpoint」、「CA Certificate」、「Certificate」、「Private Key」に適切な値を設定し、「更新」を実行します。
Node-REDエディタの「デプロイ」を実行します。
フローが動作し始め、Thing ShadowのstatusがAWS IoTに送信されるようになります。AWS IoTの「管理」メニューでシャドウが更新されていることを確認してください。
AWS IoTのシャドウを編集してdeltaを発生させることで、ICE Coreに対してアクチュエーションを行います。
室温を10、照度を800に変更したい場合、以下のようにdesiredを追加します。
{ "desired": { "air_conditioning": { "value": 10 }, "lighting": { "value": 800 } }, "reported": { "air_conditioning": { "value": 20 }, "lighting": { "value": 1000 } } }
ICE Coreでアクチュエーションが実行され、reportedの値が手順13で設定した値に変化します。
{ "desired": { "air_conditioning": { "value": 10 }, "lighting": { "value": 800 } }, "reported": { "air_conditioning": { "value": 10 }, "lighting": { "value": 800 } } }