Opening a garage with a fingerprint sensor ESPHome

Disclosure: This post contains affiliate links. If you click through and make a purchase, I will earn a commission, at no additional cost to you. Read my full disclosure here.

Not long after support for fingerprint sensors was added to ESPHome, the first use of them was publicized in the Home Assistant Community. The Dutch community member, who goes by the name of parrel and is known for their DIY Zigbee projects, recessed the fingerprint sensor in to a board outside their already automated garage. From there, they fed its wires indoors, where they are connected to an ESP8266 board.

As their garage was already automated, this project is more of an add-on and doesn't cover how to make a garage door opener smart. If that is what you are interested in, there are many guides for DIY solutions using ESPHome available online and pre-built devices to be bought in stores.

Contents

What you will need to build a fingerprint-activated garage door

The main component of the fingerprint sensing garage door opener, besides the ESP8266 board powered by ESPHome, is the GROW R503 fingerprint sensor (buy on AliExpress). I previously predicted that I'm expecting this model to become the most popular fingerprint sensor for ESPHome and other DIY projects. It has a rugged metal body and allows for panel-mounting, making it perfect for embedding in to objects, such as wooden doors. The GROW R503 features a capacitive sensor and has a similar look, but bigger size, to fingerprint sensors you used to find on the back of Android smartphones, before the moved under the display.

What's nice about the GROW R503 fingerprint sensor is that it features a handful of colour LEDs in a ring around the sensor itself. These can give the user visual feedback on whether the fingerprint was accepted or rejected.

An isolated image of the Grow R503 Fingerprint Sensor

As the GROW R503 fingerprint sensor only draws ~20 mA when in use, it can be directly attached to the ESP8266 and doesn't need to be powered by an external power supply. In this case, an old 5V, 500 mA Micro-USB power supply should have enough power to juice the whole project. Generally, I don't recommend powering an ESP8266 or ESP32 using the Micro-USB port, and I wouldn't recommend it for this project if you were adding anything other than just the fingerprint sensor.

The ESPHome fingerprint garage opener mounted to some wood.

The finished fingerprint sensing garage opener using ESPHome (source: Home Assistant Community

To make the project look more professional, you could 3D-print a cover for the GROW R503 fingerprint sensor, and make it flush with the wood. The creator of this project has even made their design freely available to download. However, this is one of the rare projects where a 3D printer is optional, as these covers can also be bought online. You will even find covers made from stainless steel on AliExpress, which could give your fingerprint sensor a premium look. You will also find enclosures for the sensor from the same seller, these should offer protection from “rain and dust” but aren't waterproof.

There aren't many sensors that communicate with the ESP8266 or ESP32 using the UART Bus, but the GROW R503 fingerprint sensor is one of them. If an ESP8266 is used, ESPHome has to use a software implementation of UART, which can have occasional data glitches. With the ESP32, which has three hardware UARTs, any pair of GPIO pins can be used, as long as they support the proper output/input modes. Therefore, the ESP32 might be the better choice for this project. On the other hand, though, the creator used an ESP8266 and hasn't reported any issues yet.

Wiring the fingerprint-activated garage door

The two wires used to communicate using the UART Bus can be connected to any free pin on the ESP8266/ESP32, you just have to make sure you define the correct pins for TX and RX. There is a third wire, described as WAKEUP in the documentation, which should also be connected to a sensing pin. This allows the polling function to quickly return when there’s no finger on the reader. In this project, the creator has simply used D0 for TX, D1 for RX, and D2 for WAKEUP.

Wiring guide for the GROW 503 fingerprint sensor

Wiring guide for the GROW 503 fingerprint sensor (source: AliExpress

The red wire is connected to the power supply, which in this case is the 3.3V pin on the ESP8266/ESP32 and the black wire to a GND pin on the same microcontroller. Overall, the fingerprint sensing garage door opening, one of the easier projects to wire up, despite what your first impression might have been.

Writing the firmware using ESPHome

Finally, the firmware for the fingerprint sensing garage door opener can be written and flashed to the microcontroller. After getting the basics, such as the board type, access point, and Wi-Fi password, in place. The UART Bus, which is one of ESPHome's core components, needs to be configured. This depends on which pins you used for RX and TX. The default baud rate of the GROW R503 fingerprint sensor is 57600 bps.

uart:
  tx_pin: D0
  rx_pin: D1
  baud_rate: 57600

Setting up the GROW R503 fingerprint sensor in ESPHome

You can optionally configure a sensor component for the GROW R503 fingerprint sensor in ESPHome and despite only being optional, I recommend you add the following lines to your configuration, so you can view a summary of what is happening in Home Assistant:

sensor:
  - platform: fingerprint_grow
    fingerprint_count:
      name: "Fingerprint Count"
    last_finger_id:
      name: "Fingerprint Last Finger ID"
    last_confidence:
      name: "Fingerprint Last Confidence"
    status:
      name: "Fingerprint Status"
    capacity:
      name: "Fingerprint Capacity"
    security_level:
      name: "Fingerprint Security Level"

Also optional, but highly recommended, is a text sensor, which can be used to display the status of a scanned fingerprint (e.g. authorized, unauthorized):

text_sensor:
  - platform: template
    id: fingerprint_state
    name: "Fingerprint State"

Defining a switch for the fingerprint sensor controls

To make the ESP8266/ESP32 perform an action whenever a fingerprint has been authorized on the GROW R503, a switch can be added. This could be a relay, a lock, or anything else you can open and close:

switch:
  - platform: gpio
    pin: GPIO14
    id: gate

Telling ESPHome what the GROW R503 fingerprint sensor does

The project wouldn't be in working order, without configuring what exactly the fingerprint does. In the code below, you can see what each state does. For example, whenever a fingerprint is matched, it will turn on the gate, which was defined as a switch in the previous step. Additionally, it will also set the LED around the GROW R503 fingerprint sensor to breathe in a blue colour. The text sensor will then display the message “Authorized finger”.

When a fingerprint is unmatched, nothing will happen to the switch, but the LEDs will turn red colour and the text sensor will display the message “Unauthorized finger”.

fingerprint_grow:
  sensing_pin: D2
  on_finger_scan_matched:
    - switch.turn_on: gate

    - fingerprint_grow.aura_led_control:
        state: BREATHING
        speed: 200
        color: BLUE
        count: 1
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Authorized finger"
  on_finger_scan_unmatched:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: RED
        count: 2
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Unauthorized finger"
  on_enrollment_scan:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: BLUE
        count: 2
    - fingerprint_grow.aura_led_control:
        state: ALWAYS_ON
        speed: 0
        color: PURPLE
        count: 0
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Finger scanned"
  on_enrollment_done:
    - fingerprint_grow.aura_led_control:
        state: BREATHING
        speed: 100
        color: BLUE
        count: 2
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Enrolled fingerprint"
  on_enrollment_failed:
    - fingerprint_grow.aura_led_control:
        state: FLASHING
        speed: 25
        color: RED
        count: 4
    - text_sensor.template.publish:
        id: fingerprint_state
        state: "Failed to enroll fingerprint"

Setting up user-defined services in ESPHome

The final step is to set up a couple of custom services in ESPHome. User-defined services make it possible to get data from Home Assistant to ESPHome. The declared services in the ESPHome project's YAML code will automatically show up in Home Assistant, where they can be called directly.

In this case, I recommend copying the sample code from the ESPHome website directly, which is exactly what the creator of the fingerprint sensing garage door opener also did:

api:
  services:
  - service: enroll
    variables:
      finger_id: int
      num_scans: int
    then:
      - fingerprint_grow.enroll:
          finger_id: !lambda 'return finger_id;'
          num_scans: !lambda 'return num_scans;'
  - service: cancel_enroll
    then:
      - fingerprint_grow.cancel_enroll:
  - service: delete
    variables:
      finger_id: int
    then:
      - fingerprint_grow.delete:
          finger_id: !lambda 'return finger_id;'
  - service: delete_all
    then:
      - fingerprint_grow.delete_all:

With this code in place, you can enrol a fingerprint by calling the service esphome.fingerprint_grow.enroll ("fingerprint" needs to be replaced with the device's name). The parameters finger_id and num_scans need to be added. The former defines in which slot the fingerprint you are about to scan is stored. The GROW R503 fingerprint sensor can store up to 200 fingerprints. The second parameter defines how many scans it takes to register the finger.

Is a DIY fingerprint sensor using ESPHome secure?

There is currently no reason to believe that a DIY solution, as described in this featured project, is any less secure than commercially available options. The riskiest thing in such a setup would almost certainly be your network and physical intrusion prevention, and not the ESPHome node.

There are no known ways of getting fingerprint data off the GROW R503 fingerprint sensor, and it is never communicated between it and the ESP8266/ESP32. As a capacitive sensor, there is also no way of easily tricking it using a printout of one's fingerprint.

Personally, I would keep the fingerprint sensor accessible, but well hidden away from any curious eyes and fingers. Even if others wouldn't be able to use it to gain entry to your home or garage, it would very likely be an easy target for vandalism.

A portrait photo oif Liam Alexander Colman, the author, creator, and owner of Home Assistant Guide wearing a suit.

About Liam Alexander Colman

is an experienced Home Assistant user who has been utilizing the platform for a variety of projects over an extended period. His journey began with a Raspberry Pi, which quickly grew to three Raspberry Pis and eventually a full-fledged server. Liam's current operating system of choice is Unraid, with Home Assistant comfortably running in a Docker container.
With a deep understanding of the intricacies of Home Assistant, Liam has an impressive setup, consisting of various Zigbee devices, and seamless integrations with existing products such as his Android TV box. For those interested in learning more about Liam's experience with Home Assistant, he shares his insights on how he first started using the platform and his subsequent journey.

Leave a comment

Share to...