WB-MR6 и продолжительность нажатия

Здравствуйте. Счет сигналов нужен для того что-бы не упустить нажатия. Так как модуль работает по 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("было длинное нажатие");
            }
        }
    }
});
1 лайк