Node-REDのいろはの「ろ」ぐらい

## 概要
Node-REDのいろはの「い」ではなく、一歩進んだ「ろ」ぐらいのTIPS集です。
2年使っててよくやること、わかったことなどをまとめます。

## 全体
### サブフロー使おう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/fb8df144-54c7-43f5-1013-94aa78b7fd84.png)
こんなフローがあります。rangeノードとchangeノードで同じ処理をしています。
そんな時はサブフローでまとめましょう！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/d2b48788-ba8e-a759-6ecb-c3d682face9e.png)

サブフロー編集画面が以下です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/782f628f-656a-b404-b017-affc27371d9f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/58fa2b12-5650-0a92-6488-a8225099884b.png)で、名前付けや説明を追加することができます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/25cd4dab-40b7-970c-89da-7eeedff05bb0.png)
スッキリしました！:relaxed:

### フローJSONの生成
先に描画画面に配置したものがフローJSONの若いindexに定義されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/4d478299-e896-7963-b7f5-7f724fa25c15.png)


```json:debug→injectの順で配置
[{"id":"cee6288a.8f99d8","type":"debug","z":"de2a3447.b97b98","name":"","active":true,"console":"false","complete":"false","x":250,"y":40,"wires":[]},{"id":"2e2a2c49.944634","type":"inject","z":"de2a3447.b97b98","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":100,"y":40,"wires":[["cee6288a.8f99d8"]]}]
```

```json:inject→debugの順で配置
[{"id":"f1c7601e.828ec","type":"inject","z":"de2a3447.b97b98","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":120,"y":60,"wires":[["1ca019c1.3e96a6"]]},{"id":"1ca019c1.3e96a6","type":"debug","z":"de2a3447.b97b98","name":"","active":true,"console":"false","complete":"false","x":280,"y":60,"wires":[]}]
```

### ノードの実行順

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/6d4559fc-e866-c75e-f285-bc1d1f04bb96.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/51670d1f-438e-44b5-665c-a24e67d486fd.png)

基本的な処理の順番はnodeで定義されているwires配列のindexの若い順に処理が動きます。
上記のchangeノードのwiresは以下のようになっています。
`"wires":[["26b8f0c9.a1ae9","d243756e.d23ac8","78842299.6984fc"]]`
それぞれA1、B1、C1のIDです。配置順によってこの配列順は生成されます。

次のノードの処理をして、さらに次のノードの処理をして、wiresが空白になると元の配列の次の処理が動きます。
途中で処理を待つノードがあると、後続のノードが動きます。

### ノードをきれいに配置しよう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/a7dcb53a-24fa-b2fe-db03-082a7b122f14.png)
ちょっとがたがたしてます:thinking:
折角のフロープログラミングなので、きれいに見せたいものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/67f7dd8c-4c64-c87b-f64b-2e3fe3629b98.png)
`グリッド表示`、`処理ノードの配置を補助`にチェックをいれることで悩みは解決です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/5a6312ab-62ef-46ad-a4a9-7287367c5f5e.png)
きれー:relaxed:


## 標準ノード
### expressionでいい感じにjsonを操作する
expressionは[JSONata](http://jsonata.org/)を使用しています。
ChangeノードとSwitchノードに追加され、Functionノードをを使わなくても簡単なmsg整形が可能になりました。
例えば、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/a682aa20-f8fc-c09c-9497-0b52028c4575.png)
changeノードで、familyNameとfirstNameをセットし、functionで以下のようにしてNameを作ってます。

```javascript:name
msg.payload = msg.firstName + ' ' + msg.familyName;
return msg;
```
expressionを使うとこの処理がchangeノード内で可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/f3fccbaf-0049-8dab-caa8-3c79d85f8e10.png)

`msg.*.address`のようにワイルドカードの使用ができたり、配列の結合やキーの検索ができるfunctionsも用意されています。
書くとキリがないので、別途記事書きたいです。

ちなみに、Node-RED User Group JapanでJSONataに関するLTをしました。
使用したスライドが以下です:sunny:
[![thumbnail](http://image.slidesharecdn.com/node-redjsonatafunction-170327161501/95/slide-1-1024.jpg)](https://www.slideshare.net/kazuhiroharada2/node-redjso-natafunction)

### ループフロー
デザインパターンとして紹介。
8の字になるので、ぱっと見でもループしてるように見えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/68923afb-3455-7851-6cc9-8c487af306c5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/d9526101-e5b0-d478-d404-8e2316ff5aa8.png)で`msg.i++`していて、![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/a25c41ff-8ad6-826e-0e2b-ae72d219d5e8.png)で`msg.i`が10以下ならループするようにしています。

### commentノードでフローの可読性を上げる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/3278030f-bfba-1305-1103-101d97b5e99f.png)
ごちゃごちゃしたフローのとき、コメントノードを境界線のように使うのもありじゃないでそうか。

## 拡張ノード
### ダミーデータを作りたいときは「data genarator」
[node-red-node-data-generator](https://www.npmjs.com/package/node-red-node-data-generator)がなかなか使えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/8eb7eb54-d9ce-7b1d-b3ed-b91a20e7ee7b.png)
こんな感じでプロパティをセットすると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132212/046cba43-6072-a2cf-e62d-82c4806c1cb7.png)
ランダムでデータを生成します。
詳しくはnpmページをご覧ください。