Навигация

    Forum

    • Зарегистрироваться
    • Войти
    • Поиск
    • Категории
    • Последние
    • Метки
    • Популярные
    • intraHouse Site
    1. Главная
    2. Alex_Jet
    A
    • Профиль
    • Подписки
    • Подписчики
    • Темы
    • Сообщения
    • Лучшие сообщения
    • Группы

    Alex_Jet

    @Alex_Jet

    26
    Репутация
    955
    Сообщения
    53
    Просмотры профиля
    3
    Подписчики
    1
    Подписки
    Регистрация Последнее посещение

    Alex_Jet Подписаться

    Лучшие сообщения Alex_Jet

    • Интеграция в iH считывателей ключей через MegaD

      К контроллеру MegaD можно подключить считыватели, имеющие интерфейс подключения 1-Wire/TouchMemory и Wiegand и протоколы обмена с ключами EM-Marine/Mifare. Для этого порт, к которому физически подключен считыватель необходимо сконфигурировать, подробнее тут.
      В плагине megad системы intraHouse необходимо создать запись в разделе "Расширения". Например для считывателя с интерфейсом 1-Wire/TouchMemory и протоколом обмена с ключами EM-Marine, подключенным к порту 35 контроллера:

      iH_MegaD_1-Wire_EM-Marine.png
      В поле "Входящее от контроллера MegaD" вписан URL, который приходит от контроллера при "срабатывании" считывателя. А в поле "Запустить сценарий" выбран сценарий, обрабатывающий данное сообщение от контроллера.
      Сценарий имеет следующий скрипт:

      const security = Device("ACTOR_SECURITY_SYS00"); //Системный индикатор (кнопки Взятия/Снятия)
      
      script({
        //Ключи Touch_Button
        key_aleksey: "123456789ABC",
        key_nadia: "123456789ABC",
        key_dima: "123456789ABC",
        
        start(param) {
          const obj = JSON.parse(param);
          
          //Постановка и снятие дома с охраны
          if(obj.pt == 35) {
            this.log("Активирован ключ с ID = " +obj.ib);
            let disarm = 0;
            
            if(obj.ib == this.key_aleksey) {
              disarm = 1;
              //Тут еще действия
            }
            else if(obj.ib == this.key_nadia) {
              disarm = 1;
              //Тут еще действия
            }
            else if(obj.ib == this.key_dima) {
              disarm = 1;
              //Тут еще действия
            }
            
            //При успешном считывании нужного ключа меняем состояние Security на противоположное
            if(disarm) {
              security.toggle();
              //Тут еще действия
            }
          }
        }
      });
      

      Как видно, в скрипте ключи прописаны как константы уровня скрипта (поэтому к ним нужно обращаться через this, где this - это сам скрипт) - key_aleksey: "123456789ABC". При запуске сценария ему как аргумент передается URL, полученный от контроллера, но преобразованный в JSON-строку с объектом. То есть из /mod_megad.php?pt=35&ib=123456789ABC получаем param = '{pt:35, ib:123456789ABC}'. В результате парсинга входящей строки JSON.parse(param) имеем:
      obj.pt - порт контроллера;
      obj.ib - идентификатор приложенного к считывателю ключа.
      Далее в скрипте идет проверка идентификатора ключа с прописанными константами (key_aleksey, key_nadia, key_dima). В случае истинности переменная disarm принимает истинное значение (disarm = 1), соответственно, актуатор security меняет свое состояние на противоположное. То есть при каждом считывании правильного ключа "охранный" актуатор будет включаться/выключаться по кругу.
      Переменная disarm введена в скрипт намеренно, поскольку в каждом операторе if при проверке соответствующего ключа можно вводить дополнительные условия срабатывания других систем. Так, например, у меня в каждом if вписана текстовая строка приветствия пользователя (this.string = "Алексей, я рада Вас видеть!"), которая в дальнейшем преобразуется в речь голосового помощника).
      Если не нужны индивидуальные операции для каждого ключа, можно прописать массив ключей и проверять поднесенный ключ таким образом:

      script({
        //Ключи Touch_Button
        key_array: ['11111','22222','33333'],
        
        start(param) {
          const obj = JSON.parse(param);
          
          //Проверка наличия ID ключа в массиве
          if( this.key_array.includes(obj.ib) ) {
            this.log("Активирован ключ с ID = " +obj.ib);
            //Выполняем действия
          }
        }
      });
      
      написал в intraHouse и MegaD
      A
      Alex_Jet
    • Интеграция в iH счетчиков через MegaD

      Главная особенность контроллера MegaD - это способность генерировать GET-запросы на сервер системы управления в случае изменения состояния входов контроллера (модули расширения MegaD-8I7O, MegaD-14-IN, MegaD-14-IOR, MegaD-16I-XT, моноблок MegaD-2561-24I14O-RTC). Ко входам IN можно подключить любые датчики, имеющие выход типа "сухой контакт" (при сработке датчика в нем замыкается/размыкается реле или уменьшает/увеличивает сопротивление активный элемент) - это выключатели, кнопки, герконы, датчики протечки, ИК-извещатели, пожарные извещатели, счетчики (типа "геркон"), датчик напряжения U-Sensor. В данной статье заострю внимание на интеграцию в систему intraHouse счетчиков потребления газа/электроэнергии/воды и прочие, имеющие выход типа "сухой контакт" или геркон.
      В частности распространенный и имеющий высокую надежность, а также внушительные габариты, счетчик газа BK-G4T можно интегрировать в систему, оснастив его родным модулем считывания - "IN-Z61". Однако, во-первых, он довольно дорого стоит для его "функциональности", во-вторых, его не просто приобрести ввиду отсутствия не только в розничной продаже, но и наличия в интернет-магазинах. Правда есть вариант намного дешевле и проще - это использование геркона типа "ИО-102-4" (такое решение на текущий момент работает 2 года без нареканий).
      iH_MegaD_Counter_IO-102-4.png

      От него нужно отрезать пластмассовую часть, которой он должен монтироваться на двери/рамы, и приклеить на обычный клей "Момент" в паз счетчика BK-G4T вот таким образом:
      Counter_Gaz_with_Gerkon.png

      Выход геркона подключаем к любому "стандартному" (не цифровому) входу контроллера MegaD. Конфигурируем порт следующим образом:
      iH_MegaD_Port_Settings.png
      После этого контроллер, при каждом срабатывании геркона, будет отправлять следующие GET-запросы на сервер intraHouse (можно посмотреть через раздел "Отладчик" соответствующего плагина megad):

      12.01 17:11:21.992 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&cnt=15901&mdid=
      12.01 17:11:22.988 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&m=2&cnt=15901&mdid=
      

      Первый запрос (/mod_megad.php?pt=7) - формируется сразу же после срабатывания геркона, а поскольку ось счетчика крутиться довольно медленно, то спустя ~1 секунду контроллер формирует второй запрос (/mod_megad.php?pt=7&m=2) - почему происходит так и для чего это сделано - читаем тут.
      Для отображения счетчика на мнемосхемах добавим новое устройство типа "Счетчик", в моем случае оно будет называться "Счетчик газа" и имеет ID "METER1_01". Чтобы получить дробную часть числа необходимо в свойствах устройства указать необходимое количество "Цифр после запятой". Для интеграции счетчика газа в iH в соответствующем плагине нужно:

      1. Добавить новый канал, привязав к нему ранее созданное устройство:
        iH_MegaD_Counter_Channel.png
        Запросы на сервер формируются самостоятельно, поэтому период опроса = 0 секунд, строку запроса оставляем без изменений. Самое главное - это ввести "Вес импульса счетчика". Поскольку при каждом срабатывании геркона у счетчика газа BK-G4T прибавляется одна сотая кубического метра газа (0.01), то вес импульса счетчика равен этому значению - 0.01.
      2. Добавить новое расширение для того, чтобы сервер знал на что ему нужно реагировать и что при этом делать:
        iH_MegaD_Counter_Extension.png
        В данном случае реагируем на запрос /mod_megad.php?pt=7&m=2 поскольку если будем реагировать на запрос /mod_megad.php?pt=7, то получится что за один проход состояние канала изменится два раза (в силу не идеальной реализации поиска расширений в плагине megad). При наличии вышеуказанного запроса изменяем состояние канала 7 (делаем "счет"): 7=CNT

      После проделанных действий в разделе "Отладчик" соответствующего плагина megad убеждаемся, что происходит правильный подсчет объемов:

      12.01 17:10:54.006 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&cnt=15900&mdid=
      12.01 17:10:55.001 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&m=2&cnt=15900&mdid=
      12.01 17:10:55.004 IH: get [ { id: '7', value: 6838.22 } ]
      set { METER1_01: { aval: 6838.22, err: 0 } }
      12.01 17:11:21.992 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&cnt=15901&mdid=
      12.01 17:11:22.988 megad4: 192.168.11.24 => localhost:11024 HTTP GET /mod_megad.php?pt=7&m=2&cnt=15901&mdid=
      12.01 17:11:22.989 IH: get [ { id: '7', value: 6838.23 } ]
      set { METER1_01: { aval: 6838.23, err: 0 } }
      

      В данном случае, при каждом срабатывании геркона значение счетчика увеличивается на 0.01 м.куб. - с 6838.22 до 6838.23.
      Чтобы синхронизировать показания на счетчике с показаниями в системе необходимо вынести ранее созданное устройство "Счетчик газа" на мнемосхему, навести на устройство курсор и после долгого нажатия левой кнопки мыши откроется меню устройства - в текстовом поле необходимо ввести текущие показания счетчика и нажать кнопку справа.
      iH_MegaD_Device_Sinchronization.png

      Все, теперь показания счетчика газа на мнемосхеме соответствуют реальным показаниям счетчика и продолжают накапливаться.

      В случае с другими счетчиками в канале плагина megad необходимо правильно указать "Вес импульса счетчика". Например, счетчик потребления электроэнергии имеет на выходе 2000 импульсов на 1 кВт*ч, значит чтобы получить единицы измерения в кВт*ч нужно указать "Вес импульса счетчика" - 0.0005 (2000 имп. * 0.0005 = 1 кВт*ч).

      написал в intraHouse и MegaD
      A
      Alex_Jet
    • Интеграция в 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.

      написал в intraHouse и MegaD
      A
      Alex_Jet
    • RE: Сценарии - новая версия API

      @homa, вот так все работает:

      const dev1 = Device("_UNIT_voiceterminal1", [
        {"name":"uptime", "note":"Времы работы", "type":"string", "val":""},
        {"name":"status", "note":"Состояние", "type":"string", "val":""},
        {"name":"updater", "note":"Обновления", "type":"string", "val":""},
        {"name":"set_volume", "note":"Громкость терминала", "type":"number", "val":50},
        {"name":"set_music_volume", "note":"Громкость плеера", "type":"number", "val":50},
        {"name":"last_update", "note":"Update", "type":"string", "val":""}
        ]);
      
      написал в Сценарии
      A
      Alex_Jet
    • RE: Вопросы по работе системы

      @Erik, этот баг давнишний. Обещали исправить. Я описывал, что если не получается в рабочих сценариях открыть отладчик, то надо открыть нижнее окно в обычных сценариях, а потом перейти в рабочие сценарии.

      написал в intraHouse V4 Cherry
      A
      Alex_Jet
    • RE: Плагин MegaD

      @amgstone, сервер кидает на Мегу свои запросы, а она ни на один не отвечает. Проверяйте сеть и почему MegaD недоступна с сервера.

      написал в Плагины
      A
      Alex_Jet
    • Интеграция в iH адресуемых RGB-лент на базе WS281X через MegaD

      Прошивка контроллера MegaD-2561 поддерживает управление адресуемыми RGB-драйверами серии WS281X. На этих микросхемах/драйверах делают не только адресуемые RGB-ленты, но и всякие RGB-PCB разных форм и размеров для встраивания куда либо - от DIY-устройств, до люстр бытового назначения. Причем микросхемы имеют всего лишь однопроводную шину данных! Поэтому к контроллеру MegaD-2561 теоретически можно подключить до 38 шт. RGB-лент или RGB-PCB, сделав из него подобие профессионального контроллера управления светом типа DMX.
      В данной статье расскажу как можно подключить к контроллеру ленту на базе RGB-драйверов WS2818. Примечательной особенностью данной ленты является ее питающее напряжение, составляющее 12В! Вообще лента на своем начале и конце имеет 4 шины: GND, BO/BI, DO/DI и 12V. Ленту/ленты можно запитать от отдельного мощного блока питания, но обязательное условие нормальной работы - это объединение GND блока питания ленты с блоком питания контроллера! К контроллеру можно подключить как контакт BO/BI, так и контакт DO/DI. Разница будет в...
      Итак, лента подключена к контроллеру, на блоки питания подано напряжение. Теперь нужно, а точнее НЕ нужно провести конфигурирование порта контроллера, то есть порт должен быть в состоянии NC. Подробнее о подключении лент на базе WS281X к контроллеру MegaD-2561 - тут.

      Применительно к системе intraHouse есть несколько вариантов управления лентами:

      1. Управление лентами с помощью устройства "Светильник RGB.
      Для этого создаем устройство, например, с ID "RGBLAMP1_01" с типом "Светильник RGB":
      MegaD_WS281X_ActorRGB.png
      В соответствующем плагине megad создаем канал и привязываем к нему ранее созданный светильник:
      MegaD_WS281X_Channel.png

      В канале плагина вписана команда управления /%pwd%/?pt=%adr%&ws=%value%&chip=151, где value - значение, получаемое от устройства, привязанного к данному каналу, chip - количество чипов в ленте (в моем 5 м экземпляре их именно 151 шт., то есть плотность ленты - 30 чипов на 1 м).

      Выносим созданный светильник RGB на нужную мнемосхему и теперь в веб-интерфейсе системы нажимаем на его иконку - лента должна засветиться каким-либо цветом (какой по умолчанию сохранен - не знаю). Чтобы изменить цвет свечения - нажимаем долго на иконку светильника и справа всплывает боковое меню устройства - в нем: RGB-ColorPicker позволяет выбрать либо предустановленный цвет или цвет любой градации, а нижний слайдер L позволяет либо уменьшить яркость ленты (в положении 0-50%) или увести яркость в белый цвет (50-100%). Чтобы выключить ленту, нужно нажать на иконку светильника еще раз. Выбранный цвет сохраняется и при новом включении будет такой же какой был при выключении.

      Кстати, если при настройке на иконке светильника RGB оставлены индикаторы, то в веб-интерфейсе на иконке сверху будет отображаться текущее значение массива (выключено - 0,0,0,0; включен красный цвет - 255,0,0,0), а внизу - значение по умолчанию (то, которое было выбрано, оно же будет установлено по команде "on").
      Для иконки светильника RGB @intrahouse сделал удачную картинку в SVG-формате - ищем тут в разделе "Электрика".

      Момент о китайских лентах: встречаются варианты не RGB, а GRB-ленты (проектировщики напутали в разводке)!!! Как итог - цвета green и red поменяны местами. Но в iH есть возможность устранить это:

      • нужно выбрать канал ленты в плагине megad и открыть его настройки;
      • перейти на вкладку "Обработка";
      • в поле "Формула расчета выходного значения для актуаторов" вписать:
      [ value[1],value[0],value[2] ]
      
      • если предполагается управлять лентой с помощью сценариев, то в поле "Формула расчета входного значения" нужно вписать:
      [ value[1],value[0],value[2] ]
      

      2. Управление лентой - с помощью сценария.
      В данном случае возможно сделать практически бесконечное количество вариантов работы RGB-ленты. Причем управление режимами происходит всего лишь с помощью одного актуатора. Для этого создаем актуатор, например, с ID "ACTORA_GARLAND1_01" и типом "Актуатор универсальный аналоговый". При этом для отображения в правом боковом меню устройства слайдера с диапазоном 1-10 (в нижеприведенном сценарии используется 10 вариантов управления лентой) делаем следующие настройки:
      MegaD_WS281X_ActorA.png

      Далее переходим в раздел "Сценарии" и создаем новый сценарий вот с таким кодом:

      /** 
      * @name Освещение - гирлянда из WS2818 
      * @desc Имитация работы гирлянды 
      * @version 4 
      */
      const sw = Device("ACTORA_GARLAND1_01"); 
      
      startOnChange(sw); 
      
      script({
          plugin: "megad1", //Константа названия плагина
          channel: 34,      //Константа номера канала плагина
          cmd: '000000',    //Константа команды
          chip: 151,        //Количество чипов в ленте WS2818
          period: 1,        //Период изменения цвета
          num: 3,
          i: 0,
          
          start() {
            this.ChangeStateSw();
          },
          
          ChangeStateSw() {
      
            //Остановка таймера для выхода из "цикла"
            this.stopTimer("T1");
            
            switch(sw.value) {
              case 0: this.cmd = '000000';
                      break;
              case 1: this.cmd = 'FF0000';
                      break;
              case 2: this.cmd = '00FF00';
                      break;
              case 3: this.cmd = '0000FF';
                      break;
              case 4: this.ChangeRed();
                      break;
              case 5: this.ChangeGreen();
                      break;
              case 6: this.ChangeBlue();
                      break;
              case 7: this.RandomColor();
                      break;
              case 8: this.num = 3; this.RandomPlay();
                      break;
              case 9: this.num = 6; this.RandomPlay();
                      break;
              case 10: this.num = 9; this.RandomPlay();
                      break;
            }
            
            if(sw.value < 4) {
              this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
              this.cmd = '';
              this.exit();
            }
          },
      
          ChangeRed() {
            this.addListener(sw, "ChangeStateSw");
            
            let color = this.i.toString(16);
            if(color.length == 1) color = '0' +color;
            this.cmd = color+ '0000';
            
            this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
            this.cmd = '';
            
            if(this.i >= 0 && this.i < 16) this.i += 1;
            else if(this.i >= 16 && this.i < 96) this.i += 8;
            else if(this.i >= 96 && this.i < 240) this.i += 16;
            else if(this.i >= 240) this.i = 0;
      
            this.startTimer("T1", this.period, "ChangeRed");
          },
      
          ChangeGreen() {
            this.addListener(sw, "ChangeStateSw");
            
            let color = this.i.toString(16);
            if(color.length == 1) color = '0' +color;
            this.cmd = '00' +color+ '00';
            
            this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
            this.cmd = '';
            
            if(this.i >= 0 && this.i < 16) this.i += 1;
            else if(this.i >= 16 && this.i < 96) this.i += 8;
            else if(this.i >= 96 && this.i < 240) this.i += 16;
            else if(this.i >= 240) this.i = 0;
      
            this.startTimer("T1", this.period, "ChangeGreen");
          },
          
          ChangeBlue() {
            this.addListener(sw, "ChangeStateSw");
            
            let color = this.i.toString(16);
            if(color.length == 1) color = '0' +color;
            this.cmd = '0000' +color;
            
            this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
            this.cmd = '';
            
            if(this.i >= 0 && this.i < 16) this.i += 1;
            else if(this.i >= 16 && this.i < 96) this.i += 8;
            else if(this.i >= 96 && this.i < 240) this.i += 16;
            else if(this.i >= 240) this.i = 0;
      
            this.startTimer("T1", this.period, "ChangeBlue");
          },
      
          
          RandomColor() {
            this.addListener(sw, "ChangeStateSw");
            
            let color = ["FF0000", "00FF00", "0000FF", "FFFFFF", "000000"];
            this.cmd = color[this.GetRandomInt(0, 5)] + color[this.GetRandomInt(0, 5)] + color[this.GetRandomInt(0, 5)];
            
            this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
            this.cmd = '';
            this.startTimer("T1", this.period, "RandomColor");
          },
          
          RandomPlay() {
            this.addListener(sw, "ChangeStateSw");
            
            let color;
            
            for (let i = 0; i < this.num; i++ ) {
              color = this.GetRandomInt(0,256).toString(16);
              if(color.length == 1) color = '0' +color;
              this.cmd += color;
            }
            
            this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
            this.cmd = '';
            this.startTimer("T1", this.period, "RandomPlay");
          },
          
          //Функция возвращает случайное целое число между min (включительно) и max (не включая max)
          GetRandomInt(min, max) {
            return Math.floor( Math.random() * (max - min)) + min;
          },
          
          //Функция формирования данных для ленты WS2818
          SendDataToWS2818(plugin, channel, cmd, chip) {
            this.pluginCommand({unit: plugin, command: '/sec/?pt=' +channel+ '&ws=' +cmd+ '&chip=' +chip});
          }
      });
      

      Для работы сценария в вашем конкретном случае нужно изменить константы уровня сценария на нужные (название плагина, канал контроллера, количество чипов ленты).

      Сценарий запускается когда изменяется состояние sw, то есть ранее созданного аналогового актуатора "ACTORA_GARLAND1_01". Актуатор можно включать/выключать, либо изменить состояние во включенном режиме с помощью слайдера в правом боковом меню устройства. Состояния запоминаются.
      0 - лента выключена (выполняется команда '000000');
      1 - лента светиться красным цветом (выполняется команда 'FF0000');
      2 - лента светиться зеленым цветом (выполняется команда '00FF00');
      3 - лента светиться голубым цветом (выполняется команда '0000FF');
      4 - лента плавно увеличивает яркость красного цвета (функция ChangeRed());
      5 - лента плавно увеличивает яркость зеленого цвета (функция ChangeGreen());
      6 - лента плавно увеличивает яркость голубого цвета (функция ChangeBlue());
      7 - лента по всей длине светиться цветом случайного выбора (функция RandomColor());
      8 - лента по всей длине на разных участках светиться цветом случайного выбора (функция RandomPlay() с параметром num=3);
      9 - более сложные цвета и сочетания чем в режиме 8 (функция RandomPlay() с параметром num=6);
      10 - еще более сложные цвета и сочетания чем в режиме 9 (функция RandomPlay() с параметром num=9).

      Во всех функция, чтобы не потерять управление лентой с помощью все того же аналогового актуатора, добавлен слушатель этого актуатора (this.addListener(sw, "ChangeStateSw")), иначе при входе в эти функции сценарий зациклится на их выполнении. Периодичность цвета установлена равной 1 секунде (определяется константой сценария "period").
      Функции ChangeRed(), ChangeGreen(), ChangeBlue() - довольно не простые, поскольку чтобы сделать плавное изменение цвета нужно иметь "цикл" с наибольшим количеством итераций, однако при уменьшении периода изменения цвета:

      1. Становится трудно переключать режимы работы ленты
      2. При сильном уменьшении периода можно вывести из строя саму систему intraHouse!

      Управление режимами работы RGB-ленты по расписанию.
      Чтобы управлять режимами по расписанию нужен сценарий, в который из расписания в назначенное время будет передаваться параметр, а этот параметр будет присваиваться значению актуатора, управляющего лентой. Код сценария простой:

      /** 
      * @name Освещение - управление гирляндой по расписанию 
      * @desc Включение вечером и чередование режимов 
      * @version 4  
      */
      
      const sw = Device("ACTORA_GARLAND1_01");
      
      script({
          start(param) {
            //Установка значения у аналогового актуатора гирлянды
            if(param !== undefined) sw.setValue(param);
            else this.exit();
          }
      });
      

      Теперь в расписании создадим новые записи:
      MegaD_WS281X_Change_Script.png

      Получится три сценария работы:

      • в 17.17 лента включиться зеленым цветом;
      • в 18.17 лента будет работать в режиме "радуга" (случайное изменение цвета по всей длине);
      • в 22.17 лента будет работать в режиме "гирлянда" (разные участки ленты будут светиться случайно выбранным цветом).

      MegaD_WS281X_Shedules.png

      Ну и в качестве закрепления - читателю нужно будет сделать запись в расписании для выключения ленты в нужное ему время)))

      написал в intraHouse и MegaD
      A
      Alex_Jet
    • RE: сообщение из сценария

      @alesle, вначале прочитайте про синтаксис сценариев - тут. Надеюсь, что после этого у Вас отпадет значительная часть вопросов. Также очень полезно знать систему команд - сам до сих пор пользуюсь этой страничкой).

      написал в Сценарии
      A
      Alex_Jet
    • RE: Голосовое управление IH

      Пользователь @div115 написал в Голосовое управление IH:

      у меня на физ. сервере живет IH, LMS и SqueezePlayer
      конечно хотелось бы перенаправить весь звук от апельсинки на сервер по сети, но пока не знаю как это сделать...

      Я думаю, что самой правильной концепцией является:

      1. Отдельный железный сервер УД + LMS +Media, к которому подключен только кабель Eth
      2. По всей квартире/дому разбросаны железки с подключеным Eth (на крайний случай Wi-Fi) и акустикой. На борту у железок - mdmTerminal2 и squeezelite.
        Поэтому ваш вариант перенести OPiZ в потолочное отверстие рядом с акустикой мне нравится намного больше. Сам хочу разработать плату для установки на нее OPiZ + микрофон с усилителем на TS472 + усилитель (хотя бы PAM8610) мощности + светодиодное кольцо на базе WS28xx, но пока руки не доходят...

      И да...я до конца не понял, но похоже у Вас связка LMS ->squeezelite не работает? Если так, то это проще простого! На клиентах ставим squeezelite и их находит LMS (в его настройках на закладке "Информация" есть раздел "Информация о плеере"). Собственно на главной странице LMS сверху справа будет выпадающий список из плееров)

      Passive-poe в реализации OPiZ очень плохой вариант... Лучше взять переходники для passive-poe и снимать хотя бы 12В, подавая сразу на усилитель (тот же PAM8610 - хорошая вещь!), а для OPiZ поставить step-down! - кушает она не мало и греется прилично!

      написал в intraHouse V4 Cherry
      A
      Alex_Jet
    • RE: Плагин CCTV

      Пользователь @Erik написал в Плагин CCTV:

      В документации нет описания команды snap.
      Что за параметры "105","onSnap105" ?

      Это ID канала в плагине CCTV. Встаете на канал и открываете его свойства - вверху будет его ID. Пока этот функционал снэпшотов "ручной"...мультисценарий не организовать:( писал это в пожеланиях для версии 5.

      написал в Плагины
      A
      Alex_Jet

    Недавние сообщения Alex_Jet

    • RE: Релиз IntraHouse V5

      @Lost, время для таймера пишется в секундах, например 0.5 секунды. По скриншотам - как будто что-то не работает в части getResponse. У меня на версии 4 лог плагина такой:

      18.03 12:21:12.835 IH: plugin command { unit: 'megad4',
        command: '/sec/?uart_tx=0b0400d30001&mode=rs485',
        type: 'command' }
      18.03 12:21:12.836 megad4: command: '/sec/?uart_tx=0b0400d30001&mode=rs485'
      18.03 12:21:13.024 megad4: 
      18.03 12:21:13.024 megad4: localhost => 192.168.11.24 HTTP GET /sec/?uart_tx=0b0400d30001&mode=rs485
      18.03 12:21:13.031 megad4: localhost <= 192.168.11.24  response: statusCode=200 contentType = text/html
      18.03 12:21:13.032 megad4:  body: Done
      18.03 12:21:13.836 IH: plugin command { unit: 'megad4',
        command: { url: '/sec/?uart_rx=1&mode=rs485', onResponse: 'raw' },
        uuid: '1647580873835',
        type: 'command' }
      18.03 12:21:13.837 megad4: command: { url: '/sec/?uart_rx=1&mode=rs485', onResponse: 'raw' }
      18.03 12:21:14.026 megad4: 
      18.03 12:21:14.026 megad4: localhost => 192.168.11.24 HTTP GET /sec/?uart_rx=1&mode=rs485
      18.03 12:21:14.034 megad4: localhost <= 192.168.11.24  response: statusCode=200 contentType = text/html
      18.03 12:21:14.042 megad4:  body: 0b|04|02|03|c0
      18.03 12:21:14.044 IH: Received response for command undefined "0b|04|02|03|c0"
      

      Какую железку опрашиваете?

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Сценарий отопления

      @zahar69, в пятой версии пока еще не тестировал плагин megad по полной программе, поэтому не знаю.
      По расширениям - вот, наверное, все возможные варианты относительно контроллера MegaD-2561:
      MegaD_Extensions.png

      написал в intraHouse V5
      A
      Alex_Jet
    • Бага в движке при нумерации подразделов в сообщении

      Добрый день!

      Делал в одной из тем развернутый ответ и обнаружил что он получился не таким, каким должен быть. Вот тест - сделал нумерованный список, под каждой цифрой список действий и в итоге вместо 2. отображается 1., вместо 3. тоже 1.Бага_по_нумерации_в_движке.png

      написал в Вопросы по работе сайта и форума
      A
      Alex_Jet
    • RE: Сценарий отопления

      @zahar69, честно говоря, делаете какую-то ерунду. И задачу так и не объяснили.
      С управлением освещением (и не только) есть как минимум два варианта:

      (1) Управляем освещением кнопочным выключателем "автономно", а на сервер просто передаем состояния выходов! Нужно:

      • на контроллере в канале выключателя прописать Act (например, 3:2|4:2|3:0;4:0 - для Mode = C) и напротив него активировать чек-бокс "всегда выполнять сценарий";
      • на сервере прописать "расширение" для выхода 3:
      /megad.php?pt=3&v=*   "пусто"   3=%v%
      
      • на сервере прописать "расширение" для выхода 4:
      /megad.php?pt=4&v=*   "пусто"   4=%v%
      

      (2) Управляем освещением через сервер, а в случае его отсутствия свет управляется "автономно" MegaD-2561.

      • на контроллере в канале выключателя прописать Act (например, 3:2|4:2|3:0;4:0 - для Mode = C);
      • на сервере прописать 3 расширения для каждой команды выключателя:
      /megad.php?pt=15&click=1    3:2   3=TOGGLE (переключение выхода лампы №1)
      /megad.php?pt=15&click=2    4:2   4=TOGGLE (переключение выхода лампы №2)
      /megad.php?pt=15&m=2        3:0;4:0   3=OFF&4=OFF (выключить лампы №1 и 2)
      

      Использую повсеместно вариант - 2. Все сделано именно по нему и работает как часы много лет. Позволяет очень гибко использовать варианты нажатий кнопки выключателя!
      Однако иногда есть задачи, для которых вариант 1 подходит как нельзя лучше, например, "автономное" заполнение накопительной емкости, "автономная" сработка датчика перелива воды, "автономная" работа насосной станции по датчику давления и т.д.

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Сценарий отопления

      Пользователь @Erik написал в Сценарий отопления:

      Мега отправляет на сервер изменения входов. Выходов не отправляет. Выходы опрашиваются.

      Поправлю тебя - если состояние выхода изменилось через веб-интерфейс, через program или через внешний get-запрос, но не от сервера, то MegaD посылает на сервер состояние переключенного выхода!

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Сценарий отопления

      @zahar69, у вас слэш лишний после php, а вообще вместо двух записей сделайте одно такое:

      /megad.php?pt=3&v=*     3=%v%
      

      И главное - объясните суть задачи! Я не понимаю какую логику вы хотите настроить.

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Мобильное приложение

      Друзья, у меня все камеры работают нормально в V5. Главное чтобы плагин был запущен) Каналы настроены так:intraHouse_V5_Channel_of_CCTV.png

      написал в Приложение для смартфонов
      A
      Alex_Jet
    • RE: Релиз IntraHouse V5

      @Lost, уберите "не" из конструкции if (result.filename)

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Релиз IntraHouse V5

      @intrapro, если реле переключается не через команду сервера, то MegaD шлет об этом сообщение на сервер.

      Единственный момент, который я где-то уже описывал, заключается в том, что при старте плагина нужно делать принудительный опрос каналов 1WB, которые могут быть в режиме OUT -> DS2413 и DSen -> 1WB

      написал в intraHouse V5
      A
      Alex_Jet
    • RE: Релиз IntraHouse V5

      Каналы адресуют так - 35_9a2938000000_A
      Запрос делаем только в одном канале одной и той же 1WB - /%pwd%/?pt=35&cmd=list

      написал в intraHouse V5
      A
      Alex_Jet