Este post traz uma forma de integrar um relé em uso em um ESP (NodeMCU, etc) para acionamento de uma fechadura com um pouco mais de segurança.
Integrar fechaduras por meio de sistemas simples como ESP/NodeMCU e relés não é a forma mais segura. Esse post não encoraja você a fazer isso, mas te mostra um forma mais segura de fazer que não expõe uma entidade switch
, que é facilmente acionável (inclusive acidentalmente) sem nenhum tipo de restrição por qualquer usuário do HA.
Para isso foi utilizado o ESPHome, a ideia é configurar um serviço que seja executado apenas com um parâmetro code
que deve ser igual ao que está configurado no ESP. Para operacionalizar isso de forma invisível ao usuário na interface foi utilizado um painel de alarme do HA para digitar a senha de abertura do portão que aciona uma automação no nodered (que pode ser facilmente migrada para as automações do HA).
Para melhorar a segurança foi definida senhas para configuração da API do HA (adicionar à integrações) e para atualizar o ESP via OTA.
Todas essas informações importantes (senhas OTA e API, código da fechadura , código do painel de alarme e a configuração da rede wifi) estão armazenadas no arquivo secrets.yaml
(ver aqui e aqui para mais detalhes de configuração e uso).
Ao clicar no botão no lovelace é aberto o painel de alarme, onde ao digitar o código correto é acionada a fechadura.
Exemplo do código no ESPHome:
substitutions:
#Configurações:
Plataforma: ESP8266
TipoPlaca: d1_mini
hostname: 'espfechadura' #Hostname do dispositivo na rede
PrefixoNome: "Fechadura - "
RedeWifi: !secret RedeWifi #Nome da rede wifi que o dispositivo irá se conectar
SenhaWifi: !secret SenhaWifi #Senha da rede wifi que o dispositivo irá se conectar
SenhaWifiReconfig: !secret SenhaWifiReconfig #Senha do AP Wifi para reconfiguração do wifi do dispositivo
EndConfig: ${hostname}.local #192.168.1.50 #Endereço para configuração (IP que o esp está acessível atualmente na rede), especialmente usado quando quer alterar o hostname via OTA
WifiOculto: 'False' #Se a rede wifi está oculta defina como 'True'
WifiFastConnect: 'False' #Se o esp realizará a conexão à rede wifi sem escanear as redes disponíveis defina como 'True'
SenhaAPI: !secret SenhaAPI #Senha para adicionar o esp no HA
SenhaOTA: !secret SenhaOTA #Senha para atualizar o firmware do esp via OTA
CodeFechadura: !secret CodeFechadura
esphome:
name: $hostname
platform: ${Plataforma}
board: ${TipoPlaca}
wifi:
networks:
- ssid: ${RedeWifi}
password: ${SenhaWifi}
hidden: ${WifiOculto}
fast_connect: ${WifiFastConnect}
use_address: ${EndConfig}
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${hostname}_WIFI
password: ${SenhaWifiReconfig}
#Habilita um AP Wifi para reconfigurar em caso de perda de conexão com a rede configurada
captive_portal:
# Enable logging
logger:
#Habilita a api para comunicar com o Home Assistant
api:
password: ${SenhaAPI}
services:
- service: aciona_fechadura
variables:
code: string
then:
- if:
condition:
lambda: "return code == \"${CodeFechadura}\";"
then:
- binary_sensor.template.publish:
id: ${hostname}_fechadura_acionada
state: ON
- switch.turn_on: ${hostname}_PD5
- delay: 1000ms
- switch.turn_off: ${hostname}_PD5
- binary_sensor.template.publish:
id: ${hostname}_fechadura_acionada
state: OFF
else:
- logger.log: "Erro CodeFechadura"
- binary_sensor.template.publish:
id: ${hostname}_fechadura_code_erro
state: ON
- delay: 500ms
- binary_sensor.template.publish:
id: ${hostname}_fechadura_code_erro
state: OFF
#Habilita a atualização de firmware por OTA
ota:
password: ${SenhaOTA}
switch:
#Comando reinicilizar esp remotamente
- platform: restart
id: ${hostname}_restart
name: ${PrefixoNome} Reiniciar
icon: mdi:restart
#Saída Fechadura
- platform: gpio
id: ${hostname}_PD5
pin: D7
name: "Fechadura Portão"
internal: true
icon: mdi:key-variant
restore_mode: ALWAYS_OFF
text_sensor:
#Informações da conexão wifi
- platform: wifi_info
#Endereço IP
ip_address:
id: ${hostname}_IP
name: ${PrefixoNome} Endereço IP
icon: mdi:ip-network
#Nome da Rede
ssid:
id: ${hostname}_SSID
name: ${PrefixoNome} Rede Wifi
icon: mdi:wifi
#Informação da versão da compilação
- platform: version
id: ${hostname}_versao
name: ${PrefixoNome} Versão
icon: mdi:information
sensor:
#Sensor Intensidade Sinal Wifi
- platform: wifi_signal
id: ${hostname}_wifi_sinal
name: ${PrefixoNome} Intensidade Wifi
icon: mdi:signal
update_interval: 10s
binary_sensor:
#Status (conectado ou desconectado)
- platform: status
id: ${hostname}_status
name: ${PrefixoNome} Status
device_class: connectivity
#Sensores com os pinos gpio
#Fechadura Acionada
- platform: template
id: ${hostname}_fechadura_acionada
name: Fechadura Portão - Acionada
device_class: power
#Erro CodeFechadura
- platform: template
id: ${hostname}_fechadura_code_erro
name: Fechadura Portão - Erro Code
device_class: safety
Código para configurar o painel de alarme:
alarm_control_panel:
- platform: manual
name: Abertura Portão Social
code: !secret portao_social_code
code_arm_required: false
arming_time: 0
delay_time: 0
Botão para o lovelace para chamar o painel de alarme:
type: button
entity: alarm_control_panel.abertura_portao_social
show_state: false
icon: mdi:key-variant
show_name: true
show_icon: true
icon_height: 30px
name: Abertura P. Social
Configuração no nodered:
A lógica no nodered é: após o painel de alarme ser desarmando ele chama o serviço aciona_fechadura
do ESPHome e o serviço alarm_arm_home
do painel de alarme.
Código para importação no node-red:
[{"id":"6b5948877341961e","type":"tab","label":"Flow 8","disabled":false,"info":""},{"id":"7643276fb367ffb3","type":"comment","z":"6b5948877341961e","name":"Abertura Portão Social","info":"","x":140,"y":80,"wires":[]},{"id":"da9efc1eb370a5b4","type":"server-state-changed","z":"6b5948877341961e","name":"Portão Destravado","server":"a6abbabc.4e9208","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"alarm_control_panel.abertura_portao_social","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"disarmed","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":true,"ignorePrevStateUnknown":true,"ignorePrevStateUnavailable":true,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":150,"y":140,"wires":[["30c180dcdb7c97c8","9871d10061ede964"],[]]},{"id":"9871d10061ede964","type":"api-call-service","z":"6b5948877341961e","name":"Destrava Portão","server":"a6abbabc.4e9208","version":3,"debugenabled":false,"service_domain":"esphome","service":"espfechadura_aciona_fechadura","entityId":"","data":"{\"code\":\"aqui_seu_codigo_config_esphome\"}","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":360,"y":200,"wires":[[]]},{"id":"30c180dcdb7c97c8","type":"api-call-service","z":"6b5948877341961e","name":"Arma Trava Portão","server":"a6abbabc.4e9208","version":3,"debugenabled":false,"service_domain":"alarm_control_panel","service":"alarm_arm_home","entityId":"alarm_control_panel.abertura_portao_social","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":370,"y":140,"wires":[[]]},{"id":"a6abbabc.4e9208","type":"server","name":"Home Assistant Casa","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
Você pode ao invés de informar o code necessário para executar o serviço aciona_fechadura
diretamente no node no NodeRed utilizar a implementação que lê o seu arquivo secrets.yaml
, como mostra o post a seguir:
A desvantagem é que não é possível alterar alguns termos que aparece no painel de alarme, mas é funcional.