Gage Langdon Next →
Plants lined up along the living room windows, high above the city.

Home automation

Smart plants

ESP32s and soil moisture sensors in every pot, reporting into Home Assistant, so watering happens when a plant needs it instead of when someone remembers.

This page was drafted by Claude.

Checking whether a plant needs water is not hard. You stick a finger in the dirt. The problem is that nobody in this house was going to do that, for every plant, every day, forever. We’d remember for a week, then not, and find out we’d stopped when something started drooping.

So rather than get better at a chore, I put a computer in the dirt and made the plants do the remembering.

The nice side effect of a sensor over a finger is that it’s also watching when you aren’t. Watering on a schedule never worked here because the pot by the window dries out twice as fast as the one in the corner, and neither of them cares what day it is. A number per pot, updated all day, handles that in a way that “water everything on Sunday” doesn’t.

The hardware

Each plant gets an ESP32, a cheap wifi microcontroller, wired to a capacitive soil moisture sensor sitting in the pot. The board reads the sensor, publishes the value over wifi, and goes back to sleep. That’s the whole device.

Capacitive sensors matter here rather than the cheaper resistive kind. A resistive probe passes current through the soil to measure it, which corrodes the probe and slowly ruins the reading. A capacitive one measures through a sealed surface with nothing exposed, so it holds calibration instead of degrading in the pot over months.

An ESP32 dev board wired to a capacitive soil moisture sensor, clipped in a helping-hands stand on a workbench.
One ESP32, one capacitive probe, one job.
The ESP32 and moisture sensor deployed in a potted plant on a windowsill, sensor cable running down into the soil.
Deployed: probe in the dirt, board clipped to the rim.

Getting it into Home Assistant

The boards run ESPHome, which is the piece that makes this practical rather than a science project. You write a short YAML config describing the sensor, flash it once, and the device shows up in Home Assistant as an entity with no further wiring, no broker to configure, and no app from whoever made the sensor. Add another plant, copy the config, change the name.

From Home Assistant’s side each plant is just a number that updates on its own, which means everything else the hub can already do (dashboards, history, notifications, automations) applies to it for free.

The dashboard

Every plant in the house on one screen, with its current moisture level and the trend behind it. The history graph turned out to be the more useful half: a single reading tells you whether a plant is dry right now, but the curve tells you how fast that particular pot loses water, which is what actually lets you predict it. Some plants drop steadily over a week. Others fall off a cliff two days after watering.

The alerts

An automation watches each plant’s moisture and notifies me when it drops below that plant’s threshold. Per-plant, because “dry” isn’t one number: different species and different soil mixes want different things, and a succulent sitting at a level that would be an emergency for a fern is completely fine.

The result is that watering stopped being a chore anyone has to remember. The house tells us which plant needs attention, and only that plant.

More detail and photos to come.

Part of the broader Home Assistant setup.