Выключатели на WBIO-DI-WD-14 не всегда срабатывают

При нажатии выключатели не с первого раза происходит выключение: свет выключается и снова включается и так три раза.
клавиши выключателей (без фиксации) заведены на модули WBIO-DI-WD-14.
светильники заведены на модули WB-MR6CU v2
управление реализовано правилами.
фото щита:


Видео процесса:


Выключатели на видео зацеплены на входы:
wb-gpio/EXT3_IN7
wb-gpio/EXT3_IN8
wb-gpio/EXT3_IN9
wb-mio-gpio_47:1/Counter 6

приложен диагностический архив, доступен только сотрудникам поддержки
(273,3 КБ)

Добрый день.
Вы используете модуль WBIO входов. У него нет никакой аппаратной обработки. Соответственно - антидребезг нужно реализовывать программно.
Проверьте пожалуйста скрипты, которыми это делаете.

Добрый день!
Код скриптов был написан до меня. Прошу помощи с антидребезгом.

  1. Скрипт конкретного выключателя
defineRule("035", {
	whenChanged: "wb-gpio/EXT3_IN7",
		then: function (newValue){
		if ( newValue > 0) {
	dev["wb-mr6cu_93"]["K4"] =!dev["wb-mr6cu_93"]["K4"];

}
}
});
  1. Скрипт общий
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) {

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

                if (timerWaitNextShortPress)
                    clearTimeout(timerWaitNextShortPress);

                timerLongPress = setTimeout(function () {
                    dev[action.longPress[0]][action.longPress[1]] = false;
                  	dev[action.longPress00[0]][action.longPress00[1]] = false;
                    dev[action.longPress01[0]][action.longPress01[1]] = false;
                    dev[action.longPress02[0]][action.longPress02[1]] = false;
                    dev[action.longPress03[0]][action.longPress03[1]] = false;
                    dev[action.longPress04[0]][action.longPress04[1]] = false;
                    dev[action.longPress05[0]][action.longPress05[1]] = false;
                    dev[action.longPress06[0]][action.longPress06[1]] = false;
                    dev[action.longPress07[0]][action.longPress07[1]] = false;
                    dev[action.longPress08[0]][action.longPress08[1]] = false;
                    dev[action.longPress09[0]][action.longPress09[1]] = false;
                    dev[action.longPress10[0]][action.longPress10[1]] = false;
                    dev[action.longPress11[0]][action.longPress11[1]] = false;
                    dev[action.longPress12[0]][action.longPress12[1]] = false;
                    dev[action.longPress13[0]][action.longPress13[1]] = false;
                    dev[action.longPress14[0]][action.longPress14[1]] = false;
                    dev[action.longPress15[0]][action.longPress15[1]] = false;
                    dev[action.longPress16[0]][action.longPress16[1]] = false;
                    dev[action.longPress17[0]][action.longPress17[1]] = false;
                    dev[action.longPress18[0]][action.longPress18[1]] = false;
                    dev[action.longPress19[0]][action.longPress19[1]] = false;
                    dev[action.longPress20[0]][action.longPress20[1]] = false;
                    dev[action.longPress21[0]][action.longPress21[1]] = false;
                    dev[action.longPress22[0]][action.longPress22[1]] = false;
                    dev[action.longPress23[0]][action.longPress23[1]] = false;
                    dev[action.longPress24[0]][action.longPress24[1]] = false;
                    dev[action.longPress25[0]][action.longPress25[1]] = false;
                    dev[action.longPress26[0]][action.longPress26[1]] = false;
                    dev[action.longPress27[0]][action.longPress27[1]] = false;
                    dev[action.longPress28[0]][action.longPress28[1]] = false;
                    dev[action.longPress29[0]][action.longPress29[1]] = false;
                    dev[action.longPress30[0]][action.longPress30[1]] = false;
                    dev[action.longPress31[0]][action.longPress31[1]] = false;
                    dev[action.longPress32[0]][action.longPress32[1]] = false;
                    dev[action.longPress33[0]][action.longPress33[1]] = false;
                    dev[action.longPress34[0]][action.longPress34[1]] = false;
                    dev[action.longPress35[0]][action.longPress35[1]] = false;
                    dev[action.longPress36[0]][action.longPress36[1]] = false;
                    dev[action.longPress37[0]][action.longPress37[1]] = false;
                    dev[action.longPress38[0]][action.longPress38[1]] = false;
                    dev[action.longPress39[0]][action.longPress39[1]] = false;
                    dev[action.longPress40[0]][action.longPress40[1]] = false;
                    dev[action.longPress41[0]][action.longPress41[1]] = false;
                    dev[action.longPress42[0]][action.longPress42[1]] = false;
                    dev[action.longPress43[0]][action.longPress43[1]] = false;
                    dev[action.longPress44[0]][action.longPress44[1]] = false;
                    dev[action.longPress45[0]][action.longPress45[1]] = false;
                    dev[action.longPress46[0]][action.longPress46[1]] = false;
                    dev[action.longPress47[0]][action.longPress47[1]] = false;
                    dev[action.longPress48[0]][action.longPress48[1]] = false;
                    dev[action.longPress49[0]][action.longPress49[1]] = false;
                    dev[action.longPress50[0]][action.longPress50[1]] = false;
                    dev[action.longPress51[0]][action.longPress51[1]] = false;
                    dev[action.longPress52[0]][action.longPress52[1]] = false;
                                      
                    // 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:
                                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:
                                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-gpio/EXT1_IN1",
    {
        //singlePress: ["relay2", "K1"],
        //doublePress: ["relay2", "K2"],
        longPress: 	["wb-mr6cu_95", "K1"],
      	longPress00: ["wb-mr6cu_95", "K2"],
		longPress01: ["wb-mr6cu_95", "K3"],
		longPress02: ["wb-mr6cu_95", "K5"],
		longPress03: ["wb-mr6cu_95", "K4"],
		longPress04: ["wb-mr6cu_95", "K6"],
		longPress05: ["wb-mr6cu_94", "K1"],
		longPress06: ["wb-mr6cu_94", "K2"],
		longPress07: ["wb-mr6cu_94", "K3"],
		longPress08: ["wb-mr6cu_94", "K4"],
		longPress09: ["wb-mr6cu_94", "K5"],
		longPress10: ["wb-mr6cu_94", "K6"],
		longPress11: ["wb-mr6cu_145", "K1"],
		longPress12: ["wb-mr6cu_145", "K2"],
		longPress13: ["wb-mr6cu_145", "K3"],
		longPress14: ["wb-mr6cu_145", "K4"],
		longPress15: ["wb-mr6cu_145", "K5"],
		longPress16: ["wb-mr6cu_145", "K6"],
		longPress17: ["wb-mr6cu_132", "K1"],
		longPress18: ["wb-mr6cu_132", "K2"],
		longPress19: ["wb-mr6cu_132", "K3"],
		longPress20: ["wb-mr6cu_132", "K4"],
		longPress21: ["wb-mr6cu_132", "K5"],
		longPress22: ["wb-mr6cu_132", "K6"],
		longPress23: ["wb-mr6cu_130", "K1"],
		longPress24: ["wb-mr6cu_130", "K2"],
        longPress25: ["wb-mr6cu_130", "K3"],
        longPress26: ["wb-mr6cu_130", "K4"],
        longPress27: ["wb-mr6cu_130", "K5"],
        longPress28: ["wb-mr6cu_130", "K6"],
        longPress29: ["wb-mr6cu_93", "K1"],
        longPress30: ["wb-mr6cu_93", "K2"],
        longPress31: ["wb-mr6cu_93", "K3"],
        longPress32: ["wb-mr6cu_93", "K4"],
        longPress33: ["wb-mr6cu_93", "K5"],
        longPress34: ["wb-mr6cu_93", "K6"],
        longPress35: ["wb-mr6cu_177", "K1"],
        longPress36: ["wb-mr6cu_177", "K2"],
        longPress37: ["wb-mr6cu_177", "K3"],
        longPress38: ["wb-mr6cu_177", "K4"],
        longPress39: ["wb-mr6cu_177", "K5"],
        longPress40: ["wb-mr6cu_177", "K6"],
        longPress41: ["wb-mr6cu_44", "K1"],
        longPress42: ["wb-mr6cu_44", "K2"],
        longPress43: ["wb-mr6cu_44", "K3"],
        longPress44: ["wb-mr6cu_44", "K4"],
        longPress45: ["wb-mr6cu_44", "K5"],
        longPress46: ["wb-mr6cu_44", "K6"],
        longPress47: ["wb-mr6cu_17", "K1"],
        longPress48: ["wb-mr6cu_17", "K2"],
        longPress49: ["wb-mr6cu_17", "K3"],
        longPress50: ["wb-mr6cu_17", "K4"],
        longPress51: ["wb-mr6cu_17", "K5"],
        longPress52: ["wb-mr6cu_17", "K6"],

	
    },
    200, 1000
);

Тут нет антидребезга, совсем.

А тут как раз есть. Но реализация немного непонятная. Хотя похоже на Нестандартные функции выключателей - #5 от пользователя BrainRoot Почему не используете его?

Скрипты были написаны ранее, не мной.
Заменил скрипты используя ваши примеры, наблюдаем:

var timerLast;
var timerTime;
defineRule("035", {
    whenChanged: "wb-gpio/EXT1_IN10",
    then: function(newValue, devName, cellName) {
        if (newValue) {
          timerLast = Date.now();
        }else{
           timerTime = Date.now();
          if ((timerTime - timerLast) <= 1000) {
                //log("короткое нажатие");
				dev["wb-mr6c_23"]["K1"] =!dev["wb-mr6c_23"]["K1"];
            } else if ((timerTime - timerLast) >= 1000) {
                //log("длинное нажатие");
				dev["wb-mr6c_23"]["K1"] = false; // Свет общий
				dev["wb-mr6c_23"]["K2"] = false; // Подсветка у пола
				dev["wb-mr6c_23"]["K3"] = false; // Свет в гардеробе
				dev["wb-mr6c_23"]["K4"] = false; // Подсветка слева
				dev["wb-mr6c_23"]["K5"] = false; // Подсветка справа
				dev["wb-mr6c_23"]["K6"] = false; // Подсветка над кроватью
            }
        }
    }
});
1 лайк

Если содержание скрипта непонятно - то, обычно, проще написать его самостоятельно, тут согласен.