Skip to content

Reconsider storage performance model outputs #521

@elenya-grant

Description

@elenya-grant

Reconsider storage performance model outputs

This came up somewhat during PR #493

This is somewhat related to Issue #498, and was briefly mentioned in this comment on Issue #485 which says:

the battery capacity factor and rated capacity will not result in the same "battery production" as using "battery.electricity_out" because "battery.electricity_out" is equal to: electricity_in - electricity_for_charging + electricity_discharged - excess_electricity whereas the battery capacity factor and rated capacity are based only on electricity_discharged. This would only be a concern where the battery is specified as the commodity stream (for a finance subgroup).

I'll stick to using the battery for this example, but this applies to any storage component. Control strategies for storage components (currently, this is only the DemandOpenLoopStorageController model) have inputs of:

  • commodity_in
  • commodity_demand

and outputs of:

  • commodity_unmet_demand
  • commodity_unused_commodity
  • commodity_set_point
  • total_commodity_unmet_demand

and the storage performance models have an input of commodity_set_point and output the standard outputs of the PerformanceModelBaseClass such as

  • commodity_out
  • rated_commodity_production
  • total_commodity_produced
  • annual_commodity_produced
  • capacity_factor

In the case of using the DemandOpenLoopStorageController with the PerformanceModelBaseClass (which is done in 6 examples) and perhaps instances of using Pyomo dispatch controllers with the PySAM battery, there will be "issues" when using the storage component as the commodity_stream in a finance subgroup (done in Example 14, 18, 19, and 29) because the battery capacity factor and rated capacity are not as "tied" to the "electricity_out" of the battery as is the case for converter performance models. The battery capacity factor and rated capacity are based on the power discharged from the battery. The electricity_out of the battery is the electricity_in - battery_charged + battery_discharged - excess_electricity.

For most cases where a converter is defined as the commodity_stream, the finance subgroup results should not change if we use capacity_factor and rated_commodity_production instead of sum_comp.total_commodity_produced. This is not the case for storage, because the capacity factor and rated production are calculated on the commodity discharged not the commodity_out.

I think that we need to:

  1. standardize what's passed from storage control strategies to storage performance models (Issue Standardize use of controller output commodity_set_point across storage models #498)
  2. standardize make all control strategies compatible with all storage performance models (I can't find the issue right now, but be able to use Pyomo control strategies with a storage performance model that isn't the PySAM battery)
  3. redefine/recalculate/refactor the outputs of storage performance models

Proposed solution

  1. Standardize (and define) what is input/output of storage controller strategies and how that should be interpreted by the performance model its connected to (Issue Standardize use of controller output commodity_set_point across storage models #498)
  2. Remove saturating commodity_out of storage performance models to be limited to the demand profile, the demand profile for a storage component should only used to decide when to charge/discharge storage. Aka - commodity_out or commodity_set_point should not be saturated at the demand profile.
  3. Change the calculation of commodity_out from the storage performance models to instead be a timeseries of the battery charge and discharge profiles. commodity_out is negative if the storage is being charged, and positive if the storage is being discharged.
  4. Use a combiner to combine the electricity stream that was going into the battery with the electricity stream out of the battery. The output of the combiner would be equal to commodity_in - commodity_to_charge_storage + commodity_discharged_from_storage

Alternatives considered

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    dispatchrelated to dispatch and control

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions