Projects   ›   Home Assistant   ›   Fingerbot

Fingerbot

The washing machine is one of those deferable devices that can be perfectly used in energy management systems. They relatively consume a lot of power (2 - 2.4 kW) and can be scheduled. Most newer washing machines have built-in Wi-Fi and can be controlled via an API. My parents still having an old prehistoric washing machine in a rising smart home takes for different measures:

The Fingerbot

Hardware

You can buy these devices for cheap in different communication with different radios: Zigbee, Wi-Fi or Bluetooth. But if you have a 3d printer and the hardware lying around, it's more fun to design one yourself. The following hardware is used:

  • ESP32-C3 Super Mini (but any other esp based board is fine)
  • SG90 Micro Servo
  • Custom 3D printed components (printed in PLA)

I modified this design: https://www.printables.com/model/829294-fingerbot-v1

I stripped down the casing to create a smaller and open version. This way, there is more room around the button of the washing machine, so it's still convenient to use the washing machine manually.

Original Fingerbot V1 design from printables.com
Original lever and pin design (white component connected to servo with screw), the servo could not interlock and was slipping.

After a couple of designs for the lever and the pin, I noticed the servo was slipping and could not generate enough torque to push the washing machine button. The standard lever that came with the fingerbot v1 design required a 0.2mm nozzle for printing the tiny teeths that interlock the lever with the servo. I only have the 0.4mm nozzle for the Bambulab A1.

Modified and stripped down version of Fingerbot V1 containing 3 components: The base, the "finger" and a pin that connects the finger with the servo lever.
A lever that comes with the servo, this does not slip on the servo when rotating. I attached the pin at the end of the lever with a screw.

In the end, I used the lever that comes with the servo. This way, the servo has a good grip on the lever and does not slip. The pin is connected to the lever with a screw.

The pin that goes through the "finger" is attached to the servo lever with a screw.
The esp32 is attached to the side of the 3d printed base, powered by USB-c.
In blue you have the pin (updated design, such that it can not fall out), in red the servo lever and in green the finger that pushes a button.

ESPHome configuration

esphome:
  name: "fingerbot"
  friendly_name: Fingerbot
  min_version: 2025.11.0
  name_add_mac_suffix: false

esp32:
  variant: esp32c3
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
- platform: esphome

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

output:
  - platform: ledc
    pin: GPIO0
    frequency: 50 Hz
    id: d0_output

servo:
  - id: d0_servo
    output: d0_output

number:
  - platform: template
    name: Servo Control
    min_value: -100
    initial_value: 0
    max_value: 100
    step: 1
    optimistic: true
    set_action:
      then:
        - servo.write:
            id: d0_servo
            level: !lambda 'return x / 100.0;'

Home Assistant configuration

I added a Helper Entity in Home Assistant with entity id: input_boolean.fingerbot_button With this button, I made an automation that controls the servo of the device created by the ESPHome integration in Home Assistant.

alias: Move fingerbot on button press
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_boolean.fingerbot_button
    to:
      - "on"
conditions: []
actions:
  - device_id: 2eedea3a65b570cb8b365299706ebec4
    domain: number
    entity_id: 8499d08a703764c8e89b705431969ac2
    type: set_value
    metadata:
      secondary: false
    value: 40
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 500
  - device_id: 2eedea3a65b570cb8b365299706ebec4
    domain: number
    entity_id: 8499d08a703764c8e89b705431969ac2
    type: set_value
    metadata:
      secondary: false
    value: -10
  - action: input_boolean.turn_off
    target:
      entity_id: input_boolean.fingerbot_button
    data: {}
mode: single

When the power is reapplied to the servo, it might go to a state that it should not be in, so I use an extra automation that sets the servo angle to a defaults state.

alias: Fingerbot default value when turn on
description: ""
triggers:
  - trigger: state
    entity_id:
      - number.fingerbot_servo_control
    from:
      - unavailable
    to: null
conditions: []
actions:
  - device_id: 2eedea3a65b570cb8b365299706ebec4
    domain: number
    entity_id: 8499d08a703764c8e89b705431969ac2
    type: set_value
    metadata:
      secondary: false
    value: -10
mode: single