Skip to content

Scenarios API

nimargolis edited this page May 19, 2018 · 19 revisions

Встроенные методы объекта script

  1. Команды управления

  2. Команды логирования и информирования

  3. Таймеры

  4. Слушатели событий

  5. Команды завершения сценария

1. Команды управления

Команда do - управление одним устройством.

 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);

Команда doAll - управление группой устройств.

 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);

Команда assign - прямое присваивание значений свойствам.

При вызове 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); // А так можно

2. Логирование и информирование

Команда log

Выполняет запись в журнал системы

  this.log('текст сообщения');

Команда info

Запускает отправку сообщения по e-mail, sms и другим каналам.

Для фактической отправки в системе должен быть установлен соответствующий плагин

  this.info('<канал связи>','<получатель>','текст сообщения');

В качестве получателя м. б. логин пользователя или название группы пользователей

  this.info('email','admin', 'В помещении '+sensor.room_name + ' сработал '+sensor.name+'!' );
  this.info('sms','OWNER', 'Протечка в помещении '+sensor.room_name + '! Клапан воды перекрыт.' );

3. Таймеры

Сценарий может запускать при необходимости любое количество таймеров. Каждый таймер именуется.

После создания хотя бы одного таймера у скрипта появляется свойство-объект this.timer, которое будет содержать имена таймеров и их состояния: сброшен ('off'), запущен ('on'), закончил ('done').

Состояния таймеров можно использовать в условных выражениях:

if (this.timer.T1 == 'on')

Команда startTimer

Создает и запускает таймер. Таймер переходит в состояние "on". Если таймер досчитает, выполнится функция, которая указана в последнем аргументе

this.startTimer(<имя таймера>, <время в сек>, 'имя функции');

Для имени таймера, как и для других переменных, нужно использовать строку латинских символов и цифр без пробелов. Регистр символов имеет значение. Первый символ не д.б. цифрой.

Время указывается в секундах. Можно задать время с точностью до одного знака после запятой.

Например, запустим таймер T1, чтобы через 5.5 сек будет запущена функция turnAllOff

this.startTimer('T1', 5.5, 'turnAllOff');

Если таймер с таким именем уже существует, то он будет взведен заново (даже если уже считает).

Команда stopTimer

Снять запущенный таймер. Таймер переходит в состояние off

this.stopTimer(<имя таймера>);

Используется, только если надо прервать (сбросить) запущенный таймер.

При завершении сценария командой exit запущенные таймеры сбрасывать не нужно, они удаляются автоматически.

Команда addTimer

Создает, но пока не запускает таймер. Таймер остается в состоянии "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();
  }
};

4. Слушатели событий

Если сценарий запущен и остался активным, он может слушать события устройств и выполнять дальнейшие действия в зависимости от текущей ситуации.

В примере выше сценарий:

  1. Запускается по событию датчика движения (если есть движение) и при этом лампа не горит

  2. Включает лампу и остается активным, чтобы выключить ее, когда движение прекратится Для этого регистрируются слушатели событий датчика движения и лампы

  3. По событиям датчика движения устанавливается или сбрасывается таймер

  4. По событию лампы сценарий завершается, если лампу выключили помимо сценария

Команда addlistener

Слушатели событий (вызвать функцию по событию устройства при запущенном сценарии)

addListener(<устройство>, <строка-имя функции>) - зарегистрировать слушателя

Команда removelistener

5. Завершение сценария

Команда exit

Команда block