Прошу прощения что не разобрался со своей задачей по схожим темам, но я только начинаю познавать 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);
}
}
});
avspnz
01.Февраль.2024 09:06:47
3
Добрый день.
Nikita1:
После того как реле включилось, оно должно работать заданное время, т.е. то время которого будет достаточно для полного открытия/закрытия привода.
Вот последний пункт не осилил, подскажите пожалуйста - КАК?
Можно добавить ещё один 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
avspnz
01.Февраль.2024 10:26:27
5
В таком случае добавьте дополнительную переменную, которая будет хранить текущее состояние и пару дополнительных условий:
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 лайк