WTWilly Tai
Case study · live demo · real dataSustainability · Smart Buildings

Six days of real plant data walk in. The diagnosis names the component, then checks itself against the lab.

This is real fault-injection data: LBNL's FLEXLAB air-handling unit and ORNL's instrumented rooftop unit, with faults physically imposed and ground truth recorded, published open-access (CC-BY 4.0). The demo takes each day blind: residual rules flag the anomalous readings, then the diagnosis walks the airflow path and the refrigeration circuit upstream and downstream to isolate the failing component and to say why the alternatives are ruled out. Only after the engine commits do you reveal the lab's label and score it. Runs live in your browser, link below.

01 / The pain

The building runs "fine" while a stuck valve burns energy for months.

The costliest HVAC faults are the quiet ones. A heating valve that leaks gets cancelled by the cooling coil, so comfort holds and nobody complains, while the plant pays twice for every degree. A fouled condenser shows up as a power bill, not an alarm. Across a S$4M green-technology programme and a 50-plus-facility smart FM estate, the pattern I kept meeting was the same: the sensors already see the fault, but the BMS only alarms on setpoints, so the evidence sits unread until the energy review or the breakdown, whichever comes first. Fault detection and diagnostics is the discipline of reading that evidence continuously, and the research community has published real labelled data precisely so that anyone claiming to do it can be checked.

02 / Why the naive approach fails

"Train a model on the sensors and alert on weird" cries wolf, and cannot name the component.

03 / How it works

Residual rules find the symptom; the dependency graph finds the component.

The engine's baselines are computed live from the two fault-free days (the fan's heat contribution, the compressor's normal head pressure and power). Fixed engineering thresholds, declared before any faulty day is examined, turn residuals into symptoms. Then the isolation logic walks the system graph: upstream, does anything feeding this component explain the reading? Downstream, do the components after it corroborate? Only a component whose upstream is clean and whose downstream agrees gets named, and the verdict always carries its "why not" list. Rules also know their own limits: the damper rule declares itself unidentifiable when outdoor and return air are at the same temperature, and abstains rather than guesses.

OA damperupstream: cleared mixing boxtracks command heating coilfights back cooling coilvalve stuck open supply fanrise measured zone symptom seen hereT_sa below T_ma, cc_cmd = 0 diagnosis walks back up the airflow path to the first component that explains everything the heating coil's fight-back is corroboration, not the culprit · upstream cleared, downstream agrees → the valve is named
fig.1 · symptoms surface downstream; the dependency walk names the component upstream
04 / One worked example

The condenser-fouling day, diagnosed the way a chiller tech would.

On the rooftop unit's faulted day (the lab physically blocked half the condenser airflow), head pressure runs roughly 40 percent above the fault-free baseline and compressor power around 30 percent up. The discriminator is what didn't move: suction pressure holds its normal band, so the low side, the evaporator and the airflow across it are fine. High head, high power, clean suction: the heat cannot leave the condenser. The engine names the condenser, explains why it is not refrigerant undercharge (that would pull suction down) and not a failing compressor (failing valves lower head, this one is building more), and then, only then, the reveal shows the lab's label: condenser fouling. The same discipline catches the cooling valve that cools with its command at zero, and reports the two fault-free days as exactly that.

Blind dayEngine's verdictLab's ground truth
AHU · 22 Sep 2017cooling-coil valve stuck openmatch
AHU · 12 Sep 2017heating-coil valve leaking throughmatch
RTU · 29 Aug 2017condenser fouling / blocked heat rejectionmatch
AHU + RTU fault-free daysno fault to reportmatch
AHU · 19 Sep 2017no detectable fault in this windowmasked fault · abstention correct
The blind-then-reveal order is the point, and so is the sixth row. The engine commits before the label is shown, on data it did not generate, against ground truth a national lab recorded. On the sixth day the lab stuck the damper fully open while the economizer was legitimately commanding it open: the fault is undetectable in principle from that window, the engine says so, and the reveal explains why that abstention is the correct verdict. A falsifiable claim, including about its own limits, is the only kind worth putting on a portfolio.
05 / Numbers & honest trade-offs

What it does, and what it does and doesn't prove.

2
real research rigs
LBNL FLEXLAB AHU · ORNL Trane RTU, faults physically imposed.
6
blind days
Verdict first, lab label revealed after.
7
declared rules
Formulas, thresholds and live baselines on their own tab.
0
black boxes
Every verdict re-derivable from the page.

Where this stands, honestly. The ask was a chiller plant; the truth is that no real, labelled, public chiller-plant fault dataset exists. LBNL's chiller set is simulation-only and ASHRAE's RP-1043 sits behind a paywall, so rather than dress simulation up as field data, the demo uses the two systems with real physical fault injection: the AHU carries the airflow-path story end to end, and the RTU's refrigeration circuit is the same vapour-compression cycle a chiller runs, so the condenser diagnosis transfers directly. The extract is six downsampled days, and the sixth deserves its own sentence: every damper-fault day in the source dataset turned out to be masked, either by the economizer legitimately commanding the damper open or by mixed-air sensor stratification at low airflow, with the command-vs-physics divergence inside the fault-free noise floor. The day was kept anyway, presented as what it is. A demo that quietly picked only flattering data would be exactly the kind of AI theatre this portfolio argues against; the screening table ships in the repo's provenance file.

Scale is where learning earns a seat. Six days on two units need no machine learning, and using none keeps every verdict explainable in a dispute. Across a thousand assets, learned models earn their place ranking anomalies, modelling weather-dependent baselines and proposing which rule to check first. They sit in front of this rule layer, never instead of it, because the work order that shuts down a tenant's cooling gets issued on evidence a person can re-derive.

06 / Governance, shown

Rules that show their formulas, baselines computed in front of you, and an engine that can say "I can't tell".

The rules tab is the whole diagnostic brain: each rule's formula, threshold and live-computed baseline, plus the isolation logic in plain language. Where a rule cannot run, it says so on screen; the fault-free verdict explicitly reports how many samples were identifiable. Provenance is complete: dataset, DOI-backed citation, license, and every transformation from the published archive to the page.

Verdict · condenser-fouling daycommitted before the label was revealed
R1  head pressure     71/82 comp-on samples · median +44% vs baseline 316.8 psia
R2  compressor power   52/82 comp-on samples · median +31% vs baseline
R3  suction pressure   82/82 within normal band  ← the discriminator
DX  high side cannot reject heat; low side healthy → CONDENSER
why not: undercharge pulls suction low (it isn't) · failing compressor lowers head (it's rising)
reveal: lab label "Condenser fouling (50% airflow reduction)" · MATCH
Source: Granderson et al., Scientific Data 7, 65 (2020) · OEDI submission 910 · CC-BY 4.0. Units kept as published; conversions would break checkability.

What this says about how I work.

I have delivered smart-building programmes where "AI-enabled FDD" was a slide long before it was a system, and the difference between the two is everything on this page: real data with ground truth, thresholds declared before the test, verdicts that name a component and survive the reveal, and the honesty to exclude a day the method cannot fairly detect and say why. Sustainability reporting ultimately inherits this discipline too, because the energy a stuck valve wastes is a Scope 2 number someone will assure one day. Meter-up evidence, rules that show their working, and a system that knows what it cannot see: that is what I mean when I say assurance-grade.

See it run, live.

Pick a blind day, read the rule verdicts and the dependency walk, then reveal the lab's label and score the engine. Check the rules tab to see every formula and baseline, and the data tab for exactly where the data comes from and what it does not prove.

Open the diagnostician →Runs client-side over the published LBNL/ORNL extract: no sign-in, nothing to install.