-
Notifications
You must be signed in to change notification settings - Fork 6
Add initial set of generation and storage schemas #93
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
EllieKallmier
wants to merge
5
commits into
main
Choose a base branch
from
gen-and-storage-schema-definitions
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
6352d3e
add initial set of generation and storage schemas
EllieKallmier 2963704
tighten generation, storage, and cost schemas - add value constraints…
EllieKallmier 246a5a7
tidy: remove custom validation from build costs as covered by allowed…
EllieKallmier 8e23088
Apply suggestion from @nick-gorman
EllieKallmier c1ec748
replace hard-coded allowed_values with allowed_values_from table/colu…
EllieKallmier File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| table: costs_connection | ||
| required: false | ||
| unique: | ||
| - [geo_id, technology, year] | ||
| description: > | ||
| Connection costs and system security costs for new entrant generators and storage. | ||
|
|
||
| Contains additional costs for grid connection and, where applicable, system | ||
| strength requirements for inverter-based resources. | ||
|
|
||
| Source tables: | ||
| - `connection_cost_forecast_wind_and_solar` | ||
| - `connection_cost_forecast_other` | ||
| - `connection_costs_for_wind_and_solar` | ||
| - `connection_costs_other` | ||
| - `efficient_level_of_system_strength_cost` | ||
|
|
||
| If absent: | ||
| No additional connection or system security costs apply to new entrant build costs. | ||
| columns: | ||
| geo_id: | ||
| type: string | ||
| required: true | ||
| allowed_values_from: | ||
| - network_geography: geo_id | ||
| description: > | ||
| Network geography identifier where the connection cost applies. | ||
|
|
||
| Source notes: | ||
| If costs are given by region in source data, separate rows for each geo_id in | ||
| the region are created by the `templater` with the same cost applied across each. | ||
| technology: | ||
| type: string | ||
| required: false | ||
| allowed_values_from: | ||
| - costs_new_entrant_build: technology | ||
| description: > | ||
| Standardised technology name mapping to new entrant technologies. | ||
|
|
||
| If absent (or empty): | ||
| The connection cost applies to all new entrant technologies in `geo_id` that | ||
| have no technology-specific connection cost for the applicable year. | ||
| year: | ||
| type: int | ||
| required: true | ||
| description: Year in which this cost applies. | ||
| connection_cost: | ||
| type: float | ||
| required: false | ||
| units: $/MW | ||
| gte: 0.0 | ||
| nan_fill: 0.0 | ||
| description: > | ||
| Additional cost in AUD for new build reflecting transmission infrastructure required | ||
| for grid connection. | ||
|
|
||
| Used in calculating the total capital cost of new entrant technologies. | ||
|
|
||
| If absent (or empty): | ||
| No additional connection cost applies for the corresponding technology, geo_id | ||
| and build year. | ||
| system_strength_cost: | ||
| type: float | ||
| required: false | ||
| units: $/MW | ||
| gte: 0.0 | ||
| nan_fill: 0.0 | ||
| description: > | ||
| Additional cost in AUD for inverter-based resources to meet efficient levels of | ||
| system strength. | ||
|
|
||
| Used in calculating the total capital cost for some new entrant technologies. | ||
| Per IASR, "This cost is a blend of remediation with synchronous condenser | ||
| and grid forming batteries" (IASR workbook v7.5, 'Power System Security' sheet). | ||
|
|
||
| If absent (or empty): | ||
| Only the `connection_cost` value is added to new entrant build costs. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| table: costs_fuel_prices | ||
| # note: this table is required to calculate SRMC. Possible to make this optional in | ||
| # future and/or design in more flexibility around dynamic vs. static SRMC calculation | ||
| # - but I'm getting blocked on how to implement this at the moment with some | ||
| # complexity around VRE vs non-VRE data requirements and how validation will | ||
| # be applied (to make some decisions around how conditional requirements can | ||
| # work) - basically needs more thought/discussion so for now I'm making all | ||
| # columns/tables needed to calculate SRMC (dynamic) required. | ||
| required: true | ||
| unique: | ||
| - [fuel_type, fuel_price_mapping, year] | ||
| description: > | ||
| Fuel prices by year for generation and storage units. | ||
|
|
||
| Contains fuel prices used to calculate dynamic marginal costs for thermal generators. | ||
|
|
||
| Source tables: | ||
| - `coal_fuel_price` | ||
| - `biomass_fuel_price` | ||
| - `gas_and_liquid_fuel_prices_consultant_scenario_mapping` | ||
| - `gas_prices_existing_generators` | ||
| - `gas_prices_new_entrants` | ||
| - `liquid_fuel_prices` | ||
| - `gpg_secondary_fuel_prices` # maybe | ||
| - `hydrogen_prices` | ||
| - `biomethane_prices` | ||
|
|
||
| Source notes: | ||
| The consultant scenario mapping table is used to map between specified ISP | ||
| scenario names and the gas, liquid fuel, hydrogen and biomenthane price scenario | ||
| names. This is new in the 2026 ISP (IASR v7.5). | ||
|
|
||
| Rows are also added by the `templater` for VRE fuels (Wind, Solar) with a price | ||
| of $0.0 for all years. | ||
| columns: | ||
| fuel_type: | ||
| type: string | ||
| required: true | ||
| description: > | ||
| Fuel type for which the price applies. | ||
|
|
||
| There are some fuel types (e.g., Biomethane) that are not used directly by any | ||
| generators in the model, but are used to blend with other fuels to calculate | ||
| final fuel costs. | ||
| fuel_price_mapping: | ||
| type: string | ||
| required: true | ||
| description: > | ||
| Identifier mapping to specific assets or sets of new entrant assets. | ||
|
|
||
| For most existing and planned generation, maps to specific power stations. | ||
| For new entrants, maps to technology/location groups. | ||
|
|
||
| Source notes: | ||
| For purely 'blending' fuels (e.g. Biomethane) and VRE fuel types (Wind, Solar), | ||
| that don't map to a specific generator, technology, or location this column is | ||
| filled by the `templater` with the corresponding `fuel_type` value. | ||
| year: | ||
| type: int | ||
| required: true | ||
| description: Year for which the price applies. | ||
| price: | ||
| type: float | ||
| required: true | ||
| units: $/GJ | ||
| gte: 0.0 | ||
| description: Fuel price in AUD per gigajoule. |
41 changes: 41 additions & 0 deletions
41
src/ispypsa/validation/schemas/costs_new_entrant_build.yaml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| table: costs_new_entrant_build | ||
| required: false | ||
| unique: | ||
| - [technology, year] | ||
| description: > | ||
| New entrant generation and storage unit build costs. | ||
|
|
||
| Contains upfront capital costs for new entrant technologies. For offshore wind, | ||
| build costs include connection costs if sourced from the IASR workbook. | ||
|
|
||
| Source tables: | ||
| - `build_costs` | ||
|
|
||
| This table is required if new entrant generation or storage asset tables are | ||
| present and non-empty. | ||
| columns: | ||
| technology: | ||
| type: string | ||
| required: true | ||
| description: > | ||
| Standardised technology name for the new entrant technology. | ||
|
|
||
| Should match technology values in `generators_new_entrant` or `storage_new_entrant` | ||
| tables; any new entrant technology defined there must also have a build cost | ||
| in this table. | ||
| year: | ||
| type: int | ||
| required: true | ||
| description: Year in which the build cost applies. | ||
| cost: | ||
| type: float | ||
| required: true | ||
| gte: 0.0 | ||
| units: $/MW | ||
| description: > | ||
| Upfront capital cost in AUD to build the new entrant technology. | ||
|
|
||
| Does not include connection costs (except for offshore wind) or additional | ||
| costs for required REZ expansion, which are applied as penalties based on | ||
| build limits. Does not include locational cost factor scaling or first-of-a-kind | ||
| premium. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| table: emissions_reduction | ||
| required: false | ||
| unique: | ||
| - [fuel_type, name, year] | ||
| description: > | ||
| Emissions intensity factors from fuel blending for gas-fired generators. | ||
|
|
||
| Contains estimated emissions factors reached through blending biomethane or | ||
| alternative fuels into the gas network, applied to individual gas-fired generators. | ||
|
|
||
| Source tables: | ||
| - `gpg_emissions_reduction_biomethane` | ||
|
|
||
| If absent: | ||
| No fuel blending assumed, so no adjustments to fuel price or emissions intensity | ||
| for gas generators are considered in the model. | ||
| columns: | ||
| fuel_type: | ||
| type: string | ||
| required: true | ||
| allowed_values_from: | ||
| - costs_fuel_prices: fuel_type | ||
| description: > | ||
| Fuel type blended into the base "Gas" fuel. | ||
| year: | ||
| type: int | ||
| required: true | ||
| description: Year in which this blend rate applies. | ||
| gpg_emissions_factor: | ||
| type: float | ||
| required: true | ||
| units: '%' | ||
| gte: 0.0 | ||
| lte: 100.0 | ||
| description: > | ||
| Emissions factor of gas-powered generation reached through fuel blending (%). | ||
|
|
||
| Used to calculate blended fuel prices and emissions intensity for GPG. Note: | ||
| simplified calculation assumes this factor applies directly to fuel price, | ||
| though biomethane has a small emissions contribution (0.13 kgCO2e/GJ). The | ||
| difference is negligible (<0.01%). |
129 changes: 129 additions & 0 deletions
129
src/ispypsa/validation/schemas/generators_existing_planned.yaml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| table: generators_existing_planned | ||
| required: false | ||
| unique: | ||
| - [name] | ||
| description: > | ||
| Existing and planned-build generator characteristic data by generating unit. | ||
|
|
||
| Summary data for all existing and planned-build (in ISP terminology, this includes | ||
| committed, anticipated and additional policy-supported) generators, with each row | ||
| containing information to represent a single generating unit. | ||
|
|
||
| Source tables: | ||
| - `existing_committed_anticipated_additional_generator_summary` | ||
| - `renewable_energy_zones` | ||
| - `variable_opex_existing_committed_anticipated_additional_generators` | ||
| - `heat_rates_existing_committed_anticipated_additional_generators` | ||
| - `maximum_capacity_existing_committed_anticipated_additional_generators` | ||
| - `expected_closure_years` | ||
| - `gpg_min_stable_level_existing_generators` | ||
| - `coal_minimum_stable_level` | ||
|
|
||
| If absent: | ||
| A greenfield model will be run — no existing generators will be modelled. | ||
| columns: | ||
| name: | ||
| type: string | ||
| required: true | ||
| description: The name of the generating unit, e.g. DUID or full name. Must be unique. | ||
| power_station: | ||
| type: string | ||
| required: true | ||
| description: > | ||
| The name of the power station to which the generating unit belongs. | ||
|
|
||
| This should be the full proper name of the power station. In cases where only | ||
| one generating unit falls into a power station, this may have the same value | ||
| as the `name` column. This value is used to group units of generators in results | ||
| and charts, and map to station-level data, e.g. fuel costs. | ||
| technology: | ||
| type: string | ||
| required: true | ||
| description: > | ||
| The full proper name of the technology type as given in the IASR workbook. | ||
|
|
||
| Values in this column are used as 'canon' technology types across the model - | ||
| i.e. used to correct typos or map different spellings to a single canonical value. | ||
| This column is also used to group results by technology type, and maps directly to | ||
| the 'Retirement Costs' table in the IASR workbook (not currently implemented). | ||
| geo_id: | ||
| type: string | ||
| required: true | ||
| allowed_values_from: | ||
| - network_geography: geo_id | ||
| description: The geography identifier to which the generating unit is connected. | ||
| fuel_type: | ||
| type: string | ||
| required: true | ||
| allowed_values_from: | ||
| - costs_fuel_prices: fuel_type | ||
| description: > | ||
| The name of the type of fuel used by the generating unit. | ||
|
|
||
| This column is used to define the `carrier` for the generating unit in the | ||
| PyPSA model, and to map to fuel prices. | ||
| fuel_price_mapping: | ||
| type: string | ||
| required: true | ||
| allowed_values_from: | ||
| - costs_fuel_prices: fuel_price_mapping | ||
| description: > | ||
| The power station name or other identifier used to map fuel prices to the generator. | ||
|
|
||
| Note: for all power stations except for Kogan Gas, this should exactly match | ||
| the `power_station` column. | ||
| capacity: | ||
| type: float | ||
| required: true | ||
| units: MW | ||
| gt: 0.0 | ||
| description: The nameplate capacity of the generating unit in MW. | ||
| vom: | ||
| type: float | ||
| required: true | ||
| units: $/MWh | ||
| gte: 0.0 | ||
| description: > | ||
| Variable operation and maintenance cost per unit of energy produced, not including fuel cost. | ||
|
|
||
| These values are used to calculate the short-run marginal cost of generation | ||
| for a given unit. | ||
| heat_rate: | ||
| type: float | ||
| required: true | ||
| units: GJ/MWh | ||
| gte: 0.0 | ||
| description: > | ||
| The heat rate of the generating unit, used to calculate the fuel cost per unit | ||
| of energy produced. | ||
|
|
||
| These values are used to calculate the short-run marginal cost of generation | ||
| for a given unit. | ||
| commissioning_date: | ||
| type: date | ||
| required: false | ||
| format: "%d/%m/%Y" | ||
| description: > | ||
| The full date on which the generating unit is expected to begin operation. | ||
|
|
||
| If absent: | ||
| The unit is assumed operational from the start of the modelling horizon. | ||
| closure_year: | ||
| type: int | ||
| required: false | ||
| description: > | ||
| The integer year in which the generating unit is expected to be retired. | ||
|
|
||
| If absent: | ||
| The unit is not retired during the modelling horizon. | ||
| minimum_load: | ||
| type: float | ||
| required: false | ||
| units: MW | ||
| gte: 0.0 | ||
| nan_fill: 0.0 | ||
| description: > | ||
| The minimum stable operational level of the generating unit in MW. | ||
|
|
||
| If absent: | ||
| No minimum operational load is applied to this generating unit. |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.