Automação de Portão com ESPHome e Home Assistant
O ESPPortao transforma um portão de garagem convencional num dispositivo inteligente, sem trocar o motor nem o comando original: um ESP8266 a correr ESPHome simula os botões do controlo remoto por relé, lê três sensores de fim de curso e expõe o portão ao Home Assistant como uma entidade cover nativa. Abertura total, abertura pedonal, estado em tempo real e iluminação exterior — tudo local, sem nuvem e sem subscrições.
Neste artigo
Visão geral do sistema
A ideia é simples: em vez de comprar um kit de automação fechado, usa-se o próprio comando do portão. O microcontrolador fecha os contactos dos botões abrir/fechar e parcial exatamente como faria o telemando, e três sensores de fim de curso dizem onde o portão está em cada momento. O resultado é um sistema híbrido — o portão continua a funcionar com o comando original, e o ESPHome acrescenta controlo remoto, automações e monitorização.
- 3Saídas relé: passo completo, parcial e luz
- 3Sensores de fim de curso com filtro anti-vibração
- 1 sPulso momentâneo com interlock entre relés
- 0Serviços externos ou dependência da nuvem
A entidade central é um cover template com device_class: gate. Isto significa que no Home Assistant o portão aparece com o ícone, os estados e os comandos certos: abre, fecha, para a meio caminho, participa em dashboards, aparece no Voice Assist e pode ser usado em qualquer automação como qualquer portão inteligente de fabricante.
Hardware e esquema de ligação
Não há nada exótico na lista de materiais. Tudo cabe numa pequena caixa de embutir junto à central do portão, alimentado por uma fonte de 5 V:
- Placa ESP8266 — o YAML declara
board: esp01_1m; na prática, use uma placa com os pins expostos (NodeMCU ou Wemos D1 mini). - Módulo relé de 3 canais — opto-isolado, com saída NO/NC, para simular os botões do comando e comandar a luz exterior.
- 3 botões fim de curso (normalmente abertos) — um no fim de curso de fechado, um na posição intermédia e um no fim de curso de aberto.
- Fonte de 5 V DC — USB ou regulador, consoante o sítio de instalação.
- Caixa de embutir e cabo de ligação ao comando existente.

Nota de hardware: o ficheiro usa esp8266: board: esp01_1m, mas os seis GPIO referenciados (GPIO4, 5, 12, 13, 14 e 16) não existem num ESP-01, que só expõe GPIO0 e GPIO2. Usa antes uma placa NodeMCU ou Wemos D1 mini — a configuração é idêntica e tens todos os pins à mão.
Trabalha sempre com o portão desligado da rede elétrica durante a fiação. Se a central tiver contactos secos (dry contacts), liga os relés aí; caso contrário, usa uma saída opto-isolada dimensionada para a tensão de comando.
Mapeamento dos GPIO
Todos os pinos estão fixados no YAML, com comentários que documentam a função de cada um. É este o mapa completo:
| Sinal | GPIO | Direção | Função |
|---|---|---|---|
Step (_completo) | GPIO5 | Saída → relé | Pulso de 1 s: abre ou fecha o portão |
Parcial (_parcial) | GPIO4 | Saída → relé | Pulso de 1 s: abertura pedonal |
| Luz Exterior | GPIO16 | Saída → relé | Interruptor liga/desliga da iluminação |
| Portão Fechado | GPIO14 | Entrada | Fim de curso de fecho (closed_endstop) |
| Portão 1/4 Aberto | GPIO12 | Entrada | Posição intermédia (open_midle) |
| Portão Aberto | GPIO13 | Entrada | Fim de curso de abertura (open_endstop) |
Duas proteções merecem destaque. A primeira é o interlock: o YAML define um grupo (interlock: &interlock_group [_parcial, _completo]) que impede que os dois relés de movimento estejam ativos ao mesmo tempo — impossível pedir «abrir» e «fechar» em simultâneo. A segunda é o modo momentâneo: cada relé de movimento desliga-se sozinho ao fim de 1 segundo, tal como um dedo a carregar no botão do telemando.
Os três finais de curso usam delayed_on: 1000ms e delayed_off: 1000ms. Sem este filtro, a vibração do portão em movimento faria o estado oscilar e o cover saltaria entre «a abrir» e «a fechar». Com o filtro, só uma posição confirmada durante um segundo completa é publicada.
O YAML, bloco a bloco
O ficheiro portao.yaml tem uma estrutura limpa e comentada. Estes são os excertos que interessam, do relé ao cover:
Relés momentâneos com interlock
switch:
- platform: gpio
pin: GPIO4
id: _parcial
name: "Parcial"
icon: "mdi:gate"
on_turn_on:
- delay: 1000ms
- switch.turn_off: _parcial
interlock: &interlock_group [_parcial, _completo]
- platform: gpio
pin: GPIO5
id: _completo
name: "Step"
icon: "mdi:gate"
on_turn_on:
- delay: 1000ms
- switch.turn_off: _completo
interlock: *interlock_groupCode language: JavaScript (javascript)
Fim de curso que alimenta o estado do cover
Cada sensor publica diretamente no cover template: quando o portão deixa de estar fechado, o estado passa a OPENING; quando encosta no fim de curso de aberto, fica IDLE. É assim que o Home Assistant sabe sempre onde o portão está — mesmo depois de um reinício, porque a lambda do cover lê o sensor físico:
binary_sensor:
- platform: gpio
pin: { number: GPIO14, mode: INPUT, inverted: true }
filters:
- delayed_on: 1000ms
- delayed_off: 1000ms
name: "Portão Fechado"
id: closed_endstop
on_press:
- cover.template.publish:
id: door_position_sensor
current_operation: IDLE
state: 'CLOSED'
on_release:
- cover.template.publish:
id: door_position_sensor
current_operation: OPENING
state: "OPEN"
cover:
- platform: template
name: "Portão"
id: door_position_sensor
device_class: gate
open_action:
then:
- switch.turn_on: _completo
close_action:
then:
- switch.turn_on: _completo
lambda: |-
if (id(closed_endstop).state) {
return COVER_CLOSED;
} else {
return COVER_OPEN;
}Code language: JavaScript (javascript)
Porque é que abrir e fechar são iguais? Num portão comum, um pulso no mesmo botão alterna entre abrir e fechar. O cover do Home Assistant manda open quando queres abrir e close quando queres fechar — ambos acabam no mesmo relé _completo, e o próprio portão decide o sentido com base no estado atual dele.
Rede, gestão e atualizações
A parte de rede é onde este projeto se afasta do típico smart device: nada depende de um servidor de fabricante. A configuração garante:
- IP estático — o dispositivo vive sempre em
192.168.x.xxx, com gateway e DNS em192.168.x.xxx. Nada de reservas DHCP que mudam o endereço e quebram automações. - Três redes Wi-Fi —
SF24A,SF24BeSF24Ccom as mesmas definições estáticas: se um dos pontos de acesso cair, o ESPHome passa ao seguinte. - Access Point de emergência — com
ap: {}ecaptive_portal, se nenhuma rede estiver disponível o dispositivo abre o seu próprio Wi-Fi e permite reconfigurar as credenciais pelo telemóvel. - Improv Serial — provisionamento de Wi-Fi pela porta série, útil na primeira configuração ou em bancada.
- OTA — atualizações de firmware sem tocar no cabo, a partir do ESPHome no Home Assistant (ou do VS Code).
- Web Server — interface local para consultar estado e logs sem abrir o Home Assistant.
- API nativo — ligação direta ao Home Assistant, sem MQTT obrigatório.
wifi:
ap: {}
networks:
- ssid: SF24A
password: "••••••••"
manual_ip:
static_ip: 192.168.1.227
gateway: 192.168.1.254
subnet: 255.255.255.0
dns1: 192.168.1.254
captive_portal:Code language: CSS (css)
Antes de publicar o YAML: as palavras-passe do Wi-Fi ficam em texto no ficheiro — mantém o portao.yaml fora de repositórios públicos. Recomenda-se ainda definir api: encryption_key para cifrar a ligação ao Home Assistant e ota: password para proteger as atualizações. Com IP estático, reserva também o endereço no router para não haver conflitos.
Instalação passo a passo
Do ficheiro em branco ao portão controlável pelo telemóvel, em seis passos:
- Liga a fiação em bancada. Monta ESP8266 + módulo relé + os três finais de curso numa protoboard e testa tudo antes de ir à garagem. Confirma que o interlock impede os dois relés de fechar ao mesmo tempo.
- Grava o firmware. Importa
portao.yamlno ESPHome (Home Assistant → ESPHome → Add Device), corrige as credenciais Wi-Fi e envia via OTA ou USB. - Adiciona ao Home Assistant. O dispositivo aparece em Dispositivos & Serviços; aceita a ligação API e as entidades Portão, Luz Exterior e os diagnósticos ficam disponíveis.
- Instala na central do portão. Liga os relés aos contactos do comando original e os finais de curso aos pontos de deteção. Alimenta o conjunto com 5 V e fixa a caixa junto à central.
- Calibra os finais de curso. Usa o logger do ESPHome para verificar
CLOSED/OPENe ajusta a posição dos sensores até os três estados baterem certo com a posição real do portão. - Monta o dashboard e as automações. Adiciona o cover ao painel, a luz exterior a um tile e cria as automações de fecho automático (ver secção seguinte).
No Home Assistant
Depois de pareado, o dispositivo cria um conjunto de entidades pronto a usar. É no dashboard que o projeto ganha vida:
Cartão do portão
O cover Portão mostra estado e ação num só sítio: toca para abrir, toca e segura para parar, desliza para pedir abertura parcial. Funciona no telemóvel, no tablet de parede e no browser.
Luz exterior
O interruptor Luz Exterior (mdi:car-light-dimmed) controla a iluminação da garagem e pode ser agrupado com o portão num único cartão ou num tile do dashboard.
Diagnóstico sempre visível
Sinal Wi-Fi (a cada 10 s), uptime, versão do ESPHome e SSID da rede — entidades que resolvem 90% dos problemas à distância, sem ir à garagem.
Automações que valem a pena
Com o portão exposto como cover, qualquer automação é possível. Estas três são as mais úteis no dia a dia:
- Fecho automático — se o portão ficar aberto mais de 10 minutos sem movimento, fecha-o e envia uma notificação.
- Luz ao abrir — ao detetar
current_operation: openingà noite, liga a luz exterior; dois minutos depois deIDLE, desliga. - Modo saída de casa — um scene que fecha o portão, apaga a luz e desliga a saída quando sares de casa.
alias: Portão - fecho automático
trigger:
- platform: state
entity_id: cover.portao
to: "open"
for:
minutes: 10
condition:
- condition: state
entity_id: cover.portao
state: "open"
action:
- service: cover.close_cover
target:
entity_id: cover.portao
- service: notify.mobile_app
data:
message: "Portão da garagem fechado automaticamente."Code language: CSS (css)
Diagnóstico e boas práticas
Quando algo falha, os quatro pontos abaixo resolvem quase sempre o problema:
- O portão não responde no HA. Vê o sinal Wi-Fi e o uptime: se o dispositivo reiniciou de forma repetida, verifica a alimentação de 5 V (relés a puxar corrente demais é a causa clássica — usa uma fonte com margem).
- Estado errado após um reinício. O cover confia no fim de curso
closed_endstop. Se o portão está fechado e o sensor não está ativado, o HA mostrará aberto; recalibra a posição do fim de curso. - Estados a saltitar. Aumenta os filtros
delayed_on/off(por exemplo para 2000 ms) — indica vibração do portão ou contacto do fim de curso a falhar. - Perdeu a ligação Wi-Fi. Liga ao AP de emergência com o telemóvel, reentra as credenciais e o dispositivo volta a ligar-se às redes configuradas, mantendo o IP estático.
Antes de qualquer alteração grande, exporta o portao.yaml. O ESPHome guarda o histórico no Home Assistant, mas um ficheiro de cópia em local seguro torna qualquer regressão instantânea.
Conclusão
O ESPPortao prova que não é preciso um kit caro nem uma ligação à nuvem para ter um portão inteligente. Com uma placa de poucos euros, três relés e três finais de curso, obtém-se o que os sistemas comerciais oferecem — estados fiáveis, controlo total e integração nativa — e ainda se mantém o comando original intacto como alternativa física.
É um projeto replicável: copia o portao.yaml, ajusta os GPIO às tuas ligações, calibra os finais de curso e tens o portão no dashboard ao fim de uma tarde. Tudo local, tudo teu.
Quer montar o teu?
A documentação do ESPHome e do Home Assistant cobre tudo o que é preciso para dar o primeiro passo — e o YAML deste artigo serve de ponto de partida.
