Таймеры WirenBoard 6


#1

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

text.txt (2.3 КБ)


#2

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

Вместо

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"]) {
.................
}

#3

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

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


#4

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


#5

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


#6

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

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


#7

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


#8

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

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

}


#9

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


#10

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


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