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



  • @Erik:

    Если я поставлю SensorA, мультисценарий не видит датчики температуры.

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

    ПРостым сценарием можно присвоить значение датчику температуры?

    Попробовал, пишет "missing devices Stemp2"

    Переписал на STEMP2, ошибка пропала.

    Но значение не присваивает.

    > 12.08 15:34:43.136 Started
    > 12.08 15:34:43.137 do STEMP2 set 20.5
    > 12.08 15:34:43.138 Not found act or prop set
    > 12.08 15:34:43.139 Stopped
    > 
    

    Датчики нельзя переключать с помощью set, это не актуатор

    Чтобы установить значение датчику, используйте команду сценария this.assign:

     this.assign(Temp, "value", newvalue  ); 
    
    
    

    Для мультисценария описание должно быть таким:

    const ActorT = Device("ActorA"); // Источник данных - датчик температура как актуатор
    const StempT = Device("SensorA");  // Любой аналоговый датчик
    
    
    

    Если хотите простой сценарий - просто пропишите имена реальных устройств.

    Регистр в именах устройств имеет значение

    const ActorT = Device("STEMP2"); 
    const StempT = Device("STEMP2x");  
    
    
    

    Мультисценарий полностью (не оставляйте комментарии в декларативной части!)

    const ActorT = Device("ActorA"); 
    const StempT = Device("SensorA");  
    startOnChange(ActorT); 
    
    script({
        start() {
            this.assign(StempT, "value", ActorT.value  ); 
        } 
    });
    
    
    


  • Спасибо.



  • @intrapro:

    @Alex_Jet:

    2. Доступности из сценариев "журнал устройств" (для принудительного запуска насосов/котлов/кранов/клапанов если их период простоя велик)

    Эта возможность уже добавлена в последней версии 4.5.3 как функция устройства device.getLog(<count>)

    Опциональный параметр count - количество записей.

    Возвращаются последние записи по возрастанию времени в виде массива с полями: значение, флаг ошибки, метка времени

    > {val:"23.5", err:0, ts:1554076800000}
    > 
    

    Получить последние 10 записей:

    > const logArr = dn.getLog(10);
    > logArr.forEach(item => {
    >          this.log(JSON.stringify(item));
    > });
    > 
    > 
    ````</count>
    
    Довольно не тривиально получается извлекать время последнего выключения устройства поскольку массив данных получается такой:
    
    

    21.08 15:06:08.026 log: {"val":1,"ts":1566328458717}
    21.08 15:06:08.062 log: {"act":"off","ts":1566342000920,"scene":"110"}
    21.08 15:06:08.066 log: {"val":0,"ts":1566342001056}
    21.08 15:06:08.069 log: {"act":"on","ts":1566369165938,"scene":"mTimeOut_TurnOn_byTime"}
    21.08 15:06:08.073 log: {"val":1,"ts":1566369166059}
    21.08 15:06:08.077 log: {"act":"prop:auto","act_val":0,"ts":1566369166060}
    21.08 15:06:08.081 log: {"act":"toggle","ts":1566369530254,"login":"admin"}
    21.08 15:06:08.084 log: {"val":0,"ts":1566369530362}
    21.08 15:06:08.088 log: {"act":"prop:auto","act_val":0,"ts":1566369530362}
    21.08 15:06:08.092 log: {"act":"prop: auto ","act_val":1,"ts":1566373131164}

    Я так понял, что нужное мне время (последнего выключения актюатора) содержится в том массиве, в котором val = 0 (вероятно это именно состояние канала контроллера). Однако в случае если журнал устройства чист и мы его обновляем, например, командой dev.off(), то в журнале появляется лишь {"act":"off","ts":1566342000920,"scene":"ХХХ"} - вероятно это состояние устройства на мнемосхеме. Поэтому в итоге анализ журнала и вычисление времени последнего выключения устройства получился довольно сложным:
    
    
      let lasttime = 0;         //Время последнего отключения устройства в мс
    
      let logArr = dev.getLog(10); //Чтение последних 10 записей из журнала актюатора в массив
      let allts = []; //Пустой массив для сбора времени выключения актюатора из его журнала
    
      //Перебор массива из записей журнала актюатора с поиском времени его отключения
      logArr.forEach(item => {
        let durArr = JSON.stringify(item);
        let obj = JSON.parse(durArr);
        //this.log(durArr); //Для отладки
    
        //Если актюатор был отключен, то заносим время его отключения в массив
        if(obj.val === 0 || obj.act == "off") {
          allts.push(obj.ts);
        }
      });
    
      //Берем из массива времени самое последнее значение
      lasttime = allts[allts.length - 1];
      //Если время не определено (журнал устройства чист), то обновляем журнал устройства
      if(lasttime === undefined && dev.isOff()) dev.off();
    
    
    Ок, с этим разобрался. Другой вопрос - где найти нижеследующее? Точнее как это сделать? Или возможность пока не реализована?
    @intrapro:
    
    > @Alex_Jet:
    > 
    > > 1\. Реализации "cron" для сценариев (запуск сценариев для проверки состояния устройств) 
    > Будет в конце месяца для простых и мультисценариев (пока без блок-схем)
    
    Также интересует еще следующее:
    @intrapro:
    
    > @Alex_Jet:
    > 
    > > 4\. Доступности из сценариев пользовательских журналов (создавать журналы можно, но писать в них логи пока никак)
    > 
    > Концепция журналов будет пересматриваться, пока по срокам не ясно
    
    Хотел бы для каждой навороченной подсистемы (отопление, вентиляция) иметь свой журнал чтобы дебажить и анализировать правильность работы.


  • Столкнулся с "особенностью" видимо.

    У актуатора есть 2 состояния - аключено и выключено, и значения, которые он может принимать.

    В интерфейсе к состояниям привязано оформление. Если "выключено" - шрифт прозрачный, если "включено" - шрифт черный.

    Чтобы в интерфейсе у включенного отображалось значение, у выключенного не отображалось.

    И в скрипте есть сет он или сет офф в нужное время.

    Оказалось, что сет офф это установка в 0.

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

    Изменение верхней границы состояния "офф" до 5 не помогает. Все равно команда "сет офф" пытается поставить значение 0.

    Получается выбор. Или граница от 0 в пользовательском интерфейсе, или "сет офф" не срабатывает.

    Менять "сет офф" на установку =5 ? "сет офф" не может быть адаптивным (например принимать минимальное доступное значение из заданного состоянию диапазона)?



  • А в сценариях никаких изменений не было? Обратил внимание, что у меня один сценарий входящим сообщение от плагина не запускается, хотя плагин принимает входящие от голосового терминала:

    29.08 11:57:09.822 voiceterminal2: { type: 'startscene',
      id: 'VoiceTerminal_Status',
      arg: '{"username":"voiceterminal","uptime":"4451699","volume":"100","music_volume":"-1","terminal":"VT2"}' }
    
    

    При этом в отладчике сценария - пусто! Как выяснить где есть проблема? iH перезапускал.

    Убрал триггер startOnChange([dev1,dev2]) и скрипт стал запускаться сообщениями от плагина. Вставил триггер - тоже все работает в том числе управление голосовым терминалом с вкладки "Параметры".

    У вас при загрузке системы есть какая-то проверка "есть ли у скрипта триггеры", и если есть, то плагин его не может запускать? Вероятно придется один скрипт разбить на два…

    А дополнительные параметры достаточно в одном скрипте прописывать?

    Update: в принципе сделал два скрипта - один для обновления статуса, который шлет терминао, второй для его управления. Все работает нормально. Послежу еще.



  • @Erik:

    Столкнулся с "особенностью" видимо.

    У актуатора есть 2 состояния - аключено и выключено, и значения, которые он может принимать.

    В интерфейсе к состояниям привязано оформление. Если "выключено" - шрифт прозрачный, если "включено" - шрифт черный.

    Чтобы в интерфейсе у включенного отображалось значение, у выключенного не отображалось.

    И в скрипте есть сет он или сет офф в нужное время.

    Оказалось, что сет офф это установка в 0.

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

    Изменение верхней границы состояния "офф" до 5 не помогает. Все равно команда "сет офф" пытается поставить значение 0.

    Получается выбор. Или граница от 0 в пользовательском интерфейсе, или "сет офф" не срабатывает.

    Менять "сет офф" на установку =5 ? "сет офф" не может быть адаптивным (например принимать минимальное доступное значение из заданного состоянию диапазона)?

    Для обычного аналогового актуатора off - это как правило не минимальное доступное значение, а реально выключено.

    Например, диммер.off() - значит выключить (0)

    А минимальное ставим 5-8% - значение, при котором диммер очень тускло, но все же горит. Для аналоговых значений приходится разделять фактический ноль (выключено) и малые ненулевые величины.

    У вас ситуация другая, решается задача изменения состояния для индикации.

    Могу предложить 2 варианта:

    Вариант 1: Его вы сами рассматривали - убрать галочку на запрет выходить за границу.

    Вариант 2: Использовать метод определения состояний - интервалы и выбрать минимальное значение в качестве границы нулевого состояния.

    Здесь вместо on/off нужно использовать set

          actor1.setValue(actor1.getParam('min')); // вместо off() -ставим min
          ......
          actor1.setValue(actor1.setpoint); // вместо on() - возвращаем сохраненный setpoint
    
    
    


  • Здравствуйте. Такое дело. Сделал простой сценарий блок-схему, в общем с ноутбука все отрабатывает корректно, если диммер ползунком передвигаю в вебе, а с мобильного приложения меняя ползунок, в вебе на ноутбуке все меняется, свет регулируется, но сценарий не срабатывает. В чем может быть дело?
    не работает.png



  • По блок-схеме вижу:

    Если DIMM1 равно 50, то включить Actor1

    Если DIMM1 больше 99, то выключить Actor1

    Вы именно это хотите?

    Что в результате? Когда у DIMM1 устанавливаете 50, то Actor1 не включается?

    Кстати в Вашей блок-схеме элементы AND лишние. В данном случае они ничего не объединяют.



  • Прошу прощения:( все не так… на ноутбуке в вебе если в приложении менять яркость диммера, то на значке нижнее значение меняется, верхнее не меняется. Верхнее меняется только с веба ноутбука, соответственно и в вебе меги не чего не меняется и сценарий не отрабатывает. Почему так?
    33.png



  • И подскажите пожалуйста, как сделать сценарий блок схему, где при сработке датчика будет воспроизводиться аудио файл. Как было в berry.



  • Коллеги! А можно комментарии по вот этому посту - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&start=320#p10760?



  • Пока не сделали



  • @artem521:

    И подскажите пожалуйста, как сделать сценарий блок схему, где при сработке датчика будет воспроизводиться аудио файл. Как было в berry.

    Специализированной команды сейчас нет. В блок-схеме можно использовать блок Команда OS. В поле Текст нужно прописать вызов программы воспроизведения звукового файла, например aplay или mplayer. После пробела нужно указать полный путь к файлу, например:

    aplay /home/my/sounds/ding.wav

    Если звук не воспроизводится, нужно смотреть отладчик. При запуске сценария в отладчике можно увидеть результат выполнения системной команды



  • @intrahouse:

    @artem521:

    И подскажите пожалуйста, как сделать сценарий блок схему, где при сработке датчика будет воспроизводиться аудио файл. Как было в berry.

    Специализированной команды сейчас нет. В блок-схеме можно использовать блок Команда OS. В поле Текст нужно прописать вызов программы воспроизведения звукового файла, например aplay или mplayer. После пробела нужно указать полный путь к файлу, например:

    aplay /home/my/sounds/ding.wav

    Если звук не воспроизводится, нужно смотреть отладчик. При запуске сценария в отладчике можно увидеть результат выполнения системной команды

    Спасибо большое за ответ;)



  • Коллеги! Помагите))) Недавно писал, что не отображаются статусы голосовых терминалов и, соответственно, не могу ими управлять (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5494&start=30#p10828). Тогда все починил и все было ок. Но такое ощущение что при последнем обновлении где-то что-то было изменено и из плагина не запускается данный сценарий (сегодня утром включал свет и другой сценарий работал). Даже хуже - при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop! Свойства, объявленные в сценарии на вкладке "Параметры" у плагина не появляются… что такое может быть? При этом плагин получает от терминала сообщения и пытается запустить сценарий:

    23.09 16:55:56.429 voiceterminal2: 192.168.11.52 => localhost:11052 HTTP GET /api/method/name.method?music_volume=100&volume=100&username=voiceterminal&terminal=VT2&uptime=2142315
    23.09 16:55:56.430 voiceterminal2: 192.168.11.52 <= localhost:11052 
    23.09 16:55:56.430 voiceterminal2: { type: 'startscene',
      id: 'VoiceTerminal_Status',
      arg: '{"music_volume":"100","volume":"100","username":"voiceterminal","terminal":"VT2","uptime":"2142315"}' }
    23.09 16:55:56.431 IH: startscene VoiceTerminal_Status
    
    


  • Есть сценарий на включение света, когда я захожу домой срабатывает SMOTION2 (датчик света) с проверкой датчика датчика освещенности SENSORA1, когда есть движения там где есть датчик движения то скрипт работает при условии что не было 30 секунд без движения. Вопрос как можно его дополнить: Задача: SMOTION2 (точка входа в помещение) активирует сценарий и что бы SMOTION21 (конечная точка в помещении) останавливала сценарий. но если я задерживаюсь на любых зонах там где есть датчик движения (SMOTION2,SMOTION4,SMOTION21) то там продолжает гореть свет а в других зонах он гаснет цвет, но если я дохожу до конечной точки (SMOTION21) то цвет через назначенное время гаснет всюду даже если таймер в какой то зоне еще активный.

    const LAMP23 = Device("LAMP23");

    const LAMPHL11 = Device("LAMPHL11");

    const LAMPKL12 = Device("LAMPKL12");

    const SMOTION2 = Device("SMOTION2");

    const SMOTION4 = Device("SMOTION4");

    const SMOTION21 = Device("SMOTION21");

    const SENSORA1 = Device("SENSORA1",'');

    startOnChange([SMOTION2],SENSORA1.value<10);

    script({

    start() {

    this.log("auto_light start");

    this.addListener(SMOTION2, "onMotion");

    this.addListener(SMOTION4, "onMotion");

    this.addListener(SMOTION21, "onMotion");

    },

    onMotion(){

    this.log("auto_light onMotion");

    LAMP23.turnOnSaveAuto();

    LAMPHL11.turnOnSaveAuto();

    LAMPKL12.turnOnSaveAuto();

    this.stopTimer("T1");

    this.startTimer("T1", 30, "offLight");

    },

    offLight(){

    LAMP23.turnOffSaveAuto();

    LAMPHL11.turnOffSaveAuto();

    LAMPKL12.turnOffSaveAuto();

    this.log("auto_light end");

    this.exit();

    }

    })



  • @Alex_Jet:

    Коллеги! Помагите))) Недавно писал, что не отображаются статусы голосовых терминалов и, соответственно, не могу ими управлять (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5494&start=30#p10828). Тогда все починил и все было ок. Но такое ощущение что при последнем обновлении где-то что-то было изменено и из плагина не запускается данный сценарий (сегодня утром включал свет и другой сценарий работал). Даже хуже - при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop! Свойства, объявленные в сценарии на вкладке "Параметры" у плагина не появляются… что такое может быть? При этом плагин получает от терминала сообщения и пытается запустить сценарий:

    > 23.09 16:55:56.429 voiceterminal2: 192.168.11.52 => localhost:11052 HTTP GET /api/method/name.method?music_volume=100&volume=100&username=voiceterminal&terminal=VT2&uptime=2142315
    > 23.09 16:55:56.430 voiceterminal2: 192.168.11.52 <= localhost:11052 
    > 23.09 16:55:56.430 voiceterminal2: { type: 'startscene',
    >   id: 'VoiceTerminal_Status',
    >   arg: '{"music_volume":"100","volume":"100","username":"voiceterminal","terminal":"VT2","uptime":"2142315"}' }
    > 23.09 16:55:56.431 IH: startscene VoiceTerminal_Status
    > 
    

    Коллеги, посмотрите все же что происходит с Scene Engine? Мне кажется после последних обновлений у меня перестает работать часть сценариев (по крайней мере 2 шт., связанных с Voice Terminal - точно прекращают свою работу!). Например, вышеприведенный. Захожу в сценарий, изменяю его (ввожу, например, пробел), сохраняю и он работает до поры до времени…



  • @Alex_Jet:

    @Alex_Jet:

    Коллеги! Помагите))) Недавно писал, что не отображаются статусы голосовых терминалов и, соответственно, не могу ими управлять (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5494&start=30#p10828). Тогда все починил и все было ок. Но такое ощущение что при последнем обновлении где-то что-то было изменено и из плагина не запускается данный сценарий (сегодня утром включал свет и другой сценарий работал). Даже хуже - при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop! Свойства, объявленные в сценарии на вкладке "Параметры" у плагина не появляются… что такое может быть? При этом плагин получает от терминала сообщения и пытается запустить сценарий:

    > > 23.09 16:55:56.429 voiceterminal2: 192.168.11.52 => localhost:11052 HTTP GET /api/method/name.method?music_volume=100&volume=100&username=voiceterminal&terminal=VT2&uptime=2142315
    > > 23.09 16:55:56.430 voiceterminal2: 192.168.11.52 <= localhost:11052 
    > > 23.09 16:55:56.430 voiceterminal2: { type: 'startscene',
    > >   id: 'VoiceTerminal_Status',
    > >   arg: '{"music_volume":"100","volume":"100","username":"voiceterminal","terminal":"VT2","uptime":"2142315"}' }
    > > 23.09 16:55:56.431 IH: startscene VoiceTerminal_Status
    > > 
    

    Коллеги, посмотрите все же что происходит с Scene Engine? Мне кажется после последних обновлений у меня перестает работать часть сценариев (по крайней мере 2 шт., связанных с Voice Terminal - точно прекращают свою работу!). Например, вышеприведенный. Захожу в сценарий, изменяю его (ввожу, например, пробел), сохраняю и он работает до поры до времени…

    Добрый день! Навскидку изменений, связанных со сценариями, было немного (обработка результата команд execOS и pluginCommand).

    Нужно определить что конкретно перестало работать
    <list>* не срабатывает запуск сценария из плагина;</list>
    <list>* сценарий запускается, но не находит устройства;</list>
    <list>* не присваиваются свойства;</list>
    <list>* свойства присвоились, но не показываются в окне устройства</list>

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

    
     start(param) {
        let device = '';
        this.log("VoiceTerminal_Status started with "+param);
    
        //Скрипт запускается плагином с параметрами
        if(param !== undefined) {
          const obj = JSON.parse(param);
    
          //Выбор устройства
          if(obj.terminal == "VT1") {
            device = dev1;
            this.log("device= "+device.dn);
          }
          else if(obj.terminal == "VT2") {
            device = dev2;
            this.log("device= "+device.dn);
          } else {
             this.log("device not found:  "+ obj.terminal);
         }
         // И можно в конце вывести свойство любое после присваивания
    
    
    

    @Alex_Jet:

    при ручном запуске сценария VoiceTerminal_Status в отладчике вообще ничего нет - ни start, ни stop!

    Вот это иногда бывает, сценарий просто не запускается, это баг отладчика. Нужно закрыть отладчик, обновить страницу и заново выбрать сценарий.



  • @intrapro:

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

    Вот это иногда бывает, сценарий просто не запускается, это баг отладчика. Нужно закрыть отладчик, обновить страницу и заново выбрать сценарий.

    Я хотел так сделать, но поскольку события от терминала сыпятся очень часто, то у меня рабочий журнал будет весь забит… вот бы вы реализовали запись лога в журнал, созданный администратором! А то журнал создать можно, а запись вести в него - нет:(

    Но другой момент в том, что после тупого пересохранения сценария все начинает работать! У меня буквально на днях с новым сценарием был случай, когда в качестве param приходил не верный аргумент (не выполнил требования формата json - не закрыл кавычки) и когда он приходил, то сценарий делал start и зависал. Помогало только его новое сохранение. Возможно тут происходит то же, но надо отловить этот не верный param! Сходу не смог отловить SyntaxError от JSON.parse...не подскажите как сделать?

    По описанному багу отладчика - ни разу не встречал. Хотя сценариев написал довольно много (штук 30 уже точно есть)!

    Update: сделал функцию разбора JSON. В случае ошибок в синтаксисе проблема должна выводится в лог:

      ParseJSON(param) {
          try {
            return JSON.parse(param);
          }
          catch (e) {
            let text = e instanceof SyntaxError;
            this.log("SyntaxError - " +text+ "; param - " +param);
          }
      },
    
    


  • В общем по новым наблюдениям: как только перезагружаю iH (из вебки), то после обновления страниц (открываю отладчик плагина и открываю отладчик сценария) в плагине сообщения от железки идут и есть сообщение о запуске сценария, но в отладчике сценария - пусто!

    Как только пересохраняю сценарий (добавляю и удаляю пробел, жму сохранить), то в его отладчике сразу появляются сообщения.

    Повторил несколько раз - картина одинаковая. Остальные сценарии вроде бы работают.

    У вас есть возможность сделать эксперимент с моим сценарием? По идее достаточно сохранить сценарий, установить плагин voiceterminal (слушающий порт 11052) и в браузере вбить http://адрес_сервера_iH:11052/api/method/name.method?music_volume=110&volume=120&username=voiceterminal&uptime=500&terminal=VT2


Авторизуйтесь, чтобы ответить