Выключение реле по таймеру

Сборка WB6+MSW3+MR6
Скрипт испытывался отсюда https://wirenboard.com/wiki/index.php?title=Rule_Examples

Собственно сам скрипт
var motion_timer_1_timeout_ms = 30 * 1000;
var motion_timer_1_id = null;

defineRule(“motion_detector_1”, {
whenChanged: “wb-gpio/D2_IN”,
then: function (newValue, devName, cellName) {
if (newValue) {
dev[“wb-gpio”][“Relay_1”] = true;
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
} else {
motion_timer_1_id = setTimeout(function () {
dev[“wb-gpio”][“Relay_1”] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});

Был переделан по себя
var motion_timer_1_timeout_ms = 30 * 1000;
var motion_timer_1_id = null;

defineRule(“motion_detector_1”, {
whenChanged: “D83/Current Motion”,
then: function (newValue, devName, cellName) {
if (newValue > 25) {
dev[“R202”][“K1”] = true;
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
} else {
motion_timer_1_id = setTimeout(function () {
dev[“R202”][“K1”] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});

Проблема в том, что свет то включается то выключается самопроизвольно. Это происходит после сработки детектора движения. После выключения света такого уже не происходит.
Убираем таймер, становится все нормально, но в этом случае лишаемся таймера.
Кто может в этом разобраться, почему такое происходит? Как заставить выключаться свет по таймеру?

Вычитал такое здесь https://github.com/wirenboard/wb-rules

Во избежание труднопредсказуемого поведения в функциях, фигурирующих в when , asSoonAs и whenChanged не рекомендуется использовать side effects, т.е. менять состояние программы (изменять значение глобальных переменных, значений параметров, запускать таймеры и т.д.) Следует особо отметить, что система не даёт никаких гарантий по тому, сколько раз будут вызываться эти функции при просмотрах правил.

Тут проблема в том что каждый_раз при изменении значения D83/Current Motion если оно меньше 25
вызывается

motion_timer_1_id = setTimeout(function () {

Немного непонятно - как оно должно работать? Точнее - желаемый алгоритм.

Значит мне не достаточно понятно как работает эта функция. Информацию черпал отсюда https://javascript.ru/cleartimeout

Нельзя ли это сделать проще без функций?

Тут непонятно что именно вы хотите получить на выходе, сам алгоритм.

Алгоритм включения ламп по датчику движения и выключения через определенное время уже нашел и испытал в работе.

function LightMotion(name, timeout_ms, detector_control, device_control, value) {
var timer_id = null;
defineRule(name, {
whenChanged: detector_control,
then: function(newValue, devName, cellName) {
if (newValue>25) {
dev[device_control] = value;
if (timer_id) {
clearTimeout(timer_id);
}

          timer_id = setTimeout(function() {
              dev[device_control] = 0;
              timer_id = null;
          }, timeout_ms);
      }
  }

});
}

LightMotion(“Датчик движения в столовой”, 600000, “D83/Current Motion”, “R202/K1”, 1); // в столовой

Можно ли это же сделать проще? Например без применения функций. Нужна подсказка собственно и сам алгоритм.

Алгоритм - это как оно должно работать. Реализации выключения через заданный промежуток времени проще - наверно уже нет.

тема старая, но дабы не плодить сущностей сверх необходимого пишу тут, так как вопрос появился при работе с Current Motion
А вопрос следующий:
есть достаточно пыльное помещение, в котором по графику движения встречаются одиночные пики высоких значений. В стандартном скрипте свет включается при однократном появлении такого пика. Пока экспериментирую секундным таймаутом на включение, но выглядит это так себе.
Может кто-то реализовывал это более красиво?

Перечитал скрипт ещё раз, у меня свет может включаться как по движению, так и кнопкой, так что таймаут на отключение не должен быть привязан к включение по движению

Как живенько тут у вас!
Смотрю, саппорт отвечает прям молниеносно!

Если у вас есть какой-то вопрос по оборудованию, по неожиданному поведению ПО - то его целесообразно оформить новой темой в соответствии с правилами форума.

1 сообщение было перенесено в новую тему: Помощь с написанием правила