|
| 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 | + |
| 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. |
0 commit comments