Node-REDでできること part1 (基本機能編)


# はじめに
## やりたいこと
* Node-REDでどんなことがどこまでできるのかを調べる
* part1(基本機能編)では、基本的な機能とその確認を調べました
    * 下記の先人の方のQiita記事ですでにまとまっているので、この確認レベルです

## Node-REDのまとめ記事
* [Node-RED系の記事のまとめ](https://qiita.com/kazutxt/items/8c72448eefcba56dabef)

## 参考にさせて頂いた記事
* [Node-RED超入門](https://qiita.com/makaishi2/items/5c7b1b6a72b6938cf3d2)
    * 画面の構成や基本的な操作がまとめられています
* [Node-REDのノードまとめ](https://qiita.com/k4h4shi/items/3a9d1d9286555ccdb77a)
    * 組み込みノードを中心に、よく使うノードが1つずつ丁寧に解説されています

## 最低限の情報
* まずは、参考記事を読まれることを推奨します
* Node-REDはNode.jsで作られたフローベースのリアクティブな開発、実行環境です
* ノードと呼ばれるものを配置、結線することで実現する
    * 入力ノード：フローの起点で、入力端子がなく出力端子だけがある
    * 出力ノード：フローの終点で、出力端子がなく入力端子だけがある
    * 機能ノード：フローの中点で、入力端子と出力端子を持つ
* データ構造は基本的に自由だが、msgオブジェクトが汎用的に使われmsg.payloadが入出力のデフォルト値になっている
* フローはコピーやJSONへの書き出しができるが、認証情報は複製されない

## 動作環境
* OS : CentOS Linux release 7.5.1804 (Core)
* Node-RED : v0.19.5
* docker : 18.09.1
    * Node-REDイメージ : nodere/node-red-docker (IMAGE ID/d4f07b39b24d)
    * Dockerを使いますが、ホストに立てても大丈夫かと思います。

## 免責事項
* 検証をして確実と思われる情報を載せておりますが、誤っている可能性もゼロではないので、参考程度にご利用ください
* 本来はコードと実行結果のコンソールログも載せるべきなのですが、数と量が多いので、一旦は画面イメージまでとさせてください。

# 調査結果
## 同時並行アクセス
**調べたこと**

* ノードが次の状態に移った際に入力が受け取れるか確認する
    * 状態がNode-REDで1つだと開始状態に戻したりキューが必要になるので、どのようにふるまうか確認
    * 問題なく、複数の処理を同時に行えることが確認できた
        * リアクティブにストリーム/フローとして動作する
* 複数に出力が分かれた場合に、同時に処理が行えるのか
    * 問題なく、複数の後続ノードの処理に移れた

**画面イメージ**
![pic1.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/32a3bd10-54eb-eb0c-a206-e34a05c1a621.jpeg)


## 条件分岐
**調べたこと**

* 条件分岐ノードがどのような条件を記載できるのか確認する
    * プロパティのtrue/false、大小、null,空,型比較,文字列が含まれているかなど様々な条件が使える
    * 条件同士のAND/OR結合もできる

**画面イメージ**
![p2.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/3df9b64e-e513-c783-8e20-1c324267bbc5.jpeg)

## サブフロー化
**調べたこと**

* サブフローの定義によって部分的なフローをモジュール化できるか確認する
    * モジュール化できると再利用性や独立性が高まるので重要
    * サブフロー側で入力と出力のポートの数を指定し、呼び出す側で配置を結線すれば利用できる

**画面イメージ**
![p3.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/808ee441-3f25-77d4-5fa2-93b134724a26.jpeg)

![pic12.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/33e90b15-5e0d-67e4-deda-b64a560c7fe9.jpeg)

## エラー検知/状態変更検知
**調べたこと**

* 同じフロー内にあるノードでエラー発生時/状態変更時にイベントを発行するノードがあるので、どのように振舞うか確認する
    * 設定をしていないメールを送信しようとして意図的なエラー/状態変更を起こす
    * 以下のデバッグメッセージが出力された
        1. エラーメッセージ(catchノード)
        2. メール送信中の状態変更(statusノード)
        3. メール送信失敗の状態変更(statusノード)


**画面イメージ**
![p4.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/31ec08a1-1fc8-c5b7-7c22-ae8f9ef183ba.jpeg)


## http通信
**調べたこと**

* http通信でデータをNode-REDに渡すことができるか。アクセスしたブラウザの画面に意図した情報を表示できるか確認する
    * どちらも問題なくできた
    * また、WebSocketについても動作を確認できた(イメージ画像にはないですが)

**画面イメージ**
![p5.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/eee8cace-791e-fc98-242a-0189f09f4cb3.jpeg)

## データの加工
**調べたこと**

* 機能ノードにはどのようなものがあり、どんな加工ができるかを確認する
    * 網羅的なノードの種類は、Webサイトや書籍の各所でまとめられているのでそちらを参照されたい
    * 組み込みノードだけでもよくつかわれる、置換、分割、統合、遅延、ソートなどいろいろできる

**画面イメージ**
![p6.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/0e0f2133-c0bf-2600-a04e-324910b0eaca.jpeg)


## ファイル
**調べたこと**

* ファイルアクセスができるか確認する
    * パスやアクセス権限が適切になっていることが前提
    * windowsでも動作を確認
    * watchノードでファイルの変更を監視することもできる


**画面イメージ**
![p7.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/0289c356-8743-0b17-ec5a-d8cbf92e15a0.jpeg)


## コマンド
**調べたこと**

* コマンド実行ができるのか確認する
    * Linux/windowsともに問題なく動作する
    * どのシェル/環境が使われるのかまでは調べ切れていない
        * 引数をパラメタで引き渡すことは可能
    * 3つある出力は、標準出力、標準エラー、戻り値

**画面イメージ**
![p8.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/500e93d7-323d-f451-a8fa-cda13fac6e6f.jpeg)



## メール
**調べたこと**

* gmail/キャリアメールにメールを送る/受け取るができるか確認する
    * 問題なくできる
    * msgの特定のフィールドに指定することで、件名/from/cc/bccが指定できる
    
**画面イメージ**
![pic11.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/aa136d97-ad14-269b-8ffe-823f1f202bb4.jpeg)

## twitter

* デフォルトで連携できるノードがあるが、開発者用アカウントが必要なため、検証できていません    


## ループ
**調べたこと**

* ループを既存ノードの組み合わせで実現可能との記事があったので確認する
    * ループ専用のノードはないが、functionノードを使い記述可能
    * 結線がクロスしてしまうがやむおえない？
    
**画面イメージ**
![p10.jpg](https://qiita-image-store.s3.amazonaws.com/0/259228/53892d85-c8bd-e9cb-3696-0733888ac469.jpeg)