Node-REDのGit機能を学ぶ(2) フローの切り替え

　本記事は「Node-REDのGit機能を学ぶハンズオン(第1回)」で紹介した内容です。

https://www.youtube.com/watch?v=qAcZcObgWAY&t=1090

　[前回の記事](https://qiita.com/kazuhitoyokoi/items/56ee43658f287f80156c)では下の図を用いて、Node-REDのGit機能の概要を紹介しました。

 ![Screenshot 2024-02-25 at 20.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/143c8032-eb97-037e-3605-9b555ce4919d.png)
 
本記事では、Node-REDのGit機能のうち赤色でハイライトした「フローを切り替える機能」を紹介します。はじめに概要の記事で紹介したフロー開発での問題をもう少し深掘りして解説します。

# フロー開発での問題
### [問題1] グローバル変数の衝突
 Node-REDは、複数のノードの間で値を共有できるコンテキスト機能を備えています。これは一般的なプログラミング言語ではグローバル変数と呼ばれる機能です。このコンテキストを利用する際、フロー開発者は変数名が重複しないよう、慎重に変数名を割り当てるでしょう。しかし、多数のフローが存在する場合、変数名の管理が難しくなります。もし変数名が衝突した場合、フローは予期しない動作をすることがあります。

### [問題2] HTTPエンドポイント同士の衝突
　Node-REDは、REST APIの開発でよく使われます。URLのパスは短めにしがちのため、多くのフロー開発者がエンドポイントの開発に関わると、パスが衝突することがあります。もし衝突した場合、アクセスすると、1つのエンドポイントのフローのみが使われます。別のフローを開発した開発者は、自分のフローが実行されない理由を調査するのに多くの時間を要してしまうでしょう。

### [問題3] ダッシュボードに多くのユーザインターフェイスが混在
　Node-REDダッシュボードにも競合の問題があります。ダッシュボード画面は1つのURLからアクセスするため、異なるアプリのユーザインターフェイスが1つのダッシュボードに存在している状況が発生することがあります。この場合、アプリの目的ごとに異なるフローを開発する必要があります。

　フロー開発者は、Git機能のフローを切り替える機能を利用することで、これらの問題を解決できます。また1つのNode-RED環境上でさまざまなフローを並行して開発できるのも利点の一つです。

　ここからフローを切り替える手順を「PCバッテリの電力可視化ダッシュボード」と「PCのCPU利用情報ダッシュボード」の2つのダッシュボードアプリの例を用いて説明します。本説明の動作環境は、バッテリが搭載されたWindowsとmacOSのノートPCを対象としています。

# 1つ目のフローを作成
　前回記事の手順でGit機能を有効にした後、ブラウザから「[http://localhost:1880](http://localhost:1880)」にアクセスしてフローエディタを開くと、以下の様なGit機能のダイアログが表示されます。

![Screenshot 2024-02-25 at 15.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/dca42e3d-b723-1d8f-965b-c1d5a50ddd23.png)

　このダイアログ上にある「プロジェクトの作成」ボタンをクリックします。

### バージョン管理クライアントの設定
　次のダイアログでは、誰がフローを変更したかを識別するために使用されるフロー開発者の名前とメールアドレスを入力します。

![Screenshot 2024-02-25 at 15.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/54248b99-2d00-197f-3203-1ae056a8e7db.png)

### プロジェクトの作成
　次のダイアログ画面では、次の様にフローの情報を入力します。
 
![Screenshot 2024-02-25 at 15.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/d4e81e7b-5eaf-f751-a690-47d180366c24.png)

- プロジェクト名
開発するアプリケーションの名前です。Gitリポジトリ名となるため、名前は小文字か数字で記載し、区切り文字はハイフン「-」を用いるのが一般的です。ここではフロー名として「power-monitoring」と入力しました。

- 説明
フローの説明を入力するための任意の入力欄です。日本語も使えるため「電力可視化ダッシュボード」と入力しました。

### プロジェクト関連ファイルの作成
　次の画面では、フローファイル名を指定します。

![Screenshot 2024-02-25 at 14.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/6a567f7c-a2f3-3690-e8f5-29f78d44f3ac.png)

　デフォルトの「flows.json」のままにしておきます。

### 認証情報ファイルの暗号化設定
　次の画面は、フローのクレデンシャルを暗号化するかどうかを選択する設定です。

![Screenshot 2024-02-25 at 15.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/5b1844da-d7ca-82f8-0e96-8f92f32b0fbb.png)

　GitHubにフローを共有する際は、プライベートリポジトリの利用を推奨しています。リポジトリのアクセス制御はGitHubに任せるため、「暗号化を無効にする」のラジオボタンを選択します。

![Screenshot 2024-02-25 at 15.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/b9bd50a4-9e6e-2e3d-33a7-82c7cfad53af.png)

最後に「最初のプロジェクトの作成が完了しました!」というダイアログが出ます。「完了」ボタンを押すとワークスペースが表示されます(もし、Git機能を有効化する前に既にフローが存在していた場合は、フローが引き継がれているはずです。Git機能を無効にするとフローを復旧できるため、不要な場合はフローを削除しても問題ありません)。

# ダッシュボードノードのインストール
　本フローでは、データの可視化を行うNode-REDダッシュボードを利用します。まず、フローエディタ右上のメニューから「パレットの管理」を選択します。
 
![Screenshot 2024-02-25 at 15.26.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/a3c3f9ca-10a7-6a63-ecb2-4568f355ca3e.png)

 その後「ノードを追加」タブを開き、検索欄に「@flowfuse/node-red-dashboard」と入力し、ダッシュボードノードをインストールします。

![Screenshot 2024-02-25 at 15.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/94e12af4-4806-3ca3-e72e-b893f7fbee91.png)

下記ダイアログでは「追加」ボタンをクリックします。

![Screenshot 2024-02-25 at 15.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/61984ed0-9c51-7247-a701-caad588b48c3.png)

　また、システム情報を取得できるWMIノードを利用するため「node-red-contrib-wmi」も同じ方法でインストールします。

![Screenshot 2024-02-25 at 18.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/47f59d8a-cfef-9834-ef8e-e99dde997793.png)

# 電力可視化ダッシュボードのフローを読み込み
　次に「バッテリ電圧の時系列データ」をダッシュボードに表示するフローを読み込みましょう。フローエディタ右上のメニューから「読み込み」を選択します。

 ![Screenshot 2024-02-25 at 18.34.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/1beed697-aff1-6f35-6ab7-780749799410.png)

 すると「フローを読み込み」ダイアログが表示されます。

![Screenshot 2024-02-25 at 18.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c26544cd-19e3-d045-70ef-3454be19940e.png)

　このダイアログの「サンプル」タブ内に、node-red-contrib-wmiというフォルダがあり、その中にWMIノードのサンプルフローが表示されているはずです。このサンプルの中から「電力可視化ダッシュボード」を読み込み、フローをデプロイします。

![Screenshot 2024-02-25 at 17.56.48 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/b4e9638c-bf92-9157-92dc-3c8bbf161d86.png)

　このフローでは、左上の「10秒毎に定期実行」という名前のinjectノードがフローを定期実行しています。赤い「バッテリ情報取得」という名前を持つWMIノードは、injectノードからメッセージを受信するとPCのシステム情報を問い合わせ、バッテリ情報を取得します。このWMIノードはバッテリ関連の情報をメッセージとして次のノードに渡します。この中からバッテリ電圧の値のみに絞り込むため、黄色の「電圧値を代入」という名前のchangeノードを用いています。最後に「電圧(mv)」という名前のchartノードがバッテリ電圧の値を、ダッシュボード上に時系列グラフとして出力します。

# 電力可視化ダッシュボードの画面を表示
　ダッシュボードの画面を開くために、右側のダッシュボード2.0タブ内の「ダッシュボードを開く」ボタンをクリックします。ダッシュボード2.0のタブがない場合は、右端にある逆三角のボタンをクリックすると表示されます。

 ![Screenshot 2024-02-25 at 18.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/6c274973-9752-8828-3f94-dfd58685d3e8.png)

 すると次の様な時系列グラフが表示されます。時間が経過したり、ACアダプタを抜き差ししたりすると、電圧の変化が見られるでしょう。

![Screenshot 2024-02-25 at 15.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/db1675af-75c6-4a86-5a29-d1049d0dc36c.png)

# 2つ目のフローを作成
　次に、ダッシュボードにPCのCPUの使用状況を表示する別のフローを作成しましょう。新規にフローを作成したい場合、フローエディタ右上のメニューにある「プロジェクト」から「新規」を選択します。

![Screenshot 2024-02-25 at 18.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c72389a7-da4b-5037-1282-e33b28d2fbdd.png)

　すると「プロジェクトを作成」のダイアログが表示されるでしょう。

![Screenshot 2024-02-25 at 18.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/c239816d-d3aa-7ed3-1696-0d142cc43d01.png)

　このダイアログに、スクリーンショットの様に情報を入力して「プロジェクトを作成」ボタンをクリックします。すると、空の新しいワークスペースが表示されます。
 
 ![Screenshot 2024-02-25 at 18.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/9fa89d55-d76c-282f-1867-4ef5f404fd0b.png)

 ここに「フローを読み込み」ダイアログのWMIノードのサンプルから「PC使用状況ダッシュボード」のフローを読み込みます。

![Screenshot 2024-02-25 at 18.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/3d7868e9-5216-cee6-88b4-5ae7b2bb982e.png)
 
すると、以下の様な前とほぼ同じフローが表示されます。

![Screenshot 2024-02-25 at 17.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/272d49ca-8563-d47e-7dc8-a50b4c20634b.png)

　このフローでは、赤の「CPU情報取得」という名前のWMIノードがCPU関連の情報を取得する様になっています。黄色の「CPU使用率を代入」という名前のchangeノードがCPUの使用率のみに絞り込んだ後、「CPU使用率」という名前のgaugeノードが次の様なグラフで値をダッシュボードに表示します。
 
# PC使用状況ダッシュボードの画面を表示
ダッシュボードを表示すると次のように、CPU負荷によって値が変化する様子を観察できるでしょう。

![Screenshot 2024-02-25 at 16.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/98d19884-593c-6ae3-c9e2-ae78b8322ded.png)

　もし、サンプルとして読み込んだ2つのフローが同じワークスペースに存在すると、バッテリ電圧値の時系列グラフと、このCPU利用率のグラフの両方が同じダッシュボード画面に表示されてしまいます。

![Screenshot 2024-02-25 at 17.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/53f23767-87f8-2611-527e-606d9218257b.png)
 
　これらのアプリは利用目的が異なっており、各ダッシュボードを適切なユーザに表示するため、今回の様にフローを分けて開発する必要があります。

# 元のフローに戻る方法
 前のフローを開きたい場合は、まずプロジェクトのメニューから「開く」を選択します。

![Screenshot 2024-02-25 at 19.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/60613910-6893-c928-47be-ea27bd6dd18b.png)

　現れたダイアログには、Node-REDが管理している全てのフローが一覧表示されます。

 ![Screenshot 2024-02-25 at 19.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287766/2ead3c1f-3772-a858-6f1c-a143bdd40fa9.png)
 
 最初に作成した「power-monitoring」を選択すると前のフローに戻ることができます。
　紹介した「フローを切り替える機能」を活用することで、フロー開発者は異なるフローの干渉を受けることなく、別々のフローとして並行して開発できる様になるでしょう。

[次の記事](https://qiita.com/kazuhitoyokoi/items/cd80a8b7f1fd1596f13a)では「フローの変更履歴の管理」について解説します。