Skip to content

Commit bd08ac0

Browse files
jscott3201claude
andauthored
Add VAV chapter: FC-050..055 verified, dictionary, min-flow playbook (#14)
Six verified rules against engine e2ff2f8 (43 faults total across three equipment families, all green). - VAV-FC-050 minimum airflow setpoint too high: reads the configured minimum as a live point; ventilation_requirement ships a documented PLACEHOLDER default (the reference says "Config") that hosts must set per zone from ASHRAE 62.1 - flagged in three places as the rule's one silent deployment hazard. - VAV-FC-052 reheat open with zone satisfied (CLU-05 member): band bounds in positive-gap form, all four edges pinned. - VAV-FC-053 airflow tracking error: ratio + ySetpointOk evaluability output; two TrueDelays in series (tracking_duration then AlarmDelay); reference's NO_EVAL vector pinned. - VAV-FC-054 damper hunting: mean-crossing counter (FC-004 chain) fused with MAD amplitude (FC-056 proxy); Nyquist band [28.6 s, 180 s) documented up front this time - at a 300 s tick the crossing ceiling (6) sits below the threshold (10) and the rule can never fire. - VAV-FC-051 rogue zone: request saturation AND most-zones-satisfied, 90-minute two-delay chain; the many-zones-unhappy NO_FAULT case documented as the rule's defining subtlety. - VAV-FC-055 reheat during cooling season (CLU-05 trigger): three thresholds + two-delay chain; out-of-season false documented as host-side NO_EVAL; scope 1 DIRECT per the chapter card. Companions: points/vav.points.json (11 points, Brick 1.4.4 grep- verified incl. Min_Air_Flow_Setpoint_Limit and the satisfied_zone_ fraction derived aggregate); playbooks/vav-min-flow-reheat.md transcribed from the reference (EEM-15, PNNL's top office measure); stuck-actuator += VAV-FC-053 (library-assigned, documented); AHU-FC-056 related += VAV-FC-054 (reciprocity); README rows verified. VAV-FC-100 stays planned (phase 3). Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent f7199e3 commit bd08ac0

29 files changed

Lines changed: 9415 additions & 2 deletions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ g36: null
1717
clusters: []
1818
suppresses: []
1919
suppressed_by: []
20-
related: [AHU-FC-004]
20+
related: [AHU-FC-004, VAV-FC-054]
2121
playbooks: []
2222
operating_states: "all (fan running)"
2323
preconditions: "Supply fan running — SAT scatter means nothing in a dead air stream. No verdict within long_window (2 h) of engine start: both moving averages divide by elapsed time while their windows fill, so the baseline is not yet established and the ratio test can be satisfied by a warmup artifact — the host reports NO_EVAL for that period. SAT sensor integrity is a precondition, not a conclusion: a sensor that flatlines and then jumps produces this same scatter signature (diagnosis 4), so sensor checks clear first. When any gate is unmet the verdict is NO_EVAL, not healthy."

faults/vav/README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# VAV Fault Rules
2+
3+
VAV terminal unit fault detection rules (`VAV-FC-*`). Source grounding: HVAC
4+
FDD Reference v1.0 ch.10 (adapted authority — see each card's Deviations
5+
section). The chapter's economics are multiplicative: a building has dozens or
6+
hundreds of boxes, so a small per-box inefficiency — an oversized minimum, a
7+
leaking reheat valve — compounds into the "74% problem" class of building-wide
8+
waste. Excess minimum flow (VAV-FC-050) is PNNL's top-performing office EEM.
9+
10+
Point dictionary: [`points/vav.points.json`](../../points/vav.points.json).
11+
12+
## Index
13+
14+
| ID | Name | Sev | Method | Status |
15+
|---|---|---|---|---|
16+
| VAV-FC-050 | Minimum airflow setpoint too high | 3 | rule | **verified** |
17+
| VAV-FC-051 | Rogue zone driving AHU reset | 3 | rule | **verified** |
18+
| VAV-FC-052 | Reheat valve open with zone satisfied | 3 | rule | **verified** |
19+
| VAV-FC-053 | Airflow tracking error | 3 | rule | **verified** |
20+
| VAV-FC-054 | Damper hunting / oscillation | 3 | rule | **verified** |
21+
| VAV-FC-055 | Reheat waste during cooling season | 3 | rule | **verified** |
22+
| VAV-FC-100 | Zone temperature sensor drift | 3 | statistical | planned |
23+
24+
Severity and method per the reference's ch.10 cards (its §5.8.2 index carries
25+
no severity column). VAV-FC-100 is phase 3; its neighbor-comparison method is
26+
expressible with a host-derived median point and can be authored once the
27+
phase-3 scope opens.
28+
29+
## Relationships
30+
31+
- **VAV-FC-050 / 052 / 055** are the zone-level reheat-waste family — the
32+
terminal-unit end of CLU-02's "74% problem" (AHU-FC-053/057 see the same
33+
defect from the air handler's side via `zone_reheat_fraction`).
34+
- **VAV-FC-051** is the zone-side cause of the reset failures AHU-FC-057/058
35+
detect at the AHU: one rogue zone holds the reset down for everyone.
36+
- **VAV-FC-053/054** are the box-mechanics pair (tracking and stability);
37+
VAV-FC-054 is AHU-FC-056's zone-level sibling and reuses its detector
38+
patterns.

faults/vav/VAV-FC-050/card.md

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
---
2+
schema: cxf-library/fault-card/v1
3+
id: VAV-FC-050
4+
name: VAV minimum airflow setpoint too high
5+
equipment: vav
6+
status: verified
7+
phase: 2
8+
method: rule
9+
severity: 3
10+
category: EXCESS_CONSUMPTION
11+
confidence: HIGH
12+
estimation_method: PROXY_ESTIMATION
13+
source:
14+
- "HVAC FDD Reference v1.0 §10, VAV-FC-050"
15+
- "PNNL-25985 EEM-15 (minimum VAV flow reductions)"
16+
- "PNNL retuning"
17+
g36: null
18+
clusters: []
19+
suppresses: []
20+
suppressed_by: []
21+
related: [AHU-FC-053, VAV-FC-052, VAV-FC-055]
22+
playbooks: [vav-min-flow-reheat]
23+
operating_states: "heating and deadband (host-gated)"
24+
preconditions: "The AHU serving this VAV box is running and the zone is in occupied mode. Both are host-enforced: an unoccupied box sitting at a high programmed minimum costs nothing while no air is moving, and the ventilation requirement this rule compares against is an occupied-mode quantity. The host must also confirm that zone_airflow_sp_min carries the box's configured minimum in L/s — the number the damper loop clamps to, not the active setpoint and not a design value in CFM — and that ventilation_requirement has been set for this specific zone (see Deviations; the shipped default is a placeholder from the reference's own test vectors, not a site value)."
25+
points:
26+
- zone_airflow_sp_min
27+
- rht_vlv_cmd
28+
outputs:
29+
- name: yFault
30+
description: True while the programmed minimum exceeds the scaled ventilation requirement with reheat active, continuously for at least alarm_delay
31+
params:
32+
ventilation_requirement:
33+
default: 70.0
34+
unit: L/s
35+
description: The zone's design minimum outdoor-air requirement per ASHRAE 62.1. PER-ZONE SITE CONFIGURATION — the reference gives no default and the shipped 70.0 is a placeholder; a host that leaves it unset is comparing against an arbitrary number.
36+
cxf: ventReq.k
37+
min_flow_multiplier:
38+
default: 1.5
39+
unit: "1"
40+
description: How far above the ventilation requirement a programmed minimum may sit before it counts as oversized
41+
cxf: scaled.k
42+
reheat_active_threshold:
43+
default: 10.0
44+
unit: "%"
45+
description: Reheat valve command above which the coil counts as actively heating
46+
cxf: rhtOn.t
47+
alarm_delay:
48+
default: 3600.0
49+
unit: s
50+
description: Continuous fault persistence required before the alarm asserts (60 min)
51+
cxf: persist.delayTime
52+
energy_impact:
53+
affected_subsystem: VAV zone reheat plus AHU fan energy
54+
savings_range: 5-16% site energy (PNNL's top-performing EEM for offices); 10-20% excess reheat energy per affected box
55+
climate_sensitivity: heating-dominant
56+
runtime_estimation: "excess_reheat_kw = (zone_airflow_sp_min − ventilation_requirement) / zone_airflow_sp_min × rht_vlv_cmd/100 × vav_rht_capacity_kw — the fraction of the reheat load attributable to air the zone did not need"
57+
emissions:
58+
scope: "1+2"
59+
method: PROXY_EMISSIONS
60+
verified:
61+
engine_rev: e2ff2f8
62+
content_id: "cxf:fnv1a128:e251b00bd4acce37ca4d81521c086a37"
63+
date: 2026-08-17
64+
---
65+
66+
## Description
67+
68+
The box is configured to never deliver less than some floor of airflow, and that
69+
floor is set far above what the zone actually needs for ventilation. Every hour
70+
the zone is not calling for cooling, the box pushes cold supply air it does not
71+
need into the space and the reheat coil pays to warm it back up. The fan pays on
72+
one side, the boiler on the other, and the zone stays comfortable throughout, so
73+
nothing about the symptom points at the cause.
74+
75+
This rule reads a configuration value as a live point. `zone_airflow_sp_min` is
76+
not a measurement or a modulating setpoint; it is a number a commissioning
77+
technician typed into the box controller, and the fault lives in that number
78+
rather than in any equipment behavior. What keeps this from being a
79+
configuration audit is the second term: an oversized minimum only costs money
80+
while the reheat coil is actually running against it. A box configured 3× too
81+
high in a zone whose reheat never opens is a latent problem, not a live one, and
82+
this rule stays quiet about it. That is the deliberate split — the setpoint test
83+
finds the defect, the reheat test proves it is being paid for right now.
84+
85+
The economics are multiplicative. A building has dozens to hundreds of boxes,
86+
each one commissioned by hand, and the same default-minimum habit tends to
87+
repeat across all of them. PNNL-25985 ranks minimum VAV flow reduction (EEM-15)
88+
as the single highest-impact individual retuning measure for offices at 5-16% of
89+
site energy, which is a building-scale number arrived at one box at a time. The
90+
`vav-min-flow-reheat` playbook's step 1.4 turns the count of flagged boxes into
91+
a diagnosis: more than half the boxes flagged points at the air handler (supply
92+
air too cold, per AHU-FC-053), one to three points at zone-level configuration.
93+
94+
## Detection Logic
95+
96+
```
97+
sp_high = zone_airflow_sp_min > (ventilation_requirement × min_flow_multiplier)
98+
rht_on = rht_vlv_cmd > reheat_active_threshold
99+
100+
yFault = (sp_high AND rht_on) sustained continuously for alarm_delay
101+
```
102+
103+
Block graph (`rule.cxf.jsonld`):
104+
105+
![VAV-FC-050 block graph](diagram.svg)
106+
107+
`ventReq` carries the zone's ventilation requirement as a constant so the
108+
comparison has something to stand against; `scaled` multiplies it by the
109+
allowance factor, and `spHigh` asks whether the programmed minimum clears that
110+
allowance. At the shipped defaults that trip point is 70 × 1.5 = 105 L/s
111+
(about 222 cfm), so a box configured at the reference's 235 L/s is flagged and
112+
one at 95 L/s is not. `rhtOn` decodes the valve. Both comparisons are strict, as
113+
the reference writes them: a box configured at exactly the allowance and a valve
114+
reported at exactly 10% both clear, and the vectors pin all four sides.
115+
116+
The 60-minute `persist` delay matters more here than the block count suggests.
117+
Neither input is noisy — a configured minimum does not jitter — so the delay is
118+
not filtering measurement noise. It is filtering morning warm-up, when a box
119+
legitimately runs reheat at whatever minimum it has while the space recovers
120+
from setback. An hour of continuous reheat against an oversized minimum is no
121+
longer warm-up.
122+
123+
## Possible Diagnoses
124+
125+
1. Minimum flow setpoint set too high during commissioning — the common case,
126+
and usually a default the technician never revisited rather than a decision
127+
2. Minimum flow reset logic disabled: the box supports a dynamic minimum
128+
(dual-maximum, or a ventilation reset driven by occupancy) and it was
129+
switched off or never enabled
130+
3. Code-required minimum genuinely higher than necessary — overdesign in the
131+
original ventilation calculation, which makes this a design-review item
132+
rather than a BAS fix
133+
134+
## Energy Impact
135+
136+
EXCESS_CONSUMPTION, HIGH confidence, PROXY_ESTIMATION. Two subsystems pay
137+
simultaneously: the reheat coil warms air the zone never needed, and the supply
138+
fan moves it. The reference's 10-20% excess reheat energy is the per-box figure;
139+
PNNL-25985's EEM-15 gives the building-scale one at 5-16% of site energy, the
140+
top-performing individual measure across office building types in that study.
141+
For a 50,000 ft² office at $2/ft² energy cost the playbook puts the annual
142+
recovery at $5,000-16,000.
143+
144+
Estimation is PROXY rather than DIRECT because the rule sees a setpoint and a
145+
valve command, not thermal flow: the waste share
146+
`(zone_airflow_sp_min − ventilation_requirement) / zone_airflow_sp_min` is an
147+
inference about how much of the reheat load is attributable to excess air, and
148+
it leans on `ventilation_requirement` being right. Heating-dominant, since the
149+
waste is realized as reheat energy — but the fan share is climate-independent
150+
and runs whenever the box does.
151+
152+
## Emissions Impact
153+
154+
Scope 1 + 2, PROXY_EMISSIONS, HIGH confidence; typical 200-1,500 kg CO₂e/yr per
155+
zone. The split follows the two subsystems: gas at the boiler serving the reheat
156+
coil is scope 1, fan electricity is scope 2, and a hydronic reheat system on an
157+
electric boiler or heat pump moves the whole thing into scope 2.
158+
Avoided-emissions basis: marginal operating emissions rate (MOER).
159+
160+
## Deviations
161+
162+
- **`ventilation_requirement` ships with a placeholder default.** The reference
163+
gives the default as "Config" — deliberately no number, because the value is
164+
per-zone and comes from that zone's ASHRAE 62.1 calculation (floor area ×
165+
0.06 cfm/ft² + occupants × 5 cfm/person, per the playbook's step 1.1). This
166+
card ships 70.0 L/s so the document is runnable as delivered: it is the value
167+
the reference's own test vectors use, and 70 L/s is roughly an 1,800 ft²
168+
office at 8 occupants. **It is not a site value.** Hosts MUST set
169+
`ventReq.k` per box at deployment. A wrong `ventilation_requirement` moves
170+
the alarm point silently in either direction — set it 2× too high and the
171+
rule never fires on a genuinely oversized box, 2× too low and every box in
172+
the building alarms. This is the only parameter in the rule whose default
173+
carries no authority.
174+
- **`reheat_active_threshold` is adopted, not transcribed.** It appears in the
175+
reference's equation for this fault but not in its tunables table, so the
176+
reference states no default. This card adopts 10.0%, the value the same
177+
chapter gives for VAV-FC-055's identically-named parameter — the nearest
178+
in-document authority, and the two rules ask the same question of the same
179+
point. Sites that see valve commands park at a nonzero rest position should
180+
retune it above that position rather than accept a standing alarm.
181+
- **`zone_airflow` is dropped from the points list.** The reference's required
182+
points table lists it, but its equation never uses it: the test compares a
183+
configured setpoint against a ventilation requirement, and measured flow
184+
appears nowhere. It is verification context — the playbook's step 1.1 has a
185+
technician look at actual airflow during low-demand periods — not a rule
186+
input. Carrying it would force every host to bind a point the graph ignores.
187+
Precedent: AHU-FC-063 drops `oat` for the same reason and keeps its role in
188+
the preconditions.
189+
- **A configuration value is consumed as a live point.** `zone_airflow_sp_min`
190+
is a programmed constant, and hosts whose BAS does not expose the configured
191+
minimum as a readable point cannot run this rule from a trend archive alone;
192+
they need a config export bound as a point. The point dictionary anticipates
193+
this (`Min_Air_Flow_Setpoint_Limit`, "the configured floor, distinct from the
194+
active setpoint"). Binding the *active* airflow setpoint instead breaks the
195+
rule: the active setpoint rises above the minimum whenever the zone calls for
196+
cooling, which would produce alarms during normal cooling operation.
197+
- `AlarmDelay = 60 min` from the reference tunables becomes
198+
`persist.delayTime = 3600 s` with `delayOnInit = true` (Modelica/CDL default
199+
is `false`), the library's standing choice: a box already faulted at load
200+
waits out the full hour rather than alarming on the first tick after a
201+
controller restart.
202+
- Operating states (heating, deadband) and preconditions (AHU running, zone
203+
occupied) are declared in frontmatter for host enforcement rather than
204+
encoded in the block graph, per the library's design stance.
205+
- **Frontmatter `clusters` is empty.** CLU-05 (Zone Heating & Cooling Conflict)
206+
covers this fault's neighbors — VAV-FC-052, VAV-FC-055, SYS-FC-056 — but
207+
chapter 7 does not list VAV-FC-050 among its members, and this card does not
208+
edit the cluster definition to add it. The relationship is carried by the
209+
shared `vav-min-flow-reheat` playbook and by `related` instead. Worth
210+
revisiting when the cluster set is next reviewed: an oversized minimum is
211+
diagnosis 1 for VAV-FC-055, so the fix ordering CLU-05 implies is real even
212+
though the membership list does not say so.
213+
- Frontmatter `g36` is null. This is a research-backed 050-range rule; G36's
214+
own guidance on VAV minimums (20% of design airflow or the ventilation
215+
minimum, whichever is greater) informs the remediation in the playbook but is
216+
not the source of the detection logic.
217+
218+
## Notes
219+
220+
The remote fix is the playbook's step 2.1: reduce the minimum to the calculated
221+
ventilation requirement, and on dual-maximum boxes review the heating maximum at
222+
the same time. It is a 15-minute change per box that costs nothing and can
223+
usually be batched across boxes on the BAS. Step 2.4 is the structural version
224+
of the same fix — moving the box to dual-maximum control so heating and cooling
225+
carry separate minimums — and is worth considering once more than a handful of
226+
boxes are flagged.
227+
228+
Check the air handler before touching individual boxes. If this rule fires on
229+
more than half the boxes on one AHU, the boxes are probably fine and the supply
230+
air is too cold, which is AHU-FC-053's fault, not theirs. PNNL-27338's AIRCx
231+
check gives the sharper version of the same test: more than 25% of zones with
232+
reheat valves above 50% means look at the SAT reset first (playbook step 1.4,
233+
and the `missing-reset` playbook from there).
234+
235+
Clearing this fault should also quiet VAV-FC-055 on the same box if that rule is
236+
firing, since an oversized minimum is its diagnosis 1. The reverse is not true:
237+
VAV-FC-052 sees a valve open with the zone already satisfied, which is a valve
238+
or sequence problem that survives any minimum-flow correction.

faults/vav/VAV-FC-050/diagram.svg

Lines changed: 67 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)