ブロックを積みながら(61) Node-RED、変化の有無でフィルタするfilterノード

Joseph Halfmoon

今回はfilterノードです。filterというとついローパスフィルタとか考えてしまう年寄りですが、このノードは違います。データに関してLPFをかけたりする機能は前々回のsmoothノードが持っていました。今回のfilterノードは、条件に当てはまる msg だけを通過させたり、通過させなかったりするもの。

※「ブロックを積みながら」投稿順 index はこちら

まずは今回の実験用のNode-REDフローを掲げます。実は、前回のRandomノードの実験フローを簡素化したもの。Injectノードでフローにトリガをかけ、Randomノードで乱数を発生し、filterノードで条件にあった時だけ乱数を通過させるという段取りです。生の乱数データとfilterを通過した乱数データを別々のDebugノードで監視しています。

flow

各ノードの設定:injectノード

injectノードでは、3秒に1回、msg.payloadに日時を載せて送り出しています。日時そのものを使うわけではなく、後続ノードにトリガをかけるためだけです。

InjectNode

 

各ノードの設定:randomノード

randomノードは msg がやってくる度に、1から10までの乱数を1個生成して、後続ノードに送り出します。ここで日時は捨てられ、乱数に化けるます。

RandomNode

 

各ノードの設定:filterノード

さて本題のfilterノードですが、どのような条件でmsg を通過させるのか「動作」という項目のプルダウンメニューで選択可能です。こんな感じ。

filterNodeAction

今回は、上記のように値が指定の量以上変化したときだけ通す設定としています。このようにすれば、「コマケー変動」は無視、大きく値が動いたときだけ処理するといった動作が可能になります。

指定の方法は以下の画像をご覧ください。ここでは、基準を最後の出力値として、その値から30%以上変動したら msg.payload を通すようにしています。msg.topicにデータ系列の識別符号を載せれば複数のデータ系列毎に処理できるようですが、今回実験ではtopicは使用していないです。

filterNode

実機動作確認

以下で実機(Raspberry Pi 3 model B+)上で動作させたときのDebug出力の様子を貼り付けました。Raw Outputと書かれている方が、Randomノードの出力そのものです。Filtered Outputがfilterノードを通過した msg です。

初回の乱数「8」は、Filterを通過しています。初回は「30%ルール」を満たすみたい。続いて乱数「7」が生成されていますが、これは8に対する7で「30%ルール」を満たさないので捨てられています。続く乱数は「3」です。前回出力の「8」に対して5も変動しているので、これはOK、filter通過。次の乱数は「1」ですが、変動量2は前回出力「3」の66%にあたるのでOKっと。再び乱数「1」が現れます。これは変動量0なので捨てられました。次は「6」。再び大きな変動でfilter通過っと。

Result

まあ予定通りに動いているようなので、良かった。

ブロックを積みながら(60) Node-RED、乱数発生器、randomノード へ戻る

ブロックを積みながら(62) Node-RED、時間経過で引き金を引く、triggerノード へ進む