Shed Demand Response

Data Fields & Method Definitions
New
class ShedDrResource
Fields:
field allow_inter_period_sharing: Annotated[bool, Metadata(category=FieldCategory.OPERATIONS)] = False

For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / kiloW_year

  • excel_short_title = Capital Cost

  • warning_bounds = (0, 1000)

  • show_year_headers = True

  • default_exclude = False

field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / kiloW_year

  • excel_short_title = Fixed O&M

  • warning_bounds = (0, 100)

  • show_year_headers = True

  • default_exclude = False

field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')

the path to the attributes file

field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False

Whether resource can be expanded (for now only linear capacity expansion).

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False

Whether resource can be retired. By default, resources cannot be retired.

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field class_name: str | None = None
field cumulative_retired_capacity: ts.NumericTimeseries | None = None
field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field energy_budget_annual: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.year, excel_short_title='Annual')] = None

Annual fraction of energy capacity allowed for annual dispatch.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / year

  • excel_short_title = Annual

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field energy_budget_daily: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.day, excel_short_title='Daily')] = None

Daily fraction of energy capacity allowed for daily dispatch.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / day

  • excel_short_title = Daily

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field energy_budget_monthly: Annotated[ts.FractionalTimeseries | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.month, excel_short_title='Monthly')] = None

Monthly fraction of energy capacity allowed for monthly dispatch]

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / month

  • excel_short_title = Monthly

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True

Include component in system.

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field initial_committed_units: Annotated[pd.Series | None, Metadata(category=FieldCategory.OPERATIONS)] = None

For fixed initial condition, how many units are already committed/on

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None

If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets

Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_annual_calls: NumericTimeseries | None = None

Annual number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_call_duration: int | None = None

Maximum duration of a single shed demand response event call [hrs].

Constraints:
  • gt = 0

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_daily_calls: NumericTimeseries | None = None

Daily number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field max_monthly_calls: NumericTimeseries | None = None

Monthly number of allowable calls per individual unit for a shed DR resource.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None

Mean time to repair

Constraints:
  • category = FieldCategory.RELIABILITY

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_down_time: Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)] = None

Minimum downtime between commitments (hours).

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None

These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.

Minimum required operational capacity (planned+selected) by model year for this asset

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_stable_level: Annotated[float, Metadata(category=FieldCategory.OPERATIONS)] = 0

Minimum stable level when committed

Constraints:
  • ge = 0

  • le = 1

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_up_time: Annotated[PositiveInt | None, Metadata(category=FieldCategory.OPERATIONS)] = None

Minimum uptime during a commitment (hours).

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field name: str | tuple [Required]
field operational_capacity: ts.NumericTimeseries | None = None
field outage_distributions: Annotated[dict[str, linkage.ResourceToOutageDistribution], Metadata(linkage_order='to')] [Optional]

This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.

Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field outage_profile: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.unitless, excel_short_title='Outage', default_exclude=True)] [Optional]

Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Outage

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = True

field outage_profile__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None

Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100

Number of years after commission date that asset is operational.

Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_max: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Max Output Profile')] [Optional] (alias 'provide_power_potential_profile')

Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Max Output Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_max__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None

Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_min: Annotated[ts.FractionalTimeseries, Metadata(category=FieldCategory.OPERATIONS, excel_short_title='Min Output Profile')] [Optional] (alias 'provide_power_min_profile')

Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Min Output Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_min__type: Annotated[TimeseriesType | None, Metadata(category=FieldCategory.OPERATIONS)] = None

Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field production_tax_credit: Annotated[float | None, Metadata(units=units.dollar / units.MWh, excel_short_title='PTC')] = None
Constraints:
  • units = dollar / megawatt_hour

  • excel_short_title = PTC

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ptc_term: Annotated[int | None, Metadata(units=units.years, excel_short_title='PTC Term')] = None
Constraints:
  • units = year

  • excel_short_title = PTC Term

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_1_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour)] = None

Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_2_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 2)] = None

Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.5 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_3_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 3)] = None

Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.3333333333333333 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_4_hour: Annotated[float | None, Metadata(category=FieldCategory.OPERATIONS, units=1 / units.hour / 4)] = None

Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.25 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None

Random seed

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field reserves: Annotated[dict[str, linkage.ResourceToReserve], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] [Optional]

This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field resource_groups: Annotated[dict[str, linkage.ResourceToResourceGroup], Metadata(linkage_order='to')] [Optional]

This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.

Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field retired_capacity: ts.NumericTimeseries | None = None
field selected_capacity: float | None = None
field shutdown_cost: Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0

Cost for each unit shutdown ($/unit shutdown). If using linearized UC, this cost will be linearized as well.

Constraints:
  • ge = 0

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field start_cost: Annotated[NonNegativeFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0

Cost for each unit startup ($/unit start). If using linearized UC, this cost will be linearized as well.

Constraints:
  • ge = 0

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None

Stochastic forced outage rate

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field unit_commitment_mode: Annotated[UnitCommitmentMethod, Metadata(category=FieldCategory.OPERATIONS)] = UnitCommitmentMethod.LINEAR

To strictly the number of shift events, set to integer. Otherwise, the default is ‘linear’ and does not fully limit the number of events. Linear is the default, because this is a much simpler optimization problem and you will see minimal increase in run time. This is an acceptable assumption for many projects if you are modeling a large area which could have several Demand Response programs in different locations, each with their own call limits. When modeling smaller geographic areas, or if the project needs strict call limits set the unit_commitment attribute to ‘integer’. Note that this will increase the run time. How much will vary depending on the model complexity, but a good rule of thumb is to assume 1.5x the run time if the variables were linear.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field unit_size: Annotated[PositiveFloat, Metadata(category=FieldCategory.OPERATIONS)] = 0.0 (alias 'unit_size_mw')

Size of each unit that can be independently committed, in MW.

Constraints:
  • gt = 0

  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field variable_cost_power_output: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.OPERATIONS, units=units.dollar / units.MWh, excel_short_title='VO&M Out')] [Optional] (alias 'variable_cost_provide_power')

Variable O&M cost per MWh charged.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / megawatt_hour

  • excel_short_title = VO&M Out

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field vintage_parent_group: str | None = None
field zones: Annotated[dict[str, linkage.ResourceToZone], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

SAVE_PATH: ClassVar[str] = 'resources/shed'
Inherited
class GenericResource
Fields:
field allow_inter_period_sharing: bool = False

For resources & fuel storage resources that have chronological energy storage capability, enable inter-period energy/state-of-charge tracking. For resources with ramp rates, enable inter-period tracking of ramp constraints.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field annual_energy_policies: Annotated[dict[str, linkage.AnnualEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field annualized_capital_cost: Annotated[float, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Capital Cost', warning_bounds=(0, 1000))] = 0
Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / kiloW_year

  • excel_short_title = Capital Cost

  • warning_bounds = (0, 1000)

  • show_year_headers = True

  • default_exclude = False

field annualized_fixed_om_cost: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.dollar / units.kW_year, excel_short_title='Fixed O&M', warning_bounds=(0, 100))] [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = dollar / kiloW_year

  • excel_short_title = Fixed O&M

  • warning_bounds = (0, 100)

  • show_year_headers = True

  • default_exclude = False

field asset_groups: Annotated[dict[str, linkage.AssetToAssetGroup], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field attr_path: str | pathlib.Path | None = PosixPath('/home/docs/checkouts/readthedocs.org/user_builds/e3-resolve/checkouts/latest/docs/source')

the path to the attributes file

field build_year: Annotated[pd.Timestamp, Metadata(category=FieldCategory.BUILD)] = Timestamp('2000-01-01 00:00:00') (alias 'commission_date')
Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field caiso_tx_constraints: Annotated[dict[str, linkage.AssetToCaisoTxConstraint], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field can_build_new: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False

Whether resource can be expanded (for now only linear capacity expansion).

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field can_retire: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = False

Whether resource can be retired. By default, resources cannot be retired.

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field class_name: str | None = None
field cumulative_retired_capacity: ts.NumericTimeseries | None = None
field custom_constraints: Annotated[dict[str, CustomConstraintLinkage], Metadata(linkage_order=3, default_exclude=True)] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = 3

  • default_exclude = True

field elcc_surfaces: Annotated[dict[str, linkage.AssetToELCC], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field emissions_policies: Annotated[dict[str, linkage.EmissionsContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field energy_budget_annual: FractionalTimeseries | None = None

Annual fraction of energy capacity allowed for annual dispatch.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / year

  • excel_short_title = Annual

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field energy_budget_daily: FractionalTimeseries | None = None

Daily fraction of energy capacity allowed for daily dispatch.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / day

  • excel_short_title = Daily

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field energy_budget_monthly: FractionalTimeseries | None = None

Monthly fraction of energy capacity allowed for monthly dispatch]

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / month

  • excel_short_title = Monthly

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field erm_policies: Annotated[dict[str, linkage.ERMContribution], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field hourly_energy_policies: Annotated[dict[str, linkage.HourlyEnergyStandardContribution], Metadata(linkage_order='to', category=FieldCategory.OPERATIONS)] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field include: Annotated[bool, Metadata(category=FieldCategory.BUILD)] = True

Include component in system.

Constraints:
  • category = FieldCategory.BUILD

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field integer_build_increment: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = None

If not None, consider integer (rather than linear) build decisions. If set equal to potential, this will force an all or nothing choice. Otherwise, this can be used to build certain increments of assets

Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field mean_time_to_repair: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY, units=units.hour)] = None

Mean time to repair

Constraints:
  • category = FieldCategory.RELIABILITY

  • units = hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field min_operational_capacity: Annotated[ts.NumericTimeseries | None, Metadata(units=units.MW)] = None

These three attributes are outputs, not inputs. They are initialized to None and are updated to their chosen optimal values after the RESOLVE model is solved. The attributes are used to give build and retirement decisions to a model run in production simulation mode.

Minimum required operational capacity (planned+selected) by model year for this asset

Constraints:
  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field name: str | tuple [Required]
field operational_capacity: ts.NumericTimeseries | None = None
field outage_distributions: dict[str, ResourceToOutageDistribution] [Optional]

This input links resources to a specific OutageDistribution component. When a random or planned outage occurs, the outage distribution dictates what the possible outage state are for each resource. For example, if a unit is either on or offline, then it’s outage distribution is 0,1.

Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field outage_profile: FractionalTimeseries [Optional]

Fixed profile of simulated outages, where a value of 1.0 represents availability of full nameplate capacity and a value less than 1.0 represents a partial outage.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = unitless

  • excel_short_title = Outage

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = True

field outage_profile__type: TimeseriesType | None = None

Whether the outage_profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field physical_lifetime: Annotated[int, Metadata(category=FieldCategory.BUILD, units=units.year)] = 100

Number of years after commission date that asset is operational.

Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = year

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field planned_capacity: Annotated[ts.NumericTimeseries, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] [Optional]
Constraints:
  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field potential: Annotated[float | None, Metadata(category=FieldCategory.BUILD, units=units.megawatt)] = inf
Constraints:
  • ge = 0

  • category = FieldCategory.BUILD

  • units = megawatt

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_max: FractionalTimeseries [Optional] (alias 'provide_power_potential_profile')

Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Max Output Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_max__type: TimeseriesType | None = None

Whether the power_output_max profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_min: FractionalTimeseries [Optional] (alias 'provide_power_min_profile')

Fixed shape of resource’s potential power output (e.g., solar or wind shape or flat shapefor firm resources or storage resources). Used in conjunction with new_modeling_toolkit.common.resource.Resource.curtailable.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title = Min Output Profile

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field power_output_min__type: TimeseriesType | None = None

Whether the power_output_min profile data is of type ‘weather year’, ‘modeled year’, ‘month-hour’, ‘season-hour’, or ‘monthly’

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field prm_policies: Annotated[dict[str, linkage.ReliabilityContribution], Metadata(linkage_order='to')] = {}
Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field production_tax_credit: float | None = None
Constraints:
  • units = dollar / megawatt_hour

  • excel_short_title = PTC

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ptc_term: int | None = None
Constraints:
  • units = year

  • excel_short_title = PTC Term

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_1_hour: float | None = None

Single-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 1 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_2_hour: float | None = None

Two-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.5 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_3_hour: float | None = None

Three-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.3333333333333333 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field ramp_rate_4_hour: float | None = None

Four-hour ramp rate. When used in conjunction with the other ramp rate limits (1-4 hour), a resource’s dispatch will be constrained by all applicable ramp rate limits on a rolling basis.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = 0.25 / hour

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field random_seed: Annotated[int | None, Metadata(category=FieldCategory.RELIABILITY)] = None

Random seed

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field reserves: dict[str, ResourceToReserve] [Optional]

This input links the resource to a specific reserve type that it can contribute to. For example, Storage can provide both regulation up and down, but might not provide non-spin reserves.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field resource_groups: dict[str, ResourceToResourceGroup] [Optional]

This gives each resource a group for RECAP. Depending on the Resource class, the upsampling method could change. For example, with Solar and Wind, these will be upsampled using a day draw methodology.

Constraints:
  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

field retired_capacity: ts.NumericTimeseries | None = None
field selected_capacity: float | None = None
field stochastic_outage_rate: Annotated[float | None, Metadata(category=FieldCategory.RELIABILITY)] = None

Stochastic forced outage rate

Constraints:
  • category = FieldCategory.RELIABILITY

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field variable_cost_power_output: NumericTimeseries [Optional] (alias 'variable_cost_provide_power')

Variable O&M cost per MWh charged.

Constraints:
  • category = FieldCategory.OPERATIONS

  • units = dollar / megawatt_hour

  • excel_short_title = VO&M Out

  • warning_bounds = (None, None)

  • show_year_headers = True

  • default_exclude = False

field vintage_parent_group: str | None = None
field zones: dict[str, ResourceToZone] = {}
Constraints:
  • category = FieldCategory.OPERATIONS

  • units =

  • excel_short_title =

  • warning_bounds = (None, None)

  • show_year_headers = True

  • linkage_order = to

  • default_exclude = False

clear_calculated_properties()

Clear the property cache so scaled profiles are recalculated after rescaling

get_ramp_MW(modeled_year: Timestamp, timepoint_1: Tuple[Timestamp, Timestamp], timepoint_2: Tuple[Timestamp, Timestamp])

Change in output MW between two timepoints

revalidate()

Abstract method to run additional validations after Linkage.announce_linkage_to_instances.

SAVE_PATH: ClassVar[str] = 'resources/generic'
property annual_results_column_order

This property defines the ordering of columns in the Asset annual results summary out of Resolve.

property has_energy_budget: bool
property outage_distribution: OutageDistribution | None
property pmax_profile: Series
property pmin_profile: Series
property production_tax_credit_ts: NumericTimeseries
property resource_group: ResourceGroup | None
property results_reporting_category
property results_reporting_folder
property scaled_annual_energy_budget
property scaled_daily_energy_budget
property scaled_monthly_energy_budget
property scaled_pmax_profile: Dict[int, Series]
property scaled_pmin_profile

ShedDrResource represent Shed Demand Response (or “conventional”) loads that can be curtailed to provide capacity reductions.

Demand response programs are typically structured with certain limits and conditions to ensure grid reliability, customer comfort, and fairness. These limits can vary depending on the specific program and region, but here are some common constraints:

Duration: DR events are usually time-limited to avoid undue inconvenience for participants. They may range from minutes to a few hours, but rarely extend beyond that.

Frequency: The frequency of DR events is limited to prevent excessive disruption. Programs often specify the maximum number of events allowed within a certain time frame. In Recap, we allow the users to specify maximum daily calls, monthly calls, and annual calls.

Seasonal Limits: DR programs may have different limits during different seasons, as electricity demand patterns can vary significantly. Seasonal limits should be modeled in Recap by setting power_output_max to zero in the months where DR calls should not occur.

Note: The code will set the unit_size to the size of the planned_capacity so that the number of available units is always 1 for ShedDrResource and FlexLoadResource (because it inherits from ShedDrResource).

Where do the data inputs go?

  1. Resource Attributes will be specified in the UI

  2. Custom attributes below can be specified as a timeseries, placed in kit > data > profiles

    • Pmin Rating

    • Pmax Rating

    • Max Charging Rating (CSV file)

    • Daily Energy Budget

    • Annual Energy Budget