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



  • @intrapro:

    Упс, нужны еще кавычки (имя свойства)

    > startOnChange(sen_master, sen_master.isChanged('value'));
    > 
    

    Все равно где-то какой-то косяк! Прописал:

    startOnChange(sen_master, sen_master.isChanged("value"));
    
    

    Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.



  • @Alex_Jet:

    Все равно где-то какой-то косяк! Прописал:

    > startOnChange(sen_master, sen_master.isChanged("value"));
    > 
    

    Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.

    Да, действительно, косяк 😞 isChanged тоже (как assign) не является методом устройства, а является методом сценария.

    "Метод позволяет определить, явилось ли устройство триггером сценария при текущем запуске: this.isChanged(device)

    Возвращает true, если запуск сценария произошел по событию устройства device"

    startOnChange(sen_master,this.isChanged(sen_master));
    
    

    Это сработает, но особого смысла в вашем случае не имеет, так так триггер у вас один.

    "Также бывает полезно узнать, какое конкретно свойство изменилось. Для этого нужно передать имя свойства в качестве второго параметра: this.isChanged(temp, ‘value’)" А этот вариант при вызове из startOnChange не работает, только внутри сценария

    Подумаем, как это переделать



  • @intrapro:

    @Alex_Jet:

    Все равно где-то какой-то косяк! Прописал:

    > > startOnChange(sen_master, sen_master.isChanged("value"));
    > > 
    

    Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.

    Да, действительно, косяк 😞 isChanged тоже (как assign) не является методом устройства, а является методом сценария.

    > startOnChange(sen_master,this.isChanged(sen_master));
    > 
    

    Это сработает, но особого смысла в вашем случае не имеет, так так триггер у вас один.

    Подумаем, как это переделать

    Вроде хотели сделать API легче и понятнее, а в чем-то получилось усложнение… раньше можно было указать только const dt = DeviceT(...).



  • Вопросы:

    1. Возможно из сценария запросить значение по устройству из БД? Задача - формировать сводку по потреблению воды/газа:

    • Текущее показание счетчика

    • Количество потребленной электроэнергии/воды/газа за последний месяц (текущая дата - 1 month).

    2. Callback можно получить при удачной отправке email, telegram, sms?

    3. Не могу понять как в расписании правильно задать время и дату? Нужно - в 10:00 25 числа каждого месяца отправлять показания. Пишу "10:00 25..", но система ругается на дату. Update: время задается отдельно, а в этом поле только дата в формате "05.." или ".08." - надо поправить маску числа чтобы не вводить в заблуждение пользователей.

    Update2: сценарий запустился сегодня!!! хотя маска была 25.. и расчет был на 25.01.2019!
    Сценарии_Запустился_не_по_Маске.png
    4. Можно сделать сортировку сценариев "по умолчанию" по имени, пока вы придумываете механизм их сортировки?

    Бага по запуску сценариев по расписанию (-2 часа) - снова сработал 2 раза:
    Сценарии_сработал_2_раза_по расписанию.png
    Сам сценарий простой:

    /** 
    * @name Включение ТП2 если было солнце
    * @desc Если температура на закате больше уставки, то включаем насос ТП2 
    * @version 4  
    */
    
    const dt = Device("ST_HEATING2_02");
    const heat = Device("PUMP2");
    
    script({
        start() {
          if(dt.value > dt.setpoint + 0.1) {
            if(heat.isOff()) heat.on();
    
            this.log(dt.name+ " = " +dt.value+ ", Heat = On");
          }
        }
    });
    
    


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



  • К моим предыдущим вопросам (https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&sid=4a29eb09bb6c98b9a57baf95cd21d75e&start=110#p8771) еще один - как сделать сценарий со следующей постановкой задачи:

    Если насос/котел/кран не менял свое состояние (не включался) больше суток/недели/месяца, то включить его на 5 минут и затем выключить.

    Попытался сам реализовать подобный скрипт с "ручным" запуском (в дальнейшем нужен cron для периодического запуска сценария). Использую параметр dev.getParam('lastts'). Но вот незадача - последний раз устройство запускалось в 09:50:21, однако при запуске скрипта получаем то что он запускался 46 минут назад:

    30.01 12:34:23.248 Started
    30.01 12:34:23.249 log: 1548826463249 - 1548823700616 = 2762633
    30.01 12:34:23.287 log: Насос ТП1, Last ON = 0.77 < 1 -> exit
    30.01 12:34:23.290 Stopped
    
    

    Проверил для другого насоса. Он ранее был выключен в 11:00:13, однако скрипт считает 48 минут.

    30.01 12:36:23.803 Started
    30.01 12:36:23.803 log: 1548826583803 - 1548823700616 = 2883187
    30.01 12:36:23.836 log: Насос РО1, Last ON = 0.80 < 1 -> exit
    30.01 12:36:23.840 Stopped
    
    

    Почему такое может быть? Ранее корреляция прослеживалась.

    Update: О…нашел - в боковом меню устройства внизу пишется время 11:48:20 - это время последнего принудительного опроса (у меня стоит интервал опроса всех каналов 1 час). Ок, раз так, но зачем при неизменном состоянии канала обновлять его lastts???

    Еще один момент - комбинация Lamp1.setAuto(True) не работает, отладчик пишет:

    31.01 08:33:56.911 Error function TurnOffDev:True is not defined
    
    

    То есть нужно True обрамлять кавычками - Lamp1.setAuto('True') - надо поправить в API сценариев.



  • @denis-000:

    1.При условии, что датчик освещенности меньше «5» lux стал, включается лампочка, как значение вышло в мой режим, стало «6» lux например, лампочка выключается.

    В виде блок-схемы это может выглядеть так:
    scen-light1031.jpg
    @denis-000:

    2. Если аналоговый датчик освещенности меньше «100» lux, то диммер включится на 50 %, как станет 200 lux, то свет выключится.

    scen-light1032.jpg
    @denis-000:

    И еще вопрос. Можно чтобы в зависимости от освещенности динамически менялся диммер?

    В виде блок-схем не получится. Позже покажем сценарий и опубликуем его на сайте как шаблонный.
    @denis-000:

    Может где-то можно найти полное описание всех операций и команд и краткое обозначение для чего — это нужно.

    Информация по сценариям:

    https://ih-systems.com/ru/category/wiki/scenes/

    https://ih-systems.com/ru/new-api-scenes/

    https://ih-systems.com/ru/device-errors-resolve/
    @denis-000:

    Я только начинаю, для меня все это ново, но мне очень нравится ваша система, я ее хочу понять, но дается сложновато , а банальными запросами не охота заваливать форум.

    Не всегда эти вопросы банальны. Иногда в них находишь что-то новое. Как, например, ваш вопрос про диммер по освещенности.

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



  • @denis-000:

    Подскажите пожалуйста, где я мог ошибиться?

    Вам нужно включить/выключить устройство. То есть выполнить команду.

    Блоки выполнения команд зеленого цвета:
    scen2011.jpg

    Вот видите. А вы говорите "банальные вопросы". Наша недоработка. Интуитивно не очень понятно.

    Надо будет назвать первую вкладку не "Устройства", а "Триггеры".



  • @intrahouse:

    @denis-000:

    Подскажите пожалуйста, где я мог ошибиться?

    Вам нужно включить/выключить устройство. То есть выполнить команду.

    Блоки выполнения команд зеленого цвета:

    scen2011.jpg

    Вот видите. А вы говорите "банальные вопросы". Наша недоработка. Интуитивно не очень понятно.

    Надо будет назвать первую вкладку не "Устройства", а "Триггеры".

    Как добавить на схему элементы A>B и A



  • @homa:

    Как добавить на схему элементы A>B и AНа вкладке "Операция" элемент IF



  • Что-то не получается в блок-схемах накидать сценарий, никак не придумаю логику:

    Есть два блока питания (резервирование) я знаю нагрузку на них. на активном нагрузка > 0, на неактивном =0. Нужно присылать уведомление при изменении активного БП и текущую нагрузку на них.

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



  • @Alex_Jet:

    как сделать сценарий со следующей постановкой задачи:

    Если насос/котел/кран не менял свое состояние (не включался) больше суток/недели/месяца, то включить его на 5 минут и затем выключить.

    Попытался сам реализовать подобный скрипт с "ручным" запуском (в дальнейшем нужен cron для периодического запуска сценария). Использую параметр dev.getParam('lastts'). Но вот незадача - последний раз устройство запускалось в 09:50:21, однако при запуске скрипта получаем то что он запускался 46 минут назад:

    Почему такое может быть? Ранее корреляция прослеживалась.

    Update: О…нашел - в боковом меню устройства внизу пишется время 11:48:20 - это время последнего принудительного опроса (у меня стоит интервал опроса всех каналов 1 час). Ок, раз так, но зачем при неизменном состоянии канала обновлять его lastts???

    Для того, чтобы вы видели, что данные приходят согласно правилам опроса 🙂

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

    @Alex_Jet:

    Еще один момент - комбинация Lamp1.setAuto(True) не работает, отладчик пишет:

    > 31.01 08:33:56.911 Error function TurnOffDev:True is not defined
    > 
    

    То есть нужно True обрамлять кавычками - Lamp1.setAuto('True') - надо поправить в API сценариев.

    Можно просто писать 0/1: Lamp1.setAuto(1)



  • Добрый день!

    Нарисовал сценарий, но он срабатывает при каждом изменении датчика, даже если значение не выходит за рамки. Что я делаю не так?
    scene1.JPG



  • Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.



  • @homa:

    Добрый день!

    Нарисовал сценарий, но он срабатывает при каждом изменении датчика, даже если значение не выходит за рамки. Что я делаю не так?

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



  • @artem521:

    Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так?

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

    И еще можно посмотреть как приходит информация от контроллера в отладчике плагина.
    @artem521:

    И еще не могу найти звуковое уведомление при событии устройства.

    Звуковых уведомлений пока нет



  • @artem521:

    Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.

    Возможно, нужно добавить условие при выполнении команд:

    Включать, если значение < 100 AND лампа выключена (off)

    Выключать, если значение > 100 AND лампа включена (on)



  • @intrapro:

    @artem521:

    Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.

    Возможно, нужно добавить условие при выполнении команд:

    Включать, если значение < 100 AND лампа выключена (off)

    Выключать, если значение > 100 AND лампа включена (on)

    Спасибо, буду пробовать.



  • @intrapro:

    @artem521:

    Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.

    Возможно, нужно добавить условие при выполнении команд:

    Включать, если значение < 100 AND лампа выключена (off)

    Выключать, если значение > 100 AND лампа включена (on)

    Попробовал, не чего не поменялось.

    01.02 16:03:19.058 megad1:

    01.02 16:03:19.059 megad1: localhost => 192.168.0.16 HTTP GET /sec/?pt=30&cmd=get

    01.02 16:03:19.077 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:19.078 megad1: body: 13.05

    01.02 16:03:19.079 IH: get [{"id":"30","value":"13.05"}]

    01.02 16:03:19.080 IH: set {"SENSORA1":{"aval":"13.05","err":0}}

    01.02 16:03:19.860 megad1:

    01.02 16:03:19.861 megad1: localhost => 192.168.0.16 HTTP GET /sec/?cmd=all

    01.02 16:03:19.878 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:19.879 megad1: body: ON/1;OFF;ON;ON;ON;214;ON;ON;ON;ON;255;OFF;ON;OFF;ON;ON;OFF;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;13.05;OFF;ON;ON;ON;ON;ON;ON

    01.02 16:03:19.881 IH: get [{"id":"1","value":"0"},{"id":"30","value":"13.05"}]

    01.02 16:03:19.882 IH: set {"VENT1":{"dval":"0","err":0},"SENSORA1":{"aval":"13.05","err":0}}

    01.02 16:03:20.262 megad1:

    01.02 16:03:20.263 megad1: localhost => 192.168.0.16 HTTP GET /sec/?pt=30&cmd=get

    01.02 16:03:20.284 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:20.285 megad1: body: 13.05

    01.02 16:03:20.287 IH: get [{"id":"30","value":"13.05"}]

    01.02 16:03:20.287 IH: set {"SENSORA1":{"aval":"13.05","err":0}}

    01.02 16:03:21.068 megad1:

    01.02 16:03:21.068 megad1: localhost => 192.168.0.16 HTTP GET /sec/?cmd=all

    01.02 16:03:21.090 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:21.091 megad1: body: ON/1;OFF;ON;ON;ON;208;ON;ON;ON;ON;255;OFF;ON;OFF;ON;ON;OFF;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;13.05;OFF;ON;ON;ON;ON;ON;ON

    01.02 16:03:21.092 IH: get [{"id":"1","value":"0"},{"id":"30","value":"13.05"}]

    01.02 16:03:21.093 IH: set {"VENT1":{"dval":"0","err":0},"SENSORA1":{"aval":"13.05","err":0}}

    01.02 16:03:21.470 megad1:

    01.02 16:03:21.471 megad1: localhost => 192.168.0.16 HTTP GET /sec/?pt=30&cmd=get

    01.02 16:03:21.482 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:21.483 megad1: body: 13.05

    01.02 16:03:21.483 IH: get [{"id":"30","value":"13.05"}]

    01.02 16:03:21.484 IH: set {"SENSORA1":{"aval":"13.05","err":0}}

    01.02 16:03:22.274 megad1:

    01.02 16:03:22.275 megad1: localhost => 192.168.0.16 HTTP GET /sec/?cmd=all

    01.02 16:03:22.299 megad1: localhost <= 192.168.0.16 response: statusCode=200 contentType = text/html

    01.02 16:03:22.299 megad1: body: ON/1;OFF;ON;ON;ON;208;ON;ON;ON;ON;255;OFF;ON;OFF;ON;ON;OFF;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;ON;13.05;OFF;ON;ON;ON;ON;ON;ON

    01.02 16:03:22.300 IH: get [{"id":"1","value":"0"},{"id":"30","value":"13.05"}]

    01.02 16:03:22.301 IH: set {"VENT1":{"dval":"0","err":0},"SENSORA1":{"aval":"13.05","err":0}}
    0.png



  • @homa:

    Что-то не получается в блок-схемах накидать сценарий, никак не придумаю логику:

    Есть два блока питания (резервирование) я знаю нагрузку на них. на активном нагрузка > 0, на неактивном =0. Нужно присылать уведомление при изменении активного БП и текущую нагрузку на них.

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

    Вот пример для одного блока питания:
    scenbp1.jpg
    Таймер поставил для того чтобы в сообщении передавалось напряжение с учетом переходных процессов при включении блока питания.

    Само сообщение: БП1 - включен (напряжение ${BP1.value}В)

    ${x.value} - так можно передать значение value

    Суть сценария:

    Нам нужно чтобы при включении блока питания BP1 передать сообщение об этом событии один раз. При этом нужно передать еще и напряжение. При выключении просто сообщаем один раз о выключении.

    Для такого сценария нужна информация о предыдущем состоянии блока питания.

    Так как в блок-схемах нет возможности использовать глобальные переменные, воспользуемся параметром setpoint. Будем считать, если setpoint=0, блок питания выключен. Если setpoint=1, включен.

    В итоге получаем.

    Если блок питания был выключен (setpoint=0) и включается (value>0), то через 5 сек даем сообщение о включении и устанавливаем setpoint в единицу.

    Если блок питания был включен (setpoint=1) и выключается (value=0), даем сообщение об отключении блока питания и устанавливаем setpoint в ноль.

    Выглядит это достаточно громоздко. Это пример того, что иногда лучше написать скрипт, чем строить сценарий в виде блок-схемы.

    Если посмотреть скрипт этой блок-схемы, там все намного короче:

    /** 
    * @name Контроль блоков питания  
    * @desc  
    * @version 4 
    */
    
    const BP1 = Device("BP1");
    
    startOnChange([BP1]);
    
    script({
      start() { 
        if ((BP1.value > 0) && (BP1.setpoint == 0)) {
          this.startTimer("T1",5,"onTimerT1");
        }
        if ((BP1.value == 0) && (BP1.setpoint == 1)) {
          BP1.setParam("setpoint",0);
          this.log(`БП1 - выключен`);
        }
      },
      onTimerT1() { 
         this.log(`БП1 - включен (напряжение ${BP1.value}В)`);
         BP1.setParam("setpoint",1);
      }
    })
    
    

    Прошу обновить систему до последней версии 4.4.17. Во время подготовки этого сценария найдена ошибка. Не передавалась константа в виде числа


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