Интеграция в iH входов типа Click Mode MegaD
-
Входы контроллера MegaD-2561 имеют (подробнее - тут) несколько различных режимов:
P - устройство реагирует только при замыкании контакта/выключателя (на сервер приходит GET-запрос вида - /megad.php?pt=0&cnt=1)
R - устройство реагирует только при размыкании контакта/выключателя (на сервер приходит GET-запрос вида - /megad.php?pt=0&m=1&cnt=1)
P&R - устройство реагирует как на замыкание, так и на размыкания контакта.
С или Click mode - реагирует на:- Однократное нажатие на кнопку/выключатель (на сервер приходит GET-запрос вида - /megad.php?pt=0&click=1&cnt=1)
- Двойное нажатие на кнопку/выключатель (на сервер приходит GET-запрос вида - /megad.php?pt=0&click=2&cnt=2)
- Удержание кнопки/выключателя на время более 1 секунды (на сервер приходит GET-запрос вида - /megad.php?pt=0&m=2&cnt=3). То же для режима P.
- Отпускание кнопки/выключателя после длительного нажатия (на сервер приходит GET-запрос вида - /megad.php?pt=0&m=1&cnt=3). То же для режима P&R.
Таким образом, в режиме P&R есть 2 комбинации кнопки (нажатие и удержание), а в режиме C - 3 комбинации (одинарное нажатие, двойное нажатие и удержание), которые можно использовать для управления какими-либо устройствами.
Разберем как можно интегрировать в iH вход контроллера в режиме "C" (Click mode). Есть несколько вариантов:1. Прямое управление устройствами (и входы, и выходы располагаются на одном и том же контроллере MegaD)
Для этого необходимо перейти в раздел "Расширения" соответствующего плагина megad. И, например, для кнопки, подключенной ко входу 15 контроллера MegaD-2561 нужно прописать 3 "расширения":Таким образом, плагин будет реагировать на одинарный клик кнопки (переключать выход 8), на двойной клик (переключать выход 7) и на удержание кнопки (выключать выход 7 и 8).
2. Управление любыми устройствами с помощью сценария
Другой вариант - это когда мы прописываем такие же расширения что и в первом варианте, но поля "Передать в ответ" и "Установить состояние канала" оставляем пустыми. При этом в поле "Запустить сценарий" выбираем нужный нам:Таким образом, плагин будет реагировать на двойной клик кнопки и передавать в сценарий URL, полученный от контроллера, но преобразованный в JSON-строку с объектом. То есть из /mod_megad.php?pt=0&click=2 получаем param = '{pt:0, click:2}'. Сценарий управления устройствами при этом довольно прост:
/** * @name MegaD - управление устройствами * @desc При возникновении событий от MegaD выполнить действия * @version 4 */ const lamp_table = Device("LAMP1_07"); //Обеденный стол script({ start(param) { const obj = JSON.parse(param); //Освещение на разных контроллерах if(obj.pt == 0 && obj.click == 2) { lamp_table.toggle(); } } });
При запуске сценария в результате парсинга входящей строки JSON.parse(param) имеем объекты:
obj.pt - порт контроллера;
obj.click - параметр "клика".
В случае с длительным нажатием или отпусканием кнопки также будем иметь объект obj.m. Более того, плагин также сообщает IP-адрес контроллера, с которого пришло сообщение, поэтому всегда будет иметь место и obj.ip!3. Продвинутое управление любыми устройствами с помощью сценария
В задаче по выводу на дисплей с контроллером SSD1306 различной информации мне потребовалась "мультикнопка", которая будет:
а. По однократному нажатию отображать температуру/влажность/СО2 в доме на дисплее по кругу
б. По двукратному нажатию выводить на дисплей информацию о температуре на улице
в. По удержанию кнопки - выключать дисплей
Для этого я прописал в расширениях соответствующего плагина megad следующее:Сделал устройство для кнопки на основе "Датчик универсальный бинарный" и привязал ее ко входу:
Сам сценарий срабатывает именно по изменению состояния кнопки:
/** * @name Обновление данных на OLED гостевой * @desc При однократном нажатии кнопки OLED отображает параметры микроклимата данного помещения. При двойном нажатии кнопки * OLED отображает уличную температуру. При удержании кнопки дисплей выключается. * @version 4 */ const button = Device("BUTTON1_01"); startOnChange(button); script({ button_state: 0, //Переменная параметров start() { let mode = button.value; //Режим кнопки let param = 0; //Переменная для выбора параметров //Перебор параметров при однократном нажатии кнопки if(mode == 1) { param = this.button_state + 1; if(param > 2) this.button_state = 0; else this.button_state = param; } //Двойное нажатие и удержание кнопки else { param = mode; this.button_state = 0; } //Перебор параметров для выполнения действий switch(param) { case 1: //Тут что-то делаем break; case 2: //Тут что-то делаем break; case 3: //Тут что-то делаем break; case 4: //Тут что-то делаем break; case 5: //Тут что-то делаем break; } //Сброс состояния кнопки if(mode > 0) { this.startTimer("ButRst", 0.5, "ClearState"); } }, //Функция "обнуления" кнопки ClearState() { this.assign(button, "value", 0); }, });
Приведенный сценарий очень урезан (поскольку вывод разной информации на дисплей с контроллером SSD1306 - это тема другой статьи), однако и в таком виде он довольно не тривиальный! В нем введена переменная уровня сценария button_state - для "запоминания" предыдущего состояния кнопки. При этом в основной функции start введена локальная переменная mode (принимает значения 1, 4 и 5 - подробнее см. "Расширения") для "считывания" типа нажатия кнопки. Условный оператор if проверяет какой сейчас тип нажатия кнопки (mode):
- если 1, то переменная param принимает значения 1->2->3; если param > 2, то он обнуляется и счет начинается снова 1->2->3;
- иначе param принимает остальные значения - 4 или 5 в нашем случае.
Важно! В конце функции состояние кнопки нужно обнулять, поскольку при однократном нажатии состояние кнопки будет всегда 1 и сценарий не будет запускаться по изменению состояния кнопки.
В принципе можно сделать перебор однократным нажатием хоть 100 параметров! Для этого нужно в расширениях для click=2 прописать 8=101, а для m=2 - 8=102. А в самом сценарии изменить if(param > 2) на if(param > 100) и добавить соответствующие условия (1-100 и 101/102 - соответственно для click=2/m=2) в операторе switch.