Начиная с версии 4.4.5 наряду со старым вариантом работает новая версия API сценариев.
В новой версии API мы постарались упростить синтаксис и расширить функционал.
Еще раз подчеркнем — все действующие сценарии продолжат работать как есть.
Но при добавлении нового сценария вам предлагается уже новый шаблон:
/** * @name * @desc * @version 4 */ const motion = Device("MOTION1"); const lamp = Device("LAMP1"); startOnChange(motion); script({ start() { if (motion.isOn()) lamp.on(); if (motion.isOff()) lamp.off(); } });
В разделе комментариев добавлен параметр — * @version 4
Это как раз и означает, что этот сценарий использует новый синтаксис и новое API.
Главное отличие — теперь устройства имеют не только свойства, но и свои методы.
Если в старом варианте команда отдавалась сценарию: this.do(lamp, ‘on’), то теперь команда отдается напрямую устройству: lamp.on();
Также наверно вы заметили, что вместо motion.dval написано motion.value
Теперь, чтобы обратиться к основному значению устройства, пишем просто device.value
Итак, temp.aval превратилось в temp.value, lamp.dval стало lamp.value
Другой вариант проверки значения — использовать методы isOn() и isOff()
if (motion.value == 1) эквивалентно if (motion.isOn())
Рассмотрим более подробно декларативную часть (до script).
Все что сязано с Device не изменилось:
можно использовать конкретное устройство (LAMP1) или класс для мультисценария (ActorD),
можно добавлять параметры.
Мы отказались от конструкции DeviceT для объявления того, что устройство является триггером.
Вместо этого нужно явно объявить, что сценарий запускается при изменении свойств устройства:
startOnChange(motion);
Как и раньше, у сценария может быть несколько триггеров, тогда это будет массив:
startOnChange([motion1, motion2, …]);
Функция check в новом варианте не используется, условное выражение можно добавить в startOnChange
как второй параметр:
Например:
startOnChange(hum, (hum.value > hum.setpoint)&&vent.isOff() || (hum.value < hum.setpoint)&&vent.isOn());
буквально означает — запусти сценарий при изменении датчика влажности и если при этом влажность повышена
и вентилятор выключен или влажность нормализовалась и вентилятор включен.
Последнее небольшое изменение декларативной части — оформление скрипта:
Вместо конструкции const script = {…} используется вызов script({…})
Новые возможности
1. Объект global
Сценарий может создать «глобальные переменные», к которым можно обращаться из других сценариев
Для этого используется объект global, он доступен в любом сценарии
global.set(name, value) — записать значение
global.get(name) — получить значение
global.remove(name) — удалить переменную
Например,
global.set(‘Armed’, true); // Поставили на охрану
В другом сценарии:
if (global.get(‘Armed’)) {.. }
или проверка при запуске сценария:
startOnChange(motion, global.get(‘Armed’))
Таблица всех глобальных переменных доступна для просмотра и редактирования в PM в разделе Сценарии — Общие переменные (global)
2. Методы устройства save(), restore()
Устройство может временно сохранить какой-то свой параметр, затем восстановить его значение:
device.save(имя параметра);
device.restore(имя параметра);
Например, при переключении в режим «Уборка» блокируются датчики протечки, затем нужно восстановить значение:
leak1.save(‘blk’);
leak1.setBlk(1);
…
leak1.restore(‘blk’);
3. Метод сценария isChanged()
Метод позволяет определить, явилось ли устройство триггером сценария при текущем запуске
this.isChanged(device)
Возвращает true, если запуск сценария произошел по событию устройства device
Например, сценарий запускается по событиям двух датчиков
if (this.isChanged(motion1)) ….
if (this.isChanged(motion2)) ….
Также бывает полезно узнать, какое конкретно свойство изменилось.
Для этого нужно передать имя свойства в качестве второго параметра.
Например, изменилась температура датчика или уставка:
if (this.isChanged(temp, ‘value’)) …..
if (this.isChanged(temp, ‘setpoint’)) ….
Если this.isChanged() находится в коде слушателя, то это будет изменение, которое привело к вызову слушателя:
start() {
this.addListener(lamp, ‘onLamp’);
…
},
onLamp() {
if (this.isChanged(lamp,’value’)) … // переключилась лампа
if (this.isChanged(lamp,’auto’)) .. // переключился флаг авто
}