Four cabin sensor nodes (CO₂, O₂, cabin pressure, coolant loop temperature) each report a noisy reading of an underlying true value. Random "leak" events push a channel's true value above the alarm threshold for a stretch of time. Rather than tripping the instant a single noisy sample crosses the line — which flaps on noise alone — each channel runs a dwell timer: the reading must stay continuously above threshold for the full sustained-duration window before the alarm latches.
reading(t) = truth(t) + N(0, σ²)
dwell += dt if reading > threshold
dwell = 0 if reading ≤ threshold
alarm = (dwell ≥ sustainedDuration)
- Sensor noise σ — the standard deviation of measurement jitter on every channel; higher σ means more spurious threshold crossings.
- Alarm threshold — the level a reading must exceed before the dwell timer starts counting.
- Sustained duration — how long a reading must stay above threshold before the alarm fires; longer dwell times filter out noise spikes but delay real detections.
- Leak rate — how often a genuine excursion (a real leak or seal failure) occurs, so you can see both false alarms and missed events over time.
The false-alarm counter increments whenever the dwell timer completes but the underlying truth never actually crossed the threshold — a run of noise alone was enough. The missed/late counter increments when a genuine leak's true value crosses the threshold but recedes again before the dwell timer finishes — a real event the debounce window was too slow, or too strict, to catch. There is no setting that eliminates both at once: tightening the threshold or shortening the dwell catches leaks faster but drowns you in false alarms; loosening either does the opposite. This is the same sensitivity/specificity tradeoff every real annunciator panel is tuned against.