OKI AE2100 & Node-REDでローコードIoTしてみた。その３ 実践編 1


# Node-REDでダッシュボード作成

# はじめに
本記事はOKIの「AIエッジコンピューター」と呼ばれる AE2100 というゲートウェイ製品にNode-REDを載せて、ローコードIoTのプラットフォームにしようという記事の **その３ 実践編 1「Node-REDでダッシュボード作成」** です。
[その１ 準備編「PythonでRS-485圧力センサーシミュレータ作成」](https://qiita.com/marufumio/items/d3182574e5bed35f94e0)
[その２ 構築編「DockerでローコードIoTプラットフォーム構築」](https://qiita.com/marufumio/items/f6bd3088c9c60e5e7f57)
[その３ 実践編 1「Node-REDでダッシュボード作成」](https://qiita.com/marufumio/items/7e04006f48036cc37f21)  **(本記事)**
[その４ 実践編 2「Node-REDでMQTT Pub/Sub」](https://qiita.com/marufumio/items/afdae6eb83b7752ce57d)

前回の記事では RS-485入出力に対応した Node-RED コンテナの立ち上げを説明しました。
Node-RED さえ動いてしまえば、Node-REDをどう使うか、どんなアプリをどうやって作るか、といったコンテンツはインターネットにたくさんあります。
しかしながら Node-RED で RS-485 を扱う内容は、少なくとも Qiita にはなかったので、記事にしました。
Node-RED に関しては、まったくの初心者向けの内容になります。

# こんなことやります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/dcd5f028-9946-393c-4e8c-bd5b637252bb.png)

本編で行う作業は **3 ダッシュボードに圧力値をリアルタイム表示** になります。

# Node-RED

本編は Node-RED 初めての読者に向けた記事なのですが、Node-RED 自体の説明は他の情報に譲ります。
Qiita にも素晴らしい記事がありますし([Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef))、YouTube等、他のメディアにもわかりやすい説明がたくさんあります（[こことか](https://medium.com/@taiponrock/node-red-%E3%83%95%E3%83%AD%E3%83%BC%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-4ee082910518)）。

ここでは記事内でよく参照する Node-RED のフローエディタの構成だけ載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/8628bffc-e245-00e9-d16e-1286bd3e752a.png)
**ワークスペース** に **フロー** を作って、**デプロイ** ボタンをクリックすると、**フロー** が保存され、実行されます。
つまりこのフローエディタは開発環境かつ実行環境であるわけです。
これだけわかれば、ここでの作業でつまずくことはないと思います。

# Node-REDフロー作成

それではさっそくフローを作成しましょう。
AE2100 に SSHクライアントでログインして、以下を実行してNode-REDを立ち上げます。

```
# docker run -it -p 1880:1880 -p 1883:1883 --device=/dev/ttyRS485:/dev/ttyRS485 -v /home/root/.node-red:/data --name node-red-1 node-red_v1:appf
```
以下のように **[info] Started flows** が表示されれば立ち上げ成功です。 

```
8 Sep 23:27:29 - [info] Server now running at http://127.0.0.1:1880/
8 Sep 23:27:29 - [info] Starting flows
8 Sep 23:27:29 - [info] Started flows
```

立ち上がった Node-RED に Webブラウザからアクセスします。
URLは以下のようになります。

```
http://AE2100のIPアドレス:1880
```

## RS485入力ノード設定

図の右がこれから作成するフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/a2f8c02c-bfd0-2a6a-910a-541feade1ab5.png)

まずはRS-485入力の設定からです。
上の図のように **serial in** ノードをパレットからワークスペースに Drag & Drop して、ダブルクリックして設定ダイアログを開きます。
開いた編集ダイアログでまず **シリアルポート** を設定します。**新規に serial-port を追加** するために、右の鉛筆アイコンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/c9dfda1f-bfce-7c72-71c6-6611c2e66cbd.png)

すると上の右図のようにシリアルポート設定画面が開きます。
**シリアルポート** に AE2100 の RS-485 のデバイスファイル名 **/dev/ttyRS485** を入力して、ボーレートは今回 **9600** にします。
**入力の分割方法**はデフォルトのまま、文字列を \n で区切って取り込みます。
右上の"**更新**"をクリックして元のダイアログに戻ります。

**シリアルポート** が **/dev/ttyRS485:9600-8N1** になったでしょうか。**名前** に**RS485**とでも入力して、**完了** をクリックして終了です。

## RS485入力確認

RS-485でデータを受信できるか確認します。
使用するは **debug** ノードです。パレットの上から2番目にあります。
これをRS465入力ノードの右に置いて、ワイヤーで接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/1b99f06a-50b7-afe1-3409-cd50f0214ba2.png)


ワイヤーで接続したら、右上の**デプロイ**をクリックして保存 & 実行しましょう。

RS485入力ノードが**接続済**になったでしょうか？
**接続済**"にならない場合、デバイスファイル名の入力間違いが疑われます。

ここで右上の**デバッグ**ボタンをクリックして、デバッグサイドバーを表示しましょう。
**debug** ノードが受信したデータはこのデバッグサイドバーに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/7d02ba4c-ddcd-b3d6-d6ac-196921c312b6.png)


それでは準備編でつくった RS-485 シミュレータを Windows PC で実行しましょう。
 python tx_press.py
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/bd7acf92-b6a7-b729-bdaa-3feeb7a001fc.png)

デバッグサイドバーには以下のように圧力値が出力されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/c7a68ce6-d53f-10a7-4980-ac0e9eb1005d.png)

何と、コードを一片も書かずにRS-485からデータの読み込みができてしまいました！

ここで **node-red-node-serialport** の他のノードに関して補足します。

**serial out** ノードはその名の通り、シリアル出力のためのノードであり、その設定は **serial in** ノードとまったく同じなので、あえて使用方法を説明する必要はないでしょう。

そして **serial request** ノードですが、これはセンサー等のRS-485デバイスに対して、コマンドを送信して何かレスポンスを受信したい場合に使うノードになります。

例えば本記事の**その１ 準備編**で作成した圧力センサーのシミュレータは、定期的に圧力データを送信するので、Node-RED はそれを **serial in** ノードを用意すれば、今回のように受信する事ができたのですが、データを受信するために、センサー機器に読み取りコマンドを送信しなければならないケースもあります。

また各種設定のために、送受信のシーケンスを組んでプログラムする必要があるセンサー機器もあります。

このような場合、**serial request** はとても便利なノードなのです。

シリアル通信に限らず、入出力インターフェースを使ってデータを送受信するフローを作成する場合、Node-REDではまず、こんな感じに **serial out** と **serial in** ノードを配置すると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/8829ae07-b64f-2c48-1cb7-c422207e2089.png)
上側のフローで読み取りコマンドを送信して、下側のフローでセンサーデータを受信します。
これはNode-REDの元になっているNode.js(JavaScript) の特徴である非同期プログラミングがいとも簡単に実現されているわけですが、複数の種類の送信、受信がある場合、これらの同期を取って正しくシーケンス処理を行うには１工夫、２工夫する必要があるでしょう。

ところが **serial request** ノードのおかげで、上のフローはこのようにまとめることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/69202ccf-88ca-7c6a-11d6-1e59f368a54b.png)

左側に読取コマンドを置いて**serial request** ノードにつなげると、右側にセンサー機器から受信したデータが得られるわけです。

これはノードが一つ減って見やすく、より直感的に理解できるようになったばかりでなく、write then read の同期がある程度保証されるとてもありがたい機能なわけです（ある目的でTXした後、意図しないRXが来てしまう可能性もあるので、何らかの確認が必要になるかもしれませんが、ほとんどのケースはこれで十分ではないでしょうか）。

なおこの **serial request** ノードの入出力バッファはFIFOになっていて、TX実行の後、RXを受信した後に、（FIFOに積まれている）次のTXが実行される仕様になっています。

この **node-red-node-serialport** ライブラリはNode.js用の **node-serialport** ライブラリを Node-RED でも使えるようにしたものの訳ですが、非同期で動くことが基本の Node.js で同期プログラミングするのは、何だか慣れないのです（自分だけ？）。
それが Node-RED になると、ノードを横につなげていくだけで直感的に同期プログラミングになるので、本当に助かります。

## ダッシュボード作成

せっかくなので、読み込んだ圧力値を少しカッコ良く表示してみます。
イメージのビルド時にインストールした **node-red-dashboard** ライブラリを使うと、以下のようなゲージとチャートを持つダッシュボードを簡単に作れてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/6f5d369c-ec40-6bd5-8823-b1bfeea56de5.png)

まずは **タブ** と **グループ** の作成からです。
下の棒グラフのアイコンをクリックすると、その下にダッシュボードのサイドバーが開きます。
デフォルトで**配置**タブが開いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/2e711528-e3c2-ccb4-a85e-51244c374c38.png)
ダッシュボードは１つまたは複数の **タブ** から成り、 **タブ** はゲージやチャートといった **ウィジェット** を **グループ** ごとに配置します。。。
GUIは文章で説明するものではありませんね。この[わかりやすい説明](https://qiita.com/kazutxt/items/b088d0577521ec06c3b3#%E7%94%BB%E9%9D%A2%E3%81%AE%E9%9A%8E%E5%B1%A4%E6%A7%8B%E9%80%A0)をご覧ください。

**ダッシュボード > タブ > グループ > ウィジェット** の関係を理解いただいたということで、作業を継続します！
まずタブを一つ作ります。上図の **+タブ** をクリックすると、その下に **Tab 1** としてタブが作成されます。
そこにマウスオーバーすると以下のように、3つのボタンが現れます。
まずは**編集**をクリックして、このタブの名前を「圧力計」とでも命名します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/e545c27d-8429-4c2a-b73a-702fa91b8881.png)

次にこのタブに属するグループの作成です。
**+グループ**をクリックして、このタブの下に一つグループを作成します。
そして作成したグループにマウスオーバーすると現れる**編集**(下図）をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/1afc474b-3b2f-8fa9-5aba-e3f04f01018b.png)

すると左側に下のようにグループの編集ウィンドウが開きます。
ここでは幅を**14**にして、グループ名は表示しないように✔をはずします。
これだけでOKです。**更新** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/9a5a7226-564b-4b90-e899-14661b477a52.png)

それではこの **Group 1** グループにゲージとチャートのウィジェットを配置していきます。

左のパレットの下のほう、**dashboard** グループから **guage** と **chart** をワークスペースに配置してRS485ノードと接続します。こんな感じです。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/32044b72-2e9b-d219-ef08-1408f3cf6835.png)

では **gauge** から設定していきましょう。ノードをダブルクリックすると左側に現れるウィンドウを以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/0228e09f-badb-ce86-3b03-323a387fdad9.png)


右上の **完了** をクリックしてゲージの設定は終了です。

続いて **chart** ノードの設定です。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/8cf42cd0-a077-cae0-7a75-40811bf59072.png)

右上の **完了** をクリックしてチャートの設定も終了です。

## ダッシュボード表示確認

右上の **デプロイ** ボタンをクリックして、このフローを保存・実行します。
その後、下図の赤色で囲ったアイコンをクリックしてください。
ダッシュボードは最近のタブブラウザでは別タブが開いて表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/ae742605-0d19-27de-8d53-9210f9e53765.png)

となりのタブにこのように表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/51616521-0d6c-7ea3-4f87-7d26354b72df.png)

なお、このダッシュボードは以下のようにNode-REDのURLに /ui をポストフィックスしてアクセスしても表示することができます。
http://localhost:1880/ui

# さいごに
コードを一片も書かずに RS-485 入力からダッシュボード表示までできてしまいました。。。
これは Node-RED の素晴らしさの賜物のわけですが、外見はクールだけれどソフトウェア開発環境としては素っ気ない AE2100 が、とても親しみやすく感じられるようになったのではないでしょうか。