Java Script (функция node-red) - определите, находится ли время между двумя установленными временами (с днем ​​недели) - PullRequest
0 голосов
/ 20 апреля 2020

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) });
  }
}
...