Управление шторами с одной кнопки в "поле"



  • Добрый день. Хочу поделиться скриптом для управления шторами с одной физической кнопки в комнате и двумя кнопками на интерфейсе.
    Вводные данные:

    1. Актуатор на привод для открытия штор
    2. Актуатор на привод для закрытия штор
    3. Кнопка без фиксации в комнате на стене с одним контактом

    Задача:
    Реализовать открытие штор по одинарному нажатию на кнопку, по двойному нажатию закрывать шторы. Во время движения штор, одинарное нажатие отключает привод. Управление двумя кнопками из интерфейса системы.

    /*
    * 
    * @name Управление шторами 
    * @desc  
    * @version 4 
    */
    const buttonF = Device("ActorD","Кнопка в комнате"); 
    const buttonOp = Device("ActorD","Кнопка открыть", [
      {"name":"timeOpen", "note":"Максимально время открытия, сек", "type":"number", "val": 10}
      ]); 
    const buttonCl = Device("ActorD","Кнопка закрыть", [
      {"name":"timeClose", "note":"Максимально время закрытия, сек", "type":"number", "val": 10}
      ]); 
    const driverOp = Device("ActorD","Привод открытия");
    const driverCl = Device("ActorD","Привод закрытия");
    
    
    startOnChange([buttonF, buttonOp, buttonCl]); 
    
    script({
        start() {
          this.addTimer("T1");
          this.addTimer("T2"); 
          this.addTimer("T3");
          //Ручное управление закрытием штор из интерфейса
          if (buttonCl.isOn() && driverOp.isOff()) {
            driverCl.on();
            this.startTimer("T2", buttonCl.getParam("timeClose"), "timeOutClose");
            this.addListener(buttonCl, "driverCloseOff");
          }
           //Ручное управление открытием штор из интерфейса
          if (buttonOp.isOn() && driverCl.isOff()) {
            driverOp.on();
            this.startTimer("T3", buttonOp.getParam("timeOpen"), "timeOutOpen");
            this.addListener(buttonOp, "driverOpenOff");
          } 
    
          //Обработка двойного клика выключателя
          if (buttonF.isOn()) {
            this.startTimer("T1", 0.5, "timeOut");
            this.addListener(buttonF, "dblClick");
          }
        },
        dblClick() {
          if (buttonF.isOn() && driverOp.isOff() && driverCl.isOff()) {
            this.stopTimer("T1");
            driverCl.on();
            this.startTimer("T2", buttonCl.getParam("timeClose"), "timeOutClose");
            this.addListener(buttonF, "timeOut1");
          }
        },
        //Обработка одинарного нажатия выключателя
        timeOut() {
          this.removeListener(buttonF, "dblClick");
          if (buttonF.isOn() && driverOp.isOff() && driverCl.isOff()) {
            this.startTimer("T3", buttonOp.getParam("timeOpen"), "timeOutOpen");
            this.addListener(buttonF, "timeOut1");
            driverOp.on();
          } 
     
        },
        //Остановка работы приводов
        timeOut1() {
          if (buttonF.isOn() && driverOp.isOn()) {
            driverOp.off();
            this.exit();
          }
          if (buttonF.isOn() && driverCl.isOn()) {
            driverCl.off();
            this.exit();
          }
          
        },
        //Отключение приводов в ручном режиме
        driverCloseOff () {
          driverCl.off();
          this.exit();
        },
        driverOpenOff() {
          driverOp.off();
          this.exit();
        },
        //Отключение приводов через заданное время автоматически
        timeOutClose() {
          driverCl.off();
          buttonCl.off();
          this.exit();
        },
        timeOutOpen() {
          driverOp.off();
          buttonOp.off();
          this.exit();
        }
    });

Авторизуйтесь, чтобы ответить