Освещение

Управление светильниками по датчикам движения и датчикам открытия двери с учетом или без учета освещенности.

Свет по датчику движения

Событие:
— Сработка датчика движения

Выполнить:
— Включить свет
— Выключить свет через 3 минуты

/** 
* @name Свет по датчику движения (простой) 
* @desc Включает светильник по датчику движения, отключает через 3 мин 
* @version 4
*/

const lamp = Device("ActorD", "Светильник");
const motion = Device("SensorD", "Датчик движения");  

// Запустим сценарий при сработке датчика движения, если светильник не горит 
startOnChange([motion], motion.isOn() && lamp.isOff());

script ({

    start() {
      lamp.on();
      // взводим таймер, чтобы отключить 
      this.startTimer("T1", 180, "turnOff");       
    },
     
    // Функция, которая сработает, когда таймер досчитает - отключаем и выходим
    turnOff() {
      lamp.off();
      // this.exit();  Эту команду можно не ставить, сценарий и сам завершится
    }
});    

Комментарий

Это простой сценарий. Время отключения светильника задано в тексте скрипта. И, соответственно, нет возможности менять это время конечным пользователем системы в процессе эксплуатации.

Свет по датчику движения с настройкой времени отключения

Событие:
— Сработка датчика движения

Выполнить:
— Включить свет
— Выключить свет через время

Дополнительные условия:
1. Дать возможность задавать время отключения в пользовательском интерфейсе в параметрах светильника.

/** 
* @name Свет по датчику движения
* @desc Включает светильник по датчику движения, отключает при отсутствии движения в течение заданного времени
* Время задается параметром timeOff и доступно в UserInterface
* @version 4
*/

const lamp = Device("ActorD", "Светильник", [
  {"name":"timeOff", "note":"Светильник горит без движения, сек", "type":"number", "val":5}
  ]); 
const motion = Device("SensorD", "Датчик движения");  

// Запустим сценарий если сработал датчик движения, а светильник не горит 
// ИЛИ если движение прекратилось, а светильник горит 

startOnChange([motion], motion.isOn() && lamp.isOff() || motion.isOff() && lamp.isOn());

script ({

    start() {
        this.addTimer("T1"); // Таймер нужно объявить, т.к. он участвует в функции onMotion
         
        if (motion.isOn()) {
          lamp.on();
        } else {
          // движения нет - взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");       
        }
        // В любом случае следим за датчиком движения и светильником
        this.addListener(motion, "onMotion");
        this.addListener(lamp, "onLamp");
    },
    
    onMotion() {
       // Если движение прекратилось - взводим таймер, если еще не взведен
      if ( motion.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.getParam("timeOff"), "turnOff"); 
      }  
        
       // Если движение возобновилось - сбрасываем таймер
      if (motion.isOn())  {
        this.stopTimer("T1");
      }  
    },
    
     onLamp() {
      // Светильник выключили другим способом - выходим
       if (lamp.isOff()) this.exit();
     },
     
    // Функция, которая сработает, когда таймер досчитает (нет движения в течение
    // заданного времени) - отключаем и выходим
    turnOff() {
      lamp.off();
      this.exit(); // Здесь команда exit нужна, так как сценарий имеет активных слушателей
                   // и сам не завершится
    }
});

Свет по датчику движения с учетом аналогового датчика освещенности

Включает светильник по датчику движения с учетом освещенности, отключает при отсутствии движения в течение заданного времени

Событие:
— Сработка датчика движения

Выполнить:
— Включить свет
— Выключить свет через время, заданное в параметрах светильника

Дополнительные условия:
1. Учитывать освещенность
2. Задавать время отключения в пользовательском интерфейсе в параметрах светильника.
3. Задавать порог освещенности в пользовательском интерфейсе в параметрах светильника.

/** 
* @name Свет по датчику движения с учетом аналогового датчика освещенности 
* @desc Включает светильник по датчику движения, отключает при отсутствии движения в течение заданного времени.
*       Время задается параметром timeOff и доступно в UserInterface
*       Включение происходит при значении освещенности ниже или равной пороговой
*       Порог освещенности задается параметром light_threshold
* @version 4
*/

const lamp = Device("ActorD", "Светильник", [
  {"name":"timeOff", "note":"Светильник горит без движения, сек", "type":"number", "val":5},
  {"name":"light_threshold", "note":"Порог освещенности для включения", "type":"number", "val":20}
  ]); 
  
const motion = Device("SensorD", "Датчик движения");  
const lightSensor = Device("SensorA", "Датчик освещенности (аналоговый)"); 

// Запустим сценарий при сработке датчика движения, если светильник не горит и освещенность ниже порога
// ИЛИ если движение прекратилось, а светильник горит 
startOnChange([motion], motion.isOn() && lamp.isOff() && lightSensor.value <= lamp.getParam("light_threshold") || motion.isOff() && lamp.isOn());

script ({    
    start() {
        this.addTimer("T1");  
         
       if (motion.isOn()) {
          lamp.on();
        } else {
          // движения нет - взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");       
        }
        // В любом случае следим за датчиком движения и светильником
        this.addListener(motion, "onMotion");
        this.addListener(lamp, "onLamp");
    },
    
    onMotion() {
       // Если движение прекратилось - взводим таймер
      if (motion.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");
      }  
        
       // Если движение возобновилось - сбрасываем таймер
      if (motion.isOn())  {
        this.stopTimer('T1');
      }  
    },
    
    onLamp() {
      // Светильник выключили другим способом - выходим
       if (lamp.isOff()) this.exit();
     },
     
    // Функция, которая сработает, когда таймер досчитает (нет движения в течение заданного 
    // времени) - отключаем и выходим
    turnOff() {
      lamp.off();
      this.exit();
    }
});

Свет по датчикам открытия двери

Свет по двум датчикам открытия с учетом дискретного датчика освещенности.

Событие:
— Сработка любого датчика открытия двери

Выполнить:
— Включить свет
— Выключить свет через заданное время

Дополнительные условия:
1. Учитывать освещенность
2. Задавать время отключения в пользовательском интерфейсе в параметрах светильника.
3. Задавать порог освещенности в пользовательском интерфейсе в параметрах светильника.

/** 
* @name Свет по двум датчикам открытия с учетом дискретного датчика освещенности  
* @desc Лампа включается при сработке любого датчика открытия с учетом освещенности: 1 - темно, 0 - светло
* Выключается через заданное время после закрытия или если стало светло
* @version 4
*/

const lamp = Device("ActorD", "Светильник", [
  {"name":"timeOffgerkon", "note":"Светильник горит без движения, сек", "type":"number", "val":5}
  ]); 
  
const sensor1 = Device("SensorD", "Датчик открытия 1");  
const sensor2 = Device("SensorD", "Датчик открытия 2");  
const darkness = Device("SensorD", "Датчик освещенности (дискретный)"); 

// Запустим сценарий при сработке любого датчика открытия, если светильник не горит и темно
// ИЛИ если стало светло, а светильник горит 
startOnChange([sensor1,sensor2,darkness], lamp.isOff() && darkness.isOn() && (sensor1.isOn() || sensor2.isOn()) || lamp.isOn() && darkness.isOff());

script ({
    start() {
        this.addTimer("T1");  
        if (sensor1.isOn() || sensor2.isOn()) {
          lamp.on();
        } else {
          // взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.getParam("timeOffgerkon"), "turnOff");       
        }

        // В любом случае следим за датчиками и светильником
        this.addListener(sensor1, "onGerkon");
        this.addListener(sensor2, "onGerkon");
        this.addListener(darkness, "onDarkness"); 
        this.addListener(lamp, "onLamp");
    },
    
    onGerkon() {
       // Если оба закрыты - взводим таймер
      if (sensor1.isOff() && sensor2.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.getParam("timeOffgerkon"), "turnOff");
      }  
        
       // Если опять открыли- сбрасываем таймер
      if (sensor1.isOn() || sensor2.isOn())   {
        this.stopTimer("T1");
      }  
    },
    
    onLamp() {
      // Светильник выключили другим способом - просто выходим
       if (lamp.isOff()) this.exit();
    },
     
    onDarkness() {
      // Стало светло
       if (darkness.isOff()) this.turnOff(); 
    },
     
    turnOff() {
      // Сюда попадаем если все закрыто в течение заданного времени или стало светло - отключаем и выходим
      lamp.off();
      this.exit();
    }
});

Свет по датчику движения с учетом автоматического режима (Авто)

Включает светильник по датчику движения, отключает при отсутствии движения в течение заданного времени

Событие:
— Сработка датчика движения

Выполнить:
— Включить свет
— Выключить свет через время, заданное в параметрах светильника

Дополнительные условия:
1. Дать возможность пользователю самостоятельно включать/выключать автоматический режим работы светильника по датчику движения.

/** 
* @name Свет по датчику движения АВТО 
* @desc Включает светильник по датчику движения, отключает при отсутствии движения в течение заданного времени 
* Сценарий работает, если для устройства включен флаг АВТО
* Если светильник переключили вручную, система сбрасывает АВТО (не зависимо от сценария)
* Флаг АВТО будет восстановлен через заданное время, если это задано в параметрах устройства 
* Сам сценарий должен использовать команды переключения, которые сохраняют АВТО (turnOnSaveAuto)
* @version 4
*/

const lamp = Device("ActorD", "Светильник", [
  {"name":"timeOff", "note":"Светильник горит без движения, сек", "type":"number", "val":5}
  ]); 
const motion = Device("SensorD", "Датчик движения");  

// Запустим сценарий при сработке датчика движения, если светильник не горит 
// ИЛИ если движение прекратилось, а светильник горит 
// При этом флаг АВТО должен быть установлен! Если флаг сброшен - сценарий не работает
// Чтобы при переключении флага auto сценарий сразу начинал работать, включим лампу в триггеры

startOnChange([motion,lamp], lamp.auto && (motion.isOn() && lamp.isOff() || motion.isOff() && lamp.isOn()));

script({
    start() {
        this.addTimer("T1"); // Таймер нужно объявить, т.к. он участвует в функции onMotion
         
        if (motion.isOn()) {
          lamp.turnOnSaveAuto(); // Если просто дать команду on - АВТО будет сброшен.
                                // Сейчас мы хотим сохранить АВТО  
        } else {
          // движения нет - взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");       
        }
        // В любом случае следим за датчиком движения и светильником
        this.addListener(motion, "onMotion");
        this.addListener(lamp, "onLamp");
    },
    
    onMotion() {
       // Если движение прекратилось - взводим таймер
      if (motion.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");
      }  
        
       // Если движение возобновилось - сбрасываем таймер
      if (motion.isOn() )  {
        this.stopTimer("T1");
      }  
    },
    
     onLamp() {
      // Светильник выключили другим способом или сбросили флаг Авто - выходим
       if (lamp.isOff() || !lamp.auto) this.exit();
     },
     
    // Функция, которая сработает, когда таймер досчитает (нет движения в течение
    // заданного времени) - отключаем и выходим
    turnOff() {
      lamp.turnOffSaveAuto();
      this.exit();
    }
});

Комментарий

Все актуаторы (в том числе светильники) могут иметь «Автоматический режим»:

Этот режим (Авто) отображается в пользовательском интерфейсе специальным индикатором в левом нижнем углу. 

Для включения/выключения автоматического режима необходимо долгим нажатием мышкой на устройстве вызвать окно свойств и на вкладке «Параметры» включить/выключить автоматический режим:

Такая возможность позволяет пользователю системы в любое время управлять автоматическим режимом.
Можно убрать галку «Автоматический режим» и сценарий по датчику движения (который показан выше) не будет включать светильник по сработке датчика движения.

Свет по датчику движения с учетом освещенности и с учетом автоматического режима (Авто)

Включает светильник по датчику движения с учетом дискретного датчика освещенности, отключает при отсутствии движения в течение заданного времени

Событие:
— Сработка датчика движения

Выполнить:
— Включить свет
— Выключить свет через время, заданное в параметрах светильника

Дополнительные условия:
1. Учитывать освещенность по дискретному датчику (темно/светло)
2. Дать возможность пользователю самостоятельно включать/выключать автоматический режим работы светильника по датчику движения.
3. После ручного включения/выключения светильника временно блокировать автоматический режим работы светильника по датчику движения.
4. Дать возможность пользователю самостоятельно настраивать параметры времени блокировки автоматического режима.

/** 
* @name Свет по датчику движения АВТО с учетом дискретной освещенности  
* @desc Включает светильник по датчику движения, отключает при отсутствии движения в течение заданного времени  
*       Учитывает дискретный датчик освещенности при включении - 1 - темно
*        если пользователем установлен флаг Учитывать освещенность
*       Сценарий работает, если для устройства включен флаг АВТО
* @version 4
*/

const lamp = Device("ActorD", "Светильник", [
  {"name":"timeOff", "note":"Светильник горит без движения, сек", "type":"number", "val":5},
  {"name":"takeDarkness", "note":"Учитывать освещенность", "type":"cb", "val":0}
  ]); 
  
const motion = Device("SensorD", "Датчик движения");  
const darkness = Device("SensorD", "Датчик темноты");  

startOnChange([motion,lamp], 
  lamp.auto && (motion.isOn() && lamp.isOff() && (darkness.isOn() || !lamp.getParam("takeDarkness"))  || motion.isOff() && lamp.isOn())
);

script({
    start() {
        this.addTimer("T1"); // Таймер нужно объявить, т к он участвует в функции onMotion
         
        if (motion.isOn()) {
          lamp.turnOnSaveAuto(); // Если просто дать команду On - АВТО будет сброшен. 
                                // Сейчас мы хотим сохранить АВТО  
        } else {
          // движения нет - взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");       
        }
        // В любом случае следим за датчиком движения и светильником
        this.addListener(motion, "onMotion");
        this.addListener(lamp, "onLamp");
    },
    
    onMotion() {
       // Если движение прекратилось - взводим таймер
      if (motion.isOff() && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.getParam("timeOff"), "turnOff");
      }  
        
       // Если движение возобновилось - сбрасываем таймер
      if (motion.isOn() )  {
        this.stopTimer("T1");
      }  
    },
    
     onLamp() {
      // Светильник выключили другим способом или сбросили флаг Авто - выходим
       if (lamp.isOff() || !lamp.auto) this.exit();
     },
     
    // Функция, которая сработает, когда таймер досчитает (нет движения в течении 
    // заданного времени) - отключаем и выходим
    turnOff() {
      lamp.turnOffSaveAuto();
      this.exit();
    }
});