WB-MR6C v.2 Управление несколькими нажатиями кнопкой без фиксации

Добрый день, подскажите есть ли возможность с Wiren Board 6 и без на WB-MR6C v.2 управлять несколькими кратковременными нажатиями кнопкой без фиксации несколькими выходами.
К примеру, подключено к 1му входу кнопка без фиксации, если сделать одно нажатие то включится 1 выход, 2 коротких нажатия - включится 1 и 2й выходы итд.
Или такую логику возможно сделать только с Wiren Board 6 + WBIO-DI-WD-14 + WB-MR6C v.2 и если только так то есть возможностиь при подключеном контроллере отключать входы WB-MR6C v.2 и включать их только при потере связи с Wiren Board 6, сделав таким образом резервную логику.
Заранее благодарю.

1 лайк

Добрый день.
Да, можно сделать используя тот же скрипт. Но нужно выполнить несколько условий:

  • Шина должна работать на 115200 для минимизации задержек
  • на шине не должно быть много устройств, сосбенно с большим количеством регистров, типа счетчиков MAP*.
    Вообще в планах есть добавление аппаратной обработки разных типов нажатий, добавится в существующие реле обновлением прошивки.
    Могу протестировать, как работает.
1 лайк

Спасибо. Буду благодарен за дополнительную информацию и про какой скрипт идет речь

Наверное стоит разделить вопросы чтобы они не были в куче.
1. Имея на руках WB-MR6C v.2 можно ли запрограммировать их на работу по нескольким импульсам.
Как пример:
Одиночный импульс на первый вход включает релейный выход 1 и 2, второй импульс выключает релейные выходы 1 и 2. Два коротких импульса включают релейный вход 1 и выключают релейный выход 2, следующие 2 инвертируют состояние релейных выходов. При этом логика работы одиночного импульса остается т.е. при включеном первом или втором релейном выходе одиночный импульс будет выключать, а при втором включать оба выхода.
Раньше такое я реализовывал на Siemens LOGO, а сейчас решил сделать подобное c WirenBoard, надеюсь получится)

2. Вариант два, имея на руках WB-MR6C v.2 и Wiren Board 6, можно ли как то построить схему работы с резервным управлением.
Пример:
К входам подключены кнопочные выключатели, к выходам лампочки. Я могу заранее перемычками собрать схему работы по принципу вкл/выкл покомнатно одним импульсом. Но в Wiren Board 6 заложить более сложную логику работы, с 1м, 2мя, 3мя импульсами.
Когда Wiren Board 6 на связи, то входы WB-MR6C v.2 не обращают внимания на сигналы и полностью управляются Wiren Board 6, но когда с контроллером пропадает связь, входы WB-MR6C v.2 начинают обрабатывать поступающие сигналы.

Уточнения: мне для реализации 2го варианта нужно будет Wiren Board 6 + WBIO-DI-WD-14 для реализации сложной логики, и WB-MR6C v.2 + перемычки если нужно одной кнопкой включать несколько релейных выходов

https://support.wirenboard.com/t/dvizhok-pravil-primery-koda/483/78

Итак, имеем реле c адресом 45 на порту /dev/ttyMOD3
поднимаем ему скорость, заодно отключим взаимодействие входа 0 с матрицей:

export DEV_PORT=/dev/ttyMOD3
export DEV_ADDR=45
systemctl stop wb-mqtt-serial
modbus_client --debug -mrtu -pnone -s2 $DEV_PORT -a$DEV_ADDR -t0x06 -r110 1152
modbus_client --debug -mrtu -b115200 -pnone -s2 $DEV_PORT -a$DEV_ADDR -t0x06 -r16 3
systemctl start wb-mqtt-serial

Также меняем скорость порта через веб-итнтерфейс.

Ок, у нас реле на скорости 115200 и вход 0 не взаимодействует с контроллером.
Пишем скриптик:

//03_19_test_02.js


/**
 * Function that identifies what kind of press was performed: single, double or long press;
 * and assigns an action for each type of press.
 *
 * @param  {string} ruleName -  Name of the rule that will be defined.
 * @param  {string} trigger  -  Name of device and control in the following format: "<device>/<control>".
 * @param  {object} action   -  Object that defines relays that will be switched.
 *                              Keys: "singlePress", "doublePress", "longPress".
 *                              Each key contains an array of the following format: ["<device>", "control"].
 * 								or function! Re-added bu Brainroot
 * @param  {number} timeToNextPress - Time (ms) after button up to wait for the next press before reseting the counter.
 * @param  {number} timeOfLongPress - Time (ms) after button down to be considered as as a long press.
 */
function onButtonPress(ruleName, trigger, action, timeToNextPress, timeOfLongPress) {
    var buttonPressedCounter = 0;
    var timerWaitNextShortPress = null;
    var timerLongPress = null;
    var isLongPress = false;

    defineRule(ruleName, {
        whenChanged: trigger,
        then: function (newValue, devName, cellName) {
          log.info("Enter rule")

            // If button is pressed, wait for a long press
            if (newValue) {

                if (timerWaitNextShortPress)
                    clearTimeout(timerWaitNextShortPress);

                timerLongPress = setTimeout(function () {
                  if (typeof action.longPress.func === "function") {
                    log.info("longPress is function")
                    action.longPress.func.apply(this, action.longPress.prop);
                  }
                  else{
                    dev[action.longPress[0]][action.longPress[1]] = !dev[action.longPress[0]+"/"+action.longPress[1]];
                  }
                    // log(">>>>>>> long press <<<<<<");
                    isLongPress = true;  // Long press identified, we will skip short press
                    buttonPressedCounter = 0;
                }, timeOfLongPress);

            }

            // If button is released, then it is not a "long press", start to count clicks
            else {
                if (!isLongPress) {
                    clearTimeout(timerLongPress);
                    buttonPressedCounter += 1;
                    timerWaitNextShortPress = setTimeout(function () {
                        switch (buttonPressedCounter) {
                        // Counter equals 1 - it's a single short press
                        case 1:
                            if (typeof action.singlePress.func === "function") {
                              log.info("singlePress is function")
                              action.singlePress.func.apply(this, action.singlePress.prop);
                        	}
                            else{
                                dev[action.singlePress[0]][action.singlePress[1]] = !dev[action.singlePress[0]+"/"+action.singlePress[1]];
                                // log(">>>>>> short press - single <<<<<<");
                            }
                            break;
                        // Counter equals 2 - it's a double short press
                        case 2:
                            if (typeof action.doublePress.func === "function") {
                              log.info("doublePress is function")
                              action.doublePress.func.apply(this, action.doublePress.prop);
                            }
                            else{
                              dev[action.doublePress[0]][action.doublePress[1]] = !dev[action.doublePress[0]+"/"+action.doublePress[1]];
                              // log(">>>>>> short press - double <<<<<<");
                            }
                            break;
                        }
                        // Reset the counter
                        buttonPressedCounter = 0;
                    }, timeToNextPress);
                }
                isLongPress = false;
            }

        }
    });

}





// Usage example:
onButtonPress(
    "on_button_press",
    "wb-mr6c_45/Input 0",
    {
      singlePress: {
      	func: singlePressHelper, prop: ["singlePress", "wb-mr6c_45/K1"]
      },
      doublePress: {
        func: doublePressHelper, prop: ["doublePress", "wb-mr6c_45/K2"]
      },
      longPress: {
 	     func: longPressHelper, prop:["longPress", "wb-mr6c_45/K3"]
	  }	
    },
    300, 2000
);




singlePressHelper("kva-kva1", "wb-mr6c_45/K1")
doublePressHelper("kva-kva2", "wb-mr6c_45/K2")
longPressHelper("kva-kva3", "wb-mr6c_45/K3")

function singlePressHelper(paramString, param){
  log.info("function singlePress:",paramString)
  dev[param] = !dev[param]
}

function doublePressHelper(paramString, param){
  log.info("function doublePress:",paramString)
  dev[param] = !dev[param]
}

function longPressHelper(paramString, param){
  log.info("function longPress:",paramString)
  dev[param] = !dev[param]
}

Работает. Если дописать еще анализ couner из реле - то можно и усовешенствовать.

3 лайка

Да, вы можете в функциях-хелперах как угодно сравнивать текущие состояния реле и устанавливать их.

Нет. Сейчас при переходе реле в безопасный режим выходы просто отключаются но логика связи входов -выходов и самой маппинг-матрицы не меняется. Такое предложение было, но решили не реализовывать, так как для пользователя неожиденное изменение логики будет, скорее , проблемой.

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

Тут скорее идет речь не о изменении логики, а о возможности реализации резервного управления, конечно имея такую гибкость можно сделать не совсем корректную логику. Но даст возможность резервного управления WB-MR6C v.2 в случае если выйдет из строя контроллер или что то случится с ПО.
Я предполагаю ситуацию когда на объекте еще не стоит контроллер или он не доконца настроен, а управлять освещением уже нужно.
К примеру я объеденяю входы 1 и 2 на WB-MR6C v.2 в одну кнопку, но при этом в паралельно эту же кнопку завожу на вход 1 в WBIO-DI-WD-14, при рабочем/включеном контроллере я обрабатываю сиграл с WBIO-DI-WD-14 и включаю выходы 1, 2 или 1 и 2 в зависимости от сценария, а в случае если контроллер выключен или его нет то обрабатываю сигнал на прямую через входы 1 и 2 (кнопка подключена на 1 вход, а на вход 2 стоит перемычка) WB-MR6C v.2.
Можно конечно развязать эту логику еще дополнительным перекючающим релле, но возможно есть шанс обойтись без него.

Либо я немного не понял принцип работы. Если есть контроллер то WB-MR6C v.2 работает по сценариям контроллера, но если нет контроллера, то WB-MR6C v.2 начинает работать в режиме прямого управления?

Да, сейчас реле аппаратно не поддерживают распознавание типов нажатий. Когда добавим - в матрице появятся реакции на них, груюо говоря больше бит использоваться будет.

На реле можно определить режим работы входа: для фиксированного выключателя, для кнопки, по матрице или никак с выходами не взаимодействовать. Контроллер может в любом случае читать состояние входа. Я и перевел вход “0” в режим “не взаимодействовать” чтобы управлять с контроллера.

Не думаю что имеет смысл добавлять лишнюю логику с реле, оно и так гибко. Когда добавим типы нажатий - можно и без контроллера работать совсем. Хотя и сейчас можно.

Понял, спасибо, буду тогда ждать обновления прошивки на релейный модуль.

Тут я тоже практически нашел решение, осталость его проверить, добавлю в стему что то типа вочдога, который в случае отсутствия связи с контроллером изменить значение на WB-MR6C v.2 режима работы на “0” кнопка без фиксации, а по восстановлению связи на “3”

То есть какой-то микроконтроллер, который сидит на шине и слушает ее, в случае отсутствия обмена какое-то время - становится “мастером” и отправляет в реле изменения конфигурации?

Хм, а вот "по восстановлению - лучше это делать контроллеру, как я считаю, потому что два мастера на шине обязательно приведут к ошибкам и нормально работать не смогут.

Это будет консоль управления на raspberryPi + сенсорный экран.

Тут понял, я просто подумал что WB6 не восстановит сам по себе состояние регистра релейного модуля при загрузке. Значит стало еще проще в реализации.

Спасибо.

Подскажите, в такой реализации контроллер просто опрашивает состояние кнопки в реле каждые N миллисекунд и засирает канал или само реле отправляет в modbus информацию о изменении gpio?

Протокол Modbus исключает начало обмена устройством-slave. Только Master. Поэтому - да, мастер опрашивает состояния входов.

Стоит ли рассчитывать на появление возможности распознавания типов нажатий в ближайшее время?
Очень полезная функция для многих окажется, я думаю!

1 лайк

Возможно, уже летом появится.

3 лайка

Салют! Не появилось?

Добрый день. Пока нет…

Тоже очень жду аппаратное распознавание. Какие прогнозы по срокам?

3 лайка

ждем обновления прошивки