● Build it

One afternoon, five modules, and the wires already in your wall.

Five steps. Every part clips onto a rail and clips off again. Nothing needs soldering; two low-voltage bricks stay at the outlet and mains never enters the cabinet. The scariest wire you will touch carries 24 volts.

$179EIGHT ZONES, THE PARTS YOU MUST BUY
3 h 15 mTHE WHOLE JOB
0SOLDER JOINTS, EVER
24 VTHE SCARIEST WIRE

Honesty first: Maali is proven on a bench, not yet through a season in a yard. This guide is current against firmware v0.2.1 and the hardware files in the repo, and it will change as the bench teaches us more.

1

Order the parts

~30 MIN · THEN WAIT FOR BOXES

One list, a spare source for every line, and two decisions to make before you pay. Everything is an ordinary electrical-cabinet part. Nothing here is ours alone.

Decision one: surge protection is $42, and worth it.

An induced surge on 200 feet of buried valve wire is what actually kills installed controllers. Three DIN surge terminals, across the 24 VAC pair, common-to-earth, and on the flow cable, cost $42 instead of $12 because the $12 version needs soldering, and nothing in this build is allowed to. A controller that dies in year three has cost far more than $30.

Decision two: how flow reaches the controller.

Order the Modbus pulse-counter module ($25, recommended). It rides the same two-wire bus as the relay board, needs no soldering, and its second channel is where a rain gauge lands later. The $8 optocoupler alternative works only after questions about free controller pins are settled, not on a first build.

The bill of materials · from the repo's own BOM every line has a second source
PartOrderQtyUSD
REQUIRED · what has to be in the box before it can water anything
24 VAC transformer, plug-in40 VA Class 2 irrigation wall-wart. Keeps 120 V out of the cabinet entirelydo not substitute a non-Class-2 unitAmazon120
12 V DC wall adapter12 V, 2 A plug-in with a screw-terminal pigtail. The second brick at the outlet, for the thinking sidenothing converts inside the cabinet; the transformer’s full 40 VA stays with the valvesAmazon19
Controller: ESP32-S3 RS485Waveshare ESP32-S3-RS485-CAN, external-antenna versionmust be the external-antenna version. A sealed box smothers an internal oneWaveshare119
Relay board, 8 channelsWaveshare Modbus RTU Relay (B). Carries the Layer 0 hardware countdownthe auto-off timer is the safety argument; verify any substitute has itWaveshare129
Antenna + pigtailIPEX-1 to SMA bulkhead pigtail, 2.4 GHz antenna. Through the enclosure wallAmazon110
NEMA 4X enclosureNon-metallic 12×8×6 with mounting plate; a light colour runs cooler in the sunPolycase130
DIN railTwo 35 mm slotted steel rails, upper and lowerDigi-Key212
Rail mounting hardwareM4 × 12 mm pan-head screws, nuts and washers, eight of eachthe rail is screwed to the plate, not clipped; not self-tappers, the plate is moulded plastichardware store16
Terminal block kitDinkle DK2.5N screw-clamp blocks with a DK2.5N-PE earth terminal and end plates, ten to a kit. Ten is what the valve side takes: seven zones, a master, and two for the bridged commonexactly ten, so no spare; the earth terminal comes in the kit, and it earths through the rail — so the rail has to be bondedAmazon113
DIN end stopsFour 35 mm rail end stops, two per rail. Check the terminal kit first, its brackets may cover thisDigi-Key45
Cable glandsIP66 nylon, sized to the actual cable. An oversized gland is not sealedAmazon410
Wire, ferrules, labels18–22 AWG panel wire, insulated ferrules with a ratcheting crimper, label tapethe crimper matters more than the ferrules; print labels before wiringAmazon116
Required · a controller that opens valves, safely$179
NICE TO HAVE · the senses. It runs without them; it runs honestly with them
Flow sensorInline hall-effect, sized to the mainline (¾″ or 1″). Note pulses-per-gallon from the datasheetthis is what turns a stuck valve from a water bill into an alertAmazon112
Pulse-counter moduleModbus RTU digital-input counter. Flow on channel 1, rain gauge on channel 2rides the same two-wire bus as the relay board; no new wire into the controllerBLIIoT125
Rain gauge, tipping bucketReed-switch pulse output. Lands on the counter’s second channel and the two spare terminalsmeasured rain then outranks the forecast, which is the failure every cloud controller hasSparkFun122
Terminal blocks, a second kitThe flow sensor lands on three terminals and the rain gauge on two, and the valve side used all ten of the first kitfive more than you need, which is the point: a base build has no spareAmazon113
With the senses$251
OPTIONAL · protection, not function. The tier you notice in year three
Surge, the 24 VAC pairOne combined-mode DIN module covers line-to-line and line-to-earth. Citel DLAH-48D3 or the ASI equivalenta series device, not a tap: IN faces the field, and the whole valve current flows through itCitel152
Surge, the sensor cablesOne four-line DIN module covers the flow sensor and the rain gauge pair togetherthe buried runs are the exposure; the cabinet is notASI150
Fuse terminals + fusesFused disconnects with UL time-delay 5×20 mm fuses, one per supply legunder review: a Class 2 source is already the protection by code, and both bricks here are listedDigi-Key2+246
With surge as well$353

The machine-readable BOM with live supplier links and alternates ships in the repo: hardware/bom/bom-base-8ch.csv and ORDER-GUIDE.md.

2

Mount the cabinet, fit the rails

~1 HR

Hang the enclosure where the old timer was, the valve wires already end there. Two rails: modules on the upper, field terminals on the lower, nearest the glands. Every part clips on, and every part clips off again.

The upper rail thinks; the lower rail touches the yard. The 24 VAC wall-wart lives at the outlet. Mains never enters the cabinet.
  1. Mount the enclosure on the wall by the valve wires, out of direct afternoon sun if the wall allows it. A light-coloured box in shade runs 20°F cooler
  2. Fit the glands in the bottom face, one for the valve bundle, one per sensor cable, and one each for the 24 VAC and 12 V cords. Bottom entry, so water that follows a cable drips off instead of in
  3. Fit the antenna bulkhead through the wall with its gasket, antenna outside, pigtail inside.
  4. Screw both rails to the mounting plate, four M4 screws each, through the rail slot into a plate perforation with a nut behind. Then snap the modules on in the order drawn. End stops at both ends of each rail.
3

Wire it

~1 HR

Label first, ferrule every stranded end, and land the runs below in order. The old timer comes off the wall last, once you are sure.

One two-wire bus carries every command and every reading. No signal wire ever leaves the controller's case, adding a sensor later means one more box on the chain, never opening the controller.
Run 1 · 24 VACWall-wart cord through its gland → its fused terminal → relay channel commons. The water-moving power.
Run 2 · 12 V DCAdapter cord through its own gland → its fused terminal → controller VIN, relay board VIN, pulse counter VIN. The thinking power, on its own brick.
Run 3 · the busOne twisted pair: controller A/B → relay board A/B → pulse counter A/B, daisy-chained. Relay board answers at address 1, pulse counter at address 2.
Run 4 · the valvesPull the labelled wires off the old timer, one bed at a time, onto the field terminals: one common, one wire per bed. Zones on channels 1–6; fertilizer 6, master valve 7, pump start 8 if you have them.
Run 5 · the sensorsFlow sensor pair → flow surge terminal → pulse counter channel 1. Rain gauge pair (if fitted) → its surge terminal → channel 2.
Run 6 · earthEvery surge terminal bonds to the PE terminal, and the PE terminal to real earth, the enclosure lug and, where possible, the building's grounding electrode. Surge protection bonded to nothing protects nothing.
These modules are two-port, not shunt. Field wiring lands on the IN side and equipment on the OUT side. Wired backwards they still look installed, and protect the wrong half of the circuit.
Three ways this gets built wrong.

Orientation. The valve common is the long buried antenna, so it is the line side. IN faces the field.

Current. The module on the 24 VAC pair carries the sum of every solenoid running at once, about 750 mA at a concurrency of three. A signal SPD with a 500 mA series limit will not do, whatever its voltage rating says.

Earth through the rail. Several families take PE from the DIN rail. The mounting plate is plastic, so the rail earths nothing on its own: run a wire from rail to PE terminal, or use a module with its own PE terminal.

The one wiring rule.

If a wire's label and its terminal's label do not match, stop. A swapped pair costs a minute now and a flooded bed in July. Step 5 runs every valve while you watch, so a mistake here shows itself while it is still cheap.

4

Flash the firmware

~10 MIN

A blank board becomes a Maali in the browser. No software to install, no command line. A USB-C cable and Chrome.

  1. Plug the controller into your computer with a USB-C data cable, before the cabinet power is on.
  2. Open updates.getmaali.com/flash in Chrome or Edge, press Connect, and pick the board from the list.
  3. Press Install Maali and wait about two minutes. The page writes the whole factory image and reboots the board.
  4. Unplug, and power the cabinet. From here on the device updates itself the honest way: each release is signature-checked, tried in a spare slot, and rolled back by the bootloader if it fails to wake.
This is also the recovery path.

If a board ever dies, buy the same off-the-shelf board, flash it from the same page, and restore your one-file settings backup. No waiting on anyone, and no yard to rebuild by hand.

5

Walk the setup

~45 MIN

The app is served from the box itself. Your town, your soil, then bed by bed. Each bed runs for thirty seconds while you name it, so you watch your own sprinklers pop up as you type.

  1. Join its Wi-Fi the first time it boots, point it at your home network, and choose the device password. That password is the entire ceremony, there is no account behind it
  2. Tell it where it lives. Your town finds the weather feed; the public soil survey finds the ground under your yard.
  3. Name the beds. As you type, the valve you are naming runs for thirty seconds. A swapped pair of wires shows itself now, while it is still cheap to fix
  4. Say what grows there, in words you would use over a fence: lawn, shrubs, natives. Nobody will ask you for a crop coefficient
  5. Set your district's watering days once, note the flow sensor's pulses-per-gallon from its datasheet, and export the settings backup file.
  6. Stop thinking about it. It waters, it explains, it emails nobody. And if anything is ever refused, the daybook tells you which rule said no, in a sentence

THEN NOTHING

Consider it watered.

Questions the guide didn't answer live in the repo's hardware notes, and the daybook on the device answers for itself.

Back to maali.garden