Добрый день.
Есть такая задача - управлять одноцветными лентами - вкл/выкл плюс диммирование - возвратными выключателями, подключенными к входам WD14 и реализовано должно быть на движке правил. Судя по документации штатного определения типа нажатий у WD14 нет. Я не программист, так что, по сути, изобретаю велосипед. Отсюда вопрос - будет ли работать такой код?
//выполнение операции по типу нажатия клавиши
function PressAction(trigger,device,deviceBri){
var timerLongPress = null;
var timeOfLongPress = 300;
var isLongPress = false;
var ruleName1 = "rule1_" + trigger.replace("/", "_");
var ruleName2 = "rule2_" + trigger.replace("/", "_");
var tickerName = "ticker_" + ruleName;
var Direction = true; //направление диммирования true - вверх, false - вниз
var dBri;
var deviceB = Array.isArray(deviceBri);//проверка задано ли более одного канала
if (deviceB) {
//унификация параметра яркости на всех каналах
dBri = dev[deviceBri[0]];
for (var k = 0, k < deviceBri.length, k++){
dev[deviceBri[k]] = dBri;
}
} else {
//задан один канал
dBri = dev[deviceBri];
}
//определение направления диммирования
if (dBri = 100){
Direction = false;
}
//определение типа нажатия
defineRule(ruleName1, {
whenChanged: trigger,
then: then: function(newValue, devName, cellName)
if (newValue){
if (timerLongPress != null){
clearTimeout(timerLongPress);
}
timerLongPress = setTimeout(function (){
isLongPress = true;
}, timeOfLongPress);
if (isLongPress){
//тип нажатия longpress, включаем итерацию
startTicker(tickerName, 100);
}
} else {
//тип нажатия Click
if (!isLongPress){
////проверка задано ли более одного канала
var deviceC = Array.isArray(device);
if (deviceC){
var j;
var dOn = false;
for (j = 0; j < device.length; j++){
if (dev[device[j]]) {
dOn = true;
}
}
//если любой из каналов включен, отключаем все
if (dOn){
for (j = 0; j < device.length; j++){
if (dev[device[j]]) {
dev[device[j]] = false;
}
}
} else {
//поскольку все каналы отключены, включаем все
for (j = 0; j < device.length; j++){
if (dev[device[j]]) {
dev[device[j]] = true;
}
}
}
} else {
//задан один канал, производим переключение
dev[device] = !dev[device];
}
}
}
});
//изменение яркости по longpress
defineRule(ruleName2,{
when: function () { return timers.tickerName.firing; },
then: function () {
//проверка задано ли более одного канала
var deviceB = Array.isArray(deviceBri);
var i;
if (deviceB){
//изменение яркости на каждом канале согласно направления
for (var l = 0, l < deviceBri.length, l++){
i = dev[deviceBri[l]];
if (Direction){
if (i < 100 && trigger) {
i++
dev[deviceBri[l]] = i
} else {
timers.tickerName.stop();
}
} else {
if (i > 0 && trigger) {
i--
dev[deviceBri[j]] = i
} else {
timers.tickerName.stop();
}
}
}
} else {
//задан один канал
i = dev[deviceBri];
if (Direction){
if (i < 100 && trigger) {
i++
dev[deviceBri] = i
} else {
timers.tickerName.stop();
}
} else {
if (i > 0 && trigger) {
i--
dev[deviceBri] = i
} else {
timers.tickerName.stop();
}
}
}
}
});
}
PressAction(trigger1, target1, target1_bri);
PressAction(trigger2, [target2,target3], [target2_bri,target3_bri]);
Где trigger это вход по типу “/wb-gpio/EXT@IN@", target - канал "wb-led@/controls/Channel @”, target_bri - “wb-led_@/controls/Channel @ Brightness”