web-dev-qa-db-fra.com

Implémentation de deux entrées dans Node-RED

Dans mon projet actuel, nous essayons d'implémenter la fonctionnalité d'application actuelle à l'aide de Node-RED . La fonctionnalité est indiquée ci-dessous. Ici, l'état Feu reçoit deux entrées: (1) TemperatureSensor (2) SmokeDetector. Les deux capteurs publient des données à l'aide d'éditeurs MQTT. et le composant Firestate peut recevoir des données via le sous-fournisseur MQTT. 

L'état d'incendie peut produire une sortie basée sur ces deux paramètres, à savoir if temperaturevalue > 70 and Smokevalue == true. Dans cette perspective, ma question est la suivante - Node-RED prend-il en charge la fonctionnalité des deux entrées? Si oui, comment pouvons-nous implémenter cette fonctionnalité? Si non, alors .. Puis-je dire que la fonctionnalité à deux entrées ne peut pas être implémentée avec Node-RED ???? Comme nous l'avons vu, Node-RED fournit plusieurs sorties, mais pas des entrées

 enter image description here

6
Pankesh

Vous devrez utiliser un nœud de fonction et utiliser la variable context pour conserver l'état entre les messages et utiliser la rubrique de message pour déterminer l'origine du message.

Quelque chose comme ça:

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
}

Plus de détails peuvent être trouvés dans la fonction doc node here

13
hardillb

Vous pouvez connecter n'importe quel nombre d'entrées à n'importe quel nœud - sachez que votre nœud ne verra qu'un message d'entrée à la fois. Il n'y a pas d'agrégation de msg inhérente simplement parce qu'il y a plusieurs fils d'entrée.

Au lieu de cela, la tâche d'agrégation de plusieurs messages d'entrée est gérée par certains nœuds, dont certains sont intégrés au serveur de nœud rouge principal et d'autres à la contribution de la communauté. Lequel vous devriez choisir dépendra du cas d'utilisation spécifique. Par exemple, deux objets doivent-ils être ajoutés à un tableau ou fusionnés en un seul grand objet? Seul vous saurez ce que vous voulez - node-red ne fait aucune supposition, mais vous donne différents nœuds pour gérer de nombreux cas d'utilisation courants. Dans tous les autres cas d'utilisation, il existe toujours le noeud générique function dans lequel vous pouvez utiliser javascript pour implémenter le comportement dont vous avez besoin.

Pour votre question initiale, vous recherchez un moyen de fusionner deux charges utiles de différents capteurs en un seul objet. Les nœuds de base join et change peuvent être utilisés à cet effet, de même que les nœuds node-red-contrib-bool-gate et node-red-contrib-aggregator, situés dans le répertoire flow library site.

Voici un exemple de combinaison de deux entrées de capteur utilisant le noeud join, puis utilisant un noeud switch avec l'expression payload.temp > 70 and payload.smoke pour déterminer si le message doit être envoyé dans le flux:

[{"id": "87df68f8.51ad58", "type": "injecter", "z": "f9a2eec9.c2e26", "nom": "", "sujet": "fumée", "charge utile": " true "," payloadType ":" bool "," repeat ":" "," crontab ":" "," once ": false," onceDelay ": 0.1," x ": 160," y ": 1180," fils ": [[" "da4182a8.47939"]]}, {"id": "3ad419ec.1453a6", "type": "injecter", "z": "f9a2eec9.c2e26", "nom": "", "topic": "smoke", "payload": "false", "payloadType": "bool", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "x": 170, "y": 1140, "fils": [["da4182a8.47939"]]}, {"id": "a45b3cb0.f3312", "type": "injecter", "z": "f9a2eec9.c2e26", "name": "", "topic": "temp", "charge utile": "65", "payloadType": "num", "repeat": "", "crontab": "" , "once": false, "onceDelay": 0.1, "x": 160, "y": 1220, "fils": [["da4182a8.47939"]]}, {"id": "a3b07d81.e6b17" , "type": "injecter", "z": "f9a2eec9.c2e26", "name": "", "topic": "temp", "payload": "75", "payloadType": "num", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "x": 160, "y": 1260, "fils": [["da4182a8.47939"] ]}, {"id": "da4182a8.47939", "type": "join", "z": "f9a2eec9.c2e26", "name": "rejoindre les données utiles", "mode": "custom", " construire" : "objet", "propriété": "charge utile", "propriétéType": "msg", "clé": "rubrique", "menuisier": "\ n", "joinerType": "str", "accumuler": true, "timeout": "", "count": "2", "reductionRight": false, "reductionExp": "", "reductionInit": "", "reductionInitType": "", "reductionFixup": "" , "x": 430, "y": 1200, "fils": [["315c9ce3.570d64", "50f981b4.be654"]]}, {"id": "315c9ce3.570d64", "type": " switch "," z ":" f9a2eec9.c2e26 "," name ":" Alarme de déclenchement? "," propriété ":" payload.temp> 70 et payload.smoke "," propertyType ":" jsonata "," règles " : [{"t": "true"}], "checkall": "true", "repair": false, "sorties": 1, "x": 640, "y": 1200, "fils": [ ["50f981b4.be654"]]}, {"id": "50f981b4.be654", "type": "débogage", "z": "f9a2eec9.c2e26", "nom": "", "actif": true, "tosidebar": true, "console": false, "tostatus": false, "complet": "false", "x": 690, "y": 1260, "fils": []}]

0
SteveR

Nous pouvons utiliser Join Node et changer sa configuration en définissant le mode sur manuel et utiliser un nombre fixe de messages égal à 2. Ensuite, une fois que les deux entrées sont reçues, vous pouvez appeler le prochain nœud de fonction. Le noeud Join peut combiner les deux données utiles en tant que tableau ou objet. Ensuite, dans le dernier code de fonction, vous pouvez envoyer les données combinées à MQTT après avoir vérifié votre état.

0