|
| 1 | +--- |
| 2 | +schema: cxf-library/fault-card/v1 |
| 3 | +id: AHU-FC-005 |
| 4 | +name: SAT too low vs MAT in heating |
| 5 | +equipment: ahu |
| 6 | +status: verified |
| 7 | +phase: 1 |
| 8 | +method: rule |
| 9 | +severity: 3 |
| 10 | +category: EXCESS_CONSUMPTION |
| 11 | +confidence: MEDIUM |
| 12 | +estimation_method: PROXY_ESTIMATION |
| 13 | +source: |
| 14 | + - "HVAC FDD Reference v1.0 §5.8.1 (index; card abbreviated)" |
| 15 | + - "G36 §5.16.14 FC#5 (text per Addendum u public review)" |
| 16 | + - "NISTIR 7365 (defaults provenance)" |
| 17 | +g36: "§5.16.14 FC#5" |
| 18 | +clusters: [CLU-01] |
| 19 | +suppresses: [] |
| 20 | +suppressed_by: [AHU-FC-062] |
| 21 | +related: [AHU-FC-050, AHU-FC-007, AHU-FC-062] |
| 22 | +playbooks: [simultaneous-hc] |
| 23 | +operating_states: "OS#1 (heating) — host-gated" |
| 24 | +preconditions: "The unit must have a MAT sensor; G36 omits FC#5 where there is none. Evaluate only in OS#1, whose actuator signature per G36 Table 5.16.14.2 is heating coil > 0, cooling coil = 0, OA damper at minimum position — outside it a SAT below MAT is the intended result of cooling, not a fault. Supply fan running, since neither MAT nor SAT means anything in still air. Suspend evaluation for ModeDelay (30 min) after any operating-state change, while the coils and damper are still stroking and the sensors still report the previous state's mixture. Silence this rule while AHU-FC-062 is active: MAT is an input here and FC-062 is its integrity gate. When any gate is unmet the verdict is NO_EVAL, not healthy." |
| 25 | +points: |
| 26 | + - mat |
| 27 | + - sat |
| 28 | +outputs: |
| 29 | + - name: yFault |
| 30 | + description: True while SAT has stayed more than mat_sat_gap_threshold below MAT for at least alarm_delay |
| 31 | +params: |
| 32 | + mat_sat_gap_threshold: |
| 33 | + default: 3.0 |
| 34 | + unit: "°C" |
| 35 | + description: "Shortfall of SAT below MAT that counts as heat being removed rather than sensor and fan-rise uncertainty. Composed from the G36 §5.16.14 internal variables as eSAT + eMAT − dTSF = 1 + 3 − 1; a site that retunes any of the three recomputes the sum (a larger measured fan rise lowers the threshold, a looser sensor band raises it)" |
| 36 | + cxf: gapBig.t |
| 37 | + alarm_delay: |
| 38 | + default: 1800.0 |
| 39 | + unit: s |
| 40 | + description: Continuous fault persistence required before the alarm asserts (G36 AlarmDelay, 30 min) |
| 41 | + cxf: persist.delayTime |
| 42 | +energy_impact: |
| 43 | + affected_subsystem: AHU heating (and the cooling source cancelling it) |
| 44 | + savings_range: "1-4% of site energy (HVAC FDD Reference §5.8.1 index row, mapped there to PNNL-25985 EEM-05)" |
| 45 | + climate_sensitivity: heating-dominant |
| 46 | + runtime_estimation: "waste_kw >= supply_airflow_m3s × 1.2 kg/m³ × 1.005 kJ/kg·K × ((mat + dTSF) − sat) — the thermal power being removed from air the heating coil just paid to warm. A floor, not an equality: it credits the coil with no rise at all, and design airflow stands in for a measured one" |
| 47 | +emissions: |
| 48 | + scope: "1+2" |
| 49 | + method: PROXY_EMISSIONS |
| 50 | +verified: |
| 51 | + engine_rev: e2ff2f8 |
| 52 | + content_id: "cxf:fnv1a128:23c2dc854e3fd583e7f98f40f298a24a" |
| 53 | + date: 2026-08-17 |
| 54 | +--- |
| 55 | + |
| 56 | +## Description |
| 57 | + |
| 58 | +In heating, air leaves the unit warmer than it arrived. It crosses the supply |
| 59 | +fan, which adds about a degree of shaft work, and then a heating coil the |
| 60 | +sequence has called for. SAT sitting several degrees *below* MAT under those |
| 61 | +conditions is not a control error — it means something in the unit is taking |
| 62 | +heat back out. A cooling coil valve leaking or stuck open, a DX circuit stuck |
| 63 | +on, or a sensor pair that disagrees by more than either instrument is rated for. |
| 64 | + |
| 65 | +This is G36 §5.16.14 FC#5, applicable in OS#1 (heating) only. Elsewhere a SAT |
| 66 | +below MAT is exactly what the sequence asked for. The leaking-cooling-coil |
| 67 | +diagnosis is simultaneous heating and cooling seen from the air side, which is |
| 68 | +why the fault sits in cluster CLU-01 behind AHU-FC-050: FC-050 catches the two |
| 69 | +valve commands overlapping, this rule catches the case where only one command is |
| 70 | +raised and the other device is passing water or refrigerant anyway. |
| 71 | + |
| 72 | +## Detection Logic |
| 73 | + |
| 74 | +``` |
| 75 | +gap = mat − sat |
| 76 | +yFault = gap > mat_sat_gap_threshold, |
| 77 | + sustained continuously for alarm_delay |
| 78 | +``` |
| 79 | + |
| 80 | +Block graph (`rule.cxf.jsonld`): |
| 81 | + |
| 82 | + |
| 83 | + |
| 84 | +`gap` subtracts SAT from MAT and `gapBig` compares that shortfall against |
| 85 | +`mat_sat_gap_threshold`, which is G36's `SAT_AVG + eSAT <= MAT_AVG − eMAT + |
| 86 | +dTSF` rearranged so one positive number carries the whole allowance (see |
| 87 | +Deviations). The threshold is not a sensor tolerance: it is the two sensor |
| 88 | +bands *minus* the fan rise the air is known to get for free, so it fires on |
| 89 | +heat removal that neither instrument error nor the fan can explain. The |
| 90 | +comparison is strict, so a gap sitting exactly on 3.0 °C reads healthy. |
| 91 | +`persist` requires 30 minutes of continuous violation, which rides out the |
| 92 | +minutes after a mode change, a hot-water loop coming up to temperature, and a |
| 93 | +valve stroking through its span. |
| 94 | + |
| 95 | +Nothing about the size of the heating call reaches this rule. A unit whose |
| 96 | +heating coil does nothing at all still shows SAT about a fan rise above MAT, so |
| 97 | +the gap runs slightly negative and this rule reads healthy; that failure belongs |
| 98 | +to the inactive-coil rules. What this rule tests is the sign and size of the |
| 99 | +temperature change across the unit, which is the one thing two temperature |
| 100 | +sensors can settle between them. |
| 101 | + |
| 102 | +## Possible Diagnoses |
| 103 | + |
| 104 | +G36 §5.16.14 FC#5, transcribed: |
| 105 | + |
| 106 | +1. SAT sensor error |
| 107 | +2. MAT sensor error |
| 108 | +3. Cooling coil valve leaking or stuck open |
| 109 | +4. Heating coil valve stuck closed or actuator failure |
| 110 | +5. Fouled or undersized heating coil |
| 111 | +6. HW temperature too low or HW unavailable |
| 112 | +7. Gas or electric heat unavailable |
| 113 | +8. DX cooling stuck on |
| 114 | + |
| 115 | +Diagnoses 4 through 7 — a dead heating coil, whatever killed it — explain a |
| 116 | +missing temperature rise on their own, but not a rise of the wrong sign. They |
| 117 | +reach this rule only in company: nothing is being added while something else is |
| 118 | +taking heat out. So read the list as two groups. Either the sensors are lying |
| 119 | +(1, 2), or a heat sink is running against the heating call (3, 8), and a dead |
| 120 | +coil behind it (4–7) makes the gap wide enough to clear the threshold sooner. |
| 121 | + |
| 122 | +## Energy Impact |
| 123 | + |
| 124 | +EXCESS_CONSUMPTION, MEDIUM confidence, PROXY_ESTIMATION, all three taken from |
| 125 | +the reference's §5.8.1 index row. The waste is a cancellation: the heating |
| 126 | +source pays to warm air and a leaking cooling coil or a stuck DX circuit |
| 127 | +immediately unpays it, so both sides of the exchange bill. The runtime proxy |
| 128 | +sizes the removal rather than the addition, because the removal is what the two |
| 129 | +temperatures observe: |
| 130 | + |
| 131 | +``` |
| 132 | +waste_kw >= supply_airflow_m3s × 1.2 × 1.005 × ((mat + dTSF) − sat) |
| 133 | +``` |
| 134 | + |
| 135 | +That is a floor rather than an equality, because it credits the heating coil |
| 136 | +with no rise at all; whatever the coil did add is being removed on top of it. |
| 137 | +Design airflow stands in for a measured one, and the split between "heat never |
| 138 | +added" and "heat added then removed" is not observable from two temperatures — |
| 139 | +between them, that is what keeps this an estimate. The same |
| 140 | +formula shape carries AHU-FC-050's simultaneous heating and cooling waste term. |
| 141 | +The index puts the recoverable range at 1–4% of site energy and maps the fault |
| 142 | +to PNNL-25985 EEM-05 (supply air temperature reset), the nearest measure in |
| 143 | +PNNL's catalog rather than a measure-specific study of this failure — the repair |
| 144 | +this fault actually dispatches is a valve, coil, or sensor, so treat the range |
| 145 | +as an order-of-magnitude bound. Heating-dominant by climate: the fault can only |
| 146 | +be evaluated in OS#1, so its hours are heating hours. |
| 147 | + |
| 148 | +## Emissions Impact |
| 149 | + |
| 150 | +PROXY_EMISSIONS, MEDIUM confidence. Scope is recorded as `1+2` because the two |
| 151 | +halves of the exchange run at once and land in different inventories: hot water from a gas boiler or a gas furnace section is Scope 1, |
| 152 | +electric resistance or a heat pump is Scope 2, and the cooling side that eats |
| 153 | +the heat is Scope 2 in nearly every building. A site with gas heat and electric |
| 154 | +cooling is genuinely paying into both at once, which is the CLU-01 signature |
| 155 | +the reference's §5A.8 table describes. Avoided-emissions basis: marginal |
| 156 | +operating emissions rate (MOER) for the electric half, static combustion factor |
| 157 | +for the fuel half. |
| 158 | + |
| 159 | +## Deviations |
| 160 | + |
| 161 | +- **The reference card for this fault is abbreviated; G36 is the normative |
| 162 | + source.** HVAC FDD Reference v1.0 carries AHU-FC-005 as a §5.8.1 index row — |
| 163 | + name, impact category, confidence, estimation method, EEM link, savings range |
| 164 | + — with no chapter 9 card behind it, so it publishes no equation, no tunable |
| 165 | + defaults, no diagnoses, no operating-state applicability, no severity, and no |
| 166 | + test vectors. Everything in Detection Logic and Possible Diagnoses is |
| 167 | + transcribed from ASHRAE Guideline 36 §5.16.14 FC#5 as it appears in Addendum u |
| 168 | + to Guideline 36-2018 (first public review, 2021), with the internal-variable |
| 169 | + defaults of Table 5.16.14.5 (NISTIR 7365 provenance, which the addendum notes |
| 170 | + are biased toward minimizing false alarms). |
| 171 | +- **Severity 3 is the library's.** No reference card exists to state one and the |
| 172 | + §5.8.1 index carries no severity column. The value matches the scaffold row in |
| 173 | + this chapter's README and the treatment of every other G36 comparison rule |
| 174 | + here: a fault worth a work order inside a week, not a same-day dispatch. |
| 175 | +- **The energy profile is the index row's; the emissions split is the |
| 176 | + library's.** `category`, `confidence`, `estimation_method`, and |
| 177 | + `savings_range` are copied from §5.8.1 (EXCESS_CONSUMP / MED / PROXY / 1–4% |
| 178 | + site), as every 001-range card verified before this one did. The index carries |
| 179 | + no emissions column, so `scope` and `method` are assigned here: `1+2` follows |
| 180 | + AHU-FC-050's convention for simultaneous heating-and-cooling waste — both |
| 181 | + inventories fill at once, and only the heating half's fuel varies by plant |
| 182 | + (matching mirror card AHU-FC-012). The runtime formula is the library's too, mirrored from AHU-FC-050's |
| 183 | + simultaneous-heating-and-cooling waste term. |
| 184 | +- **Combined-epsilon threshold.** G36 states the test as `SAT_AVG + eSAT <= |
| 185 | + MAT_AVG − eMAT + dTSF` across three separate internal variables. Rearranged, |
| 186 | + that is `MAT − SAT >= eSAT + eMAT − dTSF`, so one positive threshold binds one |
| 187 | + CXF path: 1 + 3 − 1 = 3.0 °C at the Table 5.16.14.5 defaults. A site that |
| 188 | + retunes any input recomputes the sum rather than the parameter — measure the |
| 189 | + fan rise at 2 K on a high-static unit and the threshold drops to 2.0 °C |
| 190 | + (sharper, because more free heat is expected); loosen eMAT to 4 K for a |
| 191 | + poorly mixed plenum and it rises to 4.0 °C. Same rearrangement as AHU-FC-062 |
| 192 | + and AHU-FC-001, and it can disagree with the four-term form by one ulp on a |
| 193 | + value straddling the threshold, which no temperature sensor resolves. |
| 194 | +- **G36's `<=` becomes a strict `>`.** CDL `Reals` offers no greater-or-equal |
| 195 | + comparison, so a gap of exactly 3.0 °C reads healthy where G36 would call it a |
| 196 | + fault. The disagreement has measure zero on a real temperature pair and errs |
| 197 | + toward silence. The vectors pin both sides (3.0 clear, 3.1 faulted). |
| 198 | +- **Instantaneous samples instead of averaged signals.** G36 computes every |
| 199 | + signal as a five-minute rolling average of one-minute samples (`SAT_AVG`, |
| 200 | + `MAT_AVG`). This rule compares raw samples and leans on the 30-minute |
| 201 | + `persist` delay to reject noise. The two are not equivalent: averaging |
| 202 | + tolerates a signal that keeps crossing back while its mean stays outside the |
| 203 | + band, and persistence does not — an oscillating gap resets the timer on every |
| 204 | + compliant tick and can hide indefinitely. The `oscillating_gap_never_persists` |
| 205 | + vector is that case, recorded rather than hidden. A steady offset, which is |
| 206 | + what a leaking valve or a drifted sensor produces, reads the same way under |
| 207 | + either treatment. Same note as AHU-FC-002. |
| 208 | +- **Operating-state applicability and ModeDelay are frontmatter, not graph.** |
| 209 | + G36 scopes FC#5 to OS#1 and suspends every fault condition for 30 minutes |
| 210 | + after a mode change. Both are host concerns under this library's stance |
| 211 | + (precedent AHU-FC-063): the graph computes the fault given valid data, and a |
| 212 | + verdict outside OS#1 or inside the transition window is NO_EVAL, never |
| 213 | + healthy. The OS#1 signature the host gates on is G36 Table 5.16.14.2's: |
| 214 | + heating coil > 0, cooling coil = 0, OA damper at minimum position. |
| 215 | +- **Suppression is declared, not encoded.** MAT is an input, so AHU-FC-062 — the |
| 216 | + mixing-box integrity gate that tests MAT against the OAT/RAT envelope — |
| 217 | + silences this rule while it is active. The engine is status-blind and cannot |
| 218 | + express that; it lives in `suppressed_by` and the host enforces it. |
| 219 | +- **No published test vectors.** The reference publishes vectors only for faults |
| 220 | + with full chapter cards. Every scenario in `vectors.json` is authored from the |
| 221 | + G36 equation: both sides of the threshold edge, a transient shorter than |
| 222 | + `alarm_delay`, a recovery that clears, and the oscillation case above. |
| 223 | +- `persist.delayOnInit = true` (Modelica/CDL default is `false`), the library's |
| 224 | + standing choice: a gap already present at load waits out the full 30 minutes |
| 225 | + rather than alarming on the first tick after a controller restart. |
| 226 | + |
| 227 | +## Notes |
| 228 | + |
| 229 | +This rule and AHU-FC-007 are the two G36 heating-side SAT tests, and they fail |
| 230 | +differently on purpose. FC-007 compares SAT against its setpoint with the valve |
| 231 | +saturated and answers "the unit cannot make the air it was asked for". This one |
| 232 | +compares SAT against MAT and answers "the unit is making the air colder than it |
| 233 | +found it". A fouled coil or a dead boiler trips FC-007 and leaves this rule |
| 234 | +quiet, because nothing is removing heat. A leaking cooling valve trips both: |
| 235 | +the unit is short of setpoint *and* running a heat sink. Both firing on the same |
| 236 | +unit points at diagnosis 3 or 8 before anything else on the list. |
| 237 | + |
| 238 | +Order of work: confirm MAT before believing the gap. AHU-FC-062 exists for |
| 239 | +exactly this and runs a shorter delay, so if the mixing box or the MAT sensor is |
| 240 | +the problem the operator sees that alarm first and this one is suppressed. If |
| 241 | +MAT checks out, the [simultaneous-hc](../../../playbooks/simultaneous-hc.md) |
| 242 | +playbook covers the leaking-valve half of the diagnosis list — the same |
| 243 | +isolation-valve and actuator checks apply whether the overlap shows up as two |
| 244 | +open valve commands (AHU-FC-050) or as air that mysteriously loses heat crossing |
| 245 | +a unit in heating. |
0 commit comments