We're the agronomic brain HA users have been trying to build with custom Python and ten HACS add-ons. Drop TurfPulse into your dashboard in 5 minutes via the REST sensor. Get back: MAD bucket, dewpoint disease windows, Smart Split irrigation, Smith-Kerns dollar spot pressure — every datum tied to a citation, every decision auditable.
HA users and TurfPulse users tend to be the same person — someone who wants the math to be visible, the data to be portable, and the automation to be honest about why it just made a decision.
One JSON snapshot per 5 min, populated with everything a homeowner-grade weather station + sprinkler controller can't tell you on its own:
"fire" / "hold" / "spray" / "monitor" / "ok". Drop straight into a `value_template` for an HA sensor. Use it to flash a light, push a notification, or color a Lovelace tile.
Management Allowed Depletion as a real number. Trigger an automation when MAD ≥ 50 % (cool-season trigger) or 60 % (warm-season). FAO-56 PAW = 1.5″.
"spray" / "marginal" / "no_spray" plus the dewpoint band (minimal/low/moderate/heavy/stuck). Open Δ-T-aware spray windows and disease leaf-wetness alerts in one payload.
How many minutes your next scheduled Rachio fire will run after Smart Split, MAD bypass, dewpoint lock, freeze, wind, and rain skips. The honest, not-the-typed number.
configuration.yaml# configuration.yaml
sensor:
- platform: rest
name: TurfPulse Today's Call
resource: https://getturfpulse.com/api/widget/snapshot
headers:
Authorization: !secret turfpulse_token
scan_interval: 300 # 5 min — matches TurfPulse's server cache TTL
value_template: "{{ value_json.state }}"
json_attributes:
- summary
- ha
json_attributes_path: "$"# automations.yaml — example: flash kitchen light when MAD breaches
automation:
- alias: TurfPulse · MAD breach → kitchen light
trigger:
- platform: state
entity_id: sensor.turfpulse_todays_call
to: "fire"
action:
- service: light.turn_on
target:
entity_id: light.kitchen
data:
color_name: red
flash: long
- service: notify.mobile_app
data:
title: "{{ states('sensor.turfpulse_todays_call') | upper }} — TurfPulse"
message: "{{ state_attr('sensor.turfpulse_todays_call', 'summary') }}"# configuration.yaml — embed the kiosk on your Lovelace sidebar
panel_iframe:
turfpulse:
title: "TurfPulse"
icon: mdi:sprout
url: "https://getturfpulse.com/widget"
require_admin: falseTokens are 128 bits of entropy, stored at rest as SHA-256 hashes — even if our database leaked tomorrow, no one can read your raw token. We show you the raw value exactly once at creation, then it's gone from our side. Tokens are scoped to your account only and grant read access — no destructive actions, no Rachio fire, no payment changes. Revoke any time from Profile → Personal API Tokens.
The REST sensor above polls every 5 min. Webhooks push events to your HA box the instant they happen — your kitchen lights flash when MAD breaches at 2 AM, your phone notifies when the spray window opens, your dashboard reacts in real time. HMAC-SHA256 signed (Stripe pattern, you can verify), HTTPS-required for public URLs, auto-disabled after 10 consecutive failures so a forgotten HA reboot never causes a runaway.
| Event | Fires when |
|---|---|
| schedule.fired | Rachio actually ran (post-skip-checks, post-Smart-Split, post-Guardian) |
| schedule.skipped | Guardian held the fire — rain, freeze, MAD bucket sufficient, dewpoint locked |
| mad.breached | DRY zone hit the TAMU 12% drought floor — irrigate-now signal |
| dewpoint.locked | Overnight dewpoint stuck above 65°F — disease pressure window active |
| spray.window.open | Δ-T + wind + temp aligned for safe spray application |
configuration.yaml# configuration.yaml — receive a TurfPulse webhook
automation:
- alias: TurfPulse · MAD breach received
trigger:
- platform: webhook
webhook_id: turfpulse_events
local_only: false
condition:
- "{{ trigger.json.event == 'mad.breached' }}"
action:
- service: light.turn_on
target:
entity_id: light.kitchen
data:
color_name: red
flash: long
- service: notify.mobile_app
data:
title: "MAD breach"
message: "{{ trigger.json.data.snapshot.mad_pct }}% — irrigate"
# Then in TurfPulse Profile → Outbound Webhooks, register:
# URL: https://YOUR-HA.example.com/api/webhook/turfpulse_events
# Events: mad.breached, schedule.fired, schedule.skipped# Header that lands on every TurfPulse webhook delivery:
# X-TurfPulse-Signature: t=1730000000,v1=<hex_sha256>
#
# Verify by recomputing HMAC-SHA256 over "<t>.<raw_body>"
# with your whsec_ secret. Reject if they don't match.
#
# Python example:
import hmac, hashlib
expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, sig)Fair question — and a fair fight. You can. We've published the entire methodology open at /methodology/probe-driven-irrigation. If you've got 40+ hours and want to read the source papers yourself, here's exactly what TurfPulse productizes for you:
| Component | Source | DIY hours |
|---|---|---|
| FAO-56 ET₀ + Penman-Monteith + Kc | UN FAO Irrigation & Drainage Paper 56 (1998, ~200 pp) | 15–20 |
| Smith-Kerns dollar spot regression | Smith-Kerns 2013 PLoS ONE (peer-reviewed) | 6–10 |
| MAD bucket + per-soil PAW | USDA NRCS soil texture triangle | 5–8 |
| Smart Split (gap-weighted multi-day) | Bermuda root-depth research (TAMU AgriLife) | 8–12 |
| Bermuda 12 % SVWC drought floor | Wherley et al. fine sandy loam fairway research | 3–5 |
| Δ-T wet-bulb spray window | Stull 2011 wet-bulb approximation (Aus/UK canonical) | 2–3 |
| Dewpoint disease bands + GDD | Multiple turf-extension references | 5–8 |
| FRAC / HRAC / IRAC rotation tracker | FRAC 2026 code list (annual update) | 4–6 |
| Total + ongoing maintenance | All of the above, kept tuned as research updates | 48–72 hrs + indefinite |
We'd actually love to read your write-up. Open the methodology page, fork the math, ship it as a HACS package — you'll learn a ton and the HA community will benefit. Send us a link, we'll cross-link it from this page.
Read the methodology →$80/year (Enthusiast Annual). All of the above, tuned weekly as we onboard more soil-test feedback. 5-min HA setup. Cancel any time. Free tier covers most homeowners — paid only if you want the closed-loop webhooks + 365-day depletion history.
See plans →Honest disclosure: a few HA tinkerers will rebuild this from the methodology and never pay. That's fine — they're not our customer and we're a fan of open agronomy. The other 95 % of HA users would rather skip 60 hours of FAO-56 reading. That's who we built TurfPulse for.
Not yet — the REST sensor approach works today with zero install. A first-class HACS custom component is on the roadmap for users who want it discoverable in the HA integrations GUI. The data shape and auth are stable, so anything you build today keeps working when HACS lands.
Read-only. Personal API tokens cannot fire schedules, change settings, promote founders, or delete anything. The hybrid auth dependency is mounted ONLY on safe read endpoints. If you want to fire a Rachio zone from HA, point HA at Rachio's native cloud API directly — TurfPulse never wants to be in the middle of a destructive action it can't audit.
Tokens are random 128-bit values, stored at rest as SHA-256 hashes (we never see the raw value after creation). Tokens are scoped to YOUR account only — they can't read another user's data. Revoke from Profile any time; the next request fails immediately.
The widget snapshot endpoint server-side caches per user for 5 min, so HA polling at scan_interval: 300 hits the cache directly. You can poll faster but you'll see the same payload. Other endpoints (live ecowitt, calendar) hit upstream APIs — keep them at 5+ min.
No — TurfPulse is a hosted SaaS. The agronomy models (Smith-Kerns, FAO-56 ET₀, Bermuda drought floor, GDD) get tuned weekly as we onboard more soil-test feedback. Self-hosting would freeze the math on whatever day you cloned it. If you want fully local irrigation logic, OpenSprinkler + your own scripts is a legitimate path — TurfPulse is for people who want the agronomy curated.
If your probe data lives in HA, you can pipe it INTO TurfPulse via webhook (roadmap, Phase 2). If your probe is an Ecowitt WH51 / WN34 / WH52, just connect it natively in TurfPulse Profile → Ecowitt and skip the bridge.
Yes — `panel_iframe` works today (config snippet above). A first-party Lovelace custom card is on the roadmap. The REST sensor + a stock entities card already gets you 90 % of the visual.
Generate a token, paste the YAML, restart HA. If it doesn't land in your Lovelace dashboard within the next coffee break, email us — we read every word.
Inner Circle members get outbound webhooks (HA reacts in real time, not on 5-min polls), 365-day depletion history, 10 API tokens, and the founding-member crest. Free through Oct 31, 2026 · then $4.99/mo locked for life. Card captured at signup, $0 charged today.
"Home Assistant" is a trademark of the Open Home Foundation. This page reflects the TurfPulse team's integration approach and is not affiliated with or endorsed by Home Assistant or the Open Home Foundation.
Made with Emergent