Разные действия нажатием одной кнопки

Подскажите пожалуйста, можно ли назначить на одну кнопку разные действия, чтобы они работали по порядку? Допустим есть три реле, нужно чтобы первым нажатием включилось первое, вторым выключилось, третьим включилось второе реле, четвертым выключилось и так далее. Важно понять сам принцип. Спасибо!

Кнопки использую на WBIO-DI-WD-14

Да, конечно. Создаем правило, в нем переменную
var buttPressCounter = 0;
Например
ее увеличиваем каждый раз когда кнопка нажата.
buttPressCounter += 1;
И сразу же проверяем (Если например действий 5)
if (buttPressCounter>5) then {buttPressCounter=0;} //обнуляем переменную.

Можно где то посмотреть пример подобного скрипта? Сам я пока не осилю

Набросаю. И прокомментирую.

Собственно как обещал:

//скрипт button_click.js
var buttonInput = "wb-gpio/EXT1_IN14" //Здесь определим объект, за которым следим.
var buttonCounter = 0; //счетчик текущих нажатий
var buttonMax = 5; //предел счетчика



defineRule("button_click", { //название правила
  whenChanged: buttonInput, //при изменении состояния кнопки выключателя
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("button_click событие наступило, текущее значение:", newValue)
     if (newValue > 0 ) { //Только нажатие! НЕ отпускание, когда newValue==0
       buttonCounter ++; //Инкремент счетчика
       if ( buttonCounter > buttonMax ) { //если счтчик больше максимального значения
          log.info("button_click сброс счетчика")
	       buttonCounter = 0; //Сбрасываем счетчик
        }
	  buttWork(buttonCounter); //вызов функции, аргумент - текущее значение счетчика.
     } 
  } 
}); 

function buttWork(buttCounter){ //Собственно функция
  log.info("button_click функция, переданное значение:", buttCounter);
}

Сообщения в логе:

2020-07-12 11:47:26button_click событие наступило, текущее значение: true
2020-07-12 11:47:26button_click функция, переданное значение: 1
2020-07-12 11:47:26button_click событие наступило, текущее значение: false
2020-07-12 11:47:29button_click событие наступило, текущее значение: true
2020-07-12 11:47:29button_click функция, переданное значение: 2
2020-07-12 11:47:29button_click событие наступило, текущее значение: false
2020-07-12 11:47:32button_click событие наступило, текущее значение: true
2020-07-12 11:47:32button_click функция, переданное значение: 3
2020-07-12 11:47:32button_click событие наступило, текущее значение: false
2020-07-12 11:47:33button_click событие наступило, текущее значение: true
2020-07-12 11:47:33button_click функция, переданное значение: 4
2020-07-12 11:47:33button_click событие наступило, текущее значение: false
2020-07-12 11:47:33button_click событие наступило, текущее значение: true
2020-07-12 11:47:33button_click функция, переданное значение: 5
2020-07-12 11:47:34button_click событие наступило, текущее значение: false
2020-07-12 11:47:34button_click событие наступило, текущее значение: true
2020-07-12 11:47:34button_click сброс счетчика
2020-07-12 11:47:34button_click функция, переданное значение: 0
2020-07-12 11:47:34button_click событие наступило, текущее значение: false
2020-07-12 11:47:34button_click событие наступило, текущее значение: true
2020-07-12 11:47:34button_click функция, переданное значение: 1
2020-07-12 11:47:34button_click событие наступило, текущее значение: false
2020-07-12 11:47:35button_click событие наступило, текущее значение: true
2020-07-12 11:47:35button_click функция, переданное значение: 2
2020-07-12 11:47:35button_click событие наступило, текущее значение: false
2020-07-12 11:47:35button_click событие наступило, текущее значение: true
2020-07-12 11:47:35button_click функция, переданное значение: 3
2020-07-12 11:47:35button_click событие наступило, текущее значение: false

PS: Логи при реальном применении конечно надо закоменнтировать/удалить. Потому что мусорят в messages.

Спасибо большое за ответ!!!

Пожалуйста, дальше понятно, как в функции обработать переданное значение?

Не могу сказать, что все понял. Сейчас буду пробовать. О результате напишу

Мне видимо еще изучать и изучать. Не понимаю все таки как написать требуемое действие.
Конкретно получается так. Есть 2 реле и 4 разных действия.

  1. включается реле №1
  2. выключается реле №1
  3. включаются реле №1 и №2
  4. выключаются реле №1 и №2
    и далее все заново

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/switch
Переписываем функцию, весь скрипт выглядит так:

var buttonInput = "wb-gpio/EXT1_IN14" //Здесь определим объект, за которым следим.
var buttonCounter = 0; //счетчик текущих нажатий
var buttonMax = 5; //предел счетчика



defineRule("button_click", { //название правила
  whenChanged: buttonInput, //при изменении состояния кнопки выключателя
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("button_click событие наступило, текущее значение:", newValue)
     if (newValue > 0 ) { //Только нажатие! НЕ отпускание, когда newValue==0
       buttonCounter ++; //Инкремент счетчика
       if ( buttonCounter > buttonMax ) { //если счтчик больше максимального значения
          log.info("button_click сброс счетчика")
	       buttonCounter = 0; //Сбрасываем счетчик
        }
	  buttWork(buttonCounter); //вызов функции, аргумент - текущее значение счетчика.
     } 
  } 
}); 

function buttWork(buttCounter){ //Собственно функция
  log.info("button_click функция старт, переданное значение:", buttCounter);
  switch (buttCounter) {
    case 0:
      //Здесь выполняются инструкции, если результат выражения равен 0
      log.info("button_click функция условие 0");
    break;
    case 1:
      //Инструкции, соответствующие 1
      log.info("button_click функция условие 1");
    break;
    case 2:
      //Инструкции, соответствующие 2
      log.info("button_click функция условие 2");
    break;
    case 3:
      //Инструкции, соответствующие 3
      log.info("button_click функция условие 3");
    break;
    case 4:
      //Инструкции, соответствующие 4
      log.info("button_click функция условие 4");
    break;
    case 5:
      //Инструкции, соответствующие 5
      log.info("button_click функция условие 5");
    break;
  }
}

Есть 6 состояний [0…5]
Добавляйте в них требуемые действия.

Буду признателен, если поможете разобрать этот случай до конца. Может тогда и в голове что то отложится.

Спасибо!

Но что разбирать? Уже есть кейс под каждое значение переменной.
Просто дописать туда требуемые действия.

Попробую я пояснить. Как и написано в документации, реле в правилах WirenBoard включаются присвоением 1 соответствующего элемента массива dev.
Например, если у нас есть двухканальное реле MRM2 mini, у которго идентификатор RS-485 = 64, то включить первый канал в нём можно командой:

dev['wb-mrm2-mini_64/K1'] = 1

а выключить второй канал - командой

dev['wb-mrm2-mini_64/K2'] = 0

Таким образом, вам нужно изменить функцию buttWork в соответствии с вашими желаиями. Например, в вашем сценарии это должно быть примерно так:

relay1 =  'wb-mrm2-mini_64/K1'
relay2 =  'wb-mrm2-mini_64/K2'

function buttWork(buttCounter){ //Собственно функция
switch (buttCounter) {
  case 0:
    dev[relay1] = 1
    dev[relay2] = 0
    break;
  case 1:
    dev[relay1] = 0
    dev[relay2] = 0
    break;
  case 2:
    dev[relay1] = 1
    dev[relay2] = 1
    break;
  case 3:
    dev[relay1] = 0
    dev[relay2] = 0
    break;
  }
}

P.S. В новой версии движка, наверное, нужно заменить 1 на true а 0 - на false

1 Like

Все прекрасно работает! Спасибо большое за дополнительное пояснение!
Не понимаю пока без таких деталей. Только начал с этим всем знакомиться.

Благодарю.