LoginSignup
7
2

More than 1 year has passed since last update.

Node-RED 2.1.xで追加された Link Call ノードをいろいろ試してみた

Last updated at Posted at 2021-12-10

Link Call ノードとは

2021/10/21にリリースされたNode-RED 2.1の新しい機能の一つに、Link Call ノード があります。
image.png

以下、公式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ノードでは、プロパティ内で新しく「モード」設定ができるようになっています。

image.png

モードを「link callノードへ返却」に設定すると、アイコンが変わります。

「接続された全てのlinkノードへ送信」に設定した場合
image.png
矢印が水平にくる感じですが、「link callノードへ返却」に設定した場合
image.png
となり、矢印が左下になってて「戻る」イメージになります。
また、このモードにすると、hoover表示が「link return」に変わります。
image.png

「link callノードへ返却」に設定したLink-outノードは、出力ポートがなくなり、別のLink-inノードに接続することができなくなります。

なので、「link callノードへ返却」に設定した場合、これまでのLink-in/outノードとは使い方が逆になるイメージです。これまでの使い方は、Link-outからLink-inに移動するイメージでしたが、
image.png

Link Callノードを使う場合は、Link-inから処理を書いて、Link-outで元のフローに戻す感じになります。
image.png

これまでと同様、Link-inノードに名前を付けてないとどのLink-inを呼び出すかが分かりにくくなりますので、Link-inノードには名前を付けておくようにしましょう。
image.png

(モードで設定するんじゃなくて、別の「Link-returnノード」を準備したほうが分かりやすかったんじゃないかなあ)

Link Callノードの設定

Link Callでどのフローを呼び出すかの設定は、Link Callノードのプロパティで設定します。
image.png
これまでのLink-outノードと同様、接続するLink-inノードを選択しますが、Link-outノードと違い、ラジオボタンになっており、呼び出すリンクは1つのみ選択できます。上の画像のようにどれも選択していない状態では、msgが届いても呼び出しがされない状態になりますので、必ず1つは設定しておきましょう。(選択するとLink Callノードのラベルに設定されます)

image.png

なお、呼び出されるほうは1つしか設定できませんが、複数のLink Callノードから同じLink-inノードを呼び出すことが可能です。
image.png
戻る場合は、呼び出されたLink Callノードに戻りますので、Link-outノード側で戻る先を指定する必要はありません。
image.png

これにより、再利用したい共通処理を書いたフローロジックを、複数個所から呼び出すことができるようになります。

(まあ、でも、それだったらサブフローでいいんじゃ?)

Link Callノードのタイムアウト設定

Link Callノードには、サブフローにない機能として「タイムアウト」設定があります。

image.png

タイムアウトを設定することで、設定した秒数以内にLink-outノードからの戻りがなければ、エラーを発生させることができます。
サンプルとして、delayノードで遅延を入れて、タイムアウトの動きを確認してみます。
image.png

13:33:16にInjectを実行してみると、
image.png

13:33:19でタイムアウトが出力されています。ただその後、13:33:21に処理が戻ってきて、それは受信してデバッグノードに出力されていますので、タイムアウトしたmsgオブジェクトが捨てられるわけではないので、注意が必要です。

サブルーチンの入れ子

Link Callのプロパティで適切に呼び出すLink-inノードを設定することにより、サブルーチン処理を入れ子にすることも可能です。

image.png

Link Callされた際には、戻り先を永続化するために、msgオブジェクトの中に「_linkSource」というarrayが生成され、その中に呼び出されたnodeのidなどが保存されるようです。

image.png

サブルーチンのグループ化

Link Callノードから呼び出されるサブルーチンをグループ化することにより、同じFlowEditor内で一覧でき、背景色等設定することでフローが見やすくなります。
image.png

またグループの環境変数(同じくNode-RED 2.1.xの新機能 )を使うことにより、サブルーチンの中だけで参照できる変数を定義できるようになりました。

image.png

なお、グループに対する環境変数の定義については、開発者の西山さんが
Node-RED2.1の新機能: フローおよびグループに対する環境変数の定義
で、紹介されていますので、参考にしてください。

まとめ

Node-RED 2.1.xで追加されたLink Callノードを詳しく調べてみました。
Link Callノードをつかったサブルーチンは、サブフローをつかったサブルーチンより、編集や参照がしやすくていいんじゃないでしょうか。

  • 大規模な処理を隠蔽して管理したいならサブフロー
  • ちょっとした処理を共通化するなら、Link Call

という風な使い分けになるかと思います。本記事がみなさんのNode-REDライフの参考になれば幸いです。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2