What you'll build: a battery-friendly moisture sensor that publishes readings to Home Assistant over MQTT, so your phone tells you when each plant needs watering.
Parts list
- Wemos D1 Mini (ESP8266) — small footprint, plenty of pins
- Capacitive soil moisture sensor v1.2 (do NOT use the cheap resistive kind — it corrodes in days)
- 18650 cell + holder, plus a TP4056 USB-C charging board
- A small project box (or 3D-printed enclosure)
Why capacitive: resistive sensors run DC through the soil and electrolyse the probe. Capacitive sensors are AC-driven and have no exposed metal — mine has been buried 6 months with zero corrosion.
Wiring
- Sensor VCC → D1 Mini 3.3V
- Sensor GND → D1 Mini GND
- Sensor AOUT → D1 Mini A0
- 18650+ → TP4056 BAT+, 18650− → TP4056 BAT−, TP4056 OUT+ → 5V on the D1 Mini
Software setup
1. Flash ESPHome onto the D1 Mini using the web flasher at web.esphome.io.
2. Add a config file with an `adc` sensor on A0, filter the raw value to 0-100% using a calibration table (dry-in-air and submerged-in-water are your two endpoints).
3. Set `deep_sleep` to 30 minutes between readings to stretch the 18650 to several months.
4. Add it as a device in Home Assistant — the entity auto-discovers.
Calibration steps
- Hold the probe in dry air, note the raw ADC value — that's your '0%'.
- Submerge the probe in a glass of water up to the marked line, note that value — that's your '100%'.
- Set thresholds: my monstera is unhappy below 30%, my succulents below 10%.
Automation idea: in Home Assistant, create an automation that pushes a phone notification when any plant drops below threshold for more than 2 hours. Now my monstera tells me when it's thirsty instead of just dying quietly.