Добрый
Поискал поиском- но не попалось
Вопрос следующий
Есть желание управлять освещением(через реле MR6)
Сейчас реализовал как:
однократное нажатие- включил реле
длинное- выключил
двойное- включение на время…
Но есть желание управление освещением сделать более традиционным- однократное нажатие- включил, следующее однократное- выключил
А режим с таймером уже оставить на той же кнопке с дабл…
Не подскажите- есть ли\ был ли подобный пример с правилом
Или в каком направлении копать при написании правила
Те этот режим будет применяться и при работе реле по правилу(любому в рамках нажатий кнопки) под управлением контроллера?
Если просто кнопка для автономной работы реле- это мне понятно
Выбрал этот режим, выбрал команду на управление выходом- “переключить”
Те нажатие кнопки просто инвертирует состояние реле
Те аналог импульсного реле
У меня желание управлять с кнопок вирт устройства, с физического выключателя и, в перспективе , кнопкой на брелке дистанционно( думаю zeegbe)
Плюс с физического выключателя иметь режим включения реле с задержкой на время
Те на все на это пишу правило
И у меня не пооучается в правиле разделить в функциях разделить команды на включение реле от кнопки и выключение реле от той же кнопки
Т.е написал так, что при надатии реле включилось, а при повторном нажатии запускается сразу обе функции- и вкл и вкл…
Поэтому таккой вопрос
Перешел на режим- включить при однократном, выключить при двойном и такой проблемы нет
Но не удобно)
function Start_StreetLight() { // включение уличного освещения
dev[Do_StreetLight] = true; // переключить реле выхода 1
dev[‘Virt_Home’][‘OnOff2_StreetLight’] = true; // ползунок включения уличного освещения в вирт устройстве
// log(“уличное освещение старт”);
// log ("реле состояние старт: " + !dev[Do_StreetLight])
};
function Stop_StreetLight() { // выключение уличного освещения
dev[Do_StreetLight] = false; // переключить реле выхода 1
dev[‘Virt_Home’][‘OnOff2_StreetLight’] = false; // ползунок включения уличного освещения в вирт устройстве
// log(“уличное освещение стоп”);
// log ("реле состояние стоп: " + !dev[Do_StreetLight])
};
// включение уличного освещения от кнопки управления виртуального устройства или физического выключателя со входа 1
defineRule(‘On_StreetLight’, {
whenChanged: [“Virt_Home/On2”, Switch1S_StreetLight],
then: function() {
Start_StreetLight(); // включение уличного освещения кнопкой вирт устройства или выключателем
}
});
// выключение уличного освещения от кнопки управления виртуального устройства или физического выключателя со входа 1
defineRule(‘Off_StreetLight’, {
whenChanged: [“Virt_Home/Off2”, Swith1L_StreetLight],
then: function() {
Stop_StreetLight(); // выключение уличного освещения кнопкой вирт устройства или выключателем
}
});
// включение уличного освещения с задержкой на выключение от двойного нажатия кнопки выключателя
defineRule(‘StreetLight_Timer’, {
whenChanged:Swith1D_StreetLight , // при двойном нажатии кнопки выключателя
then: function (newValue, devName, cellName) {
dev[Do_StreetLight] = true; // замыкается контакты реле выход 1
// log(“уличное освещение таймер”);
dev[“Virt_Home”][“OnOff2_StreetLight”] = true; // в вирт устройстве флажок устанавливается на включено
setTimeout(function () {
dev[Do_StreetLight] = false; // размыкаются контакты реле по выходу 1
// log(“уличное освещение таймер СТОП”);
dev[“Virt_Home”][“OnOff2_StreetLight”] = false; // флажокв вирт устройсстве устанавливается на выыключено
},180000); // свет отключится через 120 секунд после нажатия кнопки выключателя
Один из вариантов это использовать логический флаг
Создайте внутреннюю переменную, которая хранит текущее состояние реле.
Не проверять сразу mqtt-топик, а проверять флаг, а в конце функции обновлять его.
Вот примерный вариант, пробуйте адаптировать в своём коде.
var relayState = false; // текущее состояние реле
defineRule("button_relay_control", {
whenChanged: "wb-gpio/EXT1_IN1", // кнопка
then: function (newValue) {
if (!newValue) return; // реагируем только на нажатие
if (!relayState) {
dev["wb-mr6c_12"]["K1"] = true;
relayState = true;
log("Реле включено");
} else {
dev["wb-mr6c_12"]["K1"] = false;
relayState = false;
log("Реле выключено");
}
}
});
Ещё вариант делегировать “toggle” виртуальному устройству
Если ты хотите управлять этим же реле и с MQTT, и с брелка, и с физической кнопки,
удобно завести виртуальное устройство с параметром “toggle”,
а в правилах обрабатывать все источники одинаково:
defineVirtualDevice("relay_control", {
title: "Реле с разных источников",
cells: {
Toggle: { type: "pushbutton", value: false }
}
});
defineRule("toggle_handler", {
whenChanged: "relay_control/Toggle",
then: function() {
dev["wb-mr6c_12"]["K1"] = !dev["wb-mr6c_12"]["K1"];
}
});
// физическая кнопка просто вызывает тот же toggle
defineRule("button_call_toggle", {
whenChanged: "wb-gpio/EXT1_IN1",
then: function(newValue) {
if (newValue) dev["relay_control"]["Toggle"] = true;
}
});
Здравствуйте.
У вас между кавычками " wb-mr3_2" стоит пробел.
Контроллер пытается прочитать несуществующее устройство " wb-mr3_2" → возвращает undefined, → !undefined = true.
Из-за этого реле всегда включается, а не переключается.
Примерно так будет корректнее:
title: "Реле с разных источников",
cells: {
Toggle: { type: "pushbutton", value: false }
}
});
// --- единый переключатель ---
defineRule("toggle_handler", {
whenChanged: "relay_control/Toggle",
then: function () {
// корректное чтение состояния
var state = dev["wb-mr3_2"]["K1"];
// переключение
dev["wb-mr3_2"]["K1"] = !state;
log("toggle: новое состояние " + !state);
}
});
// --- физическая кнопка вызывает тот же toggle ---
defineRule("button_call_toggle", {
whenChanged: "wb-mr3_2/Input 1 Single Press Counter",
then: function (newValue) {
// реагируем только на повышение счётчика
if (newValue)
dev["relay_control"]["Toggle"] = true;
log("физическая кнопка нажата");
}
});
Toggle это логика переключения, можно адаптировать полностью под ON/OFF, без toggle, без зацикливаний, без двойных вызовов.
Логика будет примерно такой:
Виртуальное устройство имеет два pushbutton: ON и OFF
Есть индикатор состояния (switch)
Виртуальная ON включает реле
Виртуальная OFF выключает реле
Физическая кнопка переключает реле, но состояние синхронизируется с виртуальным устройством