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



  • @Erik:

    Все хорошо, но проверка текущего значения смещения в скрипт не попадает.

    Проверим, спасибо за баг-репорт



  • @Erik:

    И расписание утром не сработало.

    В 12 часов посмотрел, скрипты значатся выполненными в 8:00. Они выполнились позже, или выполнились вовремя, а информация о выполнении отобразилась позже?

    Если бы выполнились позже, то и время выполнения было бы позже. Время фиксируется в момент запуска сценария

    Экраны в PM динамически не обновляются. Может причина в том, что вкладка была открыта до 8:00 ?



  • @intrapro:

    @Erik:

    И расписание утром не сработало.

    В 12 часов посмотрел, скрипты значатся выполненными в 8:00. Они выполнились позже, или выполнились вовремя, а информация о выполнении отобразилась позже?

    Если бы выполнились позже, то и время выполнения было бы позже. Время фиксируется в момент запуска сценария

    Экраны в PM динамически не обновляются. Может причина в том, что вкладка была открыта до 8:00 ?

    Там есть кнопка "обновить", я ее нажимал.

    Может опять шутки с временным поясом.

    Добавил в скрипты уведомление на почту.

    Посмотрю, во сколько будут отправлены письма.



  • @intrapro:

    @Erik:

    Все хорошо, но проверка текущего значения смещения в скрипт не попадает.

    Проверим, спасибо за баг-репорт

    Поменял блок схему на такую

    Все в скрипте прописалось

    /** 
    * @name SdvigRO  
    * @desc  
    * @version 4 
    */
    
    const ACTORA1 = Device("ACTORA1");
    const ACTORA76 = Device("ACTORA76");
    const ACTORA77 = Device("ACTORA77");
    
    startOnChange([ACTORA1]);
    
    script({
      start() { 
        if (10 <= ACTORA1.value) {
        }
         this.sub1();
         this.sub2();
        if ((ACTORA1.value > -10) && (ACTORA1.value < 10)) {
        }
         this.sub3();
         this.sub4();
        if (-10 >= ACTORA1.value) {
        }
         this.sub5();
         this.sub6();
      },
      sub1() { 
        if (10 <= ACTORA1.value || 5) {
          ACTORA76.setParam("value",5);
        }
      },
      sub2() { 
        if (10 <= ACTORA1.value || 5) {
          ACTORA77.setParam("value",5);
        }
      },
      sub3() { 
        if ((ACTORA1.value > -10) && (ACTORA1.value < 10) || 2) {
          ACTORA76.setParam("value",2);
        }
      },
      sub4() { 
        if ((ACTORA1.value > -10) && (ACTORA1.value < 10) || 2) {
          ACTORA77.setParam("value",2);
        }
      },
      sub5() { 
        if (-10 >= ACTORA1.value || 0) {
          ACTORA76.setParam("value",0);
        }
      },
      sub6() { 
        if (-10 >= ACTORA1.value || 0) {
          ACTORA77.setParam("value",0);
        }
      }
    })
    
    


  • @intrapro:

    @Erik:

    Все хорошо, но проверка текущего значения смещения в скрипт не попадает.

    Проверим, спасибо за баг-репорт

    Попробовал заменить функцию "И" на "Если А=В" (она сравнивает результат двух других "если").

    Просто ошибка в скрипте в результате.



  • @Erik:

    Может опять шутки с временным поясом.

    Добавил в скрипты уведомление на почту.

    Посмотрю, во сколько будут отправлены письма.

    Письмо отправляется в 11-00.

    Это установка часового пояса на сервере.

    Виджет "часы" с сервера время берет, или с компьютера, на котором отображается?



  • @Erik:

    @Erik:

    Может опять шутки с временным поясом.

    Добавил в скрипты уведомление на почту.

    Посмотрю, во сколько будут отправлены письма.

    Письмо отправляется в 11-00.

    Это установка часового пояса на сервере.

    Виджет "часы" с сервера время берет, или с компьютера, на котором отображается?

    Виджет "часы" время берет с компьютера



  • @Erik:

    @Erik:

    Может опять шутки с временным поясом.

    Добавил в скрипты уведомление на почту.

    Посмотрю, во сколько будут отправлены письма.

    Письмо отправляется в 11-00.

    Это установка часового пояса на сервере.

    Виджет "часы" с сервера время берет, или с компьютера, на котором отображается?

    Я в тупике.

    Часовой пояс на сервере сменил - все равно скрипт выполнятся по UTC, а не по Москве.

    РАсписание запуска пересоздал. Результат тот же - запускаются по UTC.

    могу, конечно, просто сместить настройку на 3 часа.



  • @Erik:

    могу, конечно, просто сместить настройку на 3 часа.

    Это конечно не вариант 🙂

    Перезапустите сервер IntraHouse. Часовой пояс берется движком Node при старте.

    Чтобы убедиться, что время правильное, можно посмотреть текущее время в любом из журналов, в отладчике любого сценария, плагина…



  • После перезагрузки в отладчике плагина время стало московским.

    Спасибо.



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

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

    Скрипт такой

    const ActorT = Device("ActorA");
    const StempT = Device("StempA"); 
    
    startOnChange(ActorT); 
    
    script({
        start() {
            let newvalue = ActorT.value;
            StempT.setValue(newvalue);
            return; 
        } 
    });
    
    

    Выбирать устройства не дает, пишет ошибку "Real devices OR param devices?"

    Что оно от меня хочет?



  • @Erik:

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

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

    Скрипт такой

    > const ActorT = Device("ActorA");
    > const StempT = Device("StempA"); 
    >  
    > startOnChange(ActorT); 
    > 
    > script({
    >     start() {
    >         let newvalue = ActorT.value;
    >         StempT.setValue(newvalue);
    >         return; 
    >     } 
    > });
    > 
    

    Выбирать устройства не дает, пишет ошибку "Real devices OR param devices?"

    Что оно от меня хочет?

    В объявлении устройств нужно указывать либо класс устройств (ActorA, SensorA) для мультисценария, либо "Real device" - тогда это будет обычный сценарий.

    const ActorT = Device("ActorA"); - указан класс
    const StempT = Device("StempA");- такого класса нет
    
    


  • Если я поставлю 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
    
    


  • В свойствах устройства - датчика температуры можно выставить, что значение "назначается скриптом".

    Как скриптом назначить значение датчику температуры?



  • @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
    
    
    

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