Control Mechanical Garage Door Lock with Tasmota and Home Assistant

Not everyone has the option of installing an electric garage door opener, but in some situations it can still be useful to be able to unlock the door with a wireless remote or your smartphone. Most garage doors provide the option to unlock the door from the inside without a key using a small lever. By attaching a small servo motor to it, the lock can be automatized and controlled remotely.

This guide shows how such a smart mechanical garage door lock can simply be made from cheap off the shelf components (sub $20) and a bit of computer knowledge. It describes the steps to build the hardware, set up the microcontroller and automate it using Home Assistant.


You need a few components for smartifying your mechanical garage door lock. There are several different options for those, following are just examples:

  • Wemos D1 Mini ESP8266 Board (ESP32 etc. should also work)
  • Servo SG90
  • Relay (you can use a breakout board for SRD-05VDC-SL-C for example or alternatively control the servo power using a transistor)
  • LEDs
  • USB charger + cable for powering the ESP8266 Board (10W should be enough to power the ESP8266 and servo)
  • Cable for connecting the servo on the door to the controller on the wall (3 wires, 3+ meters)

You need to connect the Relay to D3 on the D1 mini, the Servo to D4, the LED to D5 and the switch to D6. See below for a schematic.

Mechanical Installation

First you need to attach the servo to garage door locking lever. You can build a mounting bracket using wood or 3d print one. I just used epoxy glue to attach it.
The connection between the servo head and locking lever can be 3d printed or a strong wire which is still a bit flexible can be used to account for the radial movement of the servo.
Attach a long cable to the servo. The cable can hang down the side of the door where it is connected to the controller.

The mounted servo should look like this:


Configuring the D1 mini

One the software side, you need to flash a version of Tasmota with shutter support to the D1 mini board. Shutters are supported by all newer versions of tasmota.bin. You will find various guides on flashing Tasmota on the internet.

After flashing Tasmota to your D1 mini, open the web interface, go to Settings > Configure Device and set the device type to Generic and choose following pin configurations:

ESP8266 D1 mini Configuration Description
GPIO 0 D3 Relay (1) Servo Enable
GPIO 2 D4 PWM (1) Servo Control
GPIO 14 D5 Relay (2) Direction Indicator
GPIO 12 D6 Switch (1) Control Switch

Then, you can setup the shutter control using the Tasmota Web Console by typing following commands:

Command Description
SetOption80 1 Enable shutter support
Shutterrelay1 1 Define RELAY1 for ON/OFF, PWM1 for the servo
Shuttermode 5 Servo shutter mode
PWMfrequency 200 Frequency for all servos
SetOption15 0 Enable basic PWM control

The next step is to set the range of the servo. You can find the timings for 0° and 180° in the servo datasheet. As you probably do not need the full range of the servo, you can try out different opening and closing timings between those.

You can calculate the values for Tasmota using this formula: timing_us * freq/1000, for example 1320µs * (200Hz / 1000) = 1320 * 0,2 = 264.

Command Description
ShutterPwmRange1 264, 420 open/close values for the servo (switch values to switch open and close)
ShutterOpenDuration1 0.5 Opening time in seconds (doesn’t really matter)
ShutterCloseDuration1 0.5 Closing time in seconds
ShutterMotorDelay1 0.2 Prevent abrupt start
Restart 1 Restart to apply changes

Now you’re able to control the lock using the commands below. Tweak the PWM range and timings if necessary.

Command Description
ShutterOpen1 Open the lock
ShutterClose1 Close the lock

Lastly, you can configure the switch input. This can for example be used to detect whether the garage door is open using a reed switch. You may want to enable SetOption114 1 to detach the switch from the relay and rather send a MQTT message to Home Assistant when the state changes.

Automations in Home Assistant

In Home Assistant, you first need to add the Tasmota extension if not already done. You also need to set up your MQTT broker on the Tasmota web interface. Home Assistant should then automatically detect the controller.

Navigate to Settings > Automations & Scenes and create a new Automation there. There you can for example configure a Zigbee remote or a companion app action as the trigger. For the action choose Close ... cover 1 or Open ... cover 1 (where ... is the device name configured in the Tasmota web interface).

If you want to define a toggle action, you can add a condition like this:


Adding a display

If you want the smart lock to show the current status of the lock and the current date and time, you can add a display to it. Additonally, a button to manually control the lock can be added too.

Required parts: SSD1306 OLED (128x32 pixel), push button

Configure Tasmota and connect the parts according to the table below:

ESP8266 D1 mini Configuration Description
GPIO 16 D0 Button (1) Button to open/close the lock
GPIO 4 D2 I2C SDA SSD1306 display SDA pin
GPIO 5 D1 I2C SCL SSD1306 display SCL pin

Next, you need to setup the display, button and rules for the automation. For this you need to run following commands in the Tasmota Web Console:

Command Description
i2cscan Scan for the display on the I2C bus
DisplayAddress 0x3c Setup the display. Replace 0x3c with the address from the I2C bus scan
DisplayModel 2 Set the display type to SSD1306
DisplayDimmer 100 Set the display to full brightness (can only be 0 for off or 100 for on)
DisplayMode 0 Set the display mode to custom text
SetOption73 1 Detach the buttons from the relays
Rule1 ON button1#state DO ShutterToggle1 ENDON Setup Rule 1 to toggle the lock on a button press
Rule1 1 Enable Rule 1
Rule2 ON shutter1#position > 50 DO Displaytext [c1l2f0s2] UNLOCKED ENDON ON shutter1#position < 51 DO Displaytext [c1l2f0s2] LOCKED ENDON Setup Rule 2 to display the lock state when the lock state changes (two leading spaces before text LOCKED to overwrite the UN with spaces)
Rule2 1 Enable Rule 2
Rule3 ON Time#Minute|1 DO Displaytext [s1l1c1T] [s1l1c10t] ENDON Setup Rule 3 to update the current date and time every minute
Rule3 1 Enable Rule 3


Controller PCB


Schematic for the controller