M5StackのUIFlowとNode-Redの組み合わせが、ノープログラミング/ロープログラミングで便利(MQTT編）

M5StackとNode-Redの組み合わせが便利だったので、記録を残します。
UI-FlowとNode-redを組み合わせると、プログラムを書かずに色々なことができます。
※Node-redもUI-Flowも初心者です。間違いがあったら教えてください。

ここでは、Env II Unitの温度湿度をJSONで渡しPCで表示させる例を記します。

#はじめに
##Node-Redとは
Node.js上で動く、ローコード・ノーコード環境です。GUIで楽しくプログラミングできます。詳しくは https://nodered.jp/ を参照
ここでは、Windowsで書いていますが、多少の変更でmacやRasberryPI、クラウドなど、他の環境でも可能です。インストール＆使い方は 
https://nodered.jp/docs/getting-started/ を参照

##MQTTとは
データを送るための通信プロトコルです。Brokerを介して通信を行います。
特徴としてQoSのコントロールが可能です。0なら届くかどうかをわからないけど送信を1回行います。2は、確実に届けます。というような感じで、重要度を変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e9d2531a-889e-baa4-3520-b1cadedcf1fc.png)
まず、最初に下のような構成で動かしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/a3e94e31-c045-189c-9644-2d4b5a32b654.png)

#Node-redのインストール

##Node.jsのインストール
https://nodejs.org/ja/ からファイルをダウンロードしてインストールします。LTS版が安定していて良いと思います。
ネットワークにPROXYを使用している場合は　https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1 を参考

##Node-redのインストール
スタートメニューから[Node.js]-->[Node.js command prompt]を選択
コマンドプロンプトで　```npm install -g --unsafe-perm node-red``` を実行　
#Node-redの起動
Node.js Command Promptで```node-red```と入力し、起動します。この画面にエラーの詳細とかでますので、たまに見ると良いでしょう。

ブラウザで http://127.0.0.1:1880/ につなぎます。下の画面が出たらOKです。
終了は、コマンドプロンプトの画面でCtrl＋Cです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/73234f50-8db6-9172-e888-1ad2162520e9.png)
#Node-redの準備
MQTTと便利なDashboardを使えるようにしておきます。
右上の横三本線MENUを押し、[パレットの管理]　を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/b29bb803-6c0a-b759-ca78-e2c2e72e5953.png)

[ノードを追加]タブを選択し、node-red-dashboardを追加します。検索にdashを入力したら出てきました。インストールには少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/7fd6e962-4b52-6cb8-e80a-1f6de121a8ef.png)
同様にnode-red-contribute-aedesを追加します。これはmqtt通信の中心になるものです。大規模なものは外部のBrokerを利用した方が良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/9febfc51-3a46-792d-b1a8-bdecbde7bca7.png)
#Node-redのプログラム
##MQTTのBroker
Node-redのプログラムは左からノードを取り出し、繋ぎます。削除はフロー内のノードやつないだ線をクリックしてDELきーを押します。
mqttのブローカーは"aedes Broker"ノード(フローでは"aedes MQTT Broker"と表示)と"debug"(フローでは"msg payload"と表示）ノードを使います。特に設定は必要ありません。（IDやPasswordを使う場合は必要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/0627a754-37af-ead3-c96f-7f434f767139.png)

##UIFlowから受け取る部分のプログラム
Node-redの新しいフローに書いても良いですが、ここでは同じフローに書いています。
UIFlowからはJsonデータをMQTTのTopic”M5”で受信
"mqtt in"ノード（Flowでは今の段階では"mqtt")と"change"ノード(Flowでは"set msg payload")、”debug”ノード(フローでは"msg payload"と表示）を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d5bc3fc4-65a0-829d-ccdb-b68b0c36494f.png)
###mqtt in の設定
フローのノードをダブルクリックで設定できます。
サーバは右の鉛筆マークから新規に設定
サーバを "localhost" (自分のPCに設定）にします。追加で終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/22d0968a-5b81-3dcb-fb86-363c05a2eaab.png)
トピックを"M5"に、出力を"JSONオブジェクト"にします。[完了]を押します。フローの表示がM5になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f609ede1-a53e-4f6e-673c-988e1bc0e3c4.png)

###changeノードの設定
jsonのmsg.payload.tempをpayload.msgに代入します。つまりtempの値のみ取り出して(選択して）msg.payload(出力)とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/4ad7a02a-8c07-c0b2-b130-6d8e00ea061a.png)


##デプロイ
デプロイを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/82f11fb9-58bc-0713-0f38-f707b0dc29cc.png)

#UIFlowのプログラム
UunitsにEnvII Unitを追加します。
ラベルを2個置きます。(label1,label2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/5dacafa1-f8f7-435c-7439-9a424e4629ab.png)
変数TEMPとRHを作って代入した後に表示するプログラムを書いて動作確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/704312cb-f2d5-1eeb-d20a-0553bcd8445a.png)
JSONにするには一旦MAPに書いてそれを出力（DUMP)します。
MapDataとJsonDataという変数を作ります。
CreateMapの中はCreateMapの下の＋を押すと出てきます。キーはTextで”temp”、”rh"とします。キーは小文字にしてください。エラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/66333b39-592a-42d2-0ddd-37700a8c10b7.png)

MQTTの部分を加えます。MQTTのブロックはAdvanceの中にあります。
Setupの下にMQTTのパラメータブロックと"mqtt start"のブロック、Loop内に"publish topic"を加えます。
serverにPCのIPアドレスを入力します。
publish topic "M5" msgを JsonData にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/642fa345-464f-784a-ecea-591a49fe1b2b.png)

慣れると変数を使わなくても、こんな感じでもよくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/497cd229-bf20-1cce-6220-f694b7aa80ca.png)

M5Stackで三角マークを押して実行します。

#動作確認
Node-redの画面に行きデバッグを表示します。すでにM5Stack側は動いているので温度が表示されていたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/aaedbebf-291b-3a04-47e1-db1a0714b6e8.png)

#Node-redのDashBoardを使ってみましょう。
##Flowの作成
dashboardのTextノードを置きchangeノードに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e9fce69b-95f7-b80c-57a6-6c6ad2041ab6.png)
Textノードをダブルクリックしてノードの編集画面にします。
Groupの右の鉛筆をクリックしてグループを作りTEMPとします。タブは”M5Stack　EnvII”にします。　[追加]もしくは[更新]を押して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/808caa3b-43d3-d01b-f996-c85d36036f7c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/aa9c738e-5990-f386-33f7-fa53a779f1da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f4ff000f-fd29-f9fd-cd31-96a6b8b9aba5.png)

Labelを温度にします。[完了]を押して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c3fb083e-6c83-36b2-89ab-4fff53bf59e7.png)

デプロイを押します。
##表示
右上の下三角のボタンを押し[Dashboard]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/8b68f5a6-cc34-7b19-4c15-ee5aa8127427.png)

リンクボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/44bf281d-0133-0745-d725-52b5adddfc14.png)

ブラウザに新しいタブが表示されます。温度がリアルタイムに変わっていくのが判ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/1dfc26ca-3b81-923a-4f2c-baf1fcbf8f6a.png)
##Flowの追加
Chartを追加して、線をつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e529024e-15db-efaf-f8d9-86e49d49360c.png)

Chartをダブルクリックしてノードの編集をします。グループが前のTextと同じになっているのを確認して[完了]を押します。
最大、最小は値が入っていないと自動で設定さるみたいです。便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/8c5819d5-73cf-6f6a-f18f-ff88e43ae1ec.png)
デプロイを押して、先ほどのDashBoardのページに移ると、グラフが追加されていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d02e108f-c0cf-c670-d2b2-0a560ad8820a.png)

配置を変えたいときは、Node-redのDashbordの配置を展開して、ドラッグアンドドロップで移動して、再度デプロイをしたら良いみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/700d7d2a-4086-73e9-db94-fbe9b0255412.png)

##湿度の表示の追加
changeノード、textノード、chartノードをコピーし接続したのちに編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/91bc8b5c-fd01-f840-6a55-b25c3c051d26.png)
textノードは新しいUIグループrhを作りつつ設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/9cbfe82f-0f90-773c-27a1-505f74b32820.png)

Chartノードはグループを選択するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/71fc5f25-cecf-7dc1-32e2-dfb17baa8032.png)

デプロイして確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/3c641051-6848-3082-fa2a-fa7fb496ade0.png)

##mqtt in(M5)からの出力(参考）
mqtt in にDebugをつなぎdebugの設定をmsgオブジェクト全体にすると、メッセージの全体像が見えます。ここでは

```
{"topic":"M5","payload":{"rh":48.41,"temp":25.01},"qos":0,"retain":false,"_topic":"M5","_msgid":"331b627c.316c8e"}
```
となっていました。なのでchangeノードでmsg.payload.temp等の設定でよかったことがわかります。

#同報通知
IoTなどで、警報機をたくさん置きたいときとかは同報通知が出来ると便利ですね。ここでは温度をM5StickC Plusに表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/377c2df8-2e32-f02d-56d2-75b52e2f85d2.png)

##ラベルを置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/bec694f0-78a5-016c-ef01-6c7db01f7379.png)

##コード
mqttのパラメータはPCのIPアドレスに変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/368bcfd6-373e-becc-806e-cf55eed31676.png)

これで受信できます。複数台でも同じなので、簡単に受信機が作れます。

#Node-redからM5StickC Plusへ
M5StickCのテキスト(温度）の色を変えるプログラムを考えてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c908cfc5-6539-2c4f-22a4-b35ca61d7978.png)

##Node-redのプログラム
新しいフローを作ります。
ブローカーはすでにほかのフローで動いているので、不要です。
###ノードの配置
DashBoardのスイッチノードとmqtt outノードを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/849ab404-3d1d-2dd2-3456-9741fbbd9075.png)

###Switchの編集
On Payloadを文字列に変更し"red"にします。Off　Playloadも同様に"blue"に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e09e82a1-f41d-45ba-cfe1-0d1310081e38.png)

###mqtt outの設定
トピックをCOLORにQoSを２に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/201b3873-e500-fb5d-86e5-275ae7d80804.png)

###デプロイ
設定が編集出来たらデプロイします。
##UIFlowのプログラム
右下の部分が追加になります。今回はjsonじゃないので、そのまま文字列で評価できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/023b1f21-ac64-d691-e161-115b90811038.png)

##実行
DASHボードのTEMPの下にスイッチが出来ています。スイッチを動かすとM5StickC Plusの表示色が変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/e1d0c649-1e00-eaf2-7805-6d5d804fe7d7.png)