R-MSMデータのローカルPCでの受信と保存

1. 概要

R-CPS(Cyber Physical System)では、以下の図1や図2に示すようにR-MSM(Multi-Sensor Module)に搭載したセンサからのデータは、PDH(Physical Data Hub)にBluetoothやLPWAで送られます。その後、図1のようにPDHから直接クラウドに送られる場合や図2のように、いったんフロアマネージャにデータ集めてからクラウドに送られる場合があります。

一方、センサを取付けた環境や機器などの状態を確認するために、一時的にR-MSMのデータを確認することが必要になる場合があります。そのような場合には、図3や図4のように、ローカルPCをネットワークに配置して、クラウドに送られているデータをローカルPCでも受信、保存することが必要になります。
ここでは、ローカルPCにもクラウドと同様に、Node-REDを立上げ、MQTTのデータを受信して保存する方法を説明します。

2. PDHとローカルPCの接続

次に、PDHとローカルPCの接続に関して説明します。PDHとローカルPCは同一ネットワーク上に存在するとします。もしくは、フロアマネージャを介して、PDHからローカルPCにデータを送信できるものとします。以下の説明では、フロアマネージャを介する説明は省略し、PDHとローカルPCが直接データのやり取りをする状況に限定して話を進めます。そして、最後の「5-5.フロアマネージャがある場合」でフロアマネージャがある場合に関して、説明します。
PDHは、 R-MSM(センサ)のデータをNode-REDで扱います。そして、MQTTのパブリッシング機能を用いて、クラウド(GCP)上のVM(Virtual Machine)上に立ち上げたMQTTのブローカにパブリッシングします。クラウドのVM上のNode-REDは、MQTTのデータをサブスクライブし、データベースへ保存します(この辺りの記事は、第5巻 「フロアマネージャ(サーバー)、GCP(クラウド)」をご覧ください)。
クラウドのVMと同様に、ローカルPCでも、MQTTのブローカーを立上げます。そして、PDHからパブリッシングされたデータをサブスクライブして保存します(図5)。その際に、Node-REDを使用します(ローカルPCへのNode-REDのインストールやMQTTブローカーノードのインストールに関しては、第4巻の Windowsへのインストールや1-2-1-5. MQTT Brokerノードの追加の追加の記事をご覧ください)

ここから、以下の流れでPDHとローカルPCのNode-REDのエディタ画面を使ってフローの説明/作成をしていきます。

章番号と見出し 概要 使用するNode-RED
3. PDHでのデータ処理 PDHでのデータの加工内容の説明 PDH上のNode-RED
4. ローカルPCへの出力をPDHに追加 PDHにローカルPC上のmqtt ブローカへのパブリッシング機能を追加 PDH上のNode-RED
5. ローカルPCで受信と保存

1) ローカルPCに、PDHからのデータをサブスクライブする機能を追加

2) サブスクライブしたデータをjson形式とcsv形式で保存する機能を追加

ローカルPC上のNode-RED

3. PDHでのデータ処理

3-1. PDHへの入力データ

R-MSMから送られてくる測定データは、以下の様なJSON形式です。

dvice名やid番号、センサ名、タイムスタンプ、測定データが含まれています。
この例は、環境センサBME688のデータです。温度(temp)や湿度(humid)、気圧(press)、空気清浄度(gas)などの測定データが含まれます。
R-MSMで付与されるタイムスタンプは、R-MSMの電源を入れたときからの経過時間(ms)を表していますので相対的な時間を表します。
(R-MSMから送られてくる測定データの詳細は、出力データフォーマットをご覧ください)

3-2. PDHの出力データ

PDHから出力されるデータは、以下の様なJSON形式です。追加は赤字、変更は青字で示します。

入力データに以下の加工がされています。
1)受信時刻の付与
2)データの単位の付与
3)温度データの補正(-10℃)

測定データでは、いつのデータなのかは非常に重要です。したがって、受信時刻を付与しています。また、同様にデータの単位も重要ですので、単位もこの時点で付与しています。また、R-MSMは小型基板に各種センサが密集していますので、温度が高めに出ます。その分の補正を行っています。
PDHは、これらの加工をデータに行い出力します。

3-3. Node-REDでの処理内容確認

Node-REDでの加工を見てみます。ローカルPCでブラウザを開き、“http://gw52f5:1880”  (gw52f5の部分は各自のPDHのhostnameを入れてください)と入力し、Node-REDのフロー画面を開きます。

図6は、PDHのNode-REDの入力部(sensor-module_data)のフロー画面です。
①:serial inノードです。R-MSMからBluetoothで送られてきた信号を受信します。転送スピードは、1,000,000bpsです。
②:Date/Time Formatterノードです。非標準のノードですので、追加が必要です。追加は、Date/Time Formatterノードの追加をご覧ください。
③:changeノードです。単位を追加しています。
④:functionノードです。温度補正(-10℃)を行っています。

1) Date/Time Formatterノードのプロパティ画面の設定ポイントを説明します。
① Input fromには、msgが来たら現在の日時を発行するように、“日時”を選択します。
② Output formatには、出力フォーマットを指定します。
③ Output toには、msg.payload.datetimeと記載し、msg.payloadの下に入れます。msg.payloadのままだと上書きされますので注意です。

2) Changeノードのプロパティ画面の設定ポイントを説明します。
単位を追加するために“値の代入”を選択します。値の代入は、下の欄の値を上の欄に代入するという動作になります。ここでは、文字”deg”を ”msg.payload.temp.units“に代入しています。他も同様です。

3) functionノードのプロパティ画面の設定ポイントを説明します。
functionノードは、前段ノードからの“msg”を入力にして、javascript言語のプログラムを記載することできます。出力は、ここでは、returnで返しているmsgになります。
Node-REDは、ノードを組み合わせるだけでなく、functionノードを使って、プログラムを記載することも可能です。
ここでは、次の行で、tempcomp = -10をtemp.valに加算して補正しています。

msg.payload.temp.val += msg.payload.tempcomp

その次の行で、小数点2桁までに丸めて、フロートの数値に変換しています。
(toFixed()を使うと返り値は、文字列になるので、floatに型変換しています)

4. ローカルPCへの出力をPDHに追加

ここまで、PDHへの入力から出力へのデータの変更内容を確認してきました。ここからは、出力データをローカルPCに渡すための変更を加えます。
PDHのNode-REDのフロー画面で、“センサデータの利用”というタブを選択します。図7のような画面が現れます。

このタブは、出力部のフローです。図6の右下の「保存へ」とコメントの付いた“link outノード”から図7の①の”link inノード“へデータが送られてきます。
そのデータを②の”link outノード“に出力するとともに、画面下側に記載のあるファイル出力を行うフローです。
②の部分の”link out“と”link in“はつながっています。簡単な処理であれば、②の右側の“link in”につなげて記載できますし、別のタブに出力部を記載するときには、②の”link out“につなげた”link in”を新たに別タブに配置することでデータを転送できます。
また、データの送信ならびにPDHへのファイル保存は、③の”injectノード”のボタンを押すことでスタートします。そして、④の”injectノード“のボタンを押すことで停止します。

ローカルPCへのデータの転送のためのフロー変更を行います。
ここでは、mqtt outノードを追加するだけですので、②の右側の”link inノード”にmqtt outノードを配置して繋げます(⑤)。
次に、mqtt outノードのプロパティを設定します。mqtt outノードをダブルクリックして、プロパティ画面を開きます。

⑥ mqtt-brokerを追加するので、サーバの欄の横の鉛筆マークをクリックします。

⑦ ローカルPCのIPアドレスをサーバの欄に入力します。
⑧ 名前を入力します。
⑨ 最後に「追加」を押します。

⑩ トピックスを入力します。ここでは、PDHの“hostname”としました。
⑪ 入力が終わったら、「完了」を押します。

⑫ 以上で終了です。デプロイを押します。

未だローカルPCに、mqtt brokerを配置しておりませんので、mqtt outノードの下に、「切断」もしくは「接続中」と表示されていると思います。
⑬ 忘れずに、injectノード「rec_start」のボタンを押しておきます。

5. ローカルPCで受信と保存

ここまで、PDH側からデータをmqttのブローカーへパブリッシュするための変更を行いました。ここからは、ローカルPC側でデータをサブスクライブするためのNode-REDのフローの記述を行います。Node-REDのインストールが済んでいない場合は、Windowsへのインストール”を参考にNode-REDをインストールしてください。
また、新規機能ノードの追加を参考にして、MQTT Brokerノードgateノードを追加しておいてください。

5-1. データの受信(サブスクライブ)

Node-REDを起動し、ブラウザで、フローのエディタ画面(http://localhost:1880)を開きます。
始めにMQTT Brokerノードとサブスクライブのためのmqtt inノードを配置します。
① MQTT Brokerの設定とトピックを設定するために、mqtt in ノードをダブルクリックして、プロパティ画面を開けます。

② mqtt brokerを追加するために、サーバの横の鉛筆マークをクリックします。

③ サーバの欄に”local host“と入力します。
④ 「追加」ボタンを押します。

⑤ サブスクライブするトピック名をトピック欄に入力します。
⑥ 完了を押します。

⑦ デバッグノードを追加し、mqtt_inノードの出力とつないで、デプロイします。
上手く接続されると、broerノードの下に、“connected 2”と表示されます。また、mqtt inノードの下にも“接続済”と表示されます。
同時にデバッグ画面にサブスクライブしたデータが表示されます。

5-2. 保存データの選択

データをローカルPCでサブスクライブできるようになりましたので、保存するデータを選択します。R-MSMの評価キットのデフォルトでは、アクティブなセンサは、9軸センサ“BMX160”と環境センサ“BME688”とADC“ADS1015”の3つです。ここでは、9軸センサのジャイロデータとtimestamp、datetimeの情報を抜き出します。

1) BMX160の測定データのみ抽出
① switchノードを、mqtt inノードの後段に配置します。

ダブルクリックしてプロパティ画面を開き、msg.payload.sensor が “BMX160”となっているデータのみを通すように、記述を変更します。
② msg.payloadの後ろにsensorを追加し、msg.payload.sensorとします。
③ その下の条件欄にを“==”のままとします。
④ その右側に、文字列で”BMX160”と入力します。

以上で、msg.payload.sensor == “BMX160”であれば、そのmsg.payloadは、”1”の出力に送られます。
⑤ 完了を押して、プロパティを閉じます。

⑥ デプロイを押すと、BMX160のデータのみデバッグ画面に表示されます。

2) 不要なデータの削除

① changeノードを、switchノードの後段に配置します。ダブルクリックしてプロパティ画面を開きます。

② ルール欄の一番左のドロップメニューから“値の削除”を選びます。
③ 削除対象のデータを記載します。ここでは、“msg.payload.acc”を削除します。
④ 追加ボタンを押して、削除するデータの数だけルールを追加します。
⑤ 追加が終わったら、「完了」を押します。

⑥ デプロイを押すと、gyroのデータのみデバッグ画面に表示されます。

5-3. 保存の開始と停止

以上で、保存するデータの準備は完了しました。次に、保存の開始と停止のためのゲートを設定します。
gateノードを使って、データを通すか止めるかを制御します。
injectノード2つとgateノードを以下の様に配置します。gateノードの入力には、changeノードの出力とinjectノードの出力が2つ入るようにします。

2つのinjectノードのプロパティを以下の様に設定します。
① start側:msg.payload = “open”   msg.topic = “control”
② stop側: msg.payload = “close”   msg.topic = “control”
これにより、gateノードがデータを通すか止めるかが切り替えられます。

※gateノードは、入力されたmsg.topicが、”control”だった場合に、msg.payloadの値をチェックします。
msg.payloadが、open, close, toggle, reset, statusのいずれかの場合、その指示に従った動作をします。
openとcloseの状態があります。状態は、statusノードでモニタすることもできます。

injectノードを使って、startとstopでデータが通るか通らないかを切り替えられます。

5-4. ファイルへの保存

jsonノードとwrite fileノードを使って、jsonファイルの保存のフローを以下の図の様に作ります。
また、changeノードとcsvノードとwrite fileノードを使って、csvファイルの保存のパスを以下の様に作ります。
jsonファイル保存フローから順に説明します。

1)jsonファイル保存フロー
・ Node-REDのobjectフォーマットをjsonフォーマットに変換するjsonノードは、プロパティを変更するところはありません。
・ write fileノードは、修正が必要です。ダブルクリックしてプロパティを開きます。
① ファイル名は各自の環境に合わせて変更してください。フルパスで記入して下さい。
② 名前は適宜変更してください。
③ 修正後「完了」を押します。

2) csvファイル保存フロー
Node-REDのオブジェクトファイルをcsvフォーマットに変換するcsvノードは、gyroデータのような下位層を持ったオブジェクトに対応していません。そのため、強引に変換すると消されてしまいます。
そこで、csvノードに入力する前に、gyroデータの階層をフラットにするためにchangeノードを使用します。

・ changeノードをダブルクリックしてプロパティを開き、ルールを修正して階層を無くします。
① msg.payload.gyro.val[0] ⇒ msg.payload.Rxに代入します。
② ルールを追加して、 msg.payload.gyro.val[1] ⇒ msg.payload.Ryに代入します。
③ ルールを追加して、 msg.payload.gyro.val[2] ⇒ msg.payload.Rzに代入します。
④ ルールを追加して、 msg.payload.gyro.units ⇒ msg.payload.unitsに代入します。
⑤ ルールを追加して、 msg.payload.gyroを削除します。
⑥ 修正後、「完了」を押します。

・ csvノードをダブルクリックしてプロパティを開きます。
① ヘッダーを1度だけ送信しますを選択します。これにより、列名が1度だけ送信されます。
② 改行コードを各自のローカルPCのOSに合わせて変更してください。
③ 修正後、「完了」を押します。

・ write fileノードをダブルクリックしてプロパティを開きます。
① ファイル名は各自の環境に合わせて変更してください。フルパスで記入して下さい。
② 「メッセージの入力のたびに改行を追加」のチェックを外します。外さないと空行が1行おきに入ります。
③ 名前は適宜変更してください。
④ 修正後「完了」を押します。

以上で、フローの作成は完了です。
デプロイをして、injectノードの”start”ボタンを押してください。データが送られて、ファイルに保存されます。

保存ファイルの例を以下に示します。

■ jsonファイルの中身確認

■ csvファイルの中身確認

EXCELで読み込むと以下の様になります。

5-5. フロアマネージャがある場合

ここまで、フロアマネージャが無い場合に関して説明してきました。最後にフロアマネージャがある場合に関して説明します。
下の図の上側のように、フロアマネージャがある場合には、PDHからのデータは、フロアマネージャのmqtt ブローカにパブリッシングされます。そして、フロアマネージャとクラウド間のデータのやり取りは、2通り考えられます。
1) フロアマネージャからクラウドのVM上のmqttのブローカに対して、パブリッシングする方法
2) クラウドのVMが、フロアマネージャのmqttのブローカからサブスクライブする方法
いずれの場合であっても、ローカルPCは、PDHからフロアマネージャのmqttブローカにパブリッシングされたデータをサブスクライブすれば良いです。
そのため、ローカルPCのNode-RED上にmqttのブローカは必要ありません。

従って、フロアマネージャがある場合のローカルPCのNode-REDのフローは以下の様になり、ここまでの説明と2点だけ異なります。
① mqtt ブローカがローカルPCには不要
② mqtt inノードのサーバのIPアドレスを”localhost”ではなく、フロアマネージャのIPアドレスにする必要があります。

この2点を変えれば、フロアマネージャがある場合でも、ローカルPCでデータは受信でき、json形式やcsv形式で保存できます。