Skip to content

Commit a77e403

Browse files
jscott3201claude
andauthored
Add AHU fault batch 5: FC-005/007/009/011/012/013 (G36 001-range core) (#11)
Six verified rules against engine e2ff2f8 (26 faults total, all green). Reference ch.9 abbreviates all six cards; specs transcribed from G36 s5.16.14 per Addendum u (public review) with NISTIR 7365 defaults, energy profiles from the reference's s5.8.1 index rows. - FC-005/FC-012 SAT-vs-MAT mirror pair (CLU-01, suppressed_by FC-062): combined-epsilon gap thresholds 3.0/5.0 C - dTSF flips sign in the rearrangement because fan heat excuses warm SAT and indicts cold SAT. - FC-007/FC-013 saturated-coil pair: setpoint missed with the valve pinned >99%; strict-> deviation documented with quantized-command retune hints. - FC-009/FC-011 economizer changeover pair (CLU-03): OAT vs SAT setpoint with the fan-heat asymmetry (1.0 vs 3.0 C composed thresholds); cards note G36 writes these two with literal strict comparisons, so no boundary deviation exists here. Agent-found corrections adopted: the s5.8.1 index DOES publish category/confidence/method/EEM/savings for 001-range faults (only severity is absent) - all six cards follow their index rows, with FC-011 corrected to COMFORT_ENERGY/EEM 06 and FC-005's emissions scope harmonized to 1+2 (FC-050 convention, matching mirror FC-012). Companions: FC-062 suppresses += FC-005/FC-012; simultaneous-hc += FC-005/FC-012; economizer-failure += FC-009/FC-011; README rows verified. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 9a7a8ad commit a77e403

28 files changed

Lines changed: 3830 additions & 10 deletions

faults/ahu/AHU-FC-005/card.md

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
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+
![AHU-FC-005 block graph](diagram.svg)
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.

faults/ahu/AHU-FC-005/diagram.svg

Lines changed: 46 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)