Представляем новую версию API сценариев

Начиная с версии 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())

В таблице ниже кратко показаны отличия нового синтаксиса:

Было
Стало

Основное значение устр-ва

lamp.dval

temp.aval

lamp.value

temp.value

Управление устройством

this.do(lamp, ‘on’)

lamp.on()

Управление с сохранением авто

this.do(lamp, ‘aon’)

lamp.turnOnSaveAuto()

Установить значение

this.do(dim, ‘set’, 40)

dim.setValue(40)

Проверка значения on/off

vent.dval == 1

vent.isOn()

Работа с параметрами:

Уставка — Чтение 

temp.defval

temp.setpoint

Уставка — Запись

this.do(temp, ‘defval’, 22)

temp.setSetpoint(22)

Авто — Чтение

lamp.auto

lamp.auto

Авто — Запись

this.do(lamp, ‘auto’, 1)

lamp.setAuto(1)

Блокировка — Чтение

motion.blk

motion.blk

Блокировка — Запись

this.do(motion,’ blk’, 1)

motion.setBlk(1)

Свойства — Чтение

lamp.timeOff

lamp.getParam(‘timeOff’)

Свойства — Запись

lamp.setParam(‘timeOff’, 10)

Полное описание нового API смотрите здесь: система команд

Теперь рассмотрим более подробно декларативную часть (до 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’)) .. // переключился флаг авто
}

Надеемся, что новый вариант API придется вам по душе.

Добавить комментарий

Закрыть меню