How to repeat script x times in node red function node?

I have working script for function node:

var service1 = ("service1", "ir_bathroom_light_dimm_up");
var service2 = ("service2", "ir_bathroom_light_dimm_down");
var domain1 = ("domain1", "script");



 if (msg.payload === 1){
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    node.log("1");
 }
 
  if (msg.payload === 2){
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    node.log("2");
 }
 
   if (msg.payload === 3){
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    node.log("3");
 }
 
    if (msg.payload === 4){
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service1,
    };
    node.send(msg);
    node.log("4");
 }
 
 
  if (msg.payload === -1){
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    node.log("1");
 }
 
  if (msg.payload === -2){
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    node.log("2");
 }
 
   if (msg.payload === -3){
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    node.log("3");
 }
 
    if (msg.payload === -4){
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    
    msg.payload = {
    domain: domain1,
    service: service2,
    };
    node.send(msg);
    node.log("4");
 }

Anyone know how to make this code shorter with with while sentence?

const payload = msg.payload;
const up = 'ir_bathroom_light_dimm_up';
const down = 'ir_bathroom_light_dimm_down';

const service = Math.sign(payload) >= 0 ? up : down;
const count = Math.abs(payload);

msg.payload = {
  domain: 'script',
  service: service,
};

for (let i = 1; i <= count; i++) {
  node.send(msg);
  node.log(i);
}
1 Like

Thanks @Kermit

I will try it :slight_smile:

Code works thanks.

Another question:
How I can limit count to the slider if I add msg.data.new_state.state and msg.data.old_state.state to message from input_number.ir_bathroom_light_dimm?

arrive message to function node looks like this:

payload is difference between new and old state, here is the math for payload:
(msg.data.new_state.state - msg.data.old_state.state)/10

just change the first line to

const payload = (msg.data.new_state.state - msg.data.old_state.state)/10;
1 Like

Now is working correctly. Thanks

Another question:

Can I add somehow in this script if payload is equal to 0 to call script ir_bathroom_light_off, when last dimm down is called?

if(Number(msg.payload) === 0) {
  msg.payload = {
    domain: 'script',
    service: 'ir_bathroom_light_off',
  };
  return msg;  
}

add to the top

Code is working :slight_smile: but not like I would like:

I would like to light first dimm down and then turn off.

Thx for help :slight_smile: