システムの状態監視において、警告やエラーを効果的に表示することは非常に重要です。何かが正常に動作していない状況をすぐに把握できることに越したことはありません。
今回はNode-REDフロー内で、警告、エラー、ステータスメッセージを視覚的に処理・表示する方法があったのでそれについてまとめてみました。正直、自分も実はこんな使い方も出来たのかという驚き(もしかして常識なの🤔)もありました。ログ以外でも、フロー内のノードにステータスをつけることもできる点はわかりやすいですね。
フローの設定方法
Node-REDでリアルタイム警告・ステータス管理フローを設定するには、主に2つの方法があります。今回は最小パターンでその動きをみることのできるフローを作成してみます。
1. ログ上で警告・エラーをわかりやすく表示する
この方法ではシステムの異常をログにわかりやすい形で記録します。
1-1. ノードの配置
パレットから以下のノードを配置し、図のように接続をします。

- injectノード
- function ノード


1-2. injectノードの設定
このノードが動作のトリガーとなります。 injectノードをダブルクリックしてプロパティの【msg.payload】にエポックからの経過ミリ秒を設定します(他のものでも大丈夫です)。

1-3. functionノードの設定
functionノードのコードでnode.warn関数、node.error関数を設定を入力することで、ログ上で警告とエラーの表示を目立つ形で表示が出来ます。
functionノードをダブルクリックし、【コード】エリアに以下を入力して保存・デプロイを行います。
// 警告メッセージを生成 node.warn("システム警告:" + msg.payload); // エラーメッセージを生成 node.error("システムエラー:" + msg.payload); return msg;

この設定により、Node-REDのデバッグ表示に警告とエラーに色がついた形で表示されます。

色をつけるだけでなく、引数のmsg.payloadの部分に変数の値をいれることでfunctionノード内の変数をわざわざpayloadに入れずに値の表示が行えます。Debugノードではmsgオブジェクトに入れないと表示出来ない点が大きな違いになります。また、こちらであれば表示条件の設定も行え、単一変数の表示もできるので非常にわかりやすくなります。

あと、情報が地味なので見落としがちなのも辛い🥲
2. ノードのステータス表示
こちらの方法では、フローエディタ内のノードのそばにステータスに状態表示をする方法を使用しています。
2-1. ノードの配置
パレットから以下のノードを配置し、図のように接続をします。
- injectノード
- function ノード

2-2. トピック指定用のinjectノードの追加
各injectノードのプロパティを開き、それぞれmsg.topicにerror、warning、clearを設定します。


2-3. ステータス関数ノードの設定
後続にあるfunctionノードをダブルクリックし、【コード】に以下を入力して保存・デプロイを行います。
以下のようなコードを実装します:
// msgのtopicに応じてステータス表示を変更 if (msg.topic === "Error") { node.status({fill:"red", shape:"dot", text:"エラー発生"}); } else if (msg.topic === "Warning") { node.status({fill:"yellow", shape:"ring", text:"警告あり"}); } else if (msg.topic === "Clear") { node.status({}); } return msg;

2-4. node.status()による視覚的フィードバック
実際に動作すると以下のようになります。
エラー表示

警告表示

ステータスのクリア(表示も消せます)

ノードのステータス表示のカスタマイズを行うことで、より状態の視覚フィードバックを強める事ができます。設定は引数にJSONを与えることで行えるようです。
- 色による区別 … 赤(エラー)、黄(警告)など
- 形状による区別 … ドット(重大)、リング(注意)など
- テキストによる補足 … 状態の詳細や発生時刻などを表示
この設定で、フロー上で各ノードの状態が一目で分かるようになります。
おわりに
Node-REDにおけるリアルタイム警告・ステータス管理フローの設定と活用方法にまとめてみました。
このようにすることで、単なる情報程度の表示だけでなく、具体的な問題内容や発生時刻などのコンテキスト情報を含めることで、対応の質が向上できそうです。
個人的にはfunctionノードをあまり使わないようにしていたのですが、このような使い方をすることでデバッグがよりやりやすくなるので、使い所を決めて行うのが良さそうですね。
今回作成したフロー