16 578
правок
Строка 342: | Строка 342: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Обработка | == Обработка счётчиков нажатий == | ||
=== Описание === | |||
Последние версии прошивок устройств Wiren Board могут распознавать типы нажатий подключённых к входам кнопок и транслировать их по [[Modbus]] на контроллер Wiren Board. О том, как устройство распознаёт типы нажатий, читайте в его документации. | |||
Для обработки нажатий нужно отслеживать на контроллере состояние счётчика нужного типа нажатия и, при его изменении, выполнять действие. | |||
Обработку счётчиков удобно делать на [[wb-rules]], но вы можете использовать любой инструмент для автоматизации, например, [[Node-RED]]. Чтобы ускорить опрос счетчиков, настройте [[RS-485:Configuration via Web Interface#poll-period |период опроса]]. | |||
=== Примеры === | |||
В примере мы используем модуль [[WB-MCM8 Modbus Count Inputs | WB-MCM8]] для управления первым каналом диммера [[WB-MDM3 230V Modbus Dimmer | WB-MDM3]]: | |||
# Короткое нажатие включает канал. | |||
# Двойное — выключает канал. | |||
# Длинное — увеличивает яркость. | |||
# Короткое, а затем длинное — уменьшает яркость. | |||
Так как изменение яркости требует растянутое во времени действие, то мы используем таймер. Также мы контролируем состояние входа с кнопкой и прекращаем действие при отпускании кнопки. | |||
<syntaxhighlight lang="js"> | |||
/* ---------------------------- */ | |||
/* 1. Single Press Counter: On action*/ | |||
/* ---------------------------- */ | |||
defineRule({ | |||
whenChanged: "wb-mcm8_20/Input 1 Single Press Counter", | |||
then: function (newValue, devName, cellName) { | |||
dev["wb-mdm3_58/K1"] = true; | |||
} | |||
}); | |||
/* ---------------------------- */ | |||
/* 2. Double Press Counter: Off action*/ | |||
/* ---------------------------- */ | |||
defineRule({ | |||
whenChanged: "wb-mcm8_20/Input 1 Double Press Counter", | |||
then: function (newValue, devName, cellName) { | |||
dev["wb-mdm3_58/K1"] = false; | |||
} | |||
}); | |||
/* --------------------------------------- */ | |||
/* 3. Long Press Counter: Increase brightness */ | |||
/* --------------------------------------- */ | |||
defineRule({ | |||
whenChanged: "wb-mcm8_20/Input 1 Long Press Counter", | |||
then: function (newValue, devName, cellName) { | |||
// Start a timer that will increase the value of the control | |||
startTicker("input1_long_press", 100); | |||
} | |||
}); | |||
// A rule that will increase the brightness on a timer | |||
defineRule({ | |||
when: function () { return timers["input1_long_press"].firing; }, | |||
then: function () { | |||
i = dev["wb-mdm3_58/Channel 1"]; | |||
if (i < 100 && dev["wb-mcm8_20/Input 1"]) { | |||
i++ | |||
dev["wb-mdm3_58/Channel 1"] = i | |||
} else { | |||
timers["input1_long_press"].stop(); | |||
} | |||
} | |||
}); | |||
/* -------------------------------------------- */ | |||
/* 4. Shortlong Press Counter: Decrease brightness */ | |||
/* -------------------------------------------- */ | |||
defineRule({ | |||
whenChanged: "wb-mcm8_20/Input 1 Shortlong Press Counter", | |||
then: function (newValue, devName, cellName) { | |||
// Start a timer that will decrease the value of the control | |||
startTicker("input1_shortlong_press", 100); | |||
} | |||
}); | |||
// A rule that will decrease the brightness on a timer | |||
defineRule({ | |||
when: function () { return timers["input1_shortlong_press"].firing; }, | |||
then: function () { | |||
i = dev["wb-mdm3_58/Channel 1"]; | |||
if (i > 0 && dev["wb-mcm8_20/Input 1"]) { | |||
i-- | |||
dev["wb-mdm3_58/Channel 1"] = i | |||
} else { | |||
timers["input1_shortlong_press"].stop(); | |||
} | |||
} | |||
}); | |||
</syntaxhighlight> | |||
=== Универсальный модуль для wb-rules === | |||
Мы написали модуль для wb-rules [https://github.com/wirenboard/wb-community/tree/main/wb-press-actions wb-press-actions], который облегчает обработку нажатий в ваших скриптах. | |||
== Датчик MSW v.3 == | == Датчик MSW v.3 == |