How to save writing with if and else in function node

Hello, I am sending you sample code.
I am not at all experienced in this field.
My question is, is there a way to abbreviate this?
Greetings.


//solar pump to pool on,off
var slrpool_on = { payload: 1};
var slrpool_off = { payload: 0};

//solar pump to boiler on,off
var slrboiler_on = { payload: "on"};
var slrboiler_off = { payload: "off"};

//conditions

//1
if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online"){
return [slrboiler_on, slrpool_off];
}

//2
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_on];
}

//3
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_off];
}

//4 ..?
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online"){
return [slrboiler_on, slrpool_off];
}

//5
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_on];
}

//6
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_off];
}

//7..?
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_on];
}

//8
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online"){
return [slrboiler_off, slrpool_off];
}

//9
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_on];
}

//10
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_on];
}

//11
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_on];
}

//12
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_off];
}

//13
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_on];
}

//14
else if (msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_off];
}

//15
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_off];
}

//16
else if (msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline"){
return [slrboiler_off, slrpool_off];
}

//else {
//return [slrboiler_off, slrpool_off];
//}

You could try:

//solar pump to pool on,off
var slrpool_on = { payload: 1 };
var slrpool_off = { payload: 0 };

//solar pump to boiler on,off
var slrboiler_on = { payload: "on" };
var slrboiler_off = { payload: "off" };

//conditions
// group 1
if ((msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online")) {
    return [slrboiler_on, slrpool_off];
};
// group 2
else if ((msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "offline")) {
    return [slrboiler_off, slrpool_on];
};
// group 3
else if ((msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "on" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "online")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "on" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "on" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline")||(msg.payload.setboiler == "off" && msg.payload.solarboiler == "off" && msg.payload.solarpool == "off" && msg.payload.D1_mini == "offline")) {
    return [slrboiler_off, slrpool_off];
};

Thanks for the reply, but it seems to me that this is the same thing written in three lines?

Here is another way you could do it. You are dealing with a truth table, using abbreviations where
setboiler will be bb,
solarboiler will be sb
solarpool will be sp
D1_mini will be dm
you would have

bb sb sp sm - result
 0  0  0  0     0  
 0  0  0  1     1  
 0  0  1  0     2  
 0  0  1  1     3  
 0  1  0  0     4  
 0  1  0  1     5  
 0  1  1  0     6  
 0  1  1  1     7  
 1  0  0  0     8  
 1  0  0  1     9  
 1  0  1  0    10  
 1  0  1  1    11  
 1  1  0  0    12  
 1  1  0  1    13  
 1  1  1  0    14  
 1  1  1  1    15 

so bb will be 8 or 0
sb will be 4 or 0
sp will be 2 or 0
d1 will be 1 or 0
You code use some if's test and a switch like this

let bb = o
let sb = 0;
let sp = 0;
let d1 = 0;
let t = 0;

if (msg.payload.setboiler == "on") bb = 8;
if (msg.payload.solarboiler == "on") sb = 4; 
if (msg.payload.solarpool == "on") sp = 2;
if (msg.payload.D1_mini == "online") d1 = 1;

t = bb + sb + sp + d1;

switch (d1) {
    case 0:
       return [slrboiler_off, slrpool_off];
       break;
    case 1:
       return [slrboiler_off, slrpool_off];
       break;
    case 2:
.
.
.
}

I'll let you fill in the rest

2 Likes

Absolutely true, but I did it in the spreadsheet after this writing function based on the table.
How to do it in Node red?

Do you mean to shorten the speeches?

Sorry I hit 'enter' as I was typing, see my last post now.

Smells like success to me, but where is case 0?

Case 0 is with everything off (d1 is offline) - first case condition in the switch - so you would have case 0 thru case 15 in switch code.

Remember t is set to 0 and it all the others are off, they will all be 0 and when you add four 0's together you get 0 :rofl:

Please write me case 1 and 2, I will finish the rest. I'm not good with syntax at all.
Greetings.

you could try a different method, convert the payloads to a string then lookup outputs.
e.g.

[{"id":"1c2e2d6f.a1c5cb","type":"inject","z":"30af2d3e.d94ea2","name":"1111","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"setboiler\":\"on\",\"solarboiler\":\"on\",\"solarpool\":\"on\",\"D1_mini\":\"online\"}","payloadType":"json","x":130,"y":680,"wires":[["1c152d73.923a03"]]},{"id":"1c152d73.923a03","type":"function","z":"30af2d3e.d94ea2","name":"","func":"const bools = (msg.payload.setboiler === \"on\" ? \"1\" : \"0\") +\n    (msg.payload.solarboiler === \"on\" ? \"1\" : \"0\") +\n    (msg.payload.solarpool == \"on\" ? \"1\" : \"0\") +\n    (msg.payload.D1_mini == \"online\" ? \"1\" : \"0\");\n//node.warn(bools);\nconst bool_pool = {\n        \"1111\": [1,\"off\"], \n        \"1101\": [1,\"off\"],\n        \"0111\": [0,\"on\"],\n        \"0011\": [0,\"on\"],\n        \"0101\": [0,\"on\"],\n        \"1110\": [0,\"on\"],\n        \"0110\": [0,\"on\"],\n        \"1010\": [0,\"on\"],\n        \"0010\": [0,\"on\"],\n        \"1011\": [0,\"off\"],\n        \"1001\": [0,\"off\"],\n        \"0001\": [0,\"off\"],\n        \"1100\": [0,\"off\"],\n        \"1000\": [0,\"off\"],\n        \"0100\": [0,\"off\"],\n        \"0000\": [0,\"off\"]\n};\nconst outputs = bool_pool[bools]\nif(outputs){\n    return [{ payload: outputs[0]}, { payload: outputs[1]}];\n}\n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":680,"wires":[["c75be667.e7b968"],["c75be667.e7b968"]]},{"id":"87e4889a.2508c8","type":"inject","z":"30af2d3e.d94ea2","name":"1011","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"setboiler\":\"on\",\"solarboiler\":\"off\",\"solarpool\":\"on\",\"D1_mini\":\"online\"}","payloadType":"json","x":130,"y":720,"wires":[["1c152d73.923a03"]]},{"id":"c75be667.e7b968","type":"debug","z":"30af2d3e.d94ea2","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":600,"y":660,"wires":[]}]
//create lookup string eg "1111"
const bools = (msg.payload.setboiler === "on" ? "1" : "0") +
    (msg.payload.solarboiler === "on" ? "1" : "0") +
    (msg.payload.solarpool == "on" ? "1" : "0") +
    (msg.payload.D1_mini == "online" ? "1" : "0");
// lookup table of outputs
const bool_pool = {
        "1111": [1,"off"], 
        "1101": [1,"off"],
        "0111": [0,"on"],
        "0011": [0,"on"],
        "0101": [0,"on"],
        "1110": [0,"on"],
        "0110": [0,"on"],
        "1010": [0,"on"],
        "0010": [0,"on"],
        "1011": [0,"off"],
        "1001": [0,"off"],
        "0001": [0,"off"],
        "1100": [0,"off"],
        "1000": [0,"off"],
        "0100": [0,"off"],
        "0000": [0,"off"]
};
// lookup outputs
const outputs = bool_pool[bools]
//output if outputs finds a result
if(outputs){
    return [{ payload: outputs[0]}, { payload: outputs[1]}];
}

case 2 would be your code

else if (msg.payload.setboiler == "off" &&    // ss = 0
         msg.payload.solarboiler == "off" &&  // sb = 0
         msg.payload.solarpool == "on" &&     // sp = 1
         msg.payload.D1_mini == "offline")    // d1 = 0   binary 0010 = 2
   { return [slrboiler_off, slrpool_on];      

so it would be

    case 2:
       return [slrboiler_off, slrpool_on];
       break;
let bb = 0;
let sb = 0;
let sp = 0;
let d1 = 0;
let t = 0;

if (msg.payload.setboiler == "on") bb = 8;
if (msg.payload.solarboiler == "on") sb = 4;
if (msg.payload.solarpool == "on") sp = 2;
if (msg.payload.D1_mini == "online") d1 = 1;

t = bb + sb + sp + d1;

switch (d1) {
    case 0:
        return [slrboiler_off, slrpool_off];
        break;
    case 1:
        return [slrboiler_off, slrpool_off];
        break;
    case 2: 
        return [slrboiler_off, slrpool_on];
        break;
.
.
.
}

Sorry, I don't understand something.

my bad that code was confusing to look at. Here this should help you out:

if (setboiler == "1" && solarboiler == "1" && solarpool == "1" && D1_mini == "1") - case 0  - {return [slrboiler_on, slrpool_off];
if (setboiler == "0" && solarboiler == "1" && solarpool == "1" && D1_mini == "1") - case 1  - {return [slrboiler_off, slrpool_on];
if (setboiler == "1" && solarboiler == "0" && solarpool == "1" && D1_mini == "1") - case 2  - {return [slrboiler_off, slrpool_off];
if (setboiler == "1" && solarboiler == "1" && solarpool == "0" && D1_mini == "1") - case 3  - {return [slrboiler_on, slrpool_off];
if (setboiler == "0" && solarboiler == "0" && solarpool == "1" && D1_mini == "1") - case 4  - {return [slrboiler_off, slrpool_on];
if (setboiler == "1" && solarboiler == "0" && solarpool == "0" && D1_mini == "1") - case 5  - {return [slrboiler_off, slrpool_off];
if (setboiler == "0" && solarboiler == "1" && solarpool == "0" && D1_mini == "1") - case 6  - {return [slrboiler_off, slrpool_on];
if (setboiler == "0" && solarboiler == "0" && solarpool == "0" && D1_mini == "1") - case 7  - {return [slrboiler_off, slrpool_off];
if (setboiler == "1" && solarboiler == "1" && solarpool == "1" && D1_mini == "0") - case 8  - {return [slrboiler_off, slrpool_on];
if (setboiler == "0" && solarboiler == "1" && solarpool == "1" && D1_mini == "0") - case 9  - {return [slrboiler_off, slrpool_on];
if (setboiler == "1" && solarboiler == "0" && solarpool == "1" && D1_mini == "0") - case 10  - {return [slrboiler_off, slrpool_on];
if (setboiler == "1" && solarboiler == "1" && solarpool == "0" && D1_mini == "0") - case 11  - {return [slrboiler_off, slrpool_off];
if (setboiler == "0" && solarboiler == "0" && solarpool == "1" && D1_mini == "0") - case 12  - {return [slrboiler_off, slrpool_on];
if (setboiler == "1" && solarboiler == "0" && solarpool == "0" && D1_mini == "0") - case 13  - {return [slrboiler_off, slrpool_off];
if (setboiler == "0" && solarboiler == "1" && solarpool == "0" && D1_mini == "0") - case 14  - {return [slrboiler_off, slrpool_off];
if (setboiler == "0" && solarboiler == "0" && solarpool == "0" && D1_mini == "0") - case 15  - {return [slrboiler_off, slrpool_off];

here are the cases and what gets returned:

case 0  - {return [slrboiler_on, slrpool_off];
case 1  - {return [slrboiler_off, slrpool_on];
case 2  - {return [slrboiler_off, slrpool_off];
case 3  - {return [slrboiler_on, slrpool_off];
case 4  - {return [slrboiler_off, slrpool_on];
case 5  - {return [slrboiler_off, slrpool_off];
case 6  - {return [slrboiler_off, slrpool_on];
case 7  - {return [slrboiler_off, slrpool_off];
case 8  - {return [slrboiler_off, slrpool_on];
case 9  - {return [slrboiler_off, slrpool_on];
case 10  - {return [slrboiler_off, slrpool_on];
case 11  - {return [slrboiler_off, slrpool_off];
case 12  - {return [slrboiler_off, slrpool_on];
case 13  - {return [slrboiler_off, slrpool_off];
case 14  - {return [slrboiler_off, slrpool_off];
case 15  - {return [slrboiler_off, slrpool_off];

I'm lost in this code.
Can you just the beginning and end of the code of this in the middle I will describe it.I think that's the same thing I do. the bad thing is that I have to add another condition that multiplies the writing!
Greetings.

this is not the code for the switch, it's showing you the condition. For example this
case 7 - {return [slrboiler_off, slrpool_off];
in the code would be

    case 7:
        return [slrboiler_off, slrpool_off];
        break;

and you can combine cases, so looking at your conditions and results, case 2, 5, 7, 11, 13, 14 and 15 all return off, off so you could code

    case 2:
    case 5:
    case 7:
    case 11:
    case 13:
    case 14:
    case 15:
        return [slrboiler_off, slrpool_off];
        break;

it also loooks like case 0 and 3 are the same results and cases 1, 4, 6, 8 ,9, 10 and 12 return the same result so the

Please send me the code with beginning and end and something in between. I will try to do the rest myself.

If you go back to the code I originally gave you, just replace everything in the switch between the { and the } with what I just posted.

Unfortunately, what I'm trying to do is probably impossible. This topic includes if else. My problem is like in chess.
In the first field one grain of rice, in the second field two grains of rice, and so on up to 64. If I want to include another condition, the matrix increases by another N per number of rows!

If I want to add two more items?
(msg.payload.solarboiler === "on" ? "1" : "0")
like
(msg.payload.solarboiler === "nothing" ? "1" : "?")