OKI AE2100 & Node-REDでローコードIoTしてみた。その２ 構築編

# DockerでローコードIoTプラットフォーム構築
# はじめに
これはOKIの「AIエッジコンピューター」と呼ばれる AE2100 というゲートウェイ製品にNode-REDを載せて、ローコードIoTのプラットフォームにしようという記事の **その２「構築編 DockerでローコードIoTプラットフォーム構築」** になります。

[その１ 準備編「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)

前回の記事では、Windows 10 PC で動作する RS-485シミュレータを Python で作成しました。
今回はいよいよ AE2100 で Node-REDを立ち上げます。
内容としては、ほとんどDockerの作業になります。

Dockerfile を作り、Dockerコマンドを数回たたくと、 AE2100 で Node-RED が立ち上がります。

# こんなことやります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/56076149-465e-0e3c-46d0-64b5fc0f6dfb.png)


図の ❷ のNode-REDをインストールしたDockerイメージを作成します。

# Dockerイメージの構築

SSH で AE2100 にログインして Bash 上で作業します。

## Dockerfile

AE2100 で実行するDockerコンテナのイメージを作成するDockerfileです。
これだけでOKです。

```:Dockerfile
FROM nodered/node-red:1.1.3-minimal
USER root
RUN apk add python3 make g++ linux-headers
RUN npm install node-red-node-serialport node-red-dashboard

```
このファイルの内容ですが、まずFROM命令でベースとなるイメージを、Docker Hub にある nodered/node-red の最小イメージ 1.1.3-minimal に指定します。
そしてこの Alpine Linuxベースのイメージに root になって、Node-REDのシリアル通信ドライバのビルドに必要な以下の4つのパッケージを **apk add** します。

- python3
- make
- g++
- linux-headers

最後に、今回の作業に必要な以下の２つのNode-REDライブラリをここで **npm install** してしまいます。

- node-red-node-serialport
- node-red-dashboard

**node-red-node-serialport** は今回 AE2100 上の Node-RED で RS-485 を使うためのライブラリです。
このライブラリは名前が示す通り、RS-232C/RS-485/RS-422等シリアル通信機能をNode-REDに追加するライブラリになります。通常、RS-232C通信で良く使われるライブラリですが、RS-485でも問題なく使えました(マルチドロップは試していません）。

**node-red-dashboard** はNode-REDで簡易ダッシュボードを作成するためのライブラリです。
非常によく利用されており、アップデートも頻繁に行われています。
本文執筆時のバージョンはそれぞれ 3.23.3 と 0.11.0 でした。

この2つのライブラリはNode-REDが立ち上がってからインストールしても良いのですが、今回必須ということで、イメージの中に組み込んでしまいます。

## Docker イメージのビルド

それでは AE2100 でイメージをビルドしてみます。
上記のDockerfileがあるディレクトリで以下を実行します。

```:AE2100-Shell
# docker build --tag node-red_v1:appf .
  :
Successfully built 3691865b0133
Successfully tagged node-red_v1:appf
```
node-red-node-serialport のC++モジュールのビルドが始まると何やら赤字のログがたくさん出力されますが、"Successfully build..." が出れば大丈夫でしょう。
これで "node-red_v1:appf" のタグ名が付いたイメージができました。
公式のMinimalイメージ194MBに、もろもろ追加されて、計441MBのイメージになりました。。。
しかし 32GB の eMMC を搭載する AE2100 にとってはまだまだ余裕たっぷりです。

# Docker コンテナの実行

コンテナの立ち上げです！
Node-REDにアクセスする1880番ポートとMQTT用の1883番ポートをそのままコンテナで使えるようにします。
AE2100 の RS-485 のデバイスファイルは /dev/ttyRS485 です。これもそのままコンテナで使えるようにします。
そして AE2100 ホストの /home/root/.node-red ディレクトリをコンテナの /data にボリュームマウントして、Node-REDの設定ファイルやフローは AE2100 ホスト側のファイルシステムに保存するようにします。
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

> node-red-docker@1.1.3 start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"

8 Sep 23:27:27 - [info] 

Welcome to Node-RED
===================

8 Sep 23:27:27 - [info] Node-RED version: v1.1.3
8 Sep 23:27:27 - [info] Node.js  version: v10.22.0
8 Sep 23:27:27 - [info] Linux 4.14.67-intel-pk-standard x64 LE
8 Sep 23:27:27 - [info] Loading palette nodes
8 Sep 23:27:29 - [info] Dashboard version 2.23.3 started at /ui
8 Sep 23:27:29 - [info] Settings file  : /data/settings.js
8 Sep 23:27:29 - [info] Context store  : 'default' [module=memory]
8 Sep 23:27:29 - [info] User directory : /data
8 Sep 23:27:29 - [warn] Projects disabled : editorTheme.projects.enabled=false
8 Sep 23:27:29 - [info] Flows file     : /data/flows.json
8 Sep 23:27:29 - [info] Creating new flow file
8 Sep 23:27:29 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

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
```

エラーなしに立ち上がったでしょうか？
Docker コマンドで確認してみますか。

```
# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                             PORTS                                            NAMES
122cd69c5b65        node-red_v1:appf    "npm start --cache /…"   15 seconds ago      Up 14 seconds (health: starting)   0.0.0.0:1880->1880/tcp, 0.0.0.0:1883->1883/tcp   node-red-1
```

実行時 "--name" オプションで指定した "node-red-1" という名前で動作しているようです。

# Node-RED の実行確認

それでは PC のWebブラウザでこの Node-RED に接続してみましょう。
URLは以下のようになります。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/0cedd5a6-4d93-b35a-4f5b-3d5b17874ef8.png)

おなじみのフローエディタが表示されるはずです。

ネットワーク・パレットを見ると、一番下に "**serial in**"、"**serial out**"、"**serial request**" の３つのノードが追加されています。Dockerfile 内に記述した RUN 命令でインストールされた node-red-node-serialport ライブラリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/963a53de-af1d-5e41-3882-5145219dceef.png)

MinimalのイメージでもMQTTやWebSocketのノードがあるのはさすがNode-REDですね。
ローコードIoT開発プラットフォームなので当然ですか。

パレットの一番下 **dashboard** も Dockerfile 内でインストールしたライブラリ **node-red-dashboard** のノード達です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192538/9b295ecd-800d-29b6-481f-70b82480d59d.png)

先に少し説明しましたが、これにより本当に簡単にちょっとしたダッシュボードを作ることができ、デバッグ支援にも使えるし、必須ともいえる外部ライブラリではないでしょうか。

# さいごに
以上で AE2100 ローコードIoT開発プラットフォームの完成です！
Node-RED が立ち上がってしまえば、Node-RED 経験者にはこれ以上説明することはないのですが、せっかくなので、Node-RED 初心者向けにIoTらしい簡単な実践編の記事を書くことにしました。
まずは RS-485シミュレータからセンサーデータを取り込んで、Webブラウザ上の簡易ダッシュボードに表示するアプリを作成します。