// Обработка нажатий выключателя кнопки - алгоритмы управления светом от оператора // короткое нажати при выкл канале - включить // короткое нажатие при вкл. канале - выключить // короткое нажатие при включении и не более чем через 1сек второе - включить всю группу // тоже при выключении - выключить всю группу // при включенном канале нажать и удерживать более 2 сек - диммирование со сметой направления повторным нажатием при диммировании) function sw3_prochod(){ //конструктор первичные установки RN = "sw3_prochod"; //имя преффикс для всех правил IFC = "wb-gpio/EXT1_DR5"; //контролл входа - проходного выключателя OFC = "LV1/K3"; //выходное реле группы света спереди выключателя OBC = "LV1/K2"; //выходное реле группы света спереди выключателя log (RN + ":Инициализация"); var releaseCounter = 0; var prevReleaseCounter = 0; // предыдущее значение счетчика отпусканий для сравнения по таймеру для анализа быстрых нажатий var releaseDelayTimeoutName = RN + "_releaseDelayTimeoutName"; var f_ReleaseCounter = false; // флаг начала работы счетчика отпусканий var f_initial = true; var initimer = RN + "_initimer"; startTimer(initimer,5000); timers[initimer].name = initimer; log (RN + ":Инициализация окончена, ожидание запуска"); defineRule(RN,{// обработка задержки для инициализации москито и прочего when: function(){return timers[initimer].firing;}, then: function(){ log (RN + ":Работа проходного выключателя начата"); defineRule(RN + ".work", { asSoonAs: function () {return dev[IFC] == 0;}, then: function () { if (f_initial){ f_initial = false; return; } log (RN + ".work" + ":обнаружен 0 на входе " + IFC); if (f_ReleaseCounter == false){ //обработка отпускания кнопки f_ReleaseCounter = true; ++releaseCounter; prevReleaseCounter = releaseCounter; log (RN + ".work" + ":зафиксировано отпускание выключателя на входе " + IFC); dev [OFC] = !dev[OFC]; //инвертирование выходного реле timers[releaseDelayTimeoutName].stop(); startTimer(releaseDelayTimeoutName,1000); timers[releaseDelayTimeoutName].name = releaseDelayTimeoutName; log (RN + ".work" + ":Таймер ожидания частых нажатий запущен"); } else { ++releaseCounter; } } //then: function () }); // defineRule(RN, defineRule(RN + "_releaseDelayTimeoutName",{ // обработка таймера releaseDelayTimeoutName when: function(){return timers[releaseDelayTimeoutName].firing;}, then: function(){ log (RN + ".releaseDelayTimeoutName:" + "Окончен таймаут ожидания частых нажатий"); if (releaseCounter != prevReleaseCounter){ log (RN + ".releaseDelayTimeoutName:" + "Фиксируется частое нажатие"); if (dev [OBC] == 1 && dev [OFC] == 1){ log (RN + ".releaseDelayTimeoutName:" + "Выключается задняя зона"); dev[OBC] = 0; } } f_ReleaseCounter = false; } }); // END обработка таймера releaseDelayTimeoutName } }); } sw3_prochod();