「AE2100」と920MHz帯無線「SmartHop」を活用して遠隔地のセンサーデータを収集してみよう(2)　 ―データ収集編―

# 要約
* この記事では、OKIのAIエッジコンピューター「AE2100」を使用して、遠隔地にあるセンサーデータを920MHz帯マルチホップ無線「SmartHop」経由で収集、AE2100上で可視化する方法を紹介します。
* 第２回の「データ収集編」では、AE2100にNode-REDを導入し、Modbus RTU対応のセンサーデータの収集・見える化を行う方法を解説します。


# はじめに
Node-REDはブラウザベースのエディタ内でパレットに並ぶ多種多様なノードを結びつけることによって、容易にフローを作成することができるツールです。
今回は、AE2100のdockerにNode-REDを導入し、CO2濃度および温湿度データの収集（Modbus RTUプロトコル）・見える化を行う方法を紹介していきます。センサーデータの収集は、第1回で構築したSmartHopの無線ネットワーク経由で行います。

# 環境
実行環境は次の図のような構成を前提とします。
![環境図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/0213d967-79c3-1feb-b25f-82318cd2d008.png)
ウインドウズPCからAE2100へTeraTermによって接続、AE2100からインターネットへ接続が可能なことを確認してください。
その他の環境は[「AE2100」と920MHz帯無線「SmartHop」を活用して遠隔地のセンサーデータを収集してみよう(1)―無線ネットワーク構築編―](https://qiita.com/shimatak/items/5e797739f6a12f69cbfa)をご参照ください。


# AE2100へのNode-REDの導入
Node-REDの構成およびAE2100に導入する方法については、[OKI AE2100 & Node-REDでローコードIoTしてみた。その２ 構築編](https://qiita.com/marufumio/items/f6bd3088c9c60e5e7f57)に分かりやすく記載されているので、そちらをご参照ください。
上記記事の「Dockerfile」の章で、２つのNode-REDライブラリを追加インストールしていますが、本記事用に以下の２つのライブラリもインストールしておいてください。
・node-red-contrib-modbus　（Modbus RTU実装用ノード）
・node-red-contrib-float　　（浮動小数データの変換用ノード）

※本記事ではMQTTは使用しないので、「Dockerコンテナの実行」の章に記載されている1883番ポートの設定は不要です。

Node-REDをAE2100に導入したら、Webブラウザでhttp\://192.168.100.1:1880にアクセスします。おなじみのフローエディタが表示されるはずです。
![インストール後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/25786967-4b9c-6bfb-0deb-30a400a75b3f.png)

# Modbus RTUでのデータ収集の実装
Node-REDのフローエディタで各種ノードをワークスペースに配置し、ノード間を線で結ぶことによってフローを作成します。
本記事では、Modbus RTUプロトコルでCO2濃度と温湿度のデータを収集するフローを以下のように作成しました。
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/719ed29b-7c30-860a-e143-40a8e92f7f03.png)

全体的な流れとしては、CO2コントローラーのデータ（CO2濃度）と無線入力ユニットのデータ（温湿度）をModbus RTUのReadコマンドにより1秒間隔で収集し、ダッシュボードで見える化まで行っています。
今回使用したノードは以下の8種類です。各ノードでそれぞれどんな処理を行ったかについて解説していきたいと思います。（各ノードの詳細な機能についてはQiitaの素晴らしい記事等をご参照ください。）
![各種ノード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/db2b2d91-47d3-7ba3-999b-0c95a7305372.png)

### injectノード
injectノードは一定間隔で自動的にフローを始動させることができます。
本記事では始点にinjectノードを配置し、1秒間隔でデータを収集するフローを作成しています。

### Modbus Getterノード
Modbus GetterノードではModbus RTUプロトコルに則ったデータ収集を行うことができます。
本記事では、CO2コントローラーの場合は局番１のレジスタ0x044のデータ（CO2濃度）をReadし、無線入力ユニットの場合は局番２のレジスタ0x002～0x007のデータをReadします。
※無線入力ユニットは入力１、入力２、入力３のデータを一括で収集し、後続のノードで入力１データ（温度）と入力３データ（湿度）にそれぞれ分割表示します。
※各センサーのレジスタマップはそれぞれの仕様書をご参照下さい。
![Modbus設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/fd1a27f8-1fac-22cf-6a7d-bc354d3fac07.png)
【設定値】
・名前：任意（センサーが識別できる名前など）
・Unit-ID：局番（センサーに設定した局番）
・FC：Modbusの機能コード（センサーの収集項目に合わせて設定）
・Address：収集するデータの先頭のレジスタ（センサーの収集項目に合わせて設定）
・Quantity：収集するデータ数（byte数）
・Server：RS485（ModbusRTUの場合）

### functionノード
functionノードでは文字列を数字データに変換しています。本記事では、後述のchartノードで時系列グラフを作成する際に入力が数字データでないとグラフが表示されないため、chartノードの前に配置しています。
また、無線入力ユニット側では、２つのデータを結合するという処理も同時に行っています。（対象となるデータが32ビット浮動小数点のデータであるため）

### splitノード
本記事では、無線入力ユニットの連続した６つのデータをまとめてReadしています。splitノードでは、その６データを[2データ,2データ,2データ]に分割しています。
※無線入力ユニットのデータが32ビット浮動小数点であるため２データずつに分割

### switchノード
switchノードでは、splitノードで分割したデータを３つの出力として分離します。今回は入力１（熱電対が測定する温度）と入力３（湿度）を使用するので、ノードの出力側の上から2番目の出力は使用しません。

### toFloatノード
無線入力ユニットの対象データ（入力１（温度）、湿度）が32ビット浮動小数点であるため、変換が必要です。toFloatノードを中継することで、32ビット浮動小数点から10進数の値に変換します。
センサーデータはどのようなデータ形式で出力されるかは、センサーの収集項目によって異なるので、各センサーの仕様書で確認してください。

### gaugeノード
収集したセンサーデータの瞬時値をゲージグラフで表示するために使用します。ゲージグラフはダッシュボード上に表示されます。

### chartノード
収集したセンサーデータの時系列値を折れ線グラフで表示するために使用します。折れ線グラフはダッシュボード上に表示されます。
※棒グラフや円グラフでも表示することが可能です。


#debugノードを使用した確認方法
前章で紹介したもの以外にも、Node-REDにはdebugノードという便利なノードがあります。
以下のようにdebugノードを配置してデプロイしてみてください。右側にあるデバッグエディターで、各センサーからの応答データを確認することができます。フロー作成途中でも正常にデータが収集できているか等を確認できるため、適宜活用することをお勧めします。
![デバッグイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/5f68b7ef-3d6b-d3f8-334e-3f860aec3538.png)
上記の図の例では、Modbus Getterノードを使用して収集した各センサーデータの生の値が配列で取得できていることが確認できます。

ちなみに、実際にはAE2100と各センサー間では以下のような電文のやり取りが行われていますが、Modbus Getterノードを使うことでModbusプロトコルの電文を意識せずにデータ収集できるのでとても便利です。
![電文コマンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/da9dcdd5-db53-0e29-e922-c25f3eae32f2.png)


# ダッシュボードによる表示確認
下図のようにCO2濃度、温度、湿度のゲージグラフおよびCO2濃度と温度の時間推移がダッシュボードに表示できました。
なお、gaugeノードとchartノードの細かい設定やダッシュボードの開き方については、[OKI AE2100 & Node-REDでローコードIoTしてみた。その３ 実践編 1](https://qiita.com/marufumio/items/7e04006f48036cc37f21)に分かりやすく記載されているので、そちらをご参照ください。
![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/cfb73523-00b9-f851-d450-27102b9e33ef.png)


# まとめ
今回はAE2100にNode-REDを導入し、920MHz帯マルチホップ無線「SmartHop」経由でセンサーデータの収集・見える化を行いました。遠隔地のセンサーデータを収集できるため、工場やビル等の広い敷地内でも一括で監視することができます。
環境データ以外にも電力値や接点情報等、様々なセンサーデータで収集できるので、是非チャレンジしてみてください。

* [「AE2100」と920MHz帯無線「SmartHop」を活用して遠隔地のセンサーデータを収集してみよう(1)　―無線ネットワーク構築編―](https://qiita.com/shimatak/items/5e797739f6a12f69cbfa)