I am hoping for some guidance on how to perform (somewhat) complex math in Node-RED. My current flow that grabs some parameters from SQL and puts them into my strategy looks like this:
I need to perform some complex math using these two values. Specifically, if H4 and H5 are the values being retrieved from SQL, the formula that I want to use to produce a new value is:
Based on the above, I can figure out how to write the formula in msg.payload, but where do I put a function node in my flow? It seems I would need to put it after the two groov write nodes.
When it comes to the math formula I suggest using Math.pow(x,y) to calculate x^y. This method works great in Node-RED and doesn’t rely on any #include statements, which will not work in function nodes as far as I know.
Regarding the flow placement I would try putting a third split from the MSSQL node so that both your PAC Control tags and the Node-RED function are getting the exact same values. It should also help minimize any potential delays:
Thank you. I am now working on building the formula, which means educating myself on the math functions, but I cannot get even the Math.add function to work.
This works:
msg.payload = Math.pow(msg.payload[0].HeatTreatTemperature,2)
return msg;
returning 1750 squared, i.e. the following output
msg.payload : number
3062500
but this does not:
msg.payload = Math.add(2, 3)
return msg;
returns the following output:
function : (error)
“TypeError: Math.add is not a function”
Maybe Node-red does not support this Math.add function?
Regardless, I eventually stumbled onto defining variables, which were quite easy and will make the calculation easier. For example, this works fine:
var a = 1+3
msg.payload = Math.pow(msg.payload[0].HeatTreatTemperature,a)
return msg;
Technically you should be able to do the whole formula in one line, but you’re absolutely right that breaking it down into variables makes long formulas a lot easier to work with. The standard + - * / and Math.pow() function should be all you need here.
I may have gotten the H4 and H5 from your formula backwards, but here’s a quick attempt at what it could look like:
// create shorter references for message properties
temp = msg.payload[0].HeatTreatTemperature;
time = msg.payload[0].HeatTreatTimeInSeconds;
a = (temp-820.7)/(0.0239*time); // part of the numerator
b = (temp-820.7)/(0.0239*time); // part of the denominator
numerator = 3.792 * Math.pow(2.71828, a); // plug in "a"
denominator = 1621.5 + Math.pow(2.71828, b); // plug in "b"
msg.payload = numerator/denominator;
return msg;
Those are great tips! The whole thing came together nicely. The ‘real’ formula is shown below, but CO and COF are constants, so I was able to simplify it a bit. T and E are the SQL values that we are querying to obtain.