ブロックを積みながら(36) Node-RED、何気に深いInjectとDebugノード

Joseph Halfmoon

前回、折角Node-REDのバージョンアップをかけたのに、それっきりになっておりました。Node-REDエディタのパレットに追加でインストールしたものは多くないので、今のうちに「一通り」端から使ってみるべし、という目標であります。「必要に応じて」(泥縄式ともいう)でマニュアル読んでも分かってない機能がいっぱいあるのね。

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

ブロックを積みながらでなく、ブロック(ノード)を繋ぎながらのNode-RED編、頼りとすがっておりますのが、Node-RED User Group Japan様の日本語ドキュメントです。本日、実習してみます InjectとDebugノードについては以下のページに説明があります。

ドキュメント・ユーザガイド・コアノード

説明あるから、必要になったら読めば分かるじゃん、などと言って、老人の忘却力を馬鹿にしたもんじゃありません。何度か使って「痛い目」に合わないことにはこの凡人老人の目は開きませぬぞ。

Injectノード

一番にとりあげますのが、アイキャッチ画像に掲げたフローの左側、Injectノードであります。ボタンを手動で押したり、タイマでトリガをかけたりするたびに新たなオブジェクトを生成して送り出してくれる基本中の基本のノードです。オブジェクト=JavaScriptの、ということでありますが。Injectノードをダブルクリックして現れるのが以下の設定画面です。

flow000_injectパレットからドラッグしてきた時点では上のようでした。名前は空、送信するオブジェクトは msg という名のもの1つです。明示的に設定できるプロパティとして、流れるデータの中心となる payload と topic の2つが準備済です。デフォルトではプロパティpayloadには日時(を表す整数値)がセットされ、topicは空のまま送り出されます。時間指定や繰り返し指定はないので、フロー画面でボタンを押されたらオブジェクトが送り出されます。

下矢印をクリックしてみると、日時以外にもいろいろ設定できるようです。JSONオブジェクトは良いとして、JSONataはお馴染みでないので、後で勉強せずにはいられますまい。flow000_injectMenu

Debug ノード

Node-REDでフローを書くたび、お世話になっている気がする Debug ノードですが、実は使い方が分からぬままズルズル使ってきていました。今回ひととおり確かめたいものです。

まずデフォルトで置いたときの状態がこちら。

flow000_debugProp対象は msg.payload プロパティ、つまりmsgオブジェクトの中核のプロパティだけを表示してくれるようです。そして出力先は「デバッグウインドウ」これは、Node-REDエディタの右上に並んでいるアイコンの中で「虫」マークを押すと右側に開くウインドウですね。これくらいは知っておりますぞ。そして名前は無。後で名前は付けておいた方が分かり易いことを納得しましたが、今は無のまま。

さて、先ほどのInjectノードの手動トリガのボタンを押すとデバッグウインドウには以下のような msg.payload が出力されます。

flow000_debug上記の状態だと、先頭の到着時刻以外は、ちょっと何言ってるのか分からない、です。そのとき、Debugノードにお名前をセットしておいて、また数字の表示モード?を日時設定しておくと以下のように見えます。

debug_displayTime分かり易くなりました。なお、数字の解釈は青の数字をクリックすると変更することができます。ただし、numberを日時で解釈するようにすると、後のnumberはなんでも日時で表示するようなので適宜切り替えが必要かと思います。

Debugノードの出力先

Debugノードにはデバッグウインドウ以外にも2つ出力先がありました。全部に出力指定のチェックを入れてみました。こんな感じ。

flow001_debugProp

まず一番下のノードステータス(32文字)は以下のような表示になりました。Node-REDエディタのフロー画面のDebugノードの下に表示が出ます。わざわざDebugウインドウを開かなくても「だいたい」分かるってか。でも複雑なオブジェクトは表示不可です。32文字だし。flow001

次に2番目のシステムコンソールですが、こちらはパソコンのブラウザからは見えません。手元のNode-REDは、Raspberry Pi 3機上のRaspbianOSで動作させているので、Linuxにログインしてみることになります。こんな感じ。

$ node-red-log
~途中略~
16 Sep 13:45:00 - [info] [debug:TEST DEBUG OUT] 1631767500866
16 Sep 13:45:47 - [info] [debug:TEST DEBUG OUT] 1631767547252

テキストファイルになるので、大量、長時間の結果を調べる必要があるときには良いかもしれません。

なお、前回もお世話になったユーザ会様のインストールの手順のページで紹介されているスクリプトでNode-REDをインストールすれば同時にこの node-red-log コマンドも準備されるようです。そうでない場合は自分で調べよということですか。

なお、Debugはオブジェクトを表示する方ばかりでなく、表示を止めることにも対応していました。馬鹿なので、過去のDebugでは、Debugノードを取ったり付けたりしていました。プロパティの左下にある「有効」の丸印をクリックすれば「無効」になります(再度クリックすれば有効に。)こんな感じ。これでDebug出力は抑止です。
flow002

ノード間の結合

どうもDebugノードには複数のノードを接続できるみたいなのでやってみました。こんな感じ。

flow003追加したInjectノードには、msgオブジェクトの中に勝手な拡張プロパティf1を追加し、その値として “Always Zero” を与えてみました。もとからある「タイムスタンプ」の方にも同じプロパティ f1 を拡張し、そちらの値は “TIME_STAMP”としました。

flow003_injectDebugノード側では、「対象」をmsg.payload から msgオブジェクト全体へと変更してみました。

flow003_debug2個あるInjectノードのボタンを順に押したところがこちら。

flow003_debugOUTそれぞれ別なInjectノードノードから送られてきたオブジェクトであることが分かります。また、勝手には設定できないメッセージオブジェクトにユニークな _msgid というプロパティも含まれていることがわかります。

Debugノードが複数の入り口を持てることが分かったので、Injectノードが複数の出口を持てるのかやってみます。デフォルトのままのDebugノードを1個追加、こんな感じ。

flow004Always Zeroノードのボタンを押すと、両方のDebugノードが反応していることが分かります。

flow004_debug

少しわかってきたかね。直ぐに忘却力だけれども。

ブロックを積みながら(35) Node-RED、バージョンアップしたらSQLiteがいない へ戻る

ブロックを積みながら(37) Node-RED、何でもあり?Functionノード、その1 へ進む