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

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

Задача

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

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

Дополнительные условия:
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();
    }
});