Кодовый замок из настенных выключателей (скрипт-шутка)



  • Если у вас есть ряд из 4-х настенных выключателей (именно выключателей, а не кнопок) можно сделать из них кодовый замок.
    Работает так - ввести стартовую комбинацию, после чего проделать определенную последовательность переключений. На каждое переключение дается 2 сек. Любая ошибка остановит скрипт.
    После окончания включится или выключится выбранное устройство. Например разблокируется замок минибара. Или отключится режим охраны.

    Сам скрипт

    /** 
    * @name кодовый замок 
    * @desc  
    * @version 4 
    */
    
    const Sw1 = Device("SensorD", "Выключатель1");
    const Sw2 = Device("SensorD", "Выключатель2");
    const Sw3 = Device("SensorD", "Выключатель3"); 
    const Sw4 = Device("SensorD", "Выключатель4");
    const Actor = Device("ActorD", "Секрет");
    
    startOnChange([Sw2], Sw1.isOn() && Sw3.isOff() && Sw4.isOn());
    
    script({
        start() {
          if (Sw1.isOn() && Sw2.isOn() && Sw3.isOff() && Sw4.isOn()) {
          // взводим таймер, чтобы отключить 
          this.startTimer("T1", 2, "turnOff");       
              }
            
            this.addListener(Sw1, "onSw1");
            this.addListener(Sw2, "onSw2");
            this.addListener(Sw3, "onSw3");
            this.addListener(Sw4, "onSw4");
        },
        
        onSw1() {
          
          if (Sw1.isOff() && Sw2.isOn() && Sw3.isOff() && Sw4.isOn()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
           if (Sw1.isOn() && Sw2.isOff() && Sw3.isOn() && Sw4.isOff()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }   
        },
        
         onSw2() {
          
           if (Sw1.isOff() && Sw2.isOff() && Sw3.isOn() && Sw4.isOff()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
         },
         
         onSw3() {
          
            if (Sw1.isff() && Sw2.isOn() && Sw3.isOn() && Sw4.isOn()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
           if (Sw1.isOn() && Sw2.isOff() && Sw3.isOff() && Sw4.isOn()) {
          Actor.Off();
          this.exit();
              }  
         },
         onSw4() {
          
          if (Sw1.isOff() && Sw2.isOn() && Sw3.isOn() && Sw4.isOff()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
           if (Sw1.isOn() && Sw2.isOff() && Sw3.isOn() && Sw4.isOn()) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }  
        },
        turnOff() {
          this.exit(); 
        }
    });
    

    В нем :
    1 0 0 1 - стартовое положение выключателей.

    Последовательность переключений:
    1 1 0 1
    0 1 0 1
    0 1 1 1
    0 1 1 0
    0 0 1 0
    1 0 1 0
    1 0 1 1
    1 0 0 1

    Можно использовать выключатели в разных концах дома, только нужно увеличить время таймера. 🙂



  • @Erik Классная идея, особенно для минибара 🙂 И отличная реализация 👍



  • Поправил сценарий.

    /** 
    * @name кодовый замок 
    * @desc  
    * @version 4 
    */
    
    const Sw1 = Device("SensorD", "Выключатель1");
    const Sw2 = Device("SensorD", "Выключатель2");
    const Sw3 = Device("SensorD", "Выключатель3"); 
    const Sw4 = Device("SensorD", "Выключатель4");
    const Actor = Device("ActorD", "Секрет");
    
    startOnChange([Sw2]);
    
    script({
          // 1. 1101
        start() {
          if (Sw1.value==1 && Sw2.value==1 && Sw3.value===0 && Sw4.value==1) {
          // взводим таймер, чтобы отключить 
          this.startTimer("T1", 2, "turnOff");       
              }
            
            this.addListener(Sw1, "onSw1");
            this.addListener(Sw2, "onSw2");
            this.addListener(Sw3, "onSw3");
            this.addListener(Sw4, "onSw4");
        },
        
        onSw1() {
          // 2. 0101
          if (Sw1.value===0 && Sw2.value==1 && Sw3.value===0 && Sw4.ivalue==1) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
          // 6. 1010
           if (Sw1.value==1 && Sw2.value===0 && Sw3.value==1 && Sw4.value===0) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }   
        },
        
         onSw2() {
          // 5. 0010
           if (Sw1.value===0 && Sw2.value===0 && Sw3.value==1 && Sw4.value===0) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
         },
         
         onSw3() {
          // 3. 0111
            if (Sw1.value===0 && Sw2.value==1 && Sw3.value==1 && Sw4.value==1) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
          // 8. 1001
           if (Sw1.value==1 && Sw2.value===0 && Sw3.value===0 && Sw4.value==1) {
          this.stopTimer("T1");
          Actor.toggle();
          this.exit();
              }  
         },
         onSw4() {
          // 4. 0110
          if (Sw1.value===0 && Sw2.value==1 && Sw3.value==1 && Sw4.value===0) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }
              // 7. 1011
           if (Sw1.value==1 && Sw2.value===0 && Sw3.value==1 && Sw4.value==1) {
          this.stopTimer("T1");
          this.startTimer("T1", 2, "turnOff");       
              }  
        },
        turnOff() {
          this.exit(); 
        }
    });
    

    С первоначальным условием запуска он не запускался. И сравнение с числами работает надежнее, чем проверка состояния он/офф. ПО крайней мере в моем случае.

    Ну и команду актуатора замка поменял на "переключить". Можно теперь его включить и выключить попеременно.


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