Управление воротами

У меня есть ворота Doorhan, которые имеют только одну клемму управления - тактовая кнопка SBS.
Каждое нажатие переключает состояние привода: вверх, стоп, вниз, стоп, вверх и т.д.
И я хочу как-то сделать, чтобы у меня в веб-интерфейсе было понятное отображение текущего действия.
Я установил 2 геркона, чтобы понимать крайние состояния ворот (полностью открыты и полностью закрыты).

То что хочу пока смог сформулировать вот в таком виде. Дальше не могу понять как действовать

var garageGateRelay = "wb-mio-gpio_70:3/K8";
var garageGateTop = "wb-mio-gpio_70:2/IN3";
var garageGateDown = "wb-mio-gpio_70:1/IN7";

defineVirtualDevice("GarageGateControl", { 
    title: "Управление гаражными воротами",  
    cells: {
      Up: { 
        title: "ВВЕРХ",
        type: "switch",
        value: false,
      }, 
      Down: { 
        title: "ВНИЗ",
        type: "switch",
        value: false,
      }, 
      Stop: { 
        title: "СТОП",
        type: "switch",
        value: false,
      }
  }
});


// действия при изменении положения гаражных ворот
defineRule("GarageGateRule", { 
  whenChanged: [garageGateTop, garageGateDown, garageGateRelay], 
  then: function (newValue, devName, cellName) {
    // если ворота наверху, то только кнопка ВНИЗ должна посылать сигнал в топик управляющего реле
    if ( dev[garageGateTop] == true ) { 
      dev['GarageGateControl/Up'] = NULL;   
      dev['GarageGateControl/Down'] = garageGateRelay;  // кнопке ВНИЗ присваиваем топик управляющего реле
      dev['GarageGateControl/Stop'] = NULL; 
    }

    // если ворота внизу, то только кнопка ВВЕРХ должна посылать сигнал в топик управляющего реле
    else if ( dev[garageGateDown] == true ) { 
      dev['GarageGateControl/Up'] = garageGateRelay;   // кнопке ВВЕРХ присваиваем топик управляющего реле
      dev['GarageGateControl/Down'] = NULL;  
      dev['GarageGateControl/Stop'] = NULL; 
    }

    // если ворота где-то посередине, то кнопки работают в зависимости от прошлого состояния garageGateTop или garageGateDown и количества активаций реле
    if ( dev[garageGateTop] == false && dev[garageGateDown] == false ) { 

      // тут сначала надо выяснить кто из garageGateTop и garageGateDown в последний раз был true 
      // потом посчитать сколько раз после этого активировано реле и в зависимости от этого определить 
      // какой код нужен для каждой кнопки, чтобы при нажатии кнопки программа сама послала на реле от 1 до 3 импульсов 
      // для направления ворот в нужную сторону

    }

  }
});


Добрый день.

Можно создать глобальную переменную, в которой будет храниться текущее состояние. Так же можно использовать PersistentStorage.
Например, 0 будет указывать на то, что ворота внизу, 1 — наверху, 2 — промежуточное состояние.

Для удобства и наглядности лучше создать функцию, аргументом которой будет задаваться желаемое состояние — вверх, стоп, вниз, а так же текущее состояние и внутри функции уже обрабатывать эти данные. Для создания импульсов можно воспользоваться таймером.