Дребезг кнопки при управлении выходом реле

Добрый день.
Есть кнопка поключенная к дискретному входу контроллера.
Есть релейный модуль управления шторами одним выходом реле управляющий освещением.

Почитал примеры правил. Написал свое. Проблема - не знаю как убрать дребезг кнопки - при нажатии свет моргает по нескольку раз (((

Код правила:
square_track_timer = null;
square_track_timeout_ms = 100;

defineVirtualDevice(“square_track”, {
title: “Square track”,
cells: {
enabled: {
type: “switch”,
value: false
},
}
});

defineRule(“square_track_switch”, {
whenChanged: “square_track/enabled”,
then: function (newValue, devName, cellName) {
dev[“wb-gpio”][“EXT4_ON4”] = newValue;
}
});

defineRule(“square_track_button”, {
whenChanged: “wb-gpio/EXT1_IN9”,
then: function (newValue, devName, cellName) {
//dev[“wb-gpio”][“EXT4_ON4”] = dev[“wb-gpio”][“EXT4_ON4”] ^ newValue;
if (newValue = true) {
if (!square_track_timer) {
square_track_timer = setTimeout(function () {
dev[“wb-gpio”][“EXT4_ON4”] = !dev[“wb-gpio”][“EXT4_ON4”];
square_track_timer = null;
}, square_track_timeout_ms);
}
}
}

Добрый день.
Вообще для входов уже есть антидребезг. Ну и логика не очень понятна - реле переключается по завершению таймера, добавляя 100мс. не лучше сразу проверять налисие таймера, если его нет - переклюсать реле и запускать таймер?

Добрый. Задам возможно глупый вопрос (я в nodejs новичок не говоря уже про ваш движок).
Что в таком случае должна делать функция отложенная по таймеру ?

Сколько раз этот код будет обработан за одно нажатие кнопки ?

Оформим более понятно:

square_track_timer = null;
square_track_timeout_ms = 100;

defineVirtualDevice("square_track", {
title: "Square track",
	cells: {
		enabled: {
		type: "switch",
		value: false
		},
	}
});

defineRule("square_track_switch", {
whenChanged: "square_track/enabled",
	then: function (newValue, devName, cellName) {
		dev["wb-gpio"]["EXT4_ON4"] = newValue;
	}
});

defineRule("square_track_button", {
whenChanged: "wb-gpio/EXT1_IN9",
	then: function (newValue, devName, cellName) {
	//dev["wb-gpio"]["EXT4_ON4"] = dev["wb-gpio"]["EXT4_ON4"] ^ newValue;
		if (newValue = true) {
          if (!square_track_timer) {
              square_track_timer = setTimeout(function () {
                  dev["wb-gpio"]["EXT4_ON4"] = !dev["wb-gpio"]["EXT4_ON4"];
                  square_track_timer = null;
              }, square_track_timeout_ms);
          }
		}
    }
});

Обрабатывает аппаратную кнопку правило “square_track_button”
Я бы переписал его так:

defineRule("square_track_button", {
whenChanged: "wb-gpio/EXT1_IN9",
	then: function (newValue, devName, cellName) {
		if (newValue = true) { //По переднему фронту
          if (!square_track_timer) { //Если таймера нет
              dev["wb-gpio"]["EXT4_ON4"] = !dev["wb-gpio"]["EXT4_ON4"]; //переключаем реле
              square_track_timer = setTimeout(function () { //запускаем таймер
                  square_track_timer = null;
              }, square_track_timeout_ms);
          }
		}
    }
});

Только очищает идентификатор таймера. Таймер используется в качестве семафора, пока он, таймер выполняется - нажатия на кнопку не обрабатываются совсем.

За одно нажатие - один. За отпускание - еще раз, до строчки

		if (newValue) { //По переднему фронту

Исполльзуйте ывывод в лог, удобно же для отладки и понимания:
https://wirenboard.com/wiki/Wb-jscript#.D0.9B.D0.BE.D0.B3.D0.B8

Спасибо за развернутый ответ.

Финальный вопрос. Практически ни в одном примере не видел такого фрагмента когда.

Везде - if (newValue). Не является ли это условие избыточным ?

Я просто скопировал и не стал менять.
(newValue == true) полностью эквивалентно (newValue)
https://wirenboard.com/wiki/Wb-jscript#.D0.A3.D1.81.D0.BB.D0.BE.D0.B2.D0.B8.D1.8F

Избыточным - не является. Нам нужно чтобы правило реагировало только на нажатие кнопки.
То есть вызывается оно, правило, при любом изменении сорстояния. При нажатии (замыкании)и при размыкании. Проверяя в каком сейчас состоянии кнопка - реагируем только на замыкание.

UPD!
if (newValue = true) будет истиной всегда. Благодарю что обратили внимание.
именно условие записывается как if (newValue == true)

ОК. Благодарю за уточнение.