Сценарии - новая версия API
-
@intrahouse:
@denis-000:
Подскажите пожалуйста, где я мог ошибиться?
Вам нужно включить/выключить устройство. То есть выполнить команду.
Блоки выполнения команд зеленого цвета:
scen2011.jpg
Вот видите. А вы говорите "банальные вопросы". Наша недоработка. Интуитивно не очень понятно.
Надо будет назвать первую вкладку не "Устройства", а "Триггеры".
Как добавить на схему элементы A>B и A
-
Как добавить на схему элементы A>B и AНа вкладке "Операция" элемент IF
-
Что-то не получается в блок-схемах накидать сценарий, никак не придумаю логику:
Есть два блока питания (резервирование) я знаю нагрузку на них. на активном нагрузка > 0, на неактивном =0. Нужно присылать уведомление при изменении активного БП и текущую нагрузку на них.
Все сценарии, которые написал оповещают о каждом изменении нагрузки на блок питания
-
как сделать сценарий со следующей постановкой задачи:
Если насос/котел/кран не менял свое состояние (не включался) больше суток/недели/месяца, то включить его на 5 минут и затем выключить.
Попытался сам реализовать подобный скрипт с "ручным" запуском (в дальнейшем нужен cron для периодического запуска сценария). Использую параметр dev.getParam('lastts'). Но вот незадача - последний раз устройство запускалось в 09:50:21, однако при запуске скрипта получаем то что он запускался 46 минут назад:
Почему такое может быть? Ранее корреляция прослеживалась.
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 сценариев.
Можно просто писать 0/1: Lamp1.setAuto(1)
-
Добрый день!
Нарисовал сценарий, но он срабатывает при каждом изменении датчика, даже если значение не выходит за рамки. Что я делаю не так?
-
Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.
-
Добрый день!
Нарисовал сценарий, но он срабатывает при каждом изменении датчика, даже если значение не выходит за рамки. Что я делаю не так?
Добрый день, все верно, это два самостоятельных условия, Вам нужно использовать BETWEEN чтобы проверить значение между заданого диапазона.
-
Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так?
Попробуйте воспользоваться отладчиком сценария.
И еще можно посмотреть как приходит информация от контроллера в отладчике плагина.
@artem521:И еще не могу найти звуковое уведомление при событии устройства.
Звуковых уведомлений пока нет
-
Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.
Возможно, нужно добавить условие при выполнении команд:
Включать, если значение < 100 AND лампа выключена (off)
Выключать, если значение > 100 AND лампа включена (on)
-
Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 0 то лампа включается, если значение больше 100 то лампа выключается. Но проблема вот в чем, если я рукой прикрываю датчик чтобы он плавно менял значение стремясь к 0 и в итоге когда датчик увидел 0, то лапа не срабатывает, а если я резко делаю полную темноту датчику, то все отрабатывает. Подскажите, почему так? P.S. На устройстве.megad 2561 И еще не могу найти звуковое уведомление при событии устройства.
Возможно, нужно добавить условие при выполнении команд:
Включать, если значение < 100 AND лампа выключена (off)
Выключать, если значение > 100 AND лампа включена (on)
Спасибо, буду пробовать.
-
Здравствуйте. У меня другая проблема с датчиком освещенности. Сценарий такой: если значение равно 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, на неактивном =0. Нужно присылать уведомление при изменении активного БП и текущую нагрузку на них.
Все сценарии, которые написал оповещают о каждом изменении нагрузки на блок питания
Вот пример для одного блока питания:
Таймер поставил для того чтобы в сообщении передавалось напряжение с учетом переходных процессов при включении блока питания.Само сообщение: БП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. Во время подготовки этого сценария найдена ошибка. Не передавалась константа в виде числа
-
@intrahouse:
Попробовал, не чего не поменялось.
Вы поставили элемент AND, и ничего к нему не привязали.
Условие AND означает: если это=True и это=True то True, иначе False
Попробуйте так:
Если датчик освещенности больше 23 и лампа выключена, включить лампу.Если датчик освещенности меньше 1 (можно как у вас =0) и лампа включена, выключить лампу.
Обновите систему до версии 4.4.17
-
Большое спасибо. Все работает корректно.
-
Добрый день!
А все таки, есть ли способ запуска звукового файла из сценария?
Добрый день, уточните пожалуйста через звуковой выход сервера?
-
Добрый день!
Написал сценарий для тестирования выгоды перехода на трехтарифный расчет электроэнергии:
/** * @name ThreeTarif * @desc * @version 4 */ const T1 = Device("METER18"); const T2 = Device("METER17"); const T3 = Device("METER19"); const mmr = Device("METER20"); const day = Device("METER6"); const night = Device("METER5"); const pulse3t = Device("SENSOR2"); startOnChange(pulse3t); script({ Weight:0.0002, // вес импульса T1r:4.9, //свет T1 T2r:1.6, //свет T2 T3r:3.77, //свет T3 start() { const dt = new Date(); mmrbf = (t1.value-t1.getParam('uptoMonth'))*t1r+(t2.value-t2.getParam('uptoMonth'))*t2r+(t3.value-t3.getParam('uptoMonth'))*t3r; mmrbf.toFixed(2) this.assign(mmr, 'aval', mmrbf); //eesum.toFixed(2) //cwsum = (metercwv.value + metercwt.value - metercwv.getParam('uptoMonth') - metercwt.getParam('uptoMonth'))*this.cw if (dt.getHours() < 7 || dt.getHours()>=23) { // c 23:00 - 7:00 ночной тариф T2 this.assign(T2, 'aval', T2.value+this.Weight); return false; } if (dt.getHours() >= 7 || dt.getHours()<10) { // c 7:00 - 10:00 тариф T1 this.assign(T1, 'aval', T1.value+this.Weight); } if (dt.getHours() >= 10 || dt.getHours()<17) { // c 10:00 - 17:00 тариф T3 this.assign(T3, 'aval', T3.value+this.Weight); return false; } if (dt.getHours() >= 17 || dt.getHours()<21) { // c 17:00 - 21:00 тариф T1 this.assign(T1, 'aval', T1.value+this.Weight); return false; } if (dt.getHours() >= 21 || dt.getHours()<23) { // c 21:00 - 23:00 тариф T3 this.assign(T3, 'aval', T3.value+this.Weight); return false; } } });
Но он почему-то не срабатывает, отладчик пустой как будто не отрабатывает триггер "startOnChange(pulse3t)" хотя в соседнем сценарии по этому триггеру все работает
-
Добрый день!
Есть простейшее расписание - включить на закате две лампочки, но включается только одна. Причем включается та, которая будет первой в списке)) Пересоздать задачу не помогает, но в журнале отображается запись "Команда on Расписание"
-
Добрый день!
Написал сценарий для тестирования выгоды перехода на трехтарифный расчет электроэнергии:
> /** > * @name ThreeTarif > * @desc > * @version 4 > */ > > const T1 = Device("METER18"); > const T2 = Device("METER17"); > const T3 = Device("METER19"); > const mmr = Device("METER20"); > const day = Device("METER6"); > const night = Device("METER5"); > const pulse3t = Device("SENSOR2"); > > startOnChange(pulse3t); > > script({ > Weight:0.0002, // вес импульса > T1r:4.9, //свет T1 > T2r:1.6, //свет T2 > T3r:3.77, //свет T3 > start() { > const dt = new Date(); > mmrbf = (t1.value-t1.getParam('uptoMonth'))*t1r+(t2.value-t2.getParam('uptoMonth'))*t2r+(t3.value-t3.getParam('uptoMonth'))*t3r; > mmrbf.toFixed(2) > this.assign(mmr, 'aval', mmrbf); > //eesum.toFixed(2) > //cwsum = (metercwv.value + metercwt.value - metercwv.getParam('uptoMonth') - metercwt.getParam('uptoMonth'))*this.cw > if (dt.getHours() < 7 || dt.getHours()>=23) { // c 23:00 - 7:00 ночной тариф T2 > this.assign(T2, 'aval', T2.value+this.Weight); > return false; > } > if (dt.getHours() >= 7 || dt.getHours()<10) { // c 7:00 - 10:00 тариф T1 > this.assign(T1, 'aval', T1.value+this.Weight); > } > if (dt.getHours() >= 10 || dt.getHours()<17) { // c 10:00 - 17:00 тариф T3 > this.assign(T3, 'aval', T3.value+this.Weight); > return false; > } > if (dt.getHours() >= 17 || dt.getHours()<21) { // c 17:00 - 21:00 тариф T1 > this.assign(T1, 'aval', T1.value+this.Weight); > return false; > } > if (dt.getHours() >= 21 || dt.getHours()<23) { // c 21:00 - 23:00 тариф T3 > this.assign(T3, 'aval', T3.value+this.Weight); > return false; > } > > > > } > }); >
Но он почему-то не срабатывает, отладчик пустой как будто не отрабатывает триггер "startOnChange(pulse3t)" хотя в соседнем сценарии по этому триггеру все работает
PS разобрался, к числовым константам нужно обращаться как this.t1r
-
Подскажите по расписанию мультисценарий отработает по всем группам устройств?
Кстати, обратил внимание, что если меняешь "Название" сценария, то его имя в Расписаниях остается старое. Вероятно поменяется только после перезагрузки iH?
-
Добрый день!
Есть простейшее расписание - включить на закате две лампочки, но включается только одна. Причем включается та, которая будет первой в списке)) Пересоздать задачу не помогает, но в журнале отображается запись "Команда on Расписание"
Спасибо. Проверим, пофиксим