Boas,
Novidades. O portão é controlado apenas por um SW, ou seja, se está fechado abre, se está a abrir pára e se voltarmos a carregar fecha.
Usei Esphome num D1 mini , tem 4 sensores, os reed do totalmente aberto, o reed do fechado, o sentido do motor e se o motor está ou não a trabalhar. A ideia é, consoante o estado fazer o numero de “button press” para controlar o portão.
esphome:
name: portao_garagem
platform: ESP8266
board: d1_mini
on_boot:
priority: -10
# Aberto=1, Fechado=2, Parado=3, A Abrir = 4, A Fechar =5
then:
- lambda: |-
id(rele_sw).turn_off();
if (id(fim_curso_aberto).state == true && id(fim_curso_fechado).state == false )
{
id(estado)='1';
}
else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == true )
{
id(estado)='2';
}
else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_motor).state == 0)
{
id(estado)='3';
}
else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_motor).state == true && id(sensor_sentido).state == false)
{
id(estado)='4';
}
else if (id(fim_curso_aberto).state == false && id(fim_curso_fechado).state == false && id(sensor_sentido).state == true && id(sensor_motor).state == true)
{
id(estado)='5';
}
wifi:
ssid: "ssid"
password: "pass"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Portao Garagem Fallback Hotspot"
password: "pass"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
password: "pass"
ota:
password: "pass"
globals:
- id: estado
type: int
restore_value: no
initial_value: '0'
- id: estado_anterior
type: int
restore_value: no
initial_value: '0'
binary_sensor:
## Sensor Movimento
- platform: gpio
pin: D8 #D6
name: "Movimento Garagem"
device_class: motion
## Sensores Portao
- platform: gpio
pin:
number: D4
mode: INPUT_PULLUP
inverted: True
id: fim_curso_aberto
internal: true
on_press:
then:
- platform: gpio
pin:
number: D5
mode: INPUT_PULLUP
inverted: True
id: fim_curso_fechado
internal: true
on_press:
then:
- platform: gpio
pin:
number: D6
mode: INPUT_PULLUP
inverted: True
id: sensor_sentido
internal: true
on_press:
then:
on_release:
then:
- platform: gpio
pin:
number: D7
mode: INPUT_PULLUP
inverted: True
id: sensor_motor
internal: true
on_press:
then:
on_release:
then:
switch:
## Relé
- platform: gpio
id: rele_sw
internal: true
pin: D1
## Botões da Entidade
- platform: template
id: abrir_sw
name: "Abrir"
icon: "mdi:arrow-up-bold"
turn_on_action:
- lambda: |-
id(stop_sw).turn_off();
id(stop_sw).publish_state(false);
id(fechar_sw).turn_off();
id(fechar_sw).publish_state(false);
id(abrir_sw).publish_state(true);
// Está fechado
if(id(estado) == '2')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
// Está parado
else if(id(estado) == '3')
{
// Estava a abrir antes de parar
if(id(estado_anterior) == '4')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
delay(500);
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
delay(500);
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
//Estava a fechar antes de parar
else if(id(estado_anterior) == '5')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
}
// Está a fechar
else if(id(estado) == '5')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
delay(500);
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
id(estado_anterior) = '4';
id(stop_sw).turn_off();
- platform: template
id: stop_sw
name: "Parar"
icon: "mdi:square"
turn_on_action:
- lambda: |-
id(abrir_sw).turn_off();
id(abrir_sw).publish_state(false);
id(fechar_sw).turn_off();
id(fechar_sw).publish_state(false);
id(stop_sw).publish_state(true);
if(id(estado) == '4' || id(estado) == '5')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
- platform: template
id: fechar_sw
name: "Fechar"
icon: "mdi:arrow-down-bold"
turn_on_action:
- lambda: |-
id(abrir_sw).turn_off();
id(abrir_sw).publish_state(false);
id(stop_sw).turn_off();
id(stop_sw).publish_state(false);
id(fechar_sw).publish_state(true);
if(id(estado) == '2')
{
id(rele_sw).turn_on();
delay(500);
id(rele_sw).turn_off();
}
Tenho uma questão, no boot faço uma verificação do estado consoante os inputs dos sensores, e a cada alteração de sensor tenciono fazer o mesmo para atualizar a entidade quando alguém altera o estado fora do sistema, queria chamar um método para não estar a repetir o mesmo código carradas de vezes, alguém sabe como fazer?
Edit: Com scritps
Outra questão, como posso inativar o botão na entidade para não ser possível premir? (como na entidade garage cover do esphome)
Obrigado desde já
Edit: o turn_on_action do fechar_sw ainda não está acabado