ESPHome: Aumentando a segurança da sua fechadura caseira

image

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.

image

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.

3 curtidas

ainda fiquei em duvida no node red

O código para importar o fluxo no node-red está ali, bem abaixo da imagem do fluxo, basta importar no seu e ver todos os detalhes.