📚 Node-RED 変数タイプガイド
Node-REDでは、データを保存したり操作したりするために様々な変数のタイプを使用します。このガイドでは、InjectノードやChangeノードで使用できる変数タイプについて、実例を交えながら説明します。
📖 変数とは?
変数とは、データを入れておく「箱」のようなものです。プログラムで使うデータ(数値、文字、情報など)を一時的に保存しておく場所と考えてください。
🏠 日常生活での例え
📦 引き出し
引き出しにラベル(変数名)を貼って、中に物(データ)を入れる
温度 = 25度
湿度 = 60%
場所 = "リビング"
🏷️ 付箋メモ
メモ帳に「温度: 25度」と書いて保存しておくイメージ
メモ1: カウント = 5回
メモ2: 名前 = "センサーA"
メモ3: 状態 = オン
📊 Excel のセル
セルにデータを入れて、他のセルから参照する(参照される側が変数)
💡 実際のExcel:
• B1セルには「=A1*2」と入力するが、表示は「50」
• B2セルには「=A2+A1」と入力するが、表示は「55」
A1, A2セル = 変数(データを保存)
B1, B2セル = 関数の結果(計算結果を表示)
💻 Node-REDでの変数
Node-REDでは、変数を使ってこんなことができます:
💾 データの保存
センサーから受け取った温度データを保存して、後で使う
🔄 データの受け渡し
あるノードから次のノードへデータを渡す
🔢 計算や処理
保存したデータを使って計算したり、比較したりする
📊 状態の記録
「何回ボタンが押されたか」などの状態を覚えておく
🎨 変数の3つの要素
| 要素 |
説明 |
例 |
| 1️⃣ 名前 |
変数の識別子 |
temperature, counter, isActive |
| 2️⃣ 型(タイプ) |
データの種類 |
数値、文字列、真偽値 |
| 3️⃣ 値 |
実際のデータ |
25, "センサーA", true |
具体例:
temperature (数値) = 25
「temperature」という名前の、「数値」型の変数に、「25」という値が入っている
💡 初心者の方へ: 最初は難しく感じるかもしれませんが、「変数 = ラベル付きの箱」と覚えておけば大丈夫です。Node-REDを使いながら、少しずつ慣れていきましょう!
📋 1. データ型(値のタイプ)
Node-REDで扱えるデータ型について、具体例とともに説明します。これらのデータ型は、すべての変数(通常の変数、context変数)で共通に使用できます。
a_z文字列(String)
テキストデータを保存します
"こんにちは"
"温度: 25度"
"sensor001"
使用例:
センサー名、メッセージ、住所など
0_9数値(Number)
数字のデータを保存します
25
3.14
-10
100.5
使用例:
温度、湿度、カウント数、計算結果など
◉真偽値(Boolean)
true(真)またはfalse(偽)の2つの値のみ
true(オン、正しい)
false(オフ、間違い)
使用例:
スイッチのON/OFF、条件判定の結果など
[]配列(Array)
複数のデータを順番に並べて保存
[1, 2, 3, 4, 5]
["apple", "banana", "orange"]
[{"name": "A"}, {"name": "B"}]
使用例:
センサー値のリスト、複数デバイスのデータ、履歴データなど
{}JSON(オブジェクト)
複数のデータをキーと値のペアで保存
{
"温度": 25,
"湿度": 60,
"場所": "リビング"
}
使用例:
センサーの複数データ、設定情報など
01バッファ(Buffer)
バイナリデータ(画像、音声など)
<Buffer 48 65 6c 6c 6f>
使用例:
画像データ、ファイルの中身など
🕐日時(Timestamp)
現在の日時を数値で保存
1696582800000
(ミリ秒単位のUnix時間)
使用例:
データ取得時刻、イベント発生時刻など
J:JSONata式
データを加工・計算する式
$number(payload) * 2
$substring(topic, 0, 5)
使用例:
データの変換、計算、文字列操作など
$環境変数
設定ファイルから値を読み込む
$env("API_KEY")
$env("SERVER_URL")
使用例:
APIキー、サーバーアドレスなどの設定値
📌 配列とJSONの違い:
- 配列:順序のあるデータの集まり。インデックス番号(0, 1, 2...)でアクセス
- JSON:名前(キー)と値のペアの集まり。キー名でアクセス
// 配列:インデックスでアクセス
fruits[0] → "apple"
fruits[1] → "banana"
// JSON:キー名でアクセス
sensor.温度 → 25
sensor.湿度 → 60
🔄 2. Node-REDの変数の種類
Node-REDでは、変数の使い方によって大きく2つのグループに分かれます。
変数を使うには、まず「宣言」という作業が必要です。宣言とは、「これから○○という名前の変数を使います」とプログラムに伝えることです。宣言の方法が、変数の種類によって異なります。
1️⃣ 通常の変数
Functionノード内でのみ使用される一時的な変数
// const, let, var で宣言
const temperature = 25;
let counter = 0;
var message = "Hello";
特徴:
- 宣言方法:const, let, var キーワードを使う
- Functionノードの処理中のみ存在
- 処理が終わると消える
- 他のノードからはアクセス不可
- JavaScriptの通常の変数と同じ
2️⃣ context変数
ノードの処理が終わっても保持され、他のフローからも参照可能な変数
// context APIで保存・取得
context.set('lastValue', 25);
flow.set('counter', 0);
global.set('apiKey', 'xxx');
特徴:
- 宣言方法:set() メソッドで値を保存(宣言不要)
- 処理が終わっても値が保持される
- 周期的なフロー実行時に参照可能
- スコープによって共有範囲が異なる
- Node-RED特有の仕組み
💡 重要なポイント: 通常の変数は「その場限り」の一時的な計算用。context変数は「記憶しておく」ための永続的なデータ保存用です。
🔍 3. 通常の変数のスコープ
通常の変数(const, let, var)は、宣言する場所によってスコープ(有効範囲)が変わります。
📖 スコープとは?
スコープとは、変数を参照できる範囲(使える範囲)のことです。
例えるなら、「その変数がどこまで見えるか」「どこまでアクセスできるか」を決める範囲のルールです。
🏠 日常での例え
部屋Aで書いたメモは、部屋Aの中でしか読めません。
部屋Bに行ったら、部屋Aのメモは見えない(参照できない)のと同じです。
変数のスコープも同じように、宣言した場所によって「どこまで参照できるか」が決まります。
宣言場所によるスコープの違い
// ❶ 関数の先頭で宣言 → 関数全体で使用可能
function processData() {
const globalTemp = 25; // 関数内のどこでも使える
if (globalTemp > 20) {
node.warn(globalTemp); // ✅ 使える
}
for (let i = 0; i < 3; i++) {
node.warn(globalTemp); // ✅ 使える
}
}
// ❷ if文の中で宣言 → if文の中のみで使用可能
if (temperature > 20) {
const message = "暑い"; // if文内でのみ使える
node.warn(message); // ✅ 使える
}
node.warn(message); // ❌ エラー!スコープ外
// ❸ forループ内で宣言 → ループ内のみで使用可能
for (let i = 0; i < 3; i++) {
const loopValue = i * 10; // ループ内でのみ使える
node.warn(loopValue); // ✅ 使える
}
node.warn(loopValue); // ❌ エラー!スコープ外
📌 覚えておくポイント
- const / let: ブロック({ })内でのみ有効(ブロックスコープ)
- var: 関数全体で有効(関数スコープ)※非推奨
- できるだけ使う場所の近くで宣言するのが良い習慣
🌐 4. context変数のスコープ
context変数は、宣言の仕方によってスコープ(共有範囲)が変わります。
context(ノード)
範囲:定義されたノード内のみ
有効期限:Node-REDを再起動するまで
宣言方法:context.set() / context.get()
context.set('lastValue', 25);
let val = context.get('lastValue');
📝 例:
特定のFunctionノード内でのみ使用する前回値や状態を保存
flow(フロー)
範囲:同じフロー(タブ)内のすべてのノード
有効期限:Node-REDを再起動するまで
宣言方法:flow.set() / flow.get()
flow.set('counter', 0);
let count = flow.get('counter');
📝 例:
同じフロー内の複数ノードで共有するカウンター値や設定値
global(グローバル)
範囲:すべてのフロー(全タブ)
有効期限:Node-REDを再起動するまで
宣言方法:global.set() / global.get()
global.set('apiKey', 'xxx');
let key = global.get('apiKey');
📝 例:
全フローで共有するAPIキーやユーザー設定
💡 使い分けのポイント:
- context: そのノードだけで覚えておきたいデータ
- flow: 同じタブ内の複数ノードで共有したいデータ
- global: すべてのタブで共有したいデータ(使いすぎ注意)
⚙️ 5. ノードでの使用方法
Injectノード(データ送信)
Injectノードでは、送信するデータの型を指定できます。
Inject
→
msg.payload: 数値 → 25
| 設定項目 |
型の選択 |
説明 |
| msg.payload |
文字列、数値、JSON、配列、日時など |
送信するメインデータ |
| msg.topic |
文字列(通常) |
データの種類やカテゴリ |
💡 ヒント: Injectノードの型セレクタ(▼ボタン)をクリックすると、すべてのデータ型が表示されます。flow.やglobal.も選択できます!
Changeノード(データ変更)
Changeノードでは、データを変換したり、新しい値を設定したりできます。
| 操作 |
使用する型 |
例 |
| 値の設定 |
すべての型 |
msg.payload を 数値 25 に設定 |
| 値の変更 |
文字列、JSONata |
msg.topic を 文字列 "sensor/temp" に変更 |
| 移動 |
msg、flow、global |
msg.payload を flow.lastValue に移動 |
| 削除 |
- |
msg.tempData を削除 |
📝 6. 実践例
例1: 温度センサーのデータ処理
Inject
→
Change
→
Debug
Injectノードの設定:
msg.payload: 数値 → 25.5
msg.topic: 文字列 → "temperature"
Changeノードの設定:
① msg.payload を flow.currentTemp に保存(コピー)
② msg.timestamp を 日時 に設定
③ msg.unit を 文字列 "℃" に設定
例2: カウンターの作成
ボタン
→
カウント+1
→
表示
Changeノードの設定:
① flow.counter を JSONata に設定
式: ($flowContext("counter") || 0) + 1
(現在の値 + 1、初回は0)
② msg.payload を flow.counter に設定
例3: Functionノード内でcontextを使う
// Functionノード内のコード例
// context変数に前回の値を保存
let lastValue = context.get('lastValue') || 0;
// 現在の値と前回の値を比較
let currentValue = msg.payload;
let difference = currentValue - lastValue;
// 今回の値を保存(次回用)
context.set('lastValue', currentValue);
// 差分を出力
msg.payload = {
current: currentValue,
previous: lastValue,
difference: difference
};
return msg;
💡 context変数の特徴: このFunctionノード専用の変数なので、他のノードからはアクセスできません。ノードごとに独立した状態を保持したい時に便利です。
例4: 複数センサーのデータ統合
// Changeノードで複数の値を1つのJSONにまとめる
msg.payload を JSON に設定:
{
"temperature": flow.temp,
"humidity": flow.humid,
"timestamp": msg.timestamp,
"location": "リビング"
}
📊 7. よくある使い方のパターン
パターン1: 一時的なデータ → msg
センサーからの1回の読み取り値、APIレスポンス、計算の中間結果など、次のノードに渡すだけのデータ
パターン2: ノード内での記憶 → context
そのノード内だけで使う一時データや状態。Functionノード内でのカウンターや前回値の保存など
パターン3: フロー内で共有 → flow
同じタブ内の複数ノードで使いたいデータ。カウンター、最後の値、設定値など
パターン4: 全体で共有 → global
すべてのフローで使いたいデータ。APIキー、ユーザー設定、共通の定数など
⚠️ 注意: global変数は便利ですが、使いすぎるとフローが複雑になります。本当に必要な場合だけ使用しましょう。
📋 8. チートシート
| アイコン |
型名 |
使用場面 |
例 |
| a_z |
文字列 |
テキスト、名前、メッセージ |
"温度センサー" |
| 0_9 |
数値 |
温度、カウント、計算 |
25.5 |
| ◉ |
真偽値 |
ON/OFF、判定結果 |
true / false |
| [] |
配列 |
データのリスト、履歴 |
[1, 2, 3] |
| {} |
JSON |
複数データ、オブジェクト |
{"temp": 25} |
| 🕐 |
日時 |
現在時刻、タイムスタンプ |
1696582800000 |
| J: |
JSONata |
データ変換、計算式 |
payload * 2 |
| $ |
環境変数 |
設定値、機密情報 |
$env("API_KEY") |
🎓 まとめ
📌 覚えておきたいポイント:
- msg = その時だけのデータ(メッセージと一緒に流れる)
- context = ノード内だけのデータ(そのノード専用)
- flow = フロー内で共有するデータ(同じタブ内)
- global = 全体で共有するデータ(全タブ)
- 型セレクタ(▼)で目的に合った型を選ぶ
- Debugノードで値を確認しながら開発する
この知識があれば、Node-REDでより複雑なIoTアプリケーションを開発できます!実際にInjectノードとChangeノードを使って、色々な型を試してみてください。
Node-RED Variable Types Guide
💻 Happy Coding with Node-RED! 🚀