🔍 Node-RED Debugノード 完全ガイド

このガイドでは、Node-REDのDebugノードについて、初心者の方でも理解できるように詳しく説明します。

📚 1. Debugノードとは?

🤔 「Debug」って何?

Debugノードは、フロー内を流れるメッセージの内容を確認するためのノードです。 日常生活で例えると、荷物の中身を確認する検査官のようなものです。

📦 空港の荷物検査に例えると:

📦 基本的な動作

Inject 処理 Debug

Debugノードは、受け取ったメッセージの内容をデバッグサイドバーシステムコンソール、またはノードのステータスに出力します。 フロー開発時の動作確認やトラブルシューティングに欠かせないノードです。

入力メッセージ
msg.payload = "Hello, World!"
msg.topic = "Sample"
↓ Debug ↓
サイドバーに表示
📋 "Hello, World!"
(メッセージはそのまま通過)

⚙️ 2. Debugノードの3つの出力先

サイドバー デバッグサイドバー

Node-REDエディタの右側パネルに出力

最も一般的な使い方 展開して詳細確認可能 クリックで発生元ノードへ移動

コンソール システムコンソール

Node-REDを実行しているターミナルに出力

サーバーログとして記録 大量データの確認に便利 外部ツールとの連携

ステータス ノードステータス

Debugノードの下に小さく表示

エディタ上で即座に確認 32文字まで表示 サイドバーを開かずに確認

📋 設定項目一覧

設定項目 説明 オプション
出力対象 表示する内容を選択 msg.payload / 完全なmsgオブジェクト / JSONata式
出力先 デバッグサイドバー オン/オフ
出力先 システムコンソール オン/オフ
出力先 ノードステータス オン/オフ(32文字まで)
ステータス表示内容 ノードステータスに表示する値 typedInput(デフォルト: 自動)
名前 ノードの表示名 任意の文字列

🎯 出力対象の種類

タイプ 説明 使用場面
msg.payload payloadプロパティのみ表示 基本的なデータ確認
完全なmsgオブジェクト msg全体を表示(payload, topic, _msgid等) 詳細な調査、トラブルシュート
JSONata式 カスタムフォーマットで表示 整形された出力、条件付き表示

🎯 3. 実用的な使用パターン

📥 サンプルフローのインポート方法:

  1. 下のサンプルフローJSONをコピー
  2. Node-REDエディタで メニュー → 読み込み を選択
  3. JSONをペーストして「読み込み」をクリック

このサンプルフローには、以下で説明する全パターンの実例が含まれています。

📋 サンプルフロー(クリックで展開)

参照元:NodeREDエディター内サンプルフロー

[ { "id": "4172066d80ce08eb", "type": "tab", "label": "debug", "disabled": false, "info": "", "env": [] }, { "id": "f1a1990e6cf1bdad", "type": "comment", "z": "4172066d80ce08eb", "name": "Output payload value to debug sidebar", "info": "Debug node can be used to output payload value to debug sidebar.", "x": 270, "y": 60, "wires": [] }, { "id": "a325a0b5fbc66ec5", "type": "inject", "z": "4172066d80ce08eb", "name": "", "props": [ { "p": "payload", "v": "Hello, World!", "vt": "str" }, { "p": "topic", "v": "", "vt": "string" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "Hello, World!", "payloadType": "str", "x": 250, "y": 100, "wires": [ [ "095465ec1455c239" ] ] }, { "id": "095465ec1455c239", "type": "debug", "z": "4172066d80ce08eb", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 490, "y": 100, "wires": [] }, { "id": "8c66d039.44465", "type": "comment", "z": "4172066d80ce08eb", "name": "Output complete object", "info": "Debug node can be used to output whole object value to debug sidebar.", "x": 220, "y": 180, "wires": [] }, { "id": "dac87e40.90376", "type": "inject", "z": "4172066d80ce08eb", "name": "", "props": [ { "p": "payload", "v": "Hello, World!", "vt": "str" }, { "p": "topic", "v": "Sample", "vt": "string" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "Sample", "payload": "Hello, World!", "payloadType": "str", "x": 280, "y": 220, "wires": [ [ "a77fa5e3.fac248" ] ] }, { "id": "a77fa5e3.fac248", "type": "debug", "z": "4172066d80ce08eb", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 470, "y": 220, "wires": [] }, { "id": "fb1c3ce9.c29ee", "type": "comment", "z": "4172066d80ce08eb", "name": "Output to console", "info": "Debug node can be used to output values to console.", "x": 210, "y": 300, "wires": [] }, { "id": "3c24e746.9ff6a8", "type": "inject", "z": "4172066d80ce08eb", "name": "", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "Hello, World!", "payloadType": "str", "x": 250, "y": 340, "wires": [ [ "66cc7b44.82ba74" ] ] }, { "id": "66cc7b44.82ba74", "type": "debug", "z": "4172066d80ce08eb", "name": "", "active": true, "tosidebar": false, "console": true, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 500, "y": 340, "wires": [] }, { "id": "33791e6a.973502", "type": "comment", "z": "4172066d80ce08eb", "name": "Output to node status area", "info": "Debug node can be used to output values to status area below the node.", "x": 230, "y": 420, "wires": [] }, { "id": "a5d8e744.a034e8", "type": "inject", "z": "4172066d80ce08eb", "name": "", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "Hello, World!", "payloadType": "str", "x": 250, "y": 460, "wires": [ [ "b0646a4d.db4bc8" ] ] }, { "id": "b0646a4d.db4bc8", "type": "debug", "z": "4172066d80ce08eb", "name": "", "active": true, "tosidebar": false, "console": false, "tostatus": true, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 490, "y": 460, "wires": [] }, { "id": "30ed0a73.fcef86", "type": "comment", "z": "4172066d80ce08eb", "name": "Formatting output using JSONata", "info": "Debug node can format output value using JSONata expression.", "x": 260, "y": 540, "wires": [] }, { "id": "6f477e7d.3a8da", "type": "inject", "z": "4172066d80ce08eb", "name": "", "props": [ { "p": "payload", "v": "Hello, World!", "vt": "str" }, { "p": "topic", "v": "Sample", "vt": "string" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "Sample", "payload": "Hello, World!", "payloadType": "str", "x": 280, "y": 580, "wires": [ [ "19c9408d.ac6d4f" ] ] }, { "id": "19c9408d.ac6d4f", "type": "debug", "z": "4172066d80ce08eb", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "\"[\" & topic & \"] \" & payload", "targetType": "jsonata", "statusVal": "", "statusType": "auto", "x": 480, "y": 580, "wires": [] } ]

パターン1: payloadをサイドバーに出力

用途: 最も基本的な使い方。メッセージの主要データを確認

Inject
("Hello, World!")
Debug
(payload)

📌 動作の流れ:

  1. Injectノードが "Hello, World!" を送信
  2. Debugノードがmsg.payloadを受け取る
  3. サイドバーに "Hello, World!" が表示

サイドバー出力イメージ:

設定例:

出力対象: msg.payload 出力先: デバッグサイドバー ✓ システムコンソール ✗ ノードステータス ✗

パターン2: 完全なmsgオブジェクトを出力

用途: payload以外のプロパティも確認したい場合

Inject
(payload + topic)
Debug
(完全msg)

サイドバー出力イメージ:

設定例:

出力対象: 完全なmsgオブジェクト 出力先: デバッグサイドバー ✓ 表示されるプロパティ: - payload: メインデータ - topic: トピック - _msgid: メッセージID - その他: 前のノードで追加されたプロパティ

パターン3: システムコンソールに出力

用途: サーバーログとして記録、大量データの確認

Inject Debug
(console)

📌 コンソール出力の確認方法:

設定例:

出力対象: msg.payload 出力先: デバッグサイドバー ✗ システムコンソール ✓ ノードステータス ✗ コンソール出力例: 16 Dec 10:30:45 - [info] [debug:debug 1] Hello, World!

パターン4: ノードステータスに出力

用途: エディタ上で素早く値を確認

Inject Debug
(status)

ステータス表示イメージ:

🔍
debug
Hello, World!

設定例:

出力対象: msg.payload 出力先: デバッグサイドバー ✗ システムコンソール ✗ ノードステータス ✓ 注意: 32文字を超えると切り詰められる

パターン5: JSONata式でフォーマット

用途: 複数のプロパティを整形して表示

Inject
(payload + topic)
Debug
(JSONata)

📌 JSONata式の例:

サイドバー出力イメージ:

設定例:

出力対象: JSONata式 式: "[" & topic & "] " & payload 入力: msg.payload = "Hello, World!" msg.topic = "Sample" 出力: "[Sample] Hello, World!"

🏋️ 4. 実践演習

演習1: 基本的なデバッグ出力初級

📝 課題:

JSONオブジェクトをサイドバーに出力し、展開して内容を確認してください。

🎯 要求仕様:

📊 期待される動作:

✅ 成功の条件:

💡 ヒント

Injectノードの設定:

  • payload: JSON型
  • 値: {"temperature": 25.5, "humidity": 60}

Debugノードの設定:

  • 出力対象: msg.payload
  • 出力先: デバッグサイドバー
✅ 解答例フロー
[ { "id": "ex1_inject", "type": "inject", "name": "センサーデータ", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"temperature\": 25.5, \"humidity\": 60}", "payloadType": "json", "x": 150, "y": 100, "wires": [["ex1_debug"]] }, { "id": "ex1_debug", "type": "debug", "name": "センサー確認", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 350, "y": 100, "wires": [] } ]

演習2: 複数の出力先を使い分け中級

📝 課題:

同じメッセージを3つの異なる出力先(サイドバー、コンソール、ステータス)に同時に出力してください。

🎯 要求仕様:

📊 期待される動作:

✅ 成功の条件:

💡 ヒント

Injectノードの設定:

  • payload: 文字列 "テストメッセージ"
  • topic: "test"
  • 出力を3つのDebugノードに接続

Debug 1(サイドバー)の設定:

  • 名前: "サイドバー出力"
  • 出力対象: 完全なmsgオブジェクト
  • 出力先: デバッグサイドバー ✓

Debug 2(コンソール)の設定:

  • 名前: "コンソール出力"
  • 出力対象: msg.payload
  • 出力先: システムコンソール ✓

Debug 3(ステータス)の設定:

  • 名前: "ステータス出力"
  • 出力対象: msg.payload
  • 出力先: ノードステータス ✓
✅ 解答例フロー
[ { "id": "ex2_inject", "type": "inject", "name": "テスト送信", "props": [ {"p": "payload", "v": "テストメッセージ", "vt": "str"}, {"p": "topic", "v": "test", "vt": "str"} ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 130, "y": 140, "wires": [["ex2_debug1", "ex2_debug2", "ex2_debug3"]] }, { "id": "ex2_debug1", "type": "debug", "name": "サイドバー出力", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 360, "y": 80, "wires": [] }, { "id": "ex2_debug2", "type": "debug", "name": "コンソール出力", "active": true, "tosidebar": false, "console": true, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 360, "y": 140, "wires": [] }, { "id": "ex2_debug3", "type": "debug", "name": "ステータス出力", "active": true, "tosidebar": false, "console": false, "tostatus": true, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 360, "y": 200, "wires": [] } ]

演習3: JSONataで整形出力中級

📝 課題:

センサーデータをJSONataで見やすく整形して出力してください。

🎯 要求仕様:

📊 期待される動作:

✅ 成功の条件:

💡 ヒント

Injectノードの設定:

  • payload: JSON型
  • 値: {"device": "sensor01", "temp": 25.5, "unit": "celsius"}

Debugノードの設定:

  • 出力対象: JSONata式
  • 式: payload.device & ": " & $string(payload.temp) & "°C"

JSONataのポイント:

  • 文字列結合は & を使用
  • 数値を文字列に変換するには $string()
✅ 解答例フロー
[ { "id": "ex3_inject", "type": "inject", "name": "センサーデータ", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"device\": \"sensor01\", \"temp\": 25.5, \"unit\": \"celsius\"}", "payloadType": "json", "x": 150, "y": 100, "wires": [["ex3_debug"]] }, { "id": "ex3_debug", "type": "debug", "name": "整形出力", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload.device & \": \" & $string(payload.temp) & \"°C\"", "targetType": "jsonata", "statusVal": "", "statusType": "auto", "x": 350, "y": 100, "wires": [] } ]

演習4: 条件付きデバッグ出力上級

📝 課題:

センサー値が閾値を超えた場合のみ警告表示を行い、それ以外は通常表示するフローを作成してください。

🎯 要求仕様:

📊 期待される動作:

✅ 成功の条件:

💡 ヒント

Injectノードの設定(高温テスト):

  • payload: 数値 35

Injectノードの設定(正常テスト):

  • payload: 数値 25

Switchノードの設定:

  • プロパティ: msg.payload
  • 条件1: >= 30 → 出力1
  • 条件2: その他(otherwise)→ 出力2

Debug 1(警告)の設定:

  • 出力対象: JSONata式
  • 式: "⚠️ 警告: " & $string(payload) & "°C - 高温注意!"

Debug 2(正常)の設定:

  • 出力対象: JSONata式
  • 式: "✓ 正常: " & $string(payload) & "°C"
✅ 解答例フロー
[ { "id": "ex4_inject_high", "type": "inject", "name": "高温テスト (35°C)", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "35", "payloadType": "num", "x": 160, "y": 80, "wires": [["ex4_switch"]] }, { "id": "ex4_inject_normal", "type": "inject", "name": "正常テスト (25°C)", "props": [{"p": "payload"}], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "25", "payloadType": "num", "x": 160, "y": 140, "wires": [["ex4_switch"]] }, { "id": "ex4_switch", "type": "switch", "name": "温度判定", "property": "payload", "propertyType": "msg", "rules": [ {"t": "gte", "v": "30", "vt": "num"}, {"t": "else"} ], "checkall": "true", "repair": false, "outputs": 2, "x": 360, "y": 110, "wires": [["ex4_debug_warn"], ["ex4_debug_ok"]] }, { "id": "ex4_debug_warn", "type": "debug", "name": "警告出力", "active": true, "tosidebar": true, "console": false, "tostatus": true, "complete": "\"⚠️ 警告: \" & $string(payload) & \"°C - 高温注意!\"", "targetType": "jsonata", "statusVal": "", "statusType": "auto", "x": 540, "y": 80, "wires": [] }, { "id": "ex4_debug_ok", "type": "debug", "name": "正常出力", "active": true, "tosidebar": true, "console": false, "tostatus": true, "complete": "\"✓ 正常: \" & $string(payload) & \"°C\"", "targetType": "jsonata", "statusVal": "", "statusType": "auto", "x": 540, "y": 140, "wires": [] } ]

🎓 5. まとめ

Debugノードの重要ポイント

⚠️ よくある間違い

📚 次のステップ

Debugノードをマスターしたら、以下のノードも学んでみましょう:

🔧 6. トラブルシューティング

よくある問題と解決方法

問題 原因 解決方法
サイドバーに何も表示されない ノードが無効 ノードをダブルクリックして「有効」にチェック
サイドバーが見つからない パネルが閉じている 右上の「🐛」アイコンをクリック
コンソールに出力されない 出力先の設定ミス 「システムコンソール」にチェックを入れる
JSONata式でエラー 構文エラー エディタの「J:」ボタンで式を検証
ブラウザが重くなる 大量の出力 サイドバーの「🗑️」でクリア、または一時的に無効化
ステータスが途中で切れる 32文字制限 短い形式に変更、またはサイドバーを使用

💡 7. 実務での活用例

ケース1: API連携のデバッグ

HTTP Request前: リクエスト内容を確認 ↓ HTTP Request → API呼び出し ↓ HTTP Request後: レスポンス内容を確認 ↓ JSONパース後: 変換結果を確認 各段階でDebugノードを配置して データの流れを可視化

ケース2: センサーデータの監視

MQTT受信 → センサーデータ ↓ Debug (ステータス): 最新値をノード下に表示 ↓ Debug (コンソール): 全データをログファイルに記録 ↓ 処理継続... 本番環境ではサイドバー出力を無効化して コンソールログのみ残す

ケース3: エラー調査

問題発生時: 1. 疑わしい箇所の前後にDebugを追加 2. 完全なmsgオブジェクトを出力 3. 各プロパティの値を確認 4. 問題箇所を特定 5. 修正後、Debugを無効化または削除

ケース4: Raspberry Piでの運用

開発時: - サイドバー出力を有効 - ブラウザで確認しながら開発 本番運用時: - サイドバー出力を無効 - コンソール出力のみ有効 - journalctl でログを確認 sudo journalctl -u nodered -f | grep "debug"

📖 8. デバッグのベストプラクティス

効率的なデバッグのコツ

テクニック 説明 使用場面
名前を付ける Debugノードに分かりやすい名前を設定 複数のDebugがある場合
一時的に無効化 不要なDebugはダブルクリックで無効に 本番運用時、パフォーマンス改善
完全msgを確認 問題調査時は全プロパティを確認 原因不明のエラー調査
サイドバーをクリア 「🗑️」ボタンで古い出力を削除 新しいテスト開始時
フィルタを活用 サイドバーの検索/フィルタ機能 特定のノードの出力を探す
JSONata整形 重要な情報だけを整形して表示 大量のデータから必要部分を抽出

Debugノードの有効/無効切替

📌 切替方法:

🔗 9. 追加リソース


このガイドが役に立ちましたら、実際のプロジェクトで練習してみてください!
Debugノードはフロー開発に欠かせない最も重要なツールの一つです。

参照元:NodeREDエディター内サンプルフロー

🏠