{"id":26,"date":"2026-10-05T09:16:22","date_gmt":"2026-10-05T09:16:22","guid":{"rendered":"https:\/\/sfelectronica.com\/bit\/?p=26"},"modified":"2026-10-05T13:28:44","modified_gmt":"2026-10-05T13:28:44","slug":"automacao-portao-esphome-home-assistant","status":"publish","type":"post","link":"https:\/\/sfelectronica.com\/bit\/automacao-portao-esphome-home-assistant\/","title":{"rendered":"Automa\u00e7\u00e3o de Port\u00e3o com ESPHome e Home Assistant"},"content":{"rendered":"\n<p class=\"hbc-lede wp-block-paragraph\"><strong>O ESPPortao<\/strong> transforma um port\u00e3o de garagem convencional num dispositivo inteligente, sem trocar o motor nem o comando original: um <strong>ESP8266<\/strong> a correr <strong>ESPHome<\/strong> simula os bot\u00f5es do controlo remoto por rel\u00e9, l\u00ea tr\u00eas sensores de fim de curso e exp\u00f5e o port\u00e3o ao <strong>Home Assistant<\/strong> como uma entidade <em>cover<\/em> nativa. Abertura total, abertura pedonal, estado em tempo real e ilumina\u00e7\u00e3o exterior \u2014 tudo local, sem nuvem e sem subscri\u00e7\u00f5es.<\/p>\n\n\n\n<div class=\"hbc-specs\">\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Projeto<\/span><span class=\"hbc-specs__val\">ESPPortao<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Hardware<\/span><span class=\"hbc-specs__val\">ESP8266 \u00b7 m\u00f3dulo rel\u00e9 \u00d73 \u00b7 fim de curso \u00d73<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Firmware<\/span><span class=\"hbc-specs__val\">ESPHome (min. 2024.6.0)<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Plataforma<\/span><span class=\"hbc-specs__val\">Home Assistant<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Ficheiro<\/span><span class=\"hbc-specs__val\">portao.yaml<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Rede<\/span><span class=\"hbc-specs__val\">IP est\u00e1tico \u00b7 AP + captive portal<\/span><\/div>\r\n\r\n\t<div class=\"hbc-specs__item\"><span class=\"hbc-specs__key\">Nuvem<\/span><span class=\"hbc-specs__val\">Nenhuma \u2014 100% local<\/span><\/div>\r\n\r\n<\/div>\n\n\n\n<div class=\"hbc-toc\">\r\n\r\n\t<p class=\"hbc-toc__title\">Neste artigo<\/p>\r\n\r\n\t<ol>\r\n\r\n\t\t<li><a href=\"#visao-geral\">Vis\u00e3o geral do sistema<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#hardware\">Hardware e esquema de liga\u00e7\u00e3o<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#gpio\">Mapeamento dos GPIO<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#yaml\">O YAML, bloco a bloco<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#rede\">Rede, gest\u00e3o e atualiza\u00e7\u00f5es<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#instalacao\">Instala\u00e7\u00e3o passo a passo<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#home-assistant\">No Home Assistant<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#diagnostico\">Diagn\u00f3stico e boas pr\u00e1ticas<\/a><\/li>\r\n\r\n\t\t<li><a href=\"#conclusao\">Conclus\u00e3o<\/a><\/li>\r\n\r\n\t<\/ol>\r\n\r\n<\/div>\n\n\n\n<h2 id=\"visao-geral\" class=\"wp-block-heading\">Vis\u00e3o geral do sistema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A ideia \u00e9 simples: em vez de comprar um kit de automa\u00e7\u00e3o fechado, <strong>usa-se o pr\u00f3prio comando do port\u00e3o<\/strong>. O microcontrolador fecha os contactos dos bot\u00f5es <em>abrir\/fechar<\/em> e <em>parcial<\/em> exatamente como faria o telemando, e tr\u00eas sensores de fim de curso dizem onde o port\u00e3o est\u00e1 em cada momento. O resultado \u00e9 um sistema h\u00edbrido \u2014 o port\u00e3o continua a funcionar com o comando original, e o ESPHome acrescenta controlo remoto, automa\u00e7\u00f5es e monitoriza\u00e7\u00e3o.<\/p>\n\n\n\n<ul class=\"wp-block-list hbc-stats\">\n<li><strong>3<\/strong><span>Sa\u00eddas rel\u00e9: passo completo, parcial e luz<\/span><\/li>\n\n\n\n<li><strong>3<\/strong><span>Sensores de fim de curso com filtro anti-vibra\u00e7\u00e3o<\/span><\/li>\n\n\n\n<li><strong>1 s<\/strong><span>Pulso moment\u00e2neo com interlock entre rel\u00e9s<\/span><\/li>\n\n\n\n<li><strong>0<\/strong><span>Servi\u00e7os externos ou depend\u00eancia da nuvem<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A entidade central \u00e9 um <strong><code>cover<\/code> template<\/strong> com <code>device_class: gate<\/code>. Isto significa que no Home Assistant o port\u00e3o aparece com o \u00edcone, 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\u00e7\u00e3o como qualquer port\u00e3o inteligente de fabricante.<\/p>\n\n\n\n<h2 id=\"hardware\" class=\"wp-block-heading\">Hardware e esquema de liga\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o h\u00e1 nada ex\u00f3tico na lista de materiais. Tudo cabe numa pequena caixa de embutir junto \u00e0 central do port\u00e3o, alimentado por uma fonte de 5&nbsp;V:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Placa ESP8266<\/strong> \u2014 o YAML declara <code>board: esp01_1m<\/code>; na pr\u00e1tica, use uma placa com os pins expostos (NodeMCU ou Wemos D1 mini).<\/li>\n\n\n\n<li><strong>M\u00f3dulo rel\u00e9 de 3 canais<\/strong> \u2014 opto-isolado, com sa\u00edda NO\/NC, para simular os bot\u00f5es do comando e comandar a luz exterior.<\/li>\n\n\n\n<li><strong>3 bot\u00f5es fim de curso<\/strong> (normalmente abertos) \u2014 um no fim de curso de fechado, um na posi\u00e7\u00e3o interm\u00e9dia e um no fim de curso de aberto.<\/li>\n\n\n\n<li><strong>Fonte de 5\u00a0V DC<\/strong> \u2014 USB ou regulador, consoante o s\u00edtio de instala\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>Caixa de embutir<\/strong> e cabo de liga\u00e7\u00e3o ao comando existente.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-figure hbc-screen\"><img decoding=\"async\" src=\"https:\/\/sfelectronica.com\/bit\/wp-content\/uploads\/2026\/10\/esppportao-esquema-ligacao.png\" alt=\"Esquema de liga\u00e7\u00e3o el\u00e9trica do ESPPortao: fonte de 5 V, ESP8266, m\u00f3dulo de tr\u00eas rel\u00e9s, tr\u00eas fins de curso e motor do port\u00e3o.\" width=\"1200\" height=\"760\" loading=\"lazy\" \/><figcaption>Liga\u00e7\u00e3o completa: ESP8266 no centro, rel\u00e9s \u00e0 direita, fins de curso \u00e0 esquerda<\/figcaption><\/figure>\n\n\n\n<div class=\"hbc-callout hbc-callout--warn\">\r\n\t<span class=\"hbc-callout__icon\">!<\/span>\r\n\t<p><strong>Nota de hardware:<\/strong> o ficheiro usa <code>esp8266: board: esp01_1m<\/code>, mas os seis GPIO referenciados (GPIO4, 5, 12, 13, 14 e 16) n\u00e3o existem num ESP-01, que s\u00f3 exp\u00f5e GPIO0 e GPIO2. Usa antes uma placa NodeMCU ou Wemos D1 mini \u2014 a configura\u00e7\u00e3o \u00e9 id\u00eantica e tens todos os pins \u00e0 m\u00e3o.<\/p>\r\n\t<p>Trabalha sempre com o port\u00e3o <strong>desligado da rede el\u00e9trica<\/strong> durante a fia\u00e7\u00e3o. Se a central tiver contactos secos (<em>dry contacts<\/em>), liga os rel\u00e9s a\u00ed; caso contr\u00e1rio, usa uma sa\u00edda opto-isolada dimensionada para a tens\u00e3o de comando.<\/p>\r\n<\/div>\n\n\n\n<h2 id=\"gpio\" class=\"wp-block-heading\">Mapeamento dos GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Todos os pinos est\u00e3o fixados no YAML, com coment\u00e1rios que documentam a fun\u00e7\u00e3o de cada um. \u00c9 este o mapa completo:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Sinal<\/th><th>GPIO<\/th><th>Dire\u00e7\u00e3o<\/th><th>Fun\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td><strong>Step<\/strong> (<code>_completo<\/code>)<\/td><td>GPIO5<\/td><td>Sa\u00edda \u2192 rel\u00e9<\/td><td>Pulso de 1 s: abre ou fecha o port\u00e3o<\/td><\/tr><tr><td><strong>Parcial<\/strong> (<code>_parcial<\/code>)<\/td><td>GPIO4<\/td><td>Sa\u00edda \u2192 rel\u00e9<\/td><td>Pulso de 1 s: abertura pedonal<\/td><\/tr><tr><td><strong>Luz Exterior<\/strong><\/td><td>GPIO16<\/td><td>Sa\u00edda \u2192 rel\u00e9<\/td><td>Interruptor liga\/desliga da ilumina\u00e7\u00e3o<\/td><\/tr><tr><td><strong>Port\u00e3o Fechado<\/strong><\/td><td>GPIO14<\/td><td>Entrada<\/td><td>Fim de curso de fecho (<code>closed_endstop<\/code>)<\/td><\/tr><tr><td><strong>Port\u00e3o 1\/4 Aberto<\/strong><\/td><td>GPIO12<\/td><td>Entrada<\/td><td>Posi\u00e7\u00e3o interm\u00e9dia (<code>open_midle<\/code>)<\/td><\/tr><tr><td><strong>Port\u00e3o Aberto<\/strong><\/td><td>GPIO13<\/td><td>Entrada<\/td><td>Fim de curso de abertura (<code>open_endstop<\/code>)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Duas prote\u00e7\u00f5es merecem destaque. A primeira \u00e9 o <strong>interlock<\/strong>: o YAML define um grupo (<code>interlock: &amp;interlock_group [_parcial, _completo]<\/code>) que impede que os dois rel\u00e9s de movimento estejam ativos ao mesmo tempo \u2014 imposs\u00edvel pedir \u00ababrir\u00bb e \u00abfechar\u00bb em simult\u00e2neo. A segunda \u00e9 o <strong>modo moment\u00e2neo<\/strong>: cada rel\u00e9 de movimento desliga-se sozinho ao fim de 1 segundo, tal como um dedo a carregar no bot\u00e3o do telemando.<\/p>\n\n\n\n<div class=\"hbc-callout hbc-callout--tip\">\r\n\t<span class=\"hbc-callout__icon\">OK<\/span>\r\n\t<p>Os tr\u00eas finais de curso usam <code>delayed_on: 1000ms<\/code> e <code>delayed_off: 1000ms<\/code>. Sem este filtro, a vibra\u00e7\u00e3o do port\u00e3o em movimento faria o estado oscilar e o <em>cover<\/em> saltaria entre \u00aba abrir\u00bb e \u00aba fechar\u00bb. Com o filtro, s\u00f3 uma posi\u00e7\u00e3o confirmada durante um segundo completa \u00e9 publicada.<\/p>\r\n<\/div>\n\n\n\n<h2 id=\"yaml\" class=\"wp-block-heading\">O YAML, bloco a bloco<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O ficheiro <code>portao.yaml<\/code> tem uma estrutura limpa e comentada. Estes s\u00e3o os excertos que interessam, do rel\u00e9 ao <em>cover<\/em>:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rel\u00e9s moment\u00e2neos com interlock<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">switch<\/span>:\n  - platform: gpio\n    <span class=\"hljs-attr\">pin<\/span>: GPIO4\n    <span class=\"hljs-attr\">id<\/span>: _parcial\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Parcial\"<\/span>\n    <span class=\"hljs-attr\">icon<\/span>: <span class=\"hljs-string\">\"mdi:gate\"<\/span>\n    <span class=\"hljs-attr\">on_turn_on<\/span>:\n      - delay: <span class=\"hljs-number\">1000<\/span>ms\n      - <span class=\"hljs-keyword\">switch<\/span>.turn_off: _parcial\n    <span class=\"hljs-attr\">interlock<\/span>: &amp;interlock_group &#91;_parcial, _completo]\n\n  - platform: gpio\n    <span class=\"hljs-attr\">pin<\/span>: GPIO5\n    <span class=\"hljs-attr\">id<\/span>: _completo\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Step\"<\/span>\n    <span class=\"hljs-attr\">icon<\/span>: <span class=\"hljs-string\">\"mdi:gate\"<\/span>\n    <span class=\"hljs-attr\">on_turn_on<\/span>:\n      - delay: <span class=\"hljs-number\">1000<\/span>ms\n      - <span class=\"hljs-keyword\">switch<\/span>.turn_off: _completo\n    <span class=\"hljs-attr\">interlock<\/span>: *interlock_group<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Fim de curso que alimenta o estado do cover<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cada sensor publica diretamente no <em>cover<\/em> template: quando o port\u00e3o deixa de estar fechado, o estado passa a <code>OPENING<\/code>; quando encosta no fim de curso de aberto, fica <code>IDLE<\/code>. \u00c9 assim que o Home Assistant sabe sempre onde o port\u00e3o est\u00e1 \u2014 mesmo depois de um rein\u00edcio, porque a <em>lambda<\/em> do <code>cover<\/code> l\u00ea o sensor f\u00edsico:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">binary_sensor:\n  - platform: gpio\n    <span class=\"hljs-attr\">pin<\/span>: { <span class=\"hljs-attr\">number<\/span>: GPIO14, <span class=\"hljs-attr\">mode<\/span>: INPUT, <span class=\"hljs-attr\">inverted<\/span>: <span class=\"hljs-literal\">true<\/span> }\n    <span class=\"hljs-attr\">filters<\/span>:\n      - delayed_on: <span class=\"hljs-number\">1000<\/span>ms\n      - delayed_off: <span class=\"hljs-number\">1000<\/span>ms\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Port\u00e3o Fechado\"<\/span>\n    <span class=\"hljs-attr\">id<\/span>: closed_endstop\n    <span class=\"hljs-attr\">on_press<\/span>:\n      - cover.template.publish:\n          id: door_position_sensor\n          <span class=\"hljs-attr\">current_operation<\/span>: IDLE\n          <span class=\"hljs-attr\">state<\/span>: <span class=\"hljs-string\">'CLOSED'<\/span>\n    <span class=\"hljs-attr\">on_release<\/span>:\n      - cover.template.publish:\n          id: door_position_sensor\n          <span class=\"hljs-attr\">current_operation<\/span>: OPENING\n          <span class=\"hljs-attr\">state<\/span>: <span class=\"hljs-string\">\"OPEN\"<\/span>\n\n<span class=\"hljs-attr\">cover<\/span>:\n  - platform: template\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Port\u00e3o\"<\/span>\n    <span class=\"hljs-attr\">id<\/span>: door_position_sensor\n    <span class=\"hljs-attr\">device_class<\/span>: gate\n    <span class=\"hljs-attr\">open_action<\/span>:\n      then:\n        - <span class=\"hljs-keyword\">switch<\/span>.turn_on: _completo\n    <span class=\"hljs-attr\">close_action<\/span>:\n      then:\n        - <span class=\"hljs-keyword\">switch<\/span>.turn_on: _completo\n    <span class=\"hljs-attr\">lambda<\/span>: |-\n      <span class=\"hljs-keyword\">if<\/span> (id(closed_endstop).state) {\n        <span class=\"hljs-keyword\">return<\/span> COVER_CLOSED;\n      } <span class=\"hljs-keyword\">else<\/span> {\n        <span class=\"hljs-keyword\">return<\/span> COVER_OPEN;\n      }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div class=\"hbc-callout\">\r\n\t<span class=\"hbc-callout__icon\">i<\/span>\r\n\t<p><strong>Porque \u00e9 que abrir e fechar s\u00e3o iguais?<\/strong> Num port\u00e3o comum, um pulso no mesmo bot\u00e3o alterna entre abrir e fechar. O <code>cover<\/code> do Home Assistant manda <em>open<\/em> quando queres abrir e <em>close<\/em> quando queres fechar \u2014 ambos acabam no mesmo rel\u00e9 <code>_completo<\/code>, e o pr\u00f3prio port\u00e3o decide o sentido com base no estado atual dele.<\/p>\r\n<\/div>\n\n\n\n<h2 id=\"rede\" class=\"wp-block-heading\">Rede, gest\u00e3o e atualiza\u00e7\u00f5es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A parte de rede \u00e9 onde este projeto se afasta do t\u00edpico <em>smart device<\/em>: nada depende de um servidor de fabricante. A configura\u00e7\u00e3o garante:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IP est\u00e1tico<\/strong> \u2014 o dispositivo vive sempre em <code>192.168.x.xxx<\/code>, com <em>gateway<\/em> e DNS em <code>192.168.x.xxx<\/code>. Nada de reservas DHCP que mudam o endere\u00e7o e quebram automa\u00e7\u00f5es.<\/li>\n\n\n\n<li><strong>Tr\u00eas redes Wi-Fi<\/strong> \u2014 <code>SF24A<\/code>, <code>SF24B<\/code> e <code>SF24C<\/code> com as mesmas defini\u00e7\u00f5es est\u00e1ticas: se um dos pontos de acesso cair, o ESPHome passa ao seguinte.<\/li>\n\n\n\n<li><strong>Access Point de emerg\u00eancia<\/strong> \u2014 com <code>ap: {}<\/code> e <code>captive_portal<\/code>, se nenhuma rede estiver dispon\u00edvel o dispositivo abre o seu pr\u00f3prio Wi-Fi e permite reconfigurar as credenciais pelo telem\u00f3vel.<\/li>\n\n\n\n<li><strong>Improv Serial<\/strong> \u2014 provisionamento de Wi-Fi pela porta s\u00e9rie, \u00fatil na primeira configura\u00e7\u00e3o ou em bancada.<\/li>\n\n\n\n<li><strong>OTA<\/strong> \u2014 atualiza\u00e7\u00f5es de firmware sem tocar no cabo, a partir do ESPHome no Home Assistant (ou do VS Code).<\/li>\n\n\n\n<li><strong>Web Server<\/strong> \u2014 interface local para consultar estado e logs sem abrir o Home Assistant.<\/li>\n\n\n\n<li><strong>API nativo<\/strong> \u2014 liga\u00e7\u00e3o direta ao Home Assistant, sem MQTT obrigat\u00f3rio.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">wifi<\/span>:\n  <span class=\"hljs-selector-tag\">ap<\/span>: {}\n  <span class=\"hljs-selector-tag\">networks<\/span>:\n    <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">ssid<\/span>: <span class=\"hljs-selector-tag\">SF24A<\/span>\n      <span class=\"hljs-selector-tag\">password<\/span>: \"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\"\n      <span class=\"hljs-selector-tag\">manual_ip<\/span>:\n        <span class=\"hljs-selector-tag\">static_ip<\/span>: 192<span class=\"hljs-selector-class\">.168<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.227<\/span>\n        <span class=\"hljs-selector-tag\">gateway<\/span>: 192<span class=\"hljs-selector-class\">.168<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.254<\/span>\n        <span class=\"hljs-selector-tag\">subnet<\/span>: 255<span class=\"hljs-selector-class\">.255<\/span><span class=\"hljs-selector-class\">.255<\/span><span class=\"hljs-selector-class\">.0<\/span>\n        <span class=\"hljs-selector-tag\">dns1<\/span>: 192<span class=\"hljs-selector-class\">.168<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.254<\/span>\n\n<span class=\"hljs-selector-tag\">captive_portal<\/span>:<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div class=\"hbc-callout hbc-callout--warn\">\r\n\t<span class=\"hbc-callout__icon\">!<\/span>\r\n\t<p><strong>Antes de publicar o YAML:<\/strong> as palavras-passe do Wi-Fi ficam em texto no ficheiro \u2014 mant\u00e9m o <code>portao.yaml<\/code> fora de reposit\u00f3rios p\u00fablicos. Recomenda-se ainda definir <code>api: encryption_key<\/code> para cifrar a liga\u00e7\u00e3o ao Home Assistant e <code>ota: password<\/code> para proteger as atualiza\u00e7\u00f5es. Com IP est\u00e1tico, reserva tamb\u00e9m o endere\u00e7o no router para n\u00e3o haver conflitos.<\/p>\r\n<\/div>\n\n\n\n<h2 id=\"instalacao\" class=\"wp-block-heading\">Instala\u00e7\u00e3o passo a passo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do ficheiro em branco ao port\u00e3o control\u00e1vel pelo telem\u00f3vel, em seis passos:<\/p>\n\n\n\n<ol class=\"wp-block-list hbc-steps\">\n<li><strong>Liga a fia\u00e7\u00e3o em bancada.<\/strong> Monta ESP8266 + m\u00f3dulo rel\u00e9 + os tr\u00eas finais de curso numa protoboard e testa tudo antes de ir \u00e0 garagem. Confirma que o interlock impede os dois rel\u00e9s de fechar ao mesmo tempo.<\/li>\n\n\n\n<li><strong>Grava o firmware.<\/strong> Importa <code>portao.yaml<\/code> no ESPHome (Home Assistant \u2192 ESPHome \u2192 Add Device), corrige as credenciais Wi-Fi e envia via OTA ou USB.<\/li>\n\n\n\n<li><strong>Adiciona ao Home Assistant.<\/strong> O dispositivo aparece em <em>Dispositivos &amp; Servi\u00e7os<\/em>; aceita a liga\u00e7\u00e3o API e as entidades <em>Port\u00e3o<\/em>, <em>Luz Exterior<\/em> e os diagn\u00f3sticos ficam dispon\u00edveis.<\/li>\n\n\n\n<li><strong>Instala na central do port\u00e3o.<\/strong> Liga os rel\u00e9s aos contactos do comando original e os finais de curso aos pontos de dete\u00e7\u00e3o. Alimenta o conjunto com 5\u00a0V e fixa a caixa junto \u00e0 central.<\/li>\n\n\n\n<li><strong>Calibra os finais de curso.<\/strong> Usa o <em>logger<\/em> do ESPHome para verificar <code>CLOSED<\/code>\/<code>OPEN<\/code> e ajusta a posi\u00e7\u00e3o dos sensores at\u00e9 os tr\u00eas estados baterem certo com a posi\u00e7\u00e3o real do port\u00e3o.<\/li>\n\n\n\n<li><strong>Monta o dashboard e as automa\u00e7\u00f5es.<\/strong> Adiciona o <em>cover<\/em> ao painel, a luz exterior a um <em>tile<\/em> e cria as automa\u00e7\u00f5es de fecho autom\u00e1tico (ver sec\u00e7\u00e3o seguinte).<\/li>\n<\/ol>\n\n\n\n<h2 id=\"home-assistant\" class=\"wp-block-heading\">No Home Assistant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Depois de pareado, o dispositivo cria um conjunto de entidades pronto a usar. \u00c9 no dashboard que o projeto ganha vida:<\/p>\n\n\n\n<div class=\"hbc-features\">\r\n\r\n\t<div class=\"hbc-feature\">\r\n\t\t<span class=\"hbc-feature__num\">01<\/span>\r\n\t\t<h3 class=\"hbc-feature__title\">Cart\u00e3o do port\u00e3o<\/h3>\r\n\t\t<p>O <em>cover<\/em> <strong>Port\u00e3o<\/strong> mostra estado e a\u00e7\u00e3o num s\u00f3 s\u00edtio: toca para abrir, toca e segura para parar, desliza para pedir abertura parcial. Funciona no telem\u00f3vel, no tablet de parede e no browser.<\/p>\r\n\t<\/div>\r\n\r\n\t<div class=\"hbc-feature\">\r\n\t\t<span class=\"hbc-feature__num\">02<\/span>\r\n\t\t<h3 class=\"hbc-feature__title\">Luz exterior<\/h3>\r\n\t\t<p>O interruptor <strong>Luz Exterior<\/strong> (<code>mdi:car-light-dimmed<\/code>) controla a ilumina\u00e7\u00e3o da garagem e pode ser agrupado com o port\u00e3o num \u00fanico cart\u00e3o ou num <em>tile<\/em> do dashboard.<\/p>\r\n\t<\/div>\r\n\r\n\t<div class=\"hbc-feature\">\r\n\t\t<span class=\"hbc-feature__num\">03<\/span>\r\n\t\t<h3 class=\"hbc-feature__title\">Diagn\u00f3stico sempre vis\u00edvel<\/h3>\r\n\t\t<p>Sinal Wi-Fi (a cada 10&nbsp;s), <em>uptime<\/em>, vers\u00e3o do ESPHome e SSID da rede \u2014 entidades que resolvem 90% dos problemas \u00e0 dist\u00e2ncia, sem ir \u00e0 garagem.<\/p>\r\n\t<\/div>\r\n\r\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Automa\u00e7\u00f5es que valem a pena<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Com o port\u00e3o exposto como <em>cover<\/em>, qualquer automa\u00e7\u00e3o \u00e9 poss\u00edvel. Estas tr\u00eas s\u00e3o as mais \u00fateis no dia a dia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fecho autom\u00e1tico<\/strong> \u2014 se o port\u00e3o ficar aberto mais de 10 minutos sem movimento, fecha-o e envia uma notifica\u00e7\u00e3o.<\/li>\n\n\n\n<li><strong>Luz ao abrir<\/strong> \u2014 ao detetar <code>current_operation: opening<\/code> \u00e0 noite, liga a luz exterior; dois minutos depois de <code>IDLE<\/code>, desliga.<\/li>\n\n\n\n<li><strong>Modo sa\u00edda de casa<\/strong> \u2014 um <em>scene<\/em> que fecha o port\u00e3o, apaga a luz e desliga a sa\u00edda quando sares de casa.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">alias<\/span>: <span class=\"hljs-selector-tag\">Port<\/span>\u00e3<span class=\"hljs-selector-tag\">o<\/span> <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">fecho<\/span> <span class=\"hljs-selector-tag\">autom<\/span>\u00e1<span class=\"hljs-selector-tag\">tico<\/span>\n<span class=\"hljs-selector-tag\">trigger<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">platform<\/span>: <span class=\"hljs-selector-tag\">state<\/span>\n    <span class=\"hljs-selector-tag\">entity_id<\/span>: <span class=\"hljs-selector-tag\">cover<\/span><span class=\"hljs-selector-class\">.portao<\/span>\n    <span class=\"hljs-selector-tag\">to<\/span>: \"<span class=\"hljs-selector-tag\">open<\/span>\"\n    <span class=\"hljs-selector-tag\">for<\/span>:\n      <span class=\"hljs-selector-tag\">minutes<\/span>: 10\n<span class=\"hljs-selector-tag\">condition<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">condition<\/span>: <span class=\"hljs-selector-tag\">state<\/span>\n    <span class=\"hljs-selector-tag\">entity_id<\/span>: <span class=\"hljs-selector-tag\">cover<\/span><span class=\"hljs-selector-class\">.portao<\/span>\n    <span class=\"hljs-selector-tag\">state<\/span>: \"<span class=\"hljs-selector-tag\">open<\/span>\"\n<span class=\"hljs-selector-tag\">action<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">service<\/span>: <span class=\"hljs-selector-tag\">cover<\/span><span class=\"hljs-selector-class\">.close_cover<\/span>\n    <span class=\"hljs-selector-tag\">target<\/span>:\n      <span class=\"hljs-selector-tag\">entity_id<\/span>: <span class=\"hljs-selector-tag\">cover<\/span><span class=\"hljs-selector-class\">.portao<\/span>\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">service<\/span>: <span class=\"hljs-selector-tag\">notify<\/span><span class=\"hljs-selector-class\">.mobile_app<\/span>\n    <span class=\"hljs-selector-tag\">data<\/span>:\n      <span class=\"hljs-selector-tag\">message<\/span>: \"<span class=\"hljs-selector-tag\">Port<\/span>\u00e3<span class=\"hljs-selector-tag\">o<\/span> <span class=\"hljs-selector-tag\">da<\/span> <span class=\"hljs-selector-tag\">garagem<\/span> <span class=\"hljs-selector-tag\">fechado<\/span> <span class=\"hljs-selector-tag\">automaticamente<\/span>.\"<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 id=\"diagnostico\" class=\"wp-block-heading\">Diagn\u00f3stico e boas pr\u00e1ticas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando algo falha, os quatro pontos abaixo resolvem quase sempre o problema:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>O port\u00e3o n\u00e3o responde no HA.<\/strong> V\u00ea o sinal Wi-Fi e o <em>uptime<\/em>: se o dispositivo reiniciou de forma repetida, verifica a alimenta\u00e7\u00e3o de 5\u00a0V (rel\u00e9s a puxar corrente demais \u00e9 a causa cl\u00e1ssica \u2014 usa uma fonte com margem).<\/li>\n\n\n\n<li><strong>Estado errado ap\u00f3s um rein\u00edcio.<\/strong> O <em>cover<\/em> confia no fim de curso <code>closed_endstop<\/code>. Se o port\u00e3o est\u00e1 fechado e o sensor n\u00e3o est\u00e1 ativado, o HA mostrar\u00e1 <em>aberto<\/em>; recalibra a posi\u00e7\u00e3o do fim de curso.<\/li>\n\n\n\n<li><strong>Estados a saltitar.<\/strong> Aumenta os filtros <code>delayed_on\/off<\/code> (por exemplo para 2000\u00a0ms) \u2014 indica vibra\u00e7\u00e3o do port\u00e3o ou contacto do fim de curso a falhar.<\/li>\n\n\n\n<li><strong>Perdeu a liga\u00e7\u00e3o Wi-Fi.<\/strong> Liga ao AP de emerg\u00eancia com o telem\u00f3vel, reentra as credenciais e o dispositivo volta a ligar-se \u00e0s redes configuradas, mantendo o IP est\u00e1tico.<\/li>\n<\/ol>\n\n\n\n<div class=\"hbc-callout hbc-callout--tip\">\r\n\t<span class=\"hbc-callout__icon\">OK<\/span>\r\n\t<p>Antes de qualquer altera\u00e7\u00e3o grande, exporta o <code>portao.yaml<\/code>. O ESPHome guarda o hist\u00f3rico no Home Assistant, mas um ficheiro de c\u00f3pia em local seguro torna qualquer regress\u00e3o instant\u00e2nea.<\/p>\r\n<\/div>\n\n\n\n<h2 id=\"conclusao\" class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>ESPPortao<\/strong> prova que n\u00e3o \u00e9 preciso um kit caro nem uma liga\u00e7\u00e3o \u00e0 nuvem para ter um port\u00e3o inteligente. Com uma placa de poucos euros, tr\u00eas rel\u00e9s e tr\u00eas finais de curso, obt\u00e9m-se o que os sistemas comerciais oferecem \u2014 estados fi\u00e1veis, controlo total e integra\u00e7\u00e3o nativa \u2014 e ainda se mant\u00e9m o comando original intacto como alternativa f\u00edsica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 um projeto replic\u00e1vel: copia o <code>portao.yaml<\/code>, ajusta os GPIO \u00e0s tuas liga\u00e7\u00f5es, calibra os finais de curso e tens o port\u00e3o no dashboard ao fim de uma tarde. Tudo local, tudo teu.<\/p>\n\n\n\n<div class=\"hbc-cta\">\r\n\t<h3>Quer montar o teu?<\/h3>\r\n\t<p>A documenta\u00e7\u00e3o do ESPHome e do Home Assistant cobre tudo o que \u00e9 preciso para dar o primeiro passo \u2014 e o YAML deste artigo serve de ponto de partida.<\/p>\r\n\t<div class=\"hbc-cta__actions\">\r\n\t\t<a class=\"holo-btn\" href=\"https:\/\/esphome.io\/components\/cover\/template.html\" target=\"_blank\" rel=\"noopener\">ESPHome \u00b7 Cover template<\/a>\r\n\t\t<a class=\"holo-btn\" href=\"https:\/\/www.home-assistant.io\/integrations\/cover\/\" target=\"_blank\" rel=\"noopener\">Home Assistant \u00b7 Covers<\/a>\r\n\t<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Port\u00e3o de garagem inteligente com ESP8266 e ESPHome: abertura total e pedonal, tr\u00eas fins de curso, luz exterior e entidade cover nativa no Home Assistant \u2014 local e sem nuvem.<\/p>\n","protected":false},"author":1,"featured_media":31,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,5],"tags":[16,14,13,15,11],"class_list":["post-26","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esphome","category-home-assistant","tag-automacao","tag-esp8266","tag-esphome","tag-portao","tag-yaml"],"_links":{"self":[{"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":5,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"predecessor-version":[{"id":34,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/posts\/26\/revisions\/34"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/media\/31"}],"wp:attachment":[{"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sfelectronica.com\/bit\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}