Здравствуйте!
wirenboard 7 версии. Я пытаюсь написать правило которое шлет сообщения если температура превышена, но с периодичностью не более 15 секунд.
Вот этот код
startTicker("myPause",15000);
global.__proto__.LogAndSend("Сработала глобальная функция");
var message = "Внимание! Превышена температура на основном датчике. " + dev["wb-ms_29/Temperature"];
log("devName:{}, cellName:{}, newValue:{}", "wb-ms_29/Temperature", "Temperature", message)
// var PauseEmul = null;
// PauseEmul = setInterval(function(){temp = “set pause”}, 60000);
// clearInterval(PauseEmul);
}
нужного эффекта не дает.
У меня такое впечатление что любые колебания температуры 0.01 градус с датчика иницируют срабатывание нового экземпляра правила .
Вопрос как тогда решить данную задачу, чтобы сократить и лог сообщений и количество предупреждений в телеграм
нигде. Я так понял из описания startTicker(“myPause”,15000); что просто начинает исполнятся в данной строке и через 15000 выполняются следующие строки кода.
Если я неправ, и нужно описывать обработку myPause , то я пробовал
PauseEmul = setInterval(function(){temp = “set pause”}, 60000);
clearInterval(PauseEmul);
Без результата
Я понимаю что Javascript асинхронный и читал Delay, Sleep, Pause & Wait in JavaScript — SitePoint и там вроде хитрые костыли описаны, которые еще не нагружают проц, но это для JavaScript в общем. Я хотел понять как такая задача решается в окружении Wirenboard
В целом мне нужно сократить количество однотипных сообщений в логе,
но тут
либо тогда нужно отслеживать некую глобальную переменную (время последнего сообщения) и уже писать в лог с интервалом.
либо паузы, но это сработает если правило defineRule(“High temperature” срабатывает последовательно даже если незавершена предыдущая обработка данного правила.
Какой путь правилен?
Я попробовал. Написал вот так
var Pause_timer = null;
// Правило сработает если значение температуры датчика wb-ms_29/Temperature выше
defineRule(“High temperature”,{
when: function() {
return dev[“wb-ms_29/Temperature”] > 3.30 ? true : false ;
},
then: function (newValue, devName, cellName) {
//Если таймер включен то ничего не делаем
if (!Pause_timer) {
var message = "Внимание! Превышена температура на основном датчике. " + dev[“wb-ms_29/Temperature”];
global.proto.LogAndSend(“Wirenboard Server room”,“wb-ms_29/Temperature”,“Temperature”,dev[“wb-ms_29/Temperature”],message)
Pause_timer = setTimeout(function(){ temp = "заглушка, но можно сделать действие "},15000);
}
Но по факту срабатывает это один раз. Такое впечатление, что переменная Pause_timer иницииализируется каждый раз при вызове модуля
Вы присваиваете переменной Pause_timer значение-идентификатор объекта самого таймера.
А где, в каком месте его сбрасываете? Я бы сбрасывал в обработчике, как вариант.
Как я понимаю, модуль подгружается один раз. внутри дергается правило и устанавливает Pause_timer, который существует пока модуль подгружен. Когда таймер отсчитал 15 сек зачем его сбрасывать? Как я понял сбрасывать нужно до срока 15 сек.
Переменная задана для всего скрипта. Устанавливается она при запускке таймера, однократно и больше не сбрасывается никогда.
Я бы сбросил в обработчике таймера - ели нужно срабатывание в следующий раз.
var Pause_timer_temp = null;
// Правило сработает если значение температуры датчика wb-ms_29/Temperature выше
defineRule("High temperature",{
when: function() {
return dev["wb-ms_29/Temperature"] > 2 ? true : false ;
},
then: function (newValue, devName, cellName) {
var CurDate = new Date();
//Если таймер включен то ничего не делаем
// log("Pause_timer_temp " + Pause_timer_temp + " current Date " + CurDate);
if (Pause_timer_temp==null) {
var message = "Внимание! Превышена температура на основном датчике. " + dev["wb-ms_29/Temperature"];
global.__proto__.LogAndSend("Wirenboard Server room","wb-ms_29/Temperature","Temperature",dev["wb-ms_29/Temperature"],message);
Pause_timer_temp = setTimeout(function(){ log("Executed Pause_timer_temp " + Pause_timer_temp + " current Date " + CurDate) ; Pause_timer_temp=null ; },30000);
log("Pause_timer_temp ater clear " + Pause_timer_temp + " current Date " + CurDate);
}
}
});
Включил трассировку, поэксперементировал. В общем у меня работает только такой код
Т.е. я запускаю таймер, судя по описанию таймер считает и запускает содержимое функции внутри. Внутри функции я сбрасываю Pause_timer_temp=null
и можно запускать таймер заново
Ну формально работает. Только с точки зрения архитектуры возникают вопросы
Почему clearTimeout не сбрасывает таймер в null?
Если Переменная таймера Pause_timer_temp инициализируется при загрузке модуля (в null) значит ли это что никто кроме процедур\правил модуля не сбросит ее? Вдруг модуль перегружается как то по каким то событиям?