Water-system & chiller-plant FDD — research priority (#1009)
Research backlog for deterministic, Haystack-oriented fault detection on commercial chilled-water, condenser-water / cooling-tower, and hot-water / hydronic loops. Equipment is selected by equipType / registry equipment_kinds and mapped SQL roles — never by vendor name, device instance, or substring match on equipment_id.
Parity honesty: Rules listed here that already appear in sql_rules/registry.yaml and the DataFusion / Pandas cookbooks are sql_screening catalog entries. Do not claim Pandas↔SQL predicate, mask, or duration parity until executable fixtures pass the levels in the parity matrix. Plant rules are documented in both catalogs; that is not oracle proof.
Related framework docs: taxonomy (plant.chw, plant.hw, plant.tower), gap matrix, roadmap, P0 rule catalog.
What exists today (central plant / CW)
Eight plant-family diagnostics are in the validated cookbook inventory (cookbook index):
| Rule ID | Concept | Registry equipment_kinds |
Required roles (minimum) | Notes / gaps |
|---|---|---|---|---|
CHW-NOLOAD-1 |
Chiller/plant running while building load satisfied | chiller |
(none — uses optional proof) | Optional: chiller_status, chiller_cmd, chw_pump_*, building_zone_load_satisfied, building_ahu_load_satisfied. On Wave 1 parity backlog (parity matrix). |
CHW-1 |
Low CHW ΔT | chiller |
chw_supply_t, chw_return_t |
Fixed default min_dt (4°F); should gate on pump/chiller proof and prefer load/flow context when mapped (chw_flow, chiller_power, …). |
CHW-2 |
Low CHW DP at high pump speed | chiller |
chw_dp, chw_dp_sp, chw_pump_cmd |
Does not yet require downstream demand evidence (valve/flow); complements state-aware DP rules below. |
CHW-3 |
CHW supply outside SP deadband | chiller |
chw_supply_t, chw_supply_sp, chw_pump_cmd |
Capacity vs control fault — distinguish low load and staging transitions in follow-ups. |
CHW-4 |
High CHW flow at max pump | chiller |
chw_flow, chw_pump_cmd |
Default flow_hi (1100 gpm) is site design, not universal; must be parameterized per plant. |
CW-OPT-1 |
CW colder than WB + design approach (over-cooling) | chiller, cooling_tower |
cw_supply_t (+ web wet-bulb) |
Opportunity / advisory bias vs hard fault. |
CW-APR-1 |
High tower approach at high fan speed | chiller, cooling_tower |
cw_supply_t (+ web WB, fan proof optional) |
Capacity / fouling / sensor bias confounders. |
CW-FAN-1 |
Full tower fan, CW still hot vs WB + approach | chiller, cooling_tower |
cw_supply_t (+ web WB) |
Overlaps CW-APR-1 / proposed TOWER-1 — see overlap decision below. |
Adjacent (not plant-family but water-loop relevant):
| Rule ID | Family | Applies to | Water relevance |
|---|---|---|---|
FC14 |
AHU | ahu |
CHW coil ΔT when coil should be inactive (terminal hydronics). |
MECH-OAT-1 |
AHU | ahu, chiller, heatpump |
Mechanical cooling proof — uses chiller/compressor roles, not valve-only. |
TRIM-4 |
Trim | chiller |
CHW supply vs low chw_reset_request_sum — reset advisory. |
TRIM-3 |
Trim | boiler |
HW supply vs low hw_reset_request_sum — only shipped HW trim rule today. |
SV-*, PID-HUNT-1, SCHED-247 |
Sensor / control / schedule | includes chiller, boiler |
Run when plant points are mapped; not plant-performance-specific. |
Documented but not in validated catalog: PLANT-1 (CHW DP reset missing), TOWER-1 (tower approach — flagged in gap matrix), lead-lag staging, waterside economizer (roadmap).
Role map (Haystack → registry)
Stamp plants with recognized kinds (chiller, cooling_tower, boiler / chwPlant / hotWaterPlant per taxonomy). Bind points to generic roles (see SQL rules → Haystack map).
| Theme | Typical roles | Sufficiency |
|---|---|---|
| CHW loop temps | chw_supply_t, chw_return_t, chw_supply_sp |
ΔT and supply tracking rules |
| CHW hydraulics | chw_dp, chw_dp_sp, chw_flow, chw_pump_cmd, chw_pump_status, pump_status |
DP, flow, pump-off checks |
| Chiller proof | chiller_status, chiller_cmd, chiller_amps, chiller_current, chiller_power |
Running state, noload, staging |
| Evaporator / condenser | chw_*, cw_supply_t, cw_return_t, per-machine LWT/EWT where mapped |
Approach, header disagreement (future) |
| Tower | tower_fan_cmd, tower_fan_status, cw_supply_t |
Approach, fan saturation |
| Building load proxy | building_zone_load_satisfied, building_ahu_load_satisfied, terminal valves / SAT |
CHW-NOLOAD-1, load-gated ΔT |
| HW loop | hw_supply_t, hw_return_t, hw_supply_sp, hw_pump_cmd, hw_reset_request_sum |
Boiler trim today; HW performance backlog |
| Weather | web-outside-air-temp, calculated wet-bulb |
CW rules, future reset checks |
| Bypass / mode | chw_bypass_valve, min_flow_bypass, plant mode (future) |
Low-flow + bypass saturated |
Optional roles in registry should stay optional — rules must fail closed (no fault) when proof signals are missing, not guess from unrelated columns.
Source anchors (research leads — verify current editions)
| Source | Use for Open-FDD backlog |
|---|---|
| ASHRAE Guideline 36 (2018 addendum x public PDF; confirm against G36-2024 before claiming “G36-aligned”) | State-gated plant faults: flow/DP when pumps off, min-flow bypass, supply/pressure, evaporator/condenser approach, sensor disagreement, tower limits, excessive starts, stage churn + delays after stage changes. |
| NIST HVAC-Cx chilled-water study | Expert rule patterns vs field BAS data — prioritization and false-positive patterns. |
| ASHRAE Guideline 22-2025 | Instrumentation for plant load, energy, efficiency — minimum metering before kW/ton / COP advisories. |
| DOE FDD test datasets & prioritization | Ground-truth fixtures, varied conditions, O&M alert ranking — separate literature coverage from field prevalence. |
| Berkeley / PNNL / AIRCx (via gap matrix) | Cross-check terminal and reset themes already covered elsewhere. |
Overlap decisions (avoid duplicate rule IDs)
| Proposed / roadmap ID | Existing coverage | Recommendation |
|---|---|---|
TOWER-1 |
CW-APR-1, CW-FAN-1 |
Do not add a third identity for “high approach at high fan” without a distinct fault signature (e.g. approach high at low fan = free-cooling / sensor issue). Prefer extending parameters/gates on CW-APR-1 / CW-FAN-1 or one merged tower-capacity rule with explicit sub-modes. |
PLANT-1 |
CHW-2, TRIM-4, RESET-1 (AHU SAT only) |
Distinct: missing CHW DP reset vs low DP at max speed (CHW-2). Implement as new rule when reset SP trace + pump speed available. |
| Low CHW ΔT | CHW-1 |
Evolve CHW-1 with load/flow gates rather than new ID unless signature splits (e.g. overflow vs low load). |
Prioritized backlog
Priorities rank implementation follow-ups (registry + both cookbooks + fixtures). Each item should become its own GitHub issue when accepted — not bulk-implemented from this doc alone.
P0 — harden catalog, parity, and scaling (do first)
| ID / theme | Type | Required / optional roles | Detection concept | Gates & confounders |
|---|---|---|---|---|
| Plant rule parity proofs | Engineering | Per rule above | Promote from sql_screening only with predicate/mask/duration fixtures |
Start with CHW-NOLOAD-1 (already Wave 1) |
CHW-1 load-aware ΔT |
Refine existing | Required: chw_supply_t, chw_return_t; optional: chw_flow, chiller_power, chiller_status, chw_pump_cmd |
Low ΔT only when hydraulic cooling delivery is plausible (pump/chiller on, optional min flow or load proxy) | Low load, bypass/decoupler flow, sensor swap |
CHW-4 design-scaled flow |
Refine existing | chw_flow, chw_pump_cmd; optional design metadata |
High flow vs site max or % of design, not fixed gpm default | Variable-primary, staging |
CHW-2 / CHW-3 complement doc + gates |
Refine existing | As registry | Document when DP vs SP faults fire; add optional terminal demand roles in follow-up | Primary-only vs secondary, DP sensor location |
| State: flow or DP when pumps commanded off | New (CHW-OFF-FLOW-1 candidate) |
chw_pump_cmd, chw_flow and/or chw_dp |
Residual flow/DP above noise when all mapped pumps off | Standby heat expansion, sensor zero bias |
| State: low primary flow + min-flow bypass saturated | New (CHW-MINFLOW-1 candidate) |
chw_flow, bypass valve position or pump speed proof |
Flow below minimum while bypass fully open (G36 lead) | Staging, valve mapping errors |
P1 — high-value new plant diagnostics
| ID / theme | Type | Required / optional roles | Detection concept | Gates & confounders |
|---|---|---|---|---|
PLANT-1 — CHW DP reset missing |
New (roadmap) | chw_dp_sp, chw_pump_cmd, load proxy or OAT |
SP not tracking reset schedule while load varies | Fixed-primary plants without reset |
| Chiller **evaporator / condenser approach** | New (CHLR-APR-1 candidate) |
Machine LWT/EWT vs header chw_* / cw_* |
Approach high vs design at rated conditions | Part-load, false LWT sensor |
| Header vs machine sensor disagreement | New (CHLR-SENSOR-1 candidate) |
Duplicate temp roles on header vs chiller | |ΔT| above tolerance when both trusted | Calibration drift, lag during ramp |
| Excessive starts / stage churn | New (CHLR-STAGE-1 candidate) |
chiller_status or stage enum |
Start count or state changes per hour above limit | Startup/stage delay suppression (G36) |
| Low system pressure | New (CHW-PRESS-1 candidate) |
chw_system_pressure or DP at boundary |
Pressure below SP − band with pumps on | Sensor elevation, closed isolation |
| Tower: distinguish capacity fault vs optimization | Refine CW family | cw_supply_t, fan cmd/status, web WB |
Keep CW-OPT-1 as opportunity; CW-APR-1 / CW-FAN-1 as capacity |
Wet-bulb source, OA sensor used as WB |
P2 — HW plant, economizer, efficiency, staging
| ID / theme | Type | Required / optional roles | Detection concept | Notes |
|---|---|---|---|---|
HW low ΔT (symmetric to CHW-1) |
New (HW-1 candidate) |
hw_supply_t, hw_return_t, pump/boiler proof |
Low ΔT with heating delivery plausible | Condensing boiler return temp opportunities separate |
| HW pump cmd/status/flow mismatch | New | hw_pump_cmd, pump_status, hw_flow or hw_dp |
Same pattern as CMD-1 / hydraulics |
|
| Boiler short cycling / lead-lag | New | boiler_status, stage commands |
Cycles per hour, unstable lead-lag | Pattern library (gap matrix P3) |
| HW DP reset missing | New | hw_dp_sp, load/OAT |
Mirror PLANT-1 on hot side |
|
| Waterside economizer | New | Mode enum, HX approach, isolation valves | Eligibility + performance when in economizer mode | Suppress during mode transitions |
| Plant kW/ton or COP advisory | Analytics / trim | chw_flow, CHW ΔT, electric_kw / kwh, stable meters |
Efficiency vs expected curve | Not a fault without Guideline 22-grade metering; minimum data sufficiency table in issue |
| Cooling tower makeup / blowdown | Analytics | Makeup meter, basin level | Water use anomaly | Often BMS-specific — keep optional |
Cross-cutting implementation requirements (all priorities)
For each accepted rule follow-up:
- Equipment kinds:
chiller,cooling_tower,boileras applicable — no campus or vendor ids in SQL. - Operating state: explicit pump/chiller/boiler proof macros (prerequisite macros); stage-change and startup delays for plant transitions.
- Fault vs advisory: label trim/optimization rules (
TRIM-*,CW-OPT-1, future efficiency) separately from confirmed faults. - Fixtures: positive, negative, boundary, low-load, stage transition, missing NULL roles, and sensor-quality cases per benchmark strategy.
- Dual catalog: update registry, SQL file, Pandas oracle, generated inventory, and parity tests together; bump parity status only after proofs pass.
Recommended follow-up GitHub issues (titles only)
Create one issue per rule or coherent bundle when pulling from this backlog — examples:
CHW-1: load- and flow-gated low delta-TCHW-4: replace absolute gpm default with design-scaled thresholdCHW-OFF-FLOW-1: residual CHW flow/DP with pumps offPLANT-1: CHW differential-pressure reset not tracking loadCHLR-APR-1: chiller evaporator/condenser approach highCHLR-STAGE-1: excessive chiller starts with stage-delay suppressionHW-1 / HW hydraulics bundle for boiler plantsPlant rule parity fixtures: CHW-NOLOAD-1, CHW-1, …
Non-goals
- Vendor-specific sequences, proprietary point names, or threshold bundles tied to one OEM.
- Hardcoded plant design constants in product code (e.g. universal 1100 gpm) without site sliders or package metadata.
- Building/campus/equipment_id substring selection — type stamp and roles only.
- ML / black-box anomaly models — stay deterministic SQL + Pandas oracle.
- Claiming Pandas↔SQL parity for plant rules without executable proof.
- Root-cause diagnosis from a single symptom — rules surface symptoms with documented false-positive cases.
- Full hydronic distribution network modeling (every terminal valve) in v1 plant rules — use load proxies and mapped terminals where available.
Document history
| Date | Change |
|---|---|
| 2026-10-03 | Initial research priority for #1009 (PR-04). |