Здравствуйте. Счет сигналов нужен для того что-бы не упустить нажатия. Так как модуль работает по modbus, соответственно контроллер не может видеть в реальном времени все нажатия. А интервалы между опросами могут быть разными. Таким образом если нажать и отпустить кнопку в момент опроса другого устройства, то контроллер это нажатие не увидит. Однако он увидит, что изменился счетчик нажатий и обработает нажатие.
Ну и по теме. К сожалению на модбас устройстве не получится сделать долгое нажатие. Это можно устроить с помощью модуля WBIO-DI-DR-16, а вот по модбасу остаётся только следить за счетчиком нажатий. У меня пока нет мыслей как это сделать.
Приведу пример правила, как можно реализовать долгое и короткое нажатие с модулем DR16:
Правило для управления димером. По короткому нажатию включает\выключает, по длинному нажатию увеличивает яркость или уменьшает её.
defineVirtualDevice("dimmer", {
title: "dimmer control",
cells: {
change: {
type: "switch",
value: false
},
value: {
type: "value",
value: 0
},
saved: {
type: "value",
value: 255
},
}
});
var dirct = false;
var lastdirct = false;
var timerLast;
var timerTime;
defineRule("startClicking", {
asSoonAs: function() {
return dev["dimmer/change"];
},
then: function() {
if (dev["dimmer/value"] == 255) {
dirct = false;
} else if (dev["dimmer/value"] == 0) {
dirct = true;
} else {
dirct = !lastdirct;
}
startTicker("clickTimer", 300);
}
});
defineRule("stopClicking", {
asSoonAs: function() {
return !dev["dimmer/change"];
},
then: function() {
timers.clickTimer.stop();
}
});
defineRule("doClick", {
when: function() {
return timers.clickTimer.firing;
},
then: function() {
if (dirct) {
if (dev["dimmer/value"] >= 250) {
dev["dimmer/value"] = 255;
} else {
dev["dimmer/value"] = ((dev["dimmer/value"] * 1) + 10).toFixed(0);
}
} else {
if (dev["dimmer/value"] <= 10) {
dev["dimmer/value"] = 0;
} else {
dev["dimmer/value"] = ((dev["dimmer/value"] * 1) - 10).toFixed(0);
}
}
}
});
defineRule("long_press", {
whenChanged: "wb-gpio/A1_OUT",
then: function(newValue, devName, cellName) {
if (newValue) {
timerLast = Date.now();
dev["dimmer/change"] = true;
} else {
dev["dimmer/change"] = false;
timerTime = Date.now();
if ((timerTime - timerLast) <= 1000) {
if (dev["dimmer/value"] > 0) {
dev["dimmer/saved"] = dev["dimmer/value"];
dev["dimmer/value"] = 0;
} else {
dev["dimmer/value"] = dev["dimmer/saved"];
}
log("Было короткое нажатие");
} else if ((timerTime - timerLast) >= 1000) {
lastdirct = dirct;
log("было длинное нажатие");
}
}
}
});