Function with a lot of output?


#1

Hello everyone .
I have a function with 88 outputs.

the source comes from a modbus output as an array.
in the function I insert a topic on each value.

is there a simpler way to do this?

var x1 = { payload: msg.payload.data[0]/2}; /*var x   = { payload: msg.payload.data[]};*/
var x2 = { payload: msg.payload.data[1]};
var x3 = { payload: msg.payload.data[2]/2};
var x4 = { payload: msg.payload.data[3]/10};
var x5 = { payload: msg.payload.data[4]};
var x6 = { payload: msg.payload.data[5]/2};
var x7 = { payload: msg.payload.data[6]};
var x8 = { payload: msg.payload.data[7]};
var x9 = { payload: msg.payload.data[8]};
var x10 = { payload: msg.payload.data[9]};
var x11 ={  payload: msg.payload.data[10]};
var x12 = { payload: msg.payload.data[11]};
var x13 = { payload: msg.payload.data[12]};
var x14 = { payload: msg.payload.data[13]};
var x15 = { payload: msg.payload.data[14]};
var x16 = { payload: msg.payload.data[15]};
var x17 = { payload: msg.payload.data[16]};
var x18 = { payload: msg.payload.data[17]};
var x19 = { payload: msg.payload.data[18]};
var x20 = { payload: msg.payload.data[19]};
var x21 = { payload: msg.payload.data[20]};
var x22 = { payload: msg.payload.data[21]};
var x23 = { payload: msg.payload.data[22]};
var x24 =  { payload: msg.payload.data[23]};
var x25 = { payload: msg.payload.data[24]};
var x26 = { payload: msg.payload.data[25]};
var x27 = { payload: msg.payload.data[26]};
var x28 = { payload: msg.payload.data[27]};
var x29 = { payload: msg.payload.data[28]};
var x30 = { payload: msg.payload.data[29]};
var x31 = { payload: msg.payload.data[30]};
var x32   = { payload: msg.payload.data[31]};
var x33  = { payload: msg.payload.data[32]};
var x34   = { payload: msg.payload.data[33]};
var x35   = { payload: msg.payload.data[34]};
var x36   = { payload: msg.payload.data[35]};
var x37   = { payload: msg.payload.data[36]};
var x38   = { payload: msg.payload.data[37]};
var x39   = { payload: msg.payload.data[38]};
var x40   = { payload: msg.payload.data[39]};
var x41   = { payload: msg.payload.data[40]};
var x42   = { payload: msg.payload.data[41]};
var x43   = { payload: msg.payload.data[42]};
var x44   = { payload: msg.payload.data[43]};
var x45   = { payload: msg.payload.data[44]};
var x46   = { payload: msg.payload.data[45]};
var x47   = { payload: msg.payload.data[46]};
var x48   = { payload: msg.payload.data[47]};
var x49   = { payload: msg.payload.data[48]};
var x50   = { payload: msg.payload.data[49]};
var x51   = { payload: msg.payload.data[50]};
var x52   = { payload: msg.payload.data[51]};
var x53   = { payload: msg.payload.data[52]};
var x54   = { payload: msg.payload.data[53]};
var x55   = { payload: msg.payload.data[54]};
var x56   = { payload: msg.payload.data[55]};
var x57   = { payload: msg.payload.data[56]};
var x58   = { payload: msg.payload.data[57]};
var x59   = { payload: msg.payload.data[58]};
var x60   = { payload: msg.payload.data[59]};
var x61   = { payload: msg.payload.data[60]};
var x62   = { payload: msg.payload.data[61]};
var x63   = { payload: msg.payload.data[62]};
var x64   = { payload: msg.payload.data[63]};
var x65   = { payload: msg.payload.data[64]};
var x66   = { payload: msg.payload.data[65]};
var x67   = { payload: msg.payload.data[66]};
var x68   = { payload: msg.payload.data[67]};
var x69   = { payload: msg.payload.data[68]};
var x70   = { payload: msg.payload.data[69]};
var x71   = { payload: msg.payload.data[70]};
var x72   = { payload: msg.payload.data[71]};
var x73   = { payload: msg.payload.data[72]};
var x74   = { payload: msg.payload.data[73]};
var x75   = { payload: msg.payload.data[74]};
var x76   = { payload: msg.payload.data[75]};
var x77   = { payload: msg.payload.data[76]};
var x78   = { payload: msg.payload.data[77]};
var x79   = { payload: msg.payload.data[78]};
var x80   = { payload: msg.payload.data[79]};
var x81   = { payload: msg.payload.data[80]};
var x82   = { payload: msg.payload.data[81]};
var x83   = { payload: msg.payload.data[82]};
var x84   = { payload: msg.payload.data[83]};
var x85   = { payload: msg.payload.data[84]};
var x86   = { payload: msg.payload.data[85]};
var x87   = { payload: msg.payload.data[86]};
var x88   = { payload: msg.payload.data[87]};
var x89   = { payload: msg.payload.data[88]};

x1.topic = "Tp4"; /* x.topic = " ";*/
x2.topic = "Tfumé";
x3.topic = "Tconsol";
x4.topic = "O2r"; 
x5.topic = "posclapO2P";
x6.topic = "posclapO2S";
x7.topic = " vitesse ventilateur";
x8.topic = "sonde1 ";
x9.topic = " temp de fumée conden";
x10.topic = " sonde retour";
x11.topic = " m/s ouverture aspi";
x12.topic = " air primaire";
x13.topic = " commande du tirage";
x14.topic = " air secondaire";
x15.topic = " reglage P chaudière";
x16.topic = " consigne fumée";
x17.topic = " regulateur O2";
x18.topic = " temp module pellets";
x19.topic = " temp O2 aspiration";
x20.topic = " A vis extraction";
x21.topic = " heures de fonctionement";
x22.topic = " reserve journaliere pellets";
x23.topic = " nbs demarage bruleur";
x24.topic = " s4 demarage bruleur";
x25.topic = " H de fonctionement maintien du feu";
x26.topic = " alimentation";
x27.topic = " regul d alimentation";
x28.topic = " consigne chaudière";
x29.topic = " sonde accu bas solaire";
x30.topic = " A vis alimentation";
x31.topic = " A ecluse a roue cellulaire";
x32.topic = " stroker";
x33.topic = " dépression du foyer";
x34.topic = " pos moteur tiroir";
x35.topic = "pos moteur grille ";
x36.topic = "regul corection alim ";
x37.topic = " commande des pompes de retour";
x38.topic = " ventil air de combustion";
x39.topic = " ventil air de combustion 2";
x40.topic = " h fonc stroker";
x41.topic = " h fonc vis alim";
x42.topic = " h fonc roue celulaire";
x43.topic = " h fonc vibreur";
x44.topic = " cycles de fonc grille basculante";
x45.topic = " h fonc WOS";
x46.topic = " h vis descendrage";
x47.topic = " h fonc allumage";
x48.topic = " h fonc sonde lambda";
x49.topic = " h fonc turbine aspi";
x50.topic = " h fonc vis extraction";
x51.topic = " cycle aeration secu";
x52.topic = " h fonc tirage";
x53.topic = " cycle fonc clapet coupe feu";
x54.topic = " deplacement du clapet tiroir";
x55.topic = " V sonde lambda";
x56.topic = " h depuis derniere maintenance";
x57.topic = " requet via ecs hk";
x58.topic = " refroidissement foyer par air secondaire";
x59.topic = " alim limiter sur maxi";
x60.topic = " augmentation P par regul foyer";
x61.topic = " pompe prélévement";
x62.topic = " V sonde lambda coriger";
x63.topic = " h fonc pellets";
x64.topic = " h en mode chauffer";
x65.topic = " sonde de la derivation superieur";
x66.topic = " sonde de la derivation inf";
x67.topic = " val consigne retour atteinte";
x68.topic = " vitesse pompe de chargement chaudiére";
x69.topic = " sonde large bande A de chauffage";
x70.topic = " sonde large bande V de chauffage";
x71.topic = " sonde large bande V rendue";
x72.topic = " sonde large bande A pompe";
x73.topic = " slb resistance interne";
x74.topic = " consigne depression";
x75.topic = " h fonc reduit";
x76.topic = "commande du tirage ";
x77.topic = " h fonc buche";
x78.topic = " WOS etat de fonc";
x79.topic = " depression reelle";
x80.topic = " A de la vis1";
x81.topic = " A de la vis2";
x82.topic = " compteur kg a reset";
x83.topic = " compteur T a reset";
x84.topic = " conso totale pellets ";
x85.topic = " rendement quotidien kw";
x86.topic = " rendement totale kw";
x87.topic = " h avant vider cendrier";
x88.topic = " gestion modbus ";


return [x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,
x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,
x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,
x31,x32,x33,x34,x35,x36,x37,x38,x39,x40,
x41,x42,x43,x44,x45,x46,x47,x48,x49,x50,
x51,x52,x53,x54,x55,x56,x57,x58,x59,x60,
x61,x62,x63,x64,x65,x66,x67,x68,x69,x70,
x71,x72,x73,x74,x75,x76,x77,x78,x79,x80,
x81,x82,x83,x84,x85,x86,x87,x88
];

in the absolute I would like to log about 2500 values


#2

Gulp!

Well, you might find it easier to put everything together in an array of objects and then use node.send() inside a loop.

https://nodered.org/docs/writing-functions


#3

What do you do with the messages that leave the function node? Log to a file ? or perhaps display in a dashboard, or maybe build an HTML page, or send to an MQTT node?


#4

Do you really need to send to 88 outputs rather than a sequence of messages on the one output?
If you were to declare a const array containing all the fixed topic strings then you could do the rest in a loop sending a message each time round the loop (or if you do need lots of outputs then push them to the output array then send at the end).


#5

Thank you for your answers.
@ TotallyInformation: thanks for "node.send ()" I'm starting to search on it.

@Andrei: you have found, dashboard, log to a base influx and topic mqtt.

here is a screenshot

the 1st function: request to modbus flex getter node

msg.payload = { value: msg.payload, 'fc': 04, 'unitid': 1, 'address':0, "quantity":100}
return msg;

I am a beginner, and it is not always easy to understand the answers for lack of vocabulary

@ Colin : I will also look in this direction.


#6

Combining what @TotallyInformation and @Colin proposed you will end up with a flow like this one.

The function node would be as simple as they stated:

for (const [index, element] of msg.payload.data.entries()) {
    node.send({"payload" : element, "topic" : msg.toplist[index]})
}
return msg;

Testing flow:

[{"id":"b25351df.63f5","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"37aa5802.71abd8","type":"debug","z":"b25351df.63f5","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":710,"y":100,"wires":[]},{"id":"1c38cd4e.87b5f3","type":"inject","z":"b25351df.63f5","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":100,"wires":[["e94c1d18.09381"]]},{"id":"1a17f4a1.b2f12b","type":"change","z":"b25351df.63f5","name":"Topic List","rules":[{"t":"set","p":"toplist","pt":"msg","to":"[\"Tp4\",\"Tfumé\",\"Tconsol\",\"O2r\",\"posclapO2P\",\"posclapO2S\",\" vitesse ventilateur\",\"sonde1 \",\" temp de fumée conden\",\" sonde retour\",\" m/s ouverture aspi\",\" air primaire\",\" commande du tirage\",\" air secondaire\",\" reglage P chaudière\",\" consigne fumée\",\" regulateur O2\",\" temp module pellets\",\" temp O2 aspiration\",\" A vis extraction\",\" heures de fonctionement\",\" reserve journaliere pellets\",\" nbs demarage bruleur\",\" s4 demarage bruleur\",\" H de fonctionement maintien du feu\",\" alimentation\",\" regul d alimentation\",\" consigne chaudière\",\" sonde accu bas solaire\",\" A vis alimentation\",\" A ecluse a roue cellulaire\",\" stroker\",\" dépression du foyer\",\" pos moteur tiroir\",\"pos moteur grille \",\"regul corection alim \",\" commande des pompes de retour\",\" ventil air de combustion\",\" ventil air de combustion 2\",\" h fonc stroker\",\" h fonc vis alim\",\" h fonc roue celulaire\",\" h fonc vibreur\",\" cycles de fonc grille basculante\",\" h fonc WOS\",\" h vis descendrage\",\" h fonc allumage\",\" h fonc sonde lambda\",\" h fonc turbine aspi\",\" h fonc vis extraction\",\" cycle aeration secu\",\" h fonc tirage\",\" cycle fonc clapet coupe feu\",\" deplacement du clapet tiroir\",\" V sonde lambda\",\" h depuis derniere maintenance\",\" requet via ecs hk\",\" refroidissement foyer par air secondaire\",\" alim limiter sur maxi\",\" augmentation P par regul foyer\",\" pompe prélévement\",\" V sonde lambda coriger\",\" h fonc pellets\",\" h en mode chauffer\",\" sonde de la derivation superieur\",\" sonde de la derivation inf\",\" val consigne retour atteinte\",\" vitesse pompe de chargement chaudiére\",\" sonde large bande A de chauffage\",\" sonde large bande V de chauffage\",\" sonde large bande V rendue\",\" sonde large bande A pompe\",\" slb resistance interne\",\" consigne depression\",\" h fonc reduit\",\"commande du tirage \",\" h fonc buche\",\" WOS etat de fonc\",\" depression reelle\",\" A de la vis1\",\" A de la vis2\",\" compteur kg a reset\",\" compteur T a reset\",\" conso totale pellets \",\" rendement quotidien kw\",\" rendement totale kw\",\" h avant vider cendrier\",\" gestion modbus \"]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":100,"wires":[["54497386.50e0ec"]]},{"id":"e94c1d18.09381","type":"function","z":"b25351df.63f5","name":"mbus","func":"const randomArray = (length, max) => \n  Array(length).fill().map(() => Math.round(Math.random() * max))\n\nmsg.payload = {};\nmsg.payload.data = randomArray(88,100);\nreturn msg;","outputs":1,"noerr":0,"x":250,"y":100,"wires":[["1a17f4a1.b2f12b"]]},{"id":"54497386.50e0ec","type":"function","z":"b25351df.63f5","name":"node.send","func":"for (const [index, element] of msg.payload.data.entries()) {\n    node.send({\"payload\" : element, \"topic\" : msg.toplist[index]})\n}\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":100,"wires":[["37aa5802.71abd8"]]}]