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

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

Скачать шаблон сценария:

Задача

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

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

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

Скрипт

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


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", "Датчик темноты");  

const script = {
  
    // Запустим сценарий, ЕСЛИ
    // флаг светильника Авто установлен 
    // и светильник не горит 
    // и есть движение - тогда включим лампу 
    // или светильник горит (чтобы выключить, так как режим Авто)
    //
  
    check() {
      return (lamp.auto && (!lamp.dval && motion.dval && (darkness.dval || !lamp.takeDarkness) || lamp.dval));  
    },
    
    start() {
         this.addTimer("T1"); // Таймер нужно объявить, т к он участвует в функции onMotion
         
        if (!lamp.dval && motion.dval) {
          // Cветильник не горит, движение есть  
          this.do(lamp, "aon");
        } else {
          // движения нет - взводим таймер, чтобы отключить 
          this.startTimer("T1", lamp.timeOff, "turnOff");       
        }
        // В любом случае следим за датчиком движения и светильником
        this.addListener(motion, "onMotion");
        this.addListener(lamp, "onLamp");
    },
    
    onMotion() {
       // Если движение прекратилось - взводим таймер
      if (!motion.dval && this.timer.T1 == "off")  {
        this.startTimer("T1", lamp.timeOff, "turnOff");
      }  
        
       // Если движение возобновилось - сбрасываем таймер
      if (motion.dval && this.timer.T1 == 'on')  {
        this.stopTimer('T1');
      }  
    },
    
     onLamp() {
      // Светильник выключили другим способом или сбросили флаг Авто - выходим
       if (!lamp.dval || !lamp.auto) this.exit();
     },
     
    // Функция, которая сработает, когда таймер досчитает (нет движения в течение заданного времени) - отключаем и выходим
    turnOff() {
      this.do(lamp, "aoff");
      this.exit();
    }
};

Закрыть меню