はじめに
本コンテンツは、IoT ハッカソンで使用する技術ハンズオンの資料です。
環境は参加者が自由選択できますので、参考としてご活用ください。
概要
本記事の構成では enebularからMotionBoard Cloud へデータを直接転送する構成 を紹介します。
事前準備
運営よりテナントIDとパスワードを受け取ってください。
MotionBoard Cloudのマニュアルページから、
MBC-1-1 使用前の準備をする
を参考にログインできる状態にしておいてください。
MotionBoard クラウドサービスログインページ:
https://cloud.motionboard.jp/motionboard/
構成
温度センサーを使って、デバイスから温度データをMotionBoard Cloudへデータを転送し、ボードで可視化していきます。
以下に2種類のデバイスからHTTP(POST)を通じ、enebular → Motion Board Cloudの構成を示します。
MotionBoard Cloud へデータを転送する構成
本章では、以下の順番で手順を示していきます。
の順番で説明していきます。
1.温度データ可視化のボード作成
本資料では、地図上にピンを表示して、そのポイントの温度をグラフに表示するボードを作成していきます。
新規ボード作成
MotionBoard Cloudへログインします。
メニューからスタートナビ
を選択します。
次に新規作成
を選択してボードを作成していきます。
ボード新規作成のダイアログが表示されたら、名称を入力しOK
を選択してください。
ここでは名称を温度モニタ
とします。
データソース作成
次にアイテムウィザートのウインドウが表示されるので、新しいデータソースを作成していきます。
アイテムウィザートが表示されたら、+
記号を選択します。
システム設定が表示されるので、メニューから[接続/認証
] - [リアルタイム連携
]を選択してください。
システム設定のリアルタイム連携画面が表示されるので、永続化先DB
タブを選択して、作成したテンプレートと保存先のDBを指定していきます。
左側のリスト一覧から、外部接続先名:DataStorage
- タイプ:Dr.Sum
を選択します。
真ん中にデータベース名一覧が表示されるので、DataStorage
を選択します。
選択すると、右側の変更後の設定に以下設定がされていることを確認してください。
項目 | 設定値 |
---|---|
外部接続先名 | DataStorage |
データベース名 | DataStorage |
続いて、リアルタイム
タブを選択肢、テンプレート選択右側にある+
ボタンを選択してください。
テンプレートの新規作成ダイアログが表示されるので、テンプレート名を入力してください。
ここでは、tmpr_template
としています。
なお、後ほどこのテンプレート名はenebularのノード設定で使用するため、控えておいてください。
テンプレートを作成したら、以下項目の設定をしてください。
項目 | 設定 |
---|---|
Web API | 利用するにチェック |
永続化 | 利用するにチェック |
保存先テーブル名 | tmpr_table |
実行ユーザー | <各アカウントの名前> |
実行ユーザーは、検索
ボタンを押下して右側のドロップダウンリストから選択します。
認証キーの自動生成
ボタンを押下してください。
生成された認証キーは先程のテンプレート名同様enebularのノード設定で使用するため、控えておいてください。
続いてステータス
タブを選択し、テーブルのステータスを作成します。
新規作成
ボタンを選択して、ダイアログが表示されたら以下内容に従って、設定してください。
設定が完了したらOK
を選択してダイアログを閉じます。
項目 | 設定 |
---|---|
ステータス名 | tmpr_c |
MB IoT Agent | 未設定 |
データ型 | 数値 |
設定が完了したら、保存
を選択してテンプレートの作成を終了します。
最後にテンプレート作成・設定、永続化先DBの設定が完了したら、右上のバツボタンを選択して、リアルタイム連携の設定を完了します。
アイテムウィザート画面に戻ったら、データソースの一覧から作成したテーブルtmpr_table
を選択します。
ツリーを展開して表示されなかった場合、接続先の右にある回転のアイコンを選択肢、更新してください。
テーブルを選択したら、次へ
を選択します。
アイテムウィザートの2つ目で、アイテムの種類を選択しますが、
まず先に画面のレイアウトを作成するため、ここではキャンセル
を選択しウィザードを終了します。
レイアウト作成
ここまでの手順でアイテムのない空のボードが作成されました。
レイアウトの作成をしていきます。
ここでは、左右2つに50%-50%で分割し、左側のペインにGEO
(地図)を右側のペインにチャート
(折れ線グラフ)を表示していきます。
下に表示されている項目の一覧から、レイアウト編集
のアイコンを選択肢画面レイアウトを編集していきます。
アイコンを選択したら、分割するページ左側にマウスカーソルを持っていき、表示されたアイコンをクリックします。
GEO設定
GEO
を配置するとGEO設定の画面が表示されるため、地図情報の画面を表示する設定をしていきます。
データソース設定
データソースの設定項目が固まっている位置の右側にある新規作成
を選択します。
ダイアログが表示されるので、データソース名決めます。ここでは、tmpr_ds
とします。
データソースの設定をしていきます。
アイテムウィザードで作成したtmpr_table
を選択して、OK
を選択します。
データソースエディタでは、リアルタイムに更新させるため以下の順番で設定をしていきます。
- ドリルアクションの機能OFF
- リアルタイム分析を有効化
- 見せるデータ項目を選択、設定
初めに、ドリルアクションの機能と両立しないためOFFしていきます。
-
ドリルアクション
を選択 - ドリルダウンタブで
ドリルダウンしない
をチェック - ドリルスルータブで
ドリルスルーしない
をチェック -
OK
ボタンで設定終了
ドロップダウンリストで[分析
] - [リアルタイム分析
]を選択します。
表示されたリアルタイム分析ダイアログで、以下項目を設定します。データ更新間隔は任意ですが、ここでは5秒とします。
設定が完了したらOK
ボタンを選択して設定を終了します。
「行列項目をリアルタイム分析用に変更します。...」と警告が表示されますが、OK
を選択します。
項目 | 設定 |
---|---|
リアルタイム分析 |
有効にする にチェック |
データ更新間隔(秒) | 5 |
各拠点(ID
)ごとの温度データ('tmpr_c')を時系列(DATETIME
)で表示するため、項目一覧から項目を以下のようにドラッグ&ドロップします。
- 列項目に
ID
- 行項目に
DATETIME
(リアルタイム分析の対象項目で設定済み) - 集計項目に
tmpr_c
集計項目の型と集計の方法を変更します。
集計項目のに設定したtmpr_c
をマウスオーバーし、エンピツアイコンを選択します。
基本項目設定のダイアログが表示されるので、以下項目を設定しOK
を選択します。
項目 | 設定 |
---|---|
データ型 | 数値 |
集計方法 | 平均 |
一通り設定が完了すると以下のような画面となります。
設定が完了したらOK
を選択し、データソース設定を終了します。
GEOの新規作成ダイアログに戻ったら、「利用データタイプ」で明細データ
をチェックします。
次に「マッピングタイプ」に緯度経度
チェックを入れます。
次に項目設定で、以下値を割り付けます。
項目名 | 種類 |
---|---|
ID | 表示名 |
LAT | 緯度 |
LON | 経度 |
リアルタイム連携設定
次にリアルタイム連携を設定するため、リアルタイム連携
タブを選択します。
設定画面が表示されたら、「リアルタイムデータを重ねて表示する
にチェックを入れ、「テンプレート選択」で作成したテンプレート(ここではtmpr_template
)を選択します。
続いて、詳細の項目が有効になるため、以下設定をしていきます
項目 | 設定 |
---|---|
適用方法 | 特定のステータスの値 |
キーとなるステータス | tmpr_c |
色のリスト下側にある追加
ボタンを選択
色を選択していきます。ここでは以下のように設定します。
項目 | 設定 |
---|---|
色 | 赤(#FF0000) |
最小 | 0 |
最大 | 100 |
設定が完了したらOK
を選択します。
チャート設定
レイアウト画面に戻ったら、右側にチャート
を配置します。
配置するとチャート新規作成の画面が表示されるので、作成済みのtmpr_ds
が選択されていることを確認します。
下側のチャートのアイコン群から折れ線
を選択します。
設定が終わったらOK
を選択します。
ボード設定を保存
上記までの手順でレイアウトと各ボードのアイテムの設定が完了しました。
以下のような表示になるので、下側の保存
アイコンを選択します。
確認のダイアログが表示されるので、OK
を選択して、ボードの保存完了です。
以上で、温度モニタ用ボード作成の作成が完了です。
次にデバイスからMotionBoard Cloudへデータを転送する箇所を作成していきます。
enebularフロー作成
新しくenebularのフローを作成していきます。
フロー作成
- 作成したプロジェクトのASSETSから、
Flows
を選択します。 - Flowのリストから
+
ボタンを選択して、フローを作成していきます。 - ダイアログが表示されたら、最上段のname欄にフロー名を入力します。
ここでは、"motionboard"としています。
入力が終わったら、Continue
ボタンを選択してください。 - 続いて、
Edit
ボタンを選択して、フローを編集していきます。
フロー編集
以下の図のようなフローを作成していきます。
各ノードに以下の内容を設定していきます。
入力
- HTTP
項目 | 値 |
---|---|
メソッド | POST |
URL |
/tmpr (※任意ですが、ここでは"/tmpr"としています) |
URLはデバイスの<エントリーポイントURL>で使用するため、控えておいてください。
機能
- function
項目 | 値 |
---|---|
名前 | 任意 |
コード | 下記を参照 |
var newPayload = {
id: msg.payload.imsi, // IMSIをIDとして設定
time: new Date().getTime(), // タイムスタンプ付与
lat: msg.payload.lat, // 緯度
lon: msg.payload.lon // 経度
};
msg.payload = newPayload;
return msg;
機能
- node red contrib mb iot rest
項目 | 値 |
---|---|
Name | 任意 |
URL | https://iot-cloud.motionboard.jp/motionboard |
Tenant | アカウント開設時に取得したテナントID (※運営からIDをもらってください) |
Authkey | MotionBoard Cloudで生成した認証キー |
テンプレート | MotionBoard Cloudで作成したテンプレート |
出力
- http response
項目 | 値 |
---|---|
名前 | 任意 |
状態コード | 200 |
状態コードはデバイスがPOSTしたリクエストに対して返すHTTPステータスコードで、任意の値です。ここでは200としています。
出力
- debug
特に設定することはありません。
デプロイ
続いて、i
アイコンにマウスカーソルを載せて転送先URLを控えてください。
以上で、デバイスからMotionBoard Cloudへの転送フロー作成が完了です。
デバイスプログラム
IDと緯度経度を送信する機能を追加
デバイスのプログラムの作成をして、一部コードを修正します。
(元のコードはこちら)
- JsonStringify()メンバ関数に緯度経度(ここでは固定値)のJSON要素を追加
- 拠点を識別するために、setup()関数にIMEI(端末識別番号)取得処理を追加
...(省略)...
// ===================================================
// グローバル変数
// ===================================================
WioCellular g_wio;
char imsi[20]; // ← ここの行を追加
...(省略)...
// 送信データをJSON文字列へ変換
String JsonStringify() const
{
String result("");
char buf[32];
sprintf(buf, "%d", static_cast<int>(this->temp));
result += "{\"tmpr_c\":";
result += buf;
result += ",\"lat\":35.664001"; // ← ここの行を追加
result += ",\"lon\":139.744244"; // ← ここの行を追加
result += ",\"imsi\":"; // ← ここの行を追加
result += imsi; // ← ここの行を追加
result += "}";
return result;
}
};
// ===================================================
// 初期化処理
// ===================================================
void setup()
{
...(省略)...
SerialUSB.println(TARGET_HOST);
g_wio.GetIMSI(imsi, sizeof(imsi)); // ← ここの行を追加
SerialUSB.print("IMSI:"); // ← ここの行を追加
SerialUSB.println(imsi); // ← ここの行を追加
}
...(省略)...
エントリーポイントの修正
新しくフローを作成するため、enebularのフロー作成で控えた転送先URLとエントリーポイントURLをそれぞれ設定してください。
// データ送信先選択
#define TARGET_HOST "<転送先URL>"
#define TARGET_URL "<エントリーポイントURL>"
↓
// データ送信先選択
#define TARGET_HOST "https://ev2-prod-node-red-*****.herokuapp.com/"
#define TARGET_URL "/tmpr"
解説
JsonStringify()メンバ関数に緯度経度(ここでは固定値)のJSON要素を追加
元のプログラムでは、温度データのみを送信していましたが、位置情報(緯度:lat、経度:lon)を追加しています。
result += ",\"lat\":35.664001";
result += ",\"lon\":139.744244";
なお、ここではサンプルとして位置は固定の座標としています。
拠点を識別するために、setup()関数にIMEI(端末識別番号)取得処理を追加
本対応はデバイスを複数台、複数拠点に設置して運用を想定しての変更になります。
ここでは、拠点を識別するための手段としてIMEIを用いてデータに加えるようにしています。
まず、IMSIを格納するための領域を準備します。
char imsi[20];
続いて、初期化関数にIMSIを取得するための処理を追加します。
g_wio.GetIMSI(imsi, sizeof(imsi));
SerialUSB.print("IMSI:");
SerialUSB.println(imsi);
実行結果確認
デバイスへプログラムを書き込み、温度データがと位置情報が転送されると、ボードに以下のように、ある地点での温度データが表示されます。
応用
enebularの応用で拠点ごとの住所取得サービスとの連携など、デバイスから吸い上げたデータを加工することができます。
リンク先では、以下の内容を紹介しています。
- enebularのフローに住所機能追加
- MotionBoard アイテムのリレーション機能追加
enebularでのデバッグ 〜debug
ノードの活用〜
全体を作成して期待する通りに可視化まで行かない場合があります。
そんなときはdebug
ノードを活用して、どこまで正しく動いているかを確認すると開発が捗ります。
デバイス → enebularにデータが転送しているかチェック
上記フローを作成、デプロイして正しく転送されると、デバッグ
タブに以下内容が出力されます。
正しく転送されていなければ何も表示されません。
データ加工後のデータが正しいかのチェック
データ転送同様に、データが正しく加工されているかをチェックするために、functionノードの後にdebugノードを追加すると良いです。
複数デバッグログを配置すると、ログがたくさん表示されます。
ログがどのノードで発生したものかを確認するには、ログの項目にマウスを乗せるとどのノードのログが分かります。
デバッグログを一時的に無効化する
デバッグが毎回表示され煩わしい場合は、デバッグノードの右端のタブをクリックすることで、ログを無効化できます。
こうすることで、ノード接続線を削除 → デプロイ や ノード削除 → デプロイなど
デプロイ操作無しに無効化することができます。