Добрый день!
Сейчас использую такую конструкцию:
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 использует тот же механизм таймеров:
setTimeout/setInterval тоже работают через таймеры.
За ссылку на пример скрипта спасибо.
Чтобы понимать текущий статус по проблеме, разработчики, можете прокомментировать:
Удалось ли локализовать проблему?
Исправлена ли она? Если да, то в какой версии движка правил?
Проблема с таймерами встречается в версиях до 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 лайка