135 lines
3.5 KiB
YAML
135 lines
3.5 KiB
YAML
|
substitutions:
|
||
|
node_name: "front-gate"
|
||
|
friendly_name: "Front Gate"
|
||
|
|
||
|
esphome:
|
||
|
platform: ESP8266
|
||
|
board: esp8285
|
||
|
|
||
|
packages:
|
||
|
base: !include common/base.yaml
|
||
|
|
||
|
logger:
|
||
|
level: DEBUG
|
||
|
|
||
|
web_server:
|
||
|
version: 2
|
||
|
include_internal: true
|
||
|
|
||
|
binary_sensor:
|
||
|
- platform: gpio
|
||
|
name: "${friendly_name} Contact"
|
||
|
disabled_by_default: true
|
||
|
device_class: garage_door
|
||
|
id: contact
|
||
|
pin:
|
||
|
number: GPIO4
|
||
|
inverted: false
|
||
|
mode: INPUT_PULLUP
|
||
|
filters:
|
||
|
# Takes advantage of the fact that gate movement causes this GPIO pin to
|
||
|
# flicker (probably due to wire moving). We can use that initial change
|
||
|
# in state as a signal to set the cover operation. Later, when the final
|
||
|
# value settles (after debounces) we can set it back to idle.
|
||
|
- lambda: |-
|
||
|
if(id(gate).current_operation == CoverOperation::COVER_OPERATION_IDLE) {
|
||
|
id(gate).current_operation = (x ? COVER_OPERATION_CLOSING : COVER_OPERATION_OPENING);
|
||
|
id(gate).publish_state();
|
||
|
}
|
||
|
return x;
|
||
|
|
||
|
# during gate movement, the wire movement seems to cause the state to rapidly flicker
|
||
|
- delayed_on_off: 5000ms
|
||
|
|
||
|
- lambda: |-
|
||
|
id(gate).current_operation = COVER_OPERATION_IDLE;
|
||
|
id(gate).publish_state();
|
||
|
return x;
|
||
|
|
||
|
on_state:
|
||
|
then:
|
||
|
- cover.template.publish:
|
||
|
id: gate
|
||
|
current_operation: IDLE
|
||
|
|
||
|
- platform: gpio
|
||
|
pin:
|
||
|
number: GPIO14
|
||
|
mode: INPUT_PULLUP
|
||
|
inverted: true
|
||
|
name: "${friendly_name} Button"
|
||
|
disabled_by_default: true
|
||
|
on_multi_click:
|
||
|
- timing:
|
||
|
- ON for at most 1s
|
||
|
- OFF for at least 0.2s
|
||
|
then:
|
||
|
switch.turn_on: relay
|
||
|
- timing:
|
||
|
- ON for at least 4s
|
||
|
then:
|
||
|
button.press: restart_button # in common/base.yaml
|
||
|
|
||
|
button:
|
||
|
- platform: template
|
||
|
name: "${friendly_name} Button"
|
||
|
on_press:
|
||
|
then:
|
||
|
- if:
|
||
|
condition:
|
||
|
- switch.is_off: relay
|
||
|
then:
|
||
|
- switch.turn_on: relay
|
||
|
|
||
|
switch:
|
||
|
- platform: gpio
|
||
|
pin: GPIO5
|
||
|
name: "${friendly_name} Relay"
|
||
|
id: relay
|
||
|
disabled_by_default: true
|
||
|
on_turn_on:
|
||
|
- light.turn_on: wifi_led
|
||
|
- delay: 1s
|
||
|
- switch.turn_off: relay
|
||
|
- light.turn_off: wifi_led
|
||
|
|
||
|
light:
|
||
|
- platform: status_led
|
||
|
name: "${friendly_name} WiFi LED"
|
||
|
id: wifi_led
|
||
|
disabled_by_default: true
|
||
|
pin: GPIO12
|
||
|
|
||
|
cover:
|
||
|
- platform: template
|
||
|
id: gate
|
||
|
device_class: garage
|
||
|
name: "${friendly_name}"
|
||
|
lambda: "return id(contact).state ? COVER_CLOSED : COVER_OPEN;"
|
||
|
open_action:
|
||
|
- if:
|
||
|
condition:
|
||
|
and:
|
||
|
- switch.is_off: relay
|
||
|
- binary_sensor.is_on: contact # GATE IS CLOSED
|
||
|
- lambda: return id(gate).current_operation == COVER_OPERATION_IDLE; # GATE IS IDLE
|
||
|
then:
|
||
|
- switch.turn_on: relay
|
||
|
stop_action:
|
||
|
- if:
|
||
|
condition:
|
||
|
and:
|
||
|
- binary_sensor.is_on: contact
|
||
|
- lambda: return id(gate).current_operation != COVER_OPERATION_IDLE; # GATE IS ACTIVE
|
||
|
then:
|
||
|
- switch.turn_on: relay
|
||
|
close_action:
|
||
|
- if:
|
||
|
condition:
|
||
|
and:
|
||
|
- switch.is_off: relay
|
||
|
- binary_sensor.is_off: contact # GATE NOT CLOSED
|
||
|
- lambda: return id(gate).current_operation == COVER_OPERATION_IDLE; # GATE IS IDLE
|
||
|
then:
|
||
|
- switch.turn_on: relay
|