Complete reference for every algorithm, constant, and formula used across the Ener.co platform — the Estimator, the Proposer, and the Dashboard.
These algorithms power the Refinery Estimator and Proposer tools. They use
ASHRAE standards, equipment age, condition, and region to model savings
before sensors are installed. Source: shared/calculations.js
and estimator/index.html.
Every piece of HVAC equipment manufactured in the US must meet a minimum efficiency standard set by ASHRAE 90.1 (adopted by DOE). We use these as the nameplate kW/ton starting point for each unit based on its install year.
Equipment efficiency degrades over time due to coil fouling, refrigerant loss, and mechanical wear. We model this as compound annual degradation from the ASHRAE nameplate, varying by equipment condition. A hard cap at 1.5× nameplate prevents unrealistic values.
| Condition | Rate | Rationale |
|---|---|---|
| good | 1.0%/yr | Well-maintained, regular coil cleaning |
| avg | 2.0%/yr | Typical commercial maintenance schedule |
| poor | 3.5%/yr | Neglected coils, heavy fouling, deferred maintenance |
fieldKwTon(year) = federalMinKwTon(year) × 1.10
Pre-sensor estimate of EER improvement from EnerCoat treatment. Uses a logarithmic curve fit to M&V field data — older equipment has greater optimization potential but with diminishing returns. Adjusted for condition and equipment type.
Savings cannot bring field efficiency below 95% of the ASHRAE nameplate minimum. This prevents claiming that treatment makes a unit better than new — we can only recapture lost efficiency, not create it.
Climate and operating environment determine equipment life, cooling hours, and degradation rate. These defaults can be overridden per-unit.
| Region | Base Life (yr) | EFLH (hrs/yr) | Deg Without (%/yr) |
|---|---|---|---|
| northeast | 18 | 2,500 | 3.0 |
| southeast | 16 | 4,000 | 3.5 |
| midwest | 18 | 2,500 | 3.0 |
| southwest | 20 | 4,000 | 2.5 |
| west | 22 | 2,500 | 2.0 |
Condition life offsets — added to/subtracted from base life:
| Condition | Offset | Effect on 18-yr Base |
|---|---|---|
| poor | −3 years | 15 years |
| avg | 0 years | 18 years |
| good | +2 years | 20 years |
Remaining Useful Life (RUL) estimates how many years until the equipment needs replacement. Extended Useful Life (EUL) is the projected life with EnerCoat treatment — always RUL + 10 years.
Calculates the annual deposit needed to accumulate a future replacement cost over N years at a given discount rate. Used for capital reserve comparisons across all TCO scenarios.
| Variable | Meaning | Default |
|---|---|---|
| FV | Future replacement cost (inflation-adjusted) | tons × cost_per_ton × (1.03)N |
| r | Discount rate | 7% |
| N | Years to accumulate | RUL or EUL |
Energy costs rise from two forces: equipment degradation (needs more kW per ton) and utility rate escalation (electricity costs more). Savings grow as the gap between treated and untreated widens each year.
Maintenance costs grow as equipment degrades. Treated equipment's R&M baseline is reduced by the initial savings percentage, then grows at the much slower treated degradation rate.
The CapEx benefit of EnerCoat is the present value of deferring a replacement from RUL to EUL. We compute that NPV once, then recognize it as a flat annual rate over the equipment's extended useful life. The result is a defensible, conservative number that respects two realities: (1) the decision genuinely creates value the moment it's made, and (2) that value is only earned over time.
Year 1 snapshot comparing the full annual cost of ownership with and without treatment. Used as the headline metric in proposals.
Models the worst-case scenario: running equipment past its useful life until emergency failure. No capital reserves — purely reactive. This is the "do nothing and hope" approach.
Planned replacement at end of RUL. Capital reserves built via sinking fund from year 1. Includes disruption at replacement and a new sinking fund for the next replacement cycle. Baseline comparison scenario.
Ener.co treats and monitors equipment. Savings are shared — client keeps their split, Ener.co's share covers ongoing service. Equipment life extends to EUL.
One-time upfront project fee. Client keeps 100% of all savings — no ongoing payments. Same performance and life extension benefits as PP.
| Pricing | Condenser | Evap | Both |
|---|---|---|---|
| Default $/ton | $750 | $300 | $1,050 |
Shows how key metrics change if actual EER improvement differs from the M&V estimate. Five scenarios span ±30% around baseline.
| Parameter | Value | Source / Rationale |
|---|---|---|
| current_year | 2026 | Updated annually |
| energy_escalation | 2%/yr | EIA long-term reference case for commercial electricity |
| inflation_rate | 3.5%/yr | FRED PPI HVAC Equipment (PCU3334133341); above pre-COVID trend for R-454B transition + labor |
| discount_rate | 7% | DOE uses 9% (7% real + 2% inflation); we use 7% conservative |
| co2_factor (national) | 0.00037 MT/kWh | EPA eGRID 2022 national average (delivered basis) |
| co2_factor (northeast) | 0.00030 MT/kWh | NEWE+NYCW+NYLI+RFCE avg — hydro/nuclear/gas |
| co2_factor (southeast) | 0.00040 MT/kWh | SRSO+FRCC+SRVC avg — gas + some coal |
| co2_factor (midwest) | 0.00050 MT/kWh | RFCW+MROE+MROW avg — coal heavy |
| co2_factor (southwest) | 0.00035 MT/kWh | ERCT+AZNM avg — gas + growing renewables |
| co2_factor (west) | 0.00025 MT/kWh | CAMX+NWPP avg — hydro/solar/wind |
| rm_factor | 4% | ASHRAE RP-1237 baseline (% of replacement value/yr) |
| field_penalty | 10% | PNNL: new unit field derate vs. nameplate |
| evap_fixed_pct | 7% | Fixed evaporator-only savings component |
| deg_with | 0.25%/yr | NYBC 13+ yr, NYT 9+ yr monitored data |
| deg_without (poor) | 3.5%/yr | NREL/DOE Building America (2006) |
| deg_without (avg) | 2.0%/yr | NREL/DOE Building America (2006) |
| deg_without (good) | 1.0%/yr | NREL/DOE Building America (2006) |
| degradation_cap | 1.5× nameplate | Equipment fails before exceeding 50% over nameplate draw |
| max_savings_floor | 95% nameplate | Cannot claim savings below near-nameplate efficiency |
| eul_extension | +10 years | EUL = RUL + 10; NYBC/NYT long-term data |
| rul_minimum | 3 years | Floor on remaining useful life |
| rtf_overshoot | 5 years | Run to Fail runs 5 years past RUL |
| rtf_deg_mult | 1.5× | Degradation acceleration during overshoot |
| rtf_rm_range | 2.0–3.0× | R&M spike during overshoot (ASHRAE RP-1237) |
| rtf_emergency_premium | 25% | DOE FEMP unplanned replacement cost premium |
| rtf_disruption_mult | 2× | Unplanned replacement causes double disruption |
| mv_log_a | 5.58 | Log-curve coefficient: 5.58 × ln(age+1) |
| mv_log_b | 2 | Log-curve intercept (base 2% at age 0) |
| cond_life_poor | −3 yr | Equipment life offset for poor condition |
| cond_life_good | +2 yr | Equipment life offset for good condition |
| cond_mv_poor | 1.10× | M&V multiplier for poor condition (more fouling) |
| cond_mv_good | 0.90× | M&V multiplier for good condition (less fouling) |
Multi-factor model for total installed replacement cost. Calibrated against Google SF Bay Area facilities data and contractor quotes (2024). Includes equipment, labor, crane, piping, controls integration, startup, and commissioning.
Base Cost by Equipment Type × Tonnage Tier ($/ton)
| Equipment Type | Small (≤10T) | Mid (11–25T) | Large (26–50T) | XL (51+T) |
|---|---|---|---|---|
| split | $5,500 | $4,000 | — | — |
| ptac | $4,500 | — | — | — |
| rtu | $3,500 | $2,800 | $2,200 | $2,500 |
| chiller_air | $4,000 | $3,000 | $2,500 | $2,800 |
| chiller_water | — | $3,500 | $2,800 | $3,200 |
| crac | $8,000 | $7,000 | $6,000 | — |
| ahu | $2,800 | $2,200 | $1,800 | $2,000 |
Location Cost Index (national avg = 1.00)
| Metro | Index | Metro | Index | |
|---|---|---|---|---|
| nyc_metro | 1.42 | dallas | 0.92 | |
| sf_bay | 1.38 | houston | 0.90 | |
| boston | 1.28 | atlanta | 0.92 | |
| la_metro | 1.22 | phoenix | 0.88 | |
| seattle | 1.18 | rural_northeast | 0.95 | |
| dc_metro | 1.15 | rural_southeast | 0.82 | |
| chicago | 1.12 | rural_midwest | 0.85 | |
| philadelphia | 1.08 | rural_west | 0.90 | |
| miami | 1.05 |
Regional fallbacks: northeast=1.12, southeast=0.92, midwest=1.05, southwest=0.90, west=1.15, tropical=1.10
Facility Type Multiplier
| Facility | Mult | Facility | Mult | |
|---|---|---|---|---|
| office | 1.00 | healthcare | 1.40 | |
| retail | 1.00 | hospital | 1.50 | |
| warehouse | 0.90 | data_center | 1.70 | |
| education | 1.00 | pharma / lab | 1.50 | |
| hospitality | 1.15 | food_processing | 1.30 | |
| multifamily | 1.00 | clean_room | 1.60 | |
| industrial | 1.10 | mission_critical | 1.65 |
Access Complexity Adder ($/ton)
| Access Level | Adder | Notes |
|---|---|---|
| standard | $0 | Ground level, easy access |
| rooftop | +$250 | Crane required |
| mechanical_room | +$350 | Interior rigging |
| high_rise | +$500 | >10 floors |
| confined | +$450 | Tight spaces |
Equipment Cost Inflation
| Period | CAGR | Source |
|---|---|---|
| Pre-COVID 2015–2019 | 3.1%/yr | FRED PPI PCU3334133341 |
| Post-COVID 2020–2025 | 8.0%/yr | FRED PPI PCU3334133341 |
| Recent 2024–2025 | 2.2–3.3%/yr | ACHR News PPI Report |
| Full period 2015–2025 | 5.3%/yr | FRED PPI PCU3334133341 |
| Forward rate (model) | 3.5%/yr | Above pre-COVID trend; R-454B transition, labor, materials |
Validation — Google SF Bay Area Facilities Data
| Scenario | Calculation | Result | Google Range |
|---|---|---|---|
| 1T split, SF, office | $5,500 × 1.38 × 1.0 + $0 | $7,590/ton | $3K–$7.5K ✓ |
| 100T chiller_air, SF, DC, roof | $2,800 × 1.38 × 1.70 + $250 | $6,818/ton ($682K) | $250K–$600K+ ✓ |
| 100T chiller_air, SF, office | $2,800 × 1.38 × 1.0 + $0 | $3,864/ton ($386K) | ✓ |
| 30T CRAC, NYC, data center | $7,000 × 1.42 × 1.70 + $0 | $12,000/ton (capped) | ✓ |
These formulas are used by the live dashboard once sensors are installed.
They use real amperage and EER data instead of model-based estimates.
Source: dashboard/calculations.py.
Measures the reduction in electrical consumption from improved EER after coating. Uses the escalating degradation gap method — untreated equipment degrades faster than treated, widening the savings gap each year.
| Variable | Source | Default |
|---|---|---|
| baseline_amperage | Unit baseline (sensor or manual) | — |
| voltage | Unit equipment spec | 208V |
| phase | Unit equipment spec | 3-phase |
| power_factor | Unit equipment spec | 0.85 |
| baseline_EER | Unit baseline (sensor or manual) | — |
| electricity_rate | Site setting | $0.20/kWh |
| EFLH | Unit override > site default | 2,000 hrs |
| deg_without | Unit: coil degradation without coating | 2%/yr |
| deg_with | Unit: coil degradation with coating | 1%/yr |
Baseline annual R&M cost is a percentage of total replacement cost. Coating reduces R&M proportionally to the EER efficiency improvement. Both untreated and treated R&M costs escalate annually, but at different rates.
| Variable | Source | Default |
|---|---|---|
| tonnage | Unit equipment spec | — |
| replacement_cost_per_ton | Unit setting | $3,000 (>15T) / $2,200 (≤15T) |
| rm_pct | Site: baseline R&M % | 4% |
| baseline_EER | Unit baseline | — |
| rm_esc_untreated | Site: R&M escalation (untreated) | 2%/yr |
| rm_esc_treated | Site: R&M escalation (treated) | 1%/yr |
M&V CapEx savings use NPV / EUL Linear Amortization. For each unit we compute the present value of deferring its replacement from RUL to EUL, then recognize that NPV linearly over the unit's extended useful life. This is purposely conservative for backward-looking M&V — we never claim savings that elapsed time hasn't yet earned.
| Variable | Source | Default |
|---|---|---|
| replace_cost | tonnage × replacement_cost_per_ton | — |
| r (discount_rate) | project.json | 7% |
| infl (rm_pct as proxy) | project.json | 3% |
| useful_life_yrs | project.json | 18 yrs |
| extension_yrs | project.json | 10 yrs |
| RUL | install_year + useful_life − current_year (floor 3) | — |
| EUL | RUL + extension_yrs | — |
min(EUL, project_horizon) so the full deal
NPV is shown within the contract term.The dashboard counters show cumulative savings accruing in real time since each site's coating date.
Monnit current sensors report raw amperage. We convert to kW using per-unit voltage, phase configuration, and power factor, then to kWh by multiplying by the time interval between readings.
| Variable | Source | Notes |
|---|---|---|
| amperage | Monnit current sensor reading | 20A or 150A sensor variants |
| voltage | Unit equipment spec | Default 208V |
| phase | Unit equipment spec | 3-phase uses √3 multiplier |
| power_factor | Unit equipment spec | Default 0.85 |
| EFLH | Estimated from sensors or unit/site override | Equivalent full-load hours/yr |
| electricity_rate | Site setting | $/kWh |
Measures the heat energy removed by the evaporator coil using moist-air enthalpy from dry-bulb temperature and relative humidity at inlet and outlet.
Temperature spread between compressor discharge and condenser outlet. Not true subcooling (requires pressure), but a practical proxy.
Real-time EER from live sensor data. Combines enthalpy delta (cooling output) with amperage (power input).
Scales measured EFLH to full-year estimate using Cooling Degree Hours (CDH, base 65°F) from Open-Meteo weather data.
Plots instantaneous EER vs outdoor temperature. Linear regression quantifies efficiency degradation at higher ambient temps.
| Metric | Color Coding | Thresholds |
|---|---|---|
| Avg EER | Green / Yellow / Red | ≥ 14 / ≥ 10 / < 10 |
| Subcool ΔT | Green / Yellow / Red | 10–20°F / < 10°F / > 20°F |
These metrics assess whether a unit’s baseline data collection is sufficient for
IPMVP Option B (retrofit isolation with metered data) M&V analysis. Computed in
dashboard/baseline.py and displayed in the Site Workshop.
IPMVP Option B isolates the retrofit measure (coil coating) by metering the individual HVAC unit before and after treatment. The full IPMVP spec has ~15 criteria covering whole-building Option C and multi-system retrofits. For individual unit isolation with a passive coating ECM, 7 metrics are the ones that actually gate baseline readiness.
What doesn’t apply (and why):
| Criterion | Why Excluded |
|---|---|
| CV-RMSE / NMBE | Model-fit outputs, not baseline prerequisites. Shown as informational only. |
| FSU (Fractional Savings Uncertainty) | Requires post-treatment data. Irrelevant during baseline collection. |
| 12-month rule | Formal spec says 12 months for weather-sensitive measures. Direct metering + OAT range coverage across the cooling season is a defensible short-term Option B. OAT range matters, not calendar time. |
| Non-routine adjustments | Apply at reporting/analysis time, not during collection. |
| Meter certifications, t-stats | Apply at reporting/analysis time. |
The entire M&V analysis is kW-vs-OAT. Gaps in temperature bins = gaps in the savings story. We bin outdoor air temperature into 5°F buckets across the cooling range.
Statistical power per temperature bin. Sparse bins produce noisy averages that weaken the regression.
Overall dataset size for regression confidence. More points = tighter confidence intervals on the baseline model.
| Variable | Source | Default |
|---|---|---|
| voltage | units.voltage | 208 |
| phase_mult | √3 if 3-phase, 1 if single | √3 |
| PF | units.power_factor | 0.85 |
| min_kw | units.amp_on_threshold × V × √3 × PF / 1000 | ~1.8 kW |
Missing intervals create a biased sample. Completeness is estimated from the median reporting interval vs actual reading count.
Calendar days from first to last compressor-on reading. Short windows risk capturing only one weather pattern.
Does electrical power actually correlate with outdoor air temperature? Low R² indicates an oversized unit, variable internal loads, or staging behavior that masks the OAT relationship.
All configured sensor channels (source_mappings) must have at least one reading. kW + OAT are the minimum for Option B; supply/return temp+RH enable EER calculation.
Composite score combining all 7 metrics. Simple average of individual percentages (each capped at 100%).
| Status | Color | Condition |
|---|---|---|
| Ready | Green | overall ≥ 90% AND no metric below 60% |
| Partial | Amber | overall ≥ 50% (but not meeting Ready criteria) |
| Collecting | Red | overall < 50% |
These are computed and displayed for reference but do not gate baseline readiness. They become gating criteria at the analysis/reporting stage.
| Metric | Typical Range | When It Matters |
|---|---|---|
| CV-RMSE | < 25% good, < 15% excellent | Model fit quality — assessed at analysis time |
| NMBE | ± 5% | Model bias — assessed at analysis time |
| FSU | Varies | Requires post-treatment data |
After computing the efficiency improvement (Methods A–D in the M&V skill), translate to annual kWh and $/yr savings. Always compute multiple approaches and present as a comparison table. Each M&V library entry shows all applicable approaches with the primary highlighted.
| Code | Method | Formula | Best When |
|---|---|---|---|
| A | kW-only | kW_reduction% × avg_baseline_kW × EFLH | kW/CT-only data, no coil-face RH sensors |
| B | EER-based (humidity-normalized) | EER_improvement% × avg_baseline_kW × EFLH | Full sensor suite with humidity normalization. Default when data supports it. |
| C | Decomposed (kW + sensible) | (kW_share + sensible_share) × EER% × kW × EFLH | When latent component is controversial or audience demands conservatism |
| E | Regression × TMY | ∑(kW_pre(OAT) − kW_post(OAT)) over TMY hours | Gold standard IPMVP. Accounts for actual temp distribution. |
| F | Vendor’s method, corrected inputs | savings_frac × avg_baseline_kW × EFLH | Apples-to-apples with vendor; or third-party validated (e.g. NYSERDA) |
| Data Available | Primary | Rationale |
|---|---|---|
| Full sensors + humidity-normalized EER | B | Full thermodynamic picture including latent capacity |
| Third-party validated (NYSERDA, utility regression) | F | Don’t override independently validated savings |
| OAT-dependent improvement (oversized unit) | E | Improvement concentrated at high OAT; uniform % overstates |
| kW-only / CT data | A | Only honest option without psychrometric data |
| Mixed fleet, no common EER | A per-unit | Can’t apply a single EER% to heterogeneous equipment |
Required on every entry with evap inlet/outlet T+RH data. Decompose total EER improvement at matched OAT × humidity conditions into three components:
| Component | Mechanism | Weather Sensitivity |
|---|---|---|
| kW reduction | Cleaner condenser → lower head pressure → less compressor work | Low — direct mechanical improvement |
| Sensible capacity | Colder supply air from improved heat transfer | Low — stable across conditions |
| Latent capacity | Lower evap temp → more moisture condensation | High — varies with ambient humidity |
SKILL.md §9 for the
complete methodology and audience-based recommendations.
A first-principles diagnostic that estimates what fraction of the air entering the evaporator coil is outdoor air vs. recirculated return air. This is a heuristic sanity check, not an IPMVP method or a correction factor for savings calculations. It exists to explain unusual EER-vs-OAT patterns (e.g. positive slope) so engineers don’t mistakenly flag them as data quality issues.
For a unit with a fixed outdoor air fraction, the temperature of the mixed air entering the evap coil is:
If Treturn is roughly constant (thermostatically controlled zone), then a linear regression of evap inlet temperature against outdoor air temperature yields OA% as the slope. A slope of 0.72 means ~72% outdoor air, 28% recirculated.
| R² | Interpretation |
|---|---|
| ≥ 0.7 | Consistent OA fraction — fixed dampers or code-mandated minimum OA. Reliable estimate. |
| 0.4 – 0.7 | Moderate correlation — could be variable dampers (economizer), occupancy-driven return air swings, or inconsistent fan scheduling. Estimate is approximate. |
| < 0.4 | OAT does not drive inlet temp — mostly recirculated air, or too much noise. No OA% reported. |
For a standard recirculated-air RTU, the evap load is roughly constant (thermostat-controlled zone). Higher OAT means higher condensing temperature → compressor works harder → EER drops.
For a high-OA unit, the mechanism is part-load efficiency: at low OAT the evap load is very small (outdoor air barely needs cooling), so the compressor runs at 20–30% capacity where DX part-load curves are steep and inefficient. As OAT rises, load increases toward the 60–80% capacity sweet spot where most compressors peak in COP. This can produce a positive EER-vs-OAT slope up to the part-load peak.
Above the part-load peak (often around 80–85°F OAT depending on the unit’s specific performance curves), condensing pressure effects dominate and EER should begin to decline — the familiar negative slope returns. The full curve may therefore be inverted-U shaped: rising EER through part-load, peaking, then falling at full load. More data at higher OATs is needed to confirm where the inflection occurs for any given unit.
Variable airflow rate may also contribute: if the unit modulates fan speed with load, the changing CFM affects the enthalpy calculation and can steepen the positive slope in the part-load region.
| Application | Typical OA% | Reference |
|---|---|---|
| MRI / imaging suites | 70–100% | ASHRAE 170 Table 7-1 |
| Procedure rooms, ORs | 100% (code) | ASHRAE 170 |
| Labs / clean rooms | 100% | Pressurization requirement |
| Data center economizers | Variable (0–100%) | ASHRAE TC 9.9 |
| Printing / manufacturing | 30–80% | VOC / particulate exhaust makeup |