In Javascript (функция node-red)
Я устанавливаю день недели и время дня, и вывод должен быть истинным или ложным. Я хочу рассчитать это каждую минуту дня.
Мой сценарий работает до тех пор, пока время начала находится перед временем окончания в тот же день (скажем, в понедельник), но мне нужна помощь, когда время начала в понедельник в 23:38 и заканчивается во вторник 10: 40.
// For testing setting time and day (will be generated by flow elswhere in production)
var houront = 11;
var minont = 37;
var hourofft = 12;
var minofft = 39;
var mont = 1;
var tuet = 0;
var wedt = 0;
var thut = 0;
var frit = 0;
var satt = 0;
var sunt = 0;
flow.set("houron", houront);
flow.set("minon", minont);
flow.set("houroff", hourofft);
flow.set("minoff", minofft);
flow.set("mon", mont);
flow.set("tue", tuet);
flow.set("wed", wedt);
flow.set("thu", thut);
flow.set("fri", frit);
flow.set("sat", satt)
flow.set("sun", sunt)
// turn flow on and off
var run = context.get('state') || false;
if (msg.topic.toLowerCase() === 'control') {
run = !run;
}
context.set('state',run);
node.status({ fill: run ? 'green' : 'red' });
var msgToSend = null;
loop();
return null;
function loop() {
if (context.get('state')) {
//Calculate the time to send - delay and time now in hours (message to be send on the minute, so no reboot or re deploy the time for the message is on the min)
msg.timestamp = Math.round(+new Date());
var time = new Date(msg.timestamp);
var sec = time.getSeconds();
var min = time.getMinutes();
var hour = time.getHours();
var day = time.getDay();
var timenow = hour * 60 + min;
let delay = 60 - sec;
var onorofff = 60 - sec;
//Calculate time on and off
var houron = flow.get("houron");
var minon = flow.get("minon");
var houroff = flow.get("houroff");
var minoff = flow.get("minoff");
var timeon = houron * 60 + minon;
var timeoff = houroff * 60 + minoff;
//Calculate day
var mon = flow.get("mon");
var tue = flow.get("tue");
var wed = flow.get("wed");
var thu = flow.get("thu");
var fri = flow.get("fri");
var sat = flow.get("sat");
var sun = flow.get("sun");
if (timeon < timeoff) {
if (timenow >= timeon && timenow < timeoff) {
timegiop = 1;
} else {
timegiop = 0;
}
switch (day) {
case 0:
if (sun == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
case 1:
if (mon == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
case 2:
if (tue == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
case 3:
if (wed == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
case 4:
if (thu == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
case 5:
if (fri == 1) {
daygiop = 1;
} else {
daygiop=0;
}
break;
case 6:
if (sat == 1) {
daygiop = 1;
} else {
daygiop = 0;
}
break;
}
} else {
daygiop = 0;
}
onoroffgiop = daygiop * timegiop;
msg.payload = onoroffgiop;
msgToSend = msg;
node.send(msgToSend);
setTimeout(loop,1000 * delay);
node.status({ fill:'green', text:delay.toFixed(2) });
}
}