Portão garagem Sonoff Basic 2xReed

Boas,
A ideia é controlar um portão de garagem com um sonoff+tasmota, mas os projetos que tenho visto não me agradam em termos de segurança. Pensei em adicionar um reed switch no fim e outro no topo para obter 3 estados, Fechado, A abrir e Aberto.

Caracteristicas:
-O Botão de abrir está enabled se o portão tiver fechado.
-O botão de fechar está enabled se o portão estiver aberto.
-Para evitar aberturas acidentais, o card tem que ser debloqueado com um botão ou código

Dificuldade 1:
Ligar ReedSwitch no SerialOut (o do Serial in funciona)
image

Dificuldade 2:
Sem ser bloquear os botões, não sei qual a melhor maneira de lidar com a “pausa” do portão ao voltar a pressionar quando está a abrir/fechar.

@joaopedrocmp já deste uma olhadela neste projecto ?

Ou este que me parece ainda melhor:

Bom dia,
Obrigado pelas respostas, já tinha visto os dois projetos mas estava a tentar não usar nodemcu mas sim Sonoff basic, no entanto tive a ideia de tentar ir buscar estado do relé do motor, então passo a conseguir saber se está em movimento ou parado.
Sou capaz de optar então pelo nodeMCU mas com Esphome, que me dá mais liberdade no código.

não podes usar o tx/gpio1 para um reed, senão arriscas-te a que o sonoff não arranque

Na vdd era para um reed

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

Não é uma resposta à tua pergunta, mas como implementaste o sensor do sentido do motor?

A placa do portão tem 2 relés, um deles é ligar ou desligar a alimentação para o motor, e o outro é o sentido da rotação. Vou ás bobinas do relés buscar sinal, na placa do esp ligam num optoisolador e tenho sinal limpo e protegido.

Que sorte. Tentei fazer isso e queimei um transistor da placa… Provavelmente era demasiada corrente para alimentar o optoisolator… :grimacing:

Mas ligaste na bobina do relé um opto?
20mA a mais de um led queimaram um transistor? Estranho

Sim… Infelizmente, sim


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade