Filterノードを使う

ここのところずっとNode-REDのサンプルを見ながら各ノードの使い方を確認しています。頭出しの記事はこちらをご確認ください。今回はFilterノードを使ってみます。大量のメッセージを入力して、条件を満たした場合のみメッセージを出力するノードです。大量のデータを発生させる加速度センサーみたいなものを扱うのに使えそうです。

入力値が変化したら出力する

Filterノードには標準のサンプルが提供されていないのでやむを得ず自作します。最初に作ったのはこんな感じのフローです。


Filterノードのプロパティは次のとおりです。
  • 動作は「値が変化したときのみメッセージを中継
  • 対象プロパティは「msg.payload

ここに2つのInjectノードでメッセージを流し込みます。
  • 1つ目は、msg.payloadに「aaa」という文字列を設定したメッセージを1秒に1回繰り返し流す
  • 2つ目は、msg.payloadに「bbb」という文字列を設定したメッセージを単発で流す
デプロイすると、「aaa」のログが1回出力されます。msg.payloadの値が変化したのでメッセージが中継されたようです。その後、Injectノード「bbb」を実行すると、「bbb」のログと「aaa」のログが1件ずつ出力されます。Injectノード「bbb」を選択したことによりmsg.payloadの値が変化したのでメッセージが中継され、その後、Injectノード「aaa」の定期的な動作により再びmsg.payloadの値が変化したので中継されたようです。Filterノードのヘルプではこの設定のことを「RBEモード(Report by Exception)」と表現しているようです。


ちなみに、Filterノードの動作で「値が変化したときのみメッセージを中継(初期値を無視)」を選択すると、デプロイ時の「aaa」が出力されなくなります。フローリセット時に値が変化しないものとしてFilterノードの動作を抑制するのに利用できそうです。

入力値が指定した値を超えて変化したら出力する

続いて、入力値が指定した値を超えて変化したらメッセージを出力する動作を確認するために以下のようなフローを作成しました。


ポイントは以下の点です。
  • Filterノードの動作が「最後の出力値と比較して10%以上変化したらメッセージを中継する
  • Injectノードはmsg.payloadに数値「100」を繰り返し流し、手動で数値「120」を流せるようにする(しきい値以上変化する)


実行すると、以下のようになログが出力されます。最後に入力した値と比較して10%以上変化していたらメッセージを転送します。ちなみにFilterノードのヘルプではこのモードのことを「不感帯モード」と表現しているようです。


入力値が指定した値を超えて変化したら無視する

最後にご紹介するのは、入力値が指定した値を超えて変化したら無視する動作です。Filterノードのヘルプでは「狭帯域モード」と呼んでいます。要は、指定した値を超えたら異常値とみなして無視します。


フローを実行すると以下の挙動になります。
  • デプロイして放置すると1秒毎に「100」のログが出力され続けます
  • Injectノード「120」を何度選択しても「120」のログは出力されません
これは設定した値10%を超えて変化したものは無視する設定になっているためです。これ以上の説明は不要かと思います。

まとめ

ここまで確認したことをまとめます。
  • RBEモードではFilterノードに対する入力値が変化したらメッセージを転送します
    • 値が変化しなかったら無視(Filter)します
  • 不感帯モードではFilterノードに対する入力値が指定した値を超えて変化したらメッセージを転送します
    • 範囲内に収まっているものは無視(Filter)します
  • 狭帯域モードではFilterノードに対する入力値が指定した値の範囲内ならメッセージを転送します
    • 範囲を超えたものは無視(Filter)します
Filterノードについては以上です。

コメント

このブログの人気の投稿

Execノードを使う

Joinノードを使う(その4)

SendGridのX-SMTPAPIヘッダの使い方(Section Tags、Substitution Tags編)