12 KiB
Двойные, тройные, длительные нажатия
Источник: Wiki LightHub (lazyhome.ru), страницы «двойные_тройные_длительные_нажатия» и «несколько_кнопок_на_одном_входе». Снапшот от 2026-10-02.
Начиная с этого коммита у прошивки появилась возможность отслеживать одинарные, двойные, тройные, долгие нажатия
Конечный автомат, согласно которому реализован алгоритм, приведен на рисунке
(см. иллюстрацию на wiki-странице)
Фрагмент конфига (раздел in, на примере pin 68), который задает обработчики для нажатий, приведен ниже. Каждое событие описывается JSON объектом или массивом JSON обьектов. Внутри объекта, возможны следующие строковые параметры:
Типы нажатий
scmd- начало первого нажатияrcmd- конец первого нажатияlcmd- первое длительное нажатиеclick- одиночное нажатиеdclick- двойное нажатиеtclick- тройное нажатиеscmd2- начало двойного нажатияscmd3- начало тройного нажатияlcmd2- второе длительное нажатиеlcmd3- третье длительное нажатиеrpcmd- цикл первого длительного нажатияrpcmd2- цикл второго длительного нажатияrpcmd3- цикл третьего длительного нажатия
Параметры обработчика нажатий
-
emit- MQTT топик в который отправить значение из параметра ecmd (если в параметре отсутствует / он будет дополнен слева префиксом статусного топика) -
ecmd- MQTT payload -
erev- если параметр задан, значения ecmd и erev будут подставляться попеременно для каждого нажатия. Позволяет обеспечить, например, увеличение и уменьшение яркости лампы одной клавишей. -
item- имя локального устройства из items (может содержать суффикс для указания того, какое именно свойство объекта надо изменить. Например: "lamp/hue" или "lamp/sat") -
icmd- команда для локального устройства (ON | OFF | HALT | REST | XON | XOFF | INCREASE | DECREASE | %<цифра> и т.д) -
irev- если параметр задан, значения icmd и irev будут подставляться попеременно для каждого нажатия. Позволяет обеспечить, например, увеличение и уменьшение яркости лампы одной клавишей.
"68":{"T":0,
"scmd":{"emit":"cmd","ecmd":"scmd"},
"rcmd":{"emit":"cmd","ecmd":"rcmd"},
"lcmd":{"emit":"cmd","ecmd":"lcmd"},
"click":{"emit":"cmd","ecmd":"click","item":"a_bedr","icmd":"TOGGLE"},
"dclick":[{"emit":"myhome/in/bedr","ecmd":"TOGGLE"},{"emit":"myhome/in/bedrspot","ecmd":"TOGGLE"}],
"tclick":{"item":"spi","icmd":"TOGGLE"},
"scmd2":{"emit":"cmd","ecmd":"scmd2"},
"scmd3":{"emit":"cmd","ecmd":"scmd3"},
"lcmd2":{"emit":"cmd","ecmd":"lcmd2"},
"lcmd3":{"emit":"cmd","ecmd":"lcmd3"},
"rpcmd":{"item":"a_bedr","icmd":"INCREASE"},
"rpcmd2":{"item":"a_bedr","icmd":"DECREASE"},
"rpcmd3":{"emit":"cmd","ecmd":"rpcmd3"}
},
Еще пример:
- Длительное нажатие через раз увеличивает или уменьшает яркость группы ligth (суффикс set позволяет менять яркость не включая канал, если он выключен)
- Соответственно, длительное нажатие через двойной или тройной клик позволяет так же управлять цветом и насыщенностью
- Двойное и тройное нажатие без удерживания включают/выключают группы kuhktc и gstall соответственно
- Команда %-Х уменьшает параметр на Х пунктов, соответственно %+Х увеличивает
"63":{"T":2,
"click":{"item":"light","icmd":"TOGGLE"},
"rpcmd":{"item":"light/set","icmd":"%+5","irev":"%-5"},
"rpcmd2":{"item":"light/hue","icmd":"%+5","irev":"%-5"},
"rpcmd3":{"item":"light/sat","icmd":"%+5","irev":"%-5"},
"dclick":{"item":"kuhktc/cmd","icmd":"TOGGLE"},
"tclick":{"item":"gstall","icmd":"TOGGLE"}},
Еще пара полезных примеров для обычных (не кнопочных) выключателей В первом - кратковременное выключение выключателя включает белый свет на полную (повторное - включает максимально насыщенный цвет и яркость 30%)
Во втором - совсем упрощенный вариант - для одноцветных ламп - лампа через раз включается на 30 и на 100 процентов яркости
"56":{"T":2,
"scmd":{"item":"bedr","icmd":"ON"},
"scmd2":[{"item":"bedr","icmd":"100","irev":"30"},{"item":"bedr/sat","icmd":"0","irev":"100"}],
"rcmd":{"item":"bedr","icmd":"OFF"}},
"60":{"T":2,
"scmd":{"item":"bedrspot","icmd":"100","irev":"30"},
"rcmd":{"item":"bedrspot","icmd":"OFF"}},
Несколько кнопок на одном входе
Если в обьекте, определяющем вход, обнаружен массив "act" и вход является аналоговым, то каждый элемент массива будет рассматриваться как отдельный вход, для которого возможна такая же обработка как для дискретного (то есть определение даблкликов, долгих нажатий и пр)
При этом анализируется параметр "map" у каждого элемента массива, и элемент применяется только если значение аналогового входа находится внутри заданного интервала
Это позволяет на один аналоговый вход подключить несколько кнопок через резисторы.
Важно: в параметре "T" не надо указывать аналоговый тип входа. Используются дискретные типы 0 и 2
Пример: Кнопка выкл/уменьшить яркость подключена к опорному напряжению +10В напрямую, кнопка вкл/увеличить яркость - через резистор 2,2 КОм (на плате должен быть активирован шунт - см аналоговые входы, общая информация)
"in": {
"54":{"T":0,"act":
[
{
"map":[128,640],
"click":{"item":"gr_gost3","icmd":"ON"},
"dclick":{"item":"lampwc3","icmd":"ON"},
"tclick":{"item":"lampbath3","icmd":"ON"},
"rpcmd":{"item":"gr_gost3","icmd":"%+2"}
},
{
"map":[641,1024],
"click":{"item":"gr_gost3","icmd":"OFF"},
"dclick":{"item":"lampwc3","icmd":"OFF"},
"tclick":{"item":"lampbath3","icmd":"OFF"},
"rpcmd":{"item":"gr_gost3","icmd":"%-2"}
}
]}
}
И тот же самый пример, записанный в новой нотации конфигурирования входов, при которой элемент конфигурации in является массивом, а значит, появилась возможность без костылей настраивать входы, не привязанные напрямую к пинам процессора. Номер пина задается в параметре "#" конфигурации:
"in": [
"{"T":0,"#":54, "act":
[
{
"map":[128,640],
"click":{"item":"gr_gost3","icmd":"ON"},
"dclick":{"item":"lampwc3","icmd":"ON"},
"tclick":{"item":"lampbath3","icmd":"ON"},
"rpcmd":{"item":"gr_gost3","icmd":"%+2"}
},
{
"map":[641,1024],
"click":{"item":"gr_gost3","icmd":"OFF"},
"dclick":{"item":"lampwc3","icmd":"OFF"},
"tclick":{"item":"lampbath3","icmd":"OFF"},
"rpcmd":{"item":"gr_gost3","icmd":"%-2"}
}
]}
]
Работают обе нотации. Если номер пина прописан сразу в двух местах, приоритет имеет параметр "#"
Сверка с кодом (2026-10-02)
- Корректно: все ключи нажатий (
click,dclick,tclick,scmd,rcmd,lcmd,scmd2,scmd3,lcmd2,lcmd3,rpcmd,rpcmd2,rpcmd3) читаются вlighthub/inputs.cpp(строки 717–790, конечный автоматIS_*). - Корректно: параметры
emit/ecmd/erev/item/icmd/irevобрабатываются вlighthub/utils.cpp:701-718(попеременная подстановкаicmd/irevиecmd/erevподтверждена). - Корректно: массив
"act"и"map"для нескольких кнопок на одном аналоговом входе обрабатываются вlighthub/inputs.cpp(строки 173, 631, 656, 672, 1248). - Уточнение: для дискретных нажатий
Tиспользует типы 0 и 2, как указано в wiki (типы входов:IN_PUSH_ON=0,IN_ACTIVE_HIGH=2—lighthub/inputs.h:29-34).