Добрый день.
Прошу помощи с правилом для мастер-выключателя на базе кнопки без фиксации подключенной на вход WBIO-DI-WD-14 для управления различными релейными выходами устройств (WB-LED, WB-MDM3, WB-MR6C).
Решения из темы Нестандартные функции выключателей я не понял в части реакции на нажатие т.к. там возможно лишь управление единственным устройством, а не группой устройств.
А решение из темы Мастер выключатель работает только на время удержания кнопки.
Что-то не знаю куда смотреть и копать. Буду признателен за помощь.
Здравствуйте. С помощью робота (верхний правый угол) написал и проверил такое правило для работы с коротким и длинным нажатием клавиши без фиксации.
Скрипт не оптимален, но создан автоматически. Мне осталось добавить свои топики:
// Функция для обработки короткого нажатия - включение 3 каналов
function shortPressAction() {
dev["wb-mr6cv3_246/K1"] = true;
dev["wb-mr6cv3_246/K2"] = true;
dev["wb-mr6cv3_246/K3"] = true;
log("Короткое нажатие: включены все 3 канала реле");
}
// Функция для обработки длинного нажатия - выключение 3 каналов
function longPressAction() {
dev["wb-mr6cv3_246/K1"] = false;
dev["wb-mr6cv3_246/K2"] = false;
dev["wb-mr6cv3_246/K3"] = false;
log("Длинное нажатие: выключены 3 канала реле");
}
// Основное правило, реагирующее на изменение состояния входа кнопки
var buttonPressedTime;
defineRule("button_pressed", {
whenChanged: "wb-gpio/EXT1_IN14",
then: function (newValue, devName, cellName) {
if (newValue) { // кнопка нажата
buttonPressedTime = Date.now();
} else { // кнопка отпущена
if (Date.now() - buttonPressedTime < 1000) { // короткое нажатие
shortPressAction();
// Логика мастер-выключателя
} else { // длинное нажатие
longPressAction()
// Логика для длинного нажатия (например, управление контактором)
}
}
}
});
Также рекомендую ознакомиться с примерами правил.
Вроде же написал о том, что подобные правила отрабатывают только на время нажатия
Действительно, простите. Не увидел
на базе кнопки без фиксации
В таком случае еще проще:
Скрипт проверил - работает. Вот:
// Функция для обработки состояния "нажато" – включение 3 каналов реле
function PressState() {
dev["wb-mr6cv3_246/K1"] = true;
dev["wb-mr6cv3_246/K2"] = true;
dev["wb-mr6cv3_246/K3"] = true;
log("PressState: включены все 3 канала реле");
}
// Функция для обработки состояния "отпущено" – выключение 3 каналов реле
function ReleaseState() {
dev["wb-mr6cv3_246/K1"] = false;
dev["wb-mr6cv3_246/K2"] = false;
dev["wb-mr6cv3_246/K3"] = false;
log("ReleaseState: выключены все 3 канала реле");
}
// Правило, реагирующее на изменение состояния устройства wb-gpio/EXT1_IN14
defineRule("button_pressed", {
whenChanged: "wb-gpio/EXT1_IN14",
then: function (newValue, devName, cellName) {
if (newValue === true) {
PressState();
} else {
ReleaseState();
}
}
});
Да, попробовал это правило и оно работает.
Смущает только то, что для включения и выключения необходимо применять различные типы нажатий: для вкл-короткое, а для выкл-длинное.
При этом никак не могу понять как переключать текущее состояние, а не присваивать конкретное значение?
Отнюдь. Типы нажатий были в предыдущем скрипте, когда работали с кнопкой без фиксации. Здесь просто: клавиша нажата или отпущена.
Переключение состояние - логический процесс. Он не описан нигде в нашей системе в качестве готовой команды. Базовые команды - включить или выключить. Т.е., для нормального Toggle нужно знать еще, например, текущее состояние выхода, чтобы управлять клавишей без фиксации или с фиксацией с проходной функцией. Нюансов много и все настраивается согласно заданию.
Если вам затруднительно осваивать wb-rules с нашей помощью или с помощью нашего робота - можете попробовать NODE-Red. Там есть множество сторонних библиотек, где вы наверняка найдете готовые ноды под свои потребности.
dev["wb-mr6cv3_246/K1"] = !dev["wb-mr6cv3_246/K1"];
да, тоже подумал про “!” - попробовал и работает.