Добрый день, подскажите есть ли возможность с 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, сделав таким образом резервную логику.
Заранее благодарю.
Добрый день.
Да, можно сделать используя тот же скрипт. Но нужно выполнить несколько условий:
- Шина должна работать на 115200 для минимизации задержек
- на шине не должно быть много устройств, сосбенно с большим количеством регистров, типа счетчиков MAP*.
Вообще в планах есть добавление аппаратной обработки разных типов нажатий, добавится в существующие реле обновлением прошивки.
Могу протестировать, как работает.
Спасибо. Буду благодарен за дополнительную информацию и про какой скрипт идет речь
Наверное стоит разделить вопросы чтобы они не были в куче.
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 из реле - то можно и усовешенствовать.
Да, вы можете в функциях-хелперах как угодно сравнивать текущие состояния реле и устанавливать их.
Нет. Сейчас при переходе реле в безопасный режим выходы просто отключаются но логика связи входов -выходов и самой маппинг-матрицы не меняется. Такое предложение было, но решили не реализовывать, так как для пользователя неожиденное изменение логики будет, скорее , проблемой.
Спасибо за ответ, этот способ работает только в связке с контроллером, а без контроллера через маппинг таблицу я так понял что не выйдет.
Тут скорее идет речь не о изменении логики, а о возможности реализации резервного управления, конечно имея такую гибкость можно сделать не совсем корректную логику. Но даст возможность резервного управления 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. Поэтому - да, мастер опрашивает состояния входов.
Стоит ли рассчитывать на появление возможности распознавания типов нажатий в ближайшее время?
Очень полезная функция для многих окажется, я думаю!
Возможно, уже летом появится.
Салют! Не появилось?
Добрый день. Пока нет…
Тоже очень жду аппаратное распознавание. Какие прогнозы по срокам?
ждем обновления прошивки