Вопрос по функции startTimer

Добрый день!

Сейчас использую такую конструкцию:

defineRule("water_draining_start", {
    when: cron("0 33 5 * * *"),
    then: function () {
      dev["wb-gpio"]["V_OUT"] = true;
      startTimer("water_draining", 90000);
    }
  });

  defineRule("water_draining_stop", {
    when: function () { return timers.water_draining.firing; },
    then: function () { 
      dev["wb-gpio"]["V_OUT"] = false; 
    }
  });

Т.е. нужно создавать 2 правила на начало и конец. Можно ли это все описать в одном правиле? Пробовал с if, но окончание таймера не отрабатывается.

Нет, в одном по моему мнению не получится.

Получится, если вместо startTimer использовать setTimeout

Видел тут упоминание, что setTimeout использовать нежелательно, виснет движок правил при большом количестве таймеров

setTimeout использует тот же механизм таймеров:

Чтобы понимать текущий статус по проблеме, разработчики, можете прокомментировать:

  1. Удалось ли локализовать проблему?
  2. Исправлена ли она? Если да, то в какой версии движка правил?

Проблема с таймерами встречается в версиях до 2.X. Её решили глобальным пепреписыванием этого механизма во второй версии и проявления больше не наблюдается. Версия 2.2 уже имеет эти изменения.

Версию wb-rules проверить:

dpkg -s wb-rules

Ваш пример можно переписать без каких-либо проблем следующим образом:

defineRule("water_draining_start", {
  when: cron("0 33 5 * * *"),
  then: function () {
    dev["wb-gpio"]["V_OUT"] = true;
    setTimeout(function() {
      dev["wb-gpio"]["V_OUT"] = false;
    }, 90000);
  }
});
2 Likes