-
Notifications
You must be signed in to change notification settings - Fork 1
Scenarios API
-
Команды управления
-
Команды логирования и информирования
-
Таймеры
-
Слушатели событий
-
Команды завершения сценария
this.do(<устройство>, <строка-команда или свойство устройства>[,<значение>])
Первый параметр - устройство - должно быть объявлено как Device в декларативной части сценария
const lamp = Device("ActorD", "Светильник");
const script = {
start() {
this.do(lamp, "on");
}
}
Второй параметр - команда - зависит от класса устройства. Дискретные актуаторы имеют команды 'on', 'off', 'toggle'
this.do(lamp, "toggle");
Аналоговые актуаторы дополнительно имеют команду 'set' для установки значения
this.do(dimmer, "set", 25);
С помощью команды do можно также установить дополнительные свойства устройства (если свойство не read-only).
Например, установить флаг АВТО для лампы и разблокировать датчик:
this.do(lamp, "auto", 1);
this.do(motion, "blk", 0);
this.doAll({ объект - фильтр}, <строка-команда>[,<значение>])
Отличается от команды do первым параметром - вместо устройства используется объект - фильтр:
Например, отключить все устройства подсистемы освещения (subs:1) на 1 этаже (place:1)
this.doAll({ place:1, subs:1}, "off");
Команда будет выполнена для тех устройств, которые ее могут выполнить. Если в подсистему освещения включены, например, датчики освещенности, для них команда будет проигнорирована.
Атрибуты для фильтра - это свойства, которыми обладают устройства:
- place - уровень
- room - помещение (зона)
- subs - подсистема
- cl - класс
- type - тип
- unit - плагин, с которым связано устройство
Значением атрибута для фильтра м.б. строка, состоящая из набора значений.
Например, блокировать все датчики подсистемы охраны в помещениях 101,102,103:
this.doAll({ room:'101,102,103', subs:'3'}, "blk", 1);
При вызове do, doAll команды передаются плагину. Если устройство не может выполнить команду, она игнорируется.
Например, нельзя с помощью do включить датчик (SensorD) или установить значение для аналогового датчика. Также нельзя напрямую установить основное значение состояния dval (aval) для актуаторов.
То есть, нельзя написать this.do(lamp, "dval", 1);
Нужно выполнить команду "on": this.do(lamp, "on");
. Плагин получит команду, отработает ее, пришлет реальное состояние, и как результат dval переключится в 1.
Но иногда (в целях отладки или для виртуальных устройств) бывает нужно прямое присваивание. В этом случае применяется команда assign. Эта команда присваивает значение напрямую без связи с плагином
Нужно (зачем-то) присвоить датчику значение:
this.do(sensor, "on"); // Так не работает
this.do(sensor, "dval", 1); // Так тоже не работает
this.assign(sensor, "dval", 1); // А так можно
Выполняет запись в журнал системы
this.log('текст сообщения');
Запускает отправку сообщения по e-mail, sms и другим каналам.
Для фактической отправки в системе должен быть установлен соответствующий плагин
this.info('<канал связи>','<получатель>','текст сообщения');
В качестве получателя м. б. логин пользователя или название группы пользователей
this.info('email','admin', 'В помещении '+sensor.room_name + ' сработал '+sensor.name+'!' );
this.info('sms','OWNER', 'Протечка в помещении '+sensor.room_name + '! Клапан воды перекрыт.' );
Сценарий может запускать при необходимости любое количество таймеров. Каждый таймер именуется.
После создания хотя бы одного таймера у скрипта появляется свойство-объект this.timer, которое будет содержать имена таймеров и их состояния: сброшен ('off'), запущен ('on'), закончил ('done').
Состояния таймеров можно использовать в условных выражениях:
if (this.timer.T1 == 'on')
Создает и запускает таймер. Таймер переходит в состояние "on". Если таймер досчитает, выполнится функция, которая указана в последнем аргументе
this.startTimer(<имя таймера>, <время в сек>, 'имя функции');
Для имени таймера, как и для других переменных, нужно использовать строку латинских символов и цифр без пробелов. Регистр символов имеет значение. Первый символ не д.б. цифрой.
Время указывается в секундах. Можно задать время с точностью до одного знака после запятой.
Например, запустим таймер T1, чтобы через 5.5 сек будет запущена функция turnAllOff
this.startTimer('T1', 5.5, 'turnAllOff');
Если таймер с таким именем уже существует, то он будет взведен заново (даже если уже считает).
Снять запущенный таймер. Таймер переходит в состояние off
this.stopTimer(<имя таймера>);
Используется, только если надо прервать (сбросить) запущенный таймер.
При завершении сценария командой exit запущенные таймеры сбрасывать не нужно, они удаляются автоматически.
Создает, но пока не запускает таймер. Таймер остается в состоянии "off". Используется, если таймер будет использоваться в условном выражении до выполнения команды startTimer
Пример освещения по движению: включить свет по движению и выключить через x сек после прекращения движения. Но если движение возобновилось, то свет выключаться не должен.
const lamp = Device("ActorD", "Светильник");
const motion = Device("SensorD", "Датчик движения");
const script = {
check() {
return (motion.dval && !lamp.dval);
},
start() {
this.addTimer("T1"); // Таймер нужно объявить, т к он участвует в функции onMotion
this.do(lamp, "on");
// следим за датчиком движения и светильником
this.addListener(motion, "onMotion");
this.addListener(lamp, "onLamp");
},
onMotion() {
// Если движение прекратилось - взводим таймер
if (!motion.dval && this.timer.T1 == "off") {
this.startTimer("T1", 30, "turnOff");
}
// Если движение возобновилось - сбрасываем таймер
if (motion.dval && this.timer.T1 == 'on') {
this.stopTimer('T1');
}
},
onLamp() {
// Светильник кто-то выключил - выходим
if (!lamp.dval) this.exit();
},
turnOff() {
// отключаем и выходим
this.do(lamp, "off");
this.exit();
}
};
Если сценарий запущен и остался активным, он может слушать события устройств и выполнять дальнейшие действия в зависимости от текущей ситуации.
В примере выше сценарий:
-
Запускается по событию датчика движения (если есть движение) и при этом лампа не горит
-
Включает лампу и остается активным, чтобы выключить ее, когда движение прекратится Для этого регистрируются слушатели событий датчика движения и лампы
-
По событиям датчика движения устанавливается или сбрасывается таймер
-
По событию лампы сценарий завершается, если лампу выключили помимо сценария
Слушатели событий (вызвать функцию по событию устройства при запущенном сценарии)
addListener(<устройство>, <строка-имя функции>) - зарегистрировать слушателя