Выключение реле после его включения с задержкой

Прошу прощения что не разобрался со своей задачей по схожим темам, но я только начинаю познавать WB и JS ))

Итак к задачи: есть сервопривод на управление умным домом, при достижении определенной температуры одно из реле должно отключиться, а второе включиться с задержкой чтобы фаза не дай бог не встретилась. После того как реле включилось, оно должно работать заданное время, т.е. то время которого будет достаточно для полного открытия/закрытия привода.

Вот последний пункт не осилил, подскажите пожалуйста - КАК?

Вот что я пока написал (за кривой код - сорри):

var setpoint = 29;

defineRule({
  whenChanged: "wb-w1/28-00000fad2101",
    then: function (newValue, devName, cellName) {
      if (newValue > setpoint){
      dev["wb-mr6c_122/K2"] = false;
       setTimeout(function () {
      dev["wb-mr6c_122/K3"] = true;
           }, 2000);  
      }
        }
  });


defineRule({
  whenChanged: "wb-w1/28-00000fad2101",
    then: function (newValue, devName, cellName) {
      if (newValue < setpoint){
      dev["wb-mr6c_122/K3"] = false;
       setTimeout(function () {
      dev["wb-mr6c_122/K2"] = true;
             }, 2000);
    }
        }
  });

Добрый день.

Можно добавить ещё один setTimeout(). Ну и достаточно одного правила. Как-то так:

var setpoint = 29;
var timeout0 = 1000; // Задержка
var timeout1 = 1000; // Время открытия/закрытия

defineRule({
    whenChanged: "wb-w1/28-00000fad2101",
    then: function(newValue, devName, cellName) {
        if (newValue >= setpoint) {
            dev["wb-mr6c_122/K2"] = false;
            setTimeout(function() {
                dev["wb-mr6c_122/K3"] = true;
                setTimeout(function() {
                    dev["wb-mr6c_122/K3"] = false;
                }, timeout1);
            }, timeout0);
        } else {
            dev["wb-mr6c_122/K3"] = false;
            setTimeout(function() {
                dev["wb-mr6c_122/K2"] = true;
                setTimeout(function() {
                    dev["wb-mr6c_122/K2"] = false;
                }, timeout1);
            }, timeout0);
        }
    }
});

Реле 3 при достижении уставки начинает просто щелкать через заданные интервалы, а при опуске температуры тоже начинает делать реле 2

В таком случае добавьте дополнительную переменную, которая будет хранить текущее состояние и пару дополнительных условий:

var setpoint = 29;
var timeout0 = 1000; // Задержка
var timeout1 = 1000; // Время открытия/закрытия
var flag = false; 

defineRule({
    whenChanged: "wb-w1/28-00000fad2101",
    then: function(newValue, devName, cellName) {
        if (newValue >= setpoint) {
            if (!flag && !dev["wb-mr6c_122/K3"]) {
              dev["wb-mr6c_122/K2"] = false;
              setTimeout(function() {
                  dev["wb-mr6c_122/K3"] = true;
                  setTimeout(function() {
                      dev["wb-mr6c_122/K3"] = false;
                      flag = true;
                  }, timeout1);
              }, timeout0);
            }
        } else {
            if (flag && !dev["wb-mr6c_122/K2"]) {
              dev["wb-mr6c_122/K3"] = false;
              setTimeout(function() {
                  dev["wb-mr6c_122/K2"] = true;
                  setTimeout(function() {
                      dev["wb-mr6c_122/K2"] = false;
                      flag = false;
                  }, timeout1);
              }, timeout0);
            }
        }
    }
});
1 лайк

Идеально, спасибо!

Очень советую такие ситуации решать коммутацией контактов и никогда не отдавать на откуп программе.

1 лайк

Золотые слова. Ибо если что-то может пойти не так - оно пойдет не так, в одном случае из миллиона.

1 лайк