ブロックを積みながら(40) Node-RED、配列をSplitして、Switchで仕分け

Joseph Halfmoon

前回はSwitchノードを使って「仕分け」をやってみましたが、Sequence rulesによる仕分けというものは出来ませんでした。今回はSplitノードを使って配列要素をSequenceとして並べ、それをSwitchノードで仕分けてみたいと思います。まさにベルトコンベアで流れてくる箱を行き先別に仕分けるイメージ。

今回のフローを先頭のアイキャッチ画像に掲げました。

  1. Injectノードで、配列(Array)をInjectする
  2. Splitノードで、配列を要素毎に分解して、一連のSequenceとして送り出す。
  3. Switchノードで、連続して到着するSequenceを、先頭、途中、末尾に仕分けてそれぞれの行き先に送り出す。
Injectノード

Injectノードでは、msg.payloadに数値を3要素(べたな数値で1,2,3)含む配列を載せて送り出しています。こんな感じ。

inject_Array

Splitノード

後続のSplitノードでは、3要素の配列を「固定長1」要素毎に分割し、Sequenceとしています。

split_Array上記で分かるとおり、Splitノードは到来する配列を分割する以外にも文字列を分割したり、key/valueペア事に分割したりと、なんでも細切れのシーケンスにしてしまう作用を持つようです。

この逆の作用を持つノードとして Joinノードがあるので、これは次回やって見ようと思います。

Switchノード

さて、前回も使ったSwitchノードですが。Sequence rulesに関しては、3つの項目にわけてルールを記述可能です。

headで、最初の要素を処理できますが、JSONata式を記述可能なので、さらに条件を加えることができます。以下では、payloadに数値が載っていて、かつ2より小さいと指定しています。JSONata式を満たさなければ仕分けは行われません。

index betweenは、Sequenceの要素のインデックス番号で取り出す範囲を決められます。下限<インデックス≦上限、と上限を含む指定のようでした。以下では0より大きく1以下のインデックスを取り出しています。「+追加」ボタンを押せば複数の index betweenを並べられるので仕分け先を増やすことができます。

tailは末尾の取り出しですが、head同様JSONata式を記述可能でした。

以下では「最初に合致した条件で終了」としてあるので、どれか一つのルールに合致すれば他のルールが適用されることはありません。行き先は一つだけ。「全ての条件を適用」にすれば合致した行き先の全てに積荷が配られることになります。

Switch_Array

仕分けの結果(Debug)

実際にフローを適用したときの、Debug Windowの様子が以下に。最初の3つ、Debug_Arrayからの報告はSplitの結果のシーケンスです。配列 [1,2,3]はめでたく3個のメッセージに分割され、順番通りに出力されています。payloadには要素の数値がそのまま載っています。

後半の3個は仕分けた結果です。それぞれ異なるDebugノード、Debug1,Debug2,Debug3に、数値データ1,2,3を載せたmsg.payloadが送られています。

Debug_Arrayというわけで仕分け成功。次回は、SplitしたものをJoin?

ブロックを積みながら(39) Node-RED、行き先切り替え、Switchノード へ戻る