Как написать сценарий длинного нажатия?


#1

Друзья, киньтесь ссылкой на описание правил написания сценариев. Облазил весь портал - описание железок. А где документация по сценариям?
Редко возникает потребность что-то отредактировать, и приходится тратить кучу времени на поиск документации, т.к. это не моя работа, а у меня просто стоит система wiren board.
Хочу попробовать реализовать короткое и длинное нажатие. Уверен, что многие используют короткое и длинное нажатие. Может быть кто-то кинется готовым сценарием?


Контроль удержания входа
#2

Добрый день, slushay!
Основной источник документации по правилам — описание движка в документации, плюс ссылка на GitHub.

Поскольку срабатывание реле происходит по переднему фронту, для обработки длительного нажатия вам придется отвязать вход от управляемого им реле, и создать правило, которое по таймеру отслеживает длительность, и в зависимости от длительности выполняет то или иное действие. Это не очень удобно, поскольку опрос устройства вносит задержку. Вам потребуется настроить опрос соответствующего входа чаще и увеличить скорость обмена данными по шине, чтобы минимизировать задержку.

Практически мгновенно отрабатывают правила для боковых модулей, например WBIO-DI-DR-16. С ними написать нужную логику проще. Привести пример готового фрагмента кода затрудняюсь, может быть, коллеги или участники смогут что-то добавить.


#3

Добрый вечер. Написал небольшое правило. Работать будет хорошо с дискретными модулями ввода (С модбас устройствами к сожалению возникнут трудности). Например 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("длинное нажатие");
            }
        }
    }
});

#4

Большое спасибо! Для начала вполне хватит:smile: