WBE2-DI-DR-3 медленный отклик с сухим контактом

Всем привет. Подскажите: 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. Проблема явно не в правиле обработки нажатий, а во времени отклика входов. Диагностический архив смогу скачать только вечером.

приложен диагностический архив, доступен только сотрудникам поддержки
(305,9 КБ)
Вот диагностический архив. Если нужно правило обработки нажатий, тоже могу выложить, нашел его здесь, подправил под свои устройства.

Как у вас выполняется обработка типов нажатий? Покажите пример, попробую воспроизвести.

(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 означает прерывание.

Это командная строка Линукс?

Да, верно

Спасибо

Вот, может кому будет полезно.
1

Подскажите: WBIO-DI-WD-14 в данном модуле все входы работают одинаково быстро, или есть какие то ограничения?

Работают одинаково быстро.
image