web-dev-qa-db-ja.com

Node-REDで2つの入力を実装する

私の現在のプロジェクトでは、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は提供しないことを確認しました。

enter image description here

7
Pankesh

関数ノードを使用し、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 を参照してください

15
hardillb

任意のノードに任意の数の入力を配線できます。ただし、ノードが一度に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": [

    ]
  }
]
1
SteveR

Join Node を使用し、モードを手動に設定してその configuration を変更し、固定数のメッセージを2として使用できます。両方の入力を受信したら、次の関数を呼び出すことができますノード。結合ノードは、両方のペイロードを配列またはオブジェクトとして組み合わせることができます。そして、最後の関数コードで、条件を確認した後、結合したデータをMQTTに送信できます。