Link Call ノードとは
2021/10/21にリリースされたNode-RED 2.1の新しい機能の一つに、Link Call ノード があります。
以下、公式Blogの投稿 の翻訳を引用:
新しいLink Call ノードをLink in/outノードと一緒につかって、サブルーチンのようなフローを作成できます。
Link-inノードで始まり、新しい「link callノードへ返却」モードになっているLink-outノードで終わるフローがある場合(別のアイコン表示になります)、Link Callノードはフローに値を渡して実行し、結果を呼び出し元のフローに戻すことができます。
サブフローを使用する代わりに、これは複数の場所で再利用したい小さなユーティリティフローを作成するのに最適です。
なるほど、GOTOじゃなくてGOSUBなわけですね。(たとえが古い)
ということで、早速試してみましょう。
(なお、以下の検証は、2021/12/9現在最新のNode-RED 2.1.4を用いて行っています)
Link-outノードの「モード」
Node-REDの2.1のLink-outノードでは、プロパティ内で新しく「モード」設定ができるようになっています。
モードを「link callノードへ返却」に設定すると、アイコンが変わります。
「接続された全てのlinkノードへ送信」に設定した場合
矢印が水平にくる感じですが、「link callノードへ返却」に設定した場合
となり、矢印が左下になってて「戻る」イメージになります。
また、このモードにすると、hoover表示が「link return」に変わります。
「link callノードへ返却」に設定したLink-outノードは、出力ポートがなくなり、別のLink-inノードに接続することができなくなります。
なので、「link callノードへ返却」に設定した場合、これまでのLink-in/outノードとは使い方が逆になるイメージです。これまでの使い方は、Link-outからLink-inに移動するイメージでしたが、
Link Callノードを使う場合は、Link-inから処理を書いて、Link-outで元のフローに戻す感じになります。
これまでと同様、Link-inノードに名前を付けてないとどのLink-inを呼び出すかが分かりにくくなりますので、Link-inノードには名前を付けておくようにしましょう。
(モードで設定するんじゃなくて、別の「Link-returnノード」を準備したほうが分かりやすかったんじゃないかなあ)
Link Callノードの設定
Link Callでどのフローを呼び出すかの設定は、Link Callノードのプロパティで設定します。
これまでのLink-outノードと同様、接続するLink-inノードを選択しますが、Link-outノードと違い、ラジオボタンになっており、呼び出すリンクは1つのみ選択できます。上の画像のようにどれも選択していない状態では、msgが届いても呼び出しがされない状態になりますので、必ず1つは設定しておきましょう。(選択するとLink Callノードのラベルに設定されます)
なお、呼び出されるほうは1つしか設定できませんが、複数のLink Callノードから同じLink-inノードを呼び出すことが可能です。
戻る場合は、呼び出されたLink Callノードに戻りますので、Link-outノード側で戻る先を指定する必要はありません。
これにより、再利用したい共通処理を書いたフローロジックを、複数個所から呼び出すことができるようになります。
(まあ、でも、それだったらサブフローでいいんじゃ?)
Link Callノードのタイムアウト設定
Link Callノードには、サブフローにない機能として「タイムアウト」設定があります。
タイムアウトを設定することで、設定した秒数以内にLink-outノードからの戻りがなければ、エラーを発生させることができます。
サンプルとして、delayノードで遅延を入れて、タイムアウトの動きを確認してみます。
13:33:19でタイムアウトが出力されています。ただその後、13:33:21に処理が戻ってきて、それは受信してデバッグノードに出力されていますので、タイムアウトしたmsgオブジェクトが捨てられるわけではないので、注意が必要です。
サブルーチンの入れ子
Link Callのプロパティで適切に呼び出すLink-inノードを設定することにより、サブルーチン処理を入れ子にすることも可能です。
Link Callされた際には、戻り先を永続化するために、msgオブジェクトの中に「_linkSource」というarrayが生成され、その中に呼び出されたnodeのidなどが保存されるようです。
サブルーチンのグループ化
Link Callノードから呼び出されるサブルーチンをグループ化することにより、同じFlowEditor内で一覧でき、背景色等設定することでフローが見やすくなります。
またグループの環境変数(同じくNode-RED 2.1.xの新機能 )を使うことにより、サブルーチンの中だけで参照できる変数を定義できるようになりました。
なお、グループに対する環境変数の定義については、開発者の西山さんが
Node-RED2.1の新機能: フローおよびグループに対する環境変数の定義
で、紹介されていますので、参考にしてください。
まとめ
Node-RED 2.1.xで追加されたLink Callノードを詳しく調べてみました。
Link Callノードをつかったサブルーチンは、サブフローをつかったサブルーチンより、編集や参照がしやすくていいんじゃないでしょうか。
- 大規模な処理を隠蔽して管理したいならサブフロー
- ちょっとした処理を共通化するなら、Link Call
という風な使い分けになるかと思います。本記事がみなさんのNode-REDライフの参考になれば幸いです。