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



  • @Alex_Jet:

    Коллеги! Есть какая-то бага в pm - если переходишь в раздел "Сценарии" -> "Рабочие сценарии", выбираешь нужный и пытаешься открыть нижнее окно отладчика, то ничего не происходит! Более того, больше ничего не работает (нельзя перейти в "Сценарии", например) в этой вкладке. Решается переходом в другие разделы и возвратом в "Сценарии"…нижнее окно в "Рабочие сценарии" можно открыть только путем танцем с бубном (после перехода в раздел "Сценарии" зайти в "Сценарии", открыть нижнее окно и потом перейти в "Рабочие сценарии").

    Да, действительно, баг там есть 😞 Просто пока руки не дошли 🙂



  • Не все из блоков в сценарий попадает.

    Сделал простой сценарий для изменения сдвига температуры отключения радиаторов в зависимости от температуры на улице (если на улице ниже -10, радиаторы греют до достижения нужной Т в комнате, т.е. сдвиг 0, если от -10 до +10, до сдвиг 2, т.е. радиаторы выключаются на 2 градуса раньше, остальное теплый пол догревает, если Т выше +10, сдвиг 5, т.е. в последних двух случаях радиаторы подключатся при переключении режимов, когда комнату нагреть нужно до комфортной Т, или при агрессивном проветривании :lol: ).

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

    и в зависимости от температурного диапазона присваивать смещениям одно из 3-х фиксированных значений.

    Перед присвоением проверяю текущее значение, присвоение должно происходить если текущее не равно нужному (не равно это "!=" ???).

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

    Скрипт по этой схеме прописывается такой

    /** 
    * @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) {
          ACTORA76.setParam("value",5);
        }
      },
      sub2() { 
        if (10 <= ACTORA1.value) {
          ACTORA77.setParam("value",5);
        }
      },
      sub3() { 
        if ((ACTORA1.value > -10) && (ACTORA1.value < 10)) {
          ACTORA76.setParam("value",2);
        }
      },
      sub4() { 
        if ((ACTORA1.value > -10) && (ACTORA1.value < 10)) {
          ACTORA77.setParam("value",2);
        }
      },
      sub5() { 
        if (-10 >= ACTORA1.value) {
          ACTORA76.setParam("value",0);
        }
      },
      sub6() { 
        if (-10 >= ACTORA1.value) {
          ACTORA77.setParam("value",0);
        }
      }
    })
    
    
    


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

    Вечером скрипты запустились.

    Утром - или не запустились, или не отобразилось, что были запущены.

    Скрипты одинаковые, в вечернем значение увеличивается на 1, в утреннем уменьшается на 1.

    /** 
    * @name Уменьшить.Т.Днем 
    * @desc  
    * @version 4  
    */
    
    const ActRz = Device("ActorA", "Режим отопления");
    const ActComf = Device("ActorA", "Уставка Комфорт");
    
    script({
        start() {
          if (ActRz.value === 0) {
            let newvalue = ActComf.value-1;
            ActComf.setValue(newvalue);
            return;
          }  
        }
    });
    
    


  • @Erik:

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

    Вечером скрипты запустились.

    Утром - или не запустились, или не отобразилось, что были запущены.

    Скрипты одинаковые, в вечернем значение увеличивается на 1, в утреннем уменьшается на 1.

    > /** 
    > * @name Уменьшить.Т.Днем 
    > * @desc  
    > * @version 4  
    > */
    > 
    > const ActRz = Device("ActorA", "Режим отопления");
    > const ActComf = Device("ActorA", "Уставка Комфорт");
    > 
    > script({
    >     start() {
    >       if (ActRz.value === 0) {
    >         let newvalue = ActComf.value-1;
    >         ActComf.setValue(newvalue);
    >         return;
    >       }  
    >     }
    > });
    > 
    

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



  • @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  ); 
        } 
    });
    
    
    


  • Спасибо.


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