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()
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()
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.