Home Assistant

Everything to do with Home Assistant

Dual Garage Door Opener

Using ESPHome

This is code for dual garage door opener and will show red when door is opened

Dashboard

image.png

This is built using a

ESP32

and some magnet switches

REED

The REED is only one per door

substitutions:
  name: sfl-garage-001
  friendly_name: SFL-GARAGE-001

esphome:
  name: ${name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}

# Enable Home Assistant API
api:
  encryption:
    key: "XXXX"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Sfl-Garage-001 Fallback Hotspot"
    password: "XXX"

esp32:
  board: esp32dev
  framework:
    type: esp-idf

ota:
  - platform: esphome
    password: "XXXX"

# Enable logging
logger: 
  level: ERROR

# Enable Web Server (optional, for testing)
web_server:
  port: 80
  
# Enable Bluetooth Proxy
bluetooth_proxy:
  active: true # Enables active connections to devices like locks and SwitchBots
    
captive_portal:

# --- SWITCHES (RELAYS) ---
switch:
  - platform: gpio
    pin: GPIO25
    inverted: true
    name: "Door 1 Button"
    id: garage_button_1
    on_turn_on:
      - delay: 500ms
      - switch.turn_off: garage_button_1

  - platform: gpio
    pin: GPIO32
    inverted: true
    name: "Door 2 Button"
    id: garage_button_2
    on_turn_on:
      - delay: 500ms
      - switch.turn_off: garage_button_2

# --- BINARY SENSORS (REED SWITCHES) ---
binary_sensor:
  - platform: gpio
    pin:
      number: GPIO05
      mode: INPUT_PULLUP
      inverted: false  # or false, depending on your wiring
    name: "Door 1 Sensor"
    id: garage_sensor_1
    icon: "mdi:garage"
    device_class: garage_door
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms

  - platform: gpio
    pin:
      number: GPIO04
      mode: INPUT_PULLUP
      inverted: false  # or false, depending on your wiring
    name: "Door 2 Sensor"
    id: garage_sensor_2
    icon: "mdi:garage"
    device_class: garage_door
    filters:
      - delayed_on: 100ms
      - delayed_off: 100ms

# --- HOME ASSISTANT COVERS ---
cover:
  - platform: template
    name: "Door 1"
    device_class: garage
    optimistic: false   # Let the sensor drive the state (more reliable)
    lambda: |-
      if (id(garage_sensor_1).state) {
        return COVER_CLOSED;
      } else {
        return COVER_OPEN;
      }
    open_action:
      - switch.turn_on: garage_button_1
    close_action:
      - switch.turn_on: garage_button_1
    stop_action:
      - switch.turn_on: garage_button_1

  - platform: template
    name: "Door 2"
    device_class: garage
    optimistic: false   # Let the sensor drive the state (more reliable)
    lambda: |-
      if (id(garage_sensor_2).state) {
        return COVER_CLOSED;
      } else {
        return COVER_OPEN;
      }
    open_action:
      - switch.turn_on: garage_button_2
    close_action:
      - switch.turn_on: garage_button_2
    stop_action:
      - switch.turn_on: garage_button_2