【Node-RED編】赤ちゃん部屋の環境観測システム

#概要
この記事は[Node-RED Advent Calendar 2020](https://qiita.com/advent-calendar/2020/node-red)に投稿した記事です。

今回はNode-RED編と称しまして、[赤ちゃん部屋の環境測定システムを作ってみた](https://qiita.com/kmaepu/items/ebd5181aa5155ba86e54)シリーズの記事を書きました。

Node-REDとはサーバで行うサービス連携やIoTのデータ収集を、ビジュアルプログラミングで行うツールです。詳しくは[こちら](https://nodered.jp/)をご参照ください。

＜記事一覧＞
 - [【企画編】赤ちゃん部屋の環境測定システムを作ってみた](https://qiita.com/kmaepu/items/ebd5181aa5155ba86e54) 
 - 【M5StickC編】赤ちゃん部屋の環境観測システム
 - **【Node-RED編】赤ちゃん部屋の環境観測システム**
 - 【LINE Notify編】赤ちゃん部屋の環境観測システム

#何をつくったの？
タイトルの通りですが、赤ちゃんが過ごす部屋の室温と湿度を測定し、グラフで見える化と、LINEに現在の室温と湿度を通知するシステムを作りました。

イメージは次の図のように、外出していても環境情報がわかるシステムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/5fdb6603-0c1f-7d39-24c4-78933878b568.png)

#システム構成

主に行っていることは次の4項目です。今回は項目(2)について解説します。

(1) [M5StickC](https://www.switch-science.com/catalog/6350/) + [ENV HAT](https://www.switch-science.com/catalog/6559/)で気温と湿度、気圧を取得。
**(2) [enebular](https://www.enebular.com/ja/) 上の [Node-RED](https://nodered.jp/)で、データの加工と各種サービス連携。**
(3) [Ambient](https://ambidata.io/)でデータの蓄積とグラフ化
(4) [LINE Notify](https://notify-bot.line.me/ja/)で環境情報をスマホに通知！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/f22e5e89-2d9f-d5ca-4861-027fc77ed5c2.png)

#Node-RED編　技術解説

[Node-RED](https://nodered.jp/)の実行環境は日頃愛用している[enebular](https://www.enebular.com/ja/)を利用しました！（なんといっても、わざわざPCにNode-REDをインストールしなくていいのが便利です！）

今回作成したでは、**環境データをMQTTで受け取り、AmbientとLINE NotiFyに送っています。**

フローの全体は次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/b9d8459e-8ac4-a981-7007-e32120f3d326.png)

使用しているノードは次の8種類です。
 - (1)MQTT inノード ：MQTT通信によりデータをサブスクライブします。
 - (2)CSVノード ：CSV形式で入力されたデータをjavascriptオブジェクトの形式に変換しています。
 - (3)functionノード ：室温と湿度データをAmbientに送信するためのデータフォーマットに加工しています。
 - (4)Ambientノード ：Ambientにデータを送信します。
 - (5)delayノード ：以降のフローに流れるデータの量を制限しています。
 - (6)templateノード ：LINE Notifyに通知するメッセージを作成しています。
 - (7)LINE Notifyノード ：入力されたメッセージをLINE Notifyに送信します。
 - (8)debugノード ：デバッグ用です。

##(1)MQTT inノード
 MQTT通信によりデータをサブスクライブします。MQTTにはブローカが必要で、今回は[shiftr.io](https://next.shiftr.io/)を使用しています。最近、レガシー版からnext版（課金版）に変わる節のようで、私はまだレガシー版を利用しています。Next版の利用は[こちら](https://qiita.com/youtoy/items/8cbc9e6fa1cd46ca2c3c)の記事が参考になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c1f8389b-a7d1-d636-c53c-5d5e8fc7f1e3.png)


設定は次の通りです。トピックを「/baby」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/e55831c5-718d-2fc6-08e0-e491dd0318eb.png)
##(2)CSVノード
 CSV形式で入力されたデータをjavascriptオブジェクトの形式に変換しています。
このノードは特に何も設定していないです。

変換前と変換後のデータは次のようになります。

```
【変換前】
"123.3, 456.6, 789.9"

【変換後】
{col1:123.3, col2:456.6, col3:789.9}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/aa2fe7b3-3e8b-6222-045a-3cce9a07ab58.png)

##(3)functionノード
 室温と湿度データをAmbientに送信するためのデータフォーマットに加工しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/9b36545f-45e7-4f37-9c33-6afa686c53c0.png)

functionノードのコードは次の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/84b75221-82f3-75c7-7125-18e038d24e5e.png)

Ambientが認識するデータフォーマットは次のようなd1,d2の名前が付いたJSONデータです。

```json
{"d1":データ1, "d2":データ2}
```

##(4)Ambientノード
 [Ambient](https://ambidata.io/)にデータを送信します。Ambientノードはパレットの管理から追加しておきましょう。Node-REDでAmbientの使い方は[こちら](https://ambidata.io/samples/dataprocess/node-red/)が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/c08db241-59d7-3256-9333-6c5a70846ec0.png)

Ambientノードには、認証のためのチャンネルIDとWrite Keyを入力します。（先にAmbientのプロジェクトを作成しておきましょう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/316e5c35-cd07-1631-f255-0dab92932841.png)

##(5)delayノード
　以降のフローに流れるデータの量を制限しています。毎秒データが送られてくるサンプルなので、LINEに毎秒通知が来ると嫌なので追加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/723493dc-7bae-a7b9-de8d-d383f51ed439.png)

設定は次の通り。delayノードの使い方がイマイチ分かっていないのですが、「**入力されたデータは10秒間に1つに分散する、途中のデータは破棄する。**」というイメージでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/46e3f381-5133-7707-3f41-23e98e1a10bf.png)

##(6)templateノード
 LINE Notifyに通知するメッセージを作成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/4bb579c2-dae3-7c98-f7fc-a82eee3f1d15.png)

設定は次の通りです。この形式でLINE Notifyに通知されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/3aa71443-b3db-f0cb-fc42-2c0dbf2a4837.png)

##(7)LINE Notifyノード
　入力されたメッセージをLINE Notifyに送信します。利用するには次のノードをパレットの管理からインストールします。

```
node-red-contrib-line-notify
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/97b5c176-aee2-9086-49ba-968fa83cb12f.png)

LINE Notifyノードでは特に設定はしておらず、LINE Notifyを利用するためのアクセストークンのみ設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/9aa731d4-ebb6-c387-734d-77b071ba440d.png)

#おわりに
バックエンドを手軽に爆速に作りたいと思ったら、enebular × Node-REDが自分なりのフレームワークになりつつあります。

Node-REDで使用できるノードはたくさんあり、様々なサービスを連携することが可能です。以降のアドベントカレンダーも楽しみですね！