Друзья, киньтесь ссылкой на описание правил написания сценариев. Облазил весь портал - описание железок. А где документация по сценариям?
Редко возникает потребность что-то отредактировать, и приходится тратить кучу времени на поиск документации, т.к. это не моя работа, а у меня просто стоит система wiren board.
Хочу попробовать реализовать короткое и длинное нажатие. Уверен, что многие используют короткое и длинное нажатие. Может быть кто-то кинется готовым сценарием?
Добрый день, slushay!
Основной источник документации по правилам — описание движка в документации, плюс ссылка на GitHub.
Поскольку срабатывание реле происходит по переднему фронту, для обработки длительного нажатия вам придется отвязать вход от управляемого им реле, и создать правило, которое по таймеру отслеживает длительность, и в зависимости от длительности выполняет то или иное действие. Это не очень удобно, поскольку опрос устройства вносит задержку. Вам потребуется настроить опрос соответствующего входа чаще и увеличить скорость обмена данными по шине, чтобы минимизировать задержку.
Практически мгновенно отрабатывают правила для боковых модулей, например WBIO-DI-DR-16. С ними написать нужную логику проще. Привести пример готового фрагмента кода затрудняюсь, может быть, коллеги или участники смогут что-то добавить.
Добрый вечер. Написал небольшое правило. Работать будет хорошо с дискретными модулями ввода (С модбас устройствами к сожалению возникнут трудности). Например WBIO-DI-DR-14.
логика довольно проста: При нажатии смотрим время. При отпускании смотрим ещё раз и сравниваем сколько прошло. Если меньше секунды - короткое нажатие, если больше секунды - длинное нажатие. Вместо wb-gpio/A1_OUT укажите нужное Вам устройство. Вместо логов укажите нужные Вам реакции.
var timerLast;
var timerTime;
defineRule("long_press", {
whenChanged: "wb-gpio/A1_OUT",
then: function(newValue, devName, cellName) {
if (newValue) {
timerLast = Date.now();
}else{
timerTime = Date.now();
if ((timerTime - timerLast) <= 1000) {
log("короткое нажатие");
} else if ((timerTime - timerLast) >= 1000) {
log("длинное нажатие");
}
}
}
});
Большое спасибо! Для начала вполне хватит:smile: