Интеграция в 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 "расширения":

    MegaD_Multi_Button_Variant-1.png

    Таким образом, плагин будет реагировать на одинарный клик кнопки (переключать выход 8), на двойной клик (переключать выход 7) и на удержание кнопки (выключать выход 7 и 8).

    2. Управление любыми устройствами с помощью сценария
    Другой вариант - это когда мы прописываем такие же расширения что и в первом варианте, но поля "Передать в ответ" и "Установить состояние канала" оставляем пустыми. При этом в поле "Запустить сценарий" выбираем нужный нам:

    MegaD_Multi_Button_Variant-2.png

    Таким образом, плагин будет реагировать на двойной клик кнопки и передавать в сценарий 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 следующее:

    MegaD_Multi_Button_Variant-3.png

    Сделал устройство для кнопки на основе "Датчик универсальный бинарный" и привязал ее ко входу:

    MegaD_Multi_Button_Variant-3_Channel.png

    Сам сценарий срабатывает именно по изменению состояния кнопки:

    /** 
    * @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.


Log in to reply