Сценарии - новая версия API
-
Подскажите, у меня в старой версии сценария рассчитывались уставки и проверялось условие перехода в 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? Ну или ваш вариант.
-
В свойствах property есть значение, состояние, ошибка. Уставка (как в примере) не отображается.
А какое у Вас устройство?
Уставка есть только у аналоговых устройств, причем в настройке устройства должна стоять галочка "Есть уставка (дефолтное значение)"
-
Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?
Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно
-
Понятно теперь. У меня счетчик, хочу написать сценарий отключения клапана воды по достижению на счетчике установленного значения, потом у счетчика должны обнулиться показания и так каждый цикл работы сценария. Лучше конечно, что бы был обратный отсчет 100,99,98…0 литров. Может подскажете как реализовать?
Порог можно добавить сценарием как дополнительное свойство, оно в списке появится. А насчет обратного отсчета - не совсем понятно
По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее
То есть счетчик считает в обе стороны ? Или их два?
-
По поводу обратного отсчета. Допустим задан порог 100 литров. В иконке 100 литров, когда началось потребление значение пошло на уменьшение, дошло до 0, клапан закрылся. Но это наверное лишнее
То есть счетчик считает в обе стороны ? Или их два?
Счётчик один, режим реверсивного отсчёта.
Создайте второй виртуальный счетчик, и сценарий meter2=100-meter1 когда достигает нуля, обнуляем первый и присваиваем 100 второму
-
Коллеги! Всех с праздником Великой победы!
Intrapro, intrahouse, помогите разобраться как правильно использовать startOnChange в качестве функции с расчетом уставок и проверкой разных значений. Мой предыдущий пост тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5446&start=270#p10166
-
Коллеги! Всех с праздником Великой победы!
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+ "' неисправен!"); } }, )
-
Подскажите, у меня в старой версии сценария рассчитывались уставки и проверялось условие перехода в 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 оставить как есть
К сожалению, в документации это толком не прописано. Исправим это упущение
-
Прошу помощи: есть zigbee кнопка, работает по mqtt, как датчик аналоговый, при одиночном нажатии приходит значение "single". Как сделать сценарий чтобы при нажатии выполнялась команда toggle().
const SENSORA2_1 = Device("SENSORA2_1");
const SOCKET1_2 = Device("SOCKET1_2");
startOnChange([SENSORA2_1])
script({
start() {
if (SENSORA2_1.value == "single") {
SOCKET1_2.toggle();
}
}
});
При таком варианте срабатывает только один раз ,так как каждый раз при нажатии проходит одно и тоже значение и тригер не срабатывает :
12.05 23:47:56.860 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
12.05 23:47:58.525 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
12.05 23:48:00.521 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
-
Прошу помощи: есть zigbee кнопка, работает по mqtt, как датчик аналоговый, при одиночном нажатии приходит значение "single". Как сделать сценарий чтобы при нажатии выполнялась команда toggle().
const SENSORA2_1 = Device("SENSORA2_1");
const SOCKET1_2 = Device("SOCKET1_2");
startOnChange([SENSORA2_1])
script({
start() {
if (SENSORA2_1.value == "single") {
SOCKET1_2.toggle();
}
}
});
При таком варианте срабатывает только один раз ,так как каждый раз при нажатии проходит одно и тоже значение и тригер не срабатывает :
12.05 23:47:56.860 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
12.05 23:47:58.525 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
12.05 23:48:00.521 IH: set {"SENSORA2_1":{"aval":"single","err":0}}
Можно сбросить значение после отработки. Или присвоить например "none".
Чтобы присвоить датчику значение, нужно использовать this.assign
start() { if (SENSORA2_1.value == "single") { SOCKET1_2.toggle(); this.assign(SENSORA2_1, "value","none" ); } }
-
this.assign, спасибо помогло, я пытался через set
-
Коллеги! Пытаюсь решить простую задачу. Из сценария делаю heater.setAuto('false'), однако режим авто у актюатора таким образом не выключается:
При этом если выключить АВТО вручную из меню актюатора, а потом включить с помощью сценария heater.setAuto('true'), то он включается. Прошу проверить возможность выключения АВТО из сценариев и подправить документацию в этом месте - https://ih-systems.com/ru/command_list/#1.3.3
-
Коллеги! Пытаюсь решить простую задачу. Из сценария делаю heater.setAuto('false'), однако режим авто у актюатора таким образом не выключается:
SetAutoFalse.jpg
При этом если выключить АВТО вручную из меню актюатора, а потом включить с помощью сценария heater.setAuto('true'), то он включается. Прошу проверить возможность выключения АВТО из сценариев и подправить документацию в этом месте - https://ih-systems.com/ru/command_list/#1.3.3
Проверим, но в данном случае причина в том, что для true/false кавычки не нужны.
В JS определены примитивные значения true и false:
heater.setAuto(true)/ heater.setAuto(false) , в принципе можно и так: heater.setAuto(1)/heater.setAuto(0)
Если же брать в кавычки - получается непустая строка, и значение 'false' вычисляется как true
-
Коллеги! Пытаюсь решить простую задачу. Из сценария делаю heater.setAuto('false'), однако режим авто у актюатора таким образом не выключается:
SetAutoFalse.jpg
При этом если выключить АВТО вручную из меню актюатора, а потом включить с помощью сценария heater.setAuto('true'), то он включается. Прошу проверить возможность выключения АВТО из сценариев и подправить документацию в этом месте - https://ih-systems.com/ru/command_list/#1.3.3
Проверим, но в данном случае причина в том, что для true/false кавычки не нужны.
В JS определены примитивные значения true и false:
heater.setAuto(true)/ heater.setAuto(false) , в принципе можно и так: heater.setAuto(1)/heater.setAuto(0)
Если же брать в кавычки - получается непустая строка, и значение 'false' вычисляется как true
Да, вы правы! Но с False/True нормально не работает - при пробном запуске говорит что-то типа "True is not defined"
-
Да, вы правы! Но с False/True нормально не работает - при пробном запуске говорит что-то типа "True is not defined"
Действительно, ошибочка у нас в документации
-
zigbee кнопка,обнаружилась проблема : переключатель выдает токой JSON value = ' {"battery":100,"voltage":3035,"linkquality":65,"click":"single"}'
меня интересует больше всего значение click, ставлю формулу расчета : JSON.parse(value).click и получаю значение single, дальше под это пишу скрипт и всё фурычит.
Но есть проблема : раз в час устройстро когда его не трогают выдает JSON : {"battery":100,"voltage":3035,"linkquality":65}, без параметра click (это ответ на нажатие кнопки ), и моя формула выдает неопределенность undefined и всё подвисает.
Как сделать чтобы если click нету , то пусть его значение будет none, но у нас формула в одной строке… Что то типа !data.click ? 'none' : data.click должно быть , но не работает .
-
zigbee кнопка,обнаружилась проблема : переключатель выдает токой JSON value = ' {"battery":100,"voltage":3035,"linkquality":65,"click":"single"}'
меня интересует больше всего значение click, ставлю формулу расчета : JSON.parse(value).click и получаю значение single, дальше под это пишу скрипт и всё фурычит.
Но есть проблема : раз в час устройстро когда его не трогают выдает JSON : {"battery":100,"voltage":3035,"linkquality":65}, без параметра click (это ответ на нажатие кнопки ), и моя формула выдает неопределенность undefined и всё подвисает.
Как сделать чтобы если click нету , то пусть его значение будет none, но у нас формула в одной строке… Что то типа !data.click ? 'none' : data.click должно быть , но не работает .
Добрый день!
Вы можете использовать тернарный оператор в формуле расчета, например, так:
(value && value.indexOf("click")>0) ? JSON.parse(value).click : 'none'
-
Спасибо, получилось.
-
Коллеги! Есть какая-то бага в pm - если переходишь в раздел "Сценарии" -> "Рабочие сценарии", выбираешь нужный и пытаешься открыть нижнее окно отладчика, то ничего не происходит! Более того, больше ничего не работает (нельзя перейти в "Сценарии", например) в этой вкладке. Решается переходом в другие разделы и возвратом в "Сценарии"…нижнее окно в "Рабочие сценарии" можно открыть только путем танцем с бубном (после перехода в раздел "Сценарии" зайти в "Сценарии", открыть нижнее окно и потом перейти в "Рабочие сценарии").
-
Коллеги! Есть какая-то бага в pm - если переходишь в раздел "Сценарии" -> "Рабочие сценарии", выбираешь нужный и пытаешься открыть нижнее окно отладчика, то ничего не происходит! Более того, больше ничего не работает (нельзя перейти в "Сценарии", например) в этой вкладке. Решается переходом в другие разделы и возвратом в "Сценарии"…нижнее окно в "Рабочие сценарии" можно открыть только путем танцем с бубном (после перехода в раздел "Сценарии" зайти в "Сценарии", открыть нижнее окно и потом перейти в "Рабочие сценарии").
Да, действительно, баг там есть Просто пока руки не дошли