Node-REDで、MQTTによるデータ送受信（嫁筋トレシステム）

#概要
　この記事は2020年6月18日にIoTLTでプレゼンしたシステムの技術編です。技術要素を3つの記事に分けて書いています。今回は2つ目のNode-RED編です。

1. [M5Atomを使って、遠隔で嫁が筋トレを応援してくれるシステムを作ってみた](https://qiita.com/kmaepu/items/99150db285712dfc68e5)
2. Node-RED
3. LINE Message

こちらがLTを行ったプレゼンスライドです。
https://speakerdeck.com/maepu/yuan-ge-dejia-nijin-torewoying-yuan-sitemorau

　最近、ストレスのせいか暴飲暴食で太ってしまいました。そこで痩せたいと思い、筋トレを始めました。しかし長続きせずということで、嫁に応援してもらおうと思いました。

　しかしながら、嫁は里帰り出産のため沖縄に...。

　ということで、**遠隔で**嫁が筋トレを応援してくれるシステムを作ってみました！

![簡易的なシステム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/18682e1f-8e4d-e5b9-d593-ecab76d196a1.jpeg)

こちらがのデモです。
https://www.youtube.com/watch?v=ufq9XtmmxMs

#レシピ
##開発環境
 - M5Atom Lite
 - Arduino IDE ver1.8.12
 - Node-RED  ver1.0.4
 - Node.js v10.15.3

##システム構成
　システム構成は次のようになっています。M5Atomのボタンを押したイベントが発生すると、MQTT通信で[Node-RED](https://nodered.jp/)にデータが送られます。MQTT通信をしている間に「[Shiftr.io](https://shiftr.io/)」というものがあります。これはMQTT通信を管理するサーバーです。無料で理想することができます。

　MQTTで送られてきたデータは、Node-REDで作成したフローによりMQTT通信のメッセージからLINE Messageに変換していてます。
　
　LINE botは使用したいグループLINEに招待して使います。筋トレが開始された時と、10回ごと、終了時にメッセージを送ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/09f711d4-1f16-08ac-e4b1-f9062d6de1a7.png)

## Node-RED
　MQTTで受けたメッセージをLINE Messageで送信するには、Node.jsのサーバーが必要となります。今回はコードを書きたくなかったのと、制作期間を短くする目的でビジュアルプログラミングツールの「**[Node-RED](https://nodered.jp/)**」を使用しました。

　Node-REDは処理ブロックをつなげていくことにより、Node.jsの処理を視覚的に作る事ができます。

　今回は次のフローとなっています。使用したノードは次の6種類です

 - injectノード：定型文を出力する。デバッグ用
 - debugノード：デバッグログにメッセージが表示される。デバッグ用
 - MQTT inノード：MQTTでデータをサブスクライブ（受け取る）ノード
 - MQTT outノード：MQTTでデータをパブリッシュ（送信する）ノード。デバッグ用
 - templateノード：入力されたデータを定型フォーマットに当てはめて出力するノード
 - PushMessageノード：LINE Messsaging APIを利用してメッセージ送信するノード。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/2bf516e0-11ce-f9f1-9b11-9d6408e71fce.png)

###injectノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/18fe75bc-25e1-d3ab-93a3-d442ec04e836.png)
ノード左のボタンを押すと、対応した文字列が出力されます。今回はMQTTの疎通を確認するのと、LINEへのメッセージ送信確認用に使用しています。

###MQTT outノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/75efdedf-dd29-929f-7f89-75157ac1b401.png)
このノードも動作確認用に使用しています。injectノードから文字列を受けて、特定のMQTTブローカのトピックへデータを送信します。

設定は特に複雑な事はしておらず、MQTTのサーバー（URL,名前,パスワード)と接続先のトピック名のみです。

トピック名は、筋トレ開始時のメッセージを「**/start**」、終了時のメッセージを「**/end**」にしています。

###MQTT inノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/8f746401-b7e9-16f3-a2be-3725e513ab5a.png)
このノードでMQTTブローカを経由してデータを受取っています。
今回はデータ種類によって異なる処理をするように、3つのトピックを用意してみました。

 - /start　：　筋トレ開始時のデータ
 - /end　：筋トレ終了時のデータ
 - count　：筋トレ中の回数データ

　このノードも特に複雑な設定はしておらず、MQTTブローカとトピックのみです。

###templateノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/768f6fea-f40f-cc23-c9d1-eff984f89a18.png)
このノードは入力されたデータを、定型フォーマットにして出力するノードです。

・MQTT inノード「/start」と接続したtemplateノードの内容：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/bbea5130-1907-4d1c-98f4-0d329378c917.png)

・MQTT inノード「/end」と接続したtemplateノードの内容：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/6bf4e265-f2b4-5784-7044-a126e91a2698.png)

・MQTT inノード「/count」と接続したtemplateノードの内容：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/61256122-3afb-ea4c-ac6b-a97492a3e1a3.png)

###PushMassegノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/60ece3d3-a5dc-7a5e-f340-7807b036628e.png)
このノードで、入力されたデータをLINE botからメッセージ送信するようにしています。

ここには使用するLINE botの情報などを入力します。ここの解説はLINEの説明で行います。

#次回!
LINE MessageとLINE botについて解説します。私はjavascript初心者なので、結構苦労しました(-_-;)