Сценарии - новая версия API
-
Подскажите - хочу сделать эмуляцию показаний датчика температуры по изменению показаний реального датчика температуры. Но что-то где-то я делаю не так:
/** * @name Эмуляция изменения температуры * @desc * @version 4 */ const sen_master = Device("SensorA", "Сенсор_Мастер"); const sen_slave = Device("SensorA", "Сенсор_Ведомый"); startOnChange(sen_master.isChanged(value)); script({ start() { sen_slave.setValue(sen_master.value + 0.1); } });
И еще момент - почему в "Запуск для устройств" нельзя удалить часть устройств (чтобы они не принимали участие в сценарии)?
И еще на вашем сайте справа в дереве можно добавить ссылку на примеры скриптов с новым API?
-
Подскажите - хочу сделать эмуляцию показаний датчика температуры по изменению показаний реального датчика температуры. Но что-то где-то я делаю не так:
> /** > * @name Эмуляция изменения температуры > * @desc > * @version 4 > */ > > const sen_master = Device("SensorA", "Сенсор_Мастер"); > const sen_slave = Device("SensorA", "Сенсор_Ведомый"); > > startOnChange(sen_master.isChanged(value)); > > script({ > start() { > sen_slave.setValue(sen_master.value + 0.1); > } > }); >
Первым параметром должно быть устройство
startOnChange(sen_master, sen_master.isChanged(value));
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
И еще момент - почему в "Запуск для устройств" нельзя удалить часть устройств (чтобы они не принимали участие в сценарии)?
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
-
Первым параметром должно быть устройство
> startOnChange(sen_master, sen_master.isChanged(value)); >
Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?
-
Первым параметром должно быть устройство
> > startOnChange(sen_master, sen_master.isChanged(value)); > >
Ок, буду знать (правда value пришлось удалить, поскольку скрипты переходили в STOP после запуска и была ошибка "value is not defined"). Это только для аналоговых датчиков или для всех так?
Упс, нужны еще кавычки (имя свойства)
startOnChange(sen_master, sen_master.isChanged('value'));
И датчику нельзя напрямую присваивать значение, только через assign
this.assign(sen_slave, 'value', sen_master.value + 0.1);
Думал, что setValue сделано специально для этого. Выходит что это только для цифровых/аналоговых актюаторов?Да, это команда set для актуаторов. Смысл в том, что датчик сам себе не может значение установить.
dimmer.setValue(15) - диммер устанавливает новую яркость, все это проходит через каналы
но
this.assign(temp, 'value', 15); - сценарий (this) устанавливает датчику новую температуру принудительно, связь с железом игнорируется
Если устройство не участвует - нужно удалить строки Device. Таблица "Запуск для устройств" строится по ним
Я понимаю, что таблица строится по ним. Но чем чревато то что мы не выберем какое-то устройство?
В сценарии будет не определен объект, это приведет к ошибке сценария
-
Упс, нужны еще кавычки (имя свойства)
> startOnChange(sen_master, sen_master.isChanged('value')); >
Все равно где-то какой-то косяк! Прописал:
startOnChange(sen_master, sen_master.isChanged("value"));
Но при запуске в ошибках мне пишет - sen_master.isChanged is not a function и, соответственно, принимает состояние STOP.
-
Все равно где-то какой-то косяк! Прописал:
> 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 не работает, только внутри сценария
Подумаем, как это переделать
-
Все равно где-то какой-то косяк! Прописал:
> > 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!
4. Можно сделать сортировку сценариев "по умолчанию" по имени, пока вы придумываете механизм их сортировки?Бага по запуску сценариев по расписанию (-2 часа) - снова сработал 2 раза:
Сам сценарий простой:/** * @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 например, лампочка выключается.
В виде блок-схемы это может выглядеть так:
@denis-000:2. Если аналоговый датчик освещенности меньше «100» lux, то диммер включится на 50 %, как станет 200 lux, то свет выключится.
@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:
Подскажите пожалуйста, где я мог ошибиться?
Вам нужно включить/выключить устройство. То есть выполнить команду.
Блоки выполнения команд зеленого цвета:
Вот видите. А вы говорите "банальные вопросы". Наша недоработка. Интуитивно не очень понятно.
Надо будет назвать первую вкладку не "Устройства", а "Триггеры".
-
@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:И еще не могу найти звуковое уведомление при событии устройства.
Звуковых уведомлений пока нет