Включение на время и выключение реле( WB-MR6C v.3 31 )

Коллеги, добрый день! Подскажите пожалуйста как сделать следующее:
По событию, например по кнопке (виртуальной) включается реле (например на 4 секунды).
При этом, если во время работы реле еще раз нажать кнопку - чтобы таймер сбрасывался и отсчет начинался сначала. Нажали на кнопку - 4 секунды, через 2 секунды нажали, значит реле 6 секунд должно работать, и т.д. Отсчет начинался заново
Имеется такое правило:

defineRule("virtDevIn1", {
  whenChanged: 'HomeLight/Input1',
  then: function (newValue, devName, cellName) {
 
  dev[topics.Relay1]=true  
 
   timerID=setTimeout(function () {
   
    lightOff(topics.Relay1)
 },timerSensor*1000);
 

Если активно дергать кнопку - не выдерживается даже заданное время таймера, реле начинает щелкать или просто рандомно выключаться.
Спасибо!

Коллеги, подскажите пожалуйста, где косяк? Задача архи простая. По датчику движения зажигать лампочку.
Но почему-то работает криво-косо. Если во время работы таймера датчик сработает еще раз-таймер не обнулятся, если активно поиграть датчиком - реле рандомно работает.

Здравствуйте. Сейчас, для остановки работы вентиляторов на сити-ферме, мы используем вот такой сценарий:

//'use strict';
var motion_timer_1_timeout_ms = 3600 * 1000;
var motion_timer_1_id = null
var rele = "wb-mr6cu_44/K3";
var dimer = "wb-msw-v3_142/Current Motion";
defineRule("motion_detector_1", {
    whenChanged: dimer,
    then: function (newValue, devName, cellName) {
        if (dev[dimer]>400) {
            dev[rele] = false;
            if (motion_timer_1_id) {
                clearTimeout(motion_timer_1_id);
            }
            motion_timer_1_id = setTimeout(function () {
                dev[rele] = true;
                motion_timer_1_id = null;
            }, motion_timer_1_timeout_ms);
        }
    },
});

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

1 лайк

Добрый день.

совершенно прав. У вас в скрипте создаются разные экземпляры таймера которые не удаляются и каждый из них по timeout отрабатывает. Следует проверять существованиие таймера и в случае необходимости пересоздавать.

Спасибо за ответ! Но, если в момент уже запущенного реле (например после первого срабатывания датчика) сработает датчик еще раз - время работы реле не увеличивается.
Иными словами, если имулировать датчик (постоянно нажимать кнопку) - в какой-то момент реле выключится и включится заново. А хочется, если реле запущено и имулировать срабатывание датчика в момент, когда реле запущено, чтобы оно не выключалось на время - с последнего срабатывания = timer_timeout

Как уже писал - у вас ниигде не контролируется наличие экземпляров таймера.
Обратите внимание на пример.