Таймеры WirenBoard 6

Добрый день! Подскажите пожалуйста по работе с таймерами, можно ли сделать несколько таймеров, чтобы они не мешали друг другу? У нас сейчас есть 1 таймер и он тормозит все скрипты на указанное время, может мы не так делаем что-то?

text.txt (2.3 КБ)

Из того что бросается в глаза:

Вместо

when: function() {
  return (dev["temperatures"]["1"] || !dev["temperatures"]["1"]) && (dev["temperatures"]["2"] || !dev["temperatures"]["2"]) && (dev["temperatures"]["3"] || !dev["temperatures"]["3"]) && (dev["temperatures"]["4"] || !dev["temperatures"]["4"]);
},

Надо использовать

whenChanged: [temperature_sensor_name],

Лучше не использовать setTimeout
Вместо этого лучше использовать startTimer(motion_timer_1_id, motion_timer_1_timeout_ms);
А затем проверять сработку

  if (timers.motion_timer_1_id.firing) {
      ..............................
  }

Зачем у вас конструкция dev[“temperatures”][“1”] = NaN; ?

Чтобы не проходило по условию ?

if(dev["wb-w1/28-0318977907c8"]) {
.................
}

Чем отличаются конструкция setTimeout от startTimer, почему ее лучше использовать?

Конструкция пишет неопределенное значение, которое шлем на сервер, если датчик отвалился вдруг.

по опыту использования setTimeout были зависания движка правил после полусотни запусков.
Особенное если использовать короткое значение (до 3000)

А вы случайно не пробовали делать несколько разных таймеров в правилах?

Это у меня реализовано даже цикличным способом в зависимости от того сколько надо запускать разных таймеров.

На них делал простенький ШИМ (с периодом десятки секунд), чтобы независимо управлять разными группами обогревателей со своими параметрами этого ШИМ.

Можете подсказать, что делаю не так, у нас в первом правиле, таймер идет с интервалом 60 секунд, а во втором в 10 сек, но он все равно срабатывает через 60, а не как задано?

Это еще одна непонятка с setTimeout , когда они начинали накладываться друг на друга.

Если у вас интервалы в секунды постоянны, может вам лучше запускать по cron?
when: cron("@every 10s"),
then: function () {

}

Опишите словами задачу, что требуется?
По-моему у вас как-то мудрено все закручено…

Нам нужно слать показания с датчиков и разность между ними, раз в какое-то время конкретное. И также отдельно есть событие по разности, что если разность с датчиков больше такого-то значения, то мы запускаем таймер там на 10 секунд, и после окончания этих 10 секунд, если разность не стала меньше шлем пост запрос на сервер.

  1. Необходимо использовать массивы переменных для цикличной записи показаний датчиков, а не писать NaN в контролы и не использовать для этого виртуальные девайсы.
  2. Использовать цикличную обработку этих массивов
  3. cron тогда не подходит, но нужно все-таки использовать startTimer с привязанным к датчику именем по номеру в массиве.