Filterノードを使う
ここのところずっとNode-REDのサンプルを見ながら各ノードの使い方を確認しています。頭出しの記事はこちらをご確認ください。今回はFilterノードを使ってみます。大量のメッセージを入力して、条件を満たした場合のみメッセージを出力するノードです。大量のデータを発生させる加速度センサーみたいなものを扱うのに使えそうです。
入力値が変化したら出力する
Filterノードには標準のサンプルが提供されていないのでやむを得ず自作します。最初に作ったのはこんな感じのフローです。
Filterノードのプロパティは次のとおりです。
- 動作は「値が変化したときのみメッセージを中継」
- 対象プロパティは「msg.payload」
- 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ノードの動作が「最後の出力値と比較して10%以上変化したらメッセージを中継する」
- Injectノードはmsg.payloadに数値「100」を繰り返し流し、手動で数値「120」を流せるようにする(しきい値以上変化する)
まとめ
ここまで確認したことをまとめます。
- RBEモードではFilterノードに対する入力値が変化したらメッセージを転送します
- 値が変化しなかったら無視(Filter)します
- 不感帯モードではFilterノードに対する入力値が指定した値を超えて変化したらメッセージを転送します
- 範囲内に収まっているものは無視(Filter)します
- 狭帯域モードではFilterノードに対する入力値が指定した値の範囲内ならメッセージを転送します
- 範囲を超えたものは無視(Filter)します
Filterノードについては以上です。
コメント
コメントを投稿