v3.1.0
Pre-release-
The Status page now shows when the active presence calibration profile was
created and what it learned from, instead of only whether the last run
succeeded. Calibration results are stored with the window they came from,
so a thin result can be told apart from a good one. A pod that has never
calibrated now says so plainly rather than reporting an error. -
The in-bed indicator starts and ends far more sessions than anyone actually
has. Over eleven days of recordings the live detector counted 23 to 30
separate sessions per side per day, most of them under twenty minutes, while
the overnight analysis of the same nights found the one real session per side
you would expect. Signal strength is not the reason: an occupied side reads
around forty times higher than an empty one, so the two are easy to tell
apart. The sessions are being started by something in the entry logic, which
the once-a-minute log is too coarse to show. Each start is now recorded along
with the few seconds that led into it, so the next look at this can read what
happened instead of estimating. -
The pump warning on the Status page is a false alarm, and this release starts
gathering what is needed to fix it properly. The check treats "pump reporting
no speed while the cooling element draws current" as a stalled pump, but
across eleven days of recordings the pump reports no speed for exactly the
hours the power schedule has that side switched off, and the current reading
never drops low enough to tell a switched-off side from a running one. So the
warning fires most days when the bed powers off. The check is unchanged for
now, because getting it wrong in the other direction would hide a real stall.
It now records the full pump reading when the pump starts or stops reporting
speed, which is the missing piece for telling those two cases apart. -
The heart rate, HRV and breathing charts on the Sleep page were blank. The
server reformatted each reading's timestamp into a local-time string before
sending it, and the charts scale the timestamp themselves and discard
anything that is not a number, so every reading was thrown away and the
charts drew nothing. No error appeared anywhere. Readings now go out as the
plain timestamps they are stored as, which is what the charts already expect. -
Heart rate variability and breathing rate recorded at the start of a sleep
session belonged to the previous session. Both are smoothed running values,
and neither can be recomputed immediately: breathing rate needs 30 seconds of
established presence and HRV needs five minutes. Leaving the bed cleared the
samples behind them but not the values themselves, so the opening minutes of
the next session were written with whoever was there last. Measured against
eleven days of recordings, that was 16% of stored readings, 10% of them
carrying a plausible-looking number rather than the blank the rest of the
system knows to ignore. Leaving the bed now clears both, along with any
measurement still waiting to be written. -
A physical double or triple tap that failed to write its temperature change
restarted the server. Tap handling runs detached from the polling loop, so a
base movement over Bluetooth cannot delay the next tap being noticed, but that
also meant a failure had nowhere to go and the server treats an unhandled one
as a reason to shut down. The failure is now caught where it happens, logged,
and shown on the Status page.