2022-05-11 16:41:13 +10:00
|
|
|
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
|
2022-08-24 13:50:56 +10:00
|
|
|
# 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
|
2022-05-11 16:41:13 +10:00
|
|
|
|
|
|
|
- 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
|