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



  • Мультисценарий

    Управление светом по датчику движения с учетом режима Avto

    /** 
    * @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();
        }
    });