TurfPulse translates soil-moisture readings into the exact minutes of runtime needed — per zone, per fire. The math isn't proprietary. It's the same FAO-56 + Christiansen framework university extensions have used for decades. We just wired it to a Rachio.
This page documents the formula in full so anyone can rebuild it. Copy it. Run it in Excel. Or let TurfPulse run it 24/7 for the price of a bag of fertilizer per month.
Each step has a citation. Each step is independently testable. This is the entire engine.
SVWC = Soil Volumetric Water Content (what the probe reads). For Bermuda we target 30%. That's safely above TAMU's 12% drought floor and inside the OPTIMAL bucket band.
# Bermuda default target_svwc_pct = 30 # TAMU AgriLife: bermuda fairways enter # visible drought stress below 12% on # fine sandy loam (Wherley et al.)
How far below target is the probe right now? If at-or-above target, we don't fire — micro-fires waste water and disrupt root depth.
deficit_svwc_pct = max(0, target_svwc_pct − current_svwc_pct) # Example: probe = 22%, target = 30% # → deficit = 8%
SVWC is already volumetric — multiply by the effective root zone depth in inches. For Bermuda, TAMU pegs the effective root zone at 6" (80%+ of bermuda roots live there).
deficit_in = (deficit_svwc_pct / 100) × root_zone_in # 0.08 × 6 = 0.48"
Anything more either ponds (clay) or drains below the root zone (sand). Both wasted. This is the agronomic safe-runoff ceiling per IA SWAT testing protocols.
capped_in = min(deficit_in, 0.75)
PR = your nozzle's precipitation rate (in/hr). DU = Christiansen Distribution Uniformity (~0.75 for residential pop-ups). Clamp to [5 min, 60 min] for sanity.
effective_pr_inhr = nozzle_inhr × du raw_minutes = (capped_in / effective_pr_inhr) × 60 runtime_minutes = max(5, min(60, raw_minutes)) # Example: 0.48" / (0.5 × 0.75) × 60 # = 0.48 / 0.375 × 60 # = 76.8 → clamped to 60
Round Rock, TX. Bermuda. CH2 ("trigger zone") reads 22% SVWC at 5:30 AM predawn. Zone PR is 0.5 in/hr (rotor). User typed "30 min" in their schedule.
| Step 1 | target_svwc | 30 % | TurfPulse Bermuda default |
| Step 2 | deficit_svwc | 30 − 22 = 8 % | Step 2 formula |
| Step 3 | deficit_in | 0.08 × 6 = 0.48 in | 6 in root zone |
| Step 4 | capped_in | min(0.48, 0.75) = 0.48 in | Below cap |
| Step 5 | effective_pr | 0.5 × 0.75 = 0.375 in/hr | PR × DU |
| Step 5 | raw_minutes | 0.48 / 0.375 × 60 = 76.8 | Inches → min |
| Step 5 | runtime_minutes | 60 min | Clamped to MAX_RUN_MIN |
TurfPulse fires Zone 2 for 60 minutes instead of the typed 30, because the probe says the deficit warrants it. Three days later when the same probe reads 28%, TurfPulse fires Zone 2 for ~10 minutes. Same total weekly water — distributed where the soil asks for it.
Copy this worksheet. Punch in your probe reading at B1. Cell B11 is your runtime.
| Cell | Label | Formula / Value |
|---|---|---|
| B1 | current_svwc_pct (probe) | enter from probe |
| B2 | target_svwc_pct | 30 |
| B3 | root_zone_in | 6 |
| B4 | nozzle_inhr (PR) | 0.5 |
| B5 | du | 0.75 |
| B6 | deficit_svwc_pct | =MAX(0, B2-B1) |
| B7 | deficit_in | =(B6/100)*B3 |
| B8 | capped_in | =MIN(B7, 0.75) |
| B9 | effective_pr_inhr | =B4*B5 |
| B10 | raw_minutes | =(B8/B9)*60 |
| B11 | runtime_minutes (final) | =MAX(5, MIN(60, B10)) |
Every threshold on this page traces back to peer-reviewed work. Click through for the DOI.
See the full data sources & credits page for every weather feed, soils dataset, and model TurfPulse uses — with public URLs and licenses.
Honesty check before you click "buy": probes don't talk to Rachio out of the box. Ecowitt sensors broadcast on 915 MHz to their own gateway → gateway pushes to Ecowitt's cloud → something (TurfPulse, or your own script) reads that cloud and tells Rachio what to do. There's a small wiring layer in between. A geek can figure it out in an afternoon. A homeowner who's never seen an API key is going to want a guide. This is that guide.
Same hardware I run on my own lawn. Buying through these links costs you nothing extra and helps me keep the lights on at TurfPulse — which is how this guide stays free instead of behind a paywall. Amazon Associates disclosure applies.
| Gear | Why | Cost band | Get it |
|---|---|---|---|
| Ecowitt GW1100 Wi-Fi Gateway | The hub. One per house. Receives every probe + station signal and pipes it to Ecowitt cloud. | $ | Amazon |
| Ecowitt WH51 Soil Moisture Probes (3-pack) | The brains of the operation. Bury one per zone trio (DRY / AVG / WET). The combo TurfPulse parses today. | $$ | Amazon |
| 🆕 Ecowitt WH52 Soil Moisture + Temp + EC (3-in-1, 2026) | Newer single-probe combo — moisture (0–100%) + temp (−40 to 60°C) + electrical conductivity 0–10,000 μS/cm (catches salt buildup from over-fertilizing or hard water). Replaces the WH51+WN34 pair with one battery, one hole per zone, IP66 entire device, 16 channels per gateway. Pairs with GW1100 (match 915 MHz US version). $29.99 each on Amazon — cheaper than buying WH51+WN34 separately. ✅ TurfPulse parses WH52 payloads natively (moisture + temp + EC bands: deficient/ideal/watch/high). Plug it in, the dashboard fills in. | $$ | Amazon |
| Ecowitt WN34 Soil Temperature Probe (skip if going WH52) | Drives pre-emergent timing + warm-season green-up alerts. Buy ONLY if you went WH51 — the WH52 already includes temperature. | $ | Amazon |
| Rachio 3 Smart Sprinkler Controller (8 or 16 zone) | The actuator. Anything with the public Rachio API works; the 3rd-gen has the cleanest auth flow. | $$$ | Amazon |
| Catch-cup set (12 cups) | You need to MEASURE your nozzle PR for Step 5 of the formula. Don't skip this — guessed PR is worse than no PR. | $ | Amazon |
| Ecowitt WS90 7-in-1 Weather Station | NOT REQUIRED. Skip this. The closed-loop runs on soil probes alone — they're the only sensor that talks to the dirt your roots actually live in. Forecast data from your local NWS station is already plenty. The WS90 is a "nice-to-have" for backyard weather hobbyists, not a prerequisite. | $$$ (skip) | Amazon |
FTC disclosure: As an Amazon Associate, TurfPulse earns from qualifying purchases. The list above isn't every probe on the planet — it's the gear that's actually been buried in my own yard for the Memorial Day Showcase, with the part numbers that play cleanly with the Ecowitt cloud → TurfPulse → Rachio pipeline.
Pick a fixed convention before the shovel hits dirt. I use CH1 = DRY zone (worst-draining), CH2 = AVG (representative baseline), CH3 = WET (the over-water guard). Label them with a Sharpie. Never move them. The TurfPulse override fires off CH1 specifically — get that one in your worst spot.
Set up the Ecowitt gateway in the WS View Plus app. Once probes are reporting, generate an Application Key + API Key in the Ecowitt web console (User Center → API). Copy the MAC of your gateway. Three strings. Put them somewhere safe.
Rachio web app → Account Settings → Get API Key. Generate a Personal Access Token (PAT). This is the credential that lets anything on the internet fire your zones — keep it private. TurfPulse stores it encrypted at rest with Fernet keys.
You can roll your own glue (a 50-line Python cron job that polls Ecowitt and POSTs to Rachio) or paste your three Ecowitt strings + Rachio PAT into TurfPulse and let the cron loop + Guardian + skip-gates run 24/7. Either path works. Both end at "my sensors told the controller when to water."
A two-week experiment proves nothing. The real proof is lasting the whole summer. May through October, full Texas heat, the controller deciding for itself based on probes — that's the test.
Track your municipal water bill from the same months last year. Most homeowners running probe-driven irrigation see 20–40% water reduction versus a calendar-fired Rachio with stock Weather Intelligence. On a $180/month summer water bill, that's $35–$70 saved every month — call it $200+ across the season.
Here's the rule for that money: it goes back into the soil. Compost. Gypsum. Humic acid. A bag of Essential G. Soil amendments compound — better soil holds more water, which lets the probes report higher SVWC, which lets the controller fire less, which saves more money, which buys more amendments. That's the flywheel.
| Average TX summer water bill | $180 / month × 6 = $1,080 |
| Conservative 25% reduction | −$270 saved |
| → 4 bags of Essential G (humic + biology) | ~$120 |
| → Pelletized gypsum (40 lb × 2) | ~$50 |
| → Compost top-dress for 1 zone | ~$80 |
| Net: water bill funded next year's soil work | $0 out of pocket |
Compiled by Derwin — a regular guy in Round Rock, TX who got tired of his Rachio firing through rainstorms and skipping during heat waves. He buried three soil probes at sunset, watched CH2 dry first, mapped them to zones, and figured out that the math is the easy part — getting the probes to actually talk to the controller is what nobody tells you about.
This page exists because he built the wiring once, wrote it down, and decided that gating it behind a paywall would be a betrayal of why he started TurfPulse in the first place. Use the math. Use the guide. Buy the gear through his links if you want to say thanks. And if your water bill drops this summer — that's him helping you save it. Tip your hat.
"My sensors told the controller when to water." — the headline he wrote two weeks before the Memorial Day reveal.
You can absolutely DIY this. The math is here. The probes are about $40 each on Amazon (you only need 1–3). You don't need a weather station — your local NWS station already covers forecast and ET₀ inputs. An afternoon of soldering and Python and you've got your own little brain.
What TurfPulse charges for is the part that's annoying:
For a homeowner that's about $5–8/month. For an enthusiast, $15. The probes pay for themselves in saved water in one summer; TurfPulse pays for itself in the second summer when the cron catches the 100° week you didn't notice because you were on vacation.
If the math here is enough for you — go build it. We'll cheer you on. If you'd rather we run it for you — we're here.
We use a single analytics cookie (Google Analytics) to see which pages get love. No ad networks, no third-party trackers. Privacy policy.
Made with Emergent