Statusノードを使う
今回は、Statusノードを使ってみます。ヘルプには以下のようなことが書いてあります。
- 同じタブ内のノードのステータスメッセージを取得します
- このノードはpayloadを設定しません
ステータスと言えば、Debugノードの記事で出てきたノードの下部に表示できる短いテキストです。とりあえず、いつも通りサンプルフローを読み込んで動かしてみます。
Statusノードのサンプルフロー
メニューから「読み込み > サンプル > flows > node-red > common > complete > 01 - Handle status message output」を選択してサンプルフローを読み込みます。Injectノードのボタンを選択してフローを実行すると、「Hello World!」のログとstatusプロパティを持つログが1件ずつ出力されます。後者がStatusノードが拾ったイベントをトリガにして出力されたログです。その後、もう一度Injectノードのボタンを選択してみましたが、今度は「Hello World」のログしか出力されません。
フローの設定を確認すると、Injectノードと最初のDebugノードのステータスを拾っているようです。Completeノードと同じようなノリでラインがなくてもノード間が論理的に繋がっているようです。Injectノードにはステータスがないのでログは出力されないのだと思います。
Statusノードが受け取るmsgオブジェクト
Statusノードが受け取るmsgオブジェクトをジッと見つめてみます。冒頭で「Statusノードはpayloadプロパティを設定しない」と書いた通り、「payload」プロパティは見当たりません。一方、「status」プロパティの下に「fill」だの「shape」だの「text」だの「source」だのといくつかプロパティが見えます。ステータスについてはドキュメントに詳しく書いてあります。ステータスに表示するアイコンの色や形状も指定できるんですね。ポップな雰囲気で好感が持てます。なんとなく機器との接続状態をステータスで表現して、状態が変化したらフローを実行するみたいな使い方が想定されてそうな感じがします。
Statusノードがイベントを受け取る条件
先ほど、2回目のInjectノードのボタン選択でStatusノードが実行されなかったのは、恐らくステータスに変化がないためかと思います。フローを少しいじって検証してみます。
以下のようにInjectノードとDebugノードの間にFunctionノードを追加します。
Functionノードでは、payloadの末尾にランダムな数字を付加して、実行するたびに時々payloadが変化させます。
この状態でフローを実行すると、ログは以下のように、status.textの値が変化した時だけStatusノードが実行されていることが確認できます。
まとめ
ラインがなくてもフローが実行できる点でCompleteノードやCatchノードと似ていますが、Statusノードはステータスが変化した時だけ実行できるのが特徴です。イベントドリブンな実装に必須の汎用ノードのオーラを感じます。
コメント
コメントを投稿