// Обработка нажатий выключателя кнопки - алгоритмы управления светом от оператора // короткое нажати при выкл канале - включить // короткое нажатие при вкл. канале - выключить // короткое нажатие при включении и не более чем через 1сек второе - включить всю группу // тоже при выключении - выключить всю группу // при включенном канале нажать и удерживать более 2 сек - диммирование со сметой направления повторным нажатием при диммировании) function switchControlGROUP_SW3(){ //конструктор первичные установки var RN = "sw2_rule"; var INPUT = "wb-gpio/EXT1_DR2"; var OUTPUT = "LV1/K2"; var DIMM = "wb-dac/EXT_O1"; var SDL = 5000; // начальный уровень освещенности например 5000 соотв. 5 вольт на выход A0-10V var AllOnChannels = ["LV1/K2","LV1/K3"]; var AllOffChannels = ["LV1/K2","LV1/K3"]; //конструктор первичные установки var logPreff = RN + ":"; log (logPreff + "запущен "); var f_ini = true; defineRule(RN + "_initialisation",{ asSoonAs: function(){return f_ini;}, then:function(){ var releaseCounter = 0; var prevReleaseCounter = 0; // предыдущее значение счетчика отпусканий для сравнения по таймеру для анализа быстрых нажатий var dimmPrepTimeoutName = RN + "_dimmPrepTimeoutName"; // имя таймаута времени удержания кнопки, после чего начинается диммирование var releaseDelayTimeoutName = RN + "releaseDelayTimeoutName"; ; // имя таймаута определения быстрого нажатия var dimmIntervalName = RN + "_dimmIntervalName"; // ID интервала шага изменеия значения напряжения для диммирования var f_initial = true; // пустой проход - защита от срабатывания при старте правил var f_ReleaseCounter = false; // флаг начала работы счетчика отпусканий var f_Hold = false; // флаг начала нажатия (для диммирования) var f_Dimming = false; // флаг работы диммирования (для определения произошедшего только что диммирования) var f_DimmingDirection; // флаг направления диммирования true - вверх, false - вниз if (SDL == undefined) {SDL = dev [DIMM]}; // если явно не задан начальный уровень освещенности при инициализации, берем текущий if (SDL > 5000) {f_DimmingDirection = false} //определение направления диммирования в зависимости от величины нач. ур. освещенности else {f_DimmingDirection = true}; defineRule(RN + "_release",{ asSoonAs: function () {return dev[INPUT] == 0;}, then: function (){ if (f_initial){ f_initial = false; return; } logPreff = RN +".release:"; log (logPreff + "обнаружен 0 на входе " + INPUT); if (f_Dimming){ log (logPreff + "Это отпускание после диммирования. Димм стоп, меняем направление, все остальное оставляем"); f_DimmingDirection = !f_DimmingDirection; timers[dimmIntervalName].stop(); f_Dimming = false; return; } else{ timers[dimmPrepTimeoutName].stop(); timers[dimmIntervalName].stop(); } if (f_ReleaseCounter == false && !f_Dimming){ //обработка отпускания кнопки f_ReleaseCounter = true; ++releaseCounter; prevReleaseCounter = releaseCounter; log (logPreff + "зафиксировано отпускание выключателя на входе " + INPUT); dev [OUTPUT] = !dev [OUTPUT]; //инвертирование выходного реле timers[releaseDelayTimeoutName].stop(); startTimer(releaseDelayTimeoutName,1000); timers[releaseDelayTimeoutName].name = releaseDelayTimeoutName; log (logPreff + "Таймер ожидания частых нажатий запущен"); } else{ ++releaseCounter; } } //then: function (newValue,devName,cellName) }); //defineRule(RN + "_release" defineRule(RN + "_press", { asSoonAs: function () {return dev[INPUT] == 1;}, then: function (){ logPreff = RN + ".press:"; log (logPreff + "Зафиксировано нажатие выключателя на входе " + INPUT); if (dev [OUTPUT] == 1 && !f_Dimming){ log (logPreff + "команда диммирования? ожидание времени непрерывного удержания"); timers[dimmPrepTimeoutName].stop(); timers[dimmIntervalName].stop(); startTimer(dimmPrepTimeoutName,2000); timers[dimmPrepTimeoutName].name = dimmPrepTimeoutName; } }//then: function (){ })//defineRule(self.RN + "_press", { defineRule(RN + "_releaseDelayTimeoutName",{// обработка сработки таймера _releaseDelayTimeoutName when: function(){return timers[releaseDelayTimeoutName].firing;}, then: function(){ logPreff = (RN + ".releaseDelayTimeoutName:"); log (logPreff + "Окончен таймаут ожидания частых нажатий"); if (releaseCounter != prevReleaseCounter){ log (logPreff + "Фиксируется частое нажатие"); if (dev [OUTPUT] == 1){ log (logPreff + "Включается группа AllOnChannels"); for (var i=0; i 1000) {SDL = SDL - 1000}; dev [DIMM] = SDL; log (logPreff + "Идет диммирование " + f_DimmingDirection + ", значение " + SDL); log (logPreff + DIMM + " = " + dev [DIMM]); } }); f_ini = false; } }); }; // swichControlGROUP = function switchControlGROUP_SW3();