Navigation

    Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • intraHouse Site
    1. Home
    2. intrapro
    I
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    intrapro

    @intrapro

    administrators

    15
    Reputation
    771
    Posts
    33
    Profile views
    1
    Followers
    1
    Following
    Joined Last Online

    intrapro Follow
    administrators

    Best posts made by intrapro

    • RE: Сценарии - новая версия API

      Участник @homa написал

      И следом вопрос корректно ли объявлять одно и тоже свойство для одного и того же устройства в разных сценариях, или есть какие-то другие варианты обращения к ранее объявленным свойствам

      идея в том, чтобы изменять из разных сценариев одно свойство... выходит не выходит)

      Почему не выходит? Без проблем можно обращаться к одному свойству устройства из нескольких сценариев. При этом достаточно объявить свойство в одном сценарии, в других можно и не объявлять. При объявлении это свойство создается на уровне устройства. Проблема отсутствия свойства может быть только при первом запуске и после перезагрузки.

      posted in Сценарии
      I
      intrapro
    • RE: Подключение DHT22 на RASPBERRY PI 4 GPIO

      @alexeyalvl, если порядок меняться не будет, то можно сделать так:

      Для считывания температуры (первый элемент):

      let value;
      if (!error && stdout) {
           value = parseFloat( stdout.split(' ').shift().split('=').pop() );
      }
      

      Для считывания влажности (второй элемент):

      let value;
      if (!error && stdout) {
           value = parseFloat( stdout.split(' ').pop().split('=').pop() );
      }
      

      Что тут делается:

      • stdout.split(' ') - строка разбивается на элементы, разделенные пробелом:
        [ 'Temp=24.3*', 'Humidity=48.6%' ]
      • shift() - берется первый элемент
        'Temp=24.3*'
      • split('=') - этот элемент разбивается на элементы, разделенные знаком =
        [ 'Temp', '24.3*' ]
      • pop() - берется последний элемент, то есть число
        '24.3*'
      • Результат обрабатывается функцией parseFloat, результат - 24.3

      Второе значение обрабатывается аналогично, только на втором шаге берется не первый элемент - shift(), а последний - pop()

      posted in Примеры сниппетов
      I
      intrapro
    • RE: Плагин MegaD

      Участник @Alex_Jet написал в Плагин MegaD:

      @intrapro, подключил ленту WS2818 к контроллеру, в канале плагина вписал команду управления /%pwd%/?pt=%adr%&ws=%value%&chip=151. Все работает, однако братья китайцы где-то напутали и поменяли местами R и G... как итог лента не RGB, а GRB... стандартными средствами плагина можно выйти из положения?

      Попробуйте в канале на вкладке Обработка прописать:
      Формула расчета выходного значения для актуаторов: [ value[1],value[0],value[2] ]

      Ну и входное тоже нужно так же:
      Формула расчета входного значения: [ value[1],value[0],value[2] ]

      Еще момент по уровню яркости. Если установить какой-нибудь цвет, то слайдер L по умолчанию переходит в значение 50. Если его двигать в сторону 0, то яркость выбранного цвета уменьшается, однако если двигать к 100, то яркость увеличивается, но и цвет плывет причем на 100 получается просто белый цвет. Это явно не верный алгоритм.

      Это вопрос спорный. Сейчас нужно ориентироваться, что трушный цвет при L=50

      А еще поработать бы с самим устройством. По идее индикатор 1 - это RGB параметры, а индикатор 2 - это уровень яркости. Однако сейчас индикатор 2 отображает, например, "0,255,0", хотя при настройке устройства на мнемосхеме отображается уровень в виде "100". При нажатии на устройство - ничего не меняется - (картинки одинаковые), уровень остается тот же.

      Да, с индикаторами не очень 😞 Сейчас наверху выводится текущее значение массива, внизу должно быть дефолтное значение (для команды on) Cостояния on/off должны переключаться. Попробуйте нажать кнопку Выключить в боковом меню. Должны уйти нули, а устройство перейти в состояние выключено. Ну а картинку для активного состояния сами раскрасьте 🙂

      posted in Плагины
      I
      intrapro
    • RE: Свет по датчику движения с дополнительными условиями.

      Участник @Erik написал

      И еще вопрос.

      Как при включенном по датчику движения свете по повторному срабатыванию датчика движения обнулять таймер?

      При условии if ((SAF.value === 0) && (sw.value === 0) && (lamp.value == 1)) проверить, что таймер запущен, и обнулить его (тот же самый таймер).

      Для этого нужно добавить внутрь сценария "слушателя событий"

      script({
          start() {
            if ((SAF.value === 0) && (sw.value === 0) && (lamp.value === 0)) {
               lamp.on();
               // взводим таймер, чтобы отключить 
               this.startTimer("T1", 180, "turnOff");       
              
              // Добавляем слушателей - следим за датчиком движения и светильником
              this.addListener(motion, "onMotion");
              this.addListener(lamp, "onLamp");
            }
          },
          
          onMotion() {
            // Если движение возобновилось - сбрасываем таймер
            if (motion.isOn() )  {
              this.stopTimer("T1");
            }  
             // Если движение прекратилось - взводим таймер (после повторных движений)
            if (motion.isOff() && this.timer.T1 == "off")  {
              this.startTimer("T1",  180, "turnOff");
            }  
          },
          
           onLamp() {
            // Светильник выключили другим способом - выходим
             if (lamp.isOff()) this.exit();
           },
           
          // Функция, которая сработает, когда таймер досчитает - отключаем и выходим
          turnOff() {
            lamp.off();
            this.exit(); // Здесь exit нужен, так как есть активные слушатели и сценарий сам не завершится
          }
      });
      

      Более подробно про механизм работы сценариев - https://ih-systems.com/ru/about-scenes/
      Если коротко:

      • Если внутри сценария просто последовательность действий, он отработает и сразу завершится (станет не активным). При следующем запуске он опять начнется со start(). Большая часть сценариев работает именно так и 99,9% времени находятся в неактивном состоянии.

      • Если сценарий взводит таймеры и/или устанавливает слушателя событий устройства, то он остается активным, следит за своими таймерами и устройствами «изнутри» и выполняет действия как реакцию на отслеживаемые события. Стартовое событие не работает, так как сценарий уже активен.. В рабочих сценариях в левом столбце у сценариев, активных в данный момент, стоит зеленая галочка.
        Чтобы завершить такой сценарий, нужно выполнить команду this.exit().
        При завершении сценария все его таймеры и слушатели удаляются. При следующем запуске опять выполнится start()

      posted in Сценарии
      I
      intrapro
    • RE: Вопросы по работе системы

      Пользователь @regabriel написал в Вопросы по работе системы:

      Здравствуйте. Не пойму ошибка или нет.
      Создаю устройство - виртуальный датчик температуры, чтобы в нем выводить среднюю температуру с нескольких других датчиков.
      Соответственно делаю мульти скриптик(так как таких средних будет несколько)
      в котором прописываю:

      const temp_room = Device("SensorA","Средняя температура комнаты"); 
      
      ....
      script({
          start() {
               temp_room.setValue(15);
      

      Так вот не работает x.setValue(15);
      Для "ActorA" работает.
      Это ошибка или так и должно быть?

      Добрый день. Да, все верно, датчику значение таким образом присвоить нельзя.
      Идея в том, что x.setValue задействует канал на запись, по которому значение записывается на железо. Датчик сам значение записать не может, его value только для чтения.
      Для реализации виртуального датчика есть команда this.assign( имя устр-ва, имя свойства, значение)

      this.assign(temp_room,"value",42);
      

      В настройках-> дополнительно ставлю метод определения состояния "вычисляется сценарием".

      Не совсем. У датчика есть value - значение и state - состояние, которое грубо говоря определяет картинку.
      Этот пункт относится к state, Вы же сценарием хотите присвоить value.
      Если нужно, чтобы средняя пересчитывалась динамически при изменении любого датчика, получится примерно так:

      const temp1 = Device("SensorA","Датчик 1"); 
      const temp2 = Device("SensorA","Датчик 2"); 
      const temp3 = Device("SensorA","Датчик 3"); 
      const temp4 = Device("SensorA","Датчик 4"); 
      const temp_room = Device("SensorA","Средняя температура комнаты"); 
      
      startOnChange([ temp1, temp2, temp3, temp4 ]); 
      
      script({
          start() {
              const average = (temp1.value+temp2.value+temp3.value+temp4.value)/4;
              this.assign(temp_room,"value", average);
        }
      })
      

      Сценарий будет запускаться при изменении любого исходного датчика и персчитывать значение виртуального.

      И второй вопрос: при создании устройства выбор - актуатор бинарный(т.е. 2 состояния)
      При этом в мультисценарии ActorD — дискретный актуатор.

      Дискретный актуатор - имеется в виду актуатор с конечным числом состояний.
      По умолчанию создается бинарный. Но можно расширить число состояний

      Можно ли сделать более 2 состояний у актуатора и датчика и как? Где посмотреть примеры или описания?

      Да, можно. Раздел Состояния устройств на странице https://ih-systems.com/ru/devices/

      По состояниям:

      • у дискретных датчиков и актуаторов обычно делают value=state,
        метод определения состояния "Стандартный"

      • у аналоговых можно использовать "Метод интервалов", то есть состояние расчитывается исходя из value, по нарастанию значения (более подробно см в док-и)

      метод определения состояния "вычисляется сценарием" после перехода на v4 не используется

      Также обратите внимание на 2 момента:

      1. Состояния должны нумероваться строго подряд, начиная с 0
      2. Если устройство уже стоит на мнемосхеме, после изменения числа состояний его нужно удалить и заново поставить. На мнемосхеме можно менять визуальное представление каждого состояния, причем каждое редактируется отдельно
      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Плагин HTTP-Client

      @alesle пожалуйста 🙂
      Вот вариант еще короче

      data.onew_temp.find(item => item.name=="S6").t
      

      Современный javascript мощный и гибкий язык, особенно если использовать синтаксис ES6 (или ES2015, что одно и то же) , в данном случае стрелочные функции.
      Магия этих выражений раскрывается в 2 шага

      1. Массивы в JS имеют встроенные методы для поиска по заданному критерию, в частности filter, find

        • find - ищет первый элемент массива, возвращает найденный объект
        • filter - сюрприз 🙂 - фильтрует входной массив и возвращает все найденные элементы (learn.javascript.ru/array-methods)
      2. Методу нужно передать критерий отбора - функцию для обработки элемента массива.

        Если писать, используя синтаксис классических функций, то получится так:

         arr.filter( function (item) {
           return item.name == 'S6';  
        });
        

        Функция вызывается по очереди для каждого элемента массива (item), если возвращает true, то элемент берется в новый массив

        С введением в ES6 стрелочных функций все стало компактнее:

         function (item) {return item.name == 'S6';} 
        

        можно заменить на

         (item)  => item.name == 'S6' 
        

        Что произошло

      • убрали function
      • грубо говоря return заменили на =>
      • если входной аргумент ровно один - то и скобки можно не ставить

      Подробнее https://learn.javascript.ru/arrow-functions
      Получаем:

       arr.filter( item => item.name == 'S6' );
      

      Ну и надо иметь в виду, что возвращает метод массива.
      Если результат - массив, то берем свойство его первого элемента

      data.onew_temp.filter(item => item.name=="S6")[0].t
      

      Если результат - объект, то просто берем свойство t

      data.onew_temp.find(item => item.name=="S6").t
      
      posted in Плагины
      I
      intrapro
    • RE: Сниппеты на каждую функцию устройства.

      Участник @homa написал в Сниппеты на каждую функцию устройства.:

      А для сниппетов работаю интервалы? Что-то не получается...

      Проверили, должно работать.
      Если у вас аналоговый датчик, нужно, чтобы на вкладке Дополнительно в списке Метод определения состояния было выбрано Аналоговое значение - интервалы.
      Если сниппет возвращает значения подряд (0,1,...x), то можно сделать еще проще: взять дискретный датчик, у него добавить состояния 0,1,...x, метод переключать не надо, т к для дискретных датчиков состояние=значение

      В любом случае, если устройство уже стояло на мнемосхеме, а потом были добавлены состояния, то нужно устройство удалить и заново разместить, иначе будет ошибка Bad device

      posted in Сниппеты
      I
      intrapro
    • RE: Сценарии - новая версия API

      @Alex_Jet, Добрый день! @Erik прав - нужен актуатор, который можно переключать как угодно - интерактивно, сценарием, по расписанию...

      Сценарий гирлянды запускается при включении этого актуатора.

      Состояния в php скрипте меняются случайным образом, поэтому логика еще проще:

      1. Добавить слушателя для актуатора-триггера
      2. Генерировать строку цветов случайным образом
      3. Передать команду на MegaD
      4. Взвести таймер 1 сек

      По таймеру - повторить пункты 1-3
      При выключении триггера - завершить сценарий

      posted in Сценарии
      I
      intrapro
    • RE: Плагин MegaD

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

      Здравствуйте. Разбираюсь с системой и возникает множество вопросов))

      1. Как настраивается в плагине в канале"Функция обработки значения"?
        в каком виде можно писать?
        Например датчик температуры, если он показывает меньше -40, либо ровно 0, либо больше 100 значит он неисправен, как это записать?

      Добрый день.
      Настройку интервала допустимых значений можно настроить прямо на устройстве (min-max) . Там же можно определить, что делать, если произошел выход из диапазона:

      • "Не принимать значение вне диапазона" - значение не будет присвоено
      • "Установить ошибку при выходе из диапазона"

      Можно эти флаги устанавливать независимо. Также можно контролировать поступление данных - "Установить ошибку если нет данных в течение (сек)"

      device_setting.png

      Функция обработки в канале используется, если нужна сложная предварительная обработка. Например, от контроллера получаем 5 значений, сортируем, откидываем минимальное и максимальное и вычисляем среднее. И именно вычисленное значение отдаем ядру системы.
      Пример такой функции для плагина MegaD приведен в описании плагина (в конце страницы):
      https://ih-systems.com/ru/product/plugin-megad/

      1. Где вообще можно посмотреть хорошее описание API по intraHouse? Например по работе с БД?

      Пользовательские SQL запросы к БД на уровне ядра в версии 4 не поддерживаются. Можно писать и читать из сценария с помощью функций this.dbread(), this.dbwrite().
      Если нужно напрямую работать с БД, есть возможность написать отдельный плагин. Документации на эту тему нет 😞 , но есть примеры реализации.

      1. Как проверять работу сложного скрипта? Как посмотреть результаты работы consol.log('') или использовать какие либо аналоги ?

      Для отладки скрипта есть "Отладчик" в нижнем окне сценария. Там выводится трассировка при выполнении команд, таймеров, проверки условий.
      Вместо console.log в скрипте используйте. this.log(''), сообщение будет выведено в этом же окне

      posted in Плагины
      I
      intrapro
    • RE: Сниппеты

      @Alex_Jet Если работает, то по старому анекдоту про программиста и солнце, лучше и не трогать 🙂

      А серьезно (так понимаю, ожидается вещественное число), обработку результата можно сделать так:

      res.on('end', () => {
            const value = parseFloat(rawData);   
            callback(isNaN(value) ? "Не числовое значение "+rawData : "", value); 
      });
      

      Если придет не число, то в журнале устройства будет сообщение об ошибке

      posted in Сниппеты
      I
      intrapro

    Latest posts made by intrapro

    • RE: Запись в журналы.

      Пользователь @aleks-zonov написал в Запись в журналы.:

      Разобрался как сделать запись в журнал аварий, но не могу понять как сделать запись из сценария, может кто подскажет?

      В версии Cherry журнал аварий можно настроить только на уровне устройства. События добавляются и удаляются автоматически при изменении состояний.

      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Сценарий отопления

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

      (/assets/uploads/files/1646117183718-3.jpg) 4.JPG

      У вас косая перед "?" лишняя во входящем сообщении:
      /megad.php/?pt=3&v=0

      С меги приходит /megad.php?pt=3&v=0

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      Пользователь @Lost написал в Релиз IntraHouse V5:

      Все вроде работает....
      По факту сценарий активен, а тут показано, что он остановился.

      Да, это вы верно заметили, здесь информация не совсем верно представлена.
      Показывает, сколько длится синхронная часть (последняя выполненная функция, грубо говоря). Контроль зацикливания

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      Пользователь @Lost написал в Релиз IntraHouse V5:

      И функция boot() похоже не работает. По крайней мере этот сценарий не запускается при перезагрузке сервера. Пока закоментарил.

      Вышла версия 5.8.12-beta. В ней работает функция boot(), синтаксис как в V4.
      Проблемы с таймерами также исправлены. Еще раз спасибо за баг-репорт 🙂

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      @Lost, спасибо за подробный анализ проблемы!
      Будем разбираться

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      Пользователь @Lost написал в Релиз IntraHouse V5:

      Похоже не работает. Ваш пример сценария виртуального датчика темноты после запуска на вкладке "Описание" имеет состояние "Активен", а в окне на вкладке "Редактор" состояние Not active. Если же в таймерах этого сценария вместо временных точек указать интервал то сценарий нормально отрабатывает. На вкладке "Редактор" отображаются сообщения, например Active timer "sunrise" on 10.02 07:47:14 Active timer "sunset" on 10.02 17:20:43

      Проверили, такая конструкция отрабатывает штатно:

      this.startTimer('sunrise', this.getSysTime('sunrise','tomorrow'), 'onSunrise');
      

      Результат в отладчике:

      10.02 10:38:20.544 ---Started 
      10.02 10:38:20.555 getSysTime sunrise tomorrow = 11.02 07:27:55.983 (1644553675983)
      10.02 10:38:20.555 Start timer sunrise on time 11.02 07:27:55 (1644553675983)
      

      Какой код вы используете, из V4?

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      @Lost, да. должно работать

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      @Lost, попробуйте использовать cmd=list

      /%pwd%/?pt=43&cmd=list

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      Пользователь @Lost написал в Релиз IntraHouse V5:

      Господа разработчики, как все таки выбрать сценарий для запуска в расширениях плагина MegaD?

      Выпущена версия плагина megad v5.0.10, список сценариев берется (мультисценарии не включаются).
      Для сработки сценария нужно также обновить систему. Сейчас доступна v5.8.11-beta, стабильный релиз выпустим на следующей неделе.
      В beta версию в тестовом режиме включен новый метод сценария showDialog для вызова диалога на экран конкретного пользователя (группы):

      Диалоговое окно будет выведено на все терминалы, на которых в данный момент запущен пользовательский интерфейс с логином 'admin'. Первый аргумент 'di0012' - ID диалога:

       this.showDialog('di0012','admin');  
      

      Если диалог создан для использования с "Любым устройством", нужно передать в качестве контекста внутренний идентификатор устройства:

       this.showDialog('di0013','admin', {contextId: 'd0095'});  
      

      А то, что при изменении параметров в расширениях плагина MegaD они после сохранения не применяются поправите? Сейчас нужно перезапускать плагин MegaD.

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

      posted in intraHouse V5
      I
      intrapro
    • RE: Релиз IntraHouse V5

      @Lost, Вы правы, не работает эта функция. Выпустим на неделе обновление системы и плагина MegaD.

      posted in intraHouse V5
      I
      intrapro