Ошибка в скрипте управления по расписанию

Добрый день, управляю wb-mr6c с помощью следующих скриптов

lib_schedules.js


(function(Schedules) { // замыкание

  function todayAt(now, month, day, hours, minutes) {
    var date = new Date(now);
    // i.e. "today, at HH:MM". All dates are in UTC!
    date.setMonth(month-1);
    date.setDate(day);    
    date.setHours(hours);
    date.setMinutes(minutes);
    return date;
  }

  function checkScheduleInterval(now, start_time, end_time) {
    var start_date = todayAt(now, start_time[0], start_time[1], start_time[2], start_time[3]);
    var end_date = todayAt(now, end_time[0], end_time[1], end_time[2], end_time[3]);    
    log("checkScheduleInterval {} {} {}".format(now, start_date, end_date));

    if (end_date >= start_date) {
      if ((now >= start_date) && (now < end_date)) {
        return true;
      }
    } else {
      // end date is less than start date, 
      // assuming they belong to a different days (e.g. today and tomorrow)

      // option 1: what if it's now the day of "end" date?
      // in this case the following is enough:
      if (now < end_date) {
        return true;
      }

      // well, that seems not to be the case. ok,
      // option 2: it's the day of "start" date:

      if (now >= start_date) {
        return true;
      }
    }
    
    return false;

  }

  function checkSchedule(schedule, now) {
    if (now == undefined) {
      now = new Date();
    }

    for (var i = 0; i < schedule.intervals.length; ++i) {
      var item = schedule.intervals[i];
      if (checkScheduleInterval(now, item[0], item[1])) {
        log("found matching schedule interval at {}".format(item));
        return true;
      }
    }
    log("NOT found matching schedule interval at {}".format(item));
    return false;
  }
  
  function updateSingleScheduleDevStatus(schedule) { 
    log("updateSingleScheduleDevStatus {}".format(schedule.name));
    dev["_schedules"][schedule.name] = checkSchedule(schedule);
  };

  function addScheduleDevCronTasks(schedule) {
    for (var i = 0; i < schedule.intervals.length; ++i) {
      var interval = schedule.intervals[i];
      for (var j = 0; j < 2; ++j) { // either start or end of the interval
        var month = interval[j][0]; 
        var date = interval[j][1]; 
        var hours = interval[j][2]; 
        var minutes = interval[j][3];
        log("cron at " + "0 " + minutes + " " + hours + " " + date + " " + month + " *");
        defineRule("_schedule_dev_{}_{}_{}".format(schedule.name, i, j), {
          when: cron("0 " + minutes + " " + hours + " " + date + " " + month + " *"),
          then: function () {
            log("_schedule_dev_ {}_{}_{}".format(schedule.name, i, j));
            updateSingleScheduleDevStatus(schedule);
          }
        });
      }
    }    
  }

  function addScheduleAutoUpdCronTask(schedule) {
    defineRule("_schedule_auto_upd_{}".format(schedule.name), {
      when: cron("@every " + schedule.autoUpdate),
      then: function() {        
        //dev._schedules[schedule.name] = dev._schedules[schedule.name];
      }
    });
  }

  var _schedules = {};

  Schedules.registerSchedule = function(schedule) {
    _schedules[schedule.name] = schedule;
  };

  Schedules.initSchedules = function() {
    var params = {
      title: "Schedule Status", 
      cells: {}
    };

    for (var schedule_name in _schedules) {
      if (_schedules.hasOwnProperty(schedule_name)) {
        var schedule = _schedules[schedule_name];
        params.cells[schedule_name] = {type: "switch", value: false, readonly: true};
      }
    };

    defineVirtualDevice("_schedules", params);


    for (var schedule_name in _schedules) {
      if (_schedules.hasOwnProperty(schedule_name)) {
        var schedule = _schedules[schedule_name];

        // setup cron tasks which updates the schedule dev status at schedule
        //   interval beginings and ends
        addScheduleDevCronTasks(schedule);

        // if needed, setup periodic task to trigger rules which use this schedule
        if (schedule.autoUpdate) {
          addScheduleAutoUpdCronTask(schedule);
        }

        // set schedule dev status as soon as possible at startup
        (function(schedule) {
          setTimeout(function() {
            updateSingleScheduleDevStatus(schedule);
          }, 1);
        })(schedule);

      };
    };
};

})(Schedules);

street_lights_schedule.js

(function() { 
  Schedules.registerSchedule({ // замыкание к1
    "name" : "streetlightsk1", 
    "autoUpdate" : "1m",
    "intervals" : [
      [ [1, 31, 16, 33], [2, 1, 8, 26] ],
      //февраль
      [ [2, 1, 16, 37], [2, 2, 8, 24] ],
      [ [2, 2, 16, 40], [2, 3, 8, 21] ],
      [ [2, 3, 16, 43], [2, 4, 8, 18] ],
      [ [2, 4, 16, 46], [2, 5, 8, 15] ],
      [ [2, 5, 16, 49], [2, 6, 8, 12] ],
      [ [2, 6, 16, 52], [2, 7, 8, 9] ],
      [ [2, 7, 16, 55], [2, 8, 8, 6] ],
      [ [2, 8, 16, 58], [2, 9, 8, 3] ],
      [ [2, 9, 17, 1], [2, 10, 8, 0] ],
      [ [2, 10, 17, 4], [2, 11, 7, 57] ],
      [ [2, 11, 17, 7], [2, 12, 7, 54] ],
      [ [2, 12, 17, 10], [2, 13, 7, 51] ],
      [ [2, 13, 17, 13], [2, 14, 7, 48] ],
      [ [2, 14, 17, 17], [2, 15, 7, 45] ],
      [ [2, 15, 17, 20], [2, 16, 7, 42] ],
      [ [2, 16, 17, 23], [2, 17, 7, 38] ],
      [ [2, 17, 17, 26], [2, 18, 7, 35] ],
      [ [2, 18, 17, 29], [2, 19, 7, 32] ],
      [ [2, 19, 17, 32], [2, 20, 7, 29] ],
      [ [2, 20, 17, 35], [2, 21, 7, 25] ],
      [ [2, 21, 17, 38], [2, 22, 7, 22] ],
      [ [2, 22, 17, 41], [2, 23, 7, 19] ],
      [ [2, 23, 17, 44], [2, 24, 7, 15] ],
      [ [2, 24, 17, 47], [2, 25, 7, 12] ],
      [ [2, 25, 17, 50], [2, 26, 7, 9] ],
      [ [2, 26, 17, 54], [2, 27, 7, 5] ],
      [ [2, 27, 17, 57], [2, 28, 7, 2] ],
      [ [2, 28, 18, 0], [2, 29, 6, 59] ],
      [ [2, 29, 18, 3], [3, 1, 6, 55] ],
      //март
      [ [3, 1, 18, 6], [3, 2, 6, 52] ],
      [ [3, 2, 18, 9], [3, 3, 6, 48] ],
      [ [3, 3, 18, 12], [3, 4, 6, 45] ],
      [ [3, 4, 18, 15], [3, 5, 6, 41] ],
      [ [3, 5, 18, 18], [3, 6, 6, 38] ],
      [ [3, 6, 18, 21], [3, 7, 6, 34] ],
      [ [3, 7, 18, 24], [3, 8, 6, 31] ],
      [ [3, 8, 18, 27], [3, 9, 6, 27] ],
      [ [3, 9, 18, 30], [3, 10, 6, 24] ],
      [ [3, 10, 18, 33], [3, 11, 6, 20] ],
      [ [3, 11, 18, 36], [3, 12, 6, 17] ],
      [ [3, 12, 18, 39], [3, 13, 6, 13] ],
      [ [3, 13, 18, 42], [3, 14, 6, 10] ],
      [ [3, 14, 18, 45], [3, 15, 6, 6] ],
      [ [3, 15, 18, 48], [3, 16, 6, 2] ],
      [ [3, 16, 18, 51], [3, 17, 5, 59] ],
      [ [3, 17, 18, 54], [3, 18, 5, 55] ],
      [ [3, 18, 18, 58], [3, 19, 5, 51] ],
      [ [3, 19, 19, 1], [3, 20, 5, 48] ],
      [ [3, 20, 19, 4], [3, 21, 5, 44] ],
      [ [3, 21, 19, 7], [3, 22, 5, 40] ],
      [ [3, 22, 19, 10], [3, 23, 5, 37] ],
      [ [3, 23, 19, 13], [3, 24, 5, 33] ],
      [ [3, 24, 19, 16], [3, 25, 5, 29] ],
      [ [3, 25, 19, 19], [3, 26, 5, 26] ],
      [ [3, 26, 19, 22], [3, 27, 5, 22] ],
      [ [3, 27, 19, 25], [3, 28, 5, 18] ],
      [ [3, 28, 19, 29], [3, 29, 5, 15] ],
      [ [3, 29, 19, 32], [3, 30, 5, 11] ],
      [ [3, 30, 19, 35], [3, 31, 5, 7] ],
      [ [3, 31, 19, 38], [4, 1, 5, 3] ],
      //апрель
      [ [4, 1, 19, 41], [4, 2, 5, 0] ],
    ]
  });
  
  Schedules.registerSchedule({ // замыкание к2
    "name" : "streetlightsk2", 
    "autoUpdate" : "1m",
    "intervals" : [
           //январь
     // [ [1, 1, 0, 0], [1, 2, 0, 0] ],     
    ]
  });
  Schedules.initSchedules();
  
  // Управление пускателем К1
  defineRule("streetlightsk1OnOff", {
    when: function() {
      return dev._schedules.streetlightsk1 || true;
    },
    then: function (newValue, devName, cellName) {
      if (!timers.pingTimer.firing) {
          log("streetlightsk1OnOff  newValue={}, devName={}, cellName={}", newValue, devName, cellName);
          var on = dev._schedules.streetlightsk1; 
          dev["wb-mr6c/K1"] = on;
      }
    }
  });
  
  // Управление пускателем К2
  defineRule("streetlightsk2OnOff", {
    when: function() {
      return dev._schedules.streetlightsk2 || true;
    },
    then: function (newValue, devName, cellName) {
      if (!timers.pingTimer.firing) {
          log("streetlightsk2OnOff  newValue={}, devName={}, cellName={}", newValue, devName, cellName);
          var on = dev._schedules.streetlightsk2; 
          dev["wb-mr6c/K2"] = on;
      }
    }
  });

})() 

В логах вижу следующие данные:

2024-09-30 11:07:29cron at 0 33 16 31 1 *
2024-09-30 11:07:29cron at 0 26 8 1 2 *
2024-09-30 11:07:29cron at 0 37 16 1 2 *
2024-09-30 11:07:29cron at 0 24 8 2 2 *
2024-09-30 11:07:29cron at 0 40 16 2 2 *
2024-09-30 11:07:29cron at 0 21 8 3 2 *
2024-09-30 11:07:29cron at 0 43 16 3 2 *
2024-09-30 11:07:29cron at 0 18 8 4 2 *
2024-09-30 11:07:29cron at 0 46 16 4 2 *
2024-09-30 11:07:29cron at 0 15 8 5 2 *
2024-09-30 11:07:29cron at 0 49 16 5 2 *
2024-09-30 11:07:29cron at 0 12 8 6 2 *
2024-09-30 11:07:29cron at 0 52 16 6 2 *
2024-09-30 11:07:29cron at 0 9 8 7 2 *
2024-09-30 11:07:29cron at 0 55 16 7 2 *
2024-09-30 11:07:29cron at 0 6 8 8 2 *
2024-09-30 11:07:29cron at 0 58 16 8 2 *
2024-09-30 11:07:29cron at 0 3 8 9 2 *
2024-09-30 11:07:29cron at 0 1 17 9 2 *
2024-09-30 11:07:29cron at 0 0 8 10 2 *
2024-09-30 11:07:29cron at 0 4 17 10 2 *
2024-09-30 11:07:29cron at 0 57 7 11 2 *
2024-09-30 11:07:29cron at 0 7 17 11 2 *
2024-09-30 11:07:29cron at 0 54 7 12 2 *
2024-09-30 11:07:29cron at 0 10 17 12 2 *
2024-09-30 11:07:29cron at 0 51 7 13 2 *
2024-09-30 11:07:29cron at 0 13 17 13 2 *
2024-09-30 11:07:29cron at 0 48 7 14 2 *
2024-09-30 11:07:29cron at 0 17 17 14 2 *
2024-09-30 11:07:29cron at 0 45 7 15 2 *
2024-09-30 11:07:29cron at 0 20 17 15 2 *
2024-09-30 11:07:29cron at 0 42 7 16 2 *
2024-09-30 11:07:29cron at 0 23 17 16 2 *
2024-09-30 11:07:29cron at 0 38 7 17 2 *
2024-09-30 11:07:29cron at 0 26 17 17 2 *
2024-09-30 11:07:29cron at 0 35 7 18 2 *
2024-09-30 11:07:29cron at 0 29 17 18 2 *
2024-09-30 11:07:29cron at 0 32 7 19 2 *
2024-09-30 11:07:29cron at 0 32 17 19 2 *
2024-09-30 11:07:29cron at 0 29 7 20 2 *
2024-09-30 11:07:29cron at 0 35 17 20 2 *
2024-09-30 11:07:29cron at 0 25 7 21 2 *
2024-09-30 11:07:29cron at 0 38 17 21 2 *
2024-09-30 11:07:29cron at 0 22 7 22 2 *
2024-09-30 11:07:29cron at 0 41 17 22 2 *
2024-09-30 11:07:29cron at 0 19 7 23 2 *
2024-09-30 11:07:29cron at 0 44 17 23 2 *
2024-09-30 11:07:29cron at 0 15 7 24 2 *
2024-09-30 11:07:29cron at 0 47 17 24 2 *
2024-09-30 11:07:29cron at 0 12 7 25 2 *
2024-09-30 11:07:29cron at 0 50 17 25 2 *
2024-09-30 11:07:29cron at 0 9 7 26 2 *
2024-09-30 11:07:29cron at 0 54 17 26 2 *
2024-09-30 11:07:29cron at 0 5 7 27 2 *
2024-09-30 11:07:29cron at 0 57 17 27 2 *
2024-09-30 11:07:29cron at 0 2 7 28 2 *
2024-09-30 11:07:29cron at 0 0 18 28 2 *
2024-09-30 11:07:29cron at 0 59 6 29 2 *
2024-09-30 11:07:29cron at 0 3 18 29 2 *
2024-09-30 11:07:29cron at 0 55 6 1 3 *
2024-09-30 11:07:29cron at 0 6 18 1 3 *
2024-09-30 11:07:29cron at 0 52 6 2 3 *
2024-09-30 11:07:29cron at 0 9 18 2 3 *
2024-09-30 11:07:29cron at 0 48 6 3 3 *
2024-09-30 11:07:29cron at 0 12 18 3 3 *
2024-09-30 11:07:29cron at 0 45 6 4 3 *
2024-09-30 11:07:29cron at 0 15 18 4 3 *
2024-09-30 11:07:29cron at 0 41 6 5 3 *
2024-09-30 11:07:29cron at 0 18 18 5 3 *
2024-09-30 11:07:29cron at 0 38 6 6 3 *
2024-09-30 11:07:29cron at 0 21 18 6 3 *
2024-09-30 11:07:29cron at 0 34 6 7 3 *
2024-09-30 11:07:29cron at 0 24 18 7 3 *
2024-09-30 11:07:29cron at 0 31 6 8 3 *
2024-09-30 11:07:29cron at 0 27 18 8 3 *
2024-09-30 11:07:29cron at 0 27 6 9 3 *
2024-09-30 11:07:29cron at 0 30 18 9 3 *
2024-09-30 11:07:29cron at 0 24 6 10 3 *
2024-09-30 11:07:29cron at 0 33 18 10 3 *
2024-09-30 11:07:29cron at 0 20 6 11 3 *
2024-09-30 11:07:29cron at 0 36 18 11 3 *
2024-09-30 11:07:29cron at 0 17 6 12 3 *
2024-09-30 11:07:29cron at 0 39 18 12 3 *
2024-09-30 11:07:29cron at 0 13 6 13 3 *
2024-09-30 11:07:29cron at 0 42 18 13 3 *
2024-09-30 11:07:29cron at 0 10 6 14 3 *
2024-09-30 11:07:29cron at 0 45 18 14 3 *
2024-09-30 11:07:29cron at 0 6 6 15 3 *
2024-09-30 11:07:29cron at 0 48 18 15 3 *
2024-09-30 11:07:29cron at 0 2 6 16 3 *
2024-09-30 11:07:29cron at 0 51 18 16 3 *
2024-09-30 11:07:29cron at 0 59 5 17 3 *
2024-09-30 11:07:29cron at 0 54 18 17 3 *
2024-09-30 11:07:29cron at 0 55 5 18 3 *
2024-09-30 11:07:29cron at 0 58 18 18 3 *
2024-09-30 11:07:29cron at 0 51 5 19 3 *
2024-09-30 11:07:29cron at 0 1 19 19 3 *
2024-09-30 11:07:29cron at 0 48 5 20 3 *
2024-09-30 11:07:29cron at 0 4 19 20 3 *
2024-09-30 11:07:29cron at 0 44 5 21 3 *
2024-09-30 11:07:29cron at 0 7 19 21 3 *
2024-09-30 11:07:29cron at 0 40 5 22 3 *
2024-09-30 11:07:29cron at 0 10 19 22 3 *
2024-09-30 11:07:29cron at 0 37 5 23 3 *
2024-09-30 11:07:29cron at 0 13 19 23 3 *
2024-09-30 11:07:29cron at 0 33 5 24 3 *
2024-09-30 11:07:29cron at 0 16 19 24 3 *
2024-09-30 11:07:29cron at 0 29 5 25 3 *
2024-09-30 11:07:29cron at 0 19 19 25 3 *
2024-09-30 11:07:29cron at 0 26 5 26 3 *
2024-09-30 11:07:29cron at 0 22 19 26 3 *
2024-09-30 11:07:29cron at 0 22 5 27 3 *
2024-09-30 11:07:29cron at 0 25 19 27 3 *
2024-09-30 11:07:29cron at 0 18 5 28 3 *
2024-09-30 11:07:29cron at 0 29 19 28 3 *
2024-09-30 11:07:29cron at 0 15 5 29 3 *
2024-09-30 11:07:29cron at 0 32 19 29 3 *
2024-09-30 11:07:29cron at 0 11 5 30 3 *
2024-09-30 11:07:29cron at 0 35 19 30 3 *
2024-09-30 11:07:29cron at 0 7 5 31 3 *
2024-09-30 11:07:29cron at 0 38 19 31 3 *
2024-09-30 11:07:29cron at 0 3 5 1 4 *
2024-09-30 11:07:29cron at 0 41 19 1 4 *
2024-09-30 11:07:29cron at 0 0 5 2 4 *
2024-09-30 11:07:29updateSingleScheduleDevStatus streetlightsk1
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-01-31 16:33:28.810+03:00 2024-03-01 08:26:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-01 16:37:28.810+03:00 2024-03-02 08:24:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-02 16:40:28.810+03:00 2024-03-03 08:21:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-03 16:43:28.810+03:00 2024-03-04 08:18:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-04 16:46:28.810+03:00 2024-03-05 08:15:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-05 16:49:28.810+03:00 2024-03-06 08:12:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-06 16:52:28.810+03:00 2024-03-07 08:09:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-07 16:55:28.810+03:00 2024-03-08 08:06:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-08 16:58:28.810+03:00 2024-03-09 08:03:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-09 17:01:28.810+03:00 2024-03-10 08:00:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-10 17:04:28.810+03:00 2024-03-11 07:57:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-11 17:07:28.810+03:00 2024-03-12 07:54:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-12 17:10:28.810+03:00 2024-03-13 07:51:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-13 17:13:28.810+03:00 2024-03-14 07:48:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-14 17:17:28.810+03:00 2024-03-15 07:45:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-15 17:20:28.810+03:00 2024-03-16 07:42:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-16 17:23:28.810+03:00 2024-03-17 07:38:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-17 17:26:28.810+03:00 2024-03-18 07:35:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-18 17:29:28.810+03:00 2024-03-19 07:32:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-19 17:32:28.810+03:00 2024-03-20 07:29:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-20 17:35:28.810+03:00 2024-03-21 07:25:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-21 17:38:28.810+03:00 2024-03-22 07:22:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-22 17:41:28.810+03:00 2024-03-23 07:19:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-23 17:44:28.810+03:00 2024-03-24 07:15:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-24 17:47:28.810+03:00 2024-03-25 07:12:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-25 17:50:28.810+03:00 2024-03-26 07:09:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-26 17:54:28.810+03:00 2024-03-27 07:05:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-27 17:57:28.810+03:00 2024-03-28 07:02:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-28 18:00:28.810+03:00 2024-03-29 06:59:28.810+03:00
2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-03-29 18:03:28.810+03:00 2024-03-01 06:55:28.810+03:00
2024-09-30 11:07:29found matching schedule interval at 2,29,18,3,3,1,6,55
2024-09-30 11:07:29updateSingleScheduleDevStatus streetlightsk2
2024-09-30 11:07:29NOT found matching schedule interval at undefined
2024-09-30 11:07:29streetlightsk1OnOff newValue=5.141, devName=wb-adc, cellName=V5_0
2024-09-30 11:07:29streetlightsk2OnOff newValue=5.141, devName=wb-adc, cellName=V5_0
2024-09-30 11:07:29streetlightsk1OnOff newValue=true, devName=_schedules, cellName=streetlightsk1
2024-09-30 11:07:29streetlightsk2OnOff newValue=false, devName=_schedules, cellName=streetlightsk2

В частоности, инетерсует момент по какой причине перескакиевеит месяц проверки с февраля на март, хотя в расписании задан февраль, к пимеру вот в этой строчке

2024-09-30 11:07:29checkScheduleInterval 2024-09-30 11:07:28.810+03:00 2024-01-31 16:33:28.810+03:00 2024-03-01 08:26:28.810+03:00

Прошу помочь разобраться, где я допустил ошибку

Добрый день!
Ваша функция checkScheduleInterval отвечает за проверку интервала начала и конца для каждого расписания. Когда конец интервала меньше начала, предполагается, что конец относится к следующему дню или месяцу, как это описано в комментариях к коду. Однако, в вашем случае произошла ситуация, когда месяц перескочил с февраля на март, что не должно происходить, если расписание задано на февраль.

Попробуйте изменить вашу функцию checkScheduleInterval, добавив обработку перехода между месяцами для случаев, когда расписание начинается в конце января и продолжается в феврале:

function checkScheduleInterval(now, start_time, end_time) {
    var start_date = todayAt(now, start_time[0], start_time[1], start_time[2], start_time[3]);
    var end_date = todayAt(now, end_time[0], end_time[1], end_time[2], end_time[3]);    
    log("checkScheduleInterval {} {} {}".format(now, start_date, end_date));

    if (start_date > end_date) {
        // Обрабатываем переход через месяц или день, добавляя проверку февраля
        if ((start_time[0] === 1 && end_time[0] === 2) || (start_time[0] === 2 && end_time[0] === 3)) {
            if (now.getMonth() === 1) { // Если сейчас февраль
                end_date.setMonth(1);  // Устанавливаем февраль как следующий месяц
            }
        }
    }
    
    if ((now >= start_date && now < end_date)) {
        return true;
    }
    return false;
}

Можете еще уточнить какой сценарий использования данного скрипта?

Скрипт используется для годового расписания включения/отключения освещения, очень странно, что такая проблема связана именно с февралем, в остальные месяцы все в порядке.

Не рассматривали по датчику освещения реализовать работу освещения?

В нашей задаче требуется именно работа по расписанию. Все-таки почему происходит сдвиг на месяц? Такого по идее не должно быть

Ошибки в логике обработки временных интервалов, особенно между концом января и началом февраля, часто встречаются в расписаниях. Проблема возникает в различных системах, когда интервал пересекает границу месяцев, особенно февраль, что приводит к неправильной интерпретации дат.
Из-за специфики февраля такие проблемы являются регулярными, поскольку месяц имеет нестандартное количество дней, и некоторые системы могут неправильно обрабатывать этот переход. В моей практике подобные проблемы возникали несколько раз.

Чтобы избежать этих ошибок, я стал использовать два подхода:

  1. Привязка к внешнему сервису времени: Это позволяет системам работать с более точными данными и избегать внутренних ошибок в расчётах.
  2. Упрощение задачи: Я стараюсь не закладывать слишком сложные зависимости от дня в расписаниях.

Изменил функцию function todayAt(now, month, day, hours, minutes)

function todayAt(now, month, day, hours, minutes) {    
    var date = new Date(now.getFullYear(), month-1, day, hours, minutes);
    return date;
  }

ну и сделал обработку перехода на новый год в функции function checkScheduleInterval(now, start_time, end_time)

// переход на новый год
    if(start_date.getMonth() === 11 && end_date.getMonth() === 0){
      end_date.setYear(start_date.getFullYear() + 1);
    }

Проблема с февралем не воспроизводится

Отлично, рад что все получилось