Не корректно работает таймер в правиле


#1

Здравствуйте. Было создано правило включения реле по замыкании кнопки на определенное время. Правило работало на “столе” с малыми временными интервалами (до 15 минут). Потом работало с установленным контроллером в шкаф в загородном доме. Вроде тоже корректно. потом были подправлены времена по всем выключателям/каналам (шесть штук). И на конкретном канале была установлена задержка 1800 секунд. После этого, боюсь, что не проверял должным образом из-за нехватки времени. В эти выходные перекоммутировал питание и RS485 на платы с быстрозажимными контактами. После этого стало твориться странное.

  1. При включении кнопкой 3, включается реле 3 и через секунду реле 4. При этом статус состояния входа 4 не меняется. Реле включается само.
  2. По прошествии 1800 секунд реле 3 не выключается. Другие каналы, вроде отрабатывают времена.

Проблему с включением канала 4 поборол перекоммутацией проводов RS485 на данном реле. Мне показалось, что был плохой контакт.
Ео время пока живет своей жизнью.
пример кода:

var push_a_button_1_timeout_ms = 1800 * 1000;
var push_a_button_1_id = null;
var prev_count = 0;

defineRule("light_time_1", {
    whenChanged: "R1-45/Input 3 counter",
    then: function(newValue, devName, cellName) {
        if (newValue > prev_count) {
            prev_count = newValue;
            if (dev["R1-45"]["K3"]) {
                dev["R1-45"]["K3"] = 0;
                if (push_a_button_1_id) {
                    clearTimeout(push_a_button_1_id);
                    push_a_button_1_id = null;
                }
            } else {
                dev["R1-45"]["K3"] = 1;
                if (push_a_button_1_id) {
                    clearTimeout(push_a_button_1_id);
                }
                push_a_button_1_id = setTimeout(function() {
                    dev["R1-45"]["K3"] = 0;
                    push_a_button_1_id = null;
                }, push_a_button_1_timeout_ms);
            }
        }
    }
});

#2

Александр, мне кажется, что все должно работать более менее, только вот один момент:
Проверка

может дать false, если данные по mqtt не успели обновиться, следовательно, секция кода if не отрабатывает, а отрабатывает else.

Поставляйте отладочной информации, так будет проще разбираться:

var push_a_button_1_timeout_ms = 5* 1000;
var push_a_button_1_id = null;
var prev_count = 0;
log ("start");

defineRule("light_time_1", {
    whenChanged: "R1-45/Input 3 counter",
    then: function(newValue, devName, cellName) {
        if (newValue > prev_count) {
            prev_count = newValue;
          log("Счетчик нажатий: " + prev_count);
          relay_state = dev["R1-45"]["K3"];
          log("Сосояние реле: " + relay_state);
            if (dev["R1-45"]["K3"]) {
                log ("Реле включено, выключаем, сбрасываем таймер");
                dev["R1-45"]["K3"] = 0;
                if (push_a_button_1_id) {
                    log ("разрушаем таймер 5 секунд");
                    clearTimeout(push_a_button_1_id);
                    push_a_button_1_id = null;
                }
            } else {
              log ("Реле выключено");
                dev["R1-45"]["K3"] = 1;
                if (push_a_button_1_id) {
                    clearTimeout(push_a_button_1_id);
                                  }
                                log ("Взводим таймер на 5 секундд");  
                push_a_button_1_id = setTimeout(function() {
                    log ("Выключаем реле");
                    dev["R1-45"]["K3"] = 0;
                    push_a_button_1_id = null;
                    log ("Разрушаем таймер 5 секунд");
                }, push_a_button_1_timeout_ms);
            }
        }
    }
});

#3

Разобрались. Так как переменная времени у меня имела одно и тоже название, то она работала на все скрипты одновременно.


#4

Замечательно!