Ecosizing is an intelligent microgrid planning and operation simulation platform that helps energy engineers and project developers design optimal renewable energy systems with maximum economic returns over their entire lifecycle.
Ecosizing solves the complex challenge of determining the optimal configuration of microgrid components—including PV system and battery energy storage system under Design Mode . It answers critical questions such as: What equipment should be installed? How much capacity is needed? What operational strategy maximizes profitability while ensuring reliable power supply?
Additionally, Ecosizing offers an Operation Mode that evaluates the economic performance of a predefined capacity configuration. This mode is valuable when you already have a specific equipment layout in mind—whether from preliminary studies, vendor proposals, or existing installations—and need to assess its financial viability, compare different design alternatives, or validate third-party recommendations before committing to investment.
Design Optimization:
Operation Simulation:
Financial Analysis:
Design Report: (coming soon)
Unlike heuristic or simulation-based tools, Ecosizing uses proven mathematical optimization solvers (CBC, Gurobi) to find provably optimal solutions. The MILP formulation ensures that results are unique, optimal, and interpretable—not dependent on random initial conditions or approximation algorithms. This mathematical rigor provides confidence that the recommended design truly maximizes economic value under the given constraints.
Ecosizing is designed for energy consultants, project developers, utilities, and research institutions seeking rigorous, data-driven microgrid design solutions.
Project Configuration, select Run Mode (Design Mode: optimize equipment capacity; Operation Mode: evaluate given capacity) and Scenario.Finance Parameters (Loan, Tax).Components (PV System-AC, PV System-DC, BESS, Grid).Load (load profile).Genset (if applicable).Results: investment scheme, operation policy, KPIs, cash flow, design reports.Ecosizing provides a secure authentication system with user registration, login, email verification, and password recovery. Session management ensures your work is preserved during long optimization runs.
Username: required.Email: required; used for verification.Full Name: optional.Password and Confirm Password: required; show/hide toggle available.Security Question and Answer: optional but recommended for account recovery.
www.ecosizing.com/en/auth/login or click "Sign In" from the homepage.Email or Username: Enter your registered email address or username.Password: Your account password (show/hide toggle available).Remember Me: Optional checkbox to keep you signed in across browser sessions.After signing in, click + New Plan to new an optimization job, you can set up this project using one of two methods:
Method 1: Import JSON Configuration (Quick Start)
Download Examples in the left sidebar to download JSON file for you explore.Import Config in the left sidebar to import pre-configured JSON file.Start Simulation to start the optimization once satisfied with the configuration.project, finance, inverter, pv, battery, grid, genset, load.included is true, its required fields must be present (see Section 4.3).time_resolution. Valid lengths are 8760/8784 for 60-minute steps, 17520/17568 for 30-minute steps, and 35040/35136 for 15-minute steps.Method 2: Manual Configuration (Step-by-Step)
Start Simulation when all required fields are complete.Switching Between Methods:
Export Config in the left sidebar. This saves your setup locally and allows you to:
Project NameRun Mode: Design Mode or Operation Mode
Scenario: Choose the system topology that matches your project. Six scenarios are supported:
Battery + Grid (battery-grid): Grid-connected battery storage only, no PV. Useful for pure arbitrage, peak-shaving, or demand management using grid electricity. Requires: Battery, Grid, Load.PV + Battery (Constant Power) (pv-battery-constant-power): Off-grid system with PV and battery, optimized to deliver a constant-power supply profile. Suitable for remote sites with flat power demand. Requires: PV, Inverter, Battery, Load.PV + Battery + Grid (pv-battery-grid): Grid-connected solar+storage system. Revenue comes from self-consumption, TOU arbitrage, feed-in tariffs, and demand charge avoidance. Requires: PV, Inverter, Battery, Grid, Load.PV + Battery + Genset (pv-battery-genset): Off-grid microgrid with solar, storage, and diesel/gas backup. The optimizer minimizes fuel cost while maintaining supply reliability. Requires: PV, Inverter, Battery, Genset, Load.Currency: CNY, USD, or EURTime Resolution: simulation step length. Options are 60 minutes (hourly), 30 minutes, or 15 minutes. It determines the required length of full-year time-series inputs and the time granularity of operation-plan charts and exported dispatch data.Longitude: between -180 and 180 (Eastern Longitude is positive, Western Longitude is negative)Latitude: between -90 and 90 (Northern hemisphere is positive, Southern hemisphere is negative)Altitude: between -500 and 9000 (meters)Project field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Project Name | project.project_name |
— | free text | always | Human-readable project identifier used in reports and exports. |
| Run Mode | project.run_mode |
enum | design | operation |
always | design optimizes capacities then simulates; operation simulates only using given capacities. |
| Scenario | project.scenario |
enum | one of the six scenario ids | always | Selects the system topology and drives which components are required. |
| Currency | project.currency |
enum | CNY | USD | EUR |
always | All monetary values in the config and reports use this currency. |
| Time Resolution | project.time_resolution |
minutes | 15 | 30 | 60 (default 60) |
always | Simulation step length. Full-year time-series lengths: 35040/35136, 17520/17568, or 8760/8784 points. Grid fields (purchase price, grid connect, TOU demand) accept coarser input and are auto-expanded. |
| Longitude | project.longitude |
deg | -180 – 180 | always | East positive, West negative. Drives PV auto-generation and weather-based modeling. |
| Latitude | project.latitude |
deg | -90 – 90 | always | North positive, South negative. Also used as the default PV tilt when auto-generating. |
| Altitude | project.altitude |
m | -500 – 9000 | always | Site elevation above sea level; used in PV resource modeling. |
Project Life: ≥10 (years). The total project lifecycle over which the economic analysis is performed.Capital Investment: default no limit (leave empty), if applicable, input number > 0. Maximum total capital expenditure (CAPEX) budget including equity and loan. The optimizer will not exceed this budget.Investment Mode:
Self-Invest: Evaluates economic performance from the perspective of electricity consumers. The investor is the electricity consumer who pays for equipment and benefits from reduced electricity bills.PPA: Evaluates economic performance from the perspective of a capital investor. The investor builds and owns the system, then sells electricity to the end user under a Power Purchase Agreement (PPA).Expected Annual ROI: 5-100 (%), default 10%. The expected annual return on investment, used as a reference benchmark for project profitability assessment.Construction Rate: 0-100 (%), default 10%. The ratio of civil construction and installation cost to total equipment cost. This is added on top of equipment CAPEX.Discount Rate: 0-100 (%), the WACC (Weighted Average Cost of Capital) or required rate of return, used to discount future cash flows to present value.Insurance Rate: 0-1 (%), annual insurance fee as a percentage of total CAPEX. Applied each year as an OPEX item.Depreciation Period: 0-30 (years), the accounting period over which the asset cost is written down for tax purposes. If left empty, defaults to the project life.Salvage Ratio: 0-20 (%), the estimated residual value of assets at end of project life, expressed as a percentage of original CAPEX. This is recovered as income in the final year.Tax Settings
Income Tax Rate: 0-100 (%), corporate income tax rate applied to taxable profit each year.Equipment VAT Rate: 0-100 (%), Value Added Tax percentage applied to equipment purchases. Input VAT on equipment can be deducted.Service VAT Rate: 0-100 (%), VAT percentage applied to installation, fuel and service costs.Surtax Rate: 0-100 (%), default 0. Surcharges (e.g., urban construction tax, education surcharge) levied as a percentage of the VAT payable.Stamp Duty and Fund Rate: 0-100 (%), default 0. Taxes calculated as a percentage of revenue (excluding VAT), such as stamp duty or water conservancy fund.Loan Settings (default not included; click the toggle to include if project uses debt financing)
Loan Ratio: 0-100 (%), ratio of loan amount to total CAPEX.Loan Interest Rate: ≥0 (%), annual nominal interest rate on the loan.Loan Period: 1 – project life (years), total repayment term.Repayment Type:
Land Settings (default not included; click the toggle to include if land cost applies)
Land Cost per Unit: total land acquisition cost (>0, in selected currency).Land Area: area of land (>0).Area Unit: sqm (square meters), mu (Chinese land unit, 1 mu ≈ 667 m²), or acre.Finance field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Project Life | finance.project_life |
years | 10 – 30 | always | Number of years over which lifecycle cash flows are computed. |
| Capital | finance.capital |
currency | number > 0 or no limit | always (defaults no limit) | Maximum CAPEX budget. Leave empty for no limit |
| Invest Mode | finance.invest_mode |
enum | self_invest | ppa |
always | Determines revenue calculation. |
| Expected Annual ROI | finance.expected_annual_roi |
% | 5 – 100 (default 10) | optional | Expected annual return on investment benchmark. |
| Construction Rate | finance.construction_rate |
% | 0 – 100 (default 10) | always | Civil + installation cost multiplier on equipment CAPEX. |
| Discount Rate | finance.discount_rate |
% | 0 – 100 | always | Applied to every future cash flow to obtain present value. |
| Insurance Rate | finance.insurance_rate |
% | 0 – 1 | always | Annual insurance premium as % of CAPEX. |
| Depreciation Period | finance.depreciation_period |
years | 1 – project_life | optional | If empty, defaults to project life. |
| Salvage Ratio | finance.salvage_ratio |
% | 0 – 20 | always | Residual asset value (% of CAPEX) recovered in the final year. |
| Tax Included | finance.tax.included |
bool | true / false | always | Toggles the whole tax block. |
| Income Tax Rate | finance.tax.income_tax_rate |
% | 0 – 100 | if tax.included |
Corporate income tax. |
| Equip VAT Rate | finance.tax.equip_vat_rate |
% | 0 – 100 | if tax.included |
VAT on equipment; deductible as input VAT. |
| Service VAT Rate | finance.tax.service_vat_rate |
% | 0 – 100 | if tax.included |
VAT on installation/fuel/service. |
| Surtax Rate | finance.tax.surtax_rate |
% | 0 – 100 (default 0) | optional | Surcharges on VAT payable. |
| Stamp Duty & Fund | finance.tax.stamp_duty_and_fund_rate |
% | 0 – 100 (default 0) | optional | Taxes on revenue (ex-VAT). |
| Loan Included | finance.loan.included |
bool | true / false | always | Toggles the whole loan block. |
| Loan Ratio | finance.loan.loan_ratio |
% | 0 – 100 | if loan.included |
Debt-to-CAPEX ratio. |
| Loan Interest Rate | finance.loan.loan_interest_rate |
% | ≥ 0 | if loan.included |
Nominal annual rate. |
| Loan Period | finance.loan.loan_period |
years | 1 – project_life | if loan.included |
Repayment term. |
| Repayment Type | finance.loan.repayment_type |
enum | equal_principal | equal_installment |
if loan.included |
Linear vs annuity. |
| Land Included | finance.land.included |
bool | true / false | always | Toggles the land-cost block. |
| Land Cost | finance.land.land_cost |
currency | > 0 | if land.included |
unit cost of land acquisition. |
| Land Area | finance.land.land_area |
area | > 0 | if land.included |
Land area value. |
| Area Unit | finance.land.area_unit |
enum | sqm | mu | acre |
if land.included |
Unit of land_area. |
Each technology component has an included field and an Alternative Models array (the lib array in JSON) for the equipment library. When included is true, relevant parameters become required. Library entries have Unit Capacity, Unit Price, and Selected Number fields.
PV System-DC (PV Module)
Optional First Year Decay Rate: 0-5 (%), default 2%, performance degradation rate for the first year.
Optional Average Annual Decay Rate: 0-2 (%), default 0.5%, average annual performance degradation rate from 2nd year onwards.
Optional Calendar Life: 10-30 (years), default 30 years.
O&M Cost: >0 (currency/kW/year) when PV is included.
Optional Maximum PV Capacity, default no limit, number > 0 (kW) or leave empty for no limit, usually limited by the installable area.
Alternative Models: Users can select PV model from the dropdown list or customize component specifications. For custom specifications, input Unit Capacity (kW) and Unit Price (currency/kW). You can select one or multiple models as alternatives (one model is recommended). If you have already determined the PV capacity, check Specify number of units and input the Number of Units.
PV Unit Output Timeseries: A full-year normalized PV generation profile is required, representing the power output per kWp of installed PV capacity. Its length must match Time Resolution (8760/8784 for 60-minute steps, 17520/17568 for 30-minute steps, or 35040/35136 for 15-minute steps), with values between 0 and 1.5.
Auto-Generate and click Generate PV Timeseries. The auto-generation utilizes the Open-Meteo weather data source and the pvlib library for simulation, taking the AC-side output as the result (assuming 99% inverter efficiency).Note:
You can lock the number of PV modules by checking the Specify number of units checkbox (if you have already determined the capacity). Once checked, a Number of Units input field will appear for each model.
In Operation Mode, the Number of Units must be specified for each selected model.
You can select the PV module model and specification from the dropdown list in the Model field.
PV Unit Output Timeseries represents the full-year power generation per kW of installed PV capacity at the selected simulation step. You can import it via CSV (refer to the CSV template) or use the Auto-Generate feature.
PV (DC) field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | pv.included |
bool | — | always | Turns the component on/off. |
| Specify number of units | pv.given_selected_number |
bool | — | always | When true, lib[].selected_number is treated as a fixed input, not a decision variable. Must be true in Operation Mode. |
| First Year Decay Rate | pv.decay_rate[0] |
% | 0 – 5 (default 2) | optional | First-year PV performance drop. |
| Average Annual Decay Rate | pv.decay_rate[1] |
% | 0 – 2 (default 0.5) | optional | Average annual PV degradation from 2nd year. |
| Calendar Life | pv.calendar_life |
years | 10 – 30 (default 30) | optional | Physical PV module lifetime. |
| O&M Cost | pv.operation_and_maintenance_cost |
currency/kW/year | > 0 | if pv.included |
Annual PV O&M cost per installed kW. |
| Max PV Capacity | pv.capacity_max_kw |
kW | > 0 or empty | optional | Upper bound on total PV; empty = no limit. |
| Unit Capacity | pv.lib[].unit_capacity |
kW | > 0 | if pv.included |
Nameplate capacity of one PV module. |
| Unit Price | pv.lib[].unit_price_per_kw |
currency/kW | > 0 | if pv.included |
CAPEX per kW for this model. |
| Selected Number | pv.lib[].selected_number |
count | ≥ 0, integer | if Specify number of units or Operation Mode |
Number of units of this model. |
| PV Unit Timeseries | pv.pv_unit_ts |
kW/kWp | Length must match project.time_resolution; values 0 – 1.5 |
if pv.included |
Normalized PV output per kWp at the selected simulation step. |
PV System-AC (Inverter)
Optional Overload Ratio: 100–150 (%), default 100%, inverter overload tolerance.
Optional PV/Inverter Ratio: 100 – 1000 (%), maximum allowed ratio of PV DC capacity to inverter AC capacity.
O&M Cost: ≥0 (currency/kW/year) when inverter is included.
Alternative Models: Users can select inverter model from the dropdown list or customize component specifications. For custom specifications, input Unit Capacity (kW) and Unit Price (currency/kW). You can select one or multiple models as alternatives (one model is recommended). If you have already determined the inverter capacity, check Specify number of units and input the Number of Units.
Note:
Inverter must be included whenever PV is included, and excluded whenever PV is excluded.
You can lock the number of inverters by checking the Specify number of units checkbox (if you have already determined the capacity). Once checked, a Number of Units input field will appear for each model.
In Operation Mode, the Number of Units must be specified for each selected model.
Inverter field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | inverter.included |
bool | — | must match pv.included |
Enables the AC side of the PV system. |
| Overload Ratio | inverter.overload_ratio |
% | 100 – 150 (default 100) | optional | Short-term overload tolerance. |
| PV/Inverter Ratio | inverter.pv_inverter_ratio |
% | 100 – 1000 | optional | DC/AC ratio upper bound (e.g., 120 = 1.2). |
| O&M Cost | inverter.operation_and_maintenance_cost |
currency/kW/year | ≥ 0 | if inverter.included |
Annual inverter O&M cost per kW. |
| Unit Capacity | inverter.lib[].unit_capacity |
kW | > 0 | if inverter.included |
Rated capacity of one inverter unit. |
| Unit Price | inverter.lib[].unit_price_per_kw |
currency/kW | > 0 | if inverter.included |
CAPEX per kW for this model. |
| Selected Number | inverter.lib[].selected_number |
count | ≥ 0, integer | if Specify number of units or Operation Mode |
Number of inverter units. |
Integrated AC-DC Battery Storage System (BESS)
Optional Calendar Life: 10–30 (years), default 20, battery calendar lifetime in years.
Optional Cycle Life: 2000–10000 (cycles), default 8000 cycles, number of full charge-discharge cycles.
O&M Cost: ≥0 (currency/kWh/year) when battery is included.
Alternative Models: Users can select BESS model from the dropdown list or customize component specifications. For custom specifications, input Unit Capacity (kWh), PCS Capacity (kW), Unit Price (currency/kWh), and C-Rate. You can select one or multiple models as alternatives (one model is recommended). If you have already determined the battery capacity, check Specify number of units and input the Number of Units.
Number of Units must be specified for each selected model.Example:
Advanced Settings: Expand to configure additional parameters for fine-tuning battery performance and operational constraints.
Optional Maximum PV/Battery Ratio: 0-3, default 2, maximum ratio of PV capacity to PCS capacity. This parameter considers the grid-forming requirements of the battery energy storage system to ensuPV-BESS System stability.
Optional Charging Efficiency, Discharging Efficiency: 85–98 (%), charge/discharge efficiency.
Optional Initial SOC: 0-100 (%). Minimum SOC: 0-30 (%). Maximum SOC: 70-100 (%).
Initial SOC must be between Minimum SOC and Maximum SOC.Optional State of Health (SOH): 80–100 (%), initial State of Health. The SOH value is used to calculate the available capacity for the typical year in the design optimization phase. During the full lifecycle operation simulation, the battery will be restored to a new battery condition (100%). For grid-connected scenarios, it is recommended to set SOH to 85-90%. For off-grid scenarios, it is recommended to set SOH to 90-95% and enable Consider Capacity Augmentation.
Optional PCS Capacity Reserve: 10–50 (%), default 20%, the ratio of reserve power of PCS. For example, for a battery system with 10 MW PCS capacity, if pcs_capacity_margin is 20%, the system operates at a maximum power of 8 MW during normal operation, reserving 2 MW as backup capacity.
Allow Grid Charge: Only shown when investment mode is PPA and grid is included. Enables battery charging from the grid.
Optional Arbitrage Threshold: {currency}/kWh, default CNY: 0.5 / USD: 0.07 / EUR: 0.06. Minimum peak-valley price spread for battery arbitrage. The battery only performs charge/discharge arbitrage when the spread exceeds this threshold. Only shown when grid is present.
Consider Battery Replacement: default disabled, whether to consider battery replacement during the project lifecycle when the battery calendar life or cycle life ends.
Replacement SOH Threshold: 50–90 (%), State of Health threshold triggering replacement.
Consider Capacity Augmentation: default disabled, whether to add capacity to compensate for battery degradation and restore available capacity. Due to battery degradation over time, users may need capacity augmentation to maintain the designed capacity level, especially in off-grid scenarios where this is strongly recommended.
Capacity Augmentation Threshold: 50–95 (%), SOH value at which capacity augmentation is triggered (defaults to match the initial SOH when empty).
Battery (BESS) field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | battery.included |
bool | — | always | Turns the BESS on/off. |
| Specify number of units | battery.given_selected_number |
bool | — | always | Fix selected_number as input; mandatory in Operation Mode. |
| Require Grid Forming | battery.require_grid_forming |
bool | — | optional | Enables grid-forming constraint (relevant off-grid). |
| Arbitrage Threshold | battery.arbitrage_threshold | {currency}/kWh | ≥0 (default CNY:0.5/USD:0.07/EUR:0.06) | optional | Min peak-valley spread for arbitrage. Only shown when grid is present. | | Max PV/Battery Ratio | battery.pv_2_batt_ratio_max | ratio | 0 – 3 (default 2) | optional | Upper bound on PV-to-PCS ratio when grid-forming. |
| Calendar Life | battery.calendar_life | years | 10 – 30 (default 20) | optional | Physical battery lifetime. |
| Cycle Life | battery.cycle_life | cycles | 2000 – 10000 (default 8000) | optional | Full equivalent cycles before end-of-life. |
| Charge Efficiency | battery.eta_charge | % | 85 – 98 (default 95) | optional | Round-trip charge efficiency. |
| Discharge Efficiency | battery.eta_discharge | % | 85 – 98 (default 95) | optional | Round-trip discharge efficiency. |
| SOH | battery.soh | % | 80 – 100 (default 95) | optional | Initial state of health; shapes available capacity. |
| Initial SOC | battery.soc_init | % | 0 – 100 (default 95) | optional | Must lie between soc_min and soc_max. |
| Minimum SOC | battery.soc_min | % | 0 – 30 (default 5) | optional | Discharge cutoff. |
| Maximum SOC | battery.soc_max | % | 70 – 100 (default 95) | optional | Charge cutoff. |
| PCS Capacity Reserve | battery.pcs_capacity_margin | % | 0 – 50 (default 0) | optional | Reserve fraction of PCS power. |
| O&M Cost | battery.operation_and_maintenance_cost | currency/kWh/year | ≥ 0 | if battery.included | Annual battery O&M per kWh. |
| Unit Capacity | battery.lib[].unit_capacity | kWh | > 0 | if battery.included | Nameplate capacity of one battery unit. |
| Unit Price | battery.lib[].unit_price_per_kwh | currency/kWh | > 0 | if battery.included | CAPEX per kWh for this model. |
| C-Rate | battery.lib[].c_rate | C | > 0 | if battery.included | Max charge/discharge rate as a multiple of capacity. |
| PCS Capacity | battery.lib[].pcs_capacity | kW | > 0 | if battery.included | Rated Power for this model. |
| Selected Number | battery.lib[].selected_number | count | ≥ 0, integer | if Specify number of units or Operation Mode | Units of this model. |
| Consider Replacement | battery.consider_replacement | bool | default false | always | Include end-of-life replacements in CAPEX. |
| Replacement SOH Threshold | battery.replacement_soh_threshold | % | 50 – 90 | if Consider Battery Replacement | SOH value that triggers replacement. |
| Consider Capacity Augmentation | battery.consider_capacity_augmentation | bool | default false | always | Top up capacity instead of full replacement. |
| Capacity Augmentation Threshold | battery.capacity_augmentation_threshold | % | 50 – 95 | if Consider Capacity Augmentation | SOH value that triggers augmentation (defaults to match SOH). |
Grid (Utility Grid Connection)
STS (Static Transfer Switch / On-Off Grid Cabinet):
STS Capacity (kW): rated capacity of the transfer switch connecting the microgrid to the utility grid. Must be > 0 when STS is enabled.STS Price (currency): equipment cost of the STS/transfer cabinet. Include this if the STS is an investment item for the project.Grid Investment: ≥0 (currency), one-time investment cost for grid connection or upgrade (e.g., step-up transformer, line extension).O&M Cost: ≥0 (currency/year), annual operation and maintenance cost for the grid connection infrastructure.Max Export Capacity: ≥0 (kW), default 0. Maximum power the system can feed back to the grid. When greater than 0, the Feed-in Tariff field must be filled in.Max Import Capacity: ≥0 (kW), maximum grid import power limit.Feed-in Tariff: ≥0 (currency/kWh), electricity selling price when exporting to the grid. Required if Max Export Capacity > 0.Consider Demand Management Revenue: Consider demand management revenue during economic evaluation.Demand Type: Billing method for grid capacity/demand charges (basic electricity fees). Options:
Demand Charge (per kW per month).Demand Charge (per kW per year).Purchase Price per kWh: Time series of electricity purchase prices at the selected simulation step. Download the CSV template, fill in the data, and upload. You may fill in only Year 0 (column index 0) to apply the same prices for all years, or provide a column for each project year to model electricity price escalation. Coarser granularity is accepted (e.g. hourly data for a 15‑min simulation) and will be auto-expanded.Grid Connect Schedule: Binary time series (1 = grid available, 0 = unavailable). Coarser granularity is accepted and will be auto-expanded. Use this to model scheduled outages, rolling blackouts, or load-shedding periods imposed by the utility.Time of Use Demand Schedule: Grid capacity availability (kW) at the selected simulation step. Coarser granularity is accepted and will be auto-expanded. Use this when the utility limits the maximum import capacity during specific periods (time-based curtailment).CO₂ Emission Factor: default 0.55 kg CO₂/kWh, used to calculate carbon emissions from grid electricity consumption.Time Resolution: 8760/8784 points for 60-minute steps, 17520/17568 for 30-minute steps, or 35040/35136 for 15-minute steps. Grid-related fields (purchase price, grid connect schedule, TOU demand schedule) accept coarser granularity and are auto-expanded: 1 h → 4×15 min, 1 h → 2×30 min, 30 min → 2×15 min.
Grid field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | grid.included |
bool | — | always | Enables utility grid connection. |
| Grid Investment | grid.grid_investment |
currency | ≥ 0 (default 0) | optional | One-time grid upgrade CAPEX. |
| O&M Cost | grid.operation_and_maintenance_cost |
currency/year | ≥ 0 (default 0) | optional | Annual grid O&M. |
| Max Import | grid.max_import_capacity_kw |
kW | ≥ 0 | if grid.included |
Maximum power drawn from the grid. |
| Max Export | grid.max_export_capacity_kw |
kW | ≥ 0 (default 0) | optional | Maximum feed-in; if > 0 requires Feed-in Tariff. |
| Feed-in Tariff | grid.feed_in_tariff_per_kwh |
currency/kWh | ≥ 0 | if max_export_capacity_kw > 0 |
Price received per exported kWh. |
| Demand Type | grid.demand_type |
enum | none | monthly | yearly |
optional | Billing basis for demand charges. |
| Demand Charge (Month) | grid.demand_charge_per_kw_per_month |
currency/kW/month | ≥ 0 | if demand_type = monthly |
Monthly peak demand charge. |
| Demand Charge (Year) | grid.demand_charge_per_kw_per_year |
currency/kW/year | ≥ 0 | if demand_type = yearly |
Yearly peak demand charge. |
| Purchase Price | grid.purchase_price_per_kwh |
dict[year→array] | Length can match simulation step or be coarser, ≥ 0 | if grid.included |
Purchase price series; coarser granularity auto-expanded (e.g. hourly → 15‑min). |
| Grid Connect Schedule | grid.grid_connect_schedule |
0/1 | Length can match simulation step or be coarser | optional | 1 = grid available, 0 = outage. Coarser granularity auto-expanded. |
| TOU Demand Schedule | grid.tou_demand_schedule |
kW | Length can match simulation step or be coarser, ≥ 0 | optional | Max import limit by period. Coarser granularity auto-expanded. |
| CO₂ Emission Factor | grid.carbon_dioxide_emission_factor |
kg/kWh | 0 – 2 (default 0.55) | optional | Carbon intensity of grid electricity. |
| STS Capacity | grid.sts.capacity |
kW | > 0 | if STS enabled | rated capacity of Static Transfer Switch. |
| STS Price | grid.sts.price |
currency | ≥ 0 | if STS enabled | Transfer-switch CAPEX. |
Supply Hours per Year: 0–8784. The minimum required hours of electricity supply for Load Grade 1 and Load Grade 2 per year. E.g., 8000 hours means the cumulative annual energy supply to Grade 1 and Grade 2 loads equals (8000 / 8760) × (Grade 1 + Grade 2 load). In off-grid scenarios this is the key reliability constraint that determines battery and genset sizing.
Optional Green Power Ratio: 0–100 (%). Minimum percentage of total electricity that must come from PV+BESS (renewable sources). Leave empty for no constraint.
Supply Cost by Genset: 0–1000 (currency/kWh). This is the benchmark electricity cost for economic evaluation when no other power supply cost is entered. This field appears only in self-invest scenarios with neither grid nor genset; otherwise, it is hidden and not applicable.
PPA Pricing (visible when Invest Mode is PPA):
PPA Price Mode: how electricity price to end-users is structured. Three modes:
Fixed: Single flat price per kWh.
Power Supply Guaranteed Volume (kWh/year): minimum annual energy guaranteed to the buyer.PPA Price (currency/kWh): flat price for all energy supplied.Insufficient Penalty (currency/kWh): penalty per kWh shortage.Step: Tiered pricing above/below a volume threshold.
Annual Guaranteed Volume (kWh/year): minimum guaranteed annual energy.PPA Price (currency/kWh): energy price for the guarantee volume.Excess Volume Price (currency/kWh): energy price significantly above guaranteed volume.Insufficient Penalty (currency/kWh): penalty per kWh shortage.TOU (Time-of-Use): Price varies by time of day.
Annual Guaranteed Supply (kWh/year): minimum guaranteed annual energy.Insufficient Penalty (currency/kWh): penalty per kWh shortage.TOU PPA Price Time Series: price array at the selected simulation step (currency/kWh). Used when importing a full-year PPA price series directly.PPA Discount Dict: maps project year → discount factor (%). E.g., {"1": 100, "5": 95, "10": 90} means full price in year 1, 5% discount from year 5, 10% from year 10. Used when pricing is derived as a discount off the grid purchase price (grid-connected scenarios only; requires importing grid purchase price series). Fill in the discount percentage for each pricing tier.TOU PPA Price Time Series; (2) derive prices as a discount off the grid purchase price (grid-connected scenarios only, requires grid purchase price data), by filling in Grid Discount Dict with the discount factor for each pricing tier.Optional Yearly PPA Discount: list of annual discount factors (0–100, %) applied to power supply revenue or cost per project year. E.g., [100, 98, 96] models a 2% annual discount step.
Load Grades — at least one must be included:
Grade 1 Load (Critical/Firm): highest priority, must always be satisfied. Unsatisfied critical load counts as supply failure.Grade 2 Load (Interruptible): normal priority, can be curtailed (reduced or shut off) when energy is scarce.Grade 3 Load (Flexible): normal priority, can be adjusted upward or downward (both increase and curtailment) within defined limits.Each grade requires:
Load Time Series (load_ts): load profile (kW) at the selected simulation step; length must match Time Resolution.Additional fields for Grade 3 Load:
Upward Limit (%): 100–200. Maximum percentage of baseline allowed as peak (e.g., 120 = up to 120% of baseline).Downward Limit (%): 0–100. Floor percentage allowed (e.g., 80 = cannot drop below 80% of baseline).Operating Rate: 0–100, overall operating rate constraint for flexible loads.Constant Power Hours: list of hour indices (0–23) during which the flexible load must hold constant power (no curtailment/increase allowed).Load field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | load.included |
bool | — | always | Enables load configuration. |
| Supply Hours / Year | load.supply_hours_per_year |
hours | 0 – 8784 | if load.included |
Annual supply-hours reliability constraint. |
| Supply Cost by Genset | load.supply_price_by_genset_per_kwh |
currency/kWh | 0 – 1000 | optional | Fallback supply cost used in self-invest off-grid. |
| Yearly PPA Discount | load.yearly_power_supply_discount |
list[%] | each 0 – 100 | optional | Per-year discount factors. |
| Green Power Ratio | load.green_power_ratio |
% | 0 – 100 | optional | Minimum renewable share. |
| PPA Price Mode | load.ppa_price_mode |
enum | fixed | step | tou |
if invest_mode = ppa |
Structure of end-user pricing. |
| Fixed PPA Annual Guaranteed Supply | load.fixed_ppa.power_supply_guarantee_volume |
kWh/year | > 0 | optional | Guaranteed energy in fixed PPA. |
| Fixed PPA Price | load.fixed_ppa.ppa_price |
currency/kWh | > 0 | if ppa_price_mode = fixed |
Flat PPA price. |
| Fixed Penalty | load.fixed_ppa.insufficient_penalty |
currency/kWh | ≥ 0 | optional | Shortfall penalty. |
| Step PPA Annual Guaranteed Supply | load.step_ppa.power_supply_guarantee_volume |
kWh/year | > 0 | if ppa_price_mode = step |
Guarantee threshold. |
| Step PPA Price | load.step_ppa.ppa_price |
currency/kWh | > 0 | if ppa_price_mode = step |
Above-threshold price. |
| Step Excess Price | load.step_ppa.excess_volume_price |
currency/kWh | ≥ 0 | optional | Price for volumes far above the threshold. |
| Step Penalty | load.step_ppa.insufficient_penalty |
currency/kWh | ≥ 0 | optional | Shortfall penalty. |
| TOU PPA Annual Guaranteed Supply | load.tou_ppa.power_supply_guarantee_volume |
kWh/year | > 0 | optional | Guarantee threshold. |
| TOU PPA Price Time Series | load.tou_ppa.tou_price_ts |
currency/kWh | Length must match project.time_resolution, > 0 |
if TOU with explicit prices | PPA price series at the selected simulation step. |
| TOU Discount Dict | load.tou_ppa.ppa_discount_dict |
dict[year→%] | 0 – 100 | if TOU with grid-price discounts | Per-year discount versus grid price. |
| TOU Penalty | load.tou_ppa.insufficient_penalty |
currency/kWh | ≥ 0 | optional | Shortfall penalty. |
| Grade 1 Load | load.grade_1_load.load_ts |
kW | Length must match project.time_resolution, ≥ 0 |
if grade 1 included | Critical load series. |
| Grade 2 Load | load.grade_2_load.load_ts |
kW | Length must match project.time_resolution, ≥ 0 |
if grade 2 included | Standard load series. |
| Grade 3 Load | load.grade_3_load.load_ts |
kW | Length must match project.time_resolution, ≥ 0 |
if grade 3 included | Flexible load baseline. |
| Grade 3 Operating Rate | load.grade_3_load.operating_rate |
% | 0 – 100 | if grade 3 included | Overall runtime/utilization ratio. |
| Grade 3 Upward Limit | load.grade_3_load.upward_limit |
% | 100 – 200 | if grade 3 included | Upward flexibility ceiling. |
| Grade 3 Downward Limit | load.grade_3_load.downward_limit |
% | 0 – 100 | optional | Downward flexibility floor. |
| Grade 3 Constant Hours | load.grade_3_load.constant_power_hours |
list[0–23] | hour indices | optional | Hours where power must be held constant. |
pv-battery-genset)Fuel Type: fuel used by the generator. Options: diesel, gasoline, natural_gas, biodiesel, coal, oil.Installed Capacity (kW): total installed genset nameplate power. This is an upper bound on genset dispatch power; the optimizer will not exceed this value.Minimum Output (kW): The minimum output of genset when running (prevents inefficient low-load operation).Production Cost: ≥0 (currency/kWh), all-in variable cost of electricity generated by the genset, including fuel and consumables. Tip: compute as Fuel Consumption Rate [L/kWh] × Fuel Price [currency/L]. The currency-aware cap is 5 CNY/kWh or 0.5 USD/EUR/kWh.Genset Investment: ≥0 (currency), capital cost of the genset. Leave 0 if the genset is an existing on-site asset and not a new investment.O&M Cost: ≥0 (currency/year), fixed annual maintenance cost beyond the per-kWh production cost.CO₂ Emission Factor (kg CO₂/kWh): used to calculate total carbon emissions from genset generation. Typical values: diesel ~0.65–0.70, natural gas ~0.45–0.55.Genset field reference
| Field | JSON path | Unit | Range / Default | Required when | Description |
|---|---|---|---|---|---|
| Included | genset.included |
bool | — | always (genset scenarios) | Enables the generator block. |
| Fuel Type | genset.fuel_type |
enum | diesel | gasoline | natural_gas | biodiesel | coal | oil |
if genset.included |
Drives emissions and narrative categorization. |
| Installed Capacity | genset.genset_capacity |
kW | ≥ 0 | optional (defaults 1.2× max load) | Installed nameplate power (not a decision variable). |
| Minimum Output | genset.min_output |
kW | ≥ 0 | optional | Minimum output when running; prevents inefficient low load. |
| Production Cost | genset.production_cost_per_kwh |
currency/kWh | 0 – 5 (CNY) / 0 – 0.5 (USD/EUR) | if genset.included |
All-in variable cost per kWh. |
| O&M Cost | genset.operation_and_maintenance_cost |
currency/year | ≥ 0 (default 0) | optional | Fixed annual O&M. |
| Genset Investment | genset.unit_price |
currency/kW | ≥ 0 (default 0) | optional | Set > 0 only if treating genset as new CAPEX. |
| CO₂ Emission Factor | genset.carbon_dioxide_emission_factor |
kg/kWh | 0 – 2 (default 0.5) | optional | Used for lifecycle CO₂ reporting. |
Start Simulation to begin the optimization.Check Job Status button in the bottom-left corner of the page. This allows you to monitor your running jobs and view their real-time progress at any time.Check Job Status to view or resume your job. Completed calculations are preserved.| Field | Unit | Description |
|---|---|---|
| CAPEX | currency | Total upfront capital expenditure (equipment + construction + land if included). |
| AT-NPV | currency | Net Present Value of project cash flows after income tax. |
| BT-NPV | currency | Net Present Value before income tax. |
| AT-IRR | % | IRR of project cash flows after income tax. |
| BT-IRR | % | IRR before income tax. |
| AT-Equity IRR | % | IRR of equity cash flows (after debt service) after tax. |
| BT-Equity IRR | % | Equity IRR before tax. |
| AT-Payback Period | years | Years until cumulative after-tax cash flow turns positive. |
| BT-Payback Period | years | Years until cumulative before-tax cash flow turns positive. |
| PV-BESS LCOE | currency/kWh | Levelized cost of renewable (PV + BESS) generation only. |
| Project LCOE | currency/kWh | Levelized cost of all electricity delivered by the project. |
| CO2 Reduction | t CO₂ | Lifetime CO₂ avoided versus the baseline supply (grid + genset). |
| Field | Description |
|---|---|
| Project Investment | Total project investment (same as CAPEX). |
| Battery Replacement Capacity | Capacity installed as end-of-life replacement. |
| Battery Augmentation Capacity | Capacity added to counter degradation (top-up). |
| Annual Revenue (with VAT) | Gross annual revenue including VAT. |
| Annual Power Supply Revenue | Revenue from electricity sold to end users. |
| Annual PV Feed-in Revenue | Revenue from exporting PV energy to the grid. |
| Annual Grid Charge Cost | Cost of grid energy used to charge storage. |
| Annual Energy Supply Revenue | Energy-charge portion of revenue (ex-demand charge). |
| Annual Demand Revenue | Demand-charge avoidance or revenue. |
| Annual System Charge Cost | Cost of energy used to charge the BESS. |
| Annual System Charge Cost (by grid) | Charge cost attributed to grid. |
| Annual System Charge Cost (by genset) | Charge cost attributed to genset. |
| Annual System Discharge Revenue | Revenue from BESS discharge. |
| Annual System Discharge to Load Revenue | BESS discharge used to supply load. |
| Annual System Discharge to EV Revenue | BESS discharge used to supply EVs. |
| Annual Insufficient Supply Penalty | Penalty for PPA shortfall (aggregated). |
| Annual Insufficient Supply Penalty (load) | Shortfall penalty attributed to load. |
| Annual Insufficient Supply Penalty (EV) | Shortfall penalty attributed to EVs. |
| Salvage Value | Residual asset value recovered in the final year. |
| Annual Revenue (without VAT) | Net-of-VAT revenue. |
| Annual VAT Payable | VAT owed after netting input and output. |
| Annual Output VAT | VAT collected on revenue. |
| Annual Input VAT | VAT paid on equipment and services. |
| Annual Business Tax | Business tax and surcharges. |
| Annual Surtax | Urban maintenance and education surcharges on VAT. |
| Annual Stamp Duty and Fund | Stamp duty and water conservancy fund on revenue. |
| Operating Profit | Revenue minus operating cost and depreciation. |
| Annual Operating Revenue | Accounting operating revenue. |
| Annual Operating Cost | Accounting operating cost (incl. depreciation and interest). |
| Annual Interest Expense | Interest paid on outstanding loan principal. |
| Annual Income Tax Payable | Income tax for the year. |
| Annual Income Tax Payable (Before Benefits) | Income tax before any tax incentives. |
| Net Profit | After-tax profit. |
| Annual Cash Inflow | Total cash received in the year. |
| Annual Cash Outflow | Total cash paid in the year. |
| Capital Expenditure | CAPEX paid in the year (non-zero in construction/replacement years). |
| Annual Net Cashflow | Inflow minus outflow. |
| Annual Repayment Amount | Total debt service (principal + interest). |
| Annual Depreciation | Asset depreciation for the year. |
| Annual Total Cost | All accounting costs for the year. |
| Annual Repayment of Interest | Interest portion of the debt service. |
| Loan Amount | Principal drawn. |
| Annual Remaining Principal | Principal outstanding at year-end. |
| Annual Repayment of Principal | Principal portion of the debt service. |
| Annual Operating Cost (exclude Depreciation and Interest) | Cash operating cost. |
| Annual Insurance Cost | Annual insurance premium. |
| Annual O&M Cost | Annual O&M cost across all components. |
| Net Cash Flow (Before Income Tax) | Project net cash flow before income tax. |
| Cumulative Net Cash Flow (Before Income Tax) | Cumulative before-tax project net cash flow. |
| Net Cash Flow (After Income Tax) | Project net cash flow after income tax. |
| Cumulative Net Cash Flow (After Income Tax) | Cumulative after-tax project net cash flow. |
| Net Equity Cash Flow (Before Income Tax) | Equity cash flow before income tax. |
| Net Equity Cash Flow (After Income Tax) | Equity cash flow after income tax. |
| Field | Description |
|---|---|
| Net Present Cost | Total discounted lifecycle cost (self-invest objective). |
| Project Net Present Cost | NPC including the whole project boundary. |
| PV-BESS System Net Present Cost | NPC attributable to PV + BESS only. |
| Present Value of Capital Expenditure | Discounted CAPEX. |
| Present Value of Equipment Investment | Discounted equipment CAPEX. |
| Present Value of Loan Interest | Discounted interest expense. |
| Present Value of Operating Cost | Discounted operating cost. |
| Present Value of Annual Operating Cost | Discounted yearly operating cost. |
| Present Value of Depreciation Tax Shield | Discounted tax benefit of depreciation. |
| Present Value of Annual Salvage | Discounted salvage value. |
| Present Value of Salvage | Same as above (aggregate). |
| Present Value of System Discharge Volume | Discounted BESS discharge volume used in LCOE. |
| Present Value of RE Supply | Discounted renewable energy supplied. |
| Present Value of System Supply | Discounted total energy supplied by the project. |
| Present Value of Grid Charging | Discounted grid charging cost. |
| Present Value of Genset Fuel | Discounted genset fuel cost. |
| Investment | Total project investment (CAPEX). |
| RE Investment | CAPEX attributable to PV + BESS. |
| RE Supply | Annual energy supplied by PV + BESS. |
| System Supply | Annual total energy supplied by the project. |
| Theoretical PV Generation | Theoretical PV output without curtailment. |
| PV Drop | Curtailed PV energy. |
| PV Curtailment Ratio | Curtailed PV / Theoretical PV. |
Time-series columns in the exported operation plan CSV. The row interval follows the selected Time Resolution.
| Column | Unit | Description |
|---|---|---|
purchase_price_per_kwh |
currency/kWh | Grid purchase price for the current simulation step. |
grid_sell |
kW | Power exported to the grid. |
grid_buy |
kW | Power imported from the grid. |
genset |
kW | Genset output power. |
total_load |
kW | Total electrical load to be served. |
ev_charge |
kW | Total EV charging power. |
pv_used |
kW | PV output actually used (after curtailment). |
batt_disc |
kW | BESS discharge power. |
batt_char |
kW | BESS charge power. |
batt_soe |
kWh | BESS state-of-energy. |
batt_soc |
% | BESS state-of-charge. |
pv_max |
kW | Theoretical PV output without curtailment. |
pv_drop |
kW | Curtailed PV power. |
grid_2_batt |
kW | Grid power used to charge BESS. |
system_supply |
kW | Total power supplied by the project. |
re_supply |
kW | Renewable power supplied (PV + BESS discharge to load). |
fuel_consumed_liters |
L | Genset fuel consumption. |
total_consumption |
kW | Total consumption (load + EV). |
| Key | EN |
|---|---|
PV System |
PV System |
BESS |
BESS |
Genset |
Genset |
Grid Connection |
Grid Connection |
Load |
Load |
Factory Load |
Factory Load |
PV_SYSTEM |
PV System |
STORAGE_SYSTEM |
Storage System |
GENSET_SYSTEM |
Genset System |
CHARGING_SYSTEM |
Charging System |
LOAD_SYSTEM |
Load System |
TOTAL_CAPACITY |
Total Capacity |
PV |
PV |
BATTERY |
Batt |
GENSET |
Genset |
Ecosizing ships several end-to-end configurations under examples/. Use them as starting points for new projects by importing the JSON via the Import Config button.
examples/demo-pv-battery-genset.jsonpv-battery-genset scenario.When a project has not yet been surveyed, these seeds are a reasonable starting point for the optimizer:
finance.project_life = 25, finance.discount_rate = 8, finance.construction_rate = 10, finance.insurance_rate = 0.25, finance.salvage_ratio = 5.pv.decay_rate = [2, 0.5], pv.calendar_life = 30, pv.operation_and_maintenance_cost ≈ 0.04 (USD/kW/yr) or 0.3 (CNY/kW/yr).battery.calendar_life = 20, battery.cycle_life = 8000, battery.eta_charge = battery.eta_discharge = 95, battery.soh = 95, battery.pcs_capacity_margin = 20.genset.production_cost_per_kwh = diesel price (currency/L) × consumption (L/kWh), typically 0.20 – 0.35 USD/kWh for remote sites.The PPA Pricing Analysis tool helps you find the break-even PPA price or evaluate the profitability of a given PPA price.
Results page.fixed, step, or tou) and enter the relevant price parameters.included is true.Number of Units must be specified for all equipment.public/templates/.purchase_price_per_kwh keys must be sequential integers starting from 0.Time Resolution: 8760/8784 values for 60-minute steps, 17520/17568 for 30-minute steps, or 35040/35136 for 15-minute steps. Grid-related fields (purchase price, grid connect schedule, TOU demand schedule) additionally accept coarser granularity (e.g. hourly for a 15‑min sim) and are auto-expanded.grid.feed_in_tariff_per_kwh whenever grid.max_export_capacity_kw > 0.Time Resolution (60 min: 8760/8784; 30 min: 17520/17568; 15 min: 35040/35136). Grid fields (purchase price, grid connect schedule, TOU demand) also accept coarser lengths that are multiples of the hourly count. Check for non-numeric characters, empty cells, or incorrect column formats.pv.capacity_max_kw or leave it empty for no limit.battery.pv_2_batt_ratio_max.finance.loan.loan_period must be ≤ finance.project_life.Consider Capacity Augmentation is enabled, the Capacity Augmentation Threshold should typically match or be close to the initial State of Health (SOH) value.Use this quick decision guide:
| Question | Answer → Scenario |
|---|---|
| Is there a grid connection? | No → off-grid scenarios. Yes → grid-connected scenarios. |
| Off-grid with diesel backup? | Yes → pv-battery-genset. |
| Off-grid with flat constant-power supply? | Yes → pv-battery-constant-power. |
| Grid-connected, no PV needed (pure arbitrage / peak-shaving)? | Yes → battery-grid. |
| Grid-connected PV + storage for C&I self-consumption? | Yes → pv-battery-grid. |
Typical keyword-to-scenario cues:
pv-battery-genset (or pv-battery-constant-power if load is very flat).pv-battery-grid.battery-grid.Any project:
Add per scenario:
battery-grid: battery lib, grid.purchase_price_per_kwh, grid.max_import_capacity_kw.pv-battery-constant-power: PV lib + pv_unit_ts, inverter lib, battery lib, grade-3 operating_rate and constant_power_hours.pv-battery-grid: PV lib + pv_unit_ts, inverter lib, battery lib, grid.purchase_price_per_kwh, feed-in tariff if exporting, demand settings if applicable.pv-battery-genset: PV lib + pv_unit_ts, inverter lib, battery lib, genset fuel_type + production_cost_per_kwh + genset_capacity, supply_hours_per_year.PPA Price).