Boa tarde a todos,
Procurei aqui e achei poucos tópicos sobre portão eletrônico, então vou deixar aqui o código que usei no ESPHome.
Tenho 2 portões em casa, um para cada carro, então o hardware e o código que usei são para 2 portões. Caso for usar em apenas um portão, apagar as partes do código referente ao “Punto” e seguir a ligação do esquema abaixo, se for usar em 2 portões, replicar o esquema abaixo, ligando o segundo portão de acordo com a descrição dos pinos no código.
Por enquanto esta ligado apenas um portão, para ligar o segundo vou ter que abrir a caixa metálica que protege ele, pois fica virado para rua. Mas na bancada esta tudo OK.
OBS A Saída Sin da placa fica em 0V quando o portão esta fechado e 5V quando esta abrindo ou totalmente aberto, então usei ele como sensor “Fechado” e “Movendo”. E o sensor magnético para saber se esta totalmente aberto.
Esquema:
Ligar um resistor de 10k entre a GPIO e a saída SIN
Esse é o Frank:
OBS: Se for usar Shield para 2 portões tem que fazer um RTA (recurso tecnico alternativo) no segundo relé, no caso removi o pino D1 que vai na placa tripla e fiz um jumper entre D1 e D2 do relay shield. Da pra ver o jumper no lado esquerdo do shield.
esphome:
name: portao
platform: ESP8266
board: d1_mini
on_boot:
priority: -100.0
then:
- text_sensor.template.publish:
id: portao_version
state: !lambda |-
String versao = "1.0";
return (String(versao)).c_str();
# Enable logging
logger:
# Enable Home Assistant API
api:
captive_portal:
ota:
password: "bla"
wifi:
ssid: "bla"
password: "bla"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Portao Fallback Hotspot"
password: "bla"
power_save_mode: none
web_server:
port: 80
time:
- platform: sntp
id: sntp_time
timezone: "America/Sao_Paulo"
sensor:
- platform: uptime
name: Uptime Portão
id: portao_uptime_sensor
update_interval: 60s
internal: true
on_raw_value:
then:
- text_sensor.template.publish:
id: portao_uptime_human
state: !lambda |-
int seconds = round(id(portao_uptime_sensor).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? String(days) + "d " : "") +
(hours ? String(hours) + "h " : "") +
(minutes ? String(minutes) + "m " : "") +
(String(seconds) + "s")
).c_str();
text_sensor:
- platform: template
name: Uptime Portão
id: portao_uptime_human
icon: mdi:clock-start
- platform: template
name: Portão Versão
id: portao_version
icon: mdi:clock-start
######################## Up! ########################
- platform: template
name: Portão Up!
id: portao_status_up
icon: "mdi:garage-variant"
######################## Up! ########################
######################## Punto ########################
- platform: template
name: Portão Punto
id: portao_status_punto
icon: "mdi:garage-variant"
######################## Punto ########################
interval:
- interval: 30s
then:
- script.execute: check_sensors
binary_sensor:
######################## Up! #####################
### LIGADO A SAIDA Sinaleira - Luz de garagem DA PLACA ROSSI COM RESISTOR 10K
- platform: gpio
name: "Up! Fechado"
pin:
number: GPIO14 # D5 OK
inverted: true
id: portao_up_sensor_fechado
on_state:
then:
- script.execute: check_sensors
filters:
- delayed_on: 100ms
- delayed_off: 100ms
### SENSOR MAGNETICO
- platform: gpio
name: "Up! Aberto"
pin:
number: GPIO13 # D7 OK
inverted: true
mode:
input: true
pullup: true
id: portao_up_sensor_aberto
on_state:
then:
- script.execute: check_sensors
filters:
- delayed_on: 700ms #delay pois o imã do portão passa pelo o reed switch do D1 Mini
######################## Up! ########################
######################## Punto #####################
### LIGADO A SAIDA Sinaleira - Luz de garagem DA PLACA ROSSI COM RESISTOR 10K
- platform: gpio
name: "Punto Fechado"
pin:
number: GPIO12 # D6 OK
inverted: true
id: portao_punto_sensor_fechado
on_state:
then:
- script.execute: check_sensors
filters:
- delayed_on: 100ms
- delayed_off: 100ms
### SENSOR MAGNETICO
- platform: gpio
name: "Punto Aberto"
pin:
number: GPIO16 # D0 OK
mode:
input: true
pulldown: true
id: portao_punto_sensor_aberto
on_state:
then:
- script.execute: check_sensors
filters:
- delayed_on: 100ms
- delayed_off: 100ms
######################### Punto ########################
switch:
#Comando reinicilizar esp remotamente
- platform: restart
id: portao_restart
name: Reiniciar Portão
icon: mdi:restart
- platform: safe_mode
name: "Portões (Safe Mode)"
######################## Up! ########################
- platform: gpio
pin: GPIO5 # D1
id: portao_up_relay
name: "Controle Up!"
icon: "mdi:remote"
on_turn_on:
- delay: 500ms
- switch.turn_off: portao_up_relay
######################## Up! ########################
######################## Punto ########################
- platform: gpio
pin: GPIO4 # D2
id: portao_punto_relay
name: "Controle Punto"
icon: "mdi:remote"
on_turn_on:
- delay: 500ms
- switch.turn_off: portao_punto_relay
######################## Punto ########################
script:
- id: check_sensors
then:
######################## Up! ########################
- lambda: |-
if ((id(portao_up_sensor_fechado).state == 0) && (id(portao_up_sensor_aberto).state == 1)) {
id(portao_status_up).publish_state("ABERTO");
}
else if ((id(portao_up_sensor_fechado).state == 0) && (id(portao_up_sensor_aberto).state == 0)) {
id(portao_status_up).publish_state("MOVENDO");
}
else if ((id(portao_up_sensor_fechado).state == 1) && (id(portao_up_sensor_aberto).state == 0)) {
id(portao_status_up).publish_state("FECHADO");
}
else {
id(portao_status_up).publish_state("ERRO");
}
######################## Up! ########################
######################## Punto ########################
- lambda: |-
if ((id(portao_punto_sensor_fechado).state == 0) && (id(portao_punto_sensor_aberto).state == 1)) {
id(portao_status_punto).publish_state("ABERTO");
}
else if ((id(portao_punto_sensor_fechado).state == 0) && (id(portao_punto_sensor_aberto).state == 0)) {
id(portao_status_punto).publish_state("MOVENDO");
}
else if ((id(portao_punto_sensor_fechado).state == 1) && (id(portao_punto_sensor_aberto).state == 0)) {
id(portao_status_punto).publish_state("FECHADO");
}
else {
id(portao_status_punto).publish_state("ERRO");
}
######################## Punto ########################
No tasker:
1 - criar uma tarefa HTTP Request
2 - Metodo POST
3 - url:
Mudar o IP:PORTA
https://IP:PORTA/api/services/switch/turn_on
4 - Headers:
Adicionar o “TOKEN” do HA
content-type: application/json
Authorization: Bearer TOKEN
5 - Body:
Mudar a entidade, caso tenha alterado o codigo do ESPHome
{"entity_id": "switch.controle_up"}
Vai ficar assim:
Basta criar um atalho na Home do android, é bom colocar senha ou biometria para executar a tarefa e evitar acionamento acidental.
Bixby:
Exportar a tarefa criada no tasker como APP e adicionar em comandos rápidos do Bixby.
O Bixby demora a encontrar o APP após instalado, recomendo instalar o APP, executar ao menos 1 vez, reiniciar o aparelho, executar novamente e só depois adicionar aos comandos rápidos.
Agora da pra usar o comando de voz para abrir o portão