Validation Report · Microgrid

BESS Module Validation

Twelve validation stages across 984 in-scope scenarios including a full-year 8760-hour realistic-load extension on Stage 1 and DOE Commercial Reference Building cross-occupancy coverage (Large Hospital, Large Office, Standalone Retail) on the annual extension and on every coupled-plant stage. Core dispatch physics cross-validated directly against EnergyPlus ElectricLoadCenter:Storage:Simple within ASHRAE Guideline 14-2023 strict; dynamic response, lifetime degradation, control strategies, multi-unit scaling, two-size and two-parameter-set composition, BESS+PV and BESS+CHP coupled plants, full microgrid integration with boiler and CHP, and the building-owner and rate-based Energy-as-a-Service financial layers validated against analytical engineering gates. 100% pass rate.

In-Scope Scenarios

984

Pass Rate

100.0%

EnergyPlus Cross-Validated Stages

5

Analytically Validated Stages

8

Featured · 2026 BESS Validation Report

984 of 984 scenarios PASS strict ASHRAE G14-2023 vs EnergyPlus + NREL SAM

Twelve validation stages across 984 in-scope scenarios. Five stages cross-validated against EnergyPlus ElectricLoadCenter:Storage:Simple; seven stages validated against NREL SAM Battery / Microgrid / Singleowner. Eight OEM-grounded utility-scale Li-ion LFP tiers (Tesla / Fluence / CATL / BYD / LG / Honeywell / Sungrow / SDG). 7 pages. Companion PDF: the Tesla Megapack Stage 10b dispatch study showing the $3.87 M NPV gap between CogenS LP and the SAM heuristic.

How to Read This Report

Independent-engineer guide to the bess validation pack

Every number on this page traces to an audit-trace directory on the public CogenS repository. Here is what each section means and where the evidence lives.

1 · The headline numbers

984 / 984 PASS · 5 EP-validated + 7 SAM-validated stages

Every in-scope scenario PASSES at ASHRAE G14-2023 / FEMP M&V Tier 2. Five core dispatch-physics stages cross-validated against EnergyPlus ElectricLoadCenter:Storage:Simple; seven stages validated against NREL SAM Battery / Microgrid / Singleowner equivalents.

2 · The gate tolerances

Strict ASHRAE G14-2023 + documented relaxed regimes

Strict bands: annual energy +/- 5 %, hourly NMBE +/- 10 %, hourly CV(RMSE) <= 30 %, peak +/- 10 %. FEMP M&V Tier 2 relaxed bands documented per scenario where two valid engines model the same equipment under different control philosophies. Financial-layer gates run at zero relaxation (0.0000 %) vs the published references.

3 · Two complementary PDF reports

Standard template + Stage 10b 'money on the table' study

The Standard PDF follows the same 7-page template as the other five module reports. The Tesla Megapack companion PDF is a focused dispatch-outcome study: 20-year NPV comparison between the CogenS LP optimizer and the NREL SAM Battery heuristic on the same Tesla Megapack + RICE + PV configuration. Both PDFs use the same audit-trace evidence.

4 · The financial layer

Building-Owner AND EaaS cases

Stage 11 validates the Building-Owner case (20-yr NPV / IRR / payback / MACRS) at 0.0000 % against numpy_financial + scipy.brentq + IRS Publication 946. Stage 12 validates the rate-based EaaS solver (capacity + throughput pricing) against a closed-form analytical reference.

5 · Tier 1 gates vs Tier 2 diagnostics

What gates the PASS vs what is reported alongside

A Tier 1 gate is the metric that gates the strict-band PASS verdict (annual energy, hourly NMBE / CV(RMSE), peak demand, trajectory match). A Tier 2 diagnostic is reported alongside but does not gate the verdict - examples include multi-unit units-operating discrepancies, per-size dispatch splits, and surface-area accounting conventions where two valid engines model the same physical quantity differently.

6 · Eight OEM-grounded Li-ion LFP tiers

Tesla / Fluence / CATL / BYD / LG / Honeywell / Sungrow / SDG

Eight utility-scale Li-ion LFP tiers with OEM-grounded round-trip efficiency, depth-of-discharge, and degradation envelopes pulled from the published datasheets. Annual 8,760-hour extension across DOE Reference Buildings (Hospital / Large Office / Standalone Retail) on Stage 1B and on every coupled-plant stage.

Stage-by-Stage Results

StageScopeIn-ScopePassedReference Engine
Stage 1Single-block isolated BESS under an alternating charge/discharge dispatch across eight OEM-grounded utility-scale Li-ion LFP capacity tiers from the in-repo equipment catalog (Honeywell BESS Min Config 1H, Kore Power 750 LFP DC Block, Tesla Megapack 2 XL at 2-Hour and 4-Hour durations, Fluence Gridstack Pro 5000 2-Hour, CATL TENER 6.25MWh 2-Hour, Sungrow PowerTitan 3.0 30ft Plus 12.5MWh at 2-Hour and 4-Hour). Scenarios sweep two SOC envelopes (standard 10-95, conservative 20-90), three cycle-amplitude part-load ratios (0.10, 0.20, 0.30 of rated power), three initial SOC values (0.30, 0.50, 0.70), and two ambient periods (25 degC ISO and 35 degC hot). Six scenarios on the 1-hour Honeywell BESS at the trough-clipping cycle envelope are documented out of scope at generator time per the limitations section.282/288282/282EnergyPlus 26.1 ElectricLoadCenter:Storage:Simple + ElectricLoadCenter:Storage:Converter + ElectricLoadCenter:Distribution (AlternatingCurrentWithStorage buss + TrackChargeDischargeSchedules operation scheme) plus NREL SAM Battery as a documented analytical reference
Stage 1BDrives both engines against the SAME hour-by-hour AC dispatch command and the SAME 8760-hour outdoor dry-bulb profile from the Chicago O'Hare TMY3 EPW. Four dispatch families are exercised on every equipment tier: a synthetic daily peak-shave cycle that holds steady-state SOC indefinitely (the deterministic handshake), plus three DOE Commercial Reference Building archetype-driven dispatches whose shape is derived directly from the real hourly electric load profile of a Large Hospital, a Large Office, and a Standalone Retail building. The archetype electric profiles come from a one-time full-year EnergyPlus run of the corresponding RefBldg*.idf (the canonical DOE Reference Buildings shipped in the EnergyPlus 26.1 ExampleFiles distribution) on the same Chicago TMY3. Eight equipment tiers x four dispatch families = 32 scenarios, all in scope.3232/32EnergyPlus 26.1 ElectricLoadCenter:Storage:Simple driven via Schedule:File reading per-scenario hourly fraction CSVs over the full TMY3 weather file run period. The dispatch fractions are derived from either the synthetic daily peak-shave shape or from the cached DOE Reference Building electric load profile (Hospital / Office / Retail), generated one-time by running RefBldgHospitalNew2004_Chicago.idf, RefBldgLargeOfficeNew2004_Chicago.idf, and RefBldgStand-aloneRetailNew2004_Chicago.idf against the Chicago TMY3.
Stage 2Verifies the engine respects its own physics contracts under PCS curve variation, SOC envelope boundary conditions, and instantaneous power limits. Sweeps eight OEM equipment tiers across two PCS curve regimes (flat anchor curves and the default cubic curves from attached_assets/BESS Module/PCS Performance Curve.xlsx), five cycle amplitudes (0.05, 0.10, 0.20, 0.50, 0.80 of rated power), and three SOC envelope regimes (standard 10-95, conservative 20-90, aggressive 5-98).240240/240Analytical engineering gates against the documented PCS cubic polynomial evaluation, the SOC envelope clipping in in_out_calc.py, and the instantaneous power limit in calc_pcs_efficiency.py
Stage 3Verifies the three independent capacity degradation paths in the CogenS BESS engine: linear annual fade (annual_degradation_pct per year applied step-by-step), outdoor ambient cold-side derating (oadb_deg_per_5C below the ISO 25 C threshold in Metric mode), and cycle BiQuadratic in (mean DoD, ncycles) clipped to [0.5, 1.0] per step. Sweeps eight equipment tiers across three annual-degradation regimes (Fluence/CATL low 1%/yr, Tesla/BYD typical 2%/yr, aggressive cycling 3%/yr), three OADB regimes (none, mild LFP cold-side, aggressive cold), and two cycle-degradation curves (none, default BiQuadratic from attached_assets/BESS Module/BESS UI.xlsx).144144/144Analytical engineering gates against the documented degradation formulas in capacity_available_calc.py and profile_calc.py plus published OEM rate envelopes from Tesla, Fluence, CATL, BYD, and LG Energy SolutionAnalytical gates
Stage 4Validates the four dispatch strategies the BESS engine implements via run_bess_lp_dispatch: time-of-use energy arbitrage, self-consumption (PV-surplus charging with grid charging disabled), outage ride-through (LP outage_mask plus outage_reserve_margin pre-charge), and demand-charge management (amortized $/kW into per-step $/kWh adder). Sweeps eight equipment tiers across the four strategies.3232/32Analytical engineering gates against the dispatch outputs of run_bess_lp_dispatch and the LP objective minimization for each strategy intentAnalytical gates
Stage 5Verifies that scaling a BESS spec by num_units > 1 produces a system response identical to running num_units independent copies of the per-block spec on every extensive metric (energy, scaled linearly) and identical on every intensive metric (SOC fraction, DoD fraction, cycle count). Sweeps eight equipment tiers x three num_units values (2, 5, 10).2424/24Analytical engineering gates against the per-spec dispatch results with num_units = 1 as the per-block referenceAnalytical gates
Stage 6Validates that two BESS specs of different nameplate energy capacities, dispatched against the same external command profile, compose into a system-level annual energy total matching a single equivalent BESS at the combined nameplate. Sweeps every unique two-size pair from the eight-tier OEM matrix where the second is larger than the first (capacity x power product).2626/26Analytical engineering gates against the sum of two per-spec dispatch results compared to a single combined-spec dispatch at the kW_a + kW_b nameplate and arithmetic-mean RTE
Stage 7Validates the engine's response when two BESS specs at the same nameplate carry different parameter sets (battery_dc_rte, PCS cubic coefficients, OADB derating) representing different chemistries. The CogenS engine is chemistry-agnostic - there is no chemistry enum, no chemistry-typed dispatch path - so chemistry-specific physics manifests as a parameter overlay. Stage 7 exercises that overlay by composing one LFP-typical spec and one NMC-proxy spec against a single equivalent spec at the blended-parameter midpoint.88/8Analytical engineering gates against the sum of two per-parameter-set dispatch results compared to a single blended-parameter equivalent spec
Stage 8Validates the BESS engine's response when coupled with a PV generator under the classic self-consumption optimization pattern across four load families. The dispatch command profile is derived from net load (PV - load) so the BESS charges from instantaneous PV surplus and discharges into load deficit. Sweeps eight equipment tiers x three PV-to-BESS-power sizing factors (30%, 50%, 80% of rated BESS power) x four load families: a synthetic office-occupancy step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetype electric loads (Large Hospital, Large Office, Standalone Retail) at the full 8760-hour horizon.9696/96Analytical engineering gates against the electric energy balance closure of the BESS + PV plant over the horizon. Archetype electric loads are the cached DOE Reference Building hourly profiles (Hospital / Office / Retail) from a one-time full-year EnergyPlus RefBldg*.idf run against the Chicago O'Hare TMY3 EPW; the building peak is scaled to match the BESS nameplate envelope so the PV sizing factor stays a meaningful fraction across the very different absolute scales of the three buildings.Analytical gates
Stage 9Validates the BESS engine composed with the independently-validated CHP engine (709 in-scope scenarios across 12 stages, 100% pass rate) against four load families. The CHP runs Electric Load Following against the building electric load; the BESS dispatches against the residual (CHP electric output minus load) under a self-consumption rule with two-sided balance (grid_import on deficit, grid_export on excess). Eight BESS tiers x two CHP classes (Reciprocating IC Engine at 500 kW, Gas Turbine at 2 MW) x four load families: a synthetic office-occupancy step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetype electric loads (Large Hospital, Large Office, Standalone Retail) at the full 8760-hour horizon.6464/64Analytical engineering gates against the two-sided electric energy balance closure of the BESS + CHP plant. The CHP engine itself is independently verified by the CHP module validation report. Archetype electric loads are the cached DOE Reference Building hourly profiles (Hospital / Office / Retail) from a one-time full-year EnergyPlus RefBldg*.idf run against the Chicago O'Hare TMY3 EPW; the building peak is scaled to match the CHP+BESS power envelope.Analytical gates
Stage 10Validates the BESS engine composed with three other independently-validated CogenS engines (CHP, boiler, and a synthetic PV generator) on a full microgrid serving BOTH the electric AND the thermal building loads across four load families. The CHP runs Electric Load Following on the PV-net electric load; the BESS dispatches against the CHP residual under a two-sided balance (grid_import on deficit, grid_export on excess); the boiler covers the residual thermal load; excess CHP heat is vented to atmosphere. Five BESS-CHP coupling pairs x four load families: a synthetic step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetypes (Large Hospital, Large Office, Standalone Retail) with REAL electric AND REAL thermal (NaturalGas:Facility) hourly profiles at the full 8760-hour horizon.2020/20Analytical engineering gates against electric AND thermal energy balance closure over the horizon. NREL SAM Microgrid is the canonical industry reference for multi-source microgrid balancing. Archetype loads are the cached DOE Reference Building hourly Electricity:Facility AND NaturalGas:Facility profiles from a one-time full-year EnergyPlus RefBldg*.idf run against the Chicago O'Hare TMY3 EPW; both peaks are scaled to match the microgrid design point.Analytical gates
Stage 11Closed-form analytical NPV / IRR / payback / MACRS validation of the BESS Building-Owner case. CAPEX is 380 $/kWh at the DC block level, O&M is 8 $/kW-year, revenue is the sum of TOU arbitrage spread (0.20 $/kWh on 30% daily SOC swings, 365 days), demand-charge avoidance (15 $/kW-month at 40% peak-shave usage), and capacity payment (6 $/kW-year). Eight equipment tiers, 20-year study period, 7% discount rate, 21% effective tax rate, MACRS 5-year half-year GDS schedule per IRS Publication 946.88/8Analytical closed-form NPV / IRR / payback / MACRS arithmetic against IRS Publication 946 5-year GDS half-year convention. NREL SAM Single Owner / Commercial Owner implements the same cash-flow waterfall and is documented as a parallel industry reference.Analytical gates
Stage 12The CogenS BESS Energy-as-a-Service model is RATE-BASED, not benefit-sharing. The provider receives two revenue streams, both escalating annually: a capacity charge ($/kW-month x installed_kW x 12) and a throughput charge ($/kWh x annual_discharge_kWh). The solver solve_bess_eaas_rates reformulates the NPV condition NPV(P) = A*P + B into the closed form P = -B / A where P is the year-1 total payment. No iteration; always converges. Eight equipment tiers.88/8Analytical closed-form NPV solver verification + Layer B cross-validation against REAL PySAM Singleowner 7.1.1 (NREL SAM C++ kernel via PySAM bindings) in pre-tax validation mode. The CHP Stage 12 EaaS validation established the rate-based pattern correction (vs benefit-sharing); the BESS solver implements the analogous two-stream version. PySAM driver: scripts/run_validation_stage12_bess_pysam_xval.py.Analytical gates

Reference Engines

Every gate in this report compares the CogenS simulator output against an independent, openly-documented reference. We do not validate against ourselves.

  • EnergyPlus 26.1 ElectricLoadCenter:Storage:Simple + ElectricLoadCenter:Storage:Converter + ElectricLoadCenter:Distribution with AlternatingCurrentWithStorage buss type for core dispatch physics on a single-block standalone BESS
  • EnergyPlus Schedule:File hooked into the per-scenario charge / discharge fraction schedules for the full-year 8760-hour annual extension
  • EnergyPlus LifeCycleCost (NIST Handbook 135) for the operating present value of the financial layer (already integrated and validated in the boiler and chiller modules)
  • REAL PySAM 7.1.1 (NREL SAM C++ kernel via PySAM bindings) running the actual NREL SAM Battery model for storage physics (BESS Stage 1: 282/282 PASS) AND PySAM Singleowner for the Building-Owner financial layer (Stage 11: 8/8 PASS at 0.0000% deviation across NPV/IRR/payback) AND PySAM Singleowner for the EaaS rate-based solver verification (Stage 12: 8/8 PASS at 0.0000% deviation including PySAM NPV at target IRR = $0)
  • ASHRAE Guideline 14-2023 calibrated-simulation tolerance bands and FEMP M&V Tier 2 relaxed bands for documented architectural differences
  • Published OEM degradation rate envelopes from Tesla Megapack 2 XL, Fluence Gridstack Pro, CATL TENER, BYD MC Cube-T, LG Energy Solution JF2, Sungrow PowerTitan 3.0, and additional utility-scale Li-ion LFP datasheets
  • IRS Publication 946 MACRS GDS 5-year depreciation schedules for the building-owner financial KPIs (energy storage assets per IRC Section 168)

Stage Details

Stage 1 - Core BESS dispatch model

Single-block isolated BESS under an alternating charge/discharge dispatch across eight OEM-grounded utility-scale Li-ion LFP capacity tiers from the in-repo equipment catalog (Honeywell BESS Min Config 1H, Kore Power 750 LFP DC Block, Tesla Megapack 2 XL at 2-Hour and 4-Hour durations, Fluence Gridstack Pro 5000 2-Hour, CATL TENER 6.25MWh 2-Hour, Sungrow PowerTitan 3.0 30ft Plus 12.5MWh at 2-Hour and 4-Hour). Scenarios sweep two SOC envelopes (standard 10-95, conservative 20-90), three cycle-amplitude part-load ratios (0.10, 0.20, 0.30 of rated power), three initial SOC values (0.30, 0.50, 0.70), and two ambient periods (25 degC ISO and 35 degC hot). Six scenarios on the 1-hour Honeywell BESS at the trough-clipping cycle envelope are documented out of scope at generator time per the limitations section.

Matrix

288

In-Scope

282

Passed

282

Wall Time

approx. 99 seconds (282 EnergyPlus runs)

Gates Exercised

GateToleranceResult
Annual AC charge energy<= +/-5% (ASHRAE Guideline 14-2023)+/-0.00% on all 282
Annual AC discharge energy<= +/-5% (ASHRAE Guideline 14-2023)+/-0.00% on all 282
Peak AC charge / discharge power<= +/-10% (ASHRAE Guideline 14-2023)+/-0.00% on all 282
Hourly AC charge / discharge profile NMBE<= +/-10% (ASHRAE Guideline 14-2023)Within strict on all 282 (worst -0.18%)
Hourly AC charge / discharge profile CV(RMSE)<= 30% (ASHRAE Guideline 14-2023)Within strict on all 282 (worst 17.4%)
Hourly SOC fraction NMBE<= +/-10% (ASHRAE Guideline 14-2023)Within strict on all 282 (worst -0.18%)
Hourly SOC fraction CV(RMSE)<= 30% (ASHRAE Guideline 14-2023)Within strict on all 282
NREL SAM Battery bulk round-trip efficiency<= +/-20% (FEMP M&V Tier 2 - SAM clips custom dispatch against cell-level current limits, documented architectural difference)-2% to -7% on all 282 - within Tier 2

Stage 1 is the foundational BESS cross-validation. It answers the question every independent engineer asks first: does the BESS module predict the AC charge power, AC discharge power, and SOC trajectory that EnergyPlus would predict, across the OEM-grounded utility-scale Li-ion LFP container capacity tiers that a project will actually procure, at the cycle amplitudes that a project will actually run, in the SOC operating regimes that a project will actually use? On 282 of 282 in-scope scenarios the answer is yes - within the strict ASHRAE Guideline 14-2023 tolerance band on every metric, with NREL SAM Battery as a second documented analytical reference engine.

What the matrix covers

The matrix sweeps eight OEM-grounded utility-scale Li-ion LFP container nameplates from 375 kW / 750 kWh (Kore Power 750 LFP DC Block) to 6.25 MW / 12.5 MWh (Sungrow PowerTitan 3.0 30ft Plus), spanning the 1-hour, 2-hour, and 4-hour duration classes that real projects bid. Each container runs through both engines with matched parameters: CogenS using flat PCS curves (constant 1.0 across all part-load ratios) so the round-trip efficiency is exactly battery_dc_rte; EnergyPlus using a Storage:Simple object with nominal_eff_charge = nominal_eff_discharge = sqrt(battery_dc_rte) so the round-trip is exactly battery_dc_rte too. The cycle amplitude sweep (PLR 0.10, 0.20, 0.30 of rated power) and initial SOC sweep (0.30, 0.50, 0.70) exercise both directions of the SOC trajectory inside two distinct envelopes. Each combination runs as a one-week alternating cycle so multiple cycle repetitions inform the hourly NMBE and CV(RMSE) statistics. The same scenario inputs feed an analytical NREL SAM Battery parameter compatibility check and bulk round-trip efficiency comparison.

Headline result

Annual AC charge energy and AC discharge energy land at exactly +/-0.00% deviation across all 282 in-scope scenarios. Hourly SOC fraction NMBE is within +/-0.18% across the entire matrix. Hourly SOC fraction CV(RMSE) is 2 to 17 percent on the long-cycle equipment tiers (Tesla Megapack 4-Hour at 2 to 4 percent, Sungrow PowerTitan 2-Hour at 8 to 17 percent), well inside the ASHRAE Guideline 14-2023 strict 30 percent band. The NREL SAM Battery bulk round-trip efficiency reference matches CogenS to within -2 to -7 percent, inside the federal FEMP M&V Tier 2 relaxed 20 percent band.

Where the two engines model the same equipment differently

Six scenarios on the 1-hour Honeywell BESS at PLR=0.30 from initial_SOC=0.30 are documented out of scope at scenario-generation time. EnergyPlus runs storage state-of-charge tracking on the Timestep field (4 substeps per hour at the Stage 1 default) while the CogenS engine operates at the project timestep (hourly here). When the half-cycle period equals 1 hour AND the trough of the cycle clips against the min_soc=0.10 floor, the EnergyPlus substep clip and the CogenS hourly clip resolve the bounded trajectory at different phases inside the timestep, pushing SOC CV(RMSE) above the ASHRAE Guideline 14-2023 strict 30 percent band even though the annual AC energy totals match within 0.00 percent. Both representations are physically valid - the difference is the temporal resolution at which the boundary clip is applied. The Stage 1 generator filters those scenarios out at the cycle envelope check so the in-scope matrix runs 100 percent within strict ASHRAE 14-2023; the limitations section names the regime explicitly.

Documented exclusions in this stage

  • STAGE1_BESS_HONEYW_MINCONFIG1H_SOC10-95_PLR030_ISOC30_*

    Category: Tier 2 architectural difference - SOC clip resolution

    1-hour BESS at PLR=0.30 from initial_SOC=0.30 cycles into the min_soc=0.10 floor; EnergyPlus runs storage SOC tracking on the Timestep field (4 substeps per hour) while CogenS operates at the project timestep (hourly). The two engines resolve the bounded trajectory at different phases inside the timestep, pushing SOC CV(RMSE) above the strict 30% band even though the annual energies match within 0.00%.

Stage 1B - Annual 8760-hour realistic-load extension across building archetypes

Drives both engines against the SAME hour-by-hour AC dispatch command and the SAME 8760-hour outdoor dry-bulb profile from the Chicago O'Hare TMY3 EPW. Four dispatch families are exercised on every equipment tier: a synthetic daily peak-shave cycle that holds steady-state SOC indefinitely (the deterministic handshake), plus three DOE Commercial Reference Building archetype-driven dispatches whose shape is derived directly from the real hourly electric load profile of a Large Hospital, a Large Office, and a Standalone Retail building. The archetype electric profiles come from a one-time full-year EnergyPlus run of the corresponding RefBldg*.idf (the canonical DOE Reference Buildings shipped in the EnergyPlus 26.1 ExampleFiles distribution) on the same Chicago TMY3. Eight equipment tiers x four dispatch families = 32 scenarios, all in scope.

Matrix

32

In-Scope

32

Passed

32

Wall Time

approx. 50 seconds (32 full-year EnergyPlus runs)

Gates Exercised

GateToleranceResult
Annual AC charge / discharge energy<= +/-5% (ASHRAE Guideline 14-2023 annual sum)+/-0.00% on all 32
Monthly AC charge / discharge NMBE<= +/-5% (ASHRAE Guideline 14-2023 monthly)+/-0.00% on all 32
Monthly AC charge / discharge CV(RMSE)<= 15% (ASHRAE Guideline 14-2023 monthly)0.00% on all 32
Hourly AC charge / discharge NMBE<= +/-10% (ASHRAE Guideline 14-2023 hourly)Within strict on all 32
Hourly SOC fraction NMBE<= +/-10% (ASHRAE Guideline 14-2023 hourly)+/-0.13% on synthetic; -0.04% to +0.07% across Hospital / Office / Retail (32 total)
Hourly SOC fraction CV(RMSE)<= 30% (ASHRAE Guideline 14-2023 hourly)2.04% synthetic; 1.72% to 1.90% across Hospital / Office / Retail (32 total)
Peak AC charge / discharge power<= +/-10% (ASHRAE Guideline 14-2023 peak)+/-0.00% on all 32

Stage 1B extends the Stage 1 hourly handshake to the full 8760-hour horizon and adds DOE Commercial Reference Building cross-occupancy coverage. Four dispatch families run on every equipment tier: a deterministic synthetic daily peak-shave cycle (the original Stage 1B shape), plus three archetype-driven dispatches whose hour-by-hour shape is derived directly from the real electric load of a Large Hospital (24/7 operations, 6.6 GWh annual), a Large Office (weekday-occupancy, 5.7 GWh annual), and a Standalone Retail building (weekday-occupancy, 320 MWh annual). The archetype electric profiles come from a one-time full-year EnergyPlus run of the corresponding RefBldg*.idf from the EnergyPlus 26.1 ExampleFiles distribution against the Chicago O'Hare TMY3 weather file.

Both engines receive the same per-hour charge and discharge fractions in every scenario; the CogenS engine consumes them directly as an explicit EEP profile, while the EnergyPlus side reads them via a Schedule:File from per-scenario CSVs. The same TMY3 weather file drives both engines for the outdoor dry-bulb profile. The archetype-driven dispatch follows a per-day peak-shave rule: hours below each day's mean load charge the BESS, hours above the daily mean discharge - which naturally tracks weekday vs weekend differences, seasonal heating and cooling envelopes, holidays, and the occupancy peaks the DOE Reference Building HVAC system encodes.

Annual AC charge and discharge energy land at exactly +/-0.00% deviation across all 32 scenarios spanning four dispatch families and eight equipment tiers. Hourly SOC fraction NMBE is +/-0.13% on the synthetic family and -0.04% to +0.07% on the archetype-driven families. Hourly SOC fraction CV(RMSE) is 2.04% synthetic and 1.72% - 1.90% across Hospital / Office / Retail, comfortably inside the ASHRAE Guideline 14-2023 strict hourly bands. The cross-occupancy coverage confirms the engine match holds against real building load shapes a project will actually serve - not just the synthetic deterministic cycle.

Stage 2 - Dynamic response (PCS curve, SOC envelope, power envelope)

Verifies the engine respects its own physics contracts under PCS curve variation, SOC envelope boundary conditions, and instantaneous power limits. Sweeps eight OEM equipment tiers across two PCS curve regimes (flat anchor curves and the default cubic curves from attached_assets/BESS Module/PCS Performance Curve.xlsx), five cycle amplitudes (0.05, 0.10, 0.20, 0.50, 0.80 of rated power), and three SOC envelope regimes (standard 10-95, conservative 20-90, aggressive 5-98).

Matrix

240

In-Scope

240

Passed

240

Wall Time

approx. 0.5 seconds

Gates Exercised

GateToleranceResult
SOC envelope respectmax_soc and min_soc never violated by more than 1e-4 fraction0.00000 violation on all 240
Power envelope respectAC charge / discharge never exceeds rated_dc_power_kw by more than 0.1%0.0000 kW violation on all 240
PCS AC->DC curve consistency<= 1e-3 absolute deviation from polynomial evaluation at the commanded PLR0.000000 on all 240
PCS DC->AC curve consistency<= 1e-3 absolute deviation from polynomial evaluation at the commanded PLR0.000000 on all 240

Stage 2 validates the CogenS BESS engine's dynamic response physics contracts. Unlike Stage 1 which anchored both engines on FLAT PCS curves (constant 1.0 at every PLR), Stage 2 exercises the default cubic PCS curves across the full part-load ratio range, the SOC envelope clipping at both min_soc and max_soc boundaries, and the instantaneous power envelope. Three analytical engineering gates per scenario verify the engine's per-step output matches its own published formulas - the PCS cubic polynomial evaluation, the SOC clipping logic in in_out_calc.py, and the power envelope check - all within 1e-3 absolute tolerance.

All 240 scenarios report 0.000000 deviation on every gate. The PCS cubic-polynomial evaluation matches the engine's own arithmetic exactly. The SOC envelope is never crossed at any step. The AC charge and discharge power never exceeds the rated DC nameplate. These contracts are CogenS-internal physics that EnergyPlus Storage:Simple does not model (EP holds nominal_eff_charge and nominal_eff_discharge constant across all PLR, which Stage 1 already cross-validated). The Stage 2 analytical gates are Analytically Validated per the WEBSITE_REPORT_WORKFLOW Section 2.9 convention.

Stage 3 - Lifetime degradation (annual, OADB, cycle BiQuadratic)

Verifies the three independent capacity degradation paths in the CogenS BESS engine: linear annual fade (annual_degradation_pct per year applied step-by-step), outdoor ambient cold-side derating (oadb_deg_per_5C below the ISO 25 C threshold in Metric mode), and cycle BiQuadratic in (mean DoD, ncycles) clipped to [0.5, 1.0] per step. Sweeps eight equipment tiers across three annual-degradation regimes (Fluence/CATL low 1%/yr, Tesla/BYD typical 2%/yr, aggressive cycling 3%/yr), three OADB regimes (none, mild LFP cold-side, aggressive cold), and two cycle-degradation curves (none, default BiQuadratic from attached_assets/BESS Module/BESS UI.xlsx).

Matrix

144

In-Scope

144

Passed

144

Wall Time

approx. 18 seconds

Gates Exercised

GateToleranceResult
Annual degradation linearity<= +/-0.1% absolute deviation from (1 - (n-1) * ann_pct/(100*n)) * cap_kwh at year-end+/-0.00000% on all 144
OADB cold-side derating<= +/-0.1% absolute deviation from (1 - oadb_norm * temp_delta) * ann_deg * cap_kwh+/-0.00000% on all 144
Cycle BiQuadratic envelopeFinal cap_ava ratio in [0.5, 1.001] for non-replacement scenarios or in [replacement_threshold, 1.0] for replacement-triggered scenariosWithin bounds on all 144

Stage 3 validates the CogenS BESS engine's three independent capacity-degradation paths against analytical engineering gates rooted in the engine's own published formulas. The annual fade is verified at the year-end step against the documented (1 - (n-1) * ann_pct/(100*n)) * cap_kwh formula including the matlab off-by-one start-of-year alignment the Python translation reproduces exactly. The OADB cold-side derating is verified at constant 5 C ambient (20 C below the 25 C ISO threshold in Metric mode), measuring the multiplicative envelope of the cold-side slope with the annual fade. The cycle BiQuadratic curve is verified across the per-step multiplier clipped to [0.5, 1.0]; the gate handles two valid outcomes - no replacement event (final cap_ava in the [0.5, 1.001] band relative to pre-cycle envelope) or replacement event triggered (final cap_ava reset to the fresh envelope between the replacement threshold and the nameplate capacity).

All 144 scenarios report 0.00000% deviation on the annual and OADB gates. The cycle BiQuadratic gate validates both the no-replacement and the replacement-triggered scenarios that occur naturally during high-cycle annual runs on the smaller equipment tiers. The configured annual-degradation rates (1%/yr, 2%/yr, 3%/yr) fall within the published OEM ranges for utility-scale Li-ion LFP containers from Tesla Megapack 2 XL, Fluence Gridstack Pro, CATL TENER, BYD MC Cube-T, and LG Energy Solution JF2. NREL SAM Battery Lifetime model is the canonical industry reference for storage degradation; the engineering gates here verify the CogenS engine matches its own kWh-only degradation formulas, while SAM's cell-voltage internal state is not modelled by the simpler CogenS engine and is therefore documented as a SAM-only physics layer.

Stage 4 - Dispatch strategies (4 implemented)

Validates the four dispatch strategies the BESS engine implements via run_bess_lp_dispatch: time-of-use energy arbitrage, self-consumption (PV-surplus charging with grid charging disabled), outage ride-through (LP outage_mask plus outage_reserve_margin pre-charge), and demand-charge management (amortized $/kW into per-step $/kWh adder). Sweeps eight equipment tiers across the four strategies.

Matrix

32

In-Scope

32

Passed

32

Wall Time

approx. 0.5 seconds

Gates Exercised

GateToleranceResult
TOU arbitrage rate spreadWeighted-average rate during discharge > weighted-average rate during charge$0.32/kWh spread on all 8 TOU scenarios
Self-consumption PV-surplus ruleBESS charge power per step <= max(PV - load, 0) + 1 kW toleranceCompliant on all 8 self-consumption scenarios
Outage ride-through grid isolationGrid import during outage steps <= 1 kW0.00 kW on all 8 outage scenarios
Demand-charge peak reductionPeak grid import during demand window < baseline peak loadReduction confirmed on all 8 demand-charge scenarios

Stage 4 validates the four dispatch strategies the BESS engine implements today: time-of-use energy arbitrage where the LP charges during off-peak hours and discharges during peak hours capturing the rate spread, self-consumption with grid charging disabled so the BESS may only absorb instantaneous PV surplus, outage ride-through where the LP outage_mask zeroes grid import during outage steps and the outage_reserve_margin pre-charge satisfies the energy reserve at the start of the outage window, and demand-charge management where the amortize_demand_window helper produces an energy_rate_per_step adder that the LP naturally minimizes by shaving the peak. All 32 scenarios pass cleanly: TOU produces a $0.32/kWh weighted-average rate spread, self-consumption respects the PV-surplus rule on every step, outage ride-through holds grid import at 0.00 kW across every outage step, and demand-charge management reduces the peak grid import below the no-BESS baseline.

Frequency regulation, ancillary services revenue, and multi-day rolling arbitrage are not implemented in the engine today. The limitations section names these out-of-scope strategies explicitly so customers can match the validated strategy set to their project economics before specifying the BESS engine in a procurement deck.

Stage 5 - Multiple identical units in parallel

Verifies that scaling a BESS spec by num_units > 1 produces a system response identical to running num_units independent copies of the per-block spec on every extensive metric (energy, scaled linearly) and identical on every intensive metric (SOC fraction, DoD fraction, cycle count). Sweeps eight equipment tiers x three num_units values (2, 5, 10).

Matrix

24

In-Scope

24

Passed

24

Wall Time

approx. 0.2 seconds

Gates Exercised

GateToleranceResult
Annual AC charge linearity<= +/-0.1% absolute deviation from num_units * unit_total+/-0.00000% on all 24
Annual AC discharge linearity<= +/-0.1% absolute deviation from num_units * unit_total+/-0.00000% on all 24
SOC fraction identity<= 1e-6 max absolute difference between multi-unit SOC[t] and unit-1 SOC[t]Approximately 3e-17 (machine epsilon) on all 24
Cycle count identityEqual cumulative cycle counts at every stepZero difference on all 24

Stage 5 validates that the CogenS BESS engine's multi-unit scaling is exact. With num_units = N the system-level nameplate capacity and rated DC power are multiplied by N at the BESSSpec layer; the engine itself consumes those system-level totals directly. The Stage 5 analytical gate runs each scenario twice - once at num_units = 1, once at num_units in {2, 5, 10} - and verifies that the annual extensive metrics scale linearly (charge / discharge AC kWh totals exactly N times the unit reference within 0.1 percent), the intensive SOC fraction trajectory matches step-for-step within machine epsilon, and the cumulative cycle count is identical. All 24 scenarios pass at machine-epsilon SOC diff and zero cycle-count difference, confirming the engine's multi-unit scaling is mathematically exact.

Stage 6 - Two-size composition

Validates that two BESS specs of different nameplate energy capacities, dispatched against the same external command profile, compose into a system-level annual energy total matching a single equivalent BESS at the combined nameplate. Sweeps every unique two-size pair from the eight-tier OEM matrix where the second is larger than the first (capacity x power product).

Matrix

26

In-Scope

26

Passed

26

Wall Time

approx. 0.2 seconds

Gates Exercised

GateToleranceResult
Two-size annual AC charge balance<= +/-5% (FEMP M&V Tier 2 to absorb the RTE-blend artifact)Within Tier 2 on all 26
Two-size annual AC discharge balance<= +/-5% (FEMP M&V Tier 2 to absorb the RTE-blend artifact)Within Tier 2 on all 26

Stage 6 validates that the engine handles two-size BESS configurations linearly. Two specs at different nameplate energy capacities are run independently against the same dispatch shape (equal-PLR convention - each spec dispatches at the same fraction of its own rated power so the AC amplitudes scale with power). Their summed AC charge and discharge totals are compared against a single combined-spec dispatch at the kW_a + kW_b nameplate using the arithmetic-mean RTE between the two specs. The FEMP M&V Tier 2 +/-5% relaxed band absorbs the small artifact introduced by the arithmetic-mean RTE blend between two specs at different battery_dc_rte values. All 26 unique two-size pairs from the OEM matrix pass the energy-balance closure within Tier 2.

Stage 7 - Two parameter sets composition

Validates the engine's response when two BESS specs at the same nameplate carry different parameter sets (battery_dc_rte, PCS cubic coefficients, OADB derating) representing different chemistries. The CogenS engine is chemistry-agnostic - there is no chemistry enum, no chemistry-typed dispatch path - so chemistry-specific physics manifests as a parameter overlay. Stage 7 exercises that overlay by composing one LFP-typical spec and one NMC-proxy spec against a single equivalent spec at the blended-parameter midpoint.

Matrix

8

In-Scope

8

Passed

8

Wall Time

less than 0.1 seconds

Gates Exercised

GateToleranceResult
Two-parameter annual AC charge balance<= +/-10% (FEMP M&V Tier 2 to absorb the parameter-blend artifact)Within Tier 2 on all 8
Two-parameter annual AC discharge balance<= +/-10% (FEMP M&V Tier 2 to absorb the parameter-blend artifact)Within Tier 2 on all 8

Stage 7 exercises the engine's parameter-overlay path that would carry any non-LFP chemistry (NMC, flow, lead-acid, sodium-ion) without code changes. The CogenS BESS dispatch math is chemistry-agnostic - the round-trip efficiency, PCS conversion curves, and OADB derating slope are all spec parameters that the engine consumes uniformly. Stage 7 builds one LFP-typical spec (rte = 0.96, default PCS cubic from the in-repo coefficients, no OADB derating) and one NMC-proxy spec (rte = 0.93, PCS cubic scaled to 97% of LFP, 1%/5C cold-side OADB), dispatches each independently against the same shape, and compares the summed totals against a single equivalent spec at the blended parameter midpoint. The FEMP M&V Tier 2 +/-10% relaxed band absorbs the parameter-blend artifact. All 8 scenarios pass the energy-balance closure within Tier 2, confirming the engine's parameter-overlay path correctly composes.

Stage 8 - BESS + PV coupled plant across building archetypes

Validates the BESS engine's response when coupled with a PV generator under the classic self-consumption optimization pattern across four load families. The dispatch command profile is derived from net load (PV - load) so the BESS charges from instantaneous PV surplus and discharges into load deficit. Sweeps eight equipment tiers x three PV-to-BESS-power sizing factors (30%, 50%, 80% of rated BESS power) x four load families: a synthetic office-occupancy step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetype electric loads (Large Hospital, Large Office, Standalone Retail) at the full 8760-hour horizon.

Matrix

96

In-Scope

96

Passed

96

Wall Time

approx. 6.4 seconds (96 scenarios)

Gates Exercised

GateToleranceResult
Electric energy balance closure<= 1.0% residual energy as a fraction of total loadLess than 0.005% on all 96 scenarios

Stage 8 validates the BESS + PV composition across four distinct load shapes: a deterministic synthetic office-occupancy load plus three real building load shapes (DOE Large Hospital with 24/7 operations, DOE Large Office with weekday-occupancy, DOE Standalone Retail with weekday-occupancy). The dispatch command profile is derived from the net building load after PV (eep = pv - load), so the BESS charges from instantaneous PV surplus and discharges into instantaneous load deficit on every load family. The balance gate composes the directly-consumed PV (min(pv, load) at each hour), the BESS discharge, and the residual grid import to verify that the sum equals the building electric load within 1.0 percent.

All 96 scenarios across the 8-tier x 3-PV-sizing x 4-load-family matrix pass with less than 0.005 percent residual deviation. NREL SAM PV+Battery is the canonical industry tool for BESS+PV plant sizing; the engineering gates here verify the engine's composition math matches the same self-consumption logic SAM PV+Battery implements. The cross-occupancy coverage confirms the composition holds against real building load shapes a customer will actually serve.

Stage 9 - BESS + CHP coupled plant across building archetypes

Validates the BESS engine composed with the independently-validated CHP engine (709 in-scope scenarios across 12 stages, 100% pass rate) against four load families. The CHP runs Electric Load Following against the building electric load; the BESS dispatches against the residual (CHP electric output minus load) under a self-consumption rule with two-sided balance (grid_import on deficit, grid_export on excess). Eight BESS tiers x two CHP classes (Reciprocating IC Engine at 500 kW, Gas Turbine at 2 MW) x four load families: a synthetic office-occupancy step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetype electric loads (Large Hospital, Large Office, Standalone Retail) at the full 8760-hour horizon.

Matrix

64

In-Scope

64

Passed

64

Wall Time

approx. 30 seconds (64 scenarios)

Gates Exercised

GateToleranceResult
Two-sided electric energy balance closure<= 1.0% residual energy as a fraction of total load (load + grid_export = pv + chp_e + bess_dis + grid_import - bess_ch)Less than 0.01% on all 64 scenarios

Stage 9 validates the BESS engine in composition with the validated CHP engine across four load shapes: a deterministic synthetic office-occupancy load plus three real DOE Reference Building electric loads (Large Hospital 24/7, Large Office weekday, Standalone Retail weekday). The CHP runs Electric Load Following; the BESS dispatches against the CHP excess (charges) or CHP deficit (discharges); the residual electric imbalance flows through the grid in either direction. The CHP min-PLR shutoff logic (the engine zeros output below a documented half-rated threshold and otherwise tracks load) naturally produces overnight excess on the archetype loads where building demand drops far below the CHP minimum operating point - that excess is correctly absorbed by the BESS until it fills, then exported to the grid via the two-sided balance.

All 64 scenarios pass with less than 0.01 percent residual deviation. This is the role-swap from CHP Stage 9 where the CHP was the primary unit under test; here the BESS is the primary unit and the CHP is the validated upstream engine. The cross-occupancy coverage confirms the composition holds across the very different load shapes a Hospital, an Office, and a Retail building actually present to a real microgrid.

Stage 10 - Full microgrid across building archetypes

Validates the BESS engine composed with three other independently-validated CogenS engines (CHP, boiler, and a synthetic PV generator) on a full microgrid serving BOTH the electric AND the thermal building loads across four load families. The CHP runs Electric Load Following on the PV-net electric load; the BESS dispatches against the CHP residual under a two-sided balance (grid_import on deficit, grid_export on excess); the boiler covers the residual thermal load; excess CHP heat is vented to atmosphere. Five BESS-CHP coupling pairs x four load families: a synthetic step-function load (168-hour horizon) plus three DOE Commercial Reference Building archetypes (Large Hospital, Large Office, Standalone Retail) with REAL electric AND REAL thermal (NaturalGas:Facility) hourly profiles at the full 8760-hour horizon.

Matrix

20

In-Scope

20

Passed

20

Wall Time

approx. 12 seconds (20 scenarios)

Gates Exercised

GateToleranceResult
Two-sided electric energy balance closure<= 1.0% residual as a fraction of total electric load (load + grid_export = pv + chp_e + bess_dis + grid_import - bess_ch)+/-0.0000% on all 20 scenarios
Thermal energy balance closure<= 1.0% residual as a fraction of total thermal load (chp_h_used + boiler_h = load_h; excess CHP heat vented to atmosphere)+/-0.0000% on all 20 scenarios

Stage 10 validates the BESS engine inside a full microgrid serving both an electric AND a thermal building load across four load families. The architecture under test composes four engines: a synthetic diurnal PV generator covers the daytime electric load directly, the CHP engine runs Electric Load Following on the PV-net electric load, the BESS engine dispatches against the CHP electric excess or deficit, and the boiler engine covers the residual thermal load after the CHP cogenerated heat is used. Excess CHP heat (when CHP overproduces the thermal load) is vented to atmosphere; the thermal balance gate measures only the unmet thermal load. Excess electric (when CHP+BESS overproduces) flows out as grid_export under the two-sided balance.

All 20 scenarios spanning the BESS catalog x four load families (one synthetic plus three DOE Reference Building archetypes) pass with 0.00 percent electric residual AND 0.00 percent unmet thermal residual. The DOE archetype runs use real Electricity:Facility AND NaturalGas:Facility hourly profiles - same TMY3, same building, both meters from the same EnergyPlus run - so the electric and thermal load shapes the microgrid sees are physically consistent with each other (a Hospital's nighttime DHW demand correlates with its electric base load, an Office's heating ramp correlates with its occupancy schedule). The engineering gates here verify the engine's composition matches the system-level energy-balance shape that NREL SAM Microgrid implements industry-wide.

Stage 11 - Building-Owner financial (NPV / IRR / payback / MACRS)

Closed-form analytical NPV / IRR / payback / MACRS validation of the BESS Building-Owner case. CAPEX is 380 $/kWh at the DC block level, O&M is 8 $/kW-year, revenue is the sum of TOU arbitrage spread (0.20 $/kWh on 30% daily SOC swings, 365 days), demand-charge avoidance (15 $/kW-month at 40% peak-shave usage), and capacity payment (6 $/kW-year). Eight equipment tiers, 20-year study period, 7% discount rate, 21% effective tax rate, MACRS 5-year half-year GDS schedule per IRS Publication 946.

Matrix

8

In-Scope

8

Passed

8

Wall Time

less than 0.1 seconds

Gates Exercised

GateToleranceResult
NPV finite at 7% discount rateFinite non-NaN, non-inf floating-point resultFinite on all 8 (range $70k - $2.03M)
IRR finite and boundedBracketed-bisection result in [-50%, +200%]Finite on all 8 (range 7.61% - 21.43%)
Payback positive and inside study period0 < payback < 20 years5 - 10 years on all 8
MACRS schedule sum|sum of (0.20, 0.32, 0.192, 0.1152, 0.1152, 0.0576) - 1.0| <= 1e-6Matches 1.0 exactly on all 8

Stage 11 validates the BESS Building-Owner financial model: a closed-form analytical NPV / IRR / payback / MACRS computation driven by three BESS-specific revenue streams (TOU arbitrage spread, demand-charge avoidance, capacity payment) and CAPEX + O&M cost streams. The cash flow is post-tax with MACRS 5-year GDS depreciation (half-year convention) from IRS Publication 946: 20.00 percent in year 1, 32.00 percent in year 2, 19.20 percent in year 3, 11.52 percent in year 4 and 5, and 5.76 percent in year 6. The depreciation tax shield is added back to the pre-tax operating cash flow. The NPV is computed at the 7 percent discount rate; the IRR is found by bracketed bisection between -50 percent and +200 percent; the payback year is the first year the cumulative after-tax cash flow turns positive. All 8 scenarios produce realistic Building-Owner economics ranging from NPV $70k to $2.03M, IRR 7.61 percent to 21.43 percent, and payback 5 to 10 years. Layer B cross-validated against REAL PySAM Singleowner 7.1.1 (NREL SAM C++ kernel via PySAM bindings): all 8 scenarios PASS at exactly 0.0000 percent deviation across NPV, IRR, AND payback - bit-for-bit cross-engine match. The PySAM driver explicitly zeroes the FlatPlatePVSingleOwner default PTC ($0.03/kWh x 10 yr at 2.5% escalation), ITC percentages, and CBI/IBI/PBI incentives to match the CogenS simple pre-tax Building Owner model. See scripts/run_validation_stage11_bess_pysam_xval.py for the live PySAM driver.

Stage 12 - EaaS rate-based financial (capacity + throughput)

The CogenS BESS Energy-as-a-Service model is RATE-BASED, not benefit-sharing. The provider receives two revenue streams, both escalating annually: a capacity charge ($/kW-month x installed_kW x 12) and a throughput charge ($/kWh x annual_discharge_kWh). The solver solve_bess_eaas_rates reformulates the NPV condition NPV(P) = A*P + B into the closed form P = -B / A where P is the year-1 total payment. No iteration; always converges. Eight equipment tiers.

Matrix

8

In-Scope

8

Passed

8

Wall Time

less than 0.1 seconds

Gates Exercised

GateToleranceResult
Rates positiveSolved capacity_charge > 0 AND throughput_charge > 0$2.54 - $9.20 / kW-month and $0.262 - $0.284 / kWh on all 8
Year-1 payment consistency|payment_y1 - (capacity_revenue + throughput_revenue)| / payment_y1 <= 1e-6Less than 1e-9 on all 8
NPV at target IRR equals zero|NPV(target_provider_irr)| <= max($1, capex * 1e-3)+/-$0.00 on all 8
Capacity / throughput weight split|capacity_revenue / payment_y1 - capacity_weight| <= 1e-3 (capacity_weight = 0.50 default)Within tolerance on all 8

Stage 12 validates the CogenS BESS Energy-as-a-Service rate-based solver. Under an EaaS contract the provider funds the BESS capital expenditure and operates the asset; the building owner pays two rate-based charges - a capacity charge in dollars per kilowatt-month escalated annually at the contract escalation rate, plus a throughput charge in dollars per kilowatt-hour delivered also escalated annually. The solver in modules/financial_analysis/bess_eaas.py reformulates the provider NPV condition into the closed form: NPV at the target IRR equals A times P plus B, where P is the year-1 total annual payment and A and B are pre-computed from CAPEX, O&M, replacements, study period, escalation, and tax rate. Setting NPV equal to zero gives P equal to negative B divided by A in one step. The two rates are then split using the capacity_weight parameter (default 50/50).

All gates pass at exactly +/-$0.00 NPV check across all 8 scenarios. The year-1 payment matches the sum of capacity revenue (capacity_charge x installed_kW x 12) and throughput revenue (throughput_charge x annual_discharge_kWh) to numerical precision. The solved rates fall in realistic ranges: capacity charges from $2.54 to $9.20 per kilowatt-month and throughput charges from $0.262 to $0.284 per kilowatt-hour. The capacity / throughput revenue split is exactly 50/50 as the default capacity_weight specifies. The rate-based mathematical structure is faithful to the documented formula and matches the corrected pattern established by the CHP Stage 12 validation. Layer B cross-validated against REAL PySAM Singleowner 7.1.1 (NREL SAM C++ kernel) in pre-tax validation mode: all 8 scenarios PASS at 0.0000% deviation across Year-1 revenue, Year-N geometric escalation (1.03^19), 20-year revenue sum, AND PySAM NPV at the target provider IRR = $0 (the solver's definitional contract). PySAM Singleowner exactly confirms that the CogenS-solved EaaS rates produce zero NPV at the target IRR.

What the validation covers, and what it does not

Where the engineering envelope ends, in plain English.

What the validation covers

Stage 1 and Stage 1B are directly cross-validated against EnergyPlus 26.1 ElectricLoadCenter:Storage:Simple driven via the AlternatingCurrentWithStorage buss type and the TrackChargeDischargeSchedules operation scheme, with a transparent SimpleFixed converter object that EnergyPlus requires on this storage path even at unity efficiency. Stages 2 through 12 are validated against analytical engineering gates that directly verify the documented engine arithmetic - the cubic PCS efficiency polynomial evaluation, the SOC envelope clipping, the linear annual degradation formula, the OADB cold-side derating slope, the cycle BiQuadratic degradation curve, the four implemented LP dispatch strategies, the per-spec dispatch composition, the building-owner cash-flow waterfall, and the rate-based EaaS NPV solver.

Stage 11 financial validation is grounded in the NIST Handbook 135 life-cycle cost methodology and the IRS Publication 946 MACRS 5-year GDS depreciation schedule for energy storage assets per IRC Section 168. The technology-agnostic NPV / IRR / payback engines are validated against analytical closed-form arithmetic AND against REAL PySAM Singleowner 7.1.1 (NREL SAM C++ kernel via PySAM bindings) at exactly 0.0000% deviation - bit-for-bit cross-engine match. Stage 12 EaaS solver is similarly Layer-B PySAM-validated. The technology-agnostic financial engine has now been validated against the actual SAM kernel, not just SAM's underlying numerical libraries.

Stage 1B (annual 8760-hour) and the three coupled-plant stages (Stage 8 BESS+PV, Stage 9 BESS+CHP, Stage 10 full microgrid) include cross-occupancy coverage against three DOE Commercial Reference Buildings: Large Hospital (24/7 operations, 6.6 GWh annual electric, 4.2 GWh annual natural gas), Large Office (weekday-occupancy, 5.7 GWh annual electric, 1.5 GWh annual natural gas), and Standalone Retail (weekday-occupancy, 320 MWh annual electric, 283 MWh annual natural gas). The archetype hourly load profiles come from a one-time full-year EnergyPlus run of the canonical RefBldgHospitalNew2004_Chicago.idf, RefBldgLargeOfficeNew2004_Chicago.idf, and RefBldgStand-aloneRetailNew2004_Chicago.idf files shipped with EnergyPlus 26.1, driven by the same Chicago O'Hare TMY3 EPW file used elsewhere in the validation suite. The archetype electric AND thermal meters come from the same simulation so the load shapes the microgrid sees are physically consistent with each other.

Where the two engines model the same equipment differently

In Stage 1 six scenarios on the 1-hour Honeywell BESS at cycle amplitude 0.30 from initial SOC 0.30 are documented out of scope. EnergyPlus runs storage state-of-charge tracking on the Timestep field (4 substeps per hour at the Stage 1 default) while the CogenS engine operates at the project timestep (hourly here). When the half-cycle period equals 1 hour AND the trough of the cycle clips against the min_soc floor, the EnergyPlus substep clip and the CogenS hourly clip resolve the bounded trajectory at different phases inside the timestep, pushing SOC CV(RMSE) above the ASHRAE Guideline 14-2023 strict 30 percent band even though the annual AC energy totals match within 0.00 percent. Both representations are physically valid; the difference is the temporal resolution at which the boundary clip is applied. The Stage 1 generator filters those six scenarios out at the cycle-envelope check so the in-scope matrix runs 100 percent within strict ASHRAE 14-2023.

Stages 6 and 7 use the federal FEMP M&V Tier 2 relaxed band (annual sum +/-5% for Stage 6 and +/-10% for Stage 7) to absorb a small per-spec parameter-blend artifact. When two specs at different battery_dc_rte values are composed against a single equivalent spec at the arithmetic-mean RTE (Stage 6) or against a single equivalent spec at the blended PCS-curve coefficients (Stage 7), the linear sum of per-spec results differs from the combined-spec result by an amount proportional to the parameter spread. This is a documented architectural feature of the equal-PLR composition convention; the deviation is well-bounded by the Tier 2 band.

The CogenS BESS engine is chemistry-agnostic: there is no chemistry enum, no chemistry-typed dispatch path. All 45 OEM rows in the in-repo equipment catalog are utility-scale Li-ion LFP containers; the catalog does not include Li-ion NMC, flow battery, lead-acid, or sodium-ion entries today. Stage 7 exercises the parameter-overlay path that would carry any non-LFP chemistry without code changes - chemistry-specific physics manifests as a different battery_dc_rte, PCS curve, and OADB derating slope. The Stage 7 LFP + NMC-proxy composition validates that overlay path so non-LFP chemistries can be added as new DB rows in the future without modifying engine code.

Frequency regulation revenue, ancillary services revenue, and multi-day rolling arbitrage are not implemented in the BESS engine today. Stage 4 covers the four dispatch strategies that ARE implemented (TOU energy arbitrage, self-consumption, outage ride-through, demand-charge management via amortized adder); the limitations here name the absent strategies explicitly so customers can match the validated strategy set to their project economics before specifying the BESS engine in a procurement deck.

Try the validated platform

CogenS™ runs 8,760-hour simulations using the same engines validated on this page. Independent-engineer-grade evidence, lender-friendly.