Skip to content

Commit a597632

Browse files
jscott3201claude
andauthored
Batch 17: refrigerant-side HP rules — HP-FC-053/054/055 (NIST SP 1087) (#31)
* Batch 17: refrigerant-side HP rules — HP-FC-053/054/055 (NIST SP 1087) Library's first refrigerant-side rules, per the adapt-tier decision: - HP-FC-053 undercharge (superheat high + subcooling low). The 0.5 degC TXV subcooling floor ships as a yTxvSaturated SUB-CONDITION flag, not an evaluability gate — the source uses it for chart selection, and gating would silence severe undercharge exactly when the liquid line flashes two-phase (ground truth overrode the brief). - HP-FC-054 overcharge (subcooling high only — source shows no superheat move; no TXV flag, trivially satisfied). - HP-FC-055 reversing-valve internal bypass leakage (unique 4-feature zone-A pattern incl. cond_sat DOWN as the condenser-restriction discriminator; TXV-in-control IS this rule's applicability zone, so it carries the true y...Ok evaluability output). Most EER-sensitive fault in the study (Table 5.12: 5.0% leakage -> 5.5% EER). Fixed commissioning placeholder bands replace the source's 3rd-order regressed baseline (named simplification, RTU-FC-051 precedent). Wiring: README family section, heat-pump-faults Applies-To, related reciprocity on HP-FC-050/052; comp_discharge_temp source year corrected (2008, not 2012). Library: 85 verified rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Root README: 85 rules, HP family at 6 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent b3bba09 commit a597632

18 files changed

Lines changed: 2943 additions & 6 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ Here is a real one — AHU-FC-050, simultaneous heating and cooling:
3434

3535
## What's inside
3636

37-
- **82 verified fault rules** across eleven equipment families: air handlers
37+
- **85 verified fault rules** across eleven equipment families: air handlers
3838
(`faults/ahu/`, 34 — all 31 reference faults plus 3 APAR-grounded
3939
library extensions), system-level & cross-equipment
4040
rules (10 — the reference's full ch.16 set plus the library's sensor-health
4141
family), rooftop units (6), hot water plants (8 — the reference's 3 plus 5
4242
library-authored loop rules grounded in PNNL-27338), VAV terminal boxes
43-
(6), fan coil units (5), chilled water plants (4), heat pumps (3), energy
43+
(6), fan coil units (5), chilled water plants (4), heat pumps (6 — the reference's 3 plus the NIST SP 1087 refrigerant-side family), energy
4444
recovery ventilators (2), VFDs (2), and hydronic pumps (2) — **every fully
4545
specified fault in the reference is now implemented and engine-verified**,
4646
plus the library's first grounded extensions beyond it.

faults/hp/HP-FC-050/card.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ g36: null
1818
clusters: []
1919
suppresses: []
2020
suppressed_by: []
21-
related: [HP-FC-051, HP-FC-052, RTU-FC-051]
21+
related: [HP-FC-051, HP-FC-052, HP-FC-053, HP-FC-054, RTU-FC-051]
2222
playbooks: [heat-pump-faults]
2323
operating_states: "heating or cooling, evaluated separately — one rule instance per mode, each carrying that mode's fitted line"
2424
preconditions: "The compressor must have run for min_runtime_for_eval (15 min) at its current capacity before the quotient means anything; a unit still pulling down after a start, or coming out of a defrost cycle, reads degraded on physics rather than on fault. The host owns the baseline: it runs the learning_period_days (14 d) regression of COP against oat for THIS mode, confirms R² > 0.6, and writes the result into cop_baseline_slope and cop_baseline_intercept with set_param. Until it has done so the rule is comparing against the shipped placeholders and means nothing (see Deviations). oat must also lie inside the range the line was fitted over — the graph extrapolates the line forever and says nothing about where the fit stops being physical. thermal_power is almost always a host-computed virtual point; its provenance is part of the R² precondition, not separate from it. Compressor evaluability is signalled in-rule by yPowerOk; when it is false the verdict is NO_EVAL, not healthy."

faults/hp/HP-FC-052/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: [HP-FC-050, HP-FC-051]
20+
related: [HP-FC-050, HP-FC-051, HP-FC-055]
2121
playbooks: [heat-pump-faults]
2222
operating_states: "heating and cooling, compressor running (host-gated)"
2323
preconditions: "The compressor must be running. A heat pump idling on its indoor fan drifts its discharge toward room temperature, which reads as too warm for cooling and too cold for heating at the same time, so an unrunning unit must not be evaluated. The host must map its own mode enum onto heating_mode_code and cooling_mode_code and must report NO_EVAL — not healthy — for every other mode it can command (off, auto, emergency heat, dehumidify): the graph is structurally silent on codes it does not carry. Defrost is the sharp case: during a defrost cycle the unit deliberately runs the reversing valve in cooling while mode_command still reads HEATING, so the host should gate this rule on defrost_status. The rule survives a normal defrost only because alarm_delay outlasts it — see Deviations. sat must be trustworthy; nothing in this rule cross-checks it, and a discharge sensor reading 15 °C low fabricates a heating-mode fault on a healthy unit."

faults/hp/HP-FC-053/card.md

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
---
2+
schema: cxf-library/fault-card/v1
3+
id: HP-FC-053
4+
name: Refrigerant undercharge — superheat/subcooling divergence
5+
equipment: hp
6+
status: verified
7+
phase: 2
8+
method: rule
9+
severity: 3
10+
category: EFFICIENCY_LOSS
11+
confidence: MEDIUM
12+
estimation_method: PROXY_ESTIMATION
13+
source:
14+
- "Library-authored — no reference card exists for this fault"
15+
- "NIST SP 1087, Kim, Yoon, Payne & Domanski, *Cooling Mode Fault Detection and Diagnosis Method for a Residential Heat Pump*, NIST, October 2008: §5.4.3 Table 5.2 (undercharge fault-direction rows, zones A and B), §5.4.2 and §5.4.4 (TXV control limits; the 0.5 °C upstream-subcooling test and its role in the method), §5.5.1 Figures 5.16-5.17 (fault level versus EER degradation), §5.5.2 Table 5.16 (undercharge diagnosis results)"
16+
- "Breuker & Braun 1998b and Rossi & Braun 1997, reproduced as SP 1087 Table 5.1(a) — the fixed-orifice refrigerant-leakage row this rule's pattern reproduces; the corroboration lineage HP-FC-050 draws on"
17+
- "Barandier 2023, Barandier & Mendes 2024 — undercharge prevalence on heat pumps (cited by HP-FC-050)"
18+
- "Li & Braun 2007, HVAC&R Research 13(2) — the multiple-simultaneous-fault caveat on single-fault pattern charts"
19+
- "Sibling precedent: HP-FC-050 (commissioning-set placeholder parameters), RTU-FC-051 (fixed bands named as a simplification of a regressed baseline), HP-FC-051 and HP-FC-052 (defrost and compressor gating as host preconditions)"
20+
g36: null
21+
clusters: []
22+
suppresses: []
23+
suppressed_by: []
24+
related: [HP-FC-050, HP-FC-054, RTU-FC-051]
25+
playbooks: [heat-pump-faults]
26+
operating_states: "mechanical cooling, compressor running, unit not in defrost — all three host-gated"
27+
preconditions: "The compressor must be running and the unit must not be in defrost. Both are host gates on comp_status and defrost_status: with the compressor off all four temperatures equalise and both differences collapse to zero, and a defrost cycle deliberately reverses the circuit, which scrambles every refrigerant-side temperature this rule reads (HP-FC-051/052 precedent). The compressor must also have held its current capacity for min_runtime_for_eval (15 min); superheat overshoots for minutes after a start or a capacity step while the expansion valve catches up. evap_sat_temp and cond_sat_temp are host-derived P-T lookups and the lookup MUST be configured for the refrigerant actually in the machine — a wrong refrigerant biases both differences at once and in opposite directions, which is this rule's exact fault pattern. The suction and liquid probes must be in good contact with the line and insulated from ambient air; an uninsulated liquid-line probe reads high in a hot plant room and fabricates collapsed subcooling. Read yTxvSaturated as diagnostic context, NOT as an evaluability gate: this rule has no in-graph NO_EVAL test and false never means healthy (see Deviations)."
28+
points:
29+
- suction_temp
30+
- evap_sat_temp
31+
- cond_sat_temp
32+
- liquid_temp
33+
outputs:
34+
- name: yFault
35+
description: True while suction superheat has stayed above superheat_high_band and liquid subcooling below subcooling_low_band, both continuously for at least alarm_delay
36+
- name: yTxvSaturated
37+
description: Sub-condition flag (NOT an evaluability flag; false never means NO_EVAL) — true when liquid subcooling has fallen below subcooling_two_phase_floor, meaning the liquid line is no longer measurably subcooled and the expansion valve is at its control limit
38+
params:
39+
superheat_high_band:
40+
default: 15.0
41+
unit: "°C"
42+
description: Suction superheat above which the evaporator is judged starved. COMMISSIONING-SET PLACEHOLDER — the shipped 15.0 sits just above the no-fault compressor-suction superheats NIST SP 1087 reports for its test unit (10.2-13.7 °C, against an 11.1 °C compressor-map standard). Set it from the unit's own charging chart plus a tolerance; a suction-line probe reads higher than an evaporator-exit probe on the same machine.
43+
cxf: shHigh.t
44+
subcooling_low_band:
45+
default: 3.0
46+
unit: "°C"
47+
description: Liquid subcooling below which the condenser is judged short of liquid. COMMISSIONING-SET PLACEHOLDER on the same terms — published charging-chart targets for a TXV unit run roughly 8-11 °C at design, and this band is set well under the target so normal load swings do not reach it.
48+
cxf: scLow.t
49+
subcooling_two_phase_floor:
50+
default: 0.5
51+
unit: "°C"
52+
description: "Subcooling below which the expansion-valve inlet is taken to be two-phase and the valve at its control limit. Drives yTxvSaturated only. 0.5 °C is SP 1087's own single-phase/two-phase test (§5.4.2), used there to pick which fault-direction chart applies; unlike the bands above it is a physical boundary, not a per-unit tuning."
53+
cxf: txvSat.t
54+
alarm_delay:
55+
default: 1800.0
56+
unit: s
57+
description: Continuous divergence required before the alarm asserts (30 min). Long enough to outlast a thermostatic valve hunting after a load step, short enough that a real charge loss is reported within the hour
58+
cxf: persist.delayTime
59+
energy_impact:
60+
affected_subsystem: Heat pump compressor energy — capacity lost to reduced refrigerant mass flow
61+
savings_range: 5-13% of compressor energy at the charge losses this rule detects (NIST SP 1087 Fig. 5.16-5.17)
62+
climate_sensitivity: cooling-dominant
63+
runtime_estimation: "waste_kw = compressor_kw × d / (1 − d), where d is the EER-degradation fraction — the extra runtime needed to deliver the same cooling. SP 1087 puts d at roughly 0.065-0.13 for a 20% charge shortfall, so d = 0.10 is the default sizing until a site figure exists"
64+
emissions:
65+
scope: "2"
66+
method: PROXY_EMISSIONS
67+
verified:
68+
engine_rev: e2ff2f8
69+
content_id: "cxf:fnv1a128:456b99147ff742525fe015d642f727d9"
70+
date: 2026-08-18
71+
---
72+
73+
## Description
74+
75+
A machine short of refrigerant runs short of liquid. The expansion valve opens
76+
further to keep the evaporator fed, and once it runs out of travel the
77+
evaporator starves while the condenser loses its liquid seal: superheat climbs
78+
and subcooling collapses at the same time. That divergence is the signature —
79+
capacity loss on its own says nothing about cause. NIST SP 1087 imposed graded
80+
charge faults on a TXV-equipped R410A heat pump in cooling and recorded exactly
81+
this pair once the valve saturated (§5.4.3, Table 5.2, zone B), matching the
82+
fixed-orifice charts of Breuker & Braun (1998b). This rule forms the two
83+
differences from four refrigerant-side temperatures and alarms when both sit
84+
past their commissioned bands for half an hour.
85+
86+
## Detection Logic
87+
88+
```
89+
suction_superheat = suction_temp − evap_sat_temp
90+
liquid_subcooling = cond_sat_temp − liquid_temp
91+
92+
yTxvSaturated = liquid_subcooling < subcooling_two_phase_floor
93+
(sub-condition flag; false does NOT mean NO_EVAL)
94+
95+
yFault = suction_superheat > superheat_high_band
96+
AND liquid_subcooling < subcooling_low_band,
97+
sustained continuously for alarm_delay
98+
```
99+
100+
Block graph (`rule.cxf.jsonld`):
101+
102+
![HP-FC-053 block graph](diagram.svg)
103+
104+
The conjunction is the diagnosis, not a noise filter. High superheat with
105+
subcooling *high* is the liquid-line-restriction pattern (SP 1087 Table 5.2,
106+
zone B), where refrigerant backs up ahead of the restriction; low subcooling
107+
with superheat still normal is a valve that is compensating successfully.
108+
Only the two together indict the charge.
109+
110+
Both comparisons are strict, so a unit exactly on either band reads healthy,
111+
and both bands are per-unit commissioning values — the shipped defaults are
112+
placeholders, not thresholds anyone measured on the machine in front of you.
113+
`persist` requires 30 continuous minutes; `delayOnInit = true` holds that
114+
window across a controller restart rather than alarming on the first tick.
115+
`yTxvSaturated` reports whether the liquid line is still measurably subcooled.
116+
It does not gate the alarm, and the reason it must not is the card's main
117+
deviation.
118+
119+
## Possible Diagnoses
120+
121+
1. Refrigerant leak — brazed joints, Schrader cores, service-valve packing and
122+
flare connections, in that order of prevalence; a charge top-up without a
123+
leak search buys months, not years
124+
2. The unit was charged short, at commissioning or after a repair that vented
125+
the circuit and was recharged by pressure rather than by weight
126+
3. Severe condenser airflow restriction — SP 1087's zone-B chart moves
127+
superheat up and subcooling down for this fault too, and it separates only
128+
on condensing temperature, which rises rather than falls; this rule cannot
129+
see that (see Deviations)
130+
4. Instrumentation: a P-T derivation configured for the wrong refrigerant, or a
131+
liquid-line probe with poor contact or missing insulation. Both fabricate
132+
the pattern on a correctly charged machine
133+
134+
## Energy Impact
135+
136+
EFFICIENCY_LOSS, MEDIUM confidence, PROXY_ESTIMATION.
137+
`waste_kw = compressor_kw × d / (1 − d)`, the extra compressor runtime needed
138+
to deliver the same cooling at a degraded EER. NIST SP 1087 sizes `d` directly:
139+
every fault it tested except compressor leakage needed a fault level above 10%
140+
to cost 5% of EER, and a 20% charge shortfall cost 6.5-13% of EER, the largest
141+
hit in its Figure 5.17. Confidence is MEDIUM because the rule fires on a pattern,
142+
not a severity — it reports that the charge is low, not by how much, so `d` is a
143+
population number until the technician's gauge set supplies a real one.
144+
145+
## Emissions Impact
146+
147+
Scope 2, PROXY_EMISSIONS, MEDIUM confidence; typically 300-2,000 kg CO₂e/yr for
148+
a commercial packaged heat pump, all of it compressor electricity, so the
149+
avoided-emissions basis is the marginal operating emissions rate (MOER). A
150+
leaking circuit also vents refrigerant, and R410A carries a GWP near 2,000 —
151+
that release is a scope 1 emission this card does not estimate, because the
152+
leak rate is not observable from any point the rule reads. A site with
153+
refrigerant-tracking obligations should account for it separately.
154+
155+
## Deviations
156+
157+
- **The 0.5 °C subcooling floor is a sub-condition flag, not an evaluability
158+
gate.** SP 1087 uses it (§5.4.4) to choose *which* fault-direction chart
159+
applies, never to suppress evaluation, and the zone-B chart this rule encodes
160+
still lists falling subcooling as an undercharge symptom. Gating `yFault` on it
161+
would silence the rule exactly when the liquid line has flashed to two-phase —
162+
severe undercharge, not missing data — so the flag is named `yTxvSaturated`
163+
rather than `y…Ok`.
164+
- **Fixed bands replace SP 1087's regressed no-fault baseline.** It compares each
165+
feature against a third-order polynomial regression on three variables (outdoor
166+
and indoor drybulb, indoor dew point); this library's only regression primitive
167+
is a host-fitted line (HP-FC-050). Charging-chart-style nominal targets stand in
168+
— a real simplification, named as one on RTU-FC-051's precedent, and the reason
169+
bands left at their defaults can alarm on a healthy machine forever.
170+
- **Only the TXV-saturated row of the chart is encoded.** In SP 1087's zone A
171+
(valve still in control) undercharge moves *no* superheat at all — only
172+
subcooling, condensing temperature and the two air-side deltas — so a mild
173+
charge loss the valve is absorbing reads healthy here. Earlier investigators
174+
reported difficulty detecting undercharge reliably below about 40% charge loss
175+
(Breuker & Braun 1998b; Stylianou & Nikanpour 1996, via SP 1087 §2).
176+
- **Two features, so severe condenser airflow restriction is not excluded.** It
177+
shares the zone-B superheat-up/subcooling-down pair and separates on condensing
178+
temperature moving up rather than down — a direction test that needs a baseline
179+
for the current operating condition, the same infrastructure gap that keeps
180+
RTU-FC-100 deferred. The card names it as diagnosis 3 rather than pretending
181+
to rule it out.
182+
- **Grounding is cooling-mode only.** SP 1087 tested cooling exclusively, and in
183+
heating the coils swap roles, so the sensors sit on different heat exchangers
184+
even though the arithmetic is unchanged. `operating_states` says cooling; a
185+
heating-mode instance is an extrapolation from charge-diagnosis practice and
186+
needs its own commissioned bands.
187+
- **Strict `>` and `<` at both bands.** CDL Reals has no `GreaterEqual` or
188+
`LessEqual`, so a unit sitting exactly on a band reads healthy. The
189+
disagreement is measure-zero on real-valued signals; both sides of both bands,
190+
and of the two-phase floor, are pinned by vectors.
191+
- **Superheat is measured at the compressor suction, not the evaporator exit.**
192+
The point dictionary's `suction_temp` is a suction-line probe, and SP 1087
193+
notes suction superheat reads higher than evaporator-exit superheat on the same
194+
machine, which it attributes to heat transfer within the valve. Its 9 °C zone
195+
boundary is an evaporator-exit number fitted to one test rig and is
196+
deliberately not carried into this card as a parameter.
197+
- **Compressor, defrost and steady-state gating stay host preconditions.** The
198+
graph computes the fault given valid data, per SCHEMA.md; `comp_status`,
199+
`defrost_status` and time-since-capacity-change are not among its inputs. The
200+
30-minute `alarm_delay` does not substitute — a post-start superheat overshoot
201+
starts the persistence timer rather than being excluded from it.
202+
- **The pattern chart is a single-fault chart.** SP 1087 imposed one fault at a
203+
time, and Li & Braun (2007) showed this whole family of charts misreads
204+
simultaneous faults, whose feature residuals superpose. Two faults at once can
205+
cancel this rule's pattern or fake it; the diagnosis text is a ranking, not a
206+
verdict.
207+
- `persist.delayOnInit = true` (CDL default is `false`), the library's standing
208+
choice. Severity 3 and `category: EFFICIENCY_LOSS` follow HP-FC-050 and
209+
RTU-FC-051, the library's other charge-and-capacity cards; no reference card
210+
exists to inherit them from.
211+
212+
## Notes
213+
214+
Do not read a cleared alarm as a repaired machine. The host gates this rule on
215+
the compressor running, so every stop drops `yFault` for the same reason a
216+
recharge does — the falling edge means "no longer diverging", nothing more. When
217+
`yTxvSaturated` is true the technician should expect flash gas at the sight
218+
glass and should weigh the recovered charge rather than trusting subcooling to
219+
confirm the fix. HP-FC-050 sees the same fault as a COP shortfall without
220+
naming it, and HP-FC-054 is the overcharge branch, which is why the three carry
221+
each other in `related`. The
222+
[heat-pump-faults](../../../playbooks/heat-pump-faults.md) playbook orders the
223+
on-site work; its step 1 already sends the technician to superheat and
224+
subcooling, which is the measurement this rule automates.

0 commit comments

Comments
 (0)