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



  • @Alex_Jet:

    Коллеги! Сегодня перенастроил задачи по расписанию - с закат+х и рассвет-х поставил статическое время. Уже сутки все сценарии выполняются по два раза подряд! Систему перезагружал вчера при обновлении.

    Добрый день.

    То есть это происходит после изменения пунктов расписания? Пока у себя не смогли воспроизвести. Но будем искать 🙂

    Попробуйте сервер перезагрузить.



  • @intrapro:

    @Alex_Jet:

    Коллеги! Сегодня перенастроил задачи по расписанию - с закат+х и рассвет-х поставил статическое время. Уже сутки все сценарии выполняются по два раза подряд! Систему перезагружал вчера при обновлении.

    Добрый день.

    То есть это происходит после изменения пунктов расписания? Пока у себя не смогли воспроизвести. Но будем искать 🙂

    Попробуйте сервер перезагрузить.

    Как будто - да! Сегодня обновил систему с перезагрузкой. Понаблюдаю. Двое суток утром и вечером сценарии запускались по два раза подряд.

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



  • @Alex_Jet:

    Как будто - да! Сегодня обновил систему с перезагрузкой. Понаблюдаю. Двое суток утром и вечером сценарии запускались по два раза подряд.

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

    Спасибо, теперь знаем где рыть 🙂



  • Добрый день. Сейчас в графическом редакторе сценариев не наблюдаю выбор режима "mode" (trigger или state) для датчиков и актуаторов. По умолчанию все триггерами назначаются. Как режим сейчас задать?



  • @sergeyygr:

    Добрый день. Сейчас в графическом редакторе сценариев не наблюдаю выбор режима "mode" (trigger или state) для датчиков и актуаторов. По умолчанию все триггерами назначаются. Как режим сейчас задать?

    Добрый день!

    Да, действительно, сейчас для этого используется блок DP "Свойство устройства" на вкладке "Операции".
    intraHouse_PM_ihscada.png

    Нужно задать устройство и свойство из выпадающего списка. Таким образом есть возможность выбора любых свойств,в том числе дополнительных.

    В результате появляется желтый блок со свойством. Например, на этой блок-схеме Датчик температуры не является триггером:
    scene_ex2.png



  • Подскажите, у меня в старой версии сценария рассчитывались уставки и проверялось условие перехода в start() таким образом:

        ust_min: 0,
        ust_max: 0,
        text: "",
    
        check() {
          //Определение уставок
          this.ust_min = dt.defval - heater.hist;
          this.ust_max = dt.defval + heater.hist/2;
          //Проверка основных условий
          return heater.auto && ( !heater.dval&&(dt.aval <= this.ust_min)&&(dt_ext.aval < dt_ext.defval) || heater.dval&&(dt.aval >= this.ust_max) );
        },
    
    

    Хочу переписать под новую версию сценариев и есть два вопроса:

    1. Как рассчитывать уставки и определять их, используя StartOnChange?

    2. Хочу добавить проверку работоспособности основного датчика и если по нему фиксируется авария, то переключаться на другой. Сейчас в одном из сценариев у меня сделано так:

          let sensor_ext = '';
    
          //Проверка работоспособности датчика уличной температуры
          //При его неисправности - работаем по резервному датчику
          if(!dt_ext.isError()) {
            sensor_ext = dt_ext;
          }
          else {
            sensor_ext = dt_ext_rez;
            this.log("Датчик '" +dt_ext.name+ "' неисправен!");
          }
    
    

    По идее sensor_ext должен участвовать в StartOnChange вместо dt_ext (см.код выше). Как это все вместе записать, опять же используя StartOnChange? Ну или ваш вариант.



  • @intrapro:

    @sergeyygr:

    Добрый день. Сейчас в графическом редакторе сценариев не наблюдаю выбор режима "mode" (trigger или state) для датчиков и актуаторов. По умолчанию все триггерами назначаются. Как режим сейчас задать?

    Добрый день!

    Да, действительно, сейчас для этого используется блок DP "Свойство устройства" на вкладке "Операции".

    intraHouse_PM_ihscada.png

    Нужно задать устройство и свойство из выпадающего списка. Таким образом есть возможность выбора любых свойств,в том числе дополнительных.

    В результате появляется желтый блок со свойством. Например, на этой блок-схеме Датчик температуры не является триггером:

    scene_ex2.png

    Спасибо!



  • Подскажите пожалуйста как в редакторе сценариев вывести функцию управления актуатором по счетчику? Необходимо написать сценарий, в котором после включения клапана воды начинается отсчет слива заданного количества воды (100 литров по счетчику воды) и по достижению установленного значения клапан должен выключиться.



  • @intrapro:

    @sergeyygr:

    Добрый день. Сейчас в графическом редакторе сценариев не наблюдаю выбор режима "mode" (trigger или state) для датчиков и актуаторов. По умолчанию все триггерами назначаются. Как режим сейчас задать?

    Добрый день!

    Да, действительно, сейчас для этого используется блок DP "Свойство устройства" на вкладке "Операции".

    intraHouse_PM_ihscada.png

    Нужно задать устройство и свойство из выпадающего списка. Таким образом есть возможность выбора любых свойств,в том числе дополнительных.

    В результате появляется желтый блок со свойством. Например, на этой блок-схеме Датчик температуры не является триггером:

    scene_ex2.png

    В свойствах property есть значение, состояние, ошибка. Уставка (как в примере) не отображается.



  • @sergeyygr:

    В свойствах property есть значение, состояние, ошибка. Уставка (как в примере) не отображается.

    А какое у Вас устройство?

    Уставка есть только у аналоговых устройств, причем в настройке устройства должна стоять галочка "Есть уставка (дефолтное значение)"

    devSetpoint.png



  • @intrapro:

    @sergeyygr:

    В свойствах property есть значение, состояние, ошибка. Уставка (как в примере) не отображается.

    А какое у Вас устройство?

    Уставка есть только у аналоговых устройств, причем в настройке устройства должна стоять галочка "Есть уставка (дефолтное значение)"

    devSetpoint.png

    Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?



  • @sergeyygr:

    Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?

    Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно 😞



  • @intrapro:

    @sergeyygr:

    Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?

    Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно 😞

    По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее 😉



  • @sergeyygr:

    @intrapro:

    @sergeyygr:

    Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?

    Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно 😞

    По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее 😉

    То есть счетчик считает в обе стороны 😮 ? Или их два?



  • @intrapro:

    @sergeyygr:

    @intrapro:

    Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно 😞

    По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее 😉

    То есть счетчик считает в обе стороны 😮 ? Или их два?

    Счётчик один, режим реверсивного отсчёта.



  • @sergeyygr:

    @intrapro:

    @sergeyygr:

    По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее 😉

    То есть счетчик считает в обе стороны 😮 ? Или их два?

    Счётчик один, режим реверсивного отсчёта.

    Создайте второй виртуальный счетчик, и сценарий meter2=100-meter1 когда достигает нуля, обнуляем первый и присваиваем 100 второму



  • @homa:

    @sergeyygr:

    @intrapro:

    То есть счетчик считает в обе стороны 😮 ? Или их два?

    Счётчик один, режим реверсивного отсчёта.

    Создайте второй виртуальный счетчик, и сценарий meter2=100-meter1 когда достигает нуля, обнуляем первый и присваиваем 100 второму

    Спасибо, попробую.



  • Коллеги! Всех с праздником Великой победы!

    Intrapro, intrahouse, помогите разобраться как правильно использовать startOnChange в качестве функции с расчетом уставок и проверкой разных значений. Мой предыдущий пост тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&start=270#p10166



  • @Alex_Jet:

    Коллеги! Всех с праздником Великой победы!

    Intrapro, intrahouse, помогите разобраться как правильно использовать startOnChange в качестве функции с расчетом уставок и проверкой разных значений. Мой предыдущий пост тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&start=270#p10166

    Добрый день, попробуйте использовать блочные сценарии там все просто и понятно 😉

    startOnChange([], условное выражение)

    Первый параметр — устройство или массив устройств из тех, что были объявлены как Device

    Второй параметр — опциональное условное выражение, которое проверяется до того как сценарий запустится

    Если триггеры не объявлены (startOnChange отсутствует) — сценарий по событиям запускаться не будет.

    script ({
      sensor_ext: "",
      start() {
        if(!dt_ext.isError()) {
            this.sensor_ext = dt_ext;
          }
          else {
            this.sensor_ext = dt_ext_rez;
            this.log("Датчик '" +dt_ext.name+ "' неисправен!");
          }
      },
    )
    
    
    


  • @Alex_Jet:

    Подскажите, у меня в старой версии сценария рассчитывались уставки и проверялось условие перехода в start() таким образом:

    >     
    >     ust_min: 0,
    >     ust_max: 0,
    >     text: "",
    > 
    >     check() {
    >       //Определение уставок
    >       this.ust_min = dt.defval - heater.hist;
    >       this.ust_max = dt.defval + heater.hist/2;
    >       //Проверка основных условий
    >       return heater.auto && ( !heater.dval&&(dt.aval <= this.ust_min)&&(dt_ext.aval < dt_ext.defval) || heater.dval&&(dt.aval >= this.ust_max) );
    >     },
    > 
    

    Хочу переписать под новую версию сценариев и есть два вопроса:

    1. Как рассчитывать уставки и определять их, используя StartOnChange?

    2. Хочу добавить проверку работоспособности основного датчика и если по нему фиксируется авария, то переключаться на другой. Сейчас в одном из сценариев у меня сделано так:

    >       let sensor_ext = '';
    >       
    >       //Проверка работоспособности датчика уличной температуры
    >       //При его неисправности - работаем по резервному датчику
    >       if(!dt_ext.isError()) {
    >         sensor_ext = dt_ext;
    >       }
    >       else {
    >         sensor_ext = dt_ext_rez;
    >         this.log("Датчик '" +dt_ext.name+ "' неисправен!");
    >       }
    > 
    

    По идее sensor_ext должен участвовать в StartOnChange вместо dt_ext (см.код выше). Как это все вместе записать, опять же используя StartOnChange? Ну или ваш вариант.

    Добрый день!

    По поводу startOnChange и check(). На самом деле check продолжает работать в новой версии

    То есть проверять условие на входе можно двумя способами:

    1. Можно добавить как второй аргумент в startOnChange.

    2. Можно определить функцию check, и если она вернет false, сценарий также не запустится.

    Нельзя использовать оба варианта одновременно, первый является основным.

    Эти сценарии работают одинаково:

    Используем условное выражение в startOnChange

    const lamp = Device("LAMP1"); 
    startOnChange(lamp, lamp.auto); 
    script({
        start() {
            this.log('Сценарий запущен!');
            // ....
        } 
    });
    
    

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

    const lamp = Device("LAMP1"); 
    startOnChange(lamp); 
    script({
        check() {
            return lamp.auto;
        }, 
    
        start() {
            this.log('Сценарий запущен!');
            // ....
        } 
    });
    
    
    

    Главное отличие: в предыдущей версии устройства-триггеры неявно извлекались из функции check.

    Теперь их нужно прописать явно в startOnChange. Как написал dev в предыдущем сообщении, если нет startOnChange -сценарий по событиям запускаться не будет.

    Такой вариант теперь работать не будет, хотя в предыдущей версии работал

    const lamp = Device("LAMP1"); 
    
    script({
        check() {
            return lamp.auto;
        }, 
    
        start() {
            this.log('Сценарий запущен!');
            // ....
        } 
    });
    
    
    

    То есть Вам достаточно объявить триггеры в startOnChange([dev1, dev2,…]) А check оставить как есть

    К сожалению, в документации это толком не прописано. Исправим это упущение 🙂


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