StandaloneStorageModel


Main Parameters

storage_inputs object

A sub-model to handle the specification of storage model inputs. See below.

energy_prices object or list of floats

The energy prices used for storage dispatch optimization. This can either be a single energy timeseries or two energy timeseries (i.e corresponding to DA & RT markets).

Single energy market timeseries

Input a list of prices. The length must align with the total term of all the batteries at the specified time interval.

Two energy market timeseries

[AncillaryEnergyPrices](<https://tyba.notion.site/Storage-Models-e942d5262f0e4e71ae0b212c037c3513>) object

time_interval_mins float

Optional

The number of minutes per interval.

Note: window and step values will adjust accordingly

[ancillary_markets](<https://tyba.notion.site/Storage-Models-e942d5262f0e4e71ae0b212c037c3513>) object

Optional

A sub-model to handle the specification of Ancillary Services market assumption inputs. See below.

ambient_temp list of floats

Optional

The ambient air temperature in degrees Celsius. This is only used for calculating HVAC losses when a detailed HVAC model is provided.

class StandaloneStorageModel(StorageModel):
		storage_inputs: StorageInputs
    energy_prices: t.Union[AncillaryEnergyPrices, t.List[float]]
    time_interval_mins: t.Optional[int] = opt_field()
    ancillary_markets: t.Optional[AncillaryMarkets] = opt_field()
		ambient_temp: t.Optional[t.List[float]] = opt_field()

Sub-models


StorageInputs

batteries list of objects

A sub-model to handle the specification of battery-specific model inputs. See below.

cycling_cost_adder float

Optional

A hurdle rate to add costs in the optimization framework to reduce cycling. This value is often set at around the Variable O&M cost or the expected cost of degradation.

annual_cycle_limit float

Optional

The maximum number of complete cycles per year. A cycle is measured as the throughput equivalent of the energy capacity fully charging and discharging.

window int

Optional

The number of intervals that the optimization framework has knowledge of constraints. The optimization is rolling and optimizes for each step with the benefit of foresight into the broader window.

step int

Optional

The number of intervals of a single optimization period.

flexible_solar bool

Optional - Only applicable to PV + Storage project. Included here for completeness

Whether or not to include Solar curtailment in Ancillary Services offers:

dart bool

Optional

Whether or not to include DA/RT co-optimization in the Energy Markets

duration_requirement_on_discharge bool

Optional

Whether ReserveMarket.duration_requirement applies to the entire reserve offer, or just the discharge side of the offer. ERCOT currently only constrains the discharge side. This means that if a BESS is offering to reduce the amount it is charging (rather than increasing the amount it is discharging) the offer will not be subject to the duration requirement.

class StorageInputs(object):
    batteries: t.List[Battery]
    cycling_cost_adder: t.Optional[float] = 0
    annual_cycle_limit: t.Optional[float] = opt_field()
    window: t.Optional[int] = opt_field()
    step: t.Optional[int] = opt_field()
    flexible_solar: t.Optional[bool] = opt_field()
    dart: t.Optional[bool] = opt_field()
		dam_annual_cycle_limit: t.Optional[float] = opt_field()
    no_virtual_trades: t.Optional[bool] = opt_field()
    initial_soe: t.Optional[float] = 0
    symmetric_reg: t.Optional[bool] = False
		duration_requirement_on_discharge: t.Optional[bool] = opt_field()

Battery

power_capacity float

The maximum usable capacity of the battery to draw power to charge (kW).

energy_capacity float

The maximum usable capacity of the battery to store energy (kWh).

charge_efficiency float

The percentage of energy stored for every kW of power drawn to charge.

discharge_efficiency float

The percentage of energy discharged for every kW of power drawn to discharge.

degradation_rate float

Optional

The approximate year over year decrease in storage energy capacity. This is a throughput assumption, meaning the battery degrades this percentage every degradation_annual_cycles cycles. Either this parameter or capacity_degradation_model must be specified.

degradation_annual_cycles float

Optional

The number of discharge cycles after which the battery has degraded linearly by degradation_rate.

term int

The number of years this specific battery will be active.

hvac object

Optional

To more accurately model the efficiency of a BESS as a function of temperature, provide a detailed HVAC model here. See below.

BatteryHVAC object

capacity_degradation_model object

Optional

Specification of the storage energy capacity degradation model. This can be used as an alternative to degradation_rate and degradation_annual_cycles. Currently, only models of type TableCapDegradationModel are supported. Either this parameter or degradation_rate must be specified.

efficiency_degradation_model object

Optional

Specification of the storage charge and discharge efficiency degradation model. Current, only models of type TableEffDegradationModel are supported.