ESPHome Guide
Learn to flash and configure ESPHome.
Smart garage door control gives you remote access and status - open/close from your phone, get notifications, and automate based on presence. With the right solutions, you can avoid cloud dependency and keep control local.
| Controller | Compatibility | HA Integration | Cloud | Price |
|---|---|---|---|---|
| ratgdo | Chamberlain/LiftMaster | ESPHome (local) | No | π° |
| Konnected blaQ | Chamberlain/LiftMaster | ESPHome (local) | Optional | π°π° |
| Meross | Universal (200+ brands) | HACS/HomeKit | Yes | π° |
| ismartgate | Universal | Native | No | π°π°π° |
| Shelly 1 DIY | Universal (dry contact) | Native | Optional | π° |
Price: ~$35
ratgdo = βRage Against The Garage Door Openerβ
The best solution for Chamberlain/LiftMaster owners:
| Compatibility | Learn Button Color |
|---|---|
| Security+ 2.0 | Yellow (round) |
| Security+ 1.0 | Purple/Brown/Orange/Red |
| Dry Contact | All others |
# ratgdo is auto-discovered in HA# Go to: Settings β Devices β ESPHome
# Entities created:# - cover.ratgdo_garage_door# - light.ratgdo_light# - binary_sensor.ratgdo_obstruction# - binary_sensor.ratgdo_motion# - lock.ratgdo_remote_lock# - button.ratgdo_sync
# Example: Garage door automationautomation: - alias: "Garage - Close on departure" trigger: - platform: state entity_id: person.brian from: "home" to: "not_home" for: "00:02:00" condition: - condition: state entity_id: cover.ratgdo_garage_door state: "open" action: - service: cover.close_cover entity_id: cover.ratgdo_garage_door - service: notify.mobile_app data: title: "π Garage closed" message: "Garage door automatically closed after departure."automation: - alias: "Garage - Open on arrival" trigger: - platform: zone entity_id: device_tracker.brians_iphone zone: zone.home event: enter condition: - condition: state entity_id: cover.ratgdo_garage_door state: "closed" - condition: time after: "06:00:00" before: "23:00:00" action: - service: cover.open_cover entity_id: cover.ratgdo_garage_door - service: light.turn_on entity_id: light.ratgdo_light
- alias: "Garage - Auto-close after 10 min" trigger: - platform: state entity_id: cover.ratgdo_garage_door to: "open" for: "00:10:00" action: - service: notify.mobile_app data: title: "β οΈ Garage still open" message: "Garage door has been open for 10 minutes. Close now?" data: actions: - action: "CLOSE_GARAGE" title: "Close garage"Buy: ratcloud.llc, Amazon
Price: ~$70
Commercial version of the ratgdo concept:
# ESPHome integration - same as ratgdo# Auto-discovered in Home Assistant
cover: - platform: template name: "Garage Door" device_class: garage open_action: - service: cover.open_cover entity_id: cover.blaq_garage_doorBuy: Konnected.io
Price: ~$40
Universal garage door controller:
| Model | Function |
|---|---|
| MSG100HK | Universal (HomeKit) |
| MSG150HK | Chamberlain/LiftMaster direct |
# Meross HomeKit version auto-discovered# Settings β Devices β HomeKit Controller
# Entities:# - cover.meross_garage_door# - binary_sensor.meross_garage_door_contact
automation: - alias: "Garage - Night security" trigger: - platform: time at: "23:00:00" condition: - condition: state entity_id: cover.meross_garage_door state: "open" action: - service: cover.close_cover entity_id: cover.meross_garage_door - service: notify.mobile_app data: title: "π Garage closed" message: "Garage door closed for the night."# HACS β Integrations β Meross LAN# Local HTTP control without cloud
# Benefits:# - Faster response# - Works without internet# - More reliableBuy: Amazon, Meross Shop
Price: ~$150
Premium multi-door solution:
# Native ismartgate integration# Settings β Devices β ismartgate
automation: - alias: "Gate - Play sound on arrival" trigger: - platform: state entity_id: cover.ismartgate_garage to: "opening" action: - service: media_player.play_media entity_id: media_player.garage_speaker data: media_content_type: music media_content_id: "/local/sounds/welcome_home.mp3"Buy: Amazon, ismartgate.com
Price: ~$15-25
Cheapest solution for dry contact openers:
Garage door opener wall button terminals:ββββββββββββββββββββββββββββ Terminal 1 βββββββββββΌββββ Shelly 1 "O"β Terminal 2 βββββββββββΌββββ Shelly 1 "I"βββββββββββββββββββββββββββ
Reed switch:ββββββββββββββββββββββββββββ Reed COM βββββββββββΌββββ Shelly 1 "SW"β Reed NC βββββββββββΌββββ Shelly 1 "L" (or GND)βββββββββββββββββββββββββββ# Shelly auto-discovered# Settings β Devices β Shelly
# Cover template for garage doorcover: - platform: template covers: garage_door: device_class: garage friendly_name: "Garage Door" value_template: > {% if is_state('binary_sensor.shelly1_garage_input', 'on') %} open {% else %} closed {% endif %} open_cover: service: switch.turn_on entity_id: switch.shelly1_garage close_cover: service: switch.turn_on entity_id: switch.shelly1_garage stop_cover: service: switch.turn_on entity_id: switch.shelly1_garage
# Momentary switch automationautomation: - alias: "Garage - Shelly momentary" trigger: - platform: state entity_id: switch.shelly1_garage to: "on" action: - delay: "00:00:01" - service: switch.turn_off entity_id: switch.shelly1_garage# Via ratgdo ultrasonic sensor# Or dedicated sensor
binary_sensor: - platform: template sensors: car_in_garage: friendly_name: "Car in Garage" device_class: occupancy value_template: > {{ states('sensor.ratgdo_vehicle_distance') | float < 200 }}
automation: - alias: "Garage - Car parked" trigger: - platform: state entity_id: binary_sensor.car_in_garage to: "on" for: "00:01:00" condition: - condition: state entity_id: cover.garage_door state: "open" action: - delay: "00:02:00" - service: cover.close_cover entity_id: cover.garage_door# With PIR sensor or cameraautomation: - alias: "Driveway - Motion at night" trigger: - platform: state entity_id: binary_sensor.driveway_motion to: "on" condition: - condition: sun after: sunset action: - service: light.turn_on entity_id: light.driveway_lights data: brightness_pct: 100 - delay: "00:05:00" - service: light.turn_off entity_id: light.driveway_lightsautomation: # Night check - alias: "Garage - Night security check" trigger: - platform: time at: "23:00:00" action: - if: - condition: state entity_id: cover.garage_door state: "open" then: - service: cover.close_cover entity_id: cover.garage_door - service: notify.mobile_app data: title: "π Garage secured" message: "Garage door automatically closed for the night."
# Away check - alias: "Garage - Everyone away" trigger: - platform: state entity_id: group.family to: "not_home" for: "00:05:00" condition: - condition: state entity_id: cover.garage_door state: "open" action: - service: notify.mobile_app data: title: "β οΈ Garage open!" message: "Garage door is still open and everyone is away." data: actions: - action: "CLOSE_GARAGE" title: "Close now"
# Obstruction alarm - alias: "Garage - Obstruction" trigger: - platform: state entity_id: binary_sensor.ratgdo_obstruction to: "on" action: - service: notify.mobile_app data: title: "π¨ Garage obstruction!" message: "Something is blocking the garage door sensors."type: entitiestitle: "π Garage"entities: - entity: cover.garage_door name: Garage Door - entity: light.garage_light name: Light - entity: binary_sensor.car_in_garage name: Car Parked - entity: binary_sensor.garage_obstruction name: Obstruction - entity: lock.garage_remote_lock name: Remote LockESPHome Guide
Learn to flash and configure ESPHome.
Smart Security
Cameras and alarm systems.
Last updated: December 2025