Start with the schedule, not the valve

A Home Assistant irrigation rain delay should prevent the next scheduled watering. First find out what starts that watering: the controller’s own program or a Home Assistant automation. Then put the rain check in that path.

For a controller that already manages its schedule, keep that arrangement and use its built-in delay setting. The Rain Bird example below changes a delay measured in days. It does not replace the controller’s schedule or open any zones. Other integrations expose different controls: RainMachine, for example, separates restrictions on starting from pausing and stopping. Check the exact action for your integration before copying a recipe. Rain Bird documentation; RainMachine documentation.

A zone is one separately controlled watering area. If Home Assistant starts each run, a rain check belongs immediately before that start. Turning a zone off once does not remove tomorrow’s scheduled start. Keep the device’s rain, freeze and run-time protections in place; this guide adds a convenience rule, not flood protection.

Researched from Home Assistant and Rain Bird documentation on October 4, 2026. The worked examples are illustrative configurations, not a tested irrigation installation. The cover is an AI-generated garden illustration.

1. Find the correct control

Write down every place that can start watering: the controller, a vendor app schedule, Home Assistant, and any other automation service. Choose one regular schedule owner so a second program cannot quietly start a skipped run.

On a phone, swipe the table sideways.

Your setupWhere the check belongsWhat to verify
The controller runs a saved programUse its built-in rain delay or documented schedule restriction.The intended programs and zones are covered, and the resume day is correct.
A Home Assistant automation starts each runPut a rain/hold condition immediately before every start action.No separate controller schedule starts the same zones.
A valve has only on/off controlFirst establish a reliable, device-side maximum run time.A Home Assistant crash cannot leave the valve open indefinitely. An ordinary delayed “off” action is insufficient.

Do not treat a restored Home Assistant countdown as a hardware shutoff. The timer restart guide explains the missed-finish-event case; the server cannot close a valve while it is offline.

2. Define what “enough rain” means

For this example, imagine a garden whose owner has chosen to skip the next scheduled watering after at least 5 mm of measured rain over the previous 24 hours. That is a demonstration threshold, not a watering recommendation for every soil, plant or climate.

  • Use an amount: millimetres (mm) or inches (in). A rate such as mm/h describes intensity, and a percentage describes probability; neither is a rainfall total. Five millimetres is about 0.20 inches.
  • Read the period: “today” usually means since midnight. At 5:45 am it can omit yesterday evening’s rain. A lifetime counter also needs a correctly calculated time window before it can answer this question.
  • Check the source: a measured backyard total and predicted rain are different evidence. A sensor in Home Assistant is one named reading; its entity ID is the address you use to select it.
  • Check freshness: a valid number can still be old. Use the source’s documented measurement timestamp or health signal. An unchanged zero is not automatically stale; Home Assistant’s last_changed only says when a value changed. Even last_reported records a write to Home Assistant, not proof of a fresh physical measurement. State timestamps explained.

If your integration does not provide a trustworthy rainfall period and freshness check, keep the rule as a reminder for a person to review. For choosing a source of outdoor readings, see the Home Assistant weather station guide. For missing-device warnings, use the separate availability notification guide; availability alone does not validate a rainfall total.

3. Build the Rain Bird delay rule

This path is for an existing Rain Bird controller connected through its supported LNK WiFi module, already set up in the Rain Bird app and Home Assistant. The module is a hardware prerequisite, not something software supplies. Controllers using newer HTTPS firmware require Home Assistant 2026.3.1 or later. The integration’s control connection is local; a web weather provider would add a separate internet dependency. Check current prerequisites and version limits.

  1. Locate Rain Delay on the controller’s Home Assistant device page. Note its number. entity ID, allowed values and current delay. Select this entity specifically, rather than a zone switch or a whole area.
  2. Record the controller’s next start. If the first watering is at 6:00 am, set a time trigger for 5:45 am in a new automation under Settings → Automations & scenes. Confirm Home Assistant and the controller agree on local time. Leave the draft disabled while building it.
  3. Add a Choose action with the four branches below, in that order. A Choose action runs the first matching branch; use its default branch for “no new delay.” Use a message inside Home Assistant for every branch during rehearsal. “No change” means do not call any controller action.
  4. Run the harmless rehearsal in the next section. Then connect your real readings to the disabled draft’s conditions, keeping its outputs as messages. For live readings, require the expected unit, period, numeric value and source-specific freshness check. Do not set a missing reading to zero to make a template work.
  5. After verifying the live decisions, change only the “add delay” branch to the Number: Set value action shown below. Keep an in-app message explaining the decision. Enable the time trigger and supervise the first scheduled result.

For the live conditions, define “invalid” as a missing/non-numeric value, negative amount or delay, unexpected unit or period, or a failed freshness check. Use delay > 0 for an active pause and rain >= 5 together with delay == 0 for adding one. A template condition supports these inclusive comparisons; the visual numeric-state “above” field does not include equality. Condition types.

The four branches are: invalid data → request a check; active delay → keep it; sufficient rain with no delay → add one day; otherwise → make no change. The invalid-data branch leaves the controller’s original schedule in charge, so watering may still occur. If that is unsuitable for your garden, use a reviewed controller suspension or manual review instead of assuming the missing-data message has stopped anything.

action: number.set_value
target:
  entity_id: number.your_controller_rain_delay
data:
  value: 1

Replace number.your_controller_rain_delay with the actual entity ID. This uses number.set_value for a device setting, not input_number.set_value for a helper. Put it only in the verified wet/no-existing-delay branch. Number actions.

Check the exceptions before enabling it. Rain Bird allows manual watering while a delay is active, and some ESP-Me stations configured to ignore the rain sensor are also exempt from Delay Watering. Inspect the exact model’s settings and manual. Do not prove a skip by manually starting a zone: that follows a different path. Manual watering during a delay; ESP-Me station exceptions.

4. Rehearse without changing the controller

Under Settings → Automations & scenes → Scripts, create a new script, open its YAML editor and paste the following. YAML is the text version of the editor’s settings. This script uses made-up inputs and only writes a notification inside Home Assistant. It reads no live sensor and changes no valve or delay.

data_usable represents the result of checking the source, period, unit and freshness. In this rehearsal you set it yourself; it is not an automatic sensor-health test.

Notification-only rehearsal script
alias: Irrigation rain delay rehearsal
mode: single
sequence:
  - variables:
      rain_mm: 6
      delay_days: 0
      data_usable: true
      threshold_mm: 5
  - action: persistent_notification.create
    data:
      notification_id: irrigation_rain_delay_rehearsal
      title: Irrigation rain delay rehearsal
      message: >-
        {% if not data_usable
              or not is_number(rain_mm)
              or not is_number(delay_days)
              or rain_mm | float(0) < 0
              or delay_days | float(0) < 0 %}
          CHECK DATA: leave the controller unchanged.
          Its existing schedule may still run.
        {% elif delay_days | float(0) > 0 %}
          KEEP DELAY: leave the existing pause unchanged.
        {% elif rain_mm | float(0) >= threshold_mm %}
          ADD DELAY: propose 1 day on the controller.
        {% else %}
          NO NEW DELAY: leave the controller unchanged.
        {% endif %}

Save and run the script. Open Home Assistant’s notifications: the initial values should produce ADD DELAY. That message is a proposal, not confirmation that a controller changed. Edit the variables, save and run again for each row below. The stable notification ID replaces the previous message. Script variables and templates; In-app notifications.

Rehearsal inputsExpected messageMeaning for the live rule
Rain 6 mm; delay 0; usable trueADD DELAYEnough measured rain: propose one day.
Rain 5 mm; delay 0; usable trueADD DELAYThe threshold includes exactly 5 mm.
Rain 6 mm; delay 3; usable trueKEEP DELAYPreserve the household’s three-day pause.
Rain 0 mm; delay 3; usable trueKEEP DELAYDry readings do not cancel an existing pause.
Rain 2 mm; delay 0; usable trueNO NEW DELAYNo new rain-based intervention; other restrictions remain.
Set rain to "unknown", or usable to falseCHECK DATANo claim of dry weather and no controller change.

The example deliberately checks an already-active delay before adding one. It also never writes zero, which would cancel a pause. Rechecking every few minutes and repeatedly writing “1 day” can keep extending a pause; start with one deliberate evaluation before the first watering, then inspect the resume day.

5. Confirm a skip and a sensible return to watering

Use the disabled draft’s live-data messages first. Once those decisions are correct, supervise a naturally wet scheduled day with the controller action enabled. Confirm its delay setting and displayed resume day, then observe the intended scheduled start being skipped. A successful Home Assistant action or a cached calendar entry alone does not prove that every physical zone stayed off.

Rain Bird resumes its regular schedule after the delay expires. Check that the next eligible day still suits the garden and local watering restrictions; do not clear a pause just to test. If Home Assistant was offline before the trigger, it could not send a new delay. Independent controller protections remain important. Rain Bird delay expiry.

Read the automation trace—the record of which steps ran—to distinguish a missed trigger from a failed condition or action. Testing an automation’s Run actions command skips its triggers and top-level conditions; it is not proof that the scheduled event will pass. Testing and traces.

Can I skip because rain is forecast instead?

Yes, but treat a forecast as a prediction. Home Assistant’s current weather state, such as rainy, is not tomorrow’s rainfall. Use weather.get_forecasts, select a forecast type your provider supports, and examine the returned timestamps, amounts and precipitation_unit. An hourly value is not a whole-day total; probability and amount are separate fields. Missing amounts do not mean zero. Forecast response fields; Weather states and units.

For a first setup, keep forecast skips advisory until you have compared predictions with actual rain at home. A forecast that repeatedly predicts rain can otherwise postpone watering again and again. Add a review reminder after a chosen number of skipped runs, rather than automatically overriding rain or freeze protections.

When the result looks wrong

What you seeCheck firstNext step
It watered despite a delayWas this a manual/HA start, another schedule, or an exempt station?Inspect the start source and model settings before changing the rain threshold.
Rain was above the threshold, but nothing ranA numeric-state trigger fires on a crossing; it need not fire just because the value is already high.Evaluate at a scheduled time before watering, with the threshold as a condition. For exactly 5 mm to count, use a template with >= 5; a numeric “above 5” condition excludes 5.
“Today’s rain” says zero after a wet eveningDid the sensor reset at midnight? Is it a rain rate rather than an amount?Choose the correct period and unit; do not reduce the threshold to compensate.
A three-day pause becomes one dayDoes every wet reading overwrite the delay?Only add a delay when its current value is zero.
The controller rejects commandsVersion compatibility, integration errors and concurrent Rain Bird app use.Close the app, allow the integration to refresh and inspect errors; avoid rapid repeated commands.

Home Assistant’s trigger documentation explains threshold crossings. The Rain Bird limitations describe its single-request connection constraint.

Other practical questions

Does this work without internet?

Rain Bird’s supported Home Assistant control path is local. A local rain source can keep that part local too, but forecasts and some weather stations depend on online services. Home Assistant, the network and controller must still be working when the rule sends a new delay.

Will the rehearsal notify my phone?

No. It creates a message inside Home Assistant. Add and test a separate phone notification if you need to hear about a missed check while away.

Is 5 mm the right threshold for my garden?

It is only the worked example’s value. Choose the threshold and pause length around your plants, soil, recent watering and local restrictions, then observe the result. This simple rule does not calculate plant water needs.