In response to Relicense under an OSI approved license · Issue #2 · Genie-Garage/aladdin-python-sdk · GitHub I decided to cobble together a ESPHome-powered wireless* garage door remote. (*=Wireless in respect to the doors. The device is USB-powered ). This is really hacky in my opinion, but I really hope it inspires others to take it to the next level (if you do, please share!).
I think my favorite part about this is that the remote is powered by the ESP8266. The final product is powered by a 4-inch micro-USB cable from my Home Assistant Yellow.
Parts
(all links are for reference. I recommend shopping around if you plan to attempt this yourself)
- Wemos D1 Mini (ESP8266)
- Adafruit Perma-Proto Quarter-sized Breadboard PCB
- Genie G3T-R remote
- THIRDREALITY Zigbee Smart Garage Door Tilt Sensor ← Any HA-compatible tilt sensor will do.
- 2.54mm/0.1inch Pitch 2 Pin screw terminal.
- Some right angle, 2.54mm/0.1inch Pitch headers
- 22 AWG solid-core wire. This is how I made “pins” on the garage remote, and made the “traces” on the proto-board.
Schematic
ESPHome Code
substitutions:
name: espgarageremote
friendly_name: "ESP8266 Garage Remote"
esphome:
name: "${name}"
friendly_name: "${friendly_name}"
esp8266:
board: d1_mini
restore_from_flash: false
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "SECRET_REMOVED"
ota:
- platform: esphome
password: "SECRET_REMOVED"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
manual_ip:
static_ip: 192.168.89.88
gateway: 192.168.89.1
subnet: 255.255.255.0
dns1: 192.168.89.1
dns2: 192.168.89.2
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${name} Fallback Hotspot"
password: "SECRET_REMOVED"
captive_portal:
# Minimal flash writes, once per day
preferences:
flash_write_interval: 1440min
# Sync time with Home Assistant
time:
- platform: homeassistant
id: homeassistant_time
switch:
# Switch to restart the ESP
- platform: restart
name: ${friendly_name} Restart
- platform: gpio
pin: GPIO4
inverted: yes
restore_mode: RESTORE_DEFAULT_ON
id: button1
name: "East Door"
icon: "mdi:garage"
on_turn_on:
- delay: 250ms
- switch.turn_off: button1
- platform: gpio
pin: GPIO5
inverted: yes
restore_mode: RESTORE_DEFAULT_ON
id: button2
name: "West Door"
icon: "mdi:garage"
on_turn_on:
- delay: 250ms
- switch.turn_off: button2
# Blink LED for status, and also expose to HA as switch
light:
- platform: status_led
name: "${friendly_name} status light"
id: blueled
pin:
number: GPIO2
inverted: yes
restore_mode: RESTORE_DEFAULT_OFF
script:
- id: heartbeat
mode: single
then:
- light.toggle: blueled
- delay: 20 ms
- light.toggle: blueled
# Heartbeat while connected to HA
interval:
- interval: 5s
then:
if:
condition:
api.connected:
then:
- script.execute: heartbeat
text_sensor:
# Expose WiFi information as sensors
- platform: wifi_info
ip_address:
name: ${friendly_name} IP
mac_address:
name: ${friendly_name} Mac Address
binary_sensor:
- platform: status
# Status platform provides a connectivity sensor
name: "${friendly_name} - Status"
device_class: connectivity
sensor:
# Report wifi signal strength every 5 min if changed
- platform: wifi_signal
name: ${friendly_name} WiFi Signal
update_interval: 300s
filters:
- delta: 10%
# Pin assignments for ESP-01
# https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
# 3v3 | | RX/GPIO3 - high at boot
# RST | | GPIO0 - pulled up, flash if low on boot
# EN | | GPIO2 - pulled up, blue led on if pulled down, must be high at boot
# TX | | GND
# ^ TX/GPIO1 - high at boot
Final product
Credits
Inspiration to make this came from Flipper Zeo Genie Recorder. After seeing how they used a Flipper Zero GPIO to control the remote, it just made sense to make this.