Why Didn't It Water Today? Reading Your ZoneFlow Status

You walk out in the morning, the lawn looks thirsty, and the sprinklers did nothing. It's an annoying moment, and the first instinct is to assume something broke.
Most of the time nothing is broken. ZoneFlow decided not to water, and it will tell you why. You just need to know where to look. I'll go through the three places, then the usual reasons, then what to do if the answer really is "something is wrong".
Step 1: Read the Status
Every zone has a Status sensor, and it's also the sentence at the top of the ZoneFlow card. It says what the zone did last and why, in plain words. For example:
- "Routine watering skipped at 05:30: the soil is wet (72%)"
- "Routine watering skipped at 05:30: 8 mm of rain forecast"
- "Routine watering done at 05:30: 12 mm in 40 min · next Mon 05:30"
That one line answers the question most days. If it says "done", the zone did water and the answer is in the run itself. If it says "skipped", the reason is right there, with the number that caused it.
The Status follows your Home Assistant language, so you don't need to decode anything.
The usual reasons, and which ones are normal
The soil is wet. If you have a soil moisture probe, wet soil holds a watering back. That is the point of having a probe. If the reading looks wrong for the weather, check the probe's position and battery. ZoneFlow will also warn you if wet readings have held watering back for several days, or if the probe looks frozen on one value.
Rain is forecast. When enough rain is expected, ZoneFlow waits for it instead of watering first. The default is 3 mm, and you can change it per zone with the Forecast Rain Skip Threshold. This only works if the zone has a weather service with a forecast connected. If you find the forecast is often wrong where you live, lower the amount or look at how often skips pay off (I'll cover that in a separate post). ZoneFlow also won't hold off forever: if rain keeps being forecast and doesn't arrive, it waters anyway and tells you.
It rained recently. Real rain counts as watering, as long as ZoneFlow knows about it. That takes a rain gauge, rain you type in by hand, or readings from nearby weather stations (more on that below). If recent rain already covers what the zone needs, the run is skipped, and the Status shows how much rain it counted. A deep soak that is due is held back after a wet fortnight for the same reason.
The soil is still drying out after rain. After a proper rain that ZoneFlow knows about, each zone waits a set number of days before it waters again, so it doesn't water soil that is still soaked below the surface. The default for routine watering is 4 days. The Status tells you the date it's waiting until. If you find this holdoff is too long or too short for your soil, the setting is called Routine Dry-Down Holdoff, and ZoneFlow can also adjust it for you over time. See Snooze and self-tuning.
It was too cold. If the temperature is under the frost guard (2 °C by default), the run waits and checks again every hour for a few hours, then waits for its next scheduled time. See Frost guard and pause.
It was raining. With a rain gauge, a run that starts in the rain is cancelled, and one that gets rained on mid-cycle stops and says how long it ran.
You told it to. Snooze for today and Pause both show in the Status ("Snoozed for today", "Paused: no watering until Pause is switched off"). It's easy to forget you pressed one.
A service run had the valve. If you were testing the valve, the scheduled run was skipped and says so.
If you have no rain gauge or soil probe
Several of the reasons above depend on ZoneFlow knowing what the weather and the soil are doing. It can only act on what it can measure.
With no rain gauge, no rain typed in and no nearby weather stations, a zone waters as if it never rains. You will never see "recent rain covers it" or "drying out after rain" in the Status, and that is not a fault, it just has nothing to go on. In the same way, the "soil is wet" skip needs a soil moisture probe, and the forecast skip needs a weather service.
A rain gauge is the best fix, and it doesn't have to be expensive. There is a cheap one built from a Misol tipping bucket and an Aqara Zigbee sensor, described in A cheap DIY rain gauge for ZoneFlow. If you don't want a gauge at all, you can type in rain you read from a simple jar or rain gauge, or borrow readings from weather stations near you. See Rain without a gauge. What each sensor adds lists what every sensor switches on.
When the answer is "something is wrong"
A few Status lines mean ZoneFlow wanted to water and couldn't, or chose not to for safety. These are the ones to act on:
- "On hold: an earlier run didn't finish (the zone is locked)". A run was interrupted, for example by a restart or a power cut, and the zone is waiting for you. Pressing Reset Irrigation Lock on the zone clears it at once. If you leave it alone, ZoneFlow clears a lock that has been stuck for more than 3 hours by itself and sends you a message.
- A watering "not run" because of the cap, with a line like "not run at 05:30: 400 min needed, over the 124 min cycle cap". The calculated run time went over the safety cap for the zone. This nearly always means the flow rate or the weekly target is set wrong. A run time of several hours is not a sign the plants are desperate, it's a sign a number is off.
- "Not run ... it would pass today's safety cap". The zone has already watered enough minutes today.
Phone notifications cover the same ground, and you can set them per zone to everything, warnings only or nothing. See Status, notifications and repairs.
Step 2: Check the CSV log if you want the numbers
If the Status isn't enough, or you want to look at the last few weeks, every zone writes a CSV file with one row for every run, skip and warning. Each row has the time, what happened, the target amount, the rain deducted, the run time, and the rain over the last 3 and 7 days.
It's a plain file you can open in a spreadsheet. The path is set when you create the zone, and it defaults to a name based on the zone. The log is always in English, even if Home Assistant is in another language, so the history stays consistent. See CSV event log.
I find it most useful when something feels off over several days rather than one morning. You can see the skips next to the rain numbers and tell whether the pattern makes sense.
Step 3: The pattern test
If a single skip looks fine but the plants still seem dry, look at the pattern instead of the day:
- Open the CSV and look at the last two weeks.
- Check that the total water given roughly matches the weekly target for the zone.
- If it's well under and the rain numbers don't explain it, one of the holdbacks is probably too cautious for your soil. The dry-down holdoff and the forecast threshold are the two to look at first.
If it's well over, the opposite applies.
A quick checklist
If you only remember one thing from this post, make it this order: read the Status, check whether you pressed Snooze or Pause, then look at rain and the forecast (and whether ZoneFlow has a way to know about rain at all), then open the CSV. In my experience that finds the answer nearly every time, and most of the time the answer is "it didn't need to".