December 6, 2025
Description
I run most of my planted aquarium setup through Home Assistant using ESPHome devices, and since I’m a bit forgetful with daily dosing, I wanted to add an automated dosing pump.
Using fairly standard parts, I put this together—and it has been working great so far!
Parts List
1 × Seeed Studio XIAO ESP32C3
https://www.unmannedtechshop.co.uk/product/seeed-xiao-esp32c3/
1 × Peristaltic Pump (12V, Type C, 32×23 mm motor)
https://amzn.eu/d/i1QkSs3
1 × Voltage Boost PCB (to supply 12 V to the pump motor)
https://amzn.eu/d/eJ5knap
1 × Switch Circuit
(I built my own, but something like this should work)
https://amzn.eu/d/i6b5pwy
8 × M3×12 mm bolts
(I prefer low-profile Torx cap heads)
https://www.accu.co.uk/torx-low-cap-head-screws/14457-SHCL-M3-12-A2
2 × M3 nuts
(for securing the pump)
1 × USB-C power supply
(Any good quality supply should work—this is the one I used)
https://amzn.eu/d/9RMtsJO
1 × Silicone tubing (3 mm ID × 5 mm OD)
https://amzn.eu/d/gblbX2M
Also check out my matching pipe holder for mounting the tube on the tank:
https://www.printables.com/model/907914-aquarium-dosing-pump-pipe-clip
Assembly Notes
To insert the peristaltic pump into the printed case, you’ll need to flex the main body slightly so the pump’s mounting “wings” can slide past the screw posts at the bottom. It’s a small design oversight, but everything fits securely once in place.
I limited the ESPHome configuration so the pump can only run for a maximum of 3 seconds at a time—this gives me roughly 6 ml of liquid in my setup. Then I use a Home Assistant automation that turns on CO₂ and triggers the nutrient pump once each morning.
ESPHome Code (for reference)
esphome:
name: fish-tank-nutrients-dispenser
friendly_name: Fish Tank Nutrients Dispenser
esp32:
board: esp32-c3-devkitm-1
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "B89UpB2duqrRGILX8Nc5XV25tLXL+TAE34eO+ZEVovg="
ota:
password: "76a8d0d8e9291837d1c8f8c7d0a70265"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fish-Tank-Nutrients-Dispenser"
password: "choose your own ;)"
captive_portal:
switch:
- platform: gpio
pin: 2
id: "nutrients_dispenser"
name: "Nutrients Dispenser"
on_turn_on:
- delay: 3000ms
- switch.turn_off: nutrients_dispenserAlso I added a 300uF electrolytic capacitor to the 12v output of the boost circuit so the inrush of the pump starting didn't knock out the ESP32.
License:
Creative Commons — Attribution