Правило с паузой 15 секунд

Здравствуйте!
wirenboard 7 версии. Я пытаюсь написать правило которое шлет сообщения если температура превышена, но с периодичностью не более 15 секунд.
Вот этот код

defineRule(“High temperature”,{
when: function() {
return dev[“wb-ms_29/Temperature”] > 15.30 ? true : false ;
},
then: function (newValue, devName, cellName) {

 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 градус с датчика иницируют срабатывание нового экземпляра правила .
Вопрос как тогда решить данную задачу, чтобы сократить и лог сообщений и количество предупреждений в телеграм

Добрый день.
Пожалуйста прокомментируйте как должен работать скрипт, код которого приведен.
В частности - где иенно обрабатывается timers.myPause ?

нигде. Я так понял из описания 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” срабатывает последовательно даже если незавершена предыдущая обработка данного правила.
Какой путь правилен?

Нет, не так. Создается и начинает выполняться объект таймера с указанным именем.

Лостаточно проверять на активный объект таймера, в общем.
Ну или по флагу, да.
Для примера: Сценарий на повышение температуры - #10 от пользователя BrainRoot

Я попробовал. Написал вот так
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) значит ли это что никто кроме процедур\правил модуля не сбросит ее? Вдруг модуль перегружается как то по каким то событиям?

Вы присваиваете переменной “Pause_timer_temp” значение null.
Это не оказывает никакого влияние на таймер.

Просто потому что нельзя (да и не нужно) понять из движка чему был присвоен идентификатор и как он дальше обрабатывался.

Тогда - будет инициализирована заново. Если модуль перезапустился - все созданные объекты чистятся.