Real projects, technical deep-dives, and lessons learned from the field. No fluff — just things we've actually built.
Manual irrigation timers are dumb. They water on a schedule whether it rained yesterday or not, they can't be adjusted remotely, and adding zone-level control usually means buying an expensive proprietary controller that locks you into an app you'll hate.
We wanted something different: Home Assistant-integrated zone control that could be automated based on weather, soil conditions, or just a tap on a phone. Off-the-shelf smart irrigation controllers exist, but they're either cloud-dependent, expensive, or both. So we built one over a weekend.
The total build came in well under the cost of a Hunter or Rachio controller, and every component is locally sourced or readily available online.
ESP32-S3 with six onboard relays, screw terminals, and Wi-Fi. The brain of the operation.
MP3032 — provides 24VAC to drive standard irrigation solenoid valves.
MP3350 — converts 24VAC down to DC to power the ESP32 board cleanly.
YAML-based firmware that compiles and flashes directly. OTA updates, native HA integration.
Local-first automation platform. Dashboards, automations, and voice control out of the box.
IP65-rated box from the hardware store. Drill, mount, done.
The Waveshare board made this almost too easy. Six relay channels, screw terminals for valve wiring, and an ESP32-S3 that ESPHome supports natively. No soldering, no custom PCBs.
The core YAML is straightforward. Each relay maps to an irrigation zone, exposed as a switch in Home Assistant:
esphome:
name: irrigation-controller
friendly_name: Irrigation Controller
esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
switch:
- platform: gpio
name: "Zone 1 — Front Lawn"
pin: GPIO1
id: zone_1
icon: "mdi:sprinkler-variant"
- platform: gpio
name: "Zone 2 — Garden Beds"
pin: GPIO2
id: zone_2
icon: "mdi:sprinkler-variant"
- platform: gpio
name: "Zone 3 — Side Yard"
pin: GPIO3
id: zone_3
icon: "mdi:sprinkler-variant"
# ... zones 4–6 follow the same pattern
The wiring is dead simple. The 24VAC transformer plugs into mains and outputs to two places:
When ESPHome closes a relay, it completes the 24VAC circuit for that zone's solenoid valve, opening the water. Simple, reliable, and no cloud dependency.
We labelled each relay channel inside the enclosure and mapped them in the ESPHome config. With six channels available:
Once ESPHome compiles and flashes the firmware (takes about 90 seconds), the device appears in Home Assistant automatically. Each zone shows up as a toggleable switch with a sprinkler icon.
From there, the automation possibilities open up:
The whole system runs 100% locally. No cloud accounts, no subscriptions, no internet dependency. If the Wi-Fi goes down, you can still trigger zones via physical buttons or fallback automations.
The relay controller handles the “turn water on and off” part perfectly. But smart irrigation gets really interesting when you add sensing:
The best part about building on ESPHome and Home Assistant is that none of this requires replacing hardware. It’s all firmware and config changes — flash over the air and you’re done.
Total cost: under $120 AUD. Total build time: one afternoon. Total cloud subscriptions required: zero.