Skip to main content
Integration · Read-only · Free with any TurfPulse plan

Home Assistant runs your house.
TurfPulse runs your lawn.

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.

What we have in common

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.

  • Open-source-friendly philosophy — your data stays portable
  • Both believe homeowners deserve transparency in automation logic
  • Both work with bring-your-own hardware (Ecowitt, Rachio, ESPHome)
  • Both let you script around the rules instead of being trapped by them

What lands on your HA dashboard

One JSON snapshot per 5 min, populated with everything a homeowner-grade weather station + sprinkler controller can't tell you on its own:

state — single-word call

"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.

mad_pct + mad_status

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_status + dewpoint_band

"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.

next_run_minutes

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.

5-minute setup

  1. Sign into TurfPulse → Profile → "Generate new token". Copy the `tp_live_…` value (you only see it once).
  2. In Home Assistant, edit `secrets.yaml` and add: `turfpulse_token: "Bearer tp_live_…"`
  3. Paste the REST sensor block into `configuration.yaml`.
  4. Restart Home Assistant (or reload "Manually Configured Sensors" from Developer Tools → YAML).
  5. Open Developer Tools → States and verify `sensor.turfpulse_todays_call` is reporting a value.
  6. Wire it into automations or your Lovelace dashboard. That's it — 5 minutes.

1. REST sensor — paste into 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: "$"

2. Example automation — kitchen light flashes red on MAD breach

# 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') }}"

3. Or embed the kiosk in your sidebar (no YAML for the dashboard)

# configuration.yaml — embed the kiosk on your Lovelace sidebar
panel_iframe:
  turfpulse:
    title: "TurfPulse"
    icon: mdi:sprout
    url: "https://getturfpulse.com/widget"
    require_admin: false

The honest split

  • 1TurfPulse handles every agronomy decision — GDD, MAD, FAO-56 ET₀, Smith-Kerns, dewpoint disease, Δ-T, Bermuda drought floor.
  • 2Home Assistant handles your house — lights, locks, presence, voice, scenes, dashboards.
  • 3TurfPulse exposes "today's call" as a REST sensor; HA reacts however you want.
  • 4Want HA to push a notification when TurfPulse skips a fire because of forecast rain? One automation. Done.

Token security in plain English

Tokens 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.

Inner Circle feature · the closed loop

Don't poll. Get pushed.

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.

EventFires when
schedule.firedRachio actually ran (post-skip-checks, post-Smart-Split, post-Guardian)
schedule.skippedGuardian held the fire — rain, freeze, MAD bucket sufficient, dewpoint locked
mad.breachedDRY zone hit the TAMU 12% drought floor — irrigate-now signal
dewpoint.lockedOvernight dewpoint stuck above 65°F — disease pressure window active
spray.window.openΔ-T + wind + temp aligned for safe spray application

Receiving end — paste into HA 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

Verifying the HMAC signature (optional, but recommended)

# 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)

"Why not just build this in HA myself?"

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:

ComponentSourceDIY hours
FAO-56 ET₀ + Penman-Monteith + KcUN FAO Irrigation & Drainage Paper 56 (1998, ~200 pp)15–20
Smith-Kerns dollar spot regressionSmith-Kerns 2013 PLoS ONE (peer-reviewed)6–10
MAD bucket + per-soil PAWUSDA NRCS soil texture triangle5–8
Smart Split (gap-weighted multi-day)Bermuda root-depth research (TAMU AgriLife)8–12
Bermuda 12 % SVWC drought floorWherley et al. fine sandy loam fairway research3–5
Δ-T wet-bulb spray windowStull 2011 wet-bulb approximation (Aus/UK canonical)2–3
Dewpoint disease bands + GDDMultiple turf-extension references5–8
FRAC / HRAC / IRAC rotation trackerFRAC 2026 code list (annual update)4–6
Total + ongoing maintenanceAll of the above, kept tuned as research updates48–72 hrs
+ indefinite

If you want to build it

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 →

If you'd rather skip to the part where your grass looks better

$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.

Common questions

Is this a HACS integration?

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 or read/write?

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.

How is the auth protected?

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.

What's the rate limit?

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.

Can I run TurfPulse fully offline / on my own HA box?

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.

I'm running ESPHome / Tasmota / a Pi with a custom probe. Will it work?

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.

Do you have a sample Lovelace card?

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.

Ready in 5 minutes. Free with any plan.

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.

Or claim a founding seat

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