Scheduled water consumption — irrigation zones (Hydrawise) and water-treatment regeneration sessions (prefixed "Regen:"), one row per zone/device, colored, only entities active in this range are shown. A 💀 at the end of a bar means low-pressure protection force-stopped that zone rather than its schedule ending normally. See the Water treatment tab for full regen-session detail.
drag/pinch to zoom · dbl-click to reset
No zone or regeneration activity in this range.
Hydrants (manual log) — one row per hydrant name
drag/pinch to zoom · dbl-click to reset
No hydrant activity logged in this range.
Analytics health
Pump capacity trend
drag/pinch to zoom · dbl-click to reset
No admissible no-draw-topoff cycles yet.
Per-zone diagnostics
Zone
Baseline (gpm)
Latest (gpm)
Samples
Status
Active alerts
Signal
Subject
Severity
State
Value
Threshold
First seen
Last seen
No active alerts.
Low-pressure protection
Time
Event
Pressure
Zones
Action
Error
Hydrants
Hydrants share the irrigation supply but aren't metered by Flo or seen by
Hydrawise — a hydrant draw only shows up as a pressure drop. Log it here
so it isn't mistaken for a leak.
Fill / drawdown cycles
Type
Start
Duration
ΔPSI
Rate (psi/s)
40→60s
Q_pump (gpm)
Class
Zones
Flags
Water treatment
No fresh Culligan data — the last successful poll is older than expected. Cards below may be showing stale values; check ingestion (docs/SCHEDULED_JOBS.md panic-culligan).
No Culligan data yet — check ingestion (docs/SCHEDULED_JOBS.md panic-culligan).
Regeneration sessions
One row per event, newest first. Derived from consecutive polls (services/ingest/culligan_regen.py); only regens since 2026-07-09 (when Culligan polling went live) can appear. "Time spent regenerating" is only meaningful for valve-position-detected sessions — counter-detected ("shadow") sessions are only bounded to the ~15-min poll gap, not real elapsed regen time (docs/integrations/CULLIGAN.md §4). These same sessions are also overlaid on the Overview tab's "Scheduled water consumption" chart.
Device
Start
End
Status
Detection
Time spent regenerating
Days since last regen
No regen sessions detected yet in this window.
Domestic consumption cross-check — Flo's spot flow reading, Flo's own hourly consumption meter, and each Culligan device's treated-water delta (docs/integrations/CULLIGAN.md 3a). The Culligan devices sit in series on the same branch, so their lines should track each other and roughly track Flo's; a sustained divergence is a meter fault or a leak between meter points.
drag/pinch to zoom · dbl-click to reset
Refrigeration
No refrigeration data yet — check ingestion (docs/SCHEDULED_JOBS.md panic-govee) and that GOVEE_API_KEY is configured.
Temperature (°F) — thin line is the raw sensor reading, bold line is an
exponential moving average approximating actual food temperature (which lags and damps air-temp
swings from compressor cycling/door opens); dashed lines mark the excursion ceiling for each
device type present (freezer, refrigerator).
drag/pinch to zoom · dbl-click to reset
No temperature history in this range yet.
Lawn
No mow report yet - check ingestion (docs/SCHEDULED_JOBS.md panic-mow) and that TEMPEST_TOKEN/TEMPEST_STATION_ID are configured.
Mower map
Reads the Lymow One's lawn map (docs/integrations/LYMOW.md). Drag a vertex to
adjust a zone or no-go boundary. Double-click or long-press a vertex to delete it, or double-click
or long-press an edge to add a new vertex there. Then click "Preview changes" below the map to see
a text summary of what would change on the mower - it only computes and displays that summary, it
does not touch the mower or the map on screen, and there is no send-to-mower button yet
(docs/dev_planning/lymow-map-editor.md Phase 4 is blocked until the swept-area bug in docs/BUGS.md
is settled against real hardware). Adding or removing whole zones isn't supported.
Alert thresholds
Per-device overrides for the Refrigeration tab's excursion/offline alerts
(docs/integrations/GOVEE.md §4) — stored in the govee_config Firestore singleton.
Edit a field and click Save on that row; unedited fields are left as-is.
Device
Type
Max temp (°F)
Excursion (min)
Offline (min)
No refrigeration devices configured yet.
Guardian
Low-pressure protection interlock thresholds (Protection tab) — stored in the
guardian_config Firestore singleton. The on/off switch itself lives on the Protection
tab, not here.
Lawn
Mow advisor vetoes, shade factor, and Tempest station (Lawn tab) — stored in the
lawn_config Firestore singleton. Editing the Tempest station ID takes effect on the next
mow poll; everything else too.
Water treatment
Culligan salt/media alert floors and regen burst-window timing (Water Treatment
tab) — stored in the site_calibration Firestore singleton.
How this system works
A well feeds a pressure tank through a pressure switch that cycles the pump on and off
between a low cut-in pressure (~40 psi, pump turns on) and a high cut-out
pressure (~60 psi, pump turns off). From the tank, plumbing splits into two independent
branches: an irrigation branch (Hydrawise-controlled zones, plus hydrants that are
opened by hand) and a treatment branch (a Culligan softener and Calcite filter in
series) that feeds two homes through a Flo smart meter. The Flo meter only sees the
treatment/domestic branch — irrigation and hydrant draws never register on it, which is why
several of the detectors below have to explicitly account for what else might have been
drawing water at the same time.
Alerts
Each alert has a state: open (currently active, triggers an email),
acknowledged (you clicked Acknowledge — still tracked, but reminder emails
stop), or cleared (condition is no longer present, triggers a one-line
"resolved" email).
Over-draw warning
An irrigation zone is drawing water noticeably faster than its own historical normal.
Possible causes: a broken sprinkler head, a blown fitting, a stuck-open valve, or a new
leak in that zone's line.
Under-draw warning
A zone is drawing noticeably slower than its own historical normal. Possible causes: a
clog, a partially failed valve, or a supply restriction.
Valve didn't close critical
After a zone's scheduled run ends, pressure should recover to normal within about 10
minutes. It didn't — and nothing else (another zone, in-home use, a hydrant, or a
system-wide low-pressure trip) explains why. Most likely cause: that zone's valve is stuck
open. A single occurrence is worth investigating on its own.
Switch drift warning
The pressure switch's cut-in/cut-out setpoints have shifted by 2+ psi from their
established baseline, in either direction. Flags mechanical wear in the switch itself, and
also matters because drift narrows the safe measurement window that the pump-capacity
trend below depends on.
Pump capacity drop critical
An abrupt, statistically detected drop in how fast the pump refills the tank (see
q_pump_gpm below), separate from the slow long-term trend. This is the
earliest warning of a sudden mechanical problem such as a chipped impeller or a partial
blockage.
Short-cycling critical
The pump is turning on and off much faster than a healthy tank should allow, during
cycles when nothing was actually drawing water. Usually caused by a waterlogged pressure
tank or a failing pressure switch — independently damaging to the pump from motor heating
and start-current wear.
Unaccounted drawdown warning
Tank pressure dropped as if water were being used, but the Flo meter measured no flow,
no irrigation zone was running, and no hydrant was logged open. Recurring instances
suggest a leak somewhere that isn't visible to any meter.
Overnight pump starts warning
The pump refilled the tank overnight (roughly 1–5am), a time nothing should be drawing
water. Recurring overnight fills suggest water is leaving the system with no accounted-for
use — i.e. a leak. Culligan regeneration cycles are automatically excluded, since they
legitimately draw water overnight.
Low salt warning
The Culligan softener's brine tank salt level has dropped below the refill threshold
(default 20%). Add salt.
Low filter media life warning
The Culligan Calcite filter's remaining media capacity has dropped below its threshold
(default 2,000 gallons). The filter media will need replacing soon.
Device error critical
The Culligan softener or filter is reporting an internal fault (e.g. a motor or position
error) instead of its normal "System OK" state. Check the device directly.
Temp excursion critical
A freezer's Govee sensor has read above its configured ceiling (default 10°F)
continuously for longer than its debounce window (default 60 min) — a brief spike from
opening the lid does not trigger this. An active spoilage risk.
Sensor offline warning
A freezer's Govee sensor has been offline, or hasn't reported a reading, for longer than
its configured threshold (default 45 min). This does not mean the freezer is warm — it
means there's no way to currently confirm it isn't.
Low-pressure protection (Guardian) events
A safety interlock independent of the alerts above: if system pressure ever drops
dangerously low, it stops irrigation immediately rather than waiting for a detector to
confirm a pattern.
Trip trip
System pressure fell below the trip threshold (default 25 psi) — meaning the pump is on
and still losing the fight, or something is seriously wrong. All Hydrawise irrigation
zones are stopped immediately and an alert email is sent.
Clear clear
Pressure recovered back to the cut-in threshold (default 40 psi, matching the pump's own
cut-in for hysteresis). Irrigation resumes automatically.
Action failed action failed
Low pressure was detected but the call to stop irrigation zones itself errored — the
most serious failure mode, since zones may still be running.
Alert failed alert failed
An event was detected and handled correctly, but the notification email failed to
send.
Disabled disabled
Guardian was disarmed from the dashboard (click the Armed/Disarmed label) — a break-glass
override. While disarmed it will not stop irrigation or send alerts on low pressure.
Enabled enabled
Guardian was re-armed from the dashboard after a break-glass disable.
Overview tab measurements
Status cards (top row)
The four cards at the top show the single latest sample: Pressure and Flow
(the same two signals charted below), Zone running (which Hydrawise zones, if any,
are active right now), and Ingestion errors (blue "none" when the last poll of both
Flo and Hydrawise succeeded; the error text if either poll failed, which means the data
below may be stale). The Culligan summary cards to their right come from the Water Treatment
tab.
Pressure (psi)
Raw system pressure from the Flo meter. Rises while the pump fills the tank, falls
during a drawdown (pump off, or a zone draining faster than the pump can fill).
Blue shading (pump running)
A shaded band behind the pressure trace marks when the well pump is inferred to be
running. Rising pressure is always a certain "on" — only the pump adds water to the tank.
A falling stretch is less obvious: if it's falling slower than the known draw (a
running zone, domestic flow, an open hydrant, a water-treatment regen) alone would explain,
the pump must still be running and adding water underneath it — this is the "deep recovery"
case, when demand outpaces what the pump can deliver. A paler band means the call is
low-confidence — usually an unmetered draw (hydrant or regen backwash) or a guardian trip is
driving the balance, so treat that stretch as "not sure" rather than a confirmed reading.
Flow (gpm)
The Flo meter's instantaneous flow reading. It only sees the treatment/domestic branch,
so it reads zero during irrigation — a nonzero reading during an irrigation cycle marks
simultaneous in-home use, a confounding factor for some detectors.
Irrigation zones (swimlane)
One colored row per Hydrawise zone, showing exactly when each zone ran. Only zones
active in the selected time range are shown.
Hydrants (swimlane)
Manually-logged hydrant openings (Well Pump tab). Hydrants share the irrigation branch
but aren't metered by Flo or tracked by Hydrawise — a hydrant draw only ever shows up as a
pressure dip unless it's logged here, so logging it prevents it from being mistaken for a
leak.
Analytics tab measurements
Pump capacity card
Current pump output as a percent of its established baseline, plus the long-term trend
in %/year. Shows "abrupt drop detected" if a pump-changepoint alert is open, and warns
when there's under a year of history (seasonal effects can't yet be separated from real
wear).
q_pump_gpm
The core pump-health metric: gallons per minute the pump delivers, estimated from how
fast the tank refills across a fixed pressure band during a clean "no-draw top-off" (pump
running, nothing else drawing water). Replaces the older, less comparable psi/second rate,
since psi and gallons aren't linearly related.
q_pump_sigma (error bars)
The statistical uncertainty (±1 standard deviation) on the q_pump_gpm
estimate, propagated from Flo's pressure-sensor noise.
Baseline → current (dashed line)
Connects the earliest-window median pump capacity to the most-recent-window median — the
same two numbers shown on the pump capacity card.
Q_min floor (dashed brown line)
The minimum acceptable pump output for this site's demand — falling below it means the
pump can no longer reliably keep up. Currently a placeholder value pending a proper
site-specific calculation.
Changepoint marker
The date an abrupt capacity drop was statistically detected, if any (see "Pump capacity
drop" alert above).
Switch card
Estimated cut-in/cut-out pressures (psi), and whether they're currently drifting from
baseline (see "Switch drift" alert above).
Zones card
How many zones currently have an open fault alert, and how many have enough run history
to be actively monitored ("armed").
Leak card
How many leak-related alerts (unaccounted drawdown or overnight pump starts) are
currently open.
Per-zone diagnostics table
Each zone's historical baseline draw rate (gpm), most recent draw rate, how many samples
its baseline is built from, and whether it's armed (enough history) or currently
faulting.
Well Pump tab measurements
Each row in the cycle table is one fill (pump running, pressure
rising) or drawdown (pressure falling) segment.
Rate (psi/s)
The raw pressure slope. Not comparable cycle-to-cycle, since pressure and volume aren't
linearly related across the fill band — kept for reference only, not a health metric.
40→60s
Seconds to recover from cut-in to cut-out pressure — an older, simpler fill-rate metric,
superseded by q_pump_gpm as the primary health signal.
Q_pump (gpm)
The same volumetric pump-capacity estimate as the Analytics trend chart, shown per
individual cycle.
Class (what else was happening during the cycle)
no draw topoff — nothing else was drawing water; the cleanest possible
pump-capacity measurement.
domestic only — in-home (Flo-visible) water use, no irrigation.
domestic confounded — in-home use during a fill; capacity estimate less
trustworthy.
single zone — exactly one irrigation zone running, no in-home use.
hydrant only — a manually-logged hydrant open, nothing else.
multi draw confounded — a hydrant open alongside a zone and/or in-home
use.
ambiguous — more than one zone somehow active at once (shouldn't normally
happen).
Flags
leak? — this cycle is a candidate "unaccounted drawdown" (see leak alert
above).
inter-zone gap — a clean no-draw gap deliberately scheduled between two
zones; doubles as bonus pump-capacity data.
hydrant — a hydrant was logged open during this cycle.
deep recovery — the fill started with pressure already below cut-in, i.e.
demand was outpacing the pump when it kicked on.
Water Treatment tab measurements
System OK
Blue when the device reports no fault. There's no explicit "healthy" flag on the
device — this is just the absence of any error.
Salt % (softener only)
How full the brine tank is, 0–100%. Not meaningful on the filter, which has no brine
tank.
Media life (gal) (filter only)
Remaining filter media capacity, in gallons, before it needs replacing. Not meaningful
on the softener.
Treated today (gal)
Running total of gallons treated by that device today (the device's own daily
counter).
Daily average (gal)
Mean of the last 7 days' daily totals.
Last regen
When the device last ran a regeneration (salt/media recharge) cycle.
Clock drift
How far the device's internal clock has drifted from real time. Shown so a clock jump
(e.g. after a device restart) is visible instead of silently corrupting timestamps.
Bypass
Water is currently being routed around the device rather than being treated.
Away mode
Vacation/away mode is enabled on the device.
Regeneration sessions (chart)
When each device regenerated, inferred from consecutive polls — Culligan doesn't expose
a direct regen event log, so a session is either caught mid-regen or inferred from its
lifetime regen counter incrementing between two polls.
Domestic consumption cross-check (chart)
Three views of the same water: Flo's instantaneous spot flow reading, Flo's real hourly
totalizer meter, and each Culligan device's own treated-water delta. They sit in series on
the same branch, so the lines should track each other and roughly track Flo's — a
sustained divergence points to a meter fault or a leak between meter points.
Refrigeration tab measurements
One Govee H5111 sensor per freezer or refrigerator, polled every 15
minutes (thermal mass means a compressor failure takes hours to become dangerous, not
seconds). Each card is one device — every device on the account gets a card automatically,
no code change needed (adding a sensor does require an ingest redeploy to pick it up). A
device's device_type (freezer or refrigerator, set in the `govee_config`
Firestore doc) picks its default excursion ceiling.
Temp (°F)
Latest reading. Turns amber once it's at or above the device's configured ceiling
(default 10°F for a freezer, 40°F for a refrigerator), and brown if that's been sustained
long enough to trip a "Temp excursion" alert (see Alerts above) — a brief reading above
the line from opening the door is not itself an alert.
Online / last seen
Whether the sensor is currently reachable, and how long ago it last reported. Turns red
if it's been long enough to trip a "Sensor offline" alert — an offline sensor means the
device's temperature is unconfirmed, not that it's necessarily warm.
Humidity / battery
Captured in the data model for a future device/API that exposes them, but the H5111's
cloud API doesn't report either field for the current sensors — both always show "n/a".
Temperature chart
Every device's temperature over the range selected above, same chart style as Overview's
pressure/flow chart. Each device gets a color: a thin line for the raw sensor
reading and an optional bold line for the estimated food temp (below). Two shared
dashed lines mark the excursion ceiling for each device type present — one for
freezers, one for refrigerators — rather than one per device.
Est. food temp (bold line)
The raw sensor reads air temperature, which swings sharply every time the
compressor cycles or the lid opens; the food itself has far more thermal mass and barely
moves over those same minutes. The bold line estimates that actual food temperature by
running the raw air-temp series through an exponential moving average (a low-pass filter):
each reading updates the estimate by a fraction that depends on the real elapsed time since
the previous sample, so an occasional missed poll doesn't distort it. It's a smoothed proxy,
not a second sensor — the excursion alert still fires on the raw reading, not on this
line. The "Est. food temp" dropdown above the chart sets the time constant (how much
lag/damping the estimate assumes), or hides the line entirely.
Last excursion / Last offline period
The most recent episode of each alert for this device — "ongoing since <time>" if
still open (or acknowledged), or the start–end range if it's since cleared. Only the single
most recent episode is ever shown, not a full history: reopening a cleared condition starts
a fresh one in the underlying alert record. See the matching entries under Alerts above for
what each condition means, and the Active alerts table (Analytics tab) to acknowledge one.
Lawn tab measurements
A mow-timing advisor ported from the standalone mownow project (docs/
dev_planning/lawn-mow-advisor.md), fed by a WeatherFlow Tempest weather station rather than any
of the site's own sensors. Every hour of the selected day is scored 0-100 for two separate
tracks: sun (open lawn) and shade, since shaded grass holds dew/rain moisture much
longer. Sun is the headline verdict throughout; shade rides alongside as a secondary line.
Verdict
One of four bands, told apart by word and glyph (not color alone): Great time to mow
(filled check), OK to mow (open check), Still drying, not yet (hourglass), or
Don't mow (barred circle) - the last covers both an active hard veto (rain, near-freezing
temp, high wind, lightning) and grass that's simply still too wet to cut.
Best window chip
The longest run of hours scoring 50+ ("OK" or better) today, shown as a start-end range.
Greyed "no good window" when no such run exists.
Day picker
Today through three days out, all pulled from the same already-fetched report - switching
days just re-renders, it never refetches.
Hourly strip
One row per daylight hour; bar length is the score (0-100), color is a redundant tint from
the same verdict palette. A vetoed hour shows "✗" plus the specific reason (e.g. "Rain
expected") instead of a bar.
Conditions footnote
The Tempest station's current instrument reading, plus when it was last fetched - a mow
report is only refreshed every 15 minutes, so this is how staleness would show up.