Мастер-выключатель через wb-gpio/EXT3_INx

Добрый день.
Прошу помощи с правилом для мастер-выключателя на базе кнопки без фиксации подключенной на вход 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"];
1 лайк

да, тоже подумал про “!” - попробовал и работает.