Всем привет. Подскажите: WBE2-DI-DR-3 возможно использовать с кнопочными выключателями? Проблема такая, есть правило на обработку типов нажатий, на входах А1-A4 все работает отлично, а на этом модуле не хотят. То ли дребезг он не обрабатывает, то ли скорость опроса входа медленная. Очень мало по нему информации в описании. Может как то можно время опроса изменить? W1 и W2, если переключить в режим дискретных входов, отрабатывают мгновенно. А этот модуль даже на кнопку реагирует с задержкой.
Добрый день.
Какая ревизия модуля, ревизия контроллера, версия ПО?
Пришлите диагностический архив.
Да, можно. Проверил с помощью простого правила:
defineRule({
whenChanged: "wb-gpio/MOD3_IN1",
then: function(newValue, devName, cellName) {
dev["wb-gpio/EXT1_R3A1"] = newValue;
}
});
Отрабатывает быстро. Как у вас выполняется обработка типов нажатий? Покажите пример, попробую воспроизвести.
Я проверял с помощью этого же правила, только управляя одним из выходов реле WBIO-DO-R1G-16. Реле реагирует на кнопку с задержкой: 0,5-1 сек. С других входов отрабатывает моментально. У меня два модуля: один версии 3.2, второй 3.3, ведут себя одинаково. Контроллер WB-7.4-2G-64G-ind, по 2401. Проблема явно не в правиле обработки нажатий, а во времени отклика входов. Диагностический архив смогу скачать только вечером.
Вот диагностический архив. Если нужно правило обработки нажатий, тоже могу выложить, нашел его здесь, подправил под свои устройства.
Как у вас выполняется обработка типов нажатий? Покажите пример, попробую воспроизвести.
(function () {
'use strict';
var ActionButtons = {};
ActionButtons.onButtonPress = function (trigger, action, timeToNextPress, timeOfLongPress) {
log.info("LongPress ActionButtons.onButtonPress")//Это лог. Он попадает в /var/log/messages
var buttonPressedCounter = 0;
var timerWaitNextShortPress = null;
var timerLongPress = null;
var isLongPress = false;
var ruleName = "on_button_press_" + trigger.replace("/", "_");
defineRule(ruleName, {
whenChanged: trigger,
then: function (newValue, devName, cellName) {
log.info("LongPress defineRule")//Это лог. Он попадает в /var/log/messages
// If button is pressed, wait for a long press
if (newValue) {
if (timerWaitNextShortPress) {
clearTimeout(timerWaitNextShortPress);
}
timerLongPress = setTimeout(function () {
if (typeof action.longPress === "object") {
if (typeof action.longPress.func === "function") {
action.longPress.func.apply(this, action.longPress.prop);
}
}
// 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 === "object") {
if (typeof action.singlePress.func === "function") {
action.singlePress.func.apply(this, action.singlePress.prop);
}
}
// log(">>>>>> short press - single <<<<<<");
break;
// Counter equals 2 - it's a double short press
case 2:
if (typeof action.doublePress === "object") {
if (typeof action.doublePress.func === "function") {
action.doublePress.func.apply(this, action.doublePress.prop);
}
}
// log(">>>>>> short press - double <<<<<<");
break;
}
// Reset the counter
buttonPressedCounter = 0;
}, timeToNextPress);
}
// Catch button released after long press
else {
if (typeof action.longRelease === "object") {
if (typeof action.longRelease.func === "function") {
if (typeof action.longRelease.prop === "array") {
action.longRelease.func.apply(this, action.longRelease.prop);
} else {
action.longRelease.func.apply(this, []);
}
}
}
isLongPress = false;
}
}
}
});
};
// export as Node module / AMD module / browser variable
if (typeof exports === 'object' && typeof module !== 'undefined') {
module.exports = ActionButtons;
} else if (typeof define === 'function' && define.amd) {
define(ActionButtons);
} else {
global.ActionButtons = ActionButtons;
}
}());
ActionButtons.onButtonPress(
"wb-gpio/A1_IN", //Выключатель в прихожей левая клавиша
{
singlePress: {
func: switchRelay,
prop: ["wb-gpio", "EXT1_K1"] //Свет в прихожей
},
doublePress: {
func: switchRelay,
prop: ["wb-gpio", "EXT1_K2"] //Свет левый карниз
},
longPress: {
func: switchRelay,
prop: ["Outside_lamp", "Switch1"] //Свет на улице общий
}
},
600, 1000
);
/**
* Helper Functions
*/
function switchRelay(device, control) { //Принимает в параметрах устройство и выход. Переключает состояние выхода на противоположное.
log.info("LongPress switchRelay" ,device, control)//Это лог. Он попадает в /var/log/messages
dev[device][control] = !dev[device + "/" + control];
}```
В данном скрипте у вас стоит таймаут с задержкой 600 мс на ожидание второго нажатия — timeToNextPress
. Не в этом ли дело? Попробуйте выполнить простой пример, который я указал выше и сообщите о результате.
Я проверял с помощью этого же правила, только управляя одним из выходов реле WBIO-DO-R1G-16. Реле реагирует на кнопку с задержкой: 0,5-1 сек.
Прочитайте пожалуйста мои сообщения, внимательно.
В данном скрипте у вас стоит таймаут с задержкой 600 мс на ожидание второго нажатия —
timeToNextPress
.
И даже в такую задержку два нажатия не возможно сделать, вход не реагирут, другие входы укладываются даже 200мс.
А пробовали использовать все входы модулей? Попробуйте, пожалуйста, повторить именно с 1 или 2 входом того модуля, что установлен во второй слот. Ситуация будет аналогичная?
Да, эти входы срабатывают быстро (MOD2_IN1 и MOD2_IN2), и обработка нажатий на них работает отлично. А входы MOD1_IN1, MOD1_IN2, MOD1_IN3 и MOD2_IN3 срабатывают с задержкой.
Медленный отклик данных входов связан с тем, что они не поддерживают прерывания. Для обработки одиночного нажатия может быть и не совсем критично, а вот для двойного, например, задержка будет мешать. Для обработки разных типов нажатий все же лучше использовать специально предназначенные модули, например, WB-MCM8.
Медленный отклик данных входов связан с тем, что они не поддерживают прерывания.
Из вашего ответа, я понял, что: (MOD2_IN1 и MOD2_IN2) - поддерживают прерывания, а (MOD1_IN1, MOD1_IN2, MOD1_IN3 и MOD2_IN3) - нет. Я правильно понял?
Да, все верно.
Было бы не плохо, если бы это было отображено в тех доке (желательно в герцах). Спасибо за поддержку. А на третьем слоте есть быстрые входы?
Можно посмотреть, выполнив команду:
cat /sys/kernel/debug/gpio | grep MOD3
Сопоставление входа с именем GPIO есть в таблице. IRQ означает прерывание.
Это командная строка Линукс?
Да, верно
Спасибо
Вот, может кому будет полезно.
Подскажите: WBIO-DI-WD-14 в данном модуле все входы работают одинаково быстро, или есть какие то ограничения?
Работают одинаково быстро.