私の現在のプロジェクトでは、Node-REDを使用して現在のアプリケーション機能を実装しようとしています。以下に機能を示します。ここで、Fire状態は2つの入力を受け取ります:(1)TemperatureSensor
(2)SmokeDetector
。両方のセンサーがMQTTパブリッシャーを使用してデータを公開しています。 Firestate
コンポーネントは、MQTTサブサイバーを介してデータを受信できます。
発火状態は、これらの2つのパラメーターであるif temperaturevalue > 70 and Smokevalue == true
に基づいて出力を生成できます。これを考慮して、私の質問は-Node-REDは2つの入力機能をサポートしていますか?サポートしている場合、どのようにこの機能を実装できますか?いいえの場合、.. 2つの入力機能はNode-REDを使用して実装できないと言えますか???? Node-REDは複数の出力を提供しますが、inputsは提供しないことを確認しました。
関数ノードを使用し、context
変数を使用してメッセージ間の状態を保持し、メッセージトピックを使用してメッセージの入力を判別する必要があります。
このようなもの:
context.temp = context.temp || 0.0;
context.smoke = context.smoke || false;
if (msg.topic === 'smokeDetector') {
context.smoke = msg.payload;
} else if (msg.topic === 'tempSensor') {
context.temp = msg.payload;
}
if (context.temp >= 70.0 && context.smoke) {
return {topic: 'fireState', payload: 'FIRE!'}
} else {
return null
}
詳細は関数ノードのドキュメント here を参照してください
任意のノードに任意の数の入力を配線できます。ただし、ノードが一度に1つの入力メッセージしか表示しないことに注意してください。複数の入力ワイヤがあるというだけの理由で、固有のメッセージ集約はありません。
代わりに、複数の入力メッセージを集約するタスクは、特定のノードによって処理されます。それらのノードのいくつかは、コアノードの赤のサーバーに組み込まれており、一部はコミュニティによって提供されています。どちらを選択するかは、特定のユースケースによって異なります。たとえば、2つのオブジェクトを配列に追加するか、1つの大きなオブジェクトにマージする必要がありますか?あなただけがあなたが何を望んでいるかを知っています-node-redは何の仮定もしませんが、多くの一般的なユースケースを処理するための異なるノードを提供します。その他のユースケースでは、常に汎用のfunction
ノードがあり、JavaScriptを使用して必要な動作を実装できます。
元の質問では、異なるセンサーからの2つのペイロードを1つのオブジェクトにマージする方法を探しています。 フローライブラリ にあるnode-red-contrib-bool-gate
およびnode-red-contrib-aggregator
ノードと同様に、コアjoin
およびchange
ノードをそのために使用できます。地点。
join
ノードを使用して2つのセンサー入力を組み合わせ、次にswitch
ノードを式payload.temp > 70 and payload.smoke
とともに使用して、メッセージをフローに送信するかどうかを決定する例を次に示します。
[
{
"id": "87df68f8.51ad58",
"type": "inject",
"z": "f9a2eec9.c2e26",
"name": "",
"topic": "smoke",
"payload": "true",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 160,
"y": 1180,
"wires": [
[
"da4182a8.47939"
]
]
},
{
"id": "3ad419ec.1453a6",
"type": "inject",
"z": "f9a2eec9.c2e26",
"name": "",
"topic": "smoke",
"payload": "false",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 170,
"y": 1140,
"wires": [
[
"da4182a8.47939"
]
]
},
{
"id": "a45b3cb0.f3312",
"type": "inject",
"z": "f9a2eec9.c2e26",
"name": "",
"topic": "temp",
"payload": "65",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 160,
"y": 1220,
"wires": [
[
"da4182a8.47939"
]
]
},
{
"id": "a3b07d81.e6b17",
"type": "inject",
"z": "f9a2eec9.c2e26",
"name": "",
"topic": "temp",
"payload": "75",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 160,
"y": 1260,
"wires": [
[
"da4182a8.47939"
]
]
},
{
"id": "da4182a8.47939",
"type": "join",
"z": "f9a2eec9.c2e26",
"name": "join payloads",
"mode": "custom",
"build": "object",
"property": "payload",
"propertyType": "msg",
"key": "topic",
"joiner": "\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "2",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 430,
"y": 1200,
"wires": [
[
"315c9ce3.570d64",
"50f981b4.be654"
]
]
},
{
"id": "315c9ce3.570d64",
"type": "switch",
"z": "f9a2eec9.c2e26",
"name": "Trigger Alarm?",
"property": "payload.temp > 70 and payload.smoke",
"propertyType": "jsonata",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 640,
"y": 1200,
"wires": [
[
"50f981b4.be654"
]
]
},
{
"id": "50f981b4.be654",
"type": "debug",
"z": "f9a2eec9.c2e26",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"x": 690,
"y": 1260,
"wires": [
]
}
]
Join Node を使用し、モードを手動に設定してその configuration を変更し、固定数のメッセージを2として使用できます。両方の入力を受信したら、次の関数を呼び出すことができますノード。結合ノードは、両方のペイロードを配列またはオブジェクトとして組み合わせることができます。そして、最後の関数コードで、条件を確認した後、結合したデータをMQTTに送信できます。