Boas,
Novidades. O portão é controlado apenas por um SW, ou seja, se está fechado abre, se está a abrir pára e se voltarmos a carregar fecha.
Usei Esphome num D1 mini , tem 4 sensores, os reed do totalmente aberto, o reed do fechado, o sentido do motor e se o motor está ou não a trabalhar. A ideia é, consoante o estado fazer o numero de “button press” para controlar o portão.
esphome:
  name: portao_garagem
  platform: ESP8266
  board: d1_mini
  on_boot:
    priority: -10
    # Aberto=1, Fechado=2, Parado=3, A Abrir = 4, A Fechar =5
    then:
      - lambda: |-
      
         id(rele_sw).turn_off();
         
         if (id(fim_curso_aberto).state == true && id(fim_curso_fechado).state == false ) 
         {
           id(estado)='1';
         }
         else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == true )
         {
           id(estado)='2';
         }
         else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_motor).state == 0)
         {
           id(estado)='3';
         }
         else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_motor).state == true && id(sensor_sentido).state == false)
         {
           id(estado)='4';
         }
          else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_sentido).state == true && id(sensor_motor).state == true)
         {
           id(estado)='5';
         }
         
wifi:
  ssid: "ssid"
  password: "pass"
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Portao Garagem Fallback Hotspot"
    password: "pass"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
  password: "pass"
ota:
  password: "pass"
globals:
  - id: estado
    type: int
    restore_value: no
    initial_value: '0' 
  - id: estado_anterior
    type: int
    restore_value: no
    initial_value: '0' 
    
binary_sensor:
## Sensor Movimento
  - platform: gpio
    pin: D8 #D6
    name: "Movimento Garagem"
    device_class: motion
## Sensores Portao
  - platform: gpio
    pin:
      number: D4
      mode: INPUT_PULLUP
      inverted: True
    id: fim_curso_aberto
    internal: true
    on_press:
      then:
    
    
    
  - platform: gpio
    pin:
      number: D5
      mode: INPUT_PULLUP
      inverted: True
    id: fim_curso_fechado
    internal: true
    on_press:
      then:
    
    
  - platform: gpio
    pin:
      number: D6
      mode: INPUT_PULLUP
      inverted: True
    id: sensor_sentido
    internal: true
    on_press:
      then:
    on_release:
      then:    
    
  - platform: gpio
    pin:
      number: D7
      mode: INPUT_PULLUP
      inverted: True
    id: sensor_motor
    internal: true
    on_press:
      then:
    on_release:
      then:   
      
      
switch:
## Relé
  - platform: gpio
    id: rele_sw
    internal: true
    pin: D1
## Botões da Entidade
  - platform: template
    id: abrir_sw
    name: "Abrir"
    icon: "mdi:arrow-up-bold"
    turn_on_action:
      - lambda: |-
                id(stop_sw).turn_off();
                id(stop_sw).publish_state(false);
                id(fechar_sw).turn_off();
                id(fechar_sw).publish_state(false);
                id(abrir_sw).publish_state(true);
                
                // Está fechado
                if(id(estado) == '2')
                {
                  id(rele_sw).turn_on();
                  delay(500);
                  id(rele_sw).turn_off();
                }
                // Está parado
                else if(id(estado) == '3')
                {
                  // Estava a abrir antes de parar
                  if(id(estado_anterior) == '4')
                  {
                    id(rele_sw).turn_on();
                    delay(500);
                    id(rele_sw).turn_off();
                    delay(500);
                    id(rele_sw).turn_on();
                    delay(500);
                    id(rele_sw).turn_off();
                    delay(500);
                    id(rele_sw).turn_on();
                    delay(500);
                    id(rele_sw).turn_off();
                  }
                  //Estava a fechar antes de parar
                  else if(id(estado_anterior) == '5')
                  {
                    id(rele_sw).turn_on();
                    delay(500);
                    id(rele_sw).turn_off();
                  }
                }
                // Está a fechar
                else if(id(estado) == '5')
                {
                  id(rele_sw).turn_on();
                  delay(500);
                  id(rele_sw).turn_off();
                  delay(500);
                  id(rele_sw).turn_on();
                  delay(500);
                  id(rele_sw).turn_off();
                }
                
                id(estado_anterior) = '4';
                id(stop_sw).turn_off();
  - platform: template
    id: stop_sw
    name: "Parar"
    icon: "mdi:square"
    turn_on_action:
      - lambda: |-
                id(abrir_sw).turn_off();
                id(abrir_sw).publish_state(false);
                id(fechar_sw).turn_off();
                id(fechar_sw).publish_state(false);
                id(stop_sw).publish_state(true);
                
                if(id(estado) == '4' || id(estado) == '5')
                {
                  id(rele_sw).turn_on();
                  delay(500);
                  id(rele_sw).turn_off();
                }
  - platform: template    
    id: fechar_sw
    name: "Fechar"
    icon: "mdi:arrow-down-bold"
    turn_on_action:
      - lambda: |-
                id(abrir_sw).turn_off();
                id(abrir_sw).publish_state(false);
                id(stop_sw).turn_off();
                id(stop_sw).publish_state(false);
                id(fechar_sw).publish_state(true);
                
                if(id(estado) == '2')
                {
                  id(rele_sw).turn_on();
                  delay(500);
                  id(rele_sw).turn_off();
                }
Tenho uma questão, no boot faço uma verificação do estado consoante os inputs dos sensores, e a cada alteração de sensor tenciono fazer o mesmo para atualizar a entidade quando alguém altera o estado fora do sistema, queria chamar um método para não estar a repetir o mesmo código carradas de vezes, alguém sabe como fazer?
Edit: Com scritps
Outra questão, como posso inativar o botão na entidade para não ser possível premir? (como na entidade garage cover do esphome)
Obrigado desde já
Edit: o  turn_on_action do fechar_sw ainda não está acabado