From 7a7bc6ca57de5016764bffaa456c3d271885f6d2 Mon Sep 17 00:00:00 2001 From: EllieKallmier <61219730+EllieKallmier@users.noreply.github.com> Date: Mon, 10 Aug 2026 12:36:46 +1000 Subject: [PATCH 1/4] add initial existing/planned templating skeleton: split gen/storage, move some functions to helpers, pull in required tables --- src/ispypsa/iasr_table_caching/local_cache.py | 7 + src/ispypsa/templater/existing_planned.py | 197 ++++++ src/ispypsa/templater/geography.py | 20 + src/ispypsa/templater/helpers.py | 23 + src/ispypsa/templater/new_entrants.py | 36 +- .../test_local_cache.py | 15 + tests/test_templater/test_existing_planned.py | 159 +++++ tests/test_templater/test_geography.py | 31 + tests/test_templater/test_helpers.py | 21 + tests/test_templater/test_new_entrants.py | 18 - .../7.5/coal_minimum_stable_level.csv | 45 ++ .../7.5/expected_closure_years.csv | 643 ++++++++++++++++++ ...g_min_stable_level_existing_generators.csv | 138 ++++ ...tted_anticipated_additional_generators.csv | 643 ++++++++++++++++++ ...tted_anticipated_additional_generators.csv | 643 ++++++++++++++++++ ...tted_anticipated_additional_properties.csv | 8 + ...tted_anticipated_additional_generators.csv | 643 ++++++++++++++++++ 17 files changed, 3238 insertions(+), 52 deletions(-) create mode 100644 src/ispypsa/templater/existing_planned.py create mode 100644 tests/test_templater/test_existing_planned.py create mode 100644 tests/test_workbook_table_cache/7.5/coal_minimum_stable_level.csv create mode 100644 tests/test_workbook_table_cache/7.5/expected_closure_years.csv create mode 100644 tests/test_workbook_table_cache/7.5/gpg_min_stable_level_existing_generators.csv create mode 100644 tests/test_workbook_table_cache/7.5/heat_rates_existing_committed_anticipated_additional_generators.csv create mode 100644 tests/test_workbook_table_cache/7.5/maximum_capacity_existing_committed_anticipated_additional_generators.csv create mode 100644 tests/test_workbook_table_cache/7.5/pumped_hydro_existing_committed_anticipated_additional_properties.csv create mode 100644 tests/test_workbook_table_cache/7.5/variable_opex_existing_committed_anticipated_additional_generators.csv diff --git a/src/ispypsa/iasr_table_caching/local_cache.py b/src/ispypsa/iasr_table_caching/local_cache.py index 6c1faea4..efe0cb15 100644 --- a/src/ispypsa/iasr_table_caching/local_cache.py +++ b/src/ispypsa/iasr_table_caching/local_cache.py @@ -52,6 +52,13 @@ def _build_required_tables(iasr_workbook_version: str) -> list[str]: "connection_costs_other", "efficient_level_of_system_strength_cost", "existing_committed_anticipated_additional_generator_summary", + "variable_opex_existing_committed_anticipated_additional_generators", + "heat_rates_existing_committed_anticipated_additional_generators", + "maximum_capacity_existing_committed_anticipated_additional_generators", + "gpg_min_stable_level_existing_generators", + "coal_minimum_stable_level", + "expected_closure_years", + "pumped_hydro_existing_committed_anticipated_additional_properties", "new_entrants_summary", "fixed_opex_new_entrants", "variable_opex_new_entrants", diff --git a/src/ispypsa/templater/existing_planned.py b/src/ispypsa/templater/existing_planned.py new file mode 100644 index 00000000..631c6152 --- /dev/null +++ b/src/ispypsa/templater/existing_planned.py @@ -0,0 +1,197 @@ +"""Splits the existing, committed, anticipated and additional (ECAA) technologies +summary into generator and storage tables. + +Both target tables — see schemas/generators_existing_planned.yaml and +schemas/storage_existing_planned.yaml — are built from the single IASR +existing_committed_anticipated_additional_generator_summary table, which already lists +one row per real generating/storage unit (DUID-level). This module currently +covers only the first step of building those two tables: splitting the summary into +its generator and storage rows and renaming the three carried-over spine columns +(name, power_station, technology) to their schema names. + + existing_committed_anticipated_additional_generator_summary: + IASR ID / DLT names Power Station Technology Type + BW01 Bayswater Steam Sub Critical + Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) + + generators_existing_planned (partial): + name power_station technology + BW01 Bayswater Steam Sub Critical + + storage_existing_planned (partial): + name power_station technology + Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) + +There are two independent public orchestrators, one per output table, each: + 1. Splits the summary's rows into generators and storage — see + _is_existing_planned_storage_row. Storage is identified first by Technology + Type, then by Power Station presence in phes_properties* table. A kind of + backwards validation makes sure that no PHES stations are incorrectly treated + as generators going forward. + 2. Renames the spine columns (_SUMMARY_COLUMN_RENAMES) to their schema names. + Every other summary column passes through unchanged at this early draft. + +Note: using 'phes_properties' as a short name for the IASR table with full name +'pumped_hydro_existing_committed_anticipated_additional_properties' here. +""" + +import logging + +import pandas as pd + +from ispypsa.templater.helpers import _is_storage_row + +# Source (IASR existing_committed_anticipated_additional_generator_summary) column +# names → schema output column names. +_SUMMARY_COLUMN_RENAMES = { + "IASR ID / DLT names": "name", + "Power Station": "power_station", + "Technology Type": "technology", +} + +# The PHES properties table keys Borumba by its short project name; the summary lists +# it under its full project name. +_BORUMBA_FULL_NAME_MAP = {"Borumba": "QEJP - Borumba"} + +# Tumut 3 has a real pump/non-pump unit split that the summary and phes_properties +# tables can't currently be reconciled on by name. _validate_phes_routing tolerates +# this as known unmatched as part of an interim simplification to treat all Tumut 3 +# units as generators. See Open-ISP/ISPyPSA#131 comment thread. +_KNOWN_UNMATCHED_PHES_STATIONS = {"Lower Tumut"} + + +# --- public orchestrators --- + + +def _template_generators_existing_planned( + iasr_tables: dict[str, pd.DataFrame], +) -> pd.DataFrame: + """Templates the existing and planned (ECAA) generators table from the IASR summary. + + Currently just the generator/storage split and spine rename - skeleton/draft. + + Args: + iasr_tables: IASR tables; uses + existing_committed_anticipated_additional_generator_summary and + pumped_hydro_existing_committed_anticipated_additional_properties. + + I/O Example (spine columns shown; every other summary column passes through + unchanged): + existing_committed_anticipated_additional_generator_summary: + IASR ID / DLT names Power Station Technology Type + BW01 Bayswater Steam Sub Critical + Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) # storage, dropped + + returns: + name power_station technology + BW01 Bayswater Steam Sub Critical + """ + logging.info("Creating a template for existing and planned generators") + summary = iasr_tables["existing_committed_anticipated_additional_generator_summary"] + phes_properties = iasr_tables[ + "pumped_hydro_existing_committed_anticipated_additional_properties" + ] + is_storage = _is_existing_planned_storage_row(summary, phes_properties) + generators = summary[~is_storage].copy() + return generators.rename(columns=_SUMMARY_COLUMN_RENAMES) + + +def _template_storage_existing_planned( + iasr_tables: dict[str, pd.DataFrame], +) -> pd.DataFrame: + """Templates the existing and planned (ECAA) storage table from the IASR summary. + + Currently just the generator/storage split and spine rename — skeleton/draft. + + Args: + iasr_tables: IASR tables; uses + existing_committed_anticipated_additional_generator_summary and + pumped_hydro_existing_committed_anticipated_additional_properties. + + I/O Example (spine columns shown; every other summary column passes through + unchanged): + existing_committed_anticipated_additional_generator_summary: + IASR ID / DLT names Power Station Technology Type + BW01 Bayswater Steam Sub Critical # generator, dropped + Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) + + returns: + name power_station technology + Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) + """ + logging.info("Creating a template for existing and planned storage") + summary = iasr_tables["existing_committed_anticipated_additional_generator_summary"] + phes_properties = iasr_tables[ + "pumped_hydro_existing_committed_anticipated_additional_properties" + ] + is_storage = _is_existing_planned_storage_row(summary, phes_properties) + storage = summary[is_storage].copy() + return storage.rename(columns=_SUMMARY_COLUMN_RENAMES) + + +# --- helpers --- + + +def _is_existing_planned_storage_row( + summary: pd.DataFrame, phes_properties: pd.DataFrame +) -> pd.Series: + """Boolean mask selecting storage rows: batteries plus stations with real PHES properties. + + Batteries and technology-labelled PHES (Borumba, Kidston, Snowy 2.0, Phoenix) are + matched by ``_is_storage_row`` (Technology Type). Two more existing PHES stations + — Wivenhoe, Shoalhaven — are labelled plain "Hydro" in the summary instead, so a + station also counts as PHES storage if it appears by name in ``phes_properties``. + + ``_validate_phes_routing`` raises if a ``phes_properties`` station's name + doesn't exist anywhere in the summary at all, with some known exceptions. + + I/O Example: + summary: + Power Station Technology Type + Wivenhoe Hydro # PHES by table presence + QEJP - Borumba Pumped Hydro (24hrs storage) # PHES by technology + Tarong Steam Sub Critical + Q8 Battery Battery Storage (2hrs storage) # Battery by technology + + phes_properties: + Power Station + Wivenhoe + Borumba + + returns: pd.Series([True, True, False, True]) + """ + is_storage = _is_storage_row(summary) | summary["Power Station"].isin( + phes_properties["Power Station"] + ) + _validate_phes_routing(summary, phes_properties) + return is_storage + + +def _validate_phes_routing( + summary: pd.DataFrame, phes_properties: pd.DataFrame +) -> None: + """Raises if a phes_properties station's name doesn't exist anywhere in the summary. + + Checked after correcting the known Borumba name mismatch + (``_BORUMBA_FULL_NAME_MAP``) and excusing the one known, documented gap + (``_KNOWN_UNMATCHED_PHES_STATIONS`` — Tumut 3's "Lower Tumut"). Any other + unmatched name means a real PHES station would otherwise be silently + misclassified as a generator. + + I/O Example: + summary: pd.DataFrame({"Power Station": ["Wivenhoe"]}) + phes_properties: pd.DataFrame({"Power Station": ["Wivenhoe"]}) + -> no error + + phes_properties: pd.DataFrame({"Power Station": ["Some New Station"]}) + -> raises ValueError listing ["Some New Station"] + """ + phes_stations = set( + phes_properties["Power Station"].replace(_BORUMBA_FULL_NAME_MAP) + ) + known_stations = set(summary["Power Station"]) | _KNOWN_UNMATCHED_PHES_STATIONS + unmatched = phes_stations - known_stations + if unmatched: + raise ValueError( + f"PHES properties station(s) not found in the summary: {sorted(unmatched)}" + ) diff --git a/src/ispypsa/templater/geography.py b/src/ispypsa/templater/geography.py index b05bc9c1..13f807f2 100644 --- a/src/ispypsa/templater/geography.py +++ b/src/ispypsa/templater/geography.py @@ -300,3 +300,23 @@ def _build_geo_region_lookup(sub_regional_geography: pd.DataFrame) -> dict[str, for region in set(sub_regional_geography["region_id"]): lookup[region] = region return lookup + + +def _map_geo_id_to_granularity( + geo_id: pd.Series, regional_granularity: str, sub_regional_geography: pd.DataFrame +) -> pd.Series: + """Maps rez/sub-region geo_ids to their region_id ("nem_regions") or "NEM" ("single_region"). + + I/O Example: + geo_id: pd.Series(["CNSW", "SNW"]) + regional_granularity: "nem_regions" + sub_regional_geography: + geo_id geo_type region_id + CNSW subregion NSW + SNW subregion NSW + + returns: pd.Series(["NSW", "NSW"]) + """ + if regional_granularity == "single_region": + return pd.Series(_SINGLE_REGION_ID, index=geo_id.index) + return geo_id.map(_build_geo_region_lookup(sub_regional_geography)) diff --git a/src/ispypsa/templater/helpers.py b/src/ispypsa/templater/helpers.py index 7590483f..d9d85348 100644 --- a/src/ispypsa/templater/helpers.py +++ b/src/ispypsa/templater/helpers.py @@ -431,6 +431,29 @@ def _is_storage_row( return _is_battery_row(df, col_to_check) | _is_pumped_hydro_row(df, col_to_check) +def _derive_phes_symmetric_efficiency(phes: pd.DataFrame) -> pd.DataFrame: + """Splits the round-trip 'round_trip_efficiency' (%) into charge and discharge legs. + + The IASR PHES tables give only a single round-trip efficiency. Assuming symmetric + legs, each one-way efficiency is its square root, so e.g. a 76% round trip becomes + ~87.2% charge and ~87.2% discharge (sqrt(0.76) ≈ 0.872). + + I/O Example: + phes: + name round_trip_efficiency + NQ Pumped Hydro-10h 76.0 + + returns (adds the two efficiency columns): + name round_trip_efficiency efficiency_charge efficiency_discharge + NQ Pumped Hydro-10h 76.0 87.18 87.18 + """ + phes = phes.copy() + one_way_efficiency = (phes["round_trip_efficiency"] / 100) ** 0.5 * 100 + phes["efficiency_charge"] = one_way_efficiency + phes["efficiency_discharge"] = one_way_efficiency + return phes + + def _standardise_storage_capitalisation(series: pd.Series) -> pd.Series: """ Standardises capitalisation of "storage" in a pandas Series. diff --git a/src/ispypsa/templater/new_entrants.py b/src/ispypsa/templater/new_entrants.py index ca0bea77..78c15b85 100644 --- a/src/ispypsa/templater/new_entrants.py +++ b/src/ispypsa/templater/new_entrants.py @@ -34,8 +34,9 @@ import pandas as pd -from ispypsa.templater.geography import _build_geo_region_lookup +from ispypsa.templater.geography import _map_geo_id_to_granularity from ispypsa.templater.helpers import ( + _derive_phes_symmetric_efficiency, _fuzzy_map_to_allowed_values, _is_battery_row, _is_pumped_hydro_row, @@ -45,7 +46,6 @@ from ispypsa.templater.mappings import ( _COMMON_NEW_ENTRANT_PROPERTY_MAP, _GENERATORS_NEW_ENTRANT_PROPERTY_MAP, - _SINGLE_REGION_ID, _STORAGE_BATTERY_PROPERTY_MAP, _STORAGE_PHES_PROPERTY_MAP, ) @@ -520,15 +520,6 @@ def _aggregate_by_geo_id( )[value_columns].mean() -def _map_geo_id_to_granularity( - geo_id: pd.Series, regional_granularity: str, sub_regional_geography: pd.DataFrame -) -> pd.Series: - """Maps sub-region geo_ids to their region_id ("nem_regions") or "NEM" ("single_region").""" - if regional_granularity == "single_region": - return pd.Series(_SINGLE_REGION_ID, index=geo_id.index) - return geo_id.map(_build_geo_region_lookup(sub_regional_geography)) - - def _name_collapsed_rows(collapsed: pd.DataFrame) -> pd.DataFrame: """Sets 'name' on merged rows to "{geo_id} {technology}". @@ -799,29 +790,6 @@ def _assert_botn_technology_expected(phes: pd.DataFrame) -> None: ) -def _derive_phes_symmetric_efficiency(phes: pd.DataFrame) -> pd.DataFrame: - """Splits the round-trip 'round_trip_efficiency' (%) into charge and discharge legs. - - The IASR PHES table gives only a single round-trip efficiency. Assuming symmetric - legs, each one-way efficiency is its square root, so e.g. a 76% round trip becomes - ~87.2% charge and ~87.2% discharge (sqrt(0.76) ≈ 0.872). - - I/O Example: - phes: - name round_trip_efficiency - NQ Pumped Hydro-10h 76.0 - - returns (adds the two efficiency columns): - name round_trip_efficiency efficiency_charge efficiency_discharge - NQ Pumped Hydro-10h 76.0 87.18 87.18 - """ - phes = phes.copy() - one_way_efficiency = (phes["round_trip_efficiency"] / 100) ** 0.5 * 100 - phes["efficiency_charge"] = one_way_efficiency - phes["efficiency_discharge"] = one_way_efficiency - return phes - - # --- generator-specific helpers --- diff --git a/tests/test_iasr_table_caching/test_local_cache.py b/tests/test_iasr_table_caching/test_local_cache.py index 91bd54d8..3fc82c10 100644 --- a/tests/test_iasr_table_caching/test_local_cache.py +++ b/tests/test_iasr_table_caching/test_local_cache.py @@ -27,6 +27,21 @@ def test_build_required_tables_new_format(): assert "connection_costs_for_wind_and_solar" in result assert "connection_costs_other" in result assert "efficient_level_of_system_strength_cost" in result + # ECAA generator summary and its per-property tables feed the + # generators_existing_planned / storage_existing_planned templaters + assert "existing_committed_anticipated_additional_generator_summary" in result + assert ( + "variable_opex_existing_committed_anticipated_additional_generators" in result + ) + assert "heat_rates_existing_committed_anticipated_additional_generators" in result + assert ( + "maximum_capacity_existing_committed_anticipated_additional_generators" + in result + ) + assert "gpg_min_stable_level_existing_generators" in result + assert "coal_minimum_stable_level" in result + assert "expected_closure_years" in result + assert "pumped_hydro_existing_committed_anticipated_additional_properties" in result # New entrant generator summary feeds the generators_new_entrant templater assert "new_entrants_summary" in result # Per-technology property tables merged into the new entrant generators template diff --git a/tests/test_templater/test_existing_planned.py b/tests/test_templater/test_existing_planned.py new file mode 100644 index 00000000..a765995b --- /dev/null +++ b/tests/test_templater/test_existing_planned.py @@ -0,0 +1,159 @@ +import pandas as pd +import pytest + +from ispypsa.templater.existing_planned import ( + _is_existing_planned_storage_row, + _template_generators_existing_planned, + _template_storage_existing_planned, + _validate_phes_routing, +) + +# --- _is_existing_planned_storage_row --- + + +def test_is_existing_planned_storage_row(csv_str_to_df): + summary = csv_str_to_df(""" + Power Station, Technology Type + Wivenhoe, Hydro + Tarong, Steam Sub Critical + Q8 Battery, Battery Storage (2hrs storage) + QEJP - Borumba, Pumped Hydro (24hrs storage) + """) + phes_properties = csv_str_to_df(""" + Power Station + Wivenhoe + Borumba + """) + + result = _is_existing_planned_storage_row(summary, phes_properties) + + # Wivenhoe routes to storage by PHES-table presence despite being labelled plain + # "Hydro"; Q8 Battery routes by technology; Tarong is neither; QEJP - Borumba + # routes by technology AND is matched to Borumba in phes_properties. + assert list(result) == [True, False, True, True] + + +def test_is_existing_planned_storage_row_empty_summary(): + summary = pd.DataFrame(columns=["Power Station", "Technology Type"]) + phes_properties = pd.DataFrame(columns=["Power Station"]) + + result = _is_existing_planned_storage_row(summary, phes_properties) + + assert list(result) == [] + + +def test_is_existing_planned_storage_row_empty_phes_properties(csv_str_to_df): + # Battery technologies still get correctly identified + summary = csv_str_to_df(""" + Power Station, Technology Type + Tarong, Steam Sub Critical + Q8 Battery, Battery Storage (2hrs storage) + """) + phes_properties = pd.DataFrame(columns=["Power Station"]) + + result = _is_existing_planned_storage_row(summary, phes_properties) + + assert list(result) == [False, True] + + +# --- _validate_phes_routing --- + + +def test_validate_phes_routing_tolerates_lower_tumut(csv_str_to_df): + # Tumut 3's pump/non-pump unit split means phes_properties' "Lower Tumut" never + # matches any Power Station name in the summary ("Tumut 3" covers all 6 units) + # -> known, no raise. + # Borumba<->QEJP - Borumba name difference gets mapped correctly -> no raise. + summary = csv_str_to_df(""" + Power Station, Technology Type + Tumut 3, Hydro + QEJP - Borumba, Pumped Hydro (24hrs storage) + Tarong, Steam Sub Critical + """) + phes_properties = csv_str_to_df(""" + Power Station + Lower Tumut + Borumba + """) + + _validate_phes_routing(summary, phes_properties) # no error + + +def test_validate_phes_routing_raises_on_unrecognised_station(csv_str_to_df): + summary = csv_str_to_df(""" + Power Station, Technology Type + Tumut 3, Hydro + QEJP - Borumba, Pumped Hydro (24hrs storage) + Tarong, Steam Sub Critical + """) + phes_properties = csv_str_to_df(""" + Power Station + Some New Station + """) + + with pytest.raises(ValueError, match=r"\['Some New Station'\]"): + _validate_phes_routing(summary, phes_properties) + + +# --- _template_generators_existing_planned / _template_storage_existing_planned --- + + +def test_template_generators_and_storage_existing_planned(csv_str_to_df): + # Wiring check: the split routes each row to exactly one table, and the spine + # columns are renamed. Every other summary column is expected to pass through + # unchanged — not asserted row-by-row here since none are added/removed yet. + summary = csv_str_to_df(""" + IASR ID / DLT names, Power Station, Technology Type + BW01, Bayswater, Steam Sub Critical + WHOE1, Wivenhoe, Hydro + Q8_BATT_2H, Q8 Battery, Battery Storage (2hrs storage) + """) + phes_properties = csv_str_to_df(""" + Power Station + Wivenhoe + """) + iasr_tables = { + "existing_committed_anticipated_additional_generator_summary": summary, + "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, + } + + generators = _template_generators_existing_planned(iasr_tables) + storage = _template_storage_existing_planned(iasr_tables) + + expected_generators = csv_str_to_df(""" + name, power_station, technology + BW01, Bayswater, Steam Sub Critical + """) + expected_storage = csv_str_to_df(""" + name, power_station, technology + WHOE1, Wivenhoe, Hydro + Q8_BATT_2H, Q8 Battery, Battery Storage (2hrs storage) + """) + pd.testing.assert_frame_equal( + generators.reset_index(drop=True), expected_generators + ) + pd.testing.assert_frame_equal(storage.reset_index(drop=True), expected_storage) + + +def test_template_generators_and_storage_existing_planned_empty(csv_str_to_df): + summary = pd.DataFrame( + columns=["IASR ID / DLT names", "Power Station", "Technology Type"] + ) + phes_properties = pd.DataFrame(columns=["Power Station"]) + iasr_tables = { + "existing_committed_anticipated_additional_generator_summary": summary, + "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, + } + + generators = _template_generators_existing_planned(iasr_tables) + storage = _template_storage_existing_planned(iasr_tables) + + expected = csv_str_to_df(""" + name, power_station, technology + """) + pd.testing.assert_frame_equal( + generators.reset_index(drop=True), expected, check_dtype=False + ) + pd.testing.assert_frame_equal( + storage.reset_index(drop=True), expected, check_dtype=False + ) diff --git a/tests/test_templater/test_geography.py b/tests/test_templater/test_geography.py index 04d46506..9fcbb743 100644 --- a/tests/test_templater/test_geography.py +++ b/tests/test_templater/test_geography.py @@ -2,10 +2,41 @@ from ispypsa.templater.geography import ( _extract_subregion_id, + _map_geo_id_to_granularity, _template_network_geography, ) +def test_map_geo_id_to_granularity_nem_regions(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + SNW, subregion, NSW + Q1, rez, QLD + """) + geo_id = pd.Series(["CNSW", "SNW", "Q1"]) + + result = _map_geo_id_to_granularity(geo_id, "nem_regions", sub_regional_geography) + + expected = pd.Series(["NSW", "NSW", "QLD"]) + pd.testing.assert_series_equal(result, expected) + + +def test_map_geo_id_to_granularity_single_region(csv_str_to_df): + # sub_regional_geography's content is irrelevant at "single_region" — every geo_id + # collapses to the constant "NEM" id without being looked up at all. + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + """) + geo_id = pd.Series(["CNSW", "Q1"]) + + result = _map_geo_id_to_granularity(geo_id, "single_region", sub_regional_geography) + + expected = pd.Series(["NEM", "NEM"]) + pd.testing.assert_series_equal(result, expected) + + def test_extract_subregion_id_with_comma_in_name(): series = pd.Series( ["Sydney, Newcastle, Wollongong (SNW)", "Northern Queensland (NQ)"] diff --git a/tests/test_templater/test_helpers.py b/tests/test_templater/test_helpers.py index 6d474501..46b493b5 100644 --- a/tests/test_templater/test_helpers.py +++ b/tests/test_templater/test_helpers.py @@ -2,6 +2,7 @@ import pytest from ispypsa.templater.helpers import ( + _derive_phes_symmetric_efficiency, _is_battery_row, _is_pumped_hydro_row, _is_storage_row, @@ -452,3 +453,23 @@ def test_is_storage_row(csv_str_to_df): # Battery, Distributed Resources Batteries and Pumped Hydro all match. # Solar thermal still does not. assert list(result) == [True, True, False, True, False] + + +# --- _derive_phes_symmetric_efficiency --- + + +def test_derive_phes_symmetric_efficiency(csv_str_to_df): + # A single round-trip efficiency becomes equal charge and discharge legs, each its + # square root: sqrt(0.81) = 0.9 -> 90.0%. + phes = csv_str_to_df(""" + name, round_trip_efficiency + NQ Pumped Hydro - 24h, 81.0 + """) + + result = _derive_phes_symmetric_efficiency(phes) + + expected = csv_str_to_df(""" + name, round_trip_efficiency, efficiency_charge, efficiency_discharge + NQ Pumped Hydro - 24h, 81.0, 90.0, 90.0 + """) + pd.testing.assert_frame_equal(result, expected, check_exact=False, rtol=1e-6) diff --git a/tests/test_templater/test_new_entrants.py b/tests/test_templater/test_new_entrants.py index 413dfaa6..fc14b8b9 100644 --- a/tests/test_templater/test_new_entrants.py +++ b/tests/test_templater/test_new_entrants.py @@ -11,7 +11,6 @@ _assert_build_cost_zone_matches_geo_id, _assert_table_valid, _collapse_geo_id_to_granularity, - _derive_phes_symmetric_efficiency, _group_by_source_key, _merge_lcf_build, _merge_lcf_om, @@ -443,23 +442,6 @@ def test_assert_botn_technology_expected_raises_on_unexpected_value(csv_str_to_d _assert_botn_technology_expected(phes) -def test_derive_phes_symmetric_efficiency(csv_str_to_df): - # A single round-trip efficiency becomes equal charge and discharge legs, each its - # square root: sqrt(0.91) ≈ 0.9 -> 90.0%. - phes = csv_str_to_df(""" - name, round_trip_efficiency - NQ Pumped Hydro - 24h, 81.0 - """) - - result = _derive_phes_symmetric_efficiency(phes) - - expected = csv_str_to_df(""" - name, round_trip_efficiency, efficiency_charge, efficiency_discharge - NQ Pumped Hydro - 24h, 81.0, 90.0, 90.0 - """) - pd.testing.assert_frame_equal(result, expected, check_exact=False, rtol=1e-6) - - def test_merge_phes_properties_empty(csv_str_to_df): # No PHES rows -> returns empty with the PHES-derived columns added. phes = pd.DataFrame(columns=["name", "technology"]) diff --git a/tests/test_workbook_table_cache/7.5/coal_minimum_stable_level.csv b/tests/test_workbook_table_cache/7.5/coal_minimum_stable_level.csv new file mode 100644 index 00000000..ac214e7b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/coal_minimum_stable_level.csv @@ -0,0 +1,45 @@ +IASR ID,Power Station,Technology Type,Minimum Stable Level (MW)_IASR 2023 (Backcasting),Minimum Stable Level (MW)_Typical Lowest Band,Minimum Stable Level (MW)_Minimum Continuous Operating Level +BW01,Bayswater,Steam Sub Critical,250,260,170 +BW02,Bayswater,Steam Sub Critical,250,200,170 +BW03,Bayswater,Steam Sub Critical,250,200,170 +BW04,Bayswater,Steam Sub Critical,250,200,170 +ER01,Eraring,Steam Sub Critical,210,182,180 +ER02,Eraring,Steam Sub Critical,210,182,180 +ER03,Eraring,Steam Sub Critical,210,182,180 +ER04,Eraring,Steam Sub Critical,210,182,180 +MP1,Mt Piper,Steam Sub Critical,270,220,150 +MP2,Mt Piper,Steam Sub Critical,270,220,150 +VP5,Vales Point B,Steam Sub Critical,250,200,180 +VP6,Vales Point B,Steam Sub Critical,250,200,180 +CALL_B_1,Callide B,Steam Sub Critical,155,180,140 +CALL_B_2,Callide B,Steam Sub Critical,155,180,140 +CPP_3,Callide C,Steam Super Critical,180,180,170 +CPP_4,Callide C,Steam Super Critical,180,180,126 +GSTONE1,Gladstone,Steam Sub Critical,110,110,110 +GSTONE2,Gladstone,Steam Sub Critical,110,110,110 +GSTONE3,Gladstone,Steam Sub Critical,110,110,110 +GSTONE4,Gladstone,Steam Sub Critical,110,110,110 +GSTONE5,Gladstone,Steam Sub Critical,110,110,110 +GSTONE6,Gladstone,Steam Sub Critical,110,110,110 +KPP_1,Kogan Creek,Steam Super Critical,330,320,180 +MPP_1,Millmerran,Steam Super Critical,200,180,160 +MPP_2,Millmerran,Steam Super Critical,200,180,160 +STAN-1,Stanwell,Steam Sub Critical,140,185,115 +STAN-2,Stanwell,Steam Sub Critical,140,170,115 +STAN-3,Stanwell,Steam Sub Critical,140,185,115 +STAN-4,Stanwell,Steam Sub Critical,140,185,115 +TARONG#1,Tarong,Steam Sub Critical,140,170,140 +TARONG#2,Tarong,Steam Sub Critical,140,170,140 +TARONG#3,Tarong,Steam Sub Critical,140,140,140 +TARONG#4,Tarong,Steam Sub Critical,140,140,140 +TNPS1,Tarong North,Steam Super Critical,180,200,180 +LOYYB1,Loy Yang B,Steam Sub Critical,320,240,200 +LOYYB2,Loy Yang B,Steam Sub Critical,320,240,200 +LYA1,Loy Yang A Power Station,Steam Sub Critical,300,250,210 +LYA2,Loy Yang A Power Station,Steam Sub Critical,300,250,210 +LYA3,Loy Yang A Power Station,Steam Sub Critical,300,250,210 +LYA4,Loy Yang A Power Station,Steam Sub Critical,300,250,210 +YWPS1,Yallourn W,Steam Sub Critical,200,200,200 +YWPS2,Yallourn W,Steam Sub Critical,200,200,200 +YWPS3,Yallourn W,Steam Sub Critical,200,220,200 +YWPS4,Yallourn W,Steam Sub Critical,200,220,200 diff --git a/tests/test_workbook_table_cache/7.5/expected_closure_years.csv b/tests/test_workbook_table_cache/7.5/expected_closure_years.csv new file mode 100644 index 00000000..52ed5688 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/expected_closure_years.csv @@ -0,0 +1,643 @@ +IASR ID,Power Station,Technology Type,Status,Expected Closure Year (Calendar year) +BW01,Bayswater,Steam Sub Critical,Existing,2033 +BW02,Bayswater,Steam Sub Critical,Existing,2033 +BW03,Bayswater,Steam Sub Critical,Existing,2033 +BW04,Bayswater,Steam Sub Critical,Existing,2033 +CALL_B_1,Callide B,Steam Sub Critical,Existing,2031 +CALL_B_2,Callide B,Steam Sub Critical,Existing,2031 +CPP_3,Callide C,Steam Super Critical,Existing,2051 +CPP_4,Callide C,Steam Super Critical,Existing,2051 +ER01,Eraring,Steam Sub Critical,Existing,2027 +ER02,Eraring,Steam Sub Critical,Existing,2027 +ER03,Eraring,Steam Sub Critical,Existing,2027 +ER04,Eraring,Steam Sub Critical,Existing,2027 +GSTONE1,Gladstone,Steam Sub Critical,Existing,2029 +GSTONE2,Gladstone,Steam Sub Critical,Existing,2029 +GSTONE3,Gladstone,Steam Sub Critical,Existing,2029 +GSTONE4,Gladstone,Steam Sub Critical,Existing,2029 +GSTONE5,Gladstone,Steam Sub Critical,Existing,2029 +GSTONE6,Gladstone,Steam Sub Critical,Existing,2029 +KPP_1,Kogan Creek,Steam Super Critical,Existing,2042 +MPP_1,Millmerran,Steam Super Critical,Existing,2051 +MPP_2,Millmerran,Steam Super Critical,Existing,2051 +MP1,Mt Piper,Steam Sub Critical,Existing,2040 +MP2,Mt Piper,Steam Sub Critical,Existing,2040 +STAN-1,Stanwell,Steam Sub Critical,Existing,2043 +STAN-2,Stanwell,Steam Sub Critical,Existing,2044 +STAN-3,Stanwell,Steam Sub Critical,Existing,2045 +STAN-4,Stanwell,Steam Sub Critical,Existing,2046 +TARONG#1,Tarong,Steam Sub Critical,Existing,2036 +TARONG#2,Tarong,Steam Sub Critical,Existing,2036 +TARONG#3,Tarong,Steam Sub Critical,Existing,2037 +TARONG#4,Tarong,Steam Sub Critical,Existing,2037 +TNPS1,Tarong North,Steam Super Critical,Existing,2037 +VP5,Vales Point B,Steam Sub Critical,Existing,2033 +VP6,Vales Point B,Steam Sub Critical,Existing,2033 +LYA1,Loy Yang A Power Station,Steam Sub Critical,Existing,2035 +LYA2,Loy Yang A Power Station,Steam Sub Critical,Existing,2035 +LYA3,Loy Yang A Power Station,Steam Sub Critical,Existing,2035 +LYA4,Loy Yang A Power Station,Steam Sub Critical,Existing,2035 +LOYYB1,Loy Yang B,Steam Sub Critical,Existing,2047 +LOYYB2,Loy Yang B,Steam Sub Critical,Existing,2047 +YWPS1,Yallourn W,Steam Sub Critical,Existing,2028 +YWPS2,Yallourn W,Steam Sub Critical,Existing,2028 +YWPS3,Yallourn W,Steam Sub Critical,Existing,2028 +YWPS4,Yallourn W,Steam Sub Critical,Existing,2028 +ANGAS1,Angaston,Reciprocating engine,Existing,2070 +ANGAS2,Angaston,Reciprocating engine,Existing,2070 +BDL01,Bairnsdale,OCGT (small GT),Existing,2042 +BDL02,Bairnsdale,OCGT (small GT),Existing,2042 +BARCALDN,Barcaldine Power Station,OCGT (small GT),Existing,2034 +BIPS1_01,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_02,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_03,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_04,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_05,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_06,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_07,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_08,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_09,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_10,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_11,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BIPS1_12,Barker Inlet Power Station,Reciprocating engine,Existing,2044 +BBTHREE1,Bell Bay Three,OCGT (large GT),Existing,2040 +BBTHREE2,Bell Bay Three,OCGT (large GT),Existing,2040 +BBTHREE3,Bell Bay Three,OCGT (large GT),Existing,2040 +BOLIVPS1_1,Bolivar Power Station,OCGT (small GT),Existing,2045 +BOLIVPS1_2,Bolivar Power Station,OCGT (small GT),Existing,2045 +BOLIVPS1_3,Bolivar Power Station,OCGT (small GT),Existing,2045 +BOLIVPS1_4,Bolivar Power Station,OCGT (small GT),Existing,2045 +BRAEMAR1,Braemar,OCGT (large GT),Existing,2046 +BRAEMAR2,Braemar,OCGT (large GT),Existing,2046 +BRAEMAR3,Braemar,OCGT (large GT),Existing,2046 +BRAEMAR5,Braemar 2 Power Station,OCGT (large GT),Existing,2049 +BRAEMAR6,Braemar 2 Power Station,OCGT (large GT),Existing,2049 +BRAEMAR7,Braemar 2 Power Station,OCGT (large GT),Existing,2049 +CG1,Colongra,OCGT (small GT),Existing,2070 +CG2,Colongra,OCGT (small GT),Existing,2070 +CG3,Colongra,OCGT (small GT),Existing,2070 +CG4,Colongra,OCGT (small GT),Existing,2070 +CPSA_GT1,Condamine A,CCGT - Gas Turbine,Existing,2039 +CPSA_GT2,Condamine A,CCGT - Gas Turbine,Existing,2039 +CPSA_ST,Condamine A,CCGT - Steam Turbine,Existing,2039 +DDPS1_GT1,Darling Downs,CCGT - Gas Turbine,Existing,2045 +DDPS1_GT2,Darling Downs,CCGT - Gas Turbine,Existing,2045 +DDPS1_GT3,Darling Downs,CCGT - Gas Turbine,Existing,2045 +DDPS1_ST,Darling Downs,CCGT - Steam Turbine,Existing,2045 +DRYCGT1,Dry Creek GT,OCGT (small GT),Existing,2030 +DRYCGT2,Dry Creek GT,OCGT (small GT),Existing,2030 +DRYCGT3,Dry Creek GT,OCGT (small GT),Existing,2030 +AGLHAL01,Hallett GT,OCGT (small GT),Existing,2036 +AGLHAL02,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL03,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL04,Hallett GT,OCGT (small GT),Existing,2036 +AGLHAL05,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL06,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL07,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL08,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL09,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL10,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL11,Hallett GT,OCGT (small GT),Existing,2040 +AGLHAL12,Hallett GT,OCGT (small GT),Existing,2040 +AGLHALRE,Hallett GT,OCGT (small GT),Existing,2050 +HEZ1,Hunter Economic Zone,Reciprocating engine,Existing,2036 +JLA01,Jeeralang A,OCGT (small GT),Existing,2039 +JLA02,Jeeralang A,OCGT (small GT),Existing,2039 +JLA03,Jeeralang A,OCGT (small GT),Existing,2039 +JLA04,Jeeralang A,OCGT (small GT),Existing,2039 +JLB01,Jeeralang B,OCGT (small GT),Existing,2039 +JLB02,Jeeralang B,OCGT (small GT),Existing,2039 +JLB03,Jeeralang B,OCGT (small GT),Existing,2039 +LADBROK1,Ladbroke Grove,OCGT (small GT),Existing,2035 +LADBROK2,Ladbroke Grove,OCGT (small GT),Existing,2035 +LNGS1,Laverton North,OCGT (large GT),Existing,2070 +LNGS2,Laverton North,OCGT (large GT),Existing,2070 +LONSDALE,Lonsdale,Reciprocating engine,Existing,2070 +MINTARO,Mintaro GT,OCGT (small GT),Existing,2030 +MORTLK11,Mortlake,OCGT (large GT),Existing,2047 +MORTLK12,Mortlake,OCGT (large GT),Existing,2047 +MSTUART1,Mt Stuart,OCGT (small GT),Existing,2033 +MSTUART2,Mt Stuart,OCGT (small GT),Existing,2033 +MSTUART3,Mt Stuart,OCGT (small GT),Existing,2044 +NPS,Newport,CCGT - Steam Turbine,Existing,2039 +OAKEY1,Oakey Power Station,OCGT (large GT),Existing,2050 +OAKEY2,Oakey Power Station,OCGT (large GT),Existing,2050 +OsborneGT,Osborne,CCGT - Gas Turbine,Existing,2027 +OsborneST,Osborne,CCGT - Steam Turbine,Existing,2027 +PPCCGTGT1,Pelican Point,CCGT - Gas Turbine,Existing,2037 +PPCCGTGT2,Pelican Point,CCGT - Gas Turbine,Existing,2037 +PPCCGTST,Pelican Point,CCGT - Steam Turbine,Existing,2037 +POR01-1,Port Lincoln GT,OCGT (small GT),Existing,2028 +POR01-2,Port Lincoln GT,OCGT (small GT),Existing,2028 +POR01-3,Port Lincoln GT,OCGT (small GT),Existing,2028 +PTSTAN1_1,Port Stanvac 1,Reciprocating engine,Existing,2070 +PTSTAN1_2,Port Stanvac 1,Reciprocating engine,Existing,2070 +QPS1,Quarantine,OCGT (small GT),Existing,2053 +QPS2,Quarantine,OCGT (small GT),Existing,2054 +QPS3,Quarantine,OCGT (small GT),Existing,2054 +QPS4,Quarantine,OCGT (small GT),Existing,2055 +QPS5,Quarantine,OCGT (small GT),Existing,2044 +ROMA_7,Roma,OCGT (small GT),Existing,2034 +ROMA_8,Roma,OCGT (small GT),Existing,2034 +SITHE01,Smithfield Energy Facility,OCGT (small GT),Existing,2044 +SNAPPER1_1,Snapper Point Power Station,OCGT (small GT),Existing,2046 +SNAPPER1_2,Snapper Point Power Station,OCGT (small GT),Existing,2046 +SNAPPER1_3,Snapper Point Power Station,OCGT (small GT),Existing,2046 +SNAPPER1_4,Snapper Point Power Station,OCGT (small GT),Existing,2046 +SNAPPER1_5,Snapper Point Power Station,OCGT (small GT),Existing,2046 +SNUG1,Snuggery,OCGT (small GT),Existing,2028 +SNUG2,Snuggery,OCGT (small GT),Existing,2028 +SNUG3,Snuggery,OCGT (small GT),Existing,2028 +AGLSOM01,Somerton,OCGT (small GT),Existing,2033 +AGLSOM02,Somerton,OCGT (small GT),Existing,2033 +AGLSOM03,Somerton,OCGT (small GT),Existing,2033 +AGLSOM04,Somerton,OCGT (small GT),Existing,2033 +SWAN_E,Swanbank E GT,CCGT,Existing,2036 +TALWA1,Tallawarra,CCGT,Existing,2043 +Tallawarra B,Tallawarra B,OCGT (large GT),Existing,2053 +TVCC201_GT,Tamar Valley Combined Cycle,CCGT - Gas Turbine,Existing,2050 +TVCC201_ST,Tamar Valley Combined Cycle,CCGT - Steam Turbine,Existing,2050 +TVPP104,Tamar Valley Peaking,OCGT (large GT),Existing,2050 +TORRB1,Torrens Island B,CCGT - Steam Turbine,Existing,2026 +TORRB2,Torrens Island B,CCGT - Steam Turbine,Existing,2026 +TORRB3,Torrens Island B,CCGT - Steam Turbine,Existing,2026 +TORRB4,Torrens Island B,CCGT - Steam Turbine,Existing,2026 +YABULU,Townsville Power Station,CCGT - Gas Turbine,Existing,2046 +YABULU2,Townsville Power Station,CCGT - Steam Turbine,Existing,2046 +URANQ11,Uranquinty,OCGT (large GT),Existing,2044 +URANQ12,Uranquinty,OCGT (large GT),Existing,2044 +URANQ13,Uranquinty,OCGT (large GT),Existing,2044 +URANQ14,Uranquinty,OCGT (large GT),Existing,2044 +VPGS1,Valley Power,OCGT (small GT),Existing,2070 +VPGS2,Valley Power,OCGT (small GT),Existing,2070 +VPGS3,Valley Power,OCGT (small GT),Existing,2070 +VPGS4,Valley Power,OCGT (small GT),Existing,2070 +VPGS5,Valley Power,OCGT (small GT),Existing,2070 +VPGS6,Valley Power,OCGT (small GT),Existing,2070 +YARWUN_1,Yarwun Cogen,CCGT,Existing,2050 +BARRON-1,Barron Gorge,Hydro,Existing,2063 +BARRON-2,Barron Gorge,Hydro,Existing,2063 +BASTYAN,Bastyan,Hydro,Existing,2100 +BLOWERNG,Blowering,Hydro,Existing,2070 +BOGONG1,Bogong / Mackay,Hydro,Existing,2057 +BOGONG2,Bogong / Mackay,Hydro,Existing,2057 +MCKAY11,Bogong / Mackay,Hydro,Existing,2057 +MCKAY12,Bogong / Mackay,Hydro,Existing,2057 +MCKAY13,Bogong / Mackay,Hydro,Existing,2057 +MCKAY14,Bogong / Mackay,Hydro,Existing,2057 +MCKAY15,Bogong / Mackay,Hydro,Existing,2057 +MCKAY16,Bogong / Mackay,Hydro,Existing,2057 +LI111-1,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +LI112-2,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +LI113-3,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +CA111-1,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +CA112-2,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +WY111-1,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +WY111-2,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +WY111-3,Catagunya / Liapootah / Wayatinah,Hydro,Existing,2100 +CETHANA,Cethana,Hydro,Existing,2100 +DARTM1,Dartmouth,Hydro,Existing,2057 +DEVILS_G,Devils Gate,Hydro,Existing,2100 +EILDON1,Eildon,Hydro,Existing,2057 +EILDON2,Eildon,Hydro,Existing,2057 +FISHER,Fisher,Hydro,Existing,2100 +GO181-1,Gordon,Hydro,Existing,2100 +GO182-2,Gordon,Hydro,Existing,2100 +GO183-3,Gordon,Hydro,Existing,2100 +GUTHEGA1,Guthega,Hydro,Existing,2070 +GUTHEGA2,Guthega,Hydro,Existing,2070 +HUMENSW,Hume Dam NSW,Hydro,Existing,2057 +HUMEV,Hume Dam VIC,Hydro,Existing,2057 +JBUTTERS,John Butters,Hydro,Existing,2100 +KAREEYA1,Kareeya,Hydro,Existing,2057 +KAREEYA2,Kareeya,Hydro,Existing,2057 +KAREEYA3,Kareeya,Hydro,Existing,2057 +KAREEYA4,Kareeya,Hydro,Existing,2057 +LK_ECHO,Lake Echo,Hydro,Existing,2100 +LM111-1,Lemonthyme / Wilmot,Hydro,Existing,2100 +WI111-1,Lemonthyme / Wilmot,Hydro,Existing,2100 +MACKNTSH,Mackintosh,Hydro,Existing,2100 +MEADOWBK,Meadowbank,Hydro,Existing,2100 +MURRAY01,Murray 1,Hydro,Existing,2070 +MURRAY02,Murray 1,Hydro,Existing,2070 +MURRAY03,Murray 1,Hydro,Existing,2070 +MURRAY04,Murray 1,Hydro,Existing,2070 +MURRAY05,Murray 1,Hydro,Existing,2070 +MURRAY06,Murray 1,Hydro,Existing,2070 +MURRAY07,Murray 1,Hydro,Existing,2070 +MURRAY08,Murray 1,Hydro,Existing,2070 +MURRAY09,Murray 1,Hydro,Existing,2070 +MURRAY10,Murray 1,Hydro,Existing,2070 +MURRAY11,Murray 2,Hydro,Existing,2070 +MURRAY12,Murray 2,Hydro,Existing,2070 +MURRAY13,Murray 2,Hydro,Existing,2070 +MURRAY14,Murray 2,Hydro,Existing,2070 +PO161-1,Poatina,Hydro,Existing,2100 +PO162-2,Poatina,Hydro,Existing,2100 +PO163-3,Poatina,Hydro,Existing,2100 +PO164-4,Poatina,Hydro,Existing,2100 +PO165-5,Poatina,Hydro,Existing,2100 +PO166-6,Poatina,Hydro,Existing,2100 +REECE1,Reece,Hydro,Existing,2100 +REECE2,Reece,Hydro,Existing,2100 +SHGEN01,Shoalhaven,Hydro,Existing,2069 +SHGEN02,Shoalhaven,Hydro,Existing,2069 +SHGEN03,Shoalhaven,Hydro,Existing,2069 +SHGEN04,Shoalhaven,Hydro,Existing,2069 +TA111-1,Tarraleah,Hydro,Existing,2100 +TA111-2,Tarraleah,Hydro,Existing,2100 +TA111-3,Tarraleah,Hydro,Existing,2100 +TA112-4,Tarraleah,Hydro,Existing,2100 +TA112-5,Tarraleah,Hydro,Existing,2100 +TA112-6,Tarraleah,Hydro,Existing,2100 +TR111-1,Trevallyn,Hydro,Existing,2100 +TR111-2,Trevallyn,Hydro,Existing,2100 +TR112-3,Trevallyn,Hydro,Existing,2100 +TR112-4,Trevallyn,Hydro,Existing,2100 +TRIBUTE,Tribute,Hydro,Existing,2100 +TUMUT3_01,Tumut 3,Hydro,Existing,2070 +TUMUT3_02,Tumut 3,Hydro,Existing,2070 +TUMUT3_03,Tumut 3,Hydro,Existing,2070 +TUMUT3_04,Tumut 3,Hydro,Existing,2070 +TUMUT3_05,Tumut 3,Hydro,Existing,2070 +TUMUT3_06,Tumut 3,Hydro,Existing,2070 +TU111-1,Tungatinah,Hydro,Existing,2100 +TU112-2,Tungatinah,Hydro,Existing,2100 +TU113-3,Tungatinah,Hydro,Existing,2100 +TU114-4,Tungatinah,Hydro,Existing,2100 +TU115-5,Tungatinah,Hydro,Existing,2100 +TUMUT1_01,Upper Tumut,Hydro,Existing,2070 +TUMUT1_02,Upper Tumut,Hydro,Existing,2070 +TUMUT1_03,Upper Tumut,Hydro,Existing,2070 +TUMUT1_04,Upper Tumut,Hydro,Existing,2070 +TUMUT2_01,Upper Tumut,Hydro,Existing,2070 +TUMUT2_02,Upper Tumut,Hydro,Existing,2070 +TUMUT2_03,Upper Tumut,Hydro,Existing,2070 +TUMUT2_04,Upper Tumut,Hydro,Existing,2070 +WKIEWA1_1,West Kiewa,Hydro,Existing,2057 +WKIEWA1_2,West Kiewa,Hydro,Existing,2057 +WKIEWA2_1,West Kiewa,Hydro,Existing,2057 +WKIEWA2_2,West Kiewa,Hydro,Existing,2057 +W/HOE#1,Wivenhoe,Hydro,Existing,2084 +W/HOE#2,Wivenhoe,Hydro,Existing,2084 +BANN1,Bannerton Solar Park,Large scale Solar PV,Existing,2049 +BERYLSF1,Beryl Solar Farm,Large scale Solar PV,Existing,2049 +BOWWPV1,Bolivar Waste Water Treatment Solar Farm,Large scale Solar PV,Existing,2045 +BOMENSF1,Bomen Solar Farm,Large scale Solar PV,Existing,2050 +BROKENH1,Broken Hill Solar Farm,Large scale Solar PV,Existing,2043 +BNGSF1,Bungala One Solar Farm,Large scale Solar PV,Existing,2044 +BNGSF2,Bungala Two Solar Farm,Large scale Solar PV,Existing,2044 +CHILDSF1,Childers Solar Farm,Large scale Solar PV,Existing,2049 +CLARESF1,Clare Solar Farm,Large scale Solar PV,Existing,2047 +CLERMSF1,Clermont Solar Farm,Large scale Solar PV,Existing,2049 +COLEASF1,Coleambally Solar Farm,Large scale Solar PV,Existing,2043 +CSPVPS1,Collinsville Solar Farm,Large scale Solar PV,Existing,2044 +DDSF1,Darling Downs Solar Farm,Large scale Solar PV,Existing,2036 +DARLSF1,Darlington Point Solar Farm,Large scale Solar PV,Existing,2055 +DAYDSF1,Daydream Solar Farm,Large scale Solar PV,Existing,2048 +EMERASF1,Emerald Solar Farm,Large scale Solar PV,Existing,2048 +FINLYSF1,Finley Solar Farm,Large scale Solar PV,Existing,2049 +GANNSF1,Gannawarra Solar Farm,Large scale Solar PV,Existing,2048 +GLENSF1,Glenrowan Solar Farm,Large scale Solar PV,Existing,2053 +GLRWNSF1,Glenrowan West Solar Farm,Large scale Solar PV,Existing,2051 +GOONSF1,Goonumbla Solar Farm,Large scale Solar PV,Existing,2050 +GULLRSF1,Gullen Range Solar Farm,Large scale Solar PV,Existing,2100 +GNNDHSF1,Gunnedah Solar Farm,Large scale Solar PV,Existing,2056 +HAMISF1,Hamilton Solar Farm,Large scale Solar PV,Existing,2048 +HVWWPV1,Happy Valley Reservoir,Large scale Solar PV,Existing,2041 +HAUGHT11,Haughton Solar Farm,Large scale Solar PV,Existing,2050 +HAYMSF1,Hayman Solar Farm,Large scale Solar PV,Existing,2048 +HILLSTN1,Hillston Sun Farm,Large scale Solar PV,Existing,2046 +HUGSF1,Hughenden Solar Farm,Large scale Solar PV,Existing,2048 +JEMALNG1,Jemalong Solar,Large scale Solar PV,Existing,2050 +JUNEESF1,Junee Solar Farm,Large scale Solar PV,Existing,2050 +KARSF1,Karadoc Solar Farm,Large scale Solar PV,Existing,2048 +KIAMSF1,Kiamal Solar Farm stage 1,Large scale Solar PV,Existing,2049 +KSP1,Kidston Solar Farm,Large scale Solar PV,Existing,2037 +LILYSF1,Lilyvale Solar Farm,Large scale Solar PV,Existing,2048 +LIMOSF11,Limondale Solar Farm 1,Large scale Solar PV,Existing,2050 +LIMOSF21,Limondale Solar Farm 2,Large scale Solar PV,Existing,2050 +LRSF1,Longreach Solar Farm,Large scale Solar PV,Existing,2043 +MANSLR1,Manildra Solar Farm,Large scale Solar PV,Existing,2048 +MAPS2PV1,Mannum Adelaide Pumping Station No 2 - MAPL2 (Palmer),Large scale Solar PV,Existing,2041 +MAPS3PV1,Mannum Adelaide Pumping Station No 3 - MAPL3 (Tungkillo),Large scale Solar PV,Existing,2041 +MARYRSF1,Maryrorough Solar Farm,Large scale Solar PV,Existing,2048 +MIDDLSF1,Middlemount Solar Farm,Large scale Solar PV,Existing,2050 +MOLNGSF1,Molong Solar Farm,Large scale Solar PV,Existing,2045 +MOREESF1,Moree Solar Farm,Large scale Solar PV,Existing,2046 +MWPS1PV1,Morgan To Whyalla Pipeline No 1 PS And Water Filtration Plant,Large scale Solar PV,Existing,2031 +MWPS2PV1,Morgan To Whyalla Pipeline No 2 PS,Large scale Solar PV,Existing,2041 +MWPS3PV1,Morgan To Whyalla Pipeline No 3 PS,Large scale Solar PV,Existing,2045 +MWPS4PV1,Morgan To Whyalla Pipeline No 4 PS,Large scale Solar PV,Existing,2041 +MOUSF1,Moura Solar Farm,Large scale Solar PV,Existing,2057 +MBPS2PV1,Murray Bridge - Onkaparinga Pipeline Pump 2,Large scale Solar PV,Existing,2041 +NEVERSF1,Nevertire Solar Farm,Large scale Solar PV,Existing,2049 +NEWENSF1,New England Solar Farm,Large scale Solar PV,Existing,2073 +NEWENSF2,New England Solar Farm,Large scale Solar PV,Existing,2073 +NUMURSF1,Numurkah Solar Farm,Large scale Solar PV,Existing,2044 +NYNGAN1,Nyngan Solar Plant,Large scale Solar PV,Existing,2042 +OAKEY1SF,Oakey 1 Solar Farm,Large scale Solar PV,Existing,2043 +OAKEY2SF,Oakey 2 Solar Farm,Large scale Solar PV,Existing,2049 +PARSF1,Parkes Solar Farm,Large scale Solar PV,Existing,2042 +PAREPS1,Port Augusta Renewable Energy Park - Solar,Large scale Solar PV,Existing,2047 +RRSF1,Ross River Solar Farm,Large scale Solar PV,Existing,2043 +RUGBYR1,Rugby Run Solar Farm,Large scale Solar PV,Existing,2049 +SMCSF1,Sun Metals Corporation Solar Farm,Large scale Solar PV,Existing,2042 +SUNRSF1,Sunraysia Solar Farm,Large scale Solar PV,Existing,2049 +SUNTPSF1,Suntop Solar Farm,Large scale Solar PV,Existing,2056 +SRSF1,Susan River Solar Farm,Large scale Solar PV,Existing,2049 +TBSF1,Tailem Bend Solar Farm,Large scale Solar PV,Existing,2049 +WARWSF1,Warwick Solar Farm - stage 1,Large scale Solar PV,Existing,2046 +WARWSF2,Warwick Solar Farm - stage 2,Large scale Solar PV,Existing,2045 +WELLSF1,Wellington Solar Farm,Large scale Solar PV,Existing,2051 +WEMENSF1,Wemen Solar Farm,Large scale Solar PV,Existing,2049 +WSTWYSF1,West Wyalong Solar Farm,Large scale Solar PV,Existing,2058 +WDGPH1,Western Downs Green Power Hub,Large scale Solar PV,Existing,2046 +WRSF1,White Rock Solar Farm,Large scale Solar PV,Existing,2043 +WHITSF1,Whitsunday Solar Farm,Large scale Solar PV,Existing,2048 +WINTSF1,Winton Solar Farm,Large scale Solar PV,Existing,2051 +WOOLGSF1,Woolooga Solar Farm,Large scale Solar PV,Existing,2058 +YARANSF1,Yarranlea Solar Farm,Large scale Solar PV,Existing,2044 +YATSF1,Yatpool Solar Farm,Large scale Solar PV,Existing,2050 +ARWF1,Ararat Wind Farm,Wind,Existing,2047 +BALDHWF1,Bald Hills Wind Farm,Wind,Existing,2040 +BANGOWF1,Bango 973 Wind Farm,Wind,Existing,2045 +BANGOWF2,Bango 999 Wind Farm,Wind,Existing,2045 +BRYB1WF1,Berrybank Wind Farm,Wind,Existing,2050 +BRYB2WF2,Berrybank Wind Farm,Wind,Existing,2052 +BOCORWF1,Boco Rock Wind Farm,Wind,Existing,2040 +BODWF1,Bodangora Wind Farm,Wind,Existing,2049 +BULGANA1,Bulgana Green Power Hub - Wind Farm,Wind,Existing,2049 +CNUNDAWF,Canunda Wind Farm,Wind,Existing,2035 +CAPTL_WF,Capital Wind Farm,Wind,Existing,2040 +CATHROCK,Cathedral Rocks Wind Farm,Wind,Existing,2030 +CTHLWF1,Cattle Hill Wind Farm,Wind,Existing,2044 +CHALLHWF,Challicum Hills Wind Farm,Wind,Existing,2030 +CHYTWF1,Cherry Tree Wind Farm,Wind,Existing,2050 +CLEMGPWF,Clements Gap Wind Farm,Wind,Existing,2039 +COLWF01,Collector Wind Farm,Wind,Existing,2046 +COOPGWF1,Coopers Gap Wind Farm,Wind,Existing,2044 +CROOKWF2,Crookwell 2 Wind Farm,Wind,Existing,2043 +CROWLWF1,Crowlands Wind Farm,Wind,Existing,2044 +CRURWF1,Crudine Ridge Wind Farm,Wind,Existing,2041 +CULLRGWF,Cullerin Range Wind Farm,Wind,Existing,2038 +DULAWF1,Dulacca Wind Farm,Wind,Existing,2053 +DUNDWF1,Dundonnell Wind Farm,Wind,Existing,2045 +DUNDWF2,Dundonnell Wind Farm,Wind,Existing,2045 +DUNDWF3,Dundonnell Wind Farm,Wind,Existing,2045 +ELAINWF1,Elaine Wind Farm,Wind,Existing,2049 +GRANWF1,Granville Harbour Wind Farm,Wind,Existing,2055 +GULLRWF1,Gullen Range Wind Farm,Wind,Existing,2100 +GULLRWF2,Gullen Range Wind Farm 2,Wind,Existing,2120 +GUNNING1,Gunning Wind Farm,Wind,Existing,2036 +NBHWF1,Hallett 4 North Brown Hill Wind Farm,Wind,Existing,2036 +BLUFF1,Hallett 5 The Bluff Wind Farm,Wind,Existing,2036 +HALLWF1,Hallett Stage 1 Brown Hill Wind Farm,Wind,Existing,2043 +HALLWF2,Hallett Stage 2 Hallett Hill Wind Farm,Wind,Existing,2035 +HDWF1,Hornsdale Wind Farm Stage 1,Wind,Existing,2056 +HDWF2,Hornsdale Wind Farm Stage 2,Wind,Existing,2057 +HDWF3,Hornsdale Wind Farm Stage 3,Wind,Existing,2057 +KIATAWF1,Kiata Wind Farm,Wind,Existing,2042 +LKBONNY1,Lake Bonney 1 Wind Farm,Wind,Existing,2035 +LKBONNY2,Lake Bonney 2 Wind Farm,Wind,Existing,2038 +LKBONNY3,Lake Bonney 3 Wind Farm,Wind,Existing,2040 +LGAPWF1,Lincoln Gap Wind Farm - stage 1,Wind,Existing,2045 +LGAPWF2,Lincoln Gap Wind Farm - stage 2,Wind,Existing,2045 +MACARTH1,Macarthur Wind Farm,Wind,Existing,2038 +MOORAWF1,Moorabool Wind Farm,Wind,Existing,2044 +MRTLSWF1,Mortlake South Wind Farm,Wind,Existing,2047 +MLWF1,Mortons Lane Wind Farm,Wind,Existing,2042 +MEWF1,Mount Emerald Wind Farm,Wind,Existing,2043 +MTMILLAR,Mount Millar Wind Farm,Wind,Existing,2035 +MERCER01,Mt Mercer Wind Farm,Wind,Existing,2043 +MUWAWF1,Murra Warra Wind Farm - stage 1,Wind,Existing,2049 +MUWAWF2,Murra Warra Wind Farm - stage 2,Wind,Existing,2052 +MUSSELR1,Musselroe Wind Farm,Wind,Existing,2050 +OAKLAND1,Oaklands Hill Wind Farm,Wind,Existing,2037 +PAREPW1,Port Augusta Renewable Energy Park - Wind,Wind,Existing,2052 +PORTWF,Portland Wind Farm,Wind,Existing,2040 +SALTCRK1,Salt Creek Wind Farm,Wind,Existing,2043 +SAPHWF1,Sapphire Wind Farm,Wind,Existing,2043 +STWF1,Silverton Wind Farm,Wind,Existing,2043 +SNOWNTH1,Snowtown S2 Wind Farm,Wind,Existing,2039 +SNOWSTH1,Snowtown S2 Wind Farm,Wind,Existing,2039 +SNOWTWN1,Snowtown Wind Farm,Wind,Existing,2033 +STARHLWF,Starfish Hill Wind Farm,Wind,Existing,2033 +STOCKYD1,Stockyard Hill Wind Farm,Wind,Existing,2045 +TARALGA1,Taralga Wind Farm,Wind,Existing,2040 +WATERLWF,Waterloo Wind Farm,Wind,Existing,2051 +WPWF,Wattle Point Wind Farm,Wind,Existing,2031 +WAUBRAWF,Waubra Wind Farm,Wind,Existing,2034 +WRWF1,White Rock Wind Farm - Stage 1,Wind,Existing,2038 +WGWF1,Willogoleche Wind Farm,Wind,Existing,2043 +WOODLWN1,Woodlawn Wind Farm,Wind,Existing,2041 +WOOLNTH1,Woolnorth Wind Farm,Wind,Existing,2050 +YSWF1,Yaloak South Wind Farm,Wind,Existing,2047 +YAMBUKWF,Yambuk Wind Farm,Wind,Existing,2031 +YENDWF1,Yendon Wind Farm,Wind,Existing,2049 +Tully Sugar Mill Biomass,Tully Sugar Mill Biomass,Biomass,Existing,2050 +HUNTER1,Hunter Power Station,OCGT (large GT),Committed,2064 +HUNTER2,Hunter Power Station,OCGT (large GT),Committed,2064 +Kidston Pumped Storage Hydro 1,Kidston,Pumped Hydro (10hrs storage),Committed,2105 +Kidston Pumped Storage Hydro 2,Kidston,Pumped Hydro (10hrs storage),Committed,2105 +SNO2PH01,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +SNO2PH02,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +SNO2PH03,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +SNO2PH04,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +SNO2PH05,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +SNO2PH06,Snowy 2.0,Pumped Hydro (1wk storage),Committed,2129 +ADPPV1,Adelaide Desalination Plant Solar Farm,Large scale Solar PV,Committed,2041 +AVLSF1,Avonlie Solar Farm,Large scale Solar PV,Committed,2058 +BLUEGSF1,Bluegrass Solar Farm,Large scale Solar PV,Committed,2057 +Broadsound Solar Farm,Broadsound Solar Farm,Large scale Solar PV,Committed,2056 +Bundaberg Solar Farm,Bundaberg Solar Farm,Large scale Solar PV,Committed,2055 +COHUNSF1,Cohuna Solar Farm,Large scale Solar PV,Committed,2045 +COLUMSF1,Columboola Solar Farm,Large scale Solar PV,Committed,2046 +CRWASF1,Corowa Solar Farm,Large scale Solar PV,Committed,2051 +Culcairn Solar Farm,Culcairn Solar Farm,Large scale Solar PV,Committed,2060 +EDENVSF1,Edenvale Solar Park,Large scale Solar PV,Committed,2053 +GANGARR1,Gangarri Solar Farm,Large scale Solar PV,Committed,2051 +GIRGSF,Girgarre Solar Farm,Large scale Solar PV,Committed,2054 +Goorambat East Solar Farm,Goorambat East Solar Farm,Large scale Solar PV,Committed,2061 +KEPSF1,Kennedy Energy Park Solar Farm,Large scale Solar PV,Committed,2046 +KINGASF1,Kingaroy Solar Farm,Large scale Solar PV,Committed,2050 +Lockhart Hybrid Facility - Solar,Lockhart Hybrid Facility - Solar,Large scale Solar PV,Committed,2056 +MANSF2,Mannum Solar Farm 2,Large scale Solar PV,Committed,2058 +METZSF1,Metz Solar Farm,Large scale Solar PV,Committed,2052 +QPSF,Quorn Park Solar Farm,Large scale Solar PV,Committed,2055 +Riverina Solar Farm,Riverina Solar Farm,Large scale Solar PV,Committed,2047 +SEBSF1,Sebastopol Solar Farm,Large scale Solar PV,Committed,2052 +Stubbo Solar Farm,Stubbo Solar Farm,Large scale Solar PV,Committed,2073 +TB2SF1,Tailem Bend Solar Farm - stage 2,Large scale Solar PV,Committed,2053 +Tilbuster Solar Farm,Tilbuster Solar Farm,Large scale Solar PV,Committed,2055 +WAGGNSF1,Wagga North Solar Farm,Large scale Solar PV,Committed,2050 +WLWLSF1,Walla Walla Solar Farm,Large scale Solar PV,Committed,2054 +WLWLSF2,Walla Walla Solar Farm,Large scale Solar PV,Committed,2054 +WANDSF1,Wandoan South Solar Farm - stage 1,Large scale Solar PV,Committed,2053 +WELNSF1,Wellington North Solar Farm (Lightsource),Large scale Solar PV,Committed,2064 +WOLARSF1,Wollar Solar Farm,Large scale Solar PV,Committed,2054 +WUNUSF1,Wunghnu Solar Farm,Large scale Solar PV,Committed,2065 +WYASF1,Wyalong Solar Farm,Large scale Solar PV,Committed,2053 +CLRKCWF1,Clarke Creek Wind Farm,Wind,Committed,2049 +CLRKCWF2,Clarke Creek Wind Farm,Wind,Committed,2049 +CROOKWF3,Crookwell 3 Wind Farm,Wind,Committed,2054 +FLYCRKWF,Flyers Creek Wind Farm,Wind,Committed,2063 +GPWFEST1,Golden Plains Wind Farm East,Wind,Committed,2055 +GPWFEST2,Golden Plains Wind Farm East,Wind,Committed,2055 +GPWFEST3,Golden Plains Wind Farm East,Wind,Committed,2055 +GSWF1A,Goyder South Wind Farm 1A,Wind,Committed,2048 +GSWF1B,Goyder South Wind Farm 1B,Wind,Committed,2049 +HD1WF1,Hawkesdale Wind Farm,Wind,Committed,2054 +KABANWF1,Kaban Green Power Hub - Wind Farm,Wind,Committed,2048 +KEPWF1,Kennedy Energy Park Wind Farm,Wind,Committed,2046 +MacIntyre Wind Farm,MacIntyre Wind Farm,Wind,Committed,2054 +MTGELWF1,Mt Gellibrand Wind Farm,Wind,Committed,2043 +RYANCWF1,Ryan Corner Wind Farm,Wind,Committed,2054 +Rye Park Wind Farm,Rye Park Wind Farm,Wind,Committed,2048 +Wambo Wind Farm,Wambo Wind Farm,Wind,Committed,2055 +Aldoga Solar Farm,Aldoga Solar Farm,Large scale Solar PV,Anticipated,2051 +Aramara Solar Farm,Aramara Solar Farm,Large scale Solar PV,Anticipated,2054 +Banksia Solar Farm,Banksia Solar Farm,Large scale Solar PV,Anticipated,2058 +Derby Solar Farm,Derby Solar Farm,Large scale Solar PV,Anticipated,2057 +Frasers Solar Farm,Frasers Solar Farm,Large scale Solar PV,Anticipated,2054 +Goulburn River Solar Farm,Goulburn River Solar Farm,Large scale Solar PV,Committed,2067 +Horsham Solar Farm,Horsham Solar Farm,Large scale Solar PV,Anticipated,2066 +Maryvale Solar Farm,Maryvale Solar Farm,Large scale Solar PV,Anticipated,2062 +Mortlake Energy Hub Solar Farm,Mortlake Energy Hub Solar Farm,Large scale Solar PV,Anticipated,2062 +Munna Creek Solar Farm,Munna Creek Solar Farm,Large scale Solar PV,Committed,2053 +New England Solar Farm 2,New England Solar Farm - Stage 2,Large scale Solar PV,Anticipated,2075 +Punch's Creek Renewable Energy Solar Farm,Punch's Creek Renewable Energy Solar Farm,Large scale Solar PV,Anticipated,2056 +GBWF1,Gawara Baya Wind Farm,Wind,Anticipated,2053 +Uungula Wind Farm,Uungula Wind Farm,Wind,Anticipated,2057 +Woolsthorpe Wind Farm,Woolsthorpe Wind Farm,Wind,Anticipated,2061 +BALB1,Ballarat Energy Storage System,Battery storage (1hr storage),Existing,2033 +BOWWBA1,Bolivar Waste Water Treatment BESS,Battery storage (2hrs storage),Existing,2045 +BBATTERY,Bouldercombe Battery project,Battery storage (2hrs storage),Existing,2042 +BULBES1,Bulgana Green Power Hub BESS,Battery storage (2hrs storage),Existing,2049 +DALNTH1,Dalrymple BESS,Battery storage (1hr storage),Existing,2030 +DPNTB1,Darlington Point Energy Storage System,Battery storage (2hrs storage),Existing,2051 +GANNB1,Gannawarra Energy Storage System,Battery storage (2hrs storage),Existing,2033 +HVWWBA1,Happy Valley Reservoir BESS,Battery storage (2hrs storage),Existing,2041 +HPR1,Hornsdale Power Reserve Unit 1,Battery storage (1hr storage),Existing,2057 +LBBG1,Lake Bonney BESS,Battery storage (2hrs storage),Existing,2034 +PIBESS1,Philip Island BESS,Battery storage (2hrs storage),Existing,2038 +QBYNB1,Queanbeyan BESS,Battery storage (2hrs storage),Existing,2033 +RANGEB1,Rangebank BESS,Battery storage (2hrs storage),Existing,2044 +RESS1G,Riverina Energy Storage System 1,Battery storage (2hrs storage),Existing,2051 +RIVNB2,Riverina Energy Storage System 2,Battery storage (2hrs storage),Existing,2051 +VBB1,Victorian Big Battery,Battery storage (2hrs storage),Existing,2041 +WALGRV1,Wallgrove Grid Battery project,Battery storage (2hrs storage),Existing,2036 +WANDB1,Wandoan South BESS,Battery storage (2hrs storage),Existing,2051 +ADPBA1,Adelaide Desalination Plant BESS,Battery storage (2hrs storage),Existing,2041 +BLYTHB1,Blyth BESS,Battery storage (2hrs storage),Existing,2044 +BHBG1,Broken Hill BESS,Battery storage (1hr storage),Committed,2043 +CAPBES1,Capital Battery,Battery storage (2hrs storage),Committed,2048 +CHBESSG1,Chinchilla BESS,Battery storage (2hrs storage),Committed,2038 +CBWWBA1,Christies Beach Wastewater Treatment Plant BESS,Battery storage (2hrs storage),Committed,2041 +Clements Gap BESS,Clements Gap BESS,Battery storage (2hrs storage),Committed,2046 +Eraring Big Battery,Eraring Big Battery,Battery storage (2hrs storage),Committed,2045 +GREENB1,Greenbank BESS,Battery storage (2hrs storage),Committed,2044 +HBESS1,Hazelwood BESS,Battery storage (1hr storage),Existing,2043 +Koorangie Energy Storage System,Koorangie Energy Storage System,Battery storage (2hrs storage),Committed,2055 +LaTrobe Valley BESS,LaTrobe Valley BESS,Battery storage (2hrs storage),Committed,2045 +Liddell BESS,Liddell BESS,Battery storage (4hrs storage),Committed,2046 +Lockhart Hybrid Facility - Battery,Lockhart Hybrid Facility - Battery,Battery storage (2hrs storage),Committed,2056 +Melbourne Renewable Energy Hub - Side A,Melbourne Renewable Energy Hub - Side A,Battery storage (2hrs storage),Committed,2050 +QPBESS,Quorn Park BESS,Battery storage (2hrs storage),Committed,2045 +TB2BG1,Tailem Bend Battery Project,Battery storage (2hrs storage),Committed,2048 +Tarong BESS,Tarong BESS,Battery storage (1hr storage),Committed,2045 +Templers BESS,Templers BESS,Battery storage (2hrs storage),Committed,2049 +TIB1,Torrens Island BESS,Battery storage (1hr storage),Existing,2043 +ULBESS,Ulinda Park BESS,Battery storage (2hrs storage),Committed,2065 +WTAHB1,Waratah Super Battery,Battery storage (2hrs storage),Committed,2065 +WDBESS1,Western Downs Battery,Battery storage (1hr storage),Committed,2048 +Aldoga BESS Stage 1,Aldoga BESS Stage 1,Battery storage (1hr storage),Anticipated,2049 +Brendale BESS,Brendale BESS,Battery storage (2hrs storage),Anticipated,2066 +Bungama Solar BESS,Bungama Solar BESS,Battery storage (2hrs storage),Committed,2046 +Eraring Big Battery 2,Eraring Big Battery 2,Battery storage (2hrs storage),Anticipated,2057 +GBBATT1,Gawara Baya Wind Farm BESS,Battery storage (2hrs storage),Anticipated,2053 +Gnarwarre BESS,Gnarwarre BESS,Battery storage (2hrs storage),Anticipated,2054 +Limondale BESS,Limondale BESS,Battery storage (8hrs storage),Anticipated,2046 +LGAPBS1,Lincoln Gap Wind Farm BESS,Battery storage (1hr storage),Anticipated,2045 +Mannum BESS,Mannum BESS,Battery storage (2hrs storage),Anticipated,2044 +Maryvale Solar Farm BESS,Maryvale Solar Farm BESS,Battery storage (2hrs storage),Anticipated,2062 +Mortlake Battery,Mortlake Battery,Battery storage (2hrs storage),Anticipated,2056 +Mortlake Energy Hub BESS,Mortlake Energy Hub BESS,Battery storage (2hrs storage),Anticipated,2062 +Mt Fox BESS,Mt Fox BESS,Battery storage (2hrs storage),Additional policy-supported project,2049 +New England Solar Farm BESS,New England Solar Farm BESS,Battery storage (1hr storage),Anticipated,2076 +ORANA,Orana BESS,Battery storage (4hrs storage),Committed,2066 +Richmond Valley BESS,Richmond Valley BESS,Battery storage (8hrs storage),Anticipated,2046 +Silver City Energy Storage,Silver City Energy Storage,Battery storage (8hrs storage),Anticipated,2058 +Smithfield BESS,Smithfield BESS,Battery storage (2hrs storage),Anticipated,2040 +Stanwell BESS,Stanwell BESS,Battery storage (2hrs storage),Anticipated,2046 +Swanbank BESS,Swanbank BESS,Battery storage (2hrs storage),Anticipated,2045 +TRGBESS,Terang BESS,Battery storage (2hrs storage),Anticipated,2056 +Wooreen Energy Storage System,Wooreen Energy Storage System,Battery storage (4hrs storage),Anticipated,2047 +Kogan Gas,Brigalow GT,OCGT (large GT),Additional policy-supported project,2068 +Fulham Solar Farm,Fulham Solar Farm,Large scale Solar PV,Committed,2063 +Solar River Solar Farm,Solar River Solar Farm,Large scale Solar PV,Additional policy-supported project,2056 +Coppabella Wind Farm,Coppabella Wind Farm,Wind,Anticipated,2057 +Derby Solar Project BESS,Derby Solar Project BESS,Battery storage (2hrs storage),Additional policy-supported project,2057 +Fulham Solar Farm BESS,Fulham Solar Farm BESS,Battery storage (1hr storage),Committed,2063 +Goulburn River BESS,Goulburn River BESS,Battery storage (8hrs storage),Additional policy-supported project,2047 +Hallett BESS,Hallett BESS,Battery storage (4hrs storage),Additional policy-supported project,2047 +Horsham Solar Farm BESS,Horsham Solar Farm BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Limestone Coast West BESS,Limestone Coast West BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Solar River Solar Farm BESS,Solar River Solar Farm BESS,Battery storage (4hrs storage),Additional policy-supported project,2047 +Springvale Energy Hub BESS,Springvale Energy Hub BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Mornington BESS,Mornington BESS,Battery storage (2hrs storage),Anticipated,2046 +Tamworth BESS,Tamworth BESS,Battery storage (2hrs storage),Anticipated,2047 +Tamworth BESS 2,Tamworth BESS,Battery storage (2hrs storage),Anticipated,2047 +QEJP - Borumba,QEJP - Borumba,Pumped Hydro (24hrs storage),Anticipated,2134 +Broadsound BESS,Broadsound BESS,Battery storage (2hrs storage),Anticipated,2056 +Calala BESS 1,Calala BESS 1,Battery storage (2hrs storage),Anticipated,2052 +Calala BESS 2,Calala BESS 2,Battery storage (2hrs storage),Anticipated,2052 +Glanmire Solar Farm BESS,Glanmire Solar Farm BESS,Battery storage (2hrs storage),Anticipated,2047 +Ravenswood BESS,Ravenswood BESS,Battery storage (4hrs storage),Anticipated,2047 +Bullyard Solar Farm,Bullyard Solar Farm,Large scale Solar PV,Anticipated,2057 +Glanmire Solar Farm,Glanmire Solar Farm,Large scale Solar PV,Anticipated,2057 +Ravenswood Solar Farm,Ravenswood Solar Farm,Large scale Solar PV,Anticipated,2057 +Lockyer Valley GT,Lockyer Valley GT,OCGT (small GT),Anticipated,2068 +Boulder Creek Wind Farm,Boulder Creek Wind Farm,Wind,Anticipated,2067 +Inverleigh Wind Farm,Inverleigh Wind Farm,Wind,Anticipated,2057 +Port Latta Wind Farm,Port Latta Wind Farm,Wind,Anticipated,2057 +Valley of the Winds Wind Farm,Valley of the Winds,Wind,Anticipated,2080 +Woolooga BESS,Woolooga BESS,Battery storage (2hrs storage),Committed,2051 +Supernode BESS 1,Supernode BESS 1,Battery storage (4hrs storage),Committed,2050 +Supernode BESS 2,Supernode BESS 2,Battery storage (4hrs storage),Committed,2051 +Golden Plains West Wind Farm,Golden Plains West Wind Farm,Wind,Committed,2057 +Lotus Creek Wind Farm,Lotus Creek Wind Farm,Wind,Committed,2057 +Barnawartha Solar Farm BESS,Barnawartha Solar Farm BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Barwon Solar Farm BESS,Barwon Solar Farm BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Bungama BESS,Bungama BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Elaine Solar Farm BESS,Elaine Solar Farm BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Ganymirra Solar Power Station BESS,Ganymirra Solar Power Station BESS,Battery storage (2hrs storage),Additional policy-supported project,2047 +Junction Rivers Wind Farm BESS,Junction Rivers Wind Farm BESS,Battery storage (4hrs storage),Additional policy-supported project,2060 +Majors Creek Solar Power Station BESS,Majors Creek Power Station BESS,Battery storage (4hrs storage),Additional policy-supported project,2048 +West Mokoan Solar Farm BESS,West Mokoan Solar Farm BESS,Battery storage (4hrs storage),Additional policy-supported project,2047 +Griffith BESS,Griffith BESS,Battery storage (8hrs storage),Additional policy-supported project,2047 +Stoney Creek BESS,Stoney Creek BESS,Battery storage (8hrs storage),Additional policy-supported project,2047 +Barnawartha Solar Farm,Barnawartha Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +Barwon Solar Farm,Barwon Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +Campbells Forest Solar Farm,Campbells Forest Solar Farm,Large scale Solar PV,Additional policy-supported project,2054 +Elaine Solar Farm,Elaine Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +Ganymirra Solar Power Station,Ganymirra Solar Power Station,Large scale Solar PV,Additional policy-supported project,2057 +Hopeland Solar Farm,Hopeland Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +Majors Creek Solar Power Station,Majors Creek Power Station,Large scale Solar PV,Additional policy-supported project,2057 +Sandy Creek Solar Farm,Sandy Creek Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +West Mokoan Solar Farm,West Mokoan Solar Farm,Large scale Solar PV,Additional policy-supported project,2057 +Phoenix Pumped Hydro Project,Phoenix Pumped Hydro Project,Pumped Hydro (10hrs storage),Additional policy-supported project,2119 +Goyder North Wind Farm,Goyder North Wind Farm,Wind,Additional policy-supported project,2059 +Junction Rivers Wind Farm,Junction Rivers Wind Farm,Wind,Additional policy-supported project,2060 +Kentbruck Green Power Hub Wind Farm,Kentbruck Green Power Hub Wind Farm,Wind,Additional policy-supported project,2057 +Palmer Wind Farm,Palmer Wind Farm,Wind,Additional policy-supported project,2057 +Spicers Creek Wind Farm,Spicers Creek Wind Farm,Wind,Additional policy-supported project,2057 +Thunderbolt Wind Farm,Thunderbolt Wind Farm,Wind,Additional policy-supported project,2065 +Haughton Solar Farm Stage 2,Haughton Solar Farm Stage 2,Large scale Solar PV,Anticipated,2058 +Lancaster Solar Farm,Lancaster Solar Farm,Large scale Solar PV,Anticipated,2057 +Bennetts Creek BESS,Bennetts Creek BESS,Battery storage (2hrs storage),Anticipated,2047 +Northern Midlands Solar Farm,Northern Midlands Solar Farm,Large scale Solar PV,Anticipated,2057 +Hay Sun Farm,Hay Sun Farm,Large scale Solar PV,Anticipated,2057 +MOKOSF1,Mokoan Solar Farm,Large scale Solar PV,Committed,2055 +Kiamal BESS,Kiamal BESS,Battery storage (4hrs storage),Additional policy-supported project,2057 +Pine Lodge BESS,Pine Lodge BESS,Battery storage (2hrs storage),Anticipated,2046 diff --git a/tests/test_workbook_table_cache/7.5/gpg_min_stable_level_existing_generators.csv b/tests/test_workbook_table_cache/7.5/gpg_min_stable_level_existing_generators.csv new file mode 100644 index 00000000..d8caea57 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/gpg_min_stable_level_existing_generators.csv @@ -0,0 +1,138 @@ +IASR ID,Power Station,Technology Type,Min Stable Level (MW) +ANGAS1,Angaston,Reciprocating engine,3.0 +ANGAS2,Angaston,Reciprocating engine,3.0 +BDL01,Bairnsdale,OCGT (small GT),20.0 +BDL02,Bairnsdale,OCGT (small GT),20.0 +BARCALDN,Barcaldine Power Station,OCGT (small GT),20.0 +BIPS1_01,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_02,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_03,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_04,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_05,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_06,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_07,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_08,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_09,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_10,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_11,Barker Inlet Power Station,Reciprocating engine,8.0 +BIPS1_12,Barker Inlet Power Station,Reciprocating engine,8.0 +BBTHREE1,Bell Bay Three,OCGT (large GT),20.0 +BBTHREE2,Bell Bay Three,OCGT (large GT),20.0 +BBTHREE3,Bell Bay Three,OCGT (large GT),20.0 +BOLIVPS1_1,Bolivar Power Station,OCGT (small GT),4.0 +BOLIVPS1_2,Bolivar Power Station,OCGT (small GT),4.0 +BOLIVPS1_3,Bolivar Power Station,OCGT (small GT),4.0 +BOLIVPS1_4,Bolivar Power Station,OCGT (small GT),4.0 +BRAEMAR1,Braemar,OCGT (large GT),110.0 +BRAEMAR2,Braemar,OCGT (large GT),110.0 +BRAEMAR3,Braemar,OCGT (large GT),110.0 +BRAEMAR5,Braemar 2 Power Station,OCGT (large GT),80.0 +BRAEMAR6,Braemar 2 Power Station,OCGT (large GT),80.0 +BRAEMAR7,Braemar 2 Power Station,OCGT (large GT),80.0 +CG1,Colongra,OCGT (small GT),125.0 +CG2,Colongra,OCGT (small GT),125.0 +CG3,Colongra,OCGT (small GT),125.0 +CG4,Colongra,OCGT (small GT),125.0 +CPSA_GT1,Condamine A,CCGT - Gas Turbine,20.0 +CPSA_GT2,Condamine A,CCGT - Gas Turbine,20.0 +CPSA_ST,Condamine A,CCGT - Steam Turbine,13.1 +DDPS1_GT1,Darling Downs,CCGT - Gas Turbine,58.3 +DDPS1_GT2,Darling Downs,CCGT - Gas Turbine,58.3 +DDPS1_GT3,Darling Downs,CCGT - Gas Turbine,58.3 +DDPS1_ST,Darling Downs,CCGT - Steam Turbine,38.9 +DRYCGT1,Dry Creek GT,OCGT (small GT),20.0 +DRYCGT2,Dry Creek GT,OCGT (small GT),20.0 +DRYCGT3,Dry Creek GT,OCGT (small GT),20.0 +AGLHAL01,Hallett GT,OCGT (small GT),9.0 +AGLHAL02,Hallett GT,OCGT (small GT),8.0 +AGLHAL03,Hallett GT,OCGT (small GT),10.0 +AGLHAL04,Hallett GT,OCGT (small GT),10.0 +AGLHAL05,Hallett GT,OCGT (small GT),9.0 +AGLHAL06,Hallett GT,OCGT (small GT),8.5 +AGLHAL07,Hallett GT,OCGT (small GT),10.5 +AGLHAL08,Hallett GT,OCGT (small GT),13.0 +AGLHAL09,Hallett GT,OCGT (small GT),12.0 +AGLHAL10,Hallett GT,OCGT (small GT),8.0 +AGLHAL11,Hallett GT,OCGT (small GT),8.0 +AGLHAL12,Hallett GT,OCGT (small GT),8.0 +AGLHALRE,Hallett GT,OCGT (small GT),18.0 +HEZ1,Hunter Economic Zone,Reciprocating engine,5.2 +JLA01,Jeeralang A,OCGT (small GT),20.0 +JLA02,Jeeralang A,OCGT (small GT),20.0 +JLA03,Jeeralang A,OCGT (small GT),20.0 +JLA04,Jeeralang A,OCGT (small GT),20.0 +JLB01,Jeeralang B,OCGT (small GT),30.0 +JLB02,Jeeralang B,OCGT (small GT),30.0 +JLB03,Jeeralang B,OCGT (small GT),30.0 +LADBROK1,Ladbroke Grove,OCGT (small GT),20.0 +LADBROK2,Ladbroke Grove,OCGT (small GT),20.0 +LNGS1,Laverton North,OCGT (large GT),65.0 +LNGS2,Laverton North,OCGT (large GT),65.0 +LONSDALE,Lonsdale,Reciprocating engine,1.0 +MINTARO,Mintaro GT,OCGT (small GT),30.0 +MORTLK11,Mortlake,OCGT (large GT),125.0 +MORTLK12,Mortlake,OCGT (large GT),125.0 +MSTUART1,Mt Stuart,OCGT (small GT),30.0 +MSTUART2,Mt Stuart,OCGT (small GT),30.0 +MSTUART3,Mt Stuart,OCGT (small GT),30.0 +NPS,Newport,CCGT - Steam Turbine,100.0 +OAKEY1,Oakey Power Station,OCGT (large GT),45.0 +OAKEY2,Oakey Power Station,OCGT (large GT),45.0 +OsborneGT,Osborne,CCGT - Gas Turbine,90.0 +OsborneST,Osborne,CCGT - Steam Turbine,20.0 +PPCCGTGT1,Pelican Point,CCGT - Gas Turbine,60.0 +PPCCGTGT2,Pelican Point,CCGT - Gas Turbine,60.0 +PPCCGTST,Pelican Point,CCGT - Steam Turbine,42.0 +POR01-1,Port Lincoln GT,OCGT (small GT),7.0 +POR01-2,Port Lincoln GT,OCGT (small GT),7.0 +POR01-3,Port Lincoln GT,OCGT (small GT),7.0 +PTSTAN1_1,Port Stanvac 1,Reciprocating engine,0.9 +PTSTAN1_2,Port Stanvac 1,Reciprocating engine,0.9 +QPS1,Quarantine,OCGT (small GT),5.0 +QPS2,Quarantine,OCGT (small GT),3.0 +QPS3,Quarantine,OCGT (small GT),5.0 +QPS4,Quarantine,OCGT (small GT),3.0 +QPS5,Quarantine,OCGT (small GT),74.0 +ROMA_7,Roma,OCGT (small GT),5.0 +ROMA_8,Roma,OCGT (small GT),5.0 +SITHE01,Smithfield Energy Facility,OCGT (small GT),20.0 +SNAPPER1_1,Snapper Point Power Station,OCGT (small GT),5.0 +SNAPPER1_2,Snapper Point Power Station,OCGT (small GT),5.0 +SNAPPER1_3,Snapper Point Power Station,OCGT (small GT),5.0 +SNAPPER1_4,Snapper Point Power Station,OCGT (small GT),5.0 +SNAPPER1_5,Snapper Point Power Station,OCGT (small GT),5.0 +SNUG1,Snuggery,OCGT (small GT),5.0 +SNUG2,Snuggery,OCGT (small GT),5.0 +SNUG3,Snuggery,OCGT (small GT),5.0 +AGLSOM01,Somerton,OCGT (small GT),10.0 +AGLSOM02,Somerton,OCGT (small GT),10.0 +AGLSOM03,Somerton,OCGT (small GT),10.0 +AGLSOM04,Somerton,OCGT (small GT),10.0 +SWAN_E,Swanbank E GT,CCGT,95.0 +TALWA1,Tallawarra,CCGT,190.0 +Tallawarra B,Tallawarra B,OCGT (large GT),160.0 +TVCC201_GT,Tamar Valley Combined Cycle,CCGT - Gas Turbine,70.8 +TVCC201_ST,Tamar Valley Combined Cycle,CCGT - Steam Turbine,41.4 +TVPP104,Tamar Valley Peaking,OCGT (large GT),30.0 +TORRB1,Torrens Island B,CCGT - Steam Turbine,40.0 +TORRB2,Torrens Island B,CCGT - Steam Turbine,40.0 +TORRB3,Torrens Island B,CCGT - Steam Turbine,40.0 +TORRB4,Torrens Island B,CCGT - Steam Turbine,40.0 +YABULU,Townsville Power Station,CCGT - Gas Turbine,75.0 +YABULU2,Townsville Power Station,CCGT - Steam Turbine,55.0 +URANQ11,Uranquinty,OCGT (large GT),80.0 +URANQ12,Uranquinty,OCGT (large GT),80.0 +URANQ13,Uranquinty,OCGT (large GT),80.0 +URANQ14,Uranquinty,OCGT (large GT),80.0 +VPGS1,Valley Power,OCGT (small GT),30.0 +VPGS2,Valley Power,OCGT (small GT),30.0 +VPGS3,Valley Power,OCGT (small GT),30.0 +VPGS4,Valley Power,OCGT (small GT),30.0 +VPGS5,Valley Power,OCGT (small GT),30.0 +VPGS6,Valley Power,OCGT (small GT),30.0 +YARWUN_1,Yarwun Cogen,CCGT,106.0 +Tully Sugar Mill Biomass,Tully Sugar Mill Biomass,Biomass,2.0 +HUNTER1,Hunter Power Station,OCGT (large GT),100.0 +HUNTER2,Hunter Power Station,OCGT (large GT),100.0 +Kogan Gas,Brigalow GT,OCGT (large GT),104.0 +Lockyer Valley GT,Lockyer Valley GT,OCGT (small GT),22.0 diff --git a/tests/test_workbook_table_cache/7.5/heat_rates_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/7.5/heat_rates_existing_committed_anticipated_additional_generators.csv new file mode 100644 index 00000000..6b85a4fe --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/heat_rates_existing_committed_anticipated_additional_generators.csv @@ -0,0 +1,643 @@ +IASR ID,Power Station,Technology,Heat rate (GJ/MWh) +BW01,Bayswater,Steam Sub Critical,10.0519349978723 +BW02,Bayswater,Steam Sub Critical,10.0519349978723 +BW03,Bayswater,Steam Sub Critical,10.0519349978723 +BW04,Bayswater,Steam Sub Critical,10.0519349978723 +CALL_B_1,Callide B,Steam Sub Critical,10.0662696087912 +CALL_B_2,Callide B,Steam Sub Critical,10.0662696087912 +CPP_3,Callide C,Steam Super Critical,9.89609104361702 +CPP_4,Callide C,Steam Super Critical,9.89609104361702 +ER01,Eraring,Steam Sub Critical,10.1585868276595 +ER02,Eraring,Steam Sub Critical,10.1585868276595 +ER03,Eraring,Steam Sub Critical,10.1585868276595 +ER04,Eraring,Steam Sub Critical,10.1585868276595 +GSTONE1,Gladstone,Steam Sub Critical,10.2974828380434 +GSTONE2,Gladstone,Steam Sub Critical,10.2974828380434 +GSTONE3,Gladstone,Steam Sub Critical,10.2974828380434 +GSTONE4,Gladstone,Steam Sub Critical,10.2974828380434 +GSTONE5,Gladstone,Steam Sub Critical,10.2974828380434 +GSTONE6,Gladstone,Steam Sub Critical,10.2974828380434 +KPP_1,Kogan Creek,Steam Super Critical,9.6724791098901 +MPP_1,Millmerran,Steam Super Critical,9.79485226063829 +MPP_2,Millmerran,Steam Super Critical,9.79485226063829 +MP1,Mt Piper,Steam Sub Critical,9.74157759473684 +MP2,Mt Piper,Steam Sub Critical,9.74157759473684 +STAN-1,Stanwell,Steam Sub Critical,9.96484623736263 +STAN-2,Stanwell,Steam Sub Critical,9.96484623736263 +STAN-3,Stanwell,Steam Sub Critical,9.96484623736263 +STAN-4,Stanwell,Steam Sub Critical,9.96484623736263 +TARONG#1,Tarong,Steam Sub Critical,10.0077838315217 +TARONG#2,Tarong,Steam Sub Critical,10.0077838315217 +TARONG#3,Tarong,Steam Sub Critical,10.0077838315217 +TARONG#4,Tarong,Steam Sub Critical,10.0077838315217 +TNPS1,Tarong North,Steam Super Critical,9.20621931276595 +VP5,Vales Point B,Steam Sub Critical,10.1867572157894 +VP6,Vales Point B,Steam Sub Critical,10.1867572157894 +LYA1,Loy Yang A Power Station,Steam Sub Critical,13.3650133626373 +LYA2,Loy Yang A Power Station,Steam Sub Critical,13.3650133626373 +LYA3,Loy Yang A Power Station,Steam Sub Critical,13.3650133626373 +LYA4,Loy Yang A Power Station,Steam Sub Critical,13.3650133626373 +LOYYB1,Loy Yang B,Steam Sub Critical,13.6342978369565 +LOYYB2,Loy Yang B,Steam Sub Critical,13.6342978369565 +YWPS1,Yallourn W,Steam Sub Critical,15.4440154444444 +YWPS2,Yallourn W,Steam Sub Critical,15.4440154444444 +YWPS3,Yallourn W,Steam Sub Critical,15.4440154444444 +YWPS4,Yallourn W,Steam Sub Critical,15.4440154444444 +ANGAS1,Angaston,Reciprocating engine,13.1025822974358 +ANGAS2,Angaston,Reciprocating engine,13.1025822974358 +BDL01,Bairnsdale,OCGT (small GT),10.6016432525252 +BDL02,Bairnsdale,OCGT (small GT),10.6016432525252 +BARCALDN,Barcaldine Power Station,OCGT (small GT),12.8493414747474 +BIPS1_01,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_02,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_03,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_04,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_05,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_06,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_07,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_08,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_09,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_10,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_11,Barker Inlet Power Station,Reciprocating engine,8.88 +BIPS1_12,Barker Inlet Power Station,Reciprocating engine,8.88 +BBTHREE1,Bell Bay Three,OCGT (large GT),12.4125090515463 +BBTHREE2,Bell Bay Three,OCGT (large GT),12.4125090515463 +BBTHREE3,Bell Bay Three,OCGT (large GT),12.4125090515463 +BOLIVPS1_1,Bolivar Power Station,OCGT (small GT),10.648730964467 +BOLIVPS1_2,Bolivar Power Station,OCGT (small GT),10.648730964467 +BOLIVPS1_3,Bolivar Power Station,OCGT (small GT),10.648730964467 +BOLIVPS1_4,Bolivar Power Station,OCGT (small GT),10.648730964467 +BRAEMAR1,Braemar,OCGT (large GT),12.0012001212121 +BRAEMAR2,Braemar,OCGT (large GT),12.0012001212121 +BRAEMAR3,Braemar,OCGT (large GT),12.0012001212121 +BRAEMAR5,Braemar 2 Power Station,OCGT (large GT),12.0012001212121 +BRAEMAR6,Braemar 2 Power Station,OCGT (large GT),12.0012001212121 +BRAEMAR7,Braemar 2 Power Station,OCGT (large GT),12.0012001212121 +CG1,Colongra,OCGT (small GT),11.2580917575757 +CG2,Colongra,OCGT (small GT),11.2580917575757 +CG3,Colongra,OCGT (small GT),11.2580917575757 +CG4,Colongra,OCGT (small GT),11.2580917575757 +CPSA_GT1,Condamine A,CCGT - Gas Turbine,7.51283442577319 +CPSA_GT2,Condamine A,CCGT - Gas Turbine,7.51283442577319 +CPSA_ST,Condamine A,CCGT - Steam Turbine,7.51283442577319 +DDPS1_GT1,Darling Downs,CCGT - Gas Turbine,7.84792465957446 +DDPS1_GT2,Darling Downs,CCGT - Gas Turbine,7.84792465957446 +DDPS1_GT3,Darling Downs,CCGT - Gas Turbine,7.84792465957446 +DDPS1_ST,Darling Downs,CCGT - Steam Turbine,7.84792465957446 +DRYCGT1,Dry Creek GT,OCGT (small GT),13.8264777070707 +DRYCGT2,Dry Creek GT,OCGT (small GT),13.8264777070707 +DRYCGT3,Dry Creek GT,OCGT (small GT),13.8264777070707 +AGLHAL01,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL02,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL03,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL04,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL05,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL06,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL07,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL08,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL09,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL10,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL11,Hallett GT,OCGT (small GT),15.026296020202 +AGLHAL12,Hallett GT,OCGT (small GT),15.026296020202 +AGLHALRE,Hallett GT,OCGT (small GT),15.026296020202 +HEZ1,Hunter Economic Zone,Reciprocating engine,8.87878787878787 +JLA01,Jeeralang A,OCGT (small GT),15.7260178247422 +JLA02,Jeeralang A,OCGT (small GT),15.7260178247422 +JLA03,Jeeralang A,OCGT (small GT),15.7260178247422 +JLA04,Jeeralang A,OCGT (small GT),15.7260178247422 +JLB01,Jeeralang B,OCGT (small GT),15.7260178247422 +JLB02,Jeeralang B,OCGT (small GT),15.7260178247422 +JLB03,Jeeralang B,OCGT (small GT),15.7260178247422 +LADBROK1,Ladbroke Grove,OCGT (small GT),12.0012001212121 +LADBROK2,Ladbroke Grove,OCGT (small GT),12.0012001212121 +LNGS1,Laverton North,OCGT (large GT),11.8573169484536 +LNGS2,Laverton North,OCGT (large GT),11.8573169484536 +LONSDALE,Lonsdale,Reciprocating engine,8.09716599179487 +MINTARO,Mintaro GT,OCGT (small GT),12.8493414747474 +MORTLK11,Mortlake,OCGT (large GT),11.2580917575757 +MORTLK12,Mortlake,OCGT (large GT),11.2580917575757 +MSTUART1,Mt Stuart,OCGT (small GT),12.0012001212121 +MSTUART2,Mt Stuart,OCGT (small GT),12.0012001212121 +MSTUART3,Mt Stuart,OCGT (small GT),12.0012001212121 +NPS,Newport,CCGT - Steam Turbine,10.8270676736842 +OAKEY1,Oakey Power Station,OCGT (large GT),11.052777010101 +OAKEY2,Oakey Power Station,OCGT (large GT),11.052777010101 +OsborneGT,Osborne,CCGT - Gas Turbine,8.59291084842105 +OsborneST,Osborne,CCGT - Steam Turbine,8.59291084842105 +PPCCGTGT1,Pelican Point,CCGT - Gas Turbine,7.49687630204081 +PPCCGTGT2,Pelican Point,CCGT - Gas Turbine,7.49687630204081 +PPCCGTST,Pelican Point,CCGT - Steam Turbine,7.49687630204081 +POR01-1,Port Lincoln GT,OCGT (small GT),13.9254216304347 +POR01-2,Port Lincoln GT,OCGT (small GT),13.9254216304347 +POR01-3,Port Lincoln GT,OCGT (small GT),13.9254216304347 +PTSTAN1_1,Port Stanvac 1,Reciprocating engine,8.09716599179487 +PTSTAN1_2,Port Stanvac 1,Reciprocating engine,8.09716599179487 +QPS1,Quarantine,OCGT (small GT),11.2781954842105 +QPS2,Quarantine,OCGT (small GT),11.2781954842105 +QPS3,Quarantine,OCGT (small GT),11.2781954842105 +QPS4,Quarantine,OCGT (small GT),11.2781954842105 +QPS5,Quarantine,OCGT (small GT),11.2781954842105 +ROMA_7,Roma,OCGT (small GT),12.0012001212121 +ROMA_8,Roma,OCGT (small GT),12.0012001212121 +SITHE01,Smithfield Energy Facility,OCGT (small GT),8.79228232947368 +SNAPPER1_1,Snapper Point Power Station,OCGT (small GT),10.648730964467 +SNAPPER1_2,Snapper Point Power Station,OCGT (small GT),10.648730964467 +SNAPPER1_3,Snapper Point Power Station,OCGT (small GT),10.648730964467 +SNAPPER1_4,Snapper Point Power Station,OCGT (small GT),10.648730964467 +SNAPPER1_5,Snapper Point Power Station,OCGT (small GT),10.648730964467 +SNUG1,Snuggery,OCGT (small GT),13.8482843505154 +SNUG2,Snuggery,OCGT (small GT),13.8482843505154 +SNUG3,Snuggery,OCGT (small GT),13.8482843505154 +AGLSOM01,Somerton,OCGT (small GT),15.026296020202 +AGLSOM02,Somerton,OCGT (small GT),15.026296020202 +AGLSOM03,Somerton,OCGT (small GT),15.026296020202 +AGLSOM04,Somerton,OCGT (small GT),15.026296020202 +SWAN_E,Swanbank E GT,CCGT,7.66805827731958 +TALWA1,Tallawarra,CCGT,7.2064858371134 +Tallawarra B,Tallawarra B,OCGT (large GT),10.9312436804853 +TVCC201_GT,Tamar Valley Combined Cycle,CCGT - Gas Turbine,7.51283442577319 +TVCC201_ST,Tamar Valley Combined Cycle,CCGT - Steam Turbine,7.51283442577319 +TVPP104,Tamar Valley Peaking,OCGT (large GT),12.8493414747474 +TORRB1,Torrens Island B,CCGT - Steam Turbine,11.2781954842105 +TORRB2,Torrens Island B,CCGT - Steam Turbine,11.2781954842105 +TORRB3,Torrens Island B,CCGT - Steam Turbine,11.2781954842105 +TORRB4,Torrens Island B,CCGT - Steam Turbine,11.2781954842105 +YABULU,Townsville Power Station,CCGT - Gas Turbine,7.82983165876288 +YABULU2,Townsville Power Station,CCGT - Steam Turbine,7.82983165876288 +URANQ11,Uranquinty,OCGT (large GT),11.2580917575757 +URANQ12,Uranquinty,OCGT (large GT),11.2580917575757 +URANQ13,Uranquinty,OCGT (large GT),11.2580917575757 +URANQ14,Uranquinty,OCGT (large GT),11.2580917575757 +VPGS1,Valley Power,OCGT (small GT),15.026296020202 +VPGS2,Valley Power,OCGT (small GT),15.026296020202 +VPGS3,Valley Power,OCGT (small GT),15.026296020202 +VPGS4,Valley Power,OCGT (small GT),15.026296020202 +VPGS5,Valley Power,OCGT (small GT),15.026296020202 +VPGS6,Valley Power,OCGT (small GT),15.026296020202 +YARWUN_1,Yarwun Cogen,CCGT,10.5863671122448 +BARRON-1,Barron Gorge,Hydro,0.0 +BARRON-2,Barron Gorge,Hydro,0.0 +BASTYAN,Bastyan,Hydro,0.0 +BLOWERNG,Blowering,Hydro,0.0 +BOGONG1,Bogong / Mackay,Hydro,0.0 +BOGONG2,Bogong / Mackay,Hydro,0.0 +MCKAY11,Bogong / Mackay,Hydro,0.0 +MCKAY12,Bogong / Mackay,Hydro,0.0 +MCKAY13,Bogong / Mackay,Hydro,0.0 +MCKAY14,Bogong / Mackay,Hydro,0.0 +MCKAY15,Bogong / Mackay,Hydro,0.0 +MCKAY16,Bogong / Mackay,Hydro,0.0 +LI111-1,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +LI112-2,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +LI113-3,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +CA111-1,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +CA112-2,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +WY111-1,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +WY111-2,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +WY111-3,Catagunya / Liapootah / Wayatinah,Hydro,0.0 +CETHANA,Cethana,Hydro,0.0 +DARTM1,Dartmouth,Hydro,0.0 +DEVILS_G,Devils Gate,Hydro,0.0 +EILDON1,Eildon,Hydro,0.0 +EILDON2,Eildon,Hydro,0.0 +FISHER,Fisher,Hydro,0.0 +GO181-1,Gordon,Hydro,0.0 +GO182-2,Gordon,Hydro,0.0 +GO183-3,Gordon,Hydro,0.0 +GUTHEGA1,Guthega,Hydro,0.0 +GUTHEGA2,Guthega,Hydro,0.0 +HUMENSW,Hume Dam NSW,Hydro,0.0 +HUMEV,Hume Dam VIC,Hydro,0.0 +JBUTTERS,John Butters,Hydro,0.0 +KAREEYA1,Kareeya,Hydro,0.0 +KAREEYA2,Kareeya,Hydro,0.0 +KAREEYA3,Kareeya,Hydro,0.0 +KAREEYA4,Kareeya,Hydro,0.0 +LK_ECHO,Lake Echo,Hydro,0.0 +LM111-1,Lemonthyme / Wilmot,Hydro,0.0 +WI111-1,Lemonthyme / Wilmot,Hydro,0.0 +MACKNTSH,Mackintosh,Hydro,0.0 +MEADOWBK,Meadowbank,Hydro,0.0 +MURRAY01,Murray 1,Hydro,0.0 +MURRAY02,Murray 1,Hydro,0.0 +MURRAY03,Murray 1,Hydro,0.0 +MURRAY04,Murray 1,Hydro,0.0 +MURRAY05,Murray 1,Hydro,0.0 +MURRAY06,Murray 1,Hydro,0.0 +MURRAY07,Murray 1,Hydro,0.0 +MURRAY08,Murray 1,Hydro,0.0 +MURRAY09,Murray 1,Hydro,0.0 +MURRAY10,Murray 1,Hydro,0.0 +MURRAY11,Murray 2,Hydro,0.0 +MURRAY12,Murray 2,Hydro,0.0 +MURRAY13,Murray 2,Hydro,0.0 +MURRAY14,Murray 2,Hydro,0.0 +PO161-1,Poatina,Hydro,0.0 +PO162-2,Poatina,Hydro,0.0 +PO163-3,Poatina,Hydro,0.0 +PO164-4,Poatina,Hydro,0.0 +PO165-5,Poatina,Hydro,0.0 +PO166-6,Poatina,Hydro,0.0 +REECE1,Reece,Hydro,0.0 +REECE2,Reece,Hydro,0.0 +SHGEN01,Shoalhaven,Hydro,0.0 +SHGEN02,Shoalhaven,Hydro,0.0 +SHGEN03,Shoalhaven,Hydro,0.0 +SHGEN04,Shoalhaven,Hydro,0.0 +TA111-1,Tarraleah,Hydro,0.0 +TA111-2,Tarraleah,Hydro,0.0 +TA111-3,Tarraleah,Hydro,0.0 +TA112-4,Tarraleah,Hydro,0.0 +TA112-5,Tarraleah,Hydro,0.0 +TA112-6,Tarraleah,Hydro,0.0 +TR111-1,Trevallyn,Hydro,0.0 +TR111-2,Trevallyn,Hydro,0.0 +TR112-3,Trevallyn,Hydro,0.0 +TR112-4,Trevallyn,Hydro,0.0 +TRIBUTE,Tribute,Hydro,0.0 +TUMUT3_01,Tumut 3,Hydro,0.0 +TUMUT3_02,Tumut 3,Hydro,0.0 +TUMUT3_03,Tumut 3,Hydro,0.0 +TUMUT3_04,Tumut 3,Hydro,0.0 +TUMUT3_05,Tumut 3,Hydro,0.0 +TUMUT3_06,Tumut 3,Hydro,0.0 +TU111-1,Tungatinah,Hydro,0.0 +TU112-2,Tungatinah,Hydro,0.0 +TU113-3,Tungatinah,Hydro,0.0 +TU114-4,Tungatinah,Hydro,0.0 +TU115-5,Tungatinah,Hydro,0.0 +TUMUT1_01,Upper Tumut,Hydro,0.0 +TUMUT1_02,Upper Tumut,Hydro,0.0 +TUMUT1_03,Upper Tumut,Hydro,0.0 +TUMUT1_04,Upper Tumut,Hydro,0.0 +TUMUT2_01,Upper Tumut,Hydro,0.0 +TUMUT2_02,Upper Tumut,Hydro,0.0 +TUMUT2_03,Upper Tumut,Hydro,0.0 +TUMUT2_04,Upper Tumut,Hydro,0.0 +WKIEWA1_1,West Kiewa,Hydro,0.0 +WKIEWA1_2,West Kiewa,Hydro,0.0 +WKIEWA2_1,West Kiewa,Hydro,0.0 +WKIEWA2_2,West Kiewa,Hydro,0.0 +W/HOE#1,Wivenhoe,Hydro,0.0 +W/HOE#2,Wivenhoe,Hydro,0.0 +BANN1,Bannerton Solar Park,Large scale Solar PV,0.0 +BERYLSF1,Beryl Solar Farm,Large scale Solar PV,0.0 +BOWWPV1,Bolivar Waste Water Treatment Solar Farm,Large scale Solar PV,0.0 +BOMENSF1,Bomen Solar Farm,Large scale Solar PV,0.0 +BROKENH1,Broken Hill Solar Farm,Large scale Solar PV,0.0 +BNGSF1,Bungala One Solar Farm,Large scale Solar PV,0.0 +BNGSF2,Bungala Two Solar Farm,Large scale Solar PV,0.0 +CHILDSF1,Childers Solar Farm,Large scale Solar PV,0.0 +CLARESF1,Clare Solar Farm,Large scale Solar PV,0.0 +CLERMSF1,Clermont Solar Farm,Large scale Solar PV,0.0 +COLEASF1,Coleambally Solar Farm,Large scale Solar PV,0.0 +CSPVPS1,Collinsville Solar Farm,Large scale Solar PV,0.0 +DDSF1,Darling Downs Solar Farm,Large scale Solar PV,0.0 +DARLSF1,Darlington Point Solar Farm,Large scale Solar PV,0.0 +DAYDSF1,Daydream Solar Farm,Large scale Solar PV,0.0 +EMERASF1,Emerald Solar Farm,Large scale Solar PV,0.0 +FINLYSF1,Finley Solar Farm,Large scale Solar PV,0.0 +GANNSF1,Gannawarra Solar Farm,Large scale Solar PV,0.0 +GLENSF1,Glenrowan Solar Farm,Large scale Solar PV,0.0 +GLRWNSF1,Glenrowan West Solar Farm,Large scale Solar PV,0.0 +GOONSF1,Goonumbla Solar Farm,Large scale Solar PV,0.0 +GULLRSF1,Gullen Range Solar Farm,Large scale Solar PV,0.0 +GNNDHSF1,Gunnedah Solar Farm,Large scale Solar PV,0.0 +HAMISF1,Hamilton Solar Farm,Large scale Solar PV,0.0 +HVWWPV1,Happy Valley Reservoir,Large scale Solar PV,0.0 +HAUGHT11,Haughton Solar Farm,Large scale Solar PV,0.0 +HAYMSF1,Hayman Solar Farm,Large scale Solar PV,0.0 +HILLSTN1,Hillston Sun Farm,Large scale Solar PV,0.0 +HUGSF1,Hughenden Solar Farm,Large scale Solar PV,0.0 +JEMALNG1,Jemalong Solar,Large scale Solar PV,0.0 +JUNEESF1,Junee Solar Farm,Large scale Solar PV,0.0 +KARSF1,Karadoc Solar Farm,Large scale Solar PV,0.0 +KIAMSF1,Kiamal Solar Farm stage 1,Large scale Solar PV,0.0 +KSP1,Kidston Solar Farm,Large scale Solar PV,0.0 +LILYSF1,Lilyvale Solar Farm,Large scale Solar PV,0.0 +LIMOSF11,Limondale Solar Farm 1,Large scale Solar PV,0.0 +LIMOSF21,Limondale Solar Farm 2,Large scale Solar PV,0.0 +LRSF1,Longreach Solar Farm,Large scale Solar PV,0.0 +MANSLR1,Manildra Solar Farm,Large scale Solar PV,0.0 +MAPS2PV1,Mannum Adelaide Pumping Station No 2 - MAPL2 (Palmer),Large scale Solar PV,0.0 +MAPS3PV1,Mannum Adelaide Pumping Station No 3 - MAPL3 (Tungkillo),Large scale Solar PV,0.0 +MARYRSF1,Maryrorough Solar Farm,Large scale Solar PV,0.0 +MIDDLSF1,Middlemount Solar Farm,Large scale Solar PV,0.0 +MOLNGSF1,Molong Solar Farm,Large scale Solar PV,0.0 +MOREESF1,Moree Solar Farm,Large scale Solar PV,0.0 +MWPS1PV1,Morgan To Whyalla Pipeline No 1 PS And Water Filtration Plant,Large scale Solar PV,0.0 +MWPS2PV1,Morgan To Whyalla Pipeline No 2 PS,Large scale Solar PV,0.0 +MWPS3PV1,Morgan To Whyalla Pipeline No 3 PS,Large scale Solar PV,0.0 +MWPS4PV1,Morgan To Whyalla Pipeline No 4 PS,Large scale Solar PV,0.0 +MOUSF1,Moura Solar Farm,Large scale Solar PV,0.0 +MBPS2PV1,Murray Bridge - Onkaparinga Pipeline Pump 2,Large scale Solar PV,0.0 +NEVERSF1,Nevertire Solar Farm,Large scale Solar PV,0.0 +NEWENSF1,New England Solar Farm,Large scale Solar PV,0.0 +NEWENSF2,New England Solar Farm,Large scale Solar PV,0.0 +NUMURSF1,Numurkah Solar Farm,Large scale Solar PV,0.0 +NYNGAN1,Nyngan Solar Plant,Large scale Solar PV,0.0 +OAKEY1SF,Oakey 1 Solar Farm,Large scale Solar PV,0.0 +OAKEY2SF,Oakey 2 Solar Farm,Large scale Solar PV,0.0 +PARSF1,Parkes Solar Farm,Large scale Solar PV,0.0 +PAREPS1,Port Augusta Renewable Energy Park - Solar,Large scale Solar PV,0.0 +RRSF1,Ross River Solar Farm,Large scale Solar PV,0.0 +RUGBYR1,Rugby Run Solar Farm,Large scale Solar PV,0.0 +SMCSF1,Sun Metals Corporation Solar Farm,Large scale Solar PV,0.0 +SUNRSF1,Sunraysia Solar Farm,Large scale Solar PV,0.0 +SUNTPSF1,Suntop Solar Farm,Large scale Solar PV,0.0 +SRSF1,Susan River Solar Farm,Large scale Solar PV,0.0 +TBSF1,Tailem Bend Solar Farm,Large scale Solar PV,0.0 +WARWSF1,Warwick Solar Farm - stage 1,Large scale Solar PV,0.0 +WARWSF2,Warwick Solar Farm - stage 2,Large scale Solar PV,0.0 +WELLSF1,Wellington Solar Farm,Large scale Solar PV,0.0 +WEMENSF1,Wemen Solar Farm,Large scale Solar PV,0.0 +WSTWYSF1,West Wyalong Solar Farm,Large scale Solar PV,0.0 +WDGPH1,Western Downs Green Power Hub,Large scale Solar PV,0.0 +WRSF1,White Rock Solar Farm,Large scale Solar PV,0.0 +WHITSF1,Whitsunday Solar Farm,Large scale Solar PV,0.0 +WINTSF1,Winton Solar Farm,Large scale Solar PV,0.0 +WOOLGSF1,Woolooga Solar Farm,Large scale Solar PV,0.0 +YARANSF1,Yarranlea Solar Farm,Large scale Solar PV,0.0 +YATSF1,Yatpool Solar Farm,Large scale Solar PV,0.0 +ARWF1,Ararat Wind Farm,Wind,0.0 +BALDHWF1,Bald Hills Wind Farm,Wind,0.0 +BANGOWF1,Bango 973 Wind Farm,Wind,0.0 +BANGOWF2,Bango 999 Wind Farm,Wind,0.0 +BRYB1WF1,Berrybank Wind Farm,Wind,0.0 +BRYB2WF2,Berrybank Wind Farm,Wind,0.0 +BOCORWF1,Boco Rock Wind Farm,Wind,0.0 +BODWF1,Bodangora Wind Farm,Wind,0.0 +BULGANA1,Bulgana Green Power Hub - Wind Farm,Wind,0.0 +CNUNDAWF,Canunda Wind Farm,Wind,0.0 +CAPTL_WF,Capital Wind Farm,Wind,0.0 +CATHROCK,Cathedral Rocks Wind Farm,Wind,0.0 +CTHLWF1,Cattle Hill Wind Farm,Wind,0.0 +CHALLHWF,Challicum Hills Wind Farm,Wind,0.0 +CHYTWF1,Cherry Tree Wind Farm,Wind,0.0 +CLEMGPWF,Clements Gap Wind Farm,Wind,0.0 +COLWF01,Collector Wind Farm,Wind,0.0 +COOPGWF1,Coopers Gap Wind Farm,Wind,0.0 +CROOKWF2,Crookwell 2 Wind Farm,Wind,0.0 +CROWLWF1,Crowlands Wind Farm,Wind,0.0 +CRURWF1,Crudine Ridge Wind Farm,Wind,0.0 +CULLRGWF,Cullerin Range Wind Farm,Wind,0.0 +DULAWF1,Dulacca Wind Farm,Wind,0.0 +DUNDWF1,Dundonnell Wind Farm,Wind,0.0 +DUNDWF2,Dundonnell Wind Farm,Wind,0.0 +DUNDWF3,Dundonnell Wind Farm,Wind,0.0 +ELAINWF1,Elaine Wind Farm,Wind,0.0 +GRANWF1,Granville Harbour Wind Farm,Wind,0.0 +GULLRWF1,Gullen Range Wind Farm,Wind,0.0 +GULLRWF2,Gullen Range Wind Farm 2,Wind,0.0 +GUNNING1,Gunning Wind Farm,Wind,0.0 +NBHWF1,Hallett 4 North Brown Hill Wind Farm,Wind,0.0 +BLUFF1,Hallett 5 The Bluff Wind Farm,Wind,0.0 +HALLWF1,Hallett Stage 1 Brown Hill Wind Farm,Wind,0.0 +HALLWF2,Hallett Stage 2 Hallett Hill Wind Farm,Wind,0.0 +HDWF1,Hornsdale Wind Farm Stage 1,Wind,0.0 +HDWF2,Hornsdale Wind Farm Stage 2,Wind,0.0 +HDWF3,Hornsdale Wind Farm Stage 3,Wind,0.0 +KIATAWF1,Kiata Wind Farm,Wind,0.0 +LKBONNY1,Lake Bonney 1 Wind Farm,Wind,0.0 +LKBONNY2,Lake Bonney 2 Wind Farm,Wind,0.0 +LKBONNY3,Lake Bonney 3 Wind Farm,Wind,0.0 +LGAPWF1,Lincoln Gap Wind Farm - stage 1,Wind,0.0 +LGAPWF2,Lincoln Gap Wind Farm - stage 2,Wind,0.0 +MACARTH1,Macarthur Wind Farm,Wind,0.0 +MOORAWF1,Moorabool Wind Farm,Wind,0.0 +MRTLSWF1,Mortlake South Wind Farm,Wind,0.0 +MLWF1,Mortons Lane Wind Farm,Wind,0.0 +MEWF1,Mount Emerald Wind Farm,Wind,0.0 +MTMILLAR,Mount Millar Wind Farm,Wind,0.0 +MERCER01,Mt Mercer Wind Farm,Wind,0.0 +MUWAWF1,Murra Warra Wind Farm - stage 1,Wind,0.0 +MUWAWF2,Murra Warra Wind Farm - stage 2,Wind,0.0 +MUSSELR1,Musselroe Wind Farm,Wind,0.0 +OAKLAND1,Oaklands Hill Wind Farm,Wind,0.0 +PAREPW1,Port Augusta Renewable Energy Park - Wind,Wind,0.0 +PORTWF,Portland Wind Farm,Wind,0.0 +SALTCRK1,Salt Creek Wind Farm,Wind,0.0 +SAPHWF1,Sapphire Wind Farm,Wind,0.0 +STWF1,Silverton Wind Farm,Wind,0.0 +SNOWNTH1,Snowtown S2 Wind Farm,Wind,0.0 +SNOWSTH1,Snowtown S2 Wind Farm,Wind,0.0 +SNOWTWN1,Snowtown Wind Farm,Wind,0.0 +STARHLWF,Starfish Hill Wind Farm,Wind,0.0 +STOCKYD1,Stockyard Hill Wind Farm,Wind,0.0 +TARALGA1,Taralga Wind Farm,Wind,0.0 +WATERLWF,Waterloo Wind Farm,Wind,0.0 +WPWF,Wattle Point Wind Farm,Wind,0.0 +WAUBRAWF,Waubra Wind Farm,Wind,0.0 +WRWF1,White Rock Wind Farm - Stage 1,Wind,0.0 +WGWF1,Willogoleche Wind Farm,Wind,0.0 +WOODLWN1,Woodlawn Wind Farm,Wind,0.0 +WOOLNTH1,Woolnorth Wind Farm,Wind,0.0 +YSWF1,Yaloak South Wind Farm,Wind,0.0 +YAMBUKWF,Yambuk Wind Farm,Wind,0.0 +YENDWF1,Yendon Wind Farm,Wind,0.0 +Tully Sugar Mill Biomass,Tully Sugar Mill Biomass,Biomass,17.5350593311758 +HUNTER1,Hunter Power Station,OCGT (large GT),10.9312436804853 +HUNTER2,Hunter Power Station,OCGT (large GT),10.9312436804853 +Kidston Pumped Storage Hydro 1,Kidston,Pumped Hydro (10hrs storage),0.0 +Kidston Pumped Storage Hydro 2,Kidston,Pumped Hydro (10hrs storage),0.0 +SNO2PH01,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH02,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH03,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH04,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH05,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH06,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +ADPPV1,Adelaide Desalination Plant Solar Farm,Large scale Solar PV,0.0 +AVLSF1,Avonlie Solar Farm,Large scale Solar PV,0.0 +BLUEGSF1,Bluegrass Solar Farm,Large scale Solar PV,0.0 +Broadsound Solar Farm,Broadsound Solar Farm,Large scale Solar PV,0.0 +Bundaberg Solar Farm,Bundaberg Solar Farm,Large scale Solar PV,0.0 +COHUNSF1,Cohuna Solar Farm,Large scale Solar PV,0.0 +COLUMSF1,Columboola Solar Farm,Large scale Solar PV,0.0 +CRWASF1,Corowa Solar Farm,Large scale Solar PV,0.0 +Culcairn Solar Farm,Culcairn Solar Farm,Large scale Solar PV,0.0 +EDENVSF1,Edenvale Solar Park,Large scale Solar PV,0.0 +GANGARR1,Gangarri Solar Farm,Large scale Solar PV,0.0 +GIRGSF,Girgarre Solar Farm,Large scale Solar PV,0.0 +Goorambat East Solar Farm,Goorambat East Solar Farm,Large scale Solar PV,0.0 +KEPSF1,Kennedy Energy Park Solar Farm,Large scale Solar PV,0.0 +KINGASF1,Kingaroy Solar Farm,Large scale Solar PV,0.0 +Lockhart Hybrid Facility - Solar,Lockhart Hybrid Facility - Solar,Large scale Solar PV,0.0 +MANSF2,Mannum Solar Farm 2,Large scale Solar PV,0.0 +METZSF1,Metz Solar Farm,Large scale Solar PV,0.0 +QPSF,Quorn Park Solar Farm,Large scale Solar PV,0.0 +Riverina Solar Farm,Riverina Solar Farm,Large scale Solar PV,0.0 +SEBSF1,Sebastopol Solar Farm,Large scale Solar PV,0.0 +Stubbo Solar Farm,Stubbo Solar Farm,Large scale Solar PV,0.0 +TB2SF1,Tailem Bend Solar Farm - stage 2,Large scale Solar PV,0.0 +Tilbuster Solar Farm,Tilbuster Solar Farm,Large scale Solar PV,0.0 +WAGGNSF1,Wagga North Solar Farm,Large scale Solar PV,0.0 +WLWLSF1,Walla Walla Solar Farm,Large scale Solar PV,0.0 +WLWLSF2,Walla Walla Solar Farm,Large scale Solar PV,0.0 +WANDSF1,Wandoan South Solar Farm - stage 1,Large scale Solar PV,0.0 +WELNSF1,Wellington North Solar Farm (Lightsource),Large scale Solar PV,0.0 +WOLARSF1,Wollar Solar Farm,Large scale Solar PV,0.0 +WUNUSF1,Wunghnu Solar Farm,Large scale Solar PV,0.0 +WYASF1,Wyalong Solar Farm,Large scale Solar PV,0.0 +CLRKCWF1,Clarke Creek Wind Farm,Wind,0.0 +CLRKCWF2,Clarke Creek Wind Farm,Wind,0.0 +CROOKWF3,Crookwell 3 Wind Farm,Wind,0.0 +FLYCRKWF,Flyers Creek Wind Farm,Wind,0.0 +GPWFEST1,Golden Plains Wind Farm East,Wind,0.0 +GPWFEST2,Golden Plains Wind Farm East,Wind,0.0 +GPWFEST3,Golden Plains Wind Farm East,Wind,0.0 +GSWF1A,Goyder South Wind Farm 1A,Wind,0.0 +GSWF1B,Goyder South Wind Farm 1B,Wind,0.0 +HD1WF1,Hawkesdale Wind Farm,Wind,0.0 +KABANWF1,Kaban Green Power Hub - Wind Farm,Wind,0.0 +KEPWF1,Kennedy Energy Park Wind Farm,Wind,0.0 +MacIntyre Wind Farm,MacIntyre Wind Farm,Wind,0.0 +MTGELWF1,Mt Gellibrand Wind Farm,Wind,0.0 +RYANCWF1,Ryan Corner Wind Farm,Wind,0.0 +Rye Park Wind Farm,Rye Park Wind Farm,Wind,0.0 +Wambo Wind Farm,Wambo Wind Farm,Wind,0.0 +Aldoga Solar Farm,Aldoga Solar Farm,Large scale Solar PV,0.0 +Aramara Solar Farm,Aramara Solar Farm,Large scale Solar PV,0.0 +Banksia Solar Farm,Banksia Solar Farm,Large scale Solar PV,0.0 +Derby Solar Farm,Derby Solar Farm,Large scale Solar PV,0.0 +Frasers Solar Farm,Frasers Solar Farm,Large scale Solar PV,0.0 +Goulburn River Solar Farm,Goulburn River Solar Farm,Large scale Solar PV,0.0 +Horsham Solar Farm,Horsham Solar Farm,Large scale Solar PV,0.0 +Maryvale Solar Farm,Maryvale Solar Farm,Large scale Solar PV,0.0 +Mortlake Energy Hub Solar Farm,Mortlake Energy Hub Solar Farm,Large scale Solar PV,0.0 +Munna Creek Solar Farm,Munna Creek Solar Farm,Large scale Solar PV,0.0 +New England Solar Farm 2,New England Solar Farm - Stage 2,Large scale Solar PV,0.0 +Punch's Creek Renewable Energy Solar Farm,Punch's Creek Renewable Energy Solar Farm,Large scale Solar PV,0.0 +GBWF1,Gawara Baya Wind Farm,Wind,0.0 +Uungula Wind Farm,Uungula Wind Farm,Wind,0.0 +Woolsthorpe Wind Farm,Woolsthorpe Wind Farm,Wind,0.0 +BALB1,Ballarat Energy Storage System,Battery storage (1hr storage),0.0 +BOWWBA1,Bolivar Waste Water Treatment BESS,Battery storage (2hrs storage),0.0 +BBATTERY,Bouldercombe Battery project,Battery storage (2hrs storage),0.0 +BULBES1,Bulgana Green Power Hub BESS,Battery storage (2hrs storage),0.0 +DALNTH1,Dalrymple BESS,Battery storage (1hr storage),0.0 +DPNTB1,Darlington Point Energy Storage System,Battery storage (2hrs storage),0.0 +GANNB1,Gannawarra Energy Storage System,Battery storage (2hrs storage),0.0 +HVWWBA1,Happy Valley Reservoir BESS,Battery storage (2hrs storage),0.0 +HPR1,Hornsdale Power Reserve Unit 1,Battery storage (1hr storage),0.0 +LBBG1,Lake Bonney BESS,Battery storage (2hrs storage),0.0 +PIBESS1,Philip Island BESS,Battery storage (2hrs storage),0.0 +QBYNB1,Queanbeyan BESS,Battery storage (2hrs storage),0.0 +RANGEB1,Rangebank BESS,Battery storage (2hrs storage),0.0 +RESS1G,Riverina Energy Storage System 1,Battery storage (2hrs storage),0.0 +RIVNB2,Riverina Energy Storage System 2,Battery storage (2hrs storage),0.0 +VBB1,Victorian Big Battery,Battery storage (2hrs storage),0.0 +WALGRV1,Wallgrove Grid Battery project,Battery storage (2hrs storage),0.0 +WANDB1,Wandoan South BESS,Battery storage (2hrs storage),0.0 +ADPBA1,Adelaide Desalination Plant BESS,Battery storage (2hrs storage),0.0 +BLYTHB1,Blyth BESS,Battery storage (2hrs storage),0.0 +BHBG1,Broken Hill BESS,Battery storage (1hr storage),0.0 +CAPBES1,Capital Battery,Battery storage (2hrs storage),0.0 +CHBESSG1,Chinchilla BESS,Battery storage (2hrs storage),0.0 +CBWWBA1,Christies Beach Wastewater Treatment Plant BESS,Battery storage (2hrs storage),0.0 +Clements Gap BESS,Clements Gap BESS,Battery storage (2hrs storage),0.0 +Eraring Big Battery,Eraring Big Battery,Battery storage (2hrs storage),0.0 +GREENB1,Greenbank BESS,Battery storage (2hrs storage),0.0 +HBESS1,Hazelwood BESS,Battery storage (1hr storage),0.0 +Koorangie Energy Storage System,Koorangie Energy Storage System,Battery storage (2hrs storage),0.0 +LaTrobe Valley BESS,LaTrobe Valley BESS,Battery storage (2hrs storage),0.0 +Liddell BESS,Liddell BESS,Battery storage (4hrs storage),0.0 +Lockhart Hybrid Facility - Battery,Lockhart Hybrid Facility - Battery,Battery storage (2hrs storage),0.0 +Melbourne Renewable Energy Hub - Side A,Melbourne Renewable Energy Hub - Side A,Battery storage (2hrs storage),0.0 +QPBESS,Quorn Park BESS,Battery storage (2hrs storage),0.0 +TB2BG1,Tailem Bend Battery Project,Battery storage (2hrs storage),0.0 +Tarong BESS,Tarong BESS,Battery storage (1hr storage),0.0 +Templers BESS,Templers BESS,Battery storage (2hrs storage),0.0 +TIB1,Torrens Island BESS,Battery storage (1hr storage),0.0 +ULBESS,Ulinda Park BESS,Battery storage (2hrs storage),0.0 +WTAHB1,Waratah Super Battery,Battery storage (2hrs storage),0.0 +WDBESS1,Western Downs Battery,Battery storage (1hr storage),0.0 +Aldoga BESS Stage 1,Aldoga BESS Stage 1,Battery storage (1hr storage),0.0 +Brendale BESS,Brendale BESS,Battery storage (2hrs storage),0.0 +Bungama Solar BESS,Bungama Solar BESS,Battery storage (2hrs storage),0.0 +Eraring Big Battery 2,Eraring Big Battery 2,Battery storage (2hrs storage),0.0 +GBBATT1,Gawara Baya Wind Farm BESS,Battery storage (2hrs storage),0.0 +Gnarwarre BESS,Gnarwarre BESS,Battery storage (2hrs storage),0.0 +Limondale BESS,Limondale BESS,Battery storage (8hrs storage),0.0 +LGAPBS1,Lincoln Gap Wind Farm BESS,Battery storage (1hr storage),0.0 +Mannum BESS,Mannum BESS,Battery storage (2hrs storage),0.0 +Maryvale Solar Farm BESS,Maryvale Solar Farm BESS,Battery storage (2hrs storage),0.0 +Mortlake Battery,Mortlake Battery,Battery storage (2hrs storage),0.0 +Mortlake Energy Hub BESS,Mortlake Energy Hub BESS,Battery storage (2hrs storage),0.0 +Mt Fox BESS,Mt Fox BESS,Battery storage (2hrs storage),0.0 +New England Solar Farm BESS,New England Solar Farm BESS,Battery storage (1hr storage),0.0 +ORANA,Orana BESS,Battery storage (4hrs storage),0.0 +Richmond Valley BESS,Richmond Valley BESS,Battery storage (8hrs storage),0.0 +Silver City Energy Storage,Silver City Energy Storage,Battery storage (8hrs storage),0.0 +Smithfield BESS,Smithfield BESS,Battery storage (2hrs storage),0.0 +Stanwell BESS,Stanwell BESS,Battery storage (2hrs storage),0.0 +Swanbank BESS,Swanbank BESS,Battery storage (2hrs storage),0.0 +TRGBESS,Terang BESS,Battery storage (2hrs storage),0.0 +Wooreen Energy Storage System,Wooreen Energy Storage System,Battery storage (4hrs storage),0.0 +Kogan Gas,Brigalow GT,OCGT (large GT),10.9312436804853 +Fulham Solar Farm,Fulham Solar Farm,Large scale Solar PV,0.0 +Solar River Solar Farm,Solar River Solar Farm,Large scale Solar PV,0.0 +Coppabella Wind Farm,Coppabella Wind Farm,Wind,0.0 +Derby Solar Project BESS,Derby Solar Project BESS,Battery storage (2hrs storage),0.0 +Fulham Solar Farm BESS,Fulham Solar Farm BESS,Battery storage (1hr storage),0.0 +Goulburn River BESS,Goulburn River BESS,Battery storage (8hrs storage),0.0 +Hallett BESS,Hallett BESS,Battery storage (4hrs storage),0.0 +Horsham Solar Farm BESS,Horsham Solar Farm BESS,Battery storage (2hrs storage),0.0 +Limestone Coast West BESS,Limestone Coast West BESS,Battery storage (2hrs storage),0.0 +Solar River Solar Farm BESS,Solar River Solar Farm BESS,Battery storage (4hrs storage),0.0 +Springvale Energy Hub BESS,Springvale Energy Hub BESS,Battery storage (2hrs storage),0.0 +Mornington BESS,Mornington BESS,Battery storage (2hrs storage),0.0 +Tamworth BESS,Tamworth BESS,Battery storage (2hrs storage),0.0 +Tamworth BESS 2,Tamworth BESS,Battery storage (2hrs storage),0.0 +QEJP - Borumba,QEJP - Borumba,Pumped Hydro (24hrs storage),0.0 +Broadsound BESS,Broadsound BESS,Battery storage (2hrs storage),0.0 +Calala BESS 1,Calala BESS 1,Battery storage (2hrs storage),0.0 +Calala BESS 2,Calala BESS 2,Battery storage (2hrs storage),0.0 +Glanmire Solar Farm BESS,Glanmire Solar Farm BESS,Battery storage (2hrs storage),0.0 +Ravenswood BESS,Ravenswood BESS,Battery storage (4hrs storage),0.0 +Bullyard Solar Farm,Bullyard Solar Farm,Large scale Solar PV,0.0 +Glanmire Solar Farm,Glanmire Solar Farm,Large scale Solar PV,0.0 +Ravenswood Solar Farm,Ravenswood Solar Farm,Large scale Solar PV,0.0 +Lockyer Valley GT,Lockyer Valley GT,OCGT (small GT),10.648730964467 +Boulder Creek Wind Farm,Boulder Creek Wind Farm,Wind,0.0 +Inverleigh Wind Farm,Inverleigh Wind Farm,Wind,0.0 +Port Latta Wind Farm,Port Latta Wind Farm,Wind,0.0 +Valley of the Winds Wind Farm,Valley of the Winds,Wind,0.0 +Woolooga BESS,Woolooga BESS,Battery storage (2hrs storage),0.0 +Supernode BESS 1,Supernode BESS 1,Battery storage (4hrs storage),0.0 +Supernode BESS 2,Supernode BESS 2,Battery storage (4hrs storage),0.0 +Golden Plains West Wind Farm,Golden Plains West Wind Farm,Wind,0.0 +Lotus Creek Wind Farm,Lotus Creek Wind Farm,Wind,0.0 +Barnawartha Solar Farm BESS,Barnawartha Solar Farm BESS,Battery storage (2hrs storage),0.0 +Barwon Solar Farm BESS,Barwon Solar Farm BESS,Battery storage (2hrs storage),0.0 +Bungama BESS,Bungama BESS,Battery storage (2hrs storage),0.0 +Elaine Solar Farm BESS,Elaine Solar Farm BESS,Battery storage (2hrs storage),0.0 +Ganymirra Solar Power Station BESS,Ganymirra Solar Power Station BESS,Battery storage (2hrs storage),0.0 +Junction Rivers Wind Farm BESS,Junction Rivers Wind Farm BESS,Battery storage (4hrs storage),0.0 +Majors Creek Solar Power Station BESS,Majors Creek Power Station BESS,Battery storage (4hrs storage),0.0 +West Mokoan Solar Farm BESS,West Mokoan Solar Farm BESS,Battery storage (4hrs storage),0.0 +Griffith BESS,Griffith BESS,Battery storage (8hrs storage),0.0 +Stoney Creek BESS,Stoney Creek BESS,Battery storage (8hrs storage),0.0 +Barnawartha Solar Farm,Barnawartha Solar Farm,Large scale Solar PV,0.0 +Barwon Solar Farm,Barwon Solar Farm,Large scale Solar PV,0.0 +Campbells Forest Solar Farm,Campbells Forest Solar Farm,Large scale Solar PV,0.0 +Elaine Solar Farm,Elaine Solar Farm,Large scale Solar PV,0.0 +Ganymirra Solar Power Station,Ganymirra Solar Power Station,Large scale Solar PV,0.0 +Hopeland Solar Farm,Hopeland Solar Farm,Large scale Solar PV,0.0 +Majors Creek Solar Power Station,Majors Creek Power Station,Large scale Solar PV,0.0 +Sandy Creek Solar Farm,Sandy Creek Solar Farm,Large scale Solar PV,0.0 +West Mokoan Solar Farm,West Mokoan Solar Farm,Large scale Solar PV,0.0 +Phoenix Pumped Hydro Project,Phoenix Pumped Hydro Project,Pumped Hydro (10hrs storage),0.0 +Goyder North Wind Farm,Goyder North Wind Farm,Wind,0.0 +Junction Rivers Wind Farm,Junction Rivers Wind Farm,Wind,0.0 +Kentbruck Green Power Hub Wind Farm,Kentbruck Green Power Hub Wind Farm,Wind,0.0 +Palmer Wind Farm,Palmer Wind Farm,Wind,0.0 +Spicers Creek Wind Farm,Spicers Creek Wind Farm,Wind,0.0 +Thunderbolt Wind Farm,Thunderbolt Wind Farm,Wind,0.0 +Haughton Solar Farm Stage 2,Haughton Solar Farm Stage 2,Large scale Solar PV,0.0 +Lancaster Solar Farm,Lancaster Solar Farm,Large scale Solar PV,0.0 +Bennetts Creek BESS,Bennetts Creek BESS,Battery storage (2hrs storage),0.0 +Northern Midlands Solar Farm,Northern Midlands Solar Farm,Large scale Solar PV,0.0 +Hay Sun Farm,Hay Sun Farm,Large scale Solar PV,0.0 +MOKOSF1,Mokoan Solar Farm,Large scale Solar PV,0.0 +Kiamal BESS,Kiamal BESS,Battery storage (4hrs storage),0.0 +Pine Lodge BESS,Pine Lodge BESS,Battery storage (2hrs storage),0.0 diff --git a/tests/test_workbook_table_cache/7.5/maximum_capacity_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/7.5/maximum_capacity_existing_committed_anticipated_additional_generators.csv new file mode 100644 index 00000000..1621402a --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/maximum_capacity_existing_committed_anticipated_additional_generators.csv @@ -0,0 +1,643 @@ +IASR ID,Power Station,Status,Technology,Region,Installed capacity (MW),Storage Capacity (MWh),Commissioning date,Policy +BW01,Bayswater,Existing,Steam Sub Critical,NSW,660.0,,, +BW02,Bayswater,Existing,Steam Sub Critical,NSW,685.0,,, +BW03,Bayswater,Existing,Steam Sub Critical,NSW,685.0,,, +BW04,Bayswater,Existing,Steam Sub Critical,NSW,685.0,,, +CALL_B_1,Callide B,Existing,Steam Sub Critical,QLD,350.0,,, +CALL_B_2,Callide B,Existing,Steam Sub Critical,QLD,350.0,,, +CPP_3,Callide C,Existing,Steam Super Critical,QLD,424.0,,, +CPP_4,Callide C,Existing,Steam Super Critical,QLD,420.0,,, +ER01,Eraring,Existing,Steam Sub Critical,NSW,720.0,,, +ER02,Eraring,Existing,Steam Sub Critical,NSW,720.0,,, +ER03,Eraring,Existing,Steam Sub Critical,NSW,720.0,,, +ER04,Eraring,Existing,Steam Sub Critical,NSW,720.0,,, +GSTONE1,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +GSTONE2,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +GSTONE3,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +GSTONE4,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +GSTONE5,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +GSTONE6,Gladstone,Existing,Steam Sub Critical,QLD,280.0,,, +KPP_1,Kogan Creek,Existing,Steam Super Critical,QLD,744.0,,, +MPP_1,Millmerran,Existing,Steam Super Critical,QLD,426.0,,, +MPP_2,Millmerran,Existing,Steam Super Critical,QLD,426.0,,, +MP1,Mt Piper,Existing,Steam Sub Critical,NSW,730.0,,, +MP2,Mt Piper,Existing,Steam Sub Critical,NSW,660.0,,, +STAN-1,Stanwell,Existing,Steam Sub Critical,QLD,365.0,,, +STAN-2,Stanwell,Existing,Steam Sub Critical,QLD,365.0,,, +STAN-3,Stanwell,Existing,Steam Sub Critical,QLD,365.0,,, +STAN-4,Stanwell,Existing,Steam Sub Critical,QLD,365.0,,, +TARONG#1,Tarong,Existing,Steam Sub Critical,QLD,350.0,,, +TARONG#2,Tarong,Existing,Steam Sub Critical,QLD,350.0,,, +TARONG#3,Tarong,Existing,Steam Sub Critical,QLD,350.0,,, +TARONG#4,Tarong,Existing,Steam Sub Critical,QLD,350.0,,, +TNPS1,Tarong North,Existing,Steam Super Critical,QLD,450.0,,, +VP5,Vales Point B,Existing,Steam Sub Critical,NSW,660.0,,, +VP6,Vales Point B,Existing,Steam Sub Critical,NSW,660.0,,, +LYA1,Loy Yang A Power Station,Existing,Steam Sub Critical,VIC,560.0,,, +LYA2,Loy Yang A Power Station,Existing,Steam Sub Critical,VIC,530.0,,, +LYA3,Loy Yang A Power Station,Existing,Steam Sub Critical,VIC,560.0,,, +LYA4,Loy Yang A Power Station,Existing,Steam Sub Critical,VIC,560.0,,, +LOYYB1,Loy Yang B,Existing,Steam Sub Critical,VIC,580.0,,, +LOYYB2,Loy Yang B,Existing,Steam Sub Critical,VIC,580.0,,, +YWPS1,Yallourn W,Existing,Steam Sub Critical,VIC,350.0,,, +YWPS2,Yallourn W,Existing,Steam Sub Critical,VIC,350.0,,, +YWPS3,Yallourn W,Existing,Steam Sub Critical,VIC,375.0,,, +YWPS4,Yallourn W,Existing,Steam Sub Critical,VIC,375.0,,, +ANGAS1,Angaston,Existing,Reciprocating engine,SA,30.8,,, +ANGAS2,Angaston,Existing,Reciprocating engine,SA,15.4,,, +BDL01,Bairnsdale,Existing,OCGT (small GT),VIC,47.0,,, +BDL02,Bairnsdale,Existing,OCGT (small GT),VIC,47.0,,, +BARCALDN,Barcaldine Power Station,Existing,OCGT (small GT),QLD,37.0,,, +BIPS1_01,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_02,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_03,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_04,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_05,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_06,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_07,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_08,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_09,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_10,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_11,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BIPS1_12,Barker Inlet Power Station,Existing,Reciprocating engine,SA,17.5,,, +BBTHREE1,Bell Bay Three,Existing,OCGT (large GT),TAS,40.0,,, +BBTHREE2,Bell Bay Three,Existing,OCGT (large GT),TAS,40.0,,, +BBTHREE3,Bell Bay Three,Existing,OCGT (large GT),TAS,40.0,,, +BOLIVPS1_1,Bolivar Power Station,Existing,OCGT (small GT),SA,32.1,,, +BOLIVPS1_2,Bolivar Power Station,Existing,OCGT (small GT),SA,32.1,,, +BOLIVPS1_3,Bolivar Power Station,Existing,OCGT (small GT),SA,32.1,,, +BOLIVPS1_4,Bolivar Power Station,Existing,OCGT (small GT),SA,32.1,,, +BRAEMAR1,Braemar,Existing,OCGT (large GT),QLD,188.0,,, +BRAEMAR2,Braemar,Existing,OCGT (large GT),QLD,188.0,,, +BRAEMAR3,Braemar,Existing,OCGT (large GT),QLD,188.0,,, +BRAEMAR5,Braemar 2 Power Station,Existing,OCGT (large GT),QLD,173.0,,, +BRAEMAR6,Braemar 2 Power Station,Existing,OCGT (large GT),QLD,173.0,,, +BRAEMAR7,Braemar 2 Power Station,Existing,OCGT (large GT),QLD,173.0,,, +CG1,Colongra,Existing,OCGT (small GT),NSW,181.0,,, +CG2,Colongra,Existing,OCGT (small GT),NSW,181.0,,, +CG3,Colongra,Existing,OCGT (small GT),NSW,181.0,,, +CG4,Colongra,Existing,OCGT (small GT),NSW,181.0,,, +CPSA_GT1,Condamine A,Existing,CCGT - Gas Turbine,QLD,43.7,,, +CPSA_GT2,Condamine A,Existing,CCGT - Gas Turbine,QLD,43.7,,, +CPSA_ST,Condamine A,Existing,CCGT - Steam Turbine,QLD,57.0,,, +DDPS1_GT1,Darling Downs,Existing,CCGT - Gas Turbine,QLD,121.5,,, +DDPS1_GT2,Darling Downs,Existing,CCGT - Gas Turbine,QLD,121.5,,, +DDPS1_GT3,Darling Downs,Existing,CCGT - Gas Turbine,QLD,121.5,,, +DDPS1_ST,Darling Downs,Existing,CCGT - Steam Turbine,QLD,280.0,,, +DRYCGT1,Dry Creek GT,Existing,OCGT (small GT),SA,52.0,,, +DRYCGT2,Dry Creek GT,Existing,OCGT (small GT),SA,52.0,,, +DRYCGT3,Dry Creek GT,Existing,OCGT (small GT),SA,52.0,,, +AGLHAL01,Hallett GT,Existing,OCGT (small GT),SA,18.9,,, +AGLHAL02,Hallett GT,Existing,OCGT (small GT),SA,18.9,,, +AGLHAL03,Hallett GT,Existing,OCGT (small GT),SA,20.75,,, +AGLHAL04,Hallett GT,Existing,OCGT (small GT),SA,17.0,,, +AGLHAL05,Hallett GT,Existing,OCGT (small GT),SA,20.75,,, +AGLHAL06,Hallett GT,Existing,OCGT (small GT),SA,18.0,,, +AGLHAL07,Hallett GT,Existing,OCGT (small GT),SA,21.76,,, +AGLHAL08,Hallett GT,Existing,OCGT (small GT),SA,27.0,,, +AGLHAL09,Hallett GT,Existing,OCGT (small GT),SA,25.6,,, +AGLHAL10,Hallett GT,Existing,OCGT (small GT),SA,17.0,,, +AGLHAL11,Hallett GT,Existing,OCGT (small GT),SA,17.0,,, +AGLHAL12,Hallett GT,Existing,OCGT (small GT),SA,17.0,,, +AGLHALRE,Hallett GT,Existing,OCGT (small GT),SA,37.2,,, +HEZ1,Hunter Economic Zone,Existing,Reciprocating engine,NSW,20.8,,, +JLA01,Jeeralang A,Existing,OCGT (small GT),VIC,53.0,,, +JLA02,Jeeralang A,Existing,OCGT (small GT),VIC,53.0,,, +JLA03,Jeeralang A,Existing,OCGT (small GT),VIC,53.0,,, +JLA04,Jeeralang A,Existing,OCGT (small GT),VIC,53.0,,, +JLB01,Jeeralang B,Existing,OCGT (small GT),VIC,76.0,,, +JLB02,Jeeralang B,Existing,OCGT (small GT),VIC,76.0,,, +JLB03,Jeeralang B,Existing,OCGT (small GT),VIC,76.0,,, +LADBROK1,Ladbroke Grove,Existing,OCGT (small GT),SA,40.0,,, +LADBROK2,Ladbroke Grove,Existing,OCGT (small GT),SA,40.0,,, +LNGS1,Laverton North,Existing,OCGT (large GT),VIC,156.0,,, +LNGS2,Laverton North,Existing,OCGT (large GT),VIC,156.0,,, +LONSDALE,Lonsdale,Existing,Reciprocating engine,SA,20.16,,, +MINTARO,Mintaro GT,Existing,OCGT (small GT),SA,90.0,,, +MORTLK11,Mortlake,Existing,OCGT (large GT),VIC,292.0,,, +MORTLK12,Mortlake,Existing,OCGT (large GT),VIC,292.0,,, +MSTUART1,Mt Stuart,Existing,OCGT (small GT),QLD,146.0,,, +MSTUART2,Mt Stuart,Existing,OCGT (small GT),QLD,146.0,,, +MSTUART3,Mt Stuart,Existing,OCGT (small GT),QLD,131.5,,, +NPS,Newport,Existing,CCGT - Steam Turbine,VIC,500.0,,, +OAKEY1,Oakey Power Station,Existing,OCGT (large GT),QLD,173.0,,, +OAKEY2,Oakey Power Station,Existing,OCGT (large GT),QLD,173.0,,, +OsborneGT,Osborne,Existing,CCGT - Gas Turbine,SA,118.0,,, +OsborneST,Osborne,Existing,CCGT - Steam Turbine,SA,62.0,,, +PPCCGTGT1,Pelican Point,Existing,CCGT - Gas Turbine,SA,179.0,,, +PPCCGTGT2,Pelican Point,Existing,CCGT - Gas Turbine,SA,179.0,,, +PPCCGTST,Pelican Point,Existing,CCGT - Steam Turbine,SA,171.0,,, +POR01-1,Port Lincoln GT,Existing,OCGT (small GT),SA,25.0,,, +POR01-2,Port Lincoln GT,Existing,OCGT (small GT),SA,25.0,,, +POR01-3,Port Lincoln GT,Existing,OCGT (small GT),SA,23.5,,, +PTSTAN1_1,Port Stanvac 1,Existing,Reciprocating engine,SA,28.26,,, +PTSTAN1_2,Port Stanvac 1,Existing,Reciprocating engine,SA,28.26,,, +QPS1,Quarantine,Existing,OCGT (small GT),SA,29.0,,, +QPS2,Quarantine,Existing,OCGT (small GT),SA,24.0,,, +QPS3,Quarantine,Existing,OCGT (small GT),SA,29.0,,, +QPS4,Quarantine,Existing,OCGT (small GT),SA,24.0,,, +QPS5,Quarantine,Existing,OCGT (small GT),SA,128.0,,, +ROMA_7,Roma,Existing,OCGT (small GT),QLD,40.0,,, +ROMA_8,Roma,Existing,OCGT (small GT),QLD,40.0,,, +SITHE01,Smithfield Energy Facility,Existing,OCGT (small GT),NSW,125.699999999999,,, +SNAPPER1_1,Snapper Point Power Station,Existing,OCGT (small GT),SA,30.8,,, +SNAPPER1_2,Snapper Point Power Station,Existing,OCGT (small GT),SA,30.8,,, +SNAPPER1_3,Snapper Point Power Station,Existing,OCGT (small GT),SA,30.8,,, +SNAPPER1_4,Snapper Point Power Station,Existing,OCGT (small GT),SA,30.8,,, +SNAPPER1_5,Snapper Point Power Station,Existing,OCGT (small GT),SA,30.8,,, +SNUG1,Snuggery,Existing,OCGT (small GT),SA,21.0,,, +SNUG2,Snuggery,Existing,OCGT (small GT),SA,21.0,,, +SNUG3,Snuggery,Existing,OCGT (small GT),SA,21.0,,, +AGLSOM01,Somerton,Existing,OCGT (small GT),VIC,42.5,,, +AGLSOM02,Somerton,Existing,OCGT (small GT),VIC,42.5,,, +AGLSOM03,Somerton,Existing,OCGT (small GT),VIC,42.5,,, +AGLSOM04,Somerton,Existing,OCGT (small GT),VIC,42.5,,, +SWAN_E,Swanbank E GT,Existing,CCGT,QLD,385.0,,, +TALWA1,Tallawarra,Existing,CCGT,NSW,400.0,,, +Tallawarra B,Tallawarra B,Existing,OCGT (large GT),NSW,320.0,,, +TVCC201_GT,Tamar Valley Combined Cycle,Existing,CCGT - Gas Turbine,TAS,140.0,,, +TVCC201_ST,Tamar Valley Combined Cycle,Existing,CCGT - Steam Turbine,TAS,68.0,,, +TVPP104,Tamar Valley Peaking,Existing,OCGT (large GT),TAS,58.0,,, +TORRB1,Torrens Island B,Existing,CCGT - Steam Turbine,SA,200.0,,, +TORRB2,Torrens Island B,Existing,CCGT - Steam Turbine,SA,200.0,,, +TORRB3,Torrens Island B,Existing,CCGT - Steam Turbine,SA,200.0,,, +TORRB4,Torrens Island B,Existing,CCGT - Steam Turbine,SA,200.0,,, +YABULU,Townsville Power Station,Existing,CCGT - Gas Turbine,QLD,160.0,,, +YABULU2,Townsville Power Station,Existing,CCGT - Steam Turbine,QLD,84.0,,, +URANQ11,Uranquinty,Existing,OCGT (large GT),NSW,173.0,,, +URANQ12,Uranquinty,Existing,OCGT (large GT),NSW,173.0,,, +URANQ13,Uranquinty,Existing,OCGT (large GT),NSW,173.0,,, +URANQ14,Uranquinty,Existing,OCGT (large GT),NSW,173.0,,, +VPGS1,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +VPGS2,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +VPGS3,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +VPGS4,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +VPGS5,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +VPGS6,Valley Power,Existing,OCGT (small GT),VIC,50.0,,, +YARWUN_1,Yarwun Cogen,Existing,CCGT,QLD,180.0,,, +BARRON-1,Barron Gorge,Existing,Hydro,QLD,35.0,,, +BARRON-2,Barron Gorge,Existing,Hydro,QLD,35.0,,, +BASTYAN,Bastyan,Existing,Hydro,TAS,79.9,,, +BLOWERNG,Blowering,Existing,Hydro,NSW,80.0,,, +BOGONG1,Bogong / Mackay,Existing,Hydro,VIC,70.0,,, +BOGONG2,Bogong / Mackay,Existing,Hydro,VIC,70.0,,, +MCKAY11,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +MCKAY12,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +MCKAY13,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +MCKAY14,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +MCKAY15,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +MCKAY16,Bogong / Mackay,Existing,Hydro,VIC,26.67,,, +LI111-1,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,27.9,,, +LI112-2,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,27.9,,, +LI113-3,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,31.5,,, +CA111-1,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,27.0,,, +CA112-2,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,24.0,,, +WY111-1,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,12.8,,, +WY111-2,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,12.8,,, +WY111-3,Catagunya / Liapootah / Wayatinah,Existing,Hydro,TAS,12.8,,, +CETHANA,Cethana,Existing,Hydro,TAS,85.0,,, +DARTM1,Dartmouth,Existing,Hydro,VIC,185.0,,, +DEVILS_G,Devils Gate,Existing,Hydro,TAS,60.0,,, +EILDON1,Eildon,Existing,Hydro,VIC,67.5,,, +EILDON2,Eildon,Existing,Hydro,VIC,67.5,,, +FISHER,Fisher,Existing,Hydro,TAS,43.2,,, +GO181-1,Gordon,Existing,Hydro,TAS,144.0,,, +GO182-2,Gordon,Existing,Hydro,TAS,144.0,,, +GO183-3,Gordon,Existing,Hydro,TAS,144.0,,, +GUTHEGA1,Guthega,Existing,Hydro,NSW,30.0,,, +GUTHEGA2,Guthega,Existing,Hydro,NSW,30.0,,, +HUMENSW,Hume Dam NSW,Existing,Hydro,NSW,29.0,,, +HUMEV,Hume Dam VIC,Existing,Hydro,VIC,29.0,,, +JBUTTERS,John Butters,Existing,Hydro,TAS,144.0,,, +KAREEYA1,Kareeya,Existing,Hydro,QLD,21.6,,, +KAREEYA2,Kareeya,Existing,Hydro,QLD,21.6,,, +KAREEYA3,Kareeya,Existing,Hydro,QLD,21.6,,, +KAREEYA4,Kareeya,Existing,Hydro,QLD,21.6,,, +LK_ECHO,Lake Echo,Existing,Hydro,TAS,32.4,,, +LM111-1,Lemonthyme / Wilmot,Existing,Hydro,TAS,51.0,,, +WI111-1,Lemonthyme / Wilmot,Existing,Hydro,TAS,30.6,,, +MACKNTSH,Mackintosh,Existing,Hydro,TAS,79.9,,, +MEADOWBK,Meadowbank,Existing,Hydro,TAS,40.0,,, +MURRAY01,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY02,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY03,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY04,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY05,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY06,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY07,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY08,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY09,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY10,Murray 1,Existing,Hydro,VIC,95.0,,, +MURRAY11,Murray 2,Existing,Hydro,VIC,150.0,,, +MURRAY12,Murray 2,Existing,Hydro,VIC,150.0,,, +MURRAY13,Murray 2,Existing,Hydro,VIC,150.0,,, +MURRAY14,Murray 2,Existing,Hydro,VIC,150.0,,, +PO161-1,Poatina,Existing,Hydro,TAS,50.0,,, +PO162-2,Poatina,Existing,Hydro,TAS,50.0,,, +PO163-3,Poatina,Existing,Hydro,TAS,50.0,,, +PO164-4,Poatina,Existing,Hydro,TAS,50.0,,, +PO165-5,Poatina,Existing,Hydro,TAS,50.0,,, +PO166-6,Poatina,Existing,Hydro,TAS,50.0,,, +REECE1,Reece,Existing,Hydro,TAS,115.6,,, +REECE2,Reece,Existing,Hydro,TAS,115.6,,, +SHGEN01,Shoalhaven,Existing,Hydro,NSW,41.0,240.0,, +SHGEN02,Shoalhaven,Existing,Hydro,NSW,41.0,240.0,, +SHGEN03,Shoalhaven,Existing,Hydro,NSW,82.5,4600.0,, +SHGEN04,Shoalhaven,Existing,Hydro,NSW,82.5,4600.0,, +TA111-1,Tarraleah,Existing,Hydro,TAS,15.0,,, +TA111-2,Tarraleah,Existing,Hydro,TAS,15.0,,, +TA111-3,Tarraleah,Existing,Hydro,TAS,15.0,,, +TA112-4,Tarraleah,Existing,Hydro,TAS,15.0,,, +TA112-5,Tarraleah,Existing,Hydro,TAS,15.0,,, +TA112-6,Tarraleah,Existing,Hydro,TAS,15.0,,, +TR111-1,Trevallyn,Existing,Hydro,TAS,20.0,,, +TR111-2,Trevallyn,Existing,Hydro,TAS,20.0,,, +TR112-3,Trevallyn,Existing,Hydro,TAS,26.5,,, +TR112-4,Trevallyn,Existing,Hydro,TAS,26.5,,, +TRIBUTE,Tribute,Existing,Hydro,TAS,82.8,,, +TUMUT3_01,Tumut 3,Existing,Hydro,NSW,250.0,,, +TUMUT3_02,Tumut 3,Existing,Hydro,NSW,250.0,,, +TUMUT3_03,Tumut 3,Existing,Hydro,NSW,250.0,,, +TUMUT3_04,Tumut 3,Existing,Hydro,NSW,250.0,,, +TUMUT3_05,Tumut 3,Existing,Hydro,NSW,250.0,,, +TUMUT3_06,Tumut 3,Existing,Hydro,NSW,250.0,,, +TU111-1,Tungatinah,Existing,Hydro,TAS,25.0,,, +TU112-2,Tungatinah,Existing,Hydro,TAS,25.0,,, +TU113-3,Tungatinah,Existing,Hydro,TAS,25.0,,, +TU114-4,Tungatinah,Existing,Hydro,TAS,25.0,,, +TU115-5,Tungatinah,Existing,Hydro,TAS,25.0,,, +TUMUT1_01,Upper Tumut,Existing,Hydro,NSW,82.0,,, +TUMUT1_02,Upper Tumut,Existing,Hydro,NSW,82.0,,, +TUMUT1_03,Upper Tumut,Existing,Hydro,NSW,82.0,,, +TUMUT1_04,Upper Tumut,Existing,Hydro,NSW,82.0,,, +TUMUT2_01,Upper Tumut,Existing,Hydro,NSW,72.0,,, +TUMUT2_02,Upper Tumut,Existing,Hydro,NSW,72.0,,, +TUMUT2_03,Upper Tumut,Existing,Hydro,NSW,72.0,,, +TUMUT2_04,Upper Tumut,Existing,Hydro,NSW,72.0,,, +WKIEWA1_1,West Kiewa,Existing,Hydro,VIC,17.0,,, +WKIEWA1_2,West Kiewa,Existing,Hydro,VIC,17.0,,, +WKIEWA2_1,West Kiewa,Existing,Hydro,VIC,17.0,,, +WKIEWA2_2,West Kiewa,Existing,Hydro,VIC,17.0,,, +W/HOE#1,Wivenhoe,Existing,Hydro,QLD,285.0,3000.0,, +W/HOE#2,Wivenhoe,Existing,Hydro,QLD,285.0,3000.0,, +BANN1,Bannerton Solar Park,Existing,Large scale Solar PV,VIC,100.0,,, +BERYLSF1,Beryl Solar Farm,Existing,Large scale Solar PV,NSW,98.4,,, +BOWWPV1,Bolivar Waste Water Treatment Solar Farm,Existing,Large scale Solar PV,SA,8.25,,, +BOMENSF1,Bomen Solar Farm,Existing,Large scale Solar PV,NSW,121.0,,, +BROKENH1,Broken Hill Solar Farm,Existing,Large scale Solar PV,NSW,53.0,,, +BNGSF1,Bungala One Solar Farm,Existing,Large scale Solar PV,SA,135.0,,, +BNGSF2,Bungala Two Solar Farm,Existing,Large scale Solar PV,SA,135.0,,, +CHILDSF1,Childers Solar Farm,Existing,Large scale Solar PV,QLD,64.38,,, +CLARESF1,Clare Solar Farm,Existing,Large scale Solar PV,QLD,110.4,,, +CLERMSF1,Clermont Solar Farm,Existing,Large scale Solar PV,QLD,92.5,,, +COLEASF1,Coleambally Solar Farm,Existing,Large scale Solar PV,NSW,150.3,,, +CSPVPS1,Collinsville Solar Farm,Existing,Large scale Solar PV,QLD,42.5,,, +DDSF1,Darling Downs Solar Farm,Existing,Large scale Solar PV,QLD,121.0,,, +DARLSF1,Darlington Point Solar Farm,Existing,Large scale Solar PV,NSW,274.97,,, +DAYDSF1,Daydream Solar Farm,Existing,Large scale Solar PV,QLD,167.75,,, +EMERASF1,Emerald Solar Farm,Existing,Large scale Solar PV,QLD,72.0,,, +FINLYSF1,Finley Solar Farm,Existing,Large scale Solar PV,NSW,162.36,,, +GANNSF1,Gannawarra Solar Farm,Existing,Large scale Solar PV,VIC,55.0,,, +GLENSF1,Glenrowan Solar Farm,Existing,Large scale Solar PV,VIC,126.0,,,VRET 2 +GLRWNSF1,Glenrowan West Solar Farm,Existing,Large scale Solar PV,VIC,132.0,,, +GOONSF1,Goonumbla Solar Farm,Existing,Large scale Solar PV,NSW,69.75,,, +GULLRSF1,Gullen Range Solar Farm,Existing,Large scale Solar PV,NSW,10.0,,, +GNNDHSF1,Gunnedah Solar Farm,Existing,Large scale Solar PV,NSW,110.0,,, +HAMISF1,Hamilton Solar Farm,Existing,Large scale Solar PV,QLD,57.5,,, +HVWWPV1,Happy Valley Reservoir,Existing,Large scale Solar PV,SA,11.0,,, +HAUGHT11,Haughton Solar Farm,Existing,Large scale Solar PV,QLD,132.6,,, +HAYMSF1,Hayman Solar Farm,Existing,Large scale Solar PV,QLD,57.75,,, +HILLSTN1,Hillston Sun Farm,Existing,Large scale Solar PV,NSW,110.0,,, +HUGSF1,Hughenden Solar Farm,Existing,Large scale Solar PV,QLD,20.97,,, +JEMALNG1,Jemalong Solar,Existing,Large scale Solar PV,NSW,55.0,,, +JUNEESF1,Junee Solar Farm,Existing,Large scale Solar PV,NSW,36.01,,, +KARSF1,Karadoc Solar Farm,Existing,Large scale Solar PV,VIC,104.5,,, +KIAMSF1,Kiamal Solar Farm stage 1,Existing,Large scale Solar PV,VIC,199.95,,, +KSP1,Kidston Solar Farm,Existing,Large scale Solar PV,QLD,50.0,,, +LILYSF1,Lilyvale Solar Farm,Existing,Large scale Solar PV,QLD,118.4,,, +LIMOSF11,Limondale Solar Farm 1,Existing,Large scale Solar PV,NSW,230.0,,, +LIMOSF21,Limondale Solar Farm 2,Existing,Large scale Solar PV,NSW,28.98,,, +LRSF1,Longreach Solar Farm,Existing,Large scale Solar PV,QLD,15.0,,, +MANSLR1,Manildra Solar Farm,Existing,Large scale Solar PV,NSW,50.0,,, +MAPS2PV1,Mannum Adelaide Pumping Station No 2 - MAPL2 (Palmer),Existing,Large scale Solar PV,SA,16.5,,, +MAPS3PV1,Mannum Adelaide Pumping Station No 3 - MAPL3 (Tungkillo),Existing,Large scale Solar PV,SA,16.5,,, +MARYRSF1,Maryrorough Solar Farm,Existing,Large scale Solar PV,QLD,34.5,,, +MIDDLSF1,Middlemount Solar Farm,Existing,Large scale Solar PV,QLD,26.0,,, +MOLNGSF1,Molong Solar Farm,Existing,Large scale Solar PV,NSW,36.08,,, +MOREESF1,Moree Solar Farm,Existing,Large scale Solar PV,NSW,56.0,,, +MWPS1PV1,Morgan To Whyalla Pipeline No 1 PS And Water Filtration Plant,Existing,Large scale Solar PV,SA,5.5,,, +MWPS2PV1,Morgan To Whyalla Pipeline No 2 PS,Existing,Large scale Solar PV,SA,5.5,,, +MWPS3PV1,Morgan To Whyalla Pipeline No 3 PS,Existing,Large scale Solar PV,SA,7.5,,, +MWPS4PV1,Morgan To Whyalla Pipeline No 4 PS,Existing,Large scale Solar PV,SA,5.5,,, +MOUSF1,Moura Solar Farm,Existing,Large scale Solar PV,QLD,99.0,,, +MBPS2PV1,Murray Bridge - Onkaparinga Pipeline Pump 2,Existing,Large scale Solar PV,SA,13.75,,, +NEVERSF1,Nevertire Solar Farm,Existing,Large scale Solar PV,NSW,104.64,,, +NEWENSF1,New England Solar Farm,Existing,Large scale Solar PV,NSW,200.0,,,NSW Tender 1 +NEWENSF2,New England Solar Farm,Existing,Large scale Solar PV,NSW,200.0,,,NSW Tender 1 +NUMURSF1,Numurkah Solar Farm,Existing,Large scale Solar PV,VIC,101.09,,, +NYNGAN1,Nyngan Solar Plant,Existing,Large scale Solar PV,NSW,102.03,,, +OAKEY1SF,Oakey 1 Solar Farm,Existing,Large scale Solar PV,QLD,25.0,,, +OAKEY2SF,Oakey 2 Solar Farm,Existing,Large scale Solar PV,QLD,55.64,,, +PARSF1,Parkes Solar Farm,Existing,Large scale Solar PV,NSW,49.5,,, +PAREPS1,Port Augusta Renewable Energy Park - Solar,Existing,Large scale Solar PV,SA,99.0,,, +RRSF1,Ross River Solar Farm,Existing,Large scale Solar PV,QLD,128.0,,, +RUGBYR1,Rugby Run Solar Farm,Existing,Large scale Solar PV,QLD,65.0,,, +SMCSF1,Sun Metals Corporation Solar Farm,Existing,Large scale Solar PV,QLD,143.0,,, +SUNRSF1,Sunraysia Solar Farm,Existing,Large scale Solar PV,NSW,228.8,,, +SUNTPSF1,Suntop Solar Farm,Existing,Large scale Solar PV,NSW,150.0,,, +SRSF1,Susan River Solar Farm,Existing,Large scale Solar PV,QLD,85.26,,, +TBSF1,Tailem Bend Solar Farm,Existing,Large scale Solar PV,SA,108.0,,, +WARWSF1,Warwick Solar Farm - stage 1,Existing,Large scale Solar PV,QLD,32.1,,, +WARWSF2,Warwick Solar Farm - stage 2,Existing,Large scale Solar PV,QLD,32.1,,, +WELLSF1,Wellington Solar Farm,Existing,Large scale Solar PV,NSW,216.08,,, +WEMENSF1,Wemen Solar Farm,Existing,Large scale Solar PV,VIC,97.5,,, +WSTWYSF1,West Wyalong Solar Farm,Existing,Large scale Solar PV,NSW,105.27,,, +WDGPH1,Western Downs Green Power Hub,Existing,Large scale Solar PV,QLD,399.97,,, +WRSF1,White Rock Solar Farm,Existing,Large scale Solar PV,NSW,20.0,,, +WHITSF1,Whitsunday Solar Farm,Existing,Large scale Solar PV,QLD,57.5,,, +WINTSF1,Winton Solar Farm,Existing,Large scale Solar PV,VIC,85.0,,, +WOOLGSF1,Woolooga Solar Farm,Existing,Large scale Solar PV,QLD,222.5,,, +YARANSF1,Yarranlea Solar Farm,Existing,Large scale Solar PV,QLD,121.0,,, +YATSF1,Yatpool Solar Farm,Existing,Large scale Solar PV,VIC,94.0,,, +ARWF1,Ararat Wind Farm,Existing,Wind,VIC,240.0,,, +BALDHWF1,Bald Hills Wind Farm,Existing,Wind,VIC,106.6,,, +BANGOWF1,Bango 973 Wind Farm,Existing,Wind,NSW,159.0,,, +BANGOWF2,Bango 999 Wind Farm,Existing,Wind,NSW,84.8,,, +BRYB1WF1,Berrybank Wind Farm,Existing,Wind,VIC,180.6,,, +BRYB2WF2,Berrybank Wind Farm,Existing,Wind,VIC,109.2,,, +BOCORWF1,Boco Rock Wind Farm,Existing,Wind,NSW,113.0,,, +BODWF1,Bodangora Wind Farm,Existing,Wind,NSW,113.19,,, +BULGANA1,Bulgana Green Power Hub - Wind Farm,Existing,Wind,VIC,204.4,,, +CNUNDAWF,Canunda Wind Farm,Existing,Wind,SA,46.0,,, +CAPTL_WF,Capital Wind Farm,Existing,Wind,NSW,140.7,,, +CATHROCK,Cathedral Rocks Wind Farm,Existing,Wind,SA,62.0,,, +CTHLWF1,Cattle Hill Wind Farm,Existing,Wind,TAS,144.0,,, +CHALLHWF,Challicum Hills Wind Farm,Existing,Wind,VIC,52.5,,, +CHYTWF1,Cherry Tree Wind Farm,Existing,Wind,VIC,57.6,,, +CLEMGPWF,Clements Gap Wind Farm,Existing,Wind,SA,56.7,,, +COLWF01,Collector Wind Farm,Existing,Wind,NSW,226.8,,, +COOPGWF1,Coopers Gap Wind Farm,Existing,Wind,QLD,452.89,,, +CROOKWF2,Crookwell 2 Wind Farm,Existing,Wind,NSW,96.04,,, +CROWLWF1,Crowlands Wind Farm,Existing,Wind,VIC,79.95,,, +CRURWF1,Crudine Ridge Wind Farm,Existing,Wind,NSW,141.71,,, +CULLRGWF,Cullerin Range Wind Farm,Existing,Wind,NSW,30.0,,, +DULAWF1,Dulacca Wind Farm,Existing,Wind,QLD,172.99,,, +DUNDWF1,Dundonnell Wind Farm,Existing,Wind,VIC,168.0,,, +DUNDWF2,Dundonnell Wind Farm,Existing,Wind,VIC,46.2,,, +DUNDWF3,Dundonnell Wind Farm,Existing,Wind,VIC,121.8,,, +ELAINWF1,Elaine Wind Farm,Existing,Wind,VIC,83.6,,, +GRANWF1,Granville Harbour Wind Farm,Existing,Wind,TAS,111.6,,, +GULLRWF1,Gullen Range Wind Farm,Existing,Wind,NSW,165.5,,, +GULLRWF2,Gullen Range Wind Farm 2,Existing,Wind,NSW,110.67,,, +GUNNING1,Gunning Wind Farm,Existing,Wind,NSW,46.5,,, +NBHWF1,Hallett 4 North Brown Hill Wind Farm,Existing,Wind,SA,132.3,,, +BLUFF1,Hallett 5 The Bluff Wind Farm,Existing,Wind,SA,52.5,,, +HALLWF1,Hallett Stage 1 Brown Hill Wind Farm,Existing,Wind,SA,94.5,,, +HALLWF2,Hallett Stage 2 Hallett Hill Wind Farm,Existing,Wind,SA,71.4,,, +HDWF1,Hornsdale Wind Farm Stage 1,Existing,Wind,SA,102.4,,, +HDWF2,Hornsdale Wind Farm Stage 2,Existing,Wind,SA,102.4,,, +HDWF3,Hornsdale Wind Farm Stage 3,Existing,Wind,SA,112.0,,, +KiataWF1,Kiata Wind Farm,Existing,Wind,VIC,31.05,,, +LKBONNY1,Lake Bonney 1 Wind Farm,Existing,Wind,SA,80.5,,, +LKBONNY2,Lake Bonney 2 Wind Farm,Existing,Wind,SA,159.0,,, +LKBONNY3,Lake Bonney 3 Wind Farm,Existing,Wind,SA,39.0,,, +LGAPWF1,Lincoln Gap Wind Farm - stage 1,Existing,Wind,SA,126.0,,, +LGAPWF2,Lincoln Gap Wind Farm - stage 2,Existing,Wind,SA,86.4,,, +MACARTH1,Macarthur Wind Farm,Existing,Wind,VIC,420.0,,, +MOORAWF1,Moorabool Wind Farm,Existing,Wind,VIC,312.0,,, +MRTLSWF1,Mortlake South Wind Farm,Existing,Wind,VIC,157.5,,, +MLWF1,Mortons Lane Wind Farm,Existing,Wind,VIC,19.5,,, +MEWF1,Mount Emerald Wind Farm,Existing,Wind,QLD,180.52,,, +MTMILLAR,Mount Millar Wind Farm,Existing,Wind,SA,72.28,,, +MERCER01,Mt Mercer Wind Farm,Existing,Wind,VIC,131.2,,, +MUWAWF1,Murra Warra Wind Farm - stage 1,Existing,Wind,VIC,225.7,,, +MUWAWF2,Murra Warra Wind Farm - stage 2,Existing,Wind,VIC,209.0,,, +MUSSELR1,Musselroe Wind Farm,Existing,Wind,TAS,168.0,,, +OAKLAND1,Oaklands Hill Wind Farm,Existing,Wind,VIC,67.2,,, +PAREPW1,Port Augusta Renewable Energy Park - Wind,Existing,Wind,SA,201.0,,, +PORTWF,Portland Wind Farm,Existing,Wind,VIC,151.7,,, +SALTCRK1,Salt Creek Wind Farm,Existing,Wind,VIC,54.0,,, +SAPHWF1,Sapphire Wind Farm,Existing,Wind,NSW,270.0,,, +STWF1,Silverton Wind Farm,Existing,Wind,NSW,198.94,,, +SNOWNTH1,Snowtown S2 Wind Farm,Existing,Wind,SA,144.0,,, +SNOWSTH1,Snowtown S2 Wind Farm,Existing,Wind,SA,126.0,,, +SNOWTWN1,Snowtown Wind Farm,Existing,Wind,SA,98.7,,, +STARHLWF,Starfish Hill Wind Farm,Existing,Wind,SA,33.0,,, +STOCKYD1,Stockyard Hill Wind Farm,Existing,Wind,VIC,527.56,,, +TARALGA1,Taralga Wind Farm,Existing,Wind,NSW,106.8,,, +WATERLWF,Waterloo Wind Farm,Existing,Wind,SA,130.8,,, +WPWF,Wattle Point Wind Farm,Existing,Wind,SA,90.75,,, +WAUBRAWF,Waubra Wind Farm,Existing,Wind,VIC,192.0,,, +WRWF1,White Rock Wind Farm - Stage 1,Existing,Wind,NSW,175.0,,, +WGWF1,Willogoleche Wind Farm,Existing,Wind,SA,119.76,,, +WOODLWN1,Woodlawn Wind Farm,Existing,Wind,NSW,48.3,,, +WOOLNTH1,Woolnorth Wind Farm,Existing,Wind,TAS,138.0,,, +YSWF1,Yaloak South Wind Farm,Existing,Wind,VIC,28.7,,, +YAMBUKWF,Yambuk Wind Farm,Existing,Wind,VIC,30.0,,, +YENDWF1,Yendon Wind Farm,Existing,Wind,VIC,144.4,,, +Tully Sugar Mill Biomass,Tully Sugar Mill Biomass,Existing,Biomass,QLD,32.0,,, +HUNTER1,Hunter Power Station,Committed,OCGT (large GT),NSW,375.0,,2025-08-01, +HUNTER2,Hunter Power Station,Committed,OCGT (large GT),NSW,375.0,,2025-09-01, +Kidston Pumped Storage Hydro 1,Kidston,Committed,Pumped Hydro (10hrs storage),QLD,125.0,1000.0,2026-01-01,ARENA Renewables +Kidston Pumped Storage Hydro 2,Kidston,Committed,Pumped Hydro (10hrs storage),QLD,125.0,1000.0,2026-01-01,ARENA Renewables +SNO2PH01,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,366.0,58330.0,2028-12-01, +SNO2PH02,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,366.0,58330.0,2028-12-01, +SNO2PH03,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,367.0,58330.0,2028-12-01, +SNO2PH04,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,367.0,58330.0,2028-12-01, +SNO2PH05,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,367.0,58330.0,2028-12-01, +SNO2PH06,Snowy 2.0,Committed,Pumped Hydro (1wk storage),NSW,367.0,58330.0,2028-12-01, +ADPPV1,Adelaide Desalination Plant Solar Farm,Committed,Large scale Solar PV,SA,11.0,,, +AVLSF1,Avonlie Solar Farm,Committed,Large scale Solar PV,NSW,254.1,,, +BLUEGSF1,Bluegrass Solar Farm,Committed,Large scale Solar PV,QLD,148.0,,, +Broadsound Solar Farm,Broadsound Solar Farm,Committed,Large scale Solar PV,QLD,368.0,,2027-01-01, +Bundaberg Solar Farm,Bundaberg Solar Farm,Committed,Large scale Solar PV,QLD,78.0,,2025-12-01, +COHUNSF1,Cohuna Solar Farm,Committed,Large scale Solar PV,VIC,31.16,,2027-07-01, +COLUMSF1,Columboola Solar Farm,Committed,Large scale Solar PV,QLD,217.25,,, +CRWASF1,Corowa Solar Farm,Committed,Large scale Solar PV,NSW,36.01,,, +Culcairn Solar Farm,Culcairn Solar Farm,Committed,Large scale Solar PV,NSW,349.98,,2025-08-01,NSW Tender 3 +EDENVSF1,Edenvale Solar Park,Committed,Large scale Solar PV,QLD,180.0,,, +GANGARR1,Gangarri Solar Farm,Committed,Large scale Solar PV,QLD,162.0,,2027-07-01, +GIRGSF,Girgarre Solar Farm,Committed,Large scale Solar PV,VIC,93.48,,2025-03-01, +Goorambat East Solar Farm,Goorambat East Solar Farm,Committed,Large scale Solar PV,VIC,250.0,,2026-10-01, +KEPSF1,Kennedy Energy Park Solar Farm,Committed,Large scale Solar PV,QLD,15.0,,, +KINGASF1,Kingaroy Solar Farm,Committed,Large scale Solar PV,QLD,40.0,,, +Lockhart Hybrid Facility - Solar,Lockhart Hybrid Facility - Solar,Committed,Large scale Solar PV,NSW,10.0,,2026-06-01, +MANSF2,Mannum Solar Farm 2,Committed,Large scale Solar PV,SA,29.99,,2024-12-01, +METZSF1,Metz Solar Farm,Committed,Large scale Solar PV,NSW,135.0,,, +QPSF,Quorn Park Solar Farm,Committed,Large scale Solar PV,NSW,96.8,,2026-02-01, +Riverina Solar Farm,Riverina Solar Farm,Committed,Large scale Solar PV,NSW,32.4,,2028-03-01, +SEBSF1,Sebastopol Solar Farm,Committed,Large scale Solar PV,NSW,90.0,,, +Stubbo Solar Farm,Stubbo Solar Farm,Committed,Large scale Solar PV,NSW,400.0,,2024-12-01,NSW Tender 1 +TB2SF1,Tailem Bend Solar Farm - stage 2,Committed,Large scale Solar PV,SA,105.0,,2023-09-01, +Tilbuster Solar Farm,Tilbuster Solar Farm,Committed,Large scale Solar PV,NSW,248.82,,2027-03-01, +WAGGNSF1,Wagga North Solar Farm,Committed,Large scale Solar PV,NSW,55.65,,2023-07-01, +WLWLSF1,Walla Walla Solar Farm,Committed,Large scale Solar PV,NSW,151.97,,, +WLWLSF2,Walla Walla Solar Farm,Committed,Large scale Solar PV,NSW,151.97,,, +WANDSF1,Wandoan South Solar Farm - stage 1,Committed,Large scale Solar PV,QLD,160.0,,2023-08-01, +WELNSF1,Wellington North Solar Farm (Lightsource),Committed,Large scale Solar PV,NSW,436.8,,, +WOLARSF1,Wollar Solar Farm,Committed,Large scale Solar PV,NSW,280.0,,2025-05-01, +WUNUSF1,Wunghnu Solar Farm,Committed,Large scale Solar PV,VIC,93.5,,2025-03-01, +WYASF1,Wyalong Solar Farm,Committed,Large scale Solar PV,NSW,62.32,,, +CLRKCWF1,Clarke Creek Wind Farm,Committed,Wind,QLD,346.5,,2025-09-01, +CLRKCWF2,Clarke Creek Wind Farm,Committed,Wind,QLD,103.5,,2025-09-01, +CROOKWF3,Crookwell 3 Wind Farm,Committed,Wind,NSW,57.6,,2024-11-01, +FLYCRKWF,Flyers Creek Wind Farm,Committed,Wind,NSW,145.54,,,NSW Tender 4 +GPWFEST1,Golden Plains Wind Farm East,Committed,Wind,VIC,248.0,,2025-12-01, +GPWFEST2,Golden Plains Wind Farm East,Committed,Wind,VIC,260.4,,2025-12-01, +GPWFEST3,Golden Plains Wind Farm East,Committed,Wind,VIC,248.0,,2025-12-01, +GSWF1A,Goyder South Wind Farm 1A,Committed,Wind,SA,209.0,,2024-12-01, +GSWF1B,Goyder South Wind Farm 1B,Committed,Wind,SA,203.5,,2024-12-01, +HD1WF1,Hawkesdale Wind Farm,Committed,Wind,VIC,96.6,,, +KABANWF1,Kaban Green Power Hub - Wind Farm,Committed,Wind,QLD,156.8,,2023-04-01, +KEPWF1,Kennedy Energy Park Wind Farm,Committed,Wind,QLD,43.2,,, +MacIntyre Wind Farm,MacIntyre Wind Farm,Committed,Wind,QLD,923.4,,2025-11-01, +MTGELWF1,Mt Gellibrand Wind Farm,Committed,Wind,VIC,138.6,,, +RYANCWF1,Ryan Corner Wind Farm,Committed,Wind,VIC,218.4,,2024-10-01, +Rye Park Wind Farm,Rye Park Wind Farm,Committed,Wind,NSW,396.0,,, +Wambo Wind Farm,Wambo Wind Farm,Committed,Wind,QLD,252.0,,2025-02-01,Renewable Energy and Hydrogen Jobs +Aldoga Solar Farm,Aldoga Solar Farm,Anticipated,Large scale Solar PV,QLD,387.01,,2025-11-01, +Aramara Solar Farm,Aramara Solar Farm,Anticipated,Large scale Solar PV,QLD,101.4,,2028-06-01, +Banksia Solar Farm,Banksia Solar Farm,Anticipated,Large scale Solar PV,QLD,70.4,,2028-01-01, +Derby Solar Farm,Derby Solar Farm,Anticipated,Large scale Solar PV,VIC,95.1,,2027-09-01,VRET 2 +Frasers Solar Farm,Frasers Solar Farm,Anticipated,Large scale Solar PV,VIC,77.0,,2027-06-01,VRET 2 +Goulburn River Solar Farm,Goulburn River Solar Farm,Committed,Large scale Solar PV,NSW,588.0,,2027-03-01,NSW Tender 3 +Horsham Solar Farm,Horsham Solar Farm,Anticipated,Large scale Solar PV,VIC,118.8,,2026-12-01,VRET 2 / VIC State Electricity +Maryvale Solar Farm,Maryvale Solar Farm,Anticipated,Large scale Solar PV,NSW,172.02,,2027-02-01,NSW Tender 4 +Mortlake Energy Hub Solar Farm,Mortlake Energy Hub Solar Farm,Anticipated,Large scale Solar PV,VIC,333.64,,2027-12-01, +Munna Creek Solar Farm,Munna Creek Solar Farm,Committed,Large scale Solar PV,QLD,154.0,,2026-01-01, +New England Solar Farm 2,New England Solar Farm - Stage 2,Anticipated,Large scale Solar PV,NSW,320.0,,2028-10-01, +Punch's Creek Renewable Energy Solar Farm,Punch's Creek Renewable Energy Solar Farm,Anticipated,Large scale Solar PV,QLD,798.72,,2026-01-01, +GBWF1,Gawara Baya Wind Farm,Anticipated,Wind,QLD,408.0,,2028-10-01, +Uungula Wind Farm,Uungula Wind Farm,Anticipated,Wind,NSW,414.0,,2028-02-01,NSW Tender 3 +Woolsthorpe Wind Farm,Woolsthorpe Wind Farm,Anticipated,Wind,VIC,72.0,,2027-01-01, +BALB1,Ballarat Energy Storage System,Existing,Battery storage (1hr storage),VIC,30.0,30.0,, +BOWWBA1,Bolivar Waste Water Treatment BESS,Existing,Battery storage (2hrs storage),SA,3.08,5.04,, +BBATTERY,Bouldercombe Battery project,Existing,Battery storage (2hrs storage),QLD,50.0,100.0,, +BULBES1,Bulgana Green Power Hub BESS,Existing,Battery storage (2hrs storage),VIC,20.0,34.0,, +DALNTH1,Dalrymple BESS,Existing,Battery storage (1hr storage),SA,30.0,9.0,, +DPNTB1,Darlington Point Energy Storage System,Existing,Battery storage (2hrs storage),NSW,25.0,50.0,, +GANNB1,Gannawarra Energy Storage System,Existing,Battery storage (2hrs storage),VIC,25.33,50.0,, +HVWWBA1,Happy Valley Reservoir BESS,Existing,Battery storage (2hrs storage),SA,5.52,8.82,, +HPR1,Hornsdale Power Reserve Unit 1,Existing,Battery storage (1hr storage),SA,150.0,178.3,, +LBBG1,Lake Bonney BESS,Existing,Battery storage (2hrs storage),SA,25.0,52.0,, +PIBESS1,Philip Island BESS,Existing,Battery storage (2hrs storage),VIC,5.0,10.0,, +QBYNB1,Queanbeyan BESS,Existing,Battery storage (2hrs storage),NSW,10.0,20.0,, +RANGEB1,Rangebank BESS,Existing,Battery storage (2hrs storage),VIC,200.0,400.0,, +RESS1G,Riverina Energy Storage System 1,Existing,Battery storage (2hrs storage),NSW,60.0,120.0,, +RIVNB2,Riverina Energy Storage System 2,Existing,Battery storage (2hrs storage),NSW,65.0,130.0,, +VBB1,Victorian Big Battery,Existing,Battery storage (2hrs storage),VIC,300.0,470.0,, +WALGRV1,Wallgrove Grid Battery project,Existing,Battery storage (2hrs storage),NSW,50.0,75.0,, +WANDB1,Wandoan South BESS,Existing,Battery storage (2hrs storage),QLD,100.0,150.0,, +ADPBA1,Adelaide Desalination Plant BESS,Existing,Battery storage (2hrs storage),SA,7.76,12.6,, +BLYTHB1,Blyth BESS,Existing,Battery storage (2hrs storage),SA,200.0,400.0,,ARENA Battery +BHBG1,Broken Hill BESS,Committed,Battery storage (1hr storage),NSW,50.0,50.0,, +CAPBES1,Capital Battery,Committed,Battery storage (2hrs storage),NSW,100.32,200.0,2025-06-01, +CHBESSG1,Chinchilla BESS,Committed,Battery storage (2hrs storage),QLD,100.0,200.0,2024-07-01, +CBWWBA1,Christies Beach Wastewater Treatment Plant BESS,Committed,Battery storage (2hrs storage),SA,2.16,4.32,2023-01-01, +Clements Gap BESS,Clements Gap BESS,Committed,Battery storage (2hrs storage),SA,60.0,120.0,2026-05-01,CIS SA-VIC +Eraring Big Battery,Eraring Big Battery,Committed,Battery storage (2hrs storage),NSW,460.0,1773.0,2025-12-01, +GREENB1,Greenbank BESS,Committed,Battery storage (2hrs storage),QLD,200.0,400.0,2025-06-01,Renewable Energy and Hydrogen Jobs +HBESS1,Hazelwood BESS,Existing,Battery storage (1hr storage),VIC,200.07,162.0,, +Koorangie Energy Storage System,Koorangie Energy Storage System,Committed,Battery storage (2hrs storage),VIC,185.0,370.0,, +LaTrobe Valley BESS,LaTrobe Valley BESS,Committed,Battery storage (2hrs storage),VIC,100.0,200.0,2025-07-01, +Liddell BESS,Liddell BESS,Committed,Battery storage (4hrs storage),NSW,500.0,1000.0,2026-02-01,NSW Tender 2 +Lockhart Hybrid Facility - Battery,Lockhart Hybrid Facility - Battery,Committed,Battery storage (2hrs storage),NSW,10.0,20.0,2026-06-01, +Melbourne Renewable Energy Hub - Side A,Melbourne Renewable Energy Hub - Side A,Committed,Battery storage (2hrs storage),VIC,600.0,1600.0,2025-11-01,VIC State Electricity +QPBESS,Quorn Park BESS,Committed,Battery storage (2hrs storage),NSW,27.6,40.0,2026-01-01, +TB2BG1,Tailem Bend Battery Project,Committed,Battery storage (2hrs storage),SA,41.5,84.0,2024-01-01, +Tarong BESS,Tarong BESS,Committed,Battery storage (1hr storage),QLD,300.0,600.0,2025-08-01, +Templers BESS,Templers BESS,Committed,Battery storage (2hrs storage),SA,111.0,291.0,2025-08-01, +TIB1,Torrens Island BESS,Existing,Battery storage (1hr storage),SA,250.7,250.0,, +ULBESS,Ulinda Park BESS,Committed,Battery storage (2hrs storage),QLD,154.96,298.0,2025-12-01, +WTAHB1,Waratah Super Battery,Committed,Battery storage (2hrs storage),NSW,850.18,1680.0,2025-08-01, +WDBESS1,Western Downs Battery,Committed,Battery storage (1hr storage),QLD,254.94,510.0,2024-12-01, +Aldoga BESS Stage 1,Aldoga BESS Stage 1,Anticipated,Battery storage (1hr storage),QLD,400.0,400.0,2027-12-01, +Brendale BESS,Brendale BESS,Anticipated,Battery storage (2hrs storage),QLD,204.96,410.0,2026-06-01, +Bungama Solar BESS,Bungama Solar BESS,Committed,Battery storage (2hrs storage),SA,150.0,300.0,2026-04-01, +Eraring Big Battery 2,Eraring Big Battery 2,Anticipated,Battery storage (2hrs storage),NSW,240.0,1030.0,2027-04-01, +GBBATT1,Gawara Baya Wind Farm BESS,Anticipated,Battery storage (2hrs storage),QLD,104.0,208.0,2028-10-01, +Gnarwarre BESS,Gnarwarre BESS,Anticipated,Battery storage (2hrs storage),VIC,290.0,550.0,2027-06-01,ARENA Battery +Limondale BESS,Limondale BESS,Anticipated,Battery storage (8hrs storage),NSW,50.0,400.0,2025-12-01,NSW Tender 1 +LGAPBS1,Lincoln Gap Wind Farm BESS,Anticipated,Battery storage (1hr storage),SA,10.0,10.0,2025-06-01, +Mannum BESS,Mannum BESS,Anticipated,Battery storage (2hrs storage),SA,100.0,200.0,2025-09-01, +Maryvale Solar Farm BESS,Maryvale Solar Farm BESS,Anticipated,Battery storage (2hrs storage),NSW,172.02,408.0,2027-02-01,NSW Tender 4 +Mortlake Battery,Mortlake Battery,Anticipated,Battery storage (2hrs storage),VIC,300.0,600.0,2027-03-01,ARENA Battery +Mortlake Energy Hub BESS,Mortlake Energy Hub BESS,Anticipated,Battery storage (2hrs storage),VIC,316.08,1200.0,2027-12-01, +Mt Fox BESS,Mt Fox BESS,Additional policy-supported project,Battery storage (2hrs storage),QLD,300.0,600.0,2029-04-01,ARENA Battery +New England Solar Farm BESS,New England Solar Farm BESS,Anticipated,Battery storage (1hr storage),NSW,200.0,400.0,2026-12-01, +ORANA,Orana BESS,Committed,Battery storage (4hrs storage),NSW,414.85,1660.0,2026-06-01,NSW Tender 2 +Richmond Valley BESS,Richmond Valley BESS,Anticipated,Battery storage (8hrs storage),NSW,275.0,2200.0,2026-10-01,NSW Tender 3 +Silver City Energy Storage,Silver City Energy Storage,Anticipated,Battery storage (8hrs storage),NSW,200.0,1600.0,2028-12-01,NSW Tender 3 +Smithfield BESS,Smithfield BESS,Anticipated,Battery storage (2hrs storage),NSW,86.4,130.0,2025-12-01,NSW Tender 2 +Stanwell BESS,Stanwell BESS,Anticipated,Battery storage (2hrs storage),QLD,300.0,600.0,2026-10-01, +Swanbank BESS,Swanbank BESS,Anticipated,Battery storage (2hrs storage),QLD,250.0,500.0,2025-11-01,Renewable Energy and Hydrogen Jobs +TRGBESS,Terang BESS,Anticipated,Battery storage (2hrs storage),VIC,144.4,200.0,2026-06-01, +Wooreen Energy Storage System,Wooreen Energy Storage System,Anticipated,Battery storage (4hrs storage),VIC,350.0,1400.0,2027-12-01, +Kogan Gas,Brigalow GT,Additional policy-supported project,OCGT (large GT),QLD,400.0,,2028-12-01,Renewable Energy and Hydrogen Jobs +Fulham Solar Farm,Fulham Solar Farm,Committed,Large scale Solar PV,VIC,100.8,,2028-01-01,VRET 2 +Solar River Solar Farm,Solar River Solar Farm,Additional policy-supported project,Large scale Solar PV,SA,255.76,,2027-07-01,CIS SA-VIC +Coppabella Wind Farm,Coppabella Wind Farm,Anticipated,Wind,NSW,289.8,,2027-09-01,NSW Tender 1 +Derby Solar Project BESS,Derby Solar Project BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,95.0,110.0,2027-09-01,VRET 2 +Fulham Solar Farm BESS,Fulham Solar Farm BESS,Committed,Battery storage (1hr storage),VIC,64.08,128.0,2028-01-01,VRET 2 +Goulburn River BESS,Goulburn River BESS,Additional policy-supported project,Battery storage (8hrs storage),NSW,49.84,400.0,2027-07-01,NSW Tender 3 +Hallett BESS,Hallett BESS,Additional policy-supported project,Battery storage (4hrs storage),SA,50.0,200.0,2027-07-01,CIS SA-VIC +Horsham Solar Farm BESS,Horsham Solar Farm BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,100.0,200.0,2027-07-01,VRET 2 / VIC State Electricity +Limestone Coast West BESS,Limestone Coast West BESS,Additional policy-supported project,Battery storage (2hrs storage),SA,250.0,500.0,2027-07-01,CIS SA-VIC +Solar River Solar Farm BESS,Solar River Solar Farm BESS,Additional policy-supported project,Battery storage (4hrs storage),SA,123.0,225.0,2027-07-01,CIS SA-VIC +Springvale Energy Hub BESS,Springvale Energy Hub BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,115.0,230.0,2027-07-01,CIS SA-VIC +Mornington BESS,Mornington BESS,Anticipated,Battery storage (2hrs storage),VIC,240.0,480.0,2026-02-01, +Tamworth BESS,Tamworth BESS,Anticipated,Battery storage (2hrs storage),NSW,100.0,100.0,2027-12-01, +Tamworth BESS 2,Tamworth BESS,Anticipated,Battery storage (2hrs storage),NSW,100.0,200.0,2027-12-01, +QEJP - Borumba,QEJP - Borumba,Anticipated,Pumped Hydro (24hrs storage),QLD,1998.0,48000.0,2034-07-01,Renewable Energy and Hydrogen Jobs +Broadsound BESS,Broadsound BESS,Anticipated,Battery storage (2hrs storage),QLD,240.0,360.0,2027-01-01, +Calala BESS 1,Calala BESS 1,Anticipated,Battery storage (2hrs storage),NSW,100.0,200.0,2027-02-01, +Calala BESS 2,Calala BESS 2,Anticipated,Battery storage (2hrs storage),NSW,150.0,300.0,2027-04-01, +Glanmire Solar Farm BESS,Glanmire Solar Farm BESS,Anticipated,Battery storage (2hrs storage),NSW,52.0,104.0,2027-07-01,CIS Tender 1 +Ravenswood BESS,Ravenswood BESS,Anticipated,Battery storage (4hrs storage),VIC,20.0,40.0,2027-09-01, +Bullyard Solar Farm,Bullyard Solar Farm,Anticipated,Large scale Solar PV,QLD,97.0,,2027-07-01, +Glanmire Solar Farm,Glanmire Solar Farm,Anticipated,Large scale Solar PV,NSW,60.0,104.0,2027-07-01,CIS Tender 1 +Ravenswood Solar Farm,Ravenswood Solar Farm,Anticipated,Large scale Solar PV,VIC,63.0,,2027-09-01, +Lockyer Valley GT,Lockyer Valley GT,Anticipated,OCGT (small GT),QLD,117.0,,2028-02-01, +Boulder Creek Wind Farm,Boulder Creek Wind Farm,Anticipated,Wind,QLD,221.01,,2027-11-01,Renewable Energy and Hydrogen Jobs +Inverleigh Wind Farm,Inverleigh Wind Farm,Anticipated,Wind,VIC,91.5,,2027-07-01, +Port Latta Wind Farm,Port Latta Wind Farm,Anticipated,Wind,TAS,21.0,,2027-02-01, +Valley of the Winds Wind Farm,Valley of the Winds,Anticipated,Wind,NSW,919.0,,2029-12-01,CIS Tender 1 +Woolooga BESS,Woolooga BESS,Committed,Battery storage (2hrs storage),QLD,280.96,593.0,2026-06-01, +Supernode BESS 1,Supernode BESS 1,Committed,Battery storage (4hrs storage),QLD,260.0,620.0,2025-12-01, +Supernode BESS 2,Supernode BESS 2,Committed,Battery storage (4hrs storage),QLD,260.0,1240.0,2026-06-01, +Golden Plains West Wind Farm,Golden Plains West Wind Farm,Committed,Wind,VIC,557.07,,2027-02-01, +Lotus Creek Wind Farm,Lotus Creek Wind Farm,Committed,Wind,QLD,285.2,,2027-12-01, +Barnawartha Solar Farm BESS,Barnawartha Solar Farm BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,64.02,6.31,2027-07-01,CIS Tender 1 +Barwon Solar Farm BESS,Barwon Solar Farm BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,250.0,500.0,2027-07-01,CIS Tender 1 +Bungama BESS,Bungama BESS,Additional policy-supported project,Battery storage (2hrs storage),SA,200.0,400.0,2027-07-01,ARENA Battery +Elaine Solar Farm BESS,Elaine Solar Farm BESS,Additional policy-supported project,Battery storage (2hrs storage),VIC,125.0,250.0,2027-07-01,CIS Tender 1 +Ganymirra Solar Power Station BESS,Ganymirra Solar Power Station BESS,Additional policy-supported project,Battery storage (2hrs storage),QLD,150.0,600.0,2027-07-01,CIS Tender 1 +Junction Rivers Wind Farm BESS,Junction Rivers Wind Farm BESS,Additional policy-supported project,Battery storage (4hrs storage),NSW,200.0,800.0,2031-04-01,CIS Tender 1 +Majors Creek Solar Power Station BESS,Majors Creek Power Station BESS,Additional policy-supported project,Battery storage (4hrs storage),QLD,150.0,600.0,2028-10-01,CIS Tender 1 +West Mokoan Solar Farm BESS,West Mokoan Solar Farm BESS,Additional policy-supported project,Battery storage (4hrs storage),VIC,159.96,560.0,2027-07-01,CIS Tender 1 +Griffith BESS,Griffith BESS,Additional policy-supported project,Battery storage (8hrs storage),NSW,100.0,800.0,2027-07-01,NSW Tender 5 +Stoney Creek BESS,Stoney Creek BESS,Additional policy-supported project,Battery storage (8hrs storage),NSW,125.0,1000.0,2027-07-01,NSW Tender 5 +Barnawartha Solar Farm,Barnawartha Solar Farm,Additional policy-supported project,Large scale Solar PV,VIC,64.02,,2027-07-01,CIS Tender 1 +Barwon Solar Farm,Barwon Solar Farm,Additional policy-supported project,Large scale Solar PV,VIC,250.0,,2027-07-01,CIS Tender 1 +Campbells Forest Solar Farm,Campbells Forest Solar Farm,Additional policy-supported project,Large scale Solar PV,VIC,205.0,,2027-07-01,CIS Tender 1 +Elaine Solar Farm,Elaine Solar Farm,Additional policy-supported project,Large scale Solar PV,VIC,125.0,,2027-07-01,CIS Tender 1 +Ganymirra Solar Power Station,Ganymirra Solar Power Station,Additional policy-supported project,Large scale Solar PV,QLD,150.0,,2027-07-01,CIS Tender 1 +Hopeland Solar Farm,Hopeland Solar Farm,Additional policy-supported project,Large scale Solar PV,QLD,327.6,,2027-07-01,CIS Tender 1 +Majors Creek Solar Power Station,Majors Creek Power Station,Additional policy-supported project,Large scale Solar PV,QLD,150.0,,2027-07-01,CIS Tender 1 +Sandy Creek Solar Farm,Sandy Creek Solar Farm,Additional policy-supported project,Large scale Solar PV,NSW,700.0,,2027-07-01,CIS Tender 1 +West Mokoan Solar Farm,West Mokoan Solar Farm,Additional policy-supported project,Large scale Solar PV,VIC,400.4,,2027-07-01,CIS Tender 1 +Phoenix Pumped Hydro Project,Phoenix Pumped Hydro Project,Additional policy-supported project,Pumped Hydro (10hrs storage),NSW,810.0,9720.0,2029-03-01,NSW Tender 5 +Goyder North Wind Farm,Goyder North Wind Farm,Additional policy-supported project,Wind,SA,300.0,,2028-12-01,CIS Tender 1 +Junction Rivers Wind Farm,Junction Rivers Wind Farm,Additional policy-supported project,Wind,NSW,595.2,,2031-04-01,CIS Tender 1 +Kentbruck Green Power Hub Wind Farm,Kentbruck Green Power Hub Wind Farm,Additional policy-supported project,Wind,VIC,600.0,,2030-06-01,CIS Tender 1 +Palmer Wind Farm,Palmer Wind Farm,Additional policy-supported project,Wind,SA,274.0,,2027-07-01,CIS Tender 1 +Spicers Creek Wind Farm,Spicers Creek Wind Farm,Additional policy-supported project,Wind,NSW,702.0,,2027-07-01,CIS Tender 1 +Thunderbolt Wind Farm,Thunderbolt Wind Farm,Additional policy-supported project,Wind,NSW,210.0,,2027-07-01,CIS Tender 1 +Haughton Solar Farm Stage 2,Haughton Solar Farm Stage 2,Anticipated,Large scale Solar PV,QLD,300.0,,2028-01-01, +Lancaster Solar Farm,Lancaster Solar Farm,Anticipated,Large scale Solar PV,VIC,80.04,,2027-07-01, +Bennetts Creek BESS,Bennetts Creek BESS,Anticipated,Battery storage (2hrs storage),VIC,100.0,223.0,2027-07-01, +Northern Midlands Solar Farm,Northern Midlands Solar Farm,Anticipated,Large scale Solar PV,TAS,360.8,,2027-10-01, +Hay Sun Farm,Hay Sun Farm,Anticipated,Large scale Solar PV,NSW,110.0,,2027-07-01, +MOKOSF1,Mokoan Solar Farm,Committed,Large scale Solar PV,VIC,46.0,,2025-04-01, +Kiamal BESS,Kiamal BESS,Additional policy-supported project,Battery storage (4hrs storage),VIC,238.59,880.0,2028-07-01,VRET 2 +Pine Lodge BESS,Pine Lodge BESS,Anticipated,Battery storage (2hrs storage),VIC,250.0,550.0,2026-10-01, diff --git a/tests/test_workbook_table_cache/7.5/pumped_hydro_existing_committed_anticipated_additional_properties.csv b/tests/test_workbook_table_cache/7.5/pumped_hydro_existing_committed_anticipated_additional_properties.csv new file mode 100644 index 00000000..dd6081b5 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/pumped_hydro_existing_committed_anticipated_additional_properties.csv @@ -0,0 +1,8 @@ +Power Station,Installed capacity (MW),Storage capacity (hours),Pumping efficiency (%) +Snowy 2.0,2200,159.0,76 +Lower Tumut,1800,,78 +Wivenhoe,570,10.0,70 +Shoalhaven,240,64.0,70 +Kidston,250,6.0,80 +Phoenix Pumped Hydro Project,810,12.0,76 +Borumba,1998,24.0,76 diff --git a/tests/test_workbook_table_cache/7.5/variable_opex_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/7.5/variable_opex_existing_committed_anticipated_additional_generators.csv new file mode 100644 index 00000000..9b5c0155 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/variable_opex_existing_committed_anticipated_additional_generators.csv @@ -0,0 +1,643 @@ +IASR ID,Power Station / Technology,Technology,"Variable OPEX ($/MWh sent out)1," +BW01,Bayswater,Steam Sub Critical,8.0 +BW02,Bayswater,Steam Sub Critical,8.0 +BW03,Bayswater,Steam Sub Critical,8.0 +BW04,Bayswater,Steam Sub Critical,8.0 +CALL_B_1,Callide B,Steam Sub Critical,7.0 +CALL_B_2,Callide B,Steam Sub Critical,7.0 +CPP_3,Callide C,Steam Super Critical,8.0 +CPP_4,Callide C,Steam Super Critical,8.0 +ER01,Eraring,Steam Sub Critical,8.0 +ER02,Eraring,Steam Sub Critical,8.0 +ER03,Eraring,Steam Sub Critical,8.0 +ER04,Eraring,Steam Sub Critical,8.0 +GSTONE1,Gladstone,Steam Sub Critical,7.0 +GSTONE2,Gladstone,Steam Sub Critical,7.0 +GSTONE3,Gladstone,Steam Sub Critical,7.0 +GSTONE4,Gladstone,Steam Sub Critical,7.0 +GSTONE5,Gladstone,Steam Sub Critical,7.0 +GSTONE6,Gladstone,Steam Sub Critical,7.0 +KPP_1,Kogan Creek,Steam Super Critical,8.0 +MPP_1,Millmerran,Steam Super Critical,8.0 +MPP_2,Millmerran,Steam Super Critical,8.0 +MP1,Mt Piper,Steam Sub Critical,8.0 +MP2,Mt Piper,Steam Sub Critical,8.0 +STAN-1,Stanwell,Steam Sub Critical,8.0 +STAN-2,Stanwell,Steam Sub Critical,8.0 +STAN-3,Stanwell,Steam Sub Critical,8.0 +STAN-4,Stanwell,Steam Sub Critical,8.0 +TARONG#1,Tarong,Steam Sub Critical,7.0 +TARONG#2,Tarong,Steam Sub Critical,7.0 +TARONG#3,Tarong,Steam Sub Critical,7.0 +TARONG#4,Tarong,Steam Sub Critical,7.0 +TNPS1,Tarong North,Steam Super Critical,8.0 +VP5,Vales Point B,Steam Sub Critical,8.0 +VP6,Vales Point B,Steam Sub Critical,8.0 +LYA1,Loy Yang A Power Station,Steam Sub Critical,8.0 +LYA2,Loy Yang A Power Station,Steam Sub Critical,8.0 +LYA3,Loy Yang A Power Station,Steam Sub Critical,8.0 +LYA4,Loy Yang A Power Station,Steam Sub Critical,8.0 +LOYYB1,Loy Yang B,Steam Sub Critical,8.0 +LOYYB2,Loy Yang B,Steam Sub Critical,8.0 +YWPS1,Yallourn W,Steam Sub Critical,8.0 +YWPS2,Yallourn W,Steam Sub Critical,8.0 +YWPS3,Yallourn W,Steam Sub Critical,8.0 +YWPS4,Yallourn W,Steam Sub Critical,8.0 +ANGAS1,Angaston,Reciprocating engine,9.0 +ANGAS2,Angaston,Reciprocating engine,9.0 +BDL01,Bairnsdale,OCGT (small GT),8.94908862350722 +BDL02,Bairnsdale,OCGT (small GT),8.94908862350722 +BARCALDN,Barcaldine Power Station,OCGT (small GT),12.4529447480266 +BIPS1_01,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_02,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_03,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_04,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_05,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_06,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_07,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_08,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_09,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_10,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_11,Barker Inlet Power Station,Reciprocating engine,9.0 +BIPS1_12,Barker Inlet Power Station,Reciprocating engine,9.0 +BBTHREE1,Bell Bay Three,OCGT (large GT),12.0 +BBTHREE2,Bell Bay Three,OCGT (large GT),12.0 +BBTHREE3,Bell Bay Three,OCGT (large GT),12.0 +BOLIVPS1_1,Bolivar Power Station,OCGT (small GT),9.0 +BOLIVPS1_2,Bolivar Power Station,OCGT (small GT),9.0 +BOLIVPS1_3,Bolivar Power Station,OCGT (small GT),9.0 +BOLIVPS1_4,Bolivar Power Station,OCGT (small GT),9.0 +BRAEMAR1,Braemar,OCGT (large GT),12.0 +BRAEMAR2,Braemar,OCGT (large GT),12.0 +BRAEMAR3,Braemar,OCGT (large GT),12.0 +BRAEMAR5,Braemar 2 Power Station,OCGT (large GT),12.0 +BRAEMAR6,Braemar 2 Power Station,OCGT (large GT),12.0 +BRAEMAR7,Braemar 2 Power Station,OCGT (large GT),12.0 +CG1,Colongra,OCGT (small GT),10.0 +CG2,Colongra,OCGT (small GT),10.0 +CG3,Colongra,OCGT (small GT),10.0 +CG4,Colongra,OCGT (small GT),10.0 +CPSA_GT1,Condamine A,CCGT - Gas Turbine,11.0 +CPSA_GT2,Condamine A,CCGT - Gas Turbine,11.0 +CPSA_ST,Condamine A,CCGT - Steam Turbine,11.0 +DDPS1_GT1,Darling Downs,CCGT - Gas Turbine,11.0 +DDPS1_GT2,Darling Downs,CCGT - Gas Turbine,11.0 +DDPS1_GT3,Darling Downs,CCGT - Gas Turbine,11.0 +DDPS1_ST,Darling Downs,CCGT - Steam Turbine,11.0 +DRYCGT1,Dry Creek GT,OCGT (small GT),10.0 +DRYCGT2,Dry Creek GT,OCGT (small GT),10.0 +DRYCGT3,Dry Creek GT,OCGT (small GT),10.0 +AGLHAL01,Hallett GT,OCGT (small GT),10.0 +AGLHAL02,Hallett GT,OCGT (small GT),10.0 +AGLHAL03,Hallett GT,OCGT (small GT),10.0 +AGLHAL04,Hallett GT,OCGT (small GT),10.0 +AGLHAL05,Hallett GT,OCGT (small GT),10.0 +AGLHAL06,Hallett GT,OCGT (small GT),10.0 +AGLHAL07,Hallett GT,OCGT (small GT),10.0 +AGLHAL08,Hallett GT,OCGT (small GT),10.0 +AGLHAL09,Hallett GT,OCGT (small GT),10.0 +AGLHAL10,Hallett GT,OCGT (small GT),10.0 +AGLHAL11,Hallett GT,OCGT (small GT),10.0 +AGLHAL12,Hallett GT,OCGT (small GT),10.0 +AGLHALRE,Hallett GT,OCGT (small GT),10.0 +HEZ1,Hunter Economic Zone,Reciprocating engine,9.0 +JLA01,Jeeralang A,OCGT (small GT),9.94343180389692 +JLA02,Jeeralang A,OCGT (small GT),9.94343180389692 +JLA03,Jeeralang A,OCGT (small GT),9.94343180389692 +JLA04,Jeeralang A,OCGT (small GT),9.94343180389692 +JLB01,Jeeralang B,OCGT (small GT),9.94343180389692 +JLB02,Jeeralang B,OCGT (small GT),9.94343180389692 +JLB03,Jeeralang B,OCGT (small GT),9.94343180389692 +LADBROK1,Ladbroke Grove,OCGT (small GT),12.4 +LADBROK2,Ladbroke Grove,OCGT (small GT),12.4 +LNGS1,Laverton North,OCGT (large GT),12.0 +LNGS2,Laverton North,OCGT (large GT),12.0 +LONSDALE,Lonsdale,Reciprocating engine,9.0 +MINTARO,Mintaro GT,OCGT (small GT),10.0 +MORTLK11,Mortlake,OCGT (large GT),12.0 +MORTLK12,Mortlake,OCGT (large GT),12.0 +MSTUART1,Mt Stuart,OCGT (small GT),11.4996964177291 +MSTUART2,Mt Stuart,OCGT (small GT),11.4996964177291 +MSTUART3,Mt Stuart,OCGT (small GT),11.4996964177291 +NPS,Newport,CCGT - Steam Turbine,12.0 +OAKEY1,Oakey Power Station,OCGT (large GT),12.0 +OAKEY2,Oakey Power Station,OCGT (large GT),12.0 +OsborneGT,Osborne,CCGT - Gas Turbine,11.0 +OsborneST,Osborne,CCGT - Steam Turbine,11.0 +PPCCGTGT1,Pelican Point,CCGT - Gas Turbine,11.0 +PPCCGTGT2,Pelican Point,CCGT - Gas Turbine,11.0 +PPCCGTST,Pelican Point,CCGT - Steam Turbine,11.0 +POR01-1,Port Lincoln GT,OCGT (small GT),12.45625 +POR01-2,Port Lincoln GT,OCGT (small GT),12.45625 +POR01-3,Port Lincoln GT,OCGT (small GT),12.45625 +PTSTAN1_1,Port Stanvac 1,Reciprocating engine,9.0 +PTSTAN1_2,Port Stanvac 1,Reciprocating engine,9.0 +QPS1,Quarantine,OCGT (small GT),10.0 +QPS2,Quarantine,OCGT (small GT),10.0 +QPS3,Quarantine,OCGT (small GT),10.0 +QPS4,Quarantine,OCGT (small GT),10.0 +QPS5,Quarantine,OCGT (small GT),10.0 +ROMA_7,Roma,OCGT (small GT),10.0 +ROMA_8,Roma,OCGT (small GT),10.0 +SITHE01,Smithfield Energy Facility,OCGT (small GT),10.0 +SNAPPER1_1,Snapper Point Power Station,OCGT (small GT),9.0 +SNAPPER1_2,Snapper Point Power Station,OCGT (small GT),9.0 +SNAPPER1_3,Snapper Point Power Station,OCGT (small GT),9.0 +SNAPPER1_4,Snapper Point Power Station,OCGT (small GT),9.0 +SNAPPER1_5,Snapper Point Power Station,OCGT (small GT),9.0 +SNUG1,Snuggery,OCGT (small GT),12.4 +SNUG2,Snuggery,OCGT (small GT),12.4 +SNUG3,Snuggery,OCGT (small GT),12.4 +AGLSOM01,Somerton,OCGT (small GT),10.0 +AGLSOM02,Somerton,OCGT (small GT),10.0 +AGLSOM03,Somerton,OCGT (small GT),10.0 +AGLSOM04,Somerton,OCGT (small GT),10.0 +SWAN_E,Swanbank E GT,CCGT,11.0 +TALWA1,Tallawarra,CCGT,11.0 +Tallawarra B,Tallawarra B,OCGT (large GT),12.0 +TVCC201_GT,Tamar Valley Combined Cycle,CCGT - Gas Turbine,11.0 +TVCC201_ST,Tamar Valley Combined Cycle,CCGT - Steam Turbine,11.0 +TVPP104,Tamar Valley Peaking,OCGT (large GT),10.0 +TORRB1,Torrens Island B,CCGT - Steam Turbine,10.0 +TORRB2,Torrens Island B,CCGT - Steam Turbine,10.0 +TORRB3,Torrens Island B,CCGT - Steam Turbine,10.0 +TORRB4,Torrens Island B,CCGT - Steam Turbine,10.0 +YABULU,Townsville Power Station,CCGT - Gas Turbine,12.6496660595021 +YABULU2,Townsville Power Station,CCGT - Steam Turbine,12.6496660595021 +URANQ11,Uranquinty,OCGT (large GT),12.0741198270537 +URANQ12,Uranquinty,OCGT (large GT),12.0741198270537 +URANQ13,Uranquinty,OCGT (large GT),12.0741198270537 +URANQ14,Uranquinty,OCGT (large GT),12.0741198270537 +VPGS1,Valley Power,OCGT (small GT),8.94908862350722 +VPGS2,Valley Power,OCGT (small GT),8.94908862350722 +VPGS3,Valley Power,OCGT (small GT),8.94908862350722 +VPGS4,Valley Power,OCGT (small GT),8.94908862350722 +VPGS5,Valley Power,OCGT (small GT),8.94908862350722 +VPGS6,Valley Power,OCGT (small GT),8.94908862350722 +YARWUN_1,Yarwun Cogen,CCGT,13.1906496660594 +BARRON-1,Barron Gorge,Hydro,10.3382270795385 +BARRON-2,Barron Gorge,Hydro,10.3382270795385 +BASTYAN,Bastyan,Hydro,8.99 +BLOWERNG,Blowering,Hydro,9.04552810376777 +BOGONG1,Bogong / Mackay,Hydro,8.99 +BOGONG2,Bogong / Mackay,Hydro,8.99 +MCKAY11,Bogong / Mackay,Hydro,8.99 +MCKAY12,Bogong / Mackay,Hydro,8.99 +MCKAY13,Bogong / Mackay,Hydro,8.99 +MCKAY14,Bogong / Mackay,Hydro,8.99 +MCKAY15,Bogong / Mackay,Hydro,8.99 +MCKAY16,Bogong / Mackay,Hydro,8.99 +LI111-1,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +LI112-2,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +LI113-3,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +CA111-1,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +CA112-2,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +WY111-1,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +WY111-2,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +WY111-3,Catagunya / Liapootah / Wayatinah,Hydro,8.99 +CETHANA,Cethana,Hydro,8.99 +DARTM1,Dartmouth,Hydro,8.99 +DEVILS_G,Devils Gate,Hydro,8.99 +EILDON1,Eildon,Hydro,8.99 +EILDON2,Eildon,Hydro,8.99 +FISHER,Fisher,Hydro,8.99 +GO181-1,Gordon,Hydro,8.99 +GO182-2,Gordon,Hydro,8.99 +GO183-3,Gordon,Hydro,8.99 +GUTHEGA1,Guthega,Hydro,9.04552810376777 +GUTHEGA2,Guthega,Hydro,9.04552810376777 +HUMENSW,Hume Dam NSW,Hydro,9.04552810376777 +HUMEV,Hume Dam VIC,Hydro,8.99 +JBUTTERS,John Butters,Hydro,8.99 +KAREEYA1,Kareeya,Hydro,10.3382270795385 +KAREEYA2,Kareeya,Hydro,10.3382270795385 +KAREEYA3,Kareeya,Hydro,10.3382270795385 +KAREEYA4,Kareeya,Hydro,10.3382270795385 +LK_ECHO,Lake Echo,Hydro,8.99 +LM111-1,Lemonthyme / Wilmot,Hydro,8.99 +WI111-1,Lemonthyme / Wilmot,Hydro,8.99 +MACKNTSH,Mackintosh,Hydro,8.99 +MEADOWBK,Meadowbank,Hydro,8.99 +MURRAY01,Murray 1,Hydro,8.99 +MURRAY02,Murray 1,Hydro,8.99 +MURRAY03,Murray 1,Hydro,8.99 +MURRAY04,Murray 1,Hydro,8.99 +MURRAY05,Murray 1,Hydro,8.99 +MURRAY06,Murray 1,Hydro,8.99 +MURRAY07,Murray 1,Hydro,8.99 +MURRAY08,Murray 1,Hydro,8.99 +MURRAY09,Murray 1,Hydro,8.99 +MURRAY10,Murray 1,Hydro,8.99 +MURRAY11,Murray 2,Hydro,8.99 +MURRAY12,Murray 2,Hydro,8.99 +MURRAY13,Murray 2,Hydro,8.99 +MURRAY14,Murray 2,Hydro,8.99 +PO161-1,Poatina,Hydro,8.99 +PO162-2,Poatina,Hydro,8.99 +PO163-3,Poatina,Hydro,8.99 +PO164-4,Poatina,Hydro,8.99 +PO165-5,Poatina,Hydro,8.99 +PO166-6,Poatina,Hydro,8.99 +REECE1,Reece,Hydro,8.99 +REECE2,Reece,Hydro,8.99 +SHGEN01,Shoalhaven,Hydro,0.0 +SHGEN02,Shoalhaven,Hydro,0.0 +SHGEN03,Shoalhaven,Hydro,0.0 +SHGEN04,Shoalhaven,Hydro,0.0 +TA111-1,Tarraleah,Hydro,8.99 +TA111-2,Tarraleah,Hydro,8.99 +TA111-3,Tarraleah,Hydro,8.99 +TA112-4,Tarraleah,Hydro,8.99 +TA112-5,Tarraleah,Hydro,8.99 +TA112-6,Tarraleah,Hydro,8.99 +TR111-1,Trevallyn,Hydro,8.99 +TR111-2,Trevallyn,Hydro,8.99 +TR112-3,Trevallyn,Hydro,8.99 +TR112-4,Trevallyn,Hydro,8.99 +TRIBUTE,Tribute,Hydro,8.99 +TUMUT3_01,Tumut 3,Hydro,9.04552810376777 +TUMUT3_02,Tumut 3,Hydro,9.04552810376777 +TUMUT3_03,Tumut 3,Hydro,9.04552810376777 +TUMUT3_04,Tumut 3,Hydro,9.04552810376777 +TUMUT3_05,Tumut 3,Hydro,9.04552810376777 +TUMUT3_06,Tumut 3,Hydro,9.04552810376777 +TU111-1,Tungatinah,Hydro,8.99 +TU112-2,Tungatinah,Hydro,8.99 +TU113-3,Tungatinah,Hydro,8.99 +TU114-4,Tungatinah,Hydro,8.99 +TU115-5,Tungatinah,Hydro,8.99 +TUMUT1_01,Upper Tumut,Hydro,9.04552810376777 +TUMUT1_02,Upper Tumut,Hydro,9.04552810376777 +TUMUT1_03,Upper Tumut,Hydro,9.04552810376777 +TUMUT1_04,Upper Tumut,Hydro,9.04552810376777 +TUMUT2_01,Upper Tumut,Hydro,9.04552810376777 +TUMUT2_02,Upper Tumut,Hydro,9.04552810376777 +TUMUT2_03,Upper Tumut,Hydro,9.04552810376777 +TUMUT2_04,Upper Tumut,Hydro,9.04552810376777 +WKIEWA1_1,West Kiewa,Hydro,8.99 +WKIEWA1_2,West Kiewa,Hydro,8.99 +WKIEWA2_1,West Kiewa,Hydro,8.99 +WKIEWA2_2,West Kiewa,Hydro,8.99 +W/HOE#1,Wivenhoe,Hydro,0.0 +W/HOE#2,Wivenhoe,Hydro,0.0 +BANN1,Bannerton Solar Park,Large scale Solar PV,0.0 +BERYLSF1,Beryl Solar Farm,Large scale Solar PV,0.0 +BOWWPV1,Bolivar Waste Water Treatment Solar Farm,Large scale Solar PV,0.0 +BOMENSF1,Bomen Solar Farm,Large scale Solar PV,0.0 +BROKENH1,Broken Hill Solar Farm,Large scale Solar PV,0.0 +BNGSF1,Bungala One Solar Farm,Large scale Solar PV,0.0 +BNGSF2,Bungala Two Solar Farm,Large scale Solar PV,0.0 +CHILDSF1,Childers Solar Farm,Large scale Solar PV,0.0 +CLARESF1,Clare Solar Farm,Large scale Solar PV,0.0 +CLERMSF1,Clermont Solar Farm,Large scale Solar PV,0.0 +COLEASF1,Coleambally Solar Farm,Large scale Solar PV,0.0 +CSPVPS1,Collinsville Solar Farm,Large scale Solar PV,0.0 +DDSF1,Darling Downs Solar Farm,Large scale Solar PV,0.0 +DARLSF1,Darlington Point Solar Farm,Large scale Solar PV,0.0 +DAYDSF1,Daydream Solar Farm,Large scale Solar PV,0.0 +EMERASF1,Emerald Solar Farm,Large scale Solar PV,0.0 +FINLYSF1,Finley Solar Farm,Large scale Solar PV,0.0 +GANNSF1,Gannawarra Solar Farm,Large scale Solar PV,0.0 +GLENSF1,Glenrowan Solar Farm,Large scale Solar PV,0.0 +GLRWNSF1,Glenrowan West Solar Farm,Large scale Solar PV,0.0 +GOONSF1,Goonumbla Solar Farm,Large scale Solar PV,0.0 +GULLRSF1,Gullen Range Solar Farm,Large scale Solar PV,0.0 +GNNDHSF1,Gunnedah Solar Farm,Large scale Solar PV,0.0 +HAMISF1,Hamilton Solar Farm,Large scale Solar PV,0.0 +HVWWPV1,Happy Valley Reservoir,Large scale Solar PV,0.0 +HAUGHT11,Haughton Solar Farm,Large scale Solar PV,0.0 +HAYMSF1,Hayman Solar Farm,Large scale Solar PV,0.0 +HILLSTN1,Hillston Sun Farm,Large scale Solar PV,0.0 +HUGSF1,Hughenden Solar Farm,Large scale Solar PV,0.0 +JEMALNG1,Jemalong Solar,Large scale Solar PV,0.0 +JUNEESF1,Junee Solar Farm,Large scale Solar PV,0.0 +KARSF1,Karadoc Solar Farm,Large scale Solar PV,0.0 +KIAMSF1,Kiamal Solar Farm stage 1,Large scale Solar PV,0.0 +KSP1,Kidston Solar Farm,Large scale Solar PV,0.0 +LILYSF1,Lilyvale Solar Farm,Large scale Solar PV,0.0 +LIMOSF11,Limondale Solar Farm 1,Large scale Solar PV,0.0 +LIMOSF21,Limondale Solar Farm 2,Large scale Solar PV,0.0 +LRSF1,Longreach Solar Farm,Large scale Solar PV,0.0 +MANSLR1,Manildra Solar Farm,Large scale Solar PV,0.0 +MAPS2PV1,Mannum Adelaide Pumping Station No 2 - MAPL2 (Palmer),Large scale Solar PV,0.0 +MAPS3PV1,Mannum Adelaide Pumping Station No 3 - MAPL3 (Tungkillo),Large scale Solar PV,0.0 +MARYRSF1,Maryrorough Solar Farm,Large scale Solar PV,0.0 +MIDDLSF1,Middlemount Solar Farm,Large scale Solar PV,0.0 +MOLNGSF1,Molong Solar Farm,Large scale Solar PV,0.0 +MOREESF1,Moree Solar Farm,Large scale Solar PV,0.0 +MWPS1PV1,Morgan To Whyalla Pipeline No 1 PS And Water Filtration Plant,Large scale Solar PV,0.0 +MWPS2PV1,Morgan To Whyalla Pipeline No 2 PS,Large scale Solar PV,0.0 +MWPS3PV1,Morgan To Whyalla Pipeline No 3 PS,Large scale Solar PV,0.0 +MWPS4PV1,Morgan To Whyalla Pipeline No 4 PS,Large scale Solar PV,0.0 +MOUSF1,Moura Solar Farm,Large scale Solar PV,0.0 +MBPS2PV1,Murray Bridge - Onkaparinga Pipeline Pump 2,Large scale Solar PV,0.0 +NEVERSF1,Nevertire Solar Farm,Large scale Solar PV,0.0 +NEWENSF1,New England Solar Farm,Large scale Solar PV,0.0 +NEWENSF2,New England Solar Farm,Large scale Solar PV,0.0 +NUMURSF1,Numurkah Solar Farm,Large scale Solar PV,0.0 +NYNGAN1,Nyngan Solar Plant,Large scale Solar PV,0.0 +OAKEY1SF,Oakey 1 Solar Farm,Large scale Solar PV,0.0 +OAKEY2SF,Oakey 2 Solar Farm,Large scale Solar PV,0.0 +PARSF1,Parkes Solar Farm,Large scale Solar PV,0.0 +PAREPS1,Port Augusta Renewable Energy Park - Solar,Large scale Solar PV,0.0 +RRSF1,Ross River Solar Farm,Large scale Solar PV,0.0 +RUGBYR1,Rugby Run Solar Farm,Large scale Solar PV,0.0 +SMCSF1,Sun Metals Corporation Solar Farm,Large scale Solar PV,0.0 +SUNRSF1,Sunraysia Solar Farm,Large scale Solar PV,0.0 +SUNTPSF1,Suntop Solar Farm,Large scale Solar PV,0.0 +SRSF1,Susan River Solar Farm,Large scale Solar PV,0.0 +TBSF1,Tailem Bend Solar Farm,Large scale Solar PV,0.0 +WARWSF1,Warwick Solar Farm - stage 1,Large scale Solar PV,0.0 +WARWSF2,Warwick Solar Farm - stage 2,Large scale Solar PV,0.0 +WELLSF1,Wellington Solar Farm,Large scale Solar PV,0.0 +WEMENSF1,Wemen Solar Farm,Large scale Solar PV,0.0 +WSTWYSF1,West Wyalong Solar Farm,Large scale Solar PV,0.0 +WDGPH1,Western Downs Green Power Hub,Large scale Solar PV,0.0 +WRSF1,White Rock Solar Farm,Large scale Solar PV,0.0 +WHITSF1,Whitsunday Solar Farm,Large scale Solar PV,0.0 +WINTSF1,Winton Solar Farm,Large scale Solar PV,0.0 +WOOLGSF1,Woolooga Solar Farm,Large scale Solar PV,0.0 +YARANSF1,Yarranlea Solar Farm,Large scale Solar PV,0.0 +YATSF1,Yatpool Solar Farm,Large scale Solar PV,0.0 +ARWF1,Ararat Wind Farm,Wind,0.0 +BALDHWF1,Bald Hills Wind Farm,Wind,0.0 +BANGOWF1,Bango 973 Wind Farm,Wind,0.0 +BANGOWF2,Bango 999 Wind Farm,Wind,0.0 +BRYB1WF1,Berrybank Wind Farm,Wind,0.0 +BRYB2WF2,Berrybank Wind Farm,Wind,0.0 +BOCORWF1,Boco Rock Wind Farm,Wind,0.0 +BODWF1,Bodangora Wind Farm,Wind,0.0 +BULGANA1,Bulgana Green Power Hub - Wind Farm,Wind,0.0 +CNUNDAWF,Canunda Wind Farm,Wind,0.0 +CAPTL_WF,Capital Wind Farm,Wind,0.0 +CATHROCK,Cathedral Rocks Wind Farm,Wind,0.0 +CTHLWF1,Cattle Hill Wind Farm,Wind,0.0 +CHALLHWF,Challicum Hills Wind Farm,Wind,0.0 +CHYTWF1,Cherry Tree Wind Farm,Wind,0.0 +CLEMGPWF,Clements Gap Wind Farm,Wind,0.0 +COLWF01,Collector Wind Farm,Wind,0.0 +COOPGWF1,Coopers Gap Wind Farm,Wind,0.0 +CROOKWF2,Crookwell 2 Wind Farm,Wind,0.0 +CROWLWF1,Crowlands Wind Farm,Wind,0.0 +CRURWF1,Crudine Ridge Wind Farm,Wind,0.0 +CULLRGWF,Cullerin Range Wind Farm,Wind,0.0 +DULAWF1,Dulacca Wind Farm,Wind,0.0 +DUNDWF1,Dundonnell Wind Farm,Wind,0.0 +DUNDWF2,Dundonnell Wind Farm,Wind,0.0 +DUNDWF3,Dundonnell Wind Farm,Wind,0.0 +ELAINWF1,Elaine Wind Farm,Wind,0.0 +GRANWF1,Granville Harbour Wind Farm,Wind,0.0 +GULLRWF1,Gullen Range Wind Farm,Wind,0.0 +GULLRWF2,Gullen Range Wind Farm 2,Wind,0.0 +GUNNING1,Gunning Wind Farm,Wind,0.0 +NBHWF1,Hallett 4 North Brown Hill Wind Farm,Wind,0.0 +BLUFF1,Hallett 5 The Bluff Wind Farm,Wind,0.0 +HALLWF1,Hallett Stage 1 Brown Hill Wind Farm,Wind,0.0 +HALLWF2,Hallett Stage 2 Hallett Hill Wind Farm,Wind,0.0 +HDWF1,Hornsdale Wind Farm Stage 1,Wind,0.0 +HDWF2,Hornsdale Wind Farm Stage 2,Wind,0.0 +HDWF3,Hornsdale Wind Farm Stage 3,Wind,0.0 +KIATAWF1,Kiata Wind Farm,Wind,0.0 +LKBONNY1,Lake Bonney 1 Wind Farm,Wind,0.0 +LKBONNY2,Lake Bonney 2 Wind Farm,Wind,0.0 +LKBONNY3,Lake Bonney 3 Wind Farm,Wind,0.0 +LGAPWF1,Lincoln Gap Wind Farm - stage 1,Wind,0.0 +LGAPWF2,Lincoln Gap Wind Farm - stage 2,Wind,0.0 +MACARTH1,Macarthur Wind Farm,Wind,0.0 +MOORAWF1,Moorabool Wind Farm,Wind,0.0 +MRTLSWF1,Mortlake South Wind Farm,Wind,0.0 +MLWF1,Mortons Lane Wind Farm,Wind,0.0 +MEWF1,Mount Emerald Wind Farm,Wind,0.0 +MTMILLAR,Mount Millar Wind Farm,Wind,0.0 +MERCER01,Mt Mercer Wind Farm,Wind,0.0 +MUWAWF1,Murra Warra Wind Farm - stage 1,Wind,0.0 +MUWAWF2,Murra Warra Wind Farm - stage 2,Wind,0.0 +MUSSELR1,Musselroe Wind Farm,Wind,0.0 +OAKLAND1,Oaklands Hill Wind Farm,Wind,0.0 +PAREPW1,Port Augusta Renewable Energy Park - Wind,Wind,0.0 +PORTWF,Portland Wind Farm,Wind,0.0 +SALTCRK1,Salt Creek Wind Farm,Wind,0.0 +SAPHWF1,Sapphire Wind Farm,Wind,0.0 +STWF1,Silverton Wind Farm,Wind,0.0 +SNOWNTH1,Snowtown S2 Wind Farm,Wind,0.0 +SNOWSTH1,Snowtown S2 Wind Farm,Wind,0.0 +SNOWTWN1,Snowtown Wind Farm,Wind,0.0 +STARHLWF,Starfish Hill Wind Farm,Wind,0.0 +STOCKYD1,Stockyard Hill Wind Farm,Wind,0.0 +TARALGA1,Taralga Wind Farm,Wind,0.0 +WATERLWF,Waterloo Wind Farm,Wind,0.0 +WPWF,Wattle Point Wind Farm,Wind,0.0 +WAUBRAWF,Waubra Wind Farm,Wind,0.0 +WRWF1,White Rock Wind Farm - Stage 1,Wind,0.0 +WGWF1,Willogoleche Wind Farm,Wind,0.0 +WOODLWN1,Woodlawn Wind Farm,Wind,0.0 +WOOLNTH1,Woolnorth Wind Farm,Wind,0.0 +YSWF1,Yaloak South Wind Farm,Wind,0.0 +YAMBUKWF,Yambuk Wind Farm,Wind,0.0 +YENDWF1,Yendon Wind Farm,Wind,0.0 +Tully Sugar Mill Biomass,Tully Sugar Mill Biomass,Biomass,12.5766889860352 +HUNTER1,Hunter Power Station,OCGT (large GT),12.0 +HUNTER2,Hunter Power Station,OCGT (large GT),12.0 +Kidston Pumped Storage Hydro 1,Kidston,Pumped Hydro (10hrs storage),0.0 +Kidston Pumped Storage Hydro 2,Kidston,Pumped Hydro (10hrs storage),0.0 +SNO2PH01,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH02,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH03,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH04,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH05,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +SNO2PH06,Snowy 2.0,Pumped Hydro (1wk storage),0.0 +ADPPV1,Adelaide Desalination Plant Solar Farm,Large scale Solar PV,0.0 +AVLSF1,Avonlie Solar Farm,Large scale Solar PV,0.0 +BLUEGSF1,Bluegrass Solar Farm,Large scale Solar PV,0.0 +Broadsound Solar Farm,Broadsound Solar Farm,Large scale Solar PV,0.0 +Bundaberg Solar Farm,Bundaberg Solar Farm,Large scale Solar PV,0.0 +COHUNSF1,Cohuna Solar Farm,Large scale Solar PV,0.0 +COLUMSF1,Columboola Solar Farm,Large scale Solar PV,0.0 +CRWASF1,Corowa Solar Farm,Large scale Solar PV,0.0 +Culcairn Solar Farm,Culcairn Solar Farm,Large scale Solar PV,0.0 +EDENVSF1,Edenvale Solar Park,Large scale Solar PV,0.0 +GANGARR1,Gangarri Solar Farm,Large scale Solar PV,0.0 +GIRGSF,Girgarre Solar Farm,Large scale Solar PV,0.0 +Goorambat East Solar Farm,Goorambat East Solar Farm,Large scale Solar PV,0.0 +KEPSF1,Kennedy Energy Park Solar Farm,Large scale Solar PV,0.0 +KINGASF1,Kingaroy Solar Farm,Large scale Solar PV,0.0 +Lockhart Hybrid Facility - Solar,Lockhart Hybrid Facility - Solar,Large scale Solar PV,0.0 +MANSF2,Mannum Solar Farm 2,Large scale Solar PV,0.0 +METZSF1,Metz Solar Farm,Large scale Solar PV,0.0 +QPSF,Quorn Park Solar Farm,Large scale Solar PV,0.0 +Riverina Solar Farm,Riverina Solar Farm,Large scale Solar PV,0.0 +SEBSF1,Sebastopol Solar Farm,Large scale Solar PV,0.0 +Stubbo Solar Farm,Stubbo Solar Farm,Large scale Solar PV,0.0 +TB2SF1,Tailem Bend Solar Farm - stage 2,Large scale Solar PV,0.0 +Tilbuster Solar Farm,Tilbuster Solar Farm,Large scale Solar PV,0.0 +WAGGNSF1,Wagga North Solar Farm,Large scale Solar PV,0.0 +WLWLSF1,Walla Walla Solar Farm,Large scale Solar PV,0.0 +WLWLSF2,Walla Walla Solar Farm,Large scale Solar PV,0.0 +WANDSF1,Wandoan South Solar Farm - stage 1,Large scale Solar PV,0.0 +WELNSF1,Wellington North Solar Farm (Lightsource),Large scale Solar PV,0.0 +WOLARSF1,Wollar Solar Farm,Large scale Solar PV,0.0 +WUNUSF1,Wunghnu Solar Farm,Large scale Solar PV,0.0 +WYASF1,Wyalong Solar Farm,Large scale Solar PV,0.0 +CLRKCWF1,Clarke Creek Wind Farm,Wind,0.0 +CLRKCWF2,Clarke Creek Wind Farm,Wind,0.0 +CROOKWF3,Crookwell 3 Wind Farm,Wind,0.0 +FLYCRKWF,Flyers Creek Wind Farm,Wind,0.0 +GPWFEST1,Golden Plains Wind Farm East,Wind,0.0 +GPWFEST2,Golden Plains Wind Farm East,Wind,0.0 +GPWFEST3,Golden Plains Wind Farm East,Wind,0.0 +GSWF1A,Goyder South Wind Farm 1A,Wind,0.0 +GSWF1B,Goyder South Wind Farm 1B,Wind,0.0 +HD1WF1,Hawkesdale Wind Farm,Wind,0.0 +KABANWF1,Kaban Green Power Hub - Wind Farm,Wind,0.0 +KEPWF1,Kennedy Energy Park Wind Farm,Wind,0.0 +MacIntyre Wind Farm,MacIntyre Wind Farm,Wind,0.0 +MTGELWF1,Mt Gellibrand Wind Farm,Wind,0.0 +RYANCWF1,Ryan Corner Wind Farm,Wind,0.0 +Rye Park Wind Farm,Rye Park Wind Farm,Wind,0.0 +Wambo Wind Farm,Wambo Wind Farm,Wind,0.0 +Aldoga Solar Farm,Aldoga Solar Farm,Large scale Solar PV,0.0 +Aramara Solar Farm,Aramara Solar Farm,Large scale Solar PV,0.0 +Banksia Solar Farm,Banksia Solar Farm,Large scale Solar PV,0.0 +Derby Solar Farm,Derby Solar Farm,Large scale Solar PV,0.0 +Frasers Solar Farm,Frasers Solar Farm,Large scale Solar PV,0.0 +Goulburn River Solar Farm,Goulburn River Solar Farm,Large scale Solar PV,0.0 +Horsham Solar Farm,Horsham Solar Farm,Large scale Solar PV,0.0 +Maryvale Solar Farm,Maryvale Solar Farm,Large scale Solar PV,0.0 +Mortlake Energy Hub Solar Farm,Mortlake Energy Hub Solar Farm,Large scale Solar PV,0.0 +Munna Creek Solar Farm,Munna Creek Solar Farm,Large scale Solar PV,0.0 +New England Solar Farm 2,New England Solar Farm - Stage 2,Large scale Solar PV,0.0 +Punch's Creek Renewable Energy Solar Farm,Punch's Creek Renewable Energy Solar Farm,Large scale Solar PV,0.0 +GBWF1,Gawara Baya Wind Farm,Wind,0.0 +Uungula Wind Farm,Uungula Wind Farm,Wind,0.0 +Woolsthorpe Wind Farm,Woolsthorpe Wind Farm,Wind,0.0 +BALB1,Ballarat Energy Storage System,Battery storage (1hr storage),0.0 +BOWWBA1,Bolivar Waste Water Treatment BESS,Battery storage (2hrs storage),0.0 +BBATTERY,Bouldercombe Battery project,Battery storage (2hrs storage),0.0 +BULBES1,Bulgana Green Power Hub BESS,Battery storage (2hrs storage),0.0 +DALNTH1,Dalrymple BESS,Battery storage (1hr storage),0.0 +DPNTB1,Darlington Point Energy Storage System,Battery storage (2hrs storage),0.0 +GANNB1,Gannawarra Energy Storage System,Battery storage (2hrs storage),0.0 +HVWWBA1,Happy Valley Reservoir BESS,Battery storage (2hrs storage),0.0 +HPR1,Hornsdale Power Reserve Unit 1,Battery storage (1hr storage),0.0 +LBBG1,Lake Bonney BESS,Battery storage (2hrs storage),0.0 +PIBESS1,Philip Island BESS,Battery storage (2hrs storage),0.0 +QBYNB1,Queanbeyan BESS,Battery storage (2hrs storage),0.0 +RANGEB1,Rangebank BESS,Battery storage (2hrs storage),0.0 +RESS1G,Riverina Energy Storage System 1,Battery storage (2hrs storage),0.0 +RIVNB2,Riverina Energy Storage System 2,Battery storage (2hrs storage),0.0 +VBB1,Victorian Big Battery,Battery storage (2hrs storage),0.0 +WALGRV1,Wallgrove Grid Battery project,Battery storage (2hrs storage),0.0 +WANDB1,Wandoan South BESS,Battery storage (2hrs storage),0.0 +ADPBA1,Adelaide Desalination Plant BESS,Battery storage (2hrs storage),0.0 +BLYTHB1,Blyth BESS,Battery storage (2hrs storage),0.0 +BHBG1,Broken Hill BESS,Battery storage (1hr storage),0.0 +CAPBES1,Capital Battery,Battery storage (2hrs storage),0.0 +CHBESSG1,Chinchilla BESS,Battery storage (2hrs storage),0.0 +CBWWBA1,Christies Beach Wastewater Treatment Plant BESS,Battery storage (2hrs storage),0.0 +Clements Gap BESS,Clements Gap BESS,Battery storage (2hrs storage),0.0 +Eraring Big Battery,Eraring Big Battery,Battery storage (2hrs storage),0.0 +GREENB1,Greenbank BESS,Battery storage (2hrs storage),0.0 +HBESS1,Hazelwood BESS,Battery storage (1hr storage),0.0 +Koorangie Energy Storage System,Koorangie Energy Storage System,Battery storage (2hrs storage),0.0 +LaTrobe Valley BESS,LaTrobe Valley BESS,Battery storage (2hrs storage),0.0 +Liddell BESS,Liddell BESS,Battery storage (4hrs storage),0.0 +Lockhart Hybrid Facility - Battery,Lockhart Hybrid Facility - Battery,Battery storage (2hrs storage),0.0 +Melbourne Renewable Energy Hub - Side A,Melbourne Renewable Energy Hub - Side A,Battery storage (2hrs storage),0.0 +QPBESS,Quorn Park BESS,Battery storage (2hrs storage),0.0 +TB2BG1,Tailem Bend Battery Project,Battery storage (2hrs storage),0.0 +Tarong BESS,Tarong BESS,Battery storage (1hr storage),0.0 +Templers BESS,Templers BESS,Battery storage (2hrs storage),0.0 +TIB1,Torrens Island BESS,Battery storage (1hr storage),0.0 +ULBESS,Ulinda Park BESS,Battery storage (2hrs storage),0.0 +WTAHB1,Waratah Super Battery,Battery storage (2hrs storage),0.0 +WDBESS1,Western Downs Battery,Battery storage (1hr storage),0.0 +Aldoga BESS Stage 1,Aldoga BESS Stage 1,Battery storage (1hr storage),0.0 +Brendale BESS,Brendale BESS,Battery storage (2hrs storage),0.0 +Bungama Solar BESS,Bungama Solar BESS,Battery storage (2hrs storage),0.0 +Eraring Big Battery 2,Eraring Big Battery 2,Battery storage (2hrs storage),0.0 +GBBATT1,Gawara Baya Wind Farm BESS,Battery storage (2hrs storage),0.0 +Gnarwarre BESS,Gnarwarre BESS,Battery storage (2hrs storage),0.0 +Limondale BESS,Limondale BESS,Battery storage (8hrs storage),0.0 +LGAPBS1,Lincoln Gap Wind Farm BESS,Battery storage (1hr storage),0.0 +Mannum BESS,Mannum BESS,Battery storage (2hrs storage),0.0 +Maryvale Solar Farm BESS,Maryvale Solar Farm BESS,Battery storage (2hrs storage),0.0 +Mortlake Battery,Mortlake Battery,Battery storage (2hrs storage),0.0 +Mortlake Energy Hub BESS,Mortlake Energy Hub BESS,Battery storage (2hrs storage),0.0 +Mt Fox BESS,Mt Fox BESS,Battery storage (2hrs storage),0.0 +New England Solar Farm BESS,New England Solar Farm BESS,Battery storage (1hr storage),0.0 +ORANA,Orana BESS,Battery storage (4hrs storage),0.0 +Richmond Valley BESS,Richmond Valley BESS,Battery storage (8hrs storage),0.0 +Silver City Energy Storage,Silver City Energy Storage,Battery storage (8hrs storage),4.55942912909204 +Smithfield BESS,Smithfield BESS,Battery storage (2hrs storage),0.0 +Stanwell BESS,Stanwell BESS,Battery storage (2hrs storage),0.0 +Swanbank BESS,Swanbank BESS,Battery storage (2hrs storage),0.0 +TRGBESS,Terang BESS,Battery storage (2hrs storage),0.0 +Wooreen Energy Storage System,Wooreen Energy Storage System,Battery storage (4hrs storage),0.0 +Kogan Gas,Brigalow GT,OCGT (large GT),12.0 +Fulham Solar Farm,Fulham Solar Farm,Large scale Solar PV,0.0 +Solar River Solar Farm,Solar River Solar Farm,Large scale Solar PV,0.0 +Coppabella Wind Farm,Coppabella Wind Farm,Wind,0.0 +Derby Solar Project BESS,Derby Solar Project BESS,Battery storage (2hrs storage),0.0 +Fulham Solar Farm BESS,Fulham Solar Farm BESS,Battery storage (1hr storage),0.0 +Goulburn River BESS,Goulburn River BESS,Battery storage (8hrs storage),0.0 +Hallett BESS,Hallett BESS,Battery storage (4hrs storage),0.0 +Horsham Solar Farm BESS,Horsham Solar Farm BESS,Battery storage (2hrs storage),0.0 +Limestone Coast West BESS,Limestone Coast West BESS,Battery storage (2hrs storage),0.0 +Solar River Solar Farm BESS,Solar River Solar Farm BESS,Battery storage (4hrs storage),0.0 +Springvale Energy Hub BESS,Springvale Energy Hub BESS,Battery storage (2hrs storage),0.0 +Mornington BESS,Mornington BESS,Battery storage (2hrs storage),0.0 +Tamworth BESS,Tamworth BESS,Battery storage (2hrs storage),0.0 +Tamworth BESS 2,Tamworth BESS,Battery storage (2hrs storage),0.0 +QEJP - Borumba,QEJP - Borumba,Pumped Hydro (24hrs storage),0.0 +Broadsound BESS,Broadsound BESS,Battery storage (2hrs storage),0.0 +Calala BESS 1,Calala BESS 1,Battery storage (2hrs storage),0.0 +Calala BESS 2,Calala BESS 2,Battery storage (2hrs storage),0.0 +Glanmire Solar Farm BESS,Glanmire Solar Farm BESS,Battery storage (2hrs storage),0.0 +Ravenswood BESS,Ravenswood BESS,Battery storage (4hrs storage),0.0 +Bullyard Solar Farm,Bullyard Solar Farm,Large scale Solar PV,0.0 +Glanmire Solar Farm,Glanmire Solar Farm,Large scale Solar PV,0.0 +Ravenswood Solar Farm,Ravenswood Solar Farm,Large scale Solar PV,0.0 +Lockyer Valley GT,Lockyer Valley GT,OCGT (small GT),10.0 +Boulder Creek Wind Farm,Boulder Creek Wind Farm,Wind,0.0 +Inverleigh Wind Farm,Inverleigh Wind Farm,Wind,0.0 +Port Latta Wind Farm,Port Latta Wind Farm,Wind,0.0 +Valley of the Winds Wind Farm,Valley of the Winds,Wind,0.0 +Woolooga BESS,Woolooga BESS,Battery storage (2hrs storage),0.0 +Supernode BESS 1,Supernode BESS 1,Battery storage (4hrs storage),0.0 +Supernode BESS 2,Supernode BESS 2,Battery storage (4hrs storage),0.0 +Golden Plains West Wind Farm,Golden Plains West Wind Farm,Wind,0.0 +Lotus Creek Wind Farm,Lotus Creek Wind Farm,Wind,0.0 +Barnawartha Solar Farm BESS,Barnawartha Solar Farm BESS,Battery storage (2hrs storage),0.0 +Barwon Solar Farm BESS,Barwon Solar Farm BESS,Battery storage (2hrs storage),0.0 +Bungama BESS,Bungama BESS,Battery storage (2hrs storage),0.0 +Elaine Solar Farm BESS,Elaine Solar Farm BESS,Battery storage (2hrs storage),0.0 +Ganymirra Solar Power Station BESS,Ganymirra Solar Power Station BESS,Battery storage (2hrs storage),0.0 +Junction Rivers Wind Farm BESS,Junction Rivers Wind Farm BESS,Battery storage (4hrs storage),0.0 +Majors Creek Solar Power Station BESS,Majors Creek Power Station BESS,Battery storage (4hrs storage),0.0 +West Mokoan Solar Farm BESS,West Mokoan Solar Farm BESS,Battery storage (4hrs storage),0.0 +Griffith BESS,Griffith BESS,Battery storage (8hrs storage),0.0 +Stoney Creek BESS,Stoney Creek BESS,Battery storage (8hrs storage),0.0 +Barnawartha Solar Farm,Barnawartha Solar Farm,Large scale Solar PV,0.0 +Barwon Solar Farm,Barwon Solar Farm,Large scale Solar PV,0.0 +Campbells Forest Solar Farm,Campbells Forest Solar Farm,Large scale Solar PV,0.0 +Elaine Solar Farm,Elaine Solar Farm,Large scale Solar PV,0.0 +Ganymirra Solar Power Station,Ganymirra Solar Power Station,Large scale Solar PV,0.0 +Hopeland Solar Farm,Hopeland Solar Farm,Large scale Solar PV,0.0 +Majors Creek Solar Power Station,Majors Creek Power Station,Large scale Solar PV,0.0 +Sandy Creek Solar Farm,Sandy Creek Solar Farm,Large scale Solar PV,0.0 +West Mokoan Solar Farm,West Mokoan Solar Farm,Large scale Solar PV,0.0 +Phoenix Pumped Hydro Project,Phoenix Pumped Hydro Project,Pumped Hydro (10hrs storage),0.0 +Goyder North Wind Farm,Goyder North Wind Farm,Wind,0.0 +Junction Rivers Wind Farm,Junction Rivers Wind Farm,Wind,0.0 +Kentbruck Green Power Hub Wind Farm,Kentbruck Green Power Hub Wind Farm,Wind,0.0 +Palmer Wind Farm,Palmer Wind Farm,Wind,0.0 +Spicers Creek Wind Farm,Spicers Creek Wind Farm,Wind,0.0 +Thunderbolt Wind Farm,Thunderbolt Wind Farm,Wind,0.0 +Haughton Solar Farm Stage 2,Haughton Solar Farm Stage 2,Large scale Solar PV,0.0 +Lancaster Solar Farm,Lancaster Solar Farm,Large scale Solar PV,0.0 +Bennetts Creek BESS,Bennetts Creek BESS,Battery storage (2hrs storage),0.0 +Northern Midlands Solar Farm,Northern Midlands Solar Farm,Large scale Solar PV,0.0 +Hay Sun Farm,Hay Sun Farm,Large scale Solar PV,0.0 +MOKOSF1,Mokoan Solar Farm,Large scale Solar PV,0.0 +Kiamal BESS,Kiamal BESS,Battery storage (4hrs storage),0.0 +Pine Lodge BESS,Pine Lodge BESS,Battery storage (2hrs storage),0.0 From 52a8d027912e896f7ef6cc7d816b1304506cb179 Mon Sep 17 00:00:00 2001 From: EllieKallmier <61219730+EllieKallmier@users.noreply.github.com> Date: Tue, 25 Aug 2026 17:53:43 +1000 Subject: [PATCH 2/4] add generator property merges to existing/planned templater and refactor shared helpers Functions (and mappings) that were shared/very similar across new_entrants templater module are pulled out and gently refactored to become generic helpers. --- src/ispypsa/templater/create_template.py | 13 +- src/ispypsa/templater/existing_planned.py | 391 +++++++++++++++-- src/ispypsa/templater/geography.py | 46 -- src/ispypsa/templater/helpers.py | 262 ++++++++++++ src/ispypsa/templater/mappings.py | 78 +++- src/ispypsa/templater/new_entrants.py | 190 ++------- src/ispypsa/templater/transmission.py | 2 +- ...create_ispypsa_inputs_new_table_formats.py | 21 + .../test_create_ispypsa_inputs_template.py | 90 ++++ tests/test_templater/test_existing_planned.py | 397 ++++++++++++++++-- tests/test_templater/test_geography.py | 31 -- tests/test_templater/test_helpers.py | 332 +++++++++++++++ tests/test_templater/test_new_entrants.py | 212 +--------- 13 files changed, 1541 insertions(+), 524 deletions(-) diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index c670fd97..4d6f4602 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -15,6 +15,9 @@ from ispypsa.templater.energy_policy_targets import ( _template_energy_policy_targets, ) +from ispypsa.templater.existing_planned import ( + _template_generators_existing_planned, +) from ispypsa.templater.filter_template import _filter_template from ispypsa.templater.flow_paths import ( _template_regional_interconnectors, @@ -22,10 +25,8 @@ _template_sub_regional_flow_path_costs, _template_sub_regional_flow_paths, ) -from ispypsa.templater.geography import ( - _build_geo_region_lookup, - _template_network_geography, -) +from ispypsa.templater.geography import _template_network_geography +from ispypsa.templater.helpers import _build_geo_region_lookup from ispypsa.templater.network_expansion import ( _extract_flow_path_costs_from_iasr, _extract_flow_path_options_from_iasr, @@ -252,6 +253,10 @@ def create_ispypsa_inputs_template( sub_regional_geography, ) + template["generators_existing_planned"] = _template_generators_existing_planned( + iasr_tables, regional_granularity, sub_regional_geography + ) + if regional_granularity == "sub_regions": template.update( template_custom_constraints_from_plexos( diff --git a/src/ispypsa/templater/existing_planned.py b/src/ispypsa/templater/existing_planned.py index 631c6152..6cad0807 100644 --- a/src/ispypsa/templater/existing_planned.py +++ b/src/ispypsa/templater/existing_planned.py @@ -1,45 +1,59 @@ """Splits the existing, committed, anticipated and additional (ECAA) technologies -summary into generator and storage tables. +summary into generator and storage tables, and builds the generator identity and +property columns. Both target tables — see schemas/generators_existing_planned.yaml and schemas/storage_existing_planned.yaml — are built from the single IASR existing_committed_anticipated_additional_generator_summary table, which already lists -one row per real generating/storage unit (DUID-level). This module currently -covers only the first step of building those two tables: splitting the summary into -its generator and storage rows and renaming the three carried-over spine columns -(name, power_station, technology) to their schema names. +one row per real generating/storage unit (DUID-level). TODO: finish templating storage. existing_committed_anticipated_additional_generator_summary: - IASR ID / DLT names Power Station Technology Type - BW01 Bayswater Steam Sub Critical - Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) + IASR ID / DLT names Power Station Technology Type REZ ID Sub-region Fuel type Fuel cost mapping + BW01 Bayswater Steam Sub Critical NA CNSW Coal Bayswater + Q8 Battery - 2h Q8 Battery Battery Storage... Q8 SQ - - generators_existing_planned (partial): - name power_station technology - BW01 Bayswater Steam Sub Critical + name power_station technology geo_id fuel_type fuel_price_mapping capacity + BW01 Bayswater Steam Sub Critical CNSW Coal Bayswater 660.0 - storage_existing_planned (partial): + storage_existing_planned (partial, identity only): name power_station technology Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) -There are two independent public orchestrators, one per output table, each: +Building generators_existing_planned: 1. Splits the summary's rows into generators and storage — see - _is_existing_planned_storage_row. Storage is identified first by Technology - Type, then by Power Station presence in phes_properties* table. A kind of - backwards validation makes sure that no PHES stations are incorrectly treated - as generators going forward. - 2. Renames the spine columns (_SUMMARY_COLUMN_RENAMES) to their schema names. - Every other summary column passes through unchanged at this early draft. - -Note: using 'phes_properties' as a short name for the IASR table with full name -'pumped_hydro_existing_committed_anticipated_additional_properties' here. + _is_existing_planned_storage_row. + 2. Renames the carried-over spine/identity columns to their schema names, derives + geo_id (REZ ID with Sub-region fallback — see helpers._set_geo_id) and relabels + it to ``regional_granularity`` (REZ-located rows stay untouched at every + granularity, matching new_entrants.py's convention — see + _relabel_geo_id_to_granularity). + 3. Merges in unit-level properties (mappings.py). Each generator's + ``name`` is resolved against a source table's own IASR ID column — exact + matches first, small typos fuzzy-corrected. Every existing/planned unit is + expected to resolve to a real row in each of these tables; an unresolved name raises. + 4. Merges in minimum_load: coal's Typical Lowest Band, then gas overlaid + (see _merge_minimum_load) — the only two technologies with published minimum + stable levels, so every other row is left NaN (expected). """ import logging import pandas as pd -from ispypsa.templater.helpers import _is_storage_row +from ispypsa.templater.helpers import ( + _apply_known_value_replacement, + _assert_table_valid, + _fuzzy_match_names, + _get_property_value_map, + _group_properties_by_source, + _is_storage_row, + _is_subregion_geo_id, + _map_geo_id_to_granularity, + _required_property_columns, + _set_geo_id, +) +from ispypsa.templater.mappings import _GENERATORS_EXISTING_PLANNED_PROPERTY_MAP # Source (IASR existing_committed_anticipated_additional_generator_summary) column # names → schema output column names. @@ -47,53 +61,115 @@ "IASR ID / DLT names": "name", "Power Station": "power_station", "Technology Type": "technology", + "Fuel type": "fuel_type", + "Fuel cost mapping": "fuel_price_mapping", } +# Explicit output order (schema order). +_GENERATOR_COLUMNS = [ + "name", + "power_station", + "technology", + "geo_id", + "fuel_type", + "fuel_price_mapping", + "capacity", + "vom", + "heat_rate", + "commissioning_date", + "closure_year", + "minimum_load", +] + +_COMMISSIONING_DATE_SCHEMA_FORMAT = "%d/%m/%Y" + +# minimum_load property table spec: +_COAL_MINIMUM_LOAD_PROPERTY = dict( + table="coal_minimum_stable_level", + key_col="IASR ID", + # OPINIONATED: see Open-ISP/ISPyPSA#142 + value_col="Minimum Stable Level (MW)_Typical Lowest Band", +) +_GAS_MINIMUM_LOAD_PROPERTY = dict( + table="gpg_min_stable_level_existing_generators", + key_col="IASR ID", + value_col="Min Stable Level (MW)", +) + # The PHES properties table keys Borumba by its short project name; the summary lists -# it under its full project name. +# it under its full project name. TODO: implement as a 'known_value_replacement' when +# storage property merge is implemented. _BORUMBA_FULL_NAME_MAP = {"Borumba": "QEJP - Borumba"} # Tumut 3 has a real pump/non-pump unit split that the summary and phes_properties # tables can't currently be reconciled on by name. _validate_phes_routing tolerates -# this as known unmatched as part of an interim simplification to treat all Tumut 3 -# units as generators. See Open-ISP/ISPyPSA#131 comment thread. +# this as known unmatched (rather than renaming units to assign as PHES) as part of +# an interim simplification to treat all Tumut 3 units as generators. +# See Open-ISP/ISPyPSA#131 comment thread. _KNOWN_UNMATCHED_PHES_STATIONS = {"Lower Tumut"} +# Case mismatch between maximum_capacity's IASR ID and the summary's: the 'safe' +# fuzzy-matching threshold (90) would miss (fuzz.ratio("KiataWF1", "KIATAWF1") == 50). +_MAXIMUM_CAPACITY_ID_TYPO_FIX = dict( + table_name="maximum_capacity_existing_committed_anticipated_additional_generators", + column="IASR ID", + replacements={"KiataWF1": "KIATAWF1"}, +) + # --- public orchestrators --- def _template_generators_existing_planned( iasr_tables: dict[str, pd.DataFrame], + regional_granularity: str, + sub_regional_geography: pd.DataFrame, ) -> pd.DataFrame: """Templates the existing and planned (ECAA) generators table from the IASR summary. - Currently just the generator/storage split and spine rename - skeleton/draft. - Args: iasr_tables: IASR tables; uses - existing_committed_anticipated_additional_generator_summary and - pumped_hydro_existing_committed_anticipated_additional_properties. - - I/O Example (spine columns shown; every other summary column passes through - unchanged): + existing_committed_anticipated_additional_generator_summary, + pumped_hydro_existing_committed_anticipated_additional_properties, plus + every table named in ``_GENERATORS_EXISTING_PLANNED_PROPERTY_MAP``, + coal_minimum_stable_level and gpg_min_stable_level_existing_generators. + regional_granularity: "sub_regions", "nem_regions", or "single_region". + sub_regional_geography: network_geography templated at "sub_regions" + granularity; columns used: 'geo_id', 'geo_type', 'region_id'. + + I/O Example (subset of columns; regional_granularity="sub_regions"): existing_committed_anticipated_additional_generator_summary: - IASR ID / DLT names Power Station Technology Type - BW01 Bayswater Steam Sub Critical - Q8 Battery - 2h Q8 Battery Battery Storage (2hrs storage) # storage, dropped + IASR ID / DLT names Power Station Technology Type REZ ID Sub-region + BW01 Bayswater Steam Sub Critical NA CNSW + + maximum_capacity_existing_committed_anticipated_additional_generators: + IASR ID Installed capacity (MW) Commissioning date + BW01 660.0 NaN returns: - name power_station technology - BW01 Bayswater Steam Sub Critical + name power_station geo_id capacity commissioning_date + BW01 Bayswater CNSW 660.0 NaN """ logging.info("Creating a template for existing and planned generators") summary = iasr_tables["existing_committed_anticipated_additional_generator_summary"] phes_properties = iasr_tables[ "pumped_hydro_existing_committed_anticipated_additional_properties" ] + is_storage = _is_existing_planned_storage_row(summary, phes_properties) - generators = summary[~is_storage].copy() - return generators.rename(columns=_SUMMARY_COLUMN_RENAMES) + generators = summary[~is_storage].copy().rename(columns=_SUMMARY_COLUMN_RENAMES) + generators = _set_geo_id(generators) + generators["geo_id"] = _map_geo_id_to_granularity( + generators["geo_id"], regional_granularity, sub_regional_geography + ) + generators = _merge_unit_keyed_properties( + generators, + _apply_known_value_replacement(iasr_tables, _MAXIMUM_CAPACITY_ID_TYPO_FIX), + _GENERATORS_EXISTING_PLANNED_PROPERTY_MAP, + ) + generators = _format_commissioning_date(generators) + generators = _merge_minimum_load(generators, iasr_tables) + return generators[_GENERATOR_COLUMNS] def _template_storage_existing_planned( @@ -101,7 +177,7 @@ def _template_storage_existing_planned( ) -> pd.DataFrame: """Templates the existing and planned (ECAA) storage table from the IASR summary. - Currently just the generator/storage split and spine rename — skeleton/draft. + Currently just the generator/storage split and spine rename — TODO add properties. Args: iasr_tables: IASR tables; uses @@ -129,7 +205,7 @@ def _template_storage_existing_planned( return storage.rename(columns=_SUMMARY_COLUMN_RENAMES) -# --- helpers --- +# --- generator/storage split --- def _is_existing_planned_storage_row( @@ -179,13 +255,27 @@ def _validate_phes_routing( misclassified as a generator. I/O Example: - summary: pd.DataFrame({"Power Station": ["Wivenhoe"]}) - phes_properties: pd.DataFrame({"Power Station": ["Wivenhoe"]}) + summary: + Power Station + Wivenhoe + QEJP - Borumba + Tarong + + phes_properties: + Power Station + Wivenhoe # matches + Borumba # matches after _BORUMBA_FULL_NAME_MAP + Lower Tumut # excused by _KNOWN_UNMATCHED_PHES_STATIONS + -> no error - phes_properties: pd.DataFrame({"Power Station": ["Some New Station"]}) - -> raises ValueError listing ["Some New Station"] + A "Some New Station" row in phes_properties instead raises: + ValueError: PHES properties station(s) not found in the summary: + ['Some New Station'] """ + if summary.empty: + return None + phes_stations = set( phes_properties["Power Station"].replace(_BORUMBA_FULL_NAME_MAP) ) @@ -195,3 +285,214 @@ def _validate_phes_routing( raise ValueError( f"PHES properties station(s) not found in the summary: {sorted(unmatched)}" ) + + +# --- property merges --- + + +def _merge_unit_keyed_properties( + generators: pd.DataFrame, + iasr_tables: dict[str, pd.DataFrame], + property_map: dict[str, dict], +) -> pd.DataFrame: + """Merges every property in ``property_map`` onto ``generators``, keyed on IASR ID = name. + + Groups properties by source (table, key_col) — see ``_group_properties_by_source`` + — so a table contributing several columns (e.g. maximum_capacity_... feeds + capacity and commissioning_date) is validated and key-resolved once. Each + generator's ``name`` is resolved against the property table's own 'key' column (see + ``_resolve_unit_keys``); the resolved series becomes the key on which property + values are mapped. + + I/O Example: + property_map (abbr.): + capacity: table="maximum_capacity_...", + key_col="IASR ID", + value_col="Installed capacity (MW)" + commissioning_date: table="maximum_capacity_...", + key_col="IASR ID", + value_col="Commissioning date" + heat_rate: table="heat_rates_...", + key_col="IASR ID", + value_col="Heat rate (GJ/MWh)" + + generators: + name power_station + BW01 Bayswater + HUNTER1 Hunter Power Station + + maximum_capacity_...: # one source, two properties -> resolved once + IASR ID Installed capacity (MW) Commissioning date + BW01 660.0 NaN + HUNTER1 375.0 2025-08-01 + + heat_rates_...: + IASR ID Heat rate (GJ/MWh) + BW01 10.05 + HUNTER1 10.93 + + returns (one new column per property_map key): + name power_station capacity commissioning_date heat_rate + BW01 Bayswater 660.0 NaN 10.05 + HUNTER1 Hunter Power Station 375.0 2025-08-01 10.93 + """ + if generators.empty: + # Make sure all expected columns still get added + return generators.assign( + **{new_col: pd.Series(dtype="object") for new_col in property_map} + ) + + generators = generators.copy() + for (table_name, key_col), props in _group_properties_by_source( + property_map + ).items(): + table = iasr_tables[table_name] + _assert_table_valid( + table, + table_name, + _required_property_columns(props), + f"{sorted(props.keys())}", + ) + resolved_keys = _resolve_unit_keys( + generators["name"], table[key_col], table_name + ) + for new_col, attrs in props.items(): + property_values = _get_property_value_map(table, attrs) + generators[new_col] = resolved_keys.map(property_values) + return generators + + +def _resolve_unit_keys( + names: pd.Series, table_keys: pd.Series, table_name: str +) -> pd.Series: + """Fuzzy-resolves ``names`` to ``table_keys``' strings; raises on any miss. + + Standardises small differences (e.g. a single typo'd character) between a + unit's ``name`` and the spelling used in a property table's 'key' column. + ``table_keys`` is a lookup pool, so its order is irrelevant; the result carries + one value per name, in ``names``' order, spelled as in ``table_keys``. + + Raises: + ValueError: if any unit has no plausible match (above a fuzz ratio threshold + of 90) — indicating that the table is likely missing a row for the unit. + + I/O Example: + names: pd.Series(["HUNTER1", "BW01", "SOMESTATION1"]) + table_keys: pd.Series(["SOMESTATIONl", "BW01", "HUNTER1"]) + table_name: "heat_rates_..." + + returns: pd.Series(["HUNTER1", "BW01", "SOMESTATIONl"]) + """ + resolved = _fuzzy_match_names( + names, + table_keys, + task_desc=f"merging existing/planned properties from '{table_name}'", + threshold=90, + ) + unmatched = resolved[~resolved.isin(table_keys)] + if not unmatched.empty: + raise ValueError( + f"'{table_name}' table missing a row for generator(s): {sorted(unmatched)}" + ) + return resolved + + +def _format_commissioning_date(generators: pd.DataFrame) -> pd.DataFrame: + """Reformats commissioning_date from the IASR's ISO string to the schema's %d/%m/%Y.""" + generators = generators.copy() + generators["commissioning_date"] = pd.to_datetime( + generators["commissioning_date"] + ).dt.strftime(_COMMISSIONING_DATE_SCHEMA_FORMAT) + return generators + + +def _merge_minimum_load( + generators: pd.DataFrame, iasr_tables: dict[str, pd.DataFrame] +) -> pd.DataFrame: + """Merges technology-specific minimum_load property for coal and gas generators. + + Coal and gas are the only technologies with published minimum stable levels, so + every other row is legitimately left NaN (schema nan_fill: 0.0 applies + downstream). Each is merged separately (see ``_merge_minimum_load_property``). + + I/O Example (coal value_col abbreviated, see _COAL_MINIMUM_LOAD_PROPERTY): + generators: + name technology + BW01 Steam Sub Critical + ANGAS1 Reciprocating engine + Q1G1 Large scale Solar PV + + coal_minimum_stable_level: + IASR ID Technology Type ..._Typical Lowest Band + BW01 Steam Sub Critical 260 + + gpg_min_stable_level_existing_generators: + IASR ID Technology Type Min Stable Level (MW) + ANGAS1 Reciprocating engine 3.0 + + returns (adds minimum_load): + name technology minimum_load + BW01 Steam Sub Critical 260.0 + ANGAS1 Reciprocating engine 3.0 + Q1G1 Large scale Solar PV NaN # neither coal nor gas + """ + if generators.empty: + return generators.assign(minimum_load=pd.Series(dtype="float64")) + + generators = generators.copy() + generators["minimum_load"] = float("nan") + generators = _merge_minimum_load_property( + generators, iasr_tables, _COAL_MINIMUM_LOAD_PROPERTY + ) + generators = _merge_minimum_load_property( + generators, iasr_tables, _GAS_MINIMUM_LOAD_PROPERTY + ) + return generators + + +def _merge_minimum_load_property( + generators: pd.DataFrame, + iasr_tables: dict[str, pd.DataFrame], + property_spec: dict, +) -> pd.DataFrame: + """Assigns minimum_load from one technology-specific table, bounded to its own technologies. + + Only generators whose ``technology`` appears in the table's own 'Technology Type' + column are fuzzy-matched and + + I/O Example (property_spec = _COAL_MINIMUM_LOAD_PROPERTY; value_col abbreviated, + see the constant for its real name): + generators: + name technology minimum_load + BW01 Steam Sub Critical NaN + ANGAS1 Reciprocating engine NaN + Q1G1 Large scale Solar PV NaN + + coal_minimum_stable_level: + IASR ID Technology Type ..._Typical Lowest Band + BW01 Steam Sub Critical 260 + ER01 Steam Sub Critical 182 + + returns: + name technology minimum_load + BW01 Steam Sub Critical 260.0 + ANGAS1 Reciprocating engine NaN # not a coal technology + Q1G1 Large scale Solar PV NaN # not a coal technology + """ + table = iasr_tables[property_spec["table"]] + _assert_table_valid( + table, + property_spec["table"], + _required_property_columns({"minimum_load": property_spec}) + | {"Technology Type"}, + "'minimum_load'", + ) + is_candidate = generators["technology"].isin(table["Technology Type"]) + resolved_keys = _resolve_unit_keys( + generators[is_candidate]["name"], + table[property_spec["key_col"]], + property_spec["table"], + ) + values = _get_property_value_map(table, property_spec) + generators.loc[is_candidate, "minimum_load"] = resolved_keys.map(values) + return generators diff --git a/src/ispypsa/templater/geography.py b/src/ispypsa/templater/geography.py index 13f807f2..676ac4f2 100644 --- a/src/ispypsa/templater/geography.py +++ b/src/ispypsa/templater/geography.py @@ -274,49 +274,3 @@ def _rez_rows_for_single_region( def _extract_subregion_id(series: pd.Series) -> pd.Series: """Extract subregion ID from 'Name (ID)' format, e.g. 'Northern Queensland (NQ)' -> 'NQ'.""" return series.str.extract(r"\(([A-Z]+)\)", expand=False) - - -def _build_geo_region_lookup(sub_regional_geography: pd.DataFrame) -> dict[str, str]: - """Maps every geo (sub-region, REZ, or NEM region) to its NEM region id. - - ``sub_regional_geography`` already lists both sub-regions and REZs against their - ``region_id``. NEM regions are added as identities so that geos which are - already regions — after granularity aggregation, or on new parallel corridors — - resolve to themselves. - - I/O Example: - sub_regional_geography: - geo_id geo_type region_id - NQ subregion QLD - CNSW subregion NSW - Q1 rez QLD - - returns: - {"NQ": "QLD", "CNSW": "NSW", "Q1": "QLD", "QLD": "QLD", "NSW": "NSW"} - """ - lookup = dict( - zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) - ) - for region in set(sub_regional_geography["region_id"]): - lookup[region] = region - return lookup - - -def _map_geo_id_to_granularity( - geo_id: pd.Series, regional_granularity: str, sub_regional_geography: pd.DataFrame -) -> pd.Series: - """Maps rez/sub-region geo_ids to their region_id ("nem_regions") or "NEM" ("single_region"). - - I/O Example: - geo_id: pd.Series(["CNSW", "SNW"]) - regional_granularity: "nem_regions" - sub_regional_geography: - geo_id geo_type region_id - CNSW subregion NSW - SNW subregion NSW - - returns: pd.Series(["NSW", "NSW"]) - """ - if regional_granularity == "single_region": - return pd.Series(_SINGLE_REGION_ID, index=geo_id.index) - return geo_id.map(_build_geo_region_lookup(sub_regional_geography)) diff --git a/src/ispypsa/templater/helpers.py b/src/ispypsa/templater/helpers.py index d9d85348..595ed31c 100644 --- a/src/ispypsa/templater/helpers.py +++ b/src/ispypsa/templater/helpers.py @@ -399,6 +399,268 @@ def _pick_location(row: pd.Series) -> str: return row["Sub-region"] +def _set_geo_id(df: pd.DataFrame) -> pd.DataFrame: + """Adds 'geo_id' column: REZ ID with Sub-region fallback (see ``_pick_location``).""" + df = df.copy() + df["geo_id"] = df.apply(_pick_location, axis=1) + return df + + +def _build_geo_region_lookup(sub_regional_geography: pd.DataFrame) -> dict[str, str]: + """Maps every geo (sub-region, REZ, or NEM region) to its NEM region id. + + ``sub_regional_geography`` already lists both sub-regions and REZs against their + ``region_id``. NEM regions are added as identities so that geos which are + already regions — after granularity aggregation, or on new parallel corridors — + resolve to themselves. + + I/O Example: + sub_regional_geography: + geo_id geo_type region_id + NQ subregion QLD + CNSW subregion NSW + Q1 rez QLD + + returns: + {"NQ": "QLD", "CNSW": "NSW", "Q1": "QLD", "QLD": "QLD", "NSW": "NSW"} + """ + lookup = dict( + zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) + ) + for region in set(sub_regional_geography["region_id"]): + lookup[region] = region + return lookup + + +def _map_geo_id_to_granularity( + geo_id: pd.Series, regional_granularity: str, sub_regional_geography: pd.DataFrame +) -> pd.Series: + """Maps sub-region geo_ids to their region_id ("nem_regions"), "NEM" ("single_region"), + or returns untouched; REZ geo_ids always return untouched. + + I/O Example: + geo_id: pd.Series(["CNSW", "SNW", "Q1"]) + + sub_regional_geography: + geo_id geo_type region_id + CNSW subregion NSW + SNW subregion NSW + Q1 rez QLD + + returns: + regional_granularity = "sub_regions": + pd.Series(["CNSW", "SNW", "Q1"]) + + regional_granularity = "nem_regions": + pd.Series(["NSW", "NSW", "Q1"]) + + regional_granularity = "single_region": + pd.Series(["NEM", "NEM", "Q1"]) + """ + # Deferred import to avoid a circular import: mappings.py imports from this + # module (_snakecase_string, old-format section) and this function needs + # mappings.py's _SINGLE_REGION_ID. + # TODO: if/when we move to fully new-format templater - move import + from ispypsa.templater.mappings import _SINGLE_REGION_ID + + geo_id = geo_id.copy() + is_subregion = _is_subregion_geo_id(geo_id, sub_regional_geography) + + if regional_granularity == "sub_regions": + return geo_id + if regional_granularity == "single_region": + return geo_id.where(~is_subregion, _SINGLE_REGION_ID) + if regional_granularity == "nem_regions": + # only map subregion geo_ids to their respective regions; REZs untouched + geo_id.loc[is_subregion] = geo_id[is_subregion].map( + _build_geo_region_lookup(sub_regional_geography) + ) + return geo_id + + +def _is_subregion_geo_id( + geo_id: pd.Series, sub_regional_geography: pd.DataFrame +) -> pd.Series: + """Boolean mask of ``geo_id`` values that are sub-region-located (not REZ). + + I/O Example: + geo_id: pd.Series(["CNSW", "Q1"]) + sub_regional_geography: + geo_id geo_type + CNSW subregion + Q1 rez + + returns: pd.Series([True, False]) + """ + geo_type_by_geo_id = sub_regional_geography.set_index("geo_id")["geo_type"] + return geo_id.map(geo_type_by_geo_id) == "subregion" + + +def _assert_table_valid( + table: pd.DataFrame, table_name: str, required_cols: set[str], merge_desc: str +) -> None: + """Asserts a source table has every required column and isn't empty. + + Shared precondition check for tables merged in the new-format templater modules — + guards against two silent-failure modes: a missing column producing a KeyError, and + an empty table merging to an all-NaN column with no warning. + + Args: + table: the source table to validate, e.g. ``iasr_tables["battery_properties"]``. + table_name: ``table``'s IASR table name, used to name it in error messages. + required_cols: every column the downstream merge reads from ``table``. + merge_desc: short description of what would be merged, named in the + empty-table error, e.g. ``"properties '['fom']'"`` or ``"'lcf_build'"``. + + Raises: + ValueError: if any of ``required_cols`` is missing from ``table``, or if + ``table`` has no rows. + + I/O Example: + table: + Technology Base value Extra Column + Wind 2.0 unused_info + + table_name: "fixed_opex_new_entrants" + required_cols: {"Technology", "Base value"} + merge_desc: "properties '['fom']'" + + # No ValueError raised: table has rows, both required columns present. + """ + missing_cols = required_cols - set(table.columns) + if missing_cols: + raise ValueError( + f"'{table_name}' table missing required columns: {sorted(missing_cols)}" + ) + if table.empty: + raise ValueError(f"'{table_name}' table is empty - cannot merge {merge_desc}") + + +def _apply_known_value_replacement( + iasr_tables: dict[str, pd.DataFrame], correction: dict +) -> dict[str, pd.DataFrame]: + """Returns ``iasr_tables`` with a known correction applied to one table's column. + + Shared shape for a small, explicitly declared fix (a documented typo or naming + mismatch) to a single column of a single source table. ``correction`` bundles the + fix's specifics (``table_name``, ``column``, ``replacements``). Returns a shallow + copy of ``iasr_tables`` with only that table replaced. + + Note: while fuzzy-matching is used to standardise names or other ID strings, + some typos/diffs are too 'big' to pass any safe fuzzy-match threshold (see + example below - fuzz.ratio("KiataWF1", "KIATAWF1") == 50). This function + explicitly handles those known instances where this is the case. + + I/O Example (correction = existing_planned._MAXIMUM_CAPACITY_ID_TYPO_FIX): + iasr_tables["maximum_capacity_..."]: + IASR ID Power Station Installed capacity (MW) + KiataWF1 Kiata Wind Farm 31.05 + BW01 Bayswater 660.0 + + correction: + table_name: "maximum_capacity_..." + column: "IASR ID" + replacements: {"KiataWF1": "KIATAWF1"} + + returns copy of iasr_tables with only that one table edited: + iasr_tables["maximum_capacity_..."]: + IASR ID Power Station Installed capacity (MW) + KIATAWF1 Kiata Wind Farm 31.05 + BW01 Bayswater 660.0 + """ + table_name = correction["table_name"] + corrected = iasr_tables[table_name].replace( + {correction["column"]: correction["replacements"]} + ) + return {**iasr_tables, table_name: corrected} + + +def _group_properties_by_source( + property_map: dict[str, dict], +) -> dict[tuple[str, str], dict]: + """Groups a property map's entries by their source (table, key_col). + + Shared by ``new_entrants._merge_properties`` and + ``existing_planned._merge_unit_keyed_properties`` so a table contributing several + properties (e.g. ``battery_properties`` feeds six) is validated and key-resolved + once per source, not once per property. + + I/O Example (abbreviated property_map entries): + property_map: { + "storage_hours": dict(table="battery_properties", + key_col="Technology", ...), + "efficiency_charge": dict(table="battery_properties", + key_col="Technology", ...), + "lifetime_technical": dict(table="lead_time_and_project_life", + key_col="Technology", ...), + } + + returns: { + ("battery_properties", "Technology"): { + "storage_hours": {...}, # each property's attrs, unchanged + "efficiency_charge": {...}, + }, + ("lead_time_and_project_life", "Technology"): { + "lifetime_technical": {...}, + }, + } + """ + groups = {} + for property_name, attrs in property_map.items(): + source_key = (attrs["table"], attrs["key_col"]) + groups.setdefault(source_key, {})[property_name] = attrs + return groups + + +def _required_property_columns(props: dict[str, dict]) -> set[str]: + """Returns every ``value_col``/``key_col`` named across a source's properties. + + The returned set of strings is primarily used to pass to ``_assert_table_valid`` + as the ``required_cols`` argument. + + I/O Example: + props: + fom: {table: fixed_opex_new_entrants, key_col: Technology, value_col: Base value} + vom: {table: variable_opex_new_entrants, key_col: Generator, value_col: Base value} + + returns: + {"Technology", "Generator", "Base value"} + """ + return {d[col] for col in ["value_col", "key_col"] for d in props.values()} + + +def _get_property_value_map( + table: pd.DataFrame, attrs: dict[str, str | float | bool] +) -> pd.Series: + """Returns one property's value, keyed by ``key_col`` and scaled. + + Numeric columns (the default) are coerced with ``pd.to_numeric`` before ``scale`` + is applied, raising on anything unparseable — a stray typo in the IASR table. A + map entry with ``numeric=False`` (e.g. a date string) skips both the coercion and + the scale. + + I/O Example: + table: + Technology Base value + Wind 2.0 + CCGT 5.0 + + attrs: {key_col: Technology, value_col: Base value, scale: 1000.0} + + returns (indexed by Technology): + Wind 2000.0 + CCGT 5000.0 + """ + value_map = table.set_index(attrs["key_col"])[attrs["value_col"]] + if attrs.get("numeric", True): + value_map = pd.to_numeric(value_map, errors="raise") * float( + attrs.get("scale", 1.0) + ) + # TODO: 'year' type cols become floats from this transform - leave for + # validator to type-correct or edit handling here? + return value_map + + def _is_battery_row( df: pd.DataFrame, col_to_check: str = "Technology Type" ) -> pd.Series: diff --git a/src/ispypsa/templater/mappings.py b/src/ispypsa/templater/mappings.py index 04722634..be1b8eb7 100644 --- a/src/ispypsa/templater/mappings.py +++ b/src/ispypsa/templater/mappings.py @@ -669,7 +669,7 @@ ``ispypsa.templater.new_entrants`` via ``_merge_properties``. `table`: IASR table name holding the named property (key) - `technology_col`: column in the IASR table that contains the 'technology' string. + `key_col`: column in the IASR table that contains the 'technology' string. This is the column used to merge on (after mapping to canonical values). `value_col`: column holding the value to merge in `scale`: amount by which to multiply the value (default 1.0), used for unit @@ -683,24 +683,24 @@ _COMMON_NEW_ENTRANT_PROPERTY_MAP = { "fom": dict( table="fixed_opex_new_entrants", - technology_col="Technology Type", + key_col="Technology Type", # NOTE: literal double ")" — parsed directly from the v7.5 IASR workbook value_col="Base value ($/kW/year))", scale=1000.0, ), "lifetime_technical": dict( table="lead_time_and_project_life", - technology_col="Technology", + key_col="Technology", value_col="Technical life (years)", ), "lifetime_economic": dict( table="lead_time_and_project_life", - technology_col="Technology", + key_col="Technology", value_col="Economic life (years)", ), "minimum_stable_level": dict( table="gpg_min_stable_level_new_entrants", - technology_col="Technology", + key_col="Technology", value_col="Min Stable Level (% of nameplate)", ), } @@ -709,12 +709,12 @@ **_COMMON_NEW_ENTRANT_PROPERTY_MAP, "vom": dict( table="variable_opex_new_entrants", - technology_col="Generator", + key_col="Generator", value_col="Base value", ), "heat_rate": dict( table="heat_rates_new_entrants", - technology_col="Technology", + key_col="Technology", value_col="Heat rate (GJ/MWh)", ), } @@ -722,32 +722,32 @@ _STORAGE_BATTERY_PROPERTY_MAP = { "storage_hours": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Energy capacity_Hours", ), "efficiency_charge": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Charge efficiency_%", ), "efficiency_discharge": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Discharge efficiency_%", ), "soc_max": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Allowable max state of charge_%", ), "soc_min": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Allowable min state of charge_%", ), "degradation_annual": dict( table="battery_properties", - technology_col="Technology", + key_col="Technology", value_col="Annual degradation_%", ), } @@ -755,12 +755,60 @@ _STORAGE_PHES_PROPERTY_MAP = { "storage_hours": dict( table="pumped_hydro_new_entrant_properties", - technology_col="Power Station / Technology", + key_col="Power Station / Technology", value_col="Storage capacity (hours)", ), "round_trip_efficiency": dict( table="pumped_hydro_new_entrant_properties", - technology_col="Power Station / Technology", + key_col="Power Station / Technology", value_col="Pumping efficiency (%)", ), } + +""" +Existing/planned (ECAA) generator property columns (keys) mapped to the IASR table and +column that contains their values. Consumed by +``ispypsa.templater.existing_planned`` via ``_merge_unit_keyed_properties``. + +Shaped like the new entrant maps above, but every entry here shares the same +``key_col`` (``IASR ID``) — each generator's ``name`` is resolved against it via +fuzzy matching (small typos only; see ``existing_planned._resolve_unit_keys``) +rather than the technology-level fuzzy grouping the new entrant maps need. + + `table`: IASR table name holding the named property (key) + `key_col`: column in the IASR table used as the merge key + `value_col`: column holding the value to merge in + `numeric`: whether the merged value should be coerced with ``pd.to_numeric`` + (catches a stray non-numeric typo in the source table). Defaults to True; + set False for non-numeric columns, e.g. commissioning_date. +""" + +_GENERATORS_EXISTING_PLANNED_PROPERTY_MAP = { + "capacity": dict( + table="maximum_capacity_existing_committed_anticipated_additional_generators", + key_col="IASR ID", + value_col="Installed capacity (MW)", + ), + "commissioning_date": dict( + table="maximum_capacity_existing_committed_anticipated_additional_generators", + key_col="IASR ID", + value_col="Commissioning date", + numeric=False, + ), + "vom": dict( + table="variable_opex_existing_committed_anticipated_additional_generators", + key_col="IASR ID", + # trailing "1," is a footnote marker in the v7.5 IASR workbook + value_col="Variable OPEX ($/MWh sent out)1,", + ), + "heat_rate": dict( + table="heat_rates_existing_committed_anticipated_additional_generators", + key_col="IASR ID", + value_col="Heat rate (GJ/MWh)", + ), + "closure_year": dict( + table="expected_closure_years", + key_col="IASR ID", + value_col="Expected Closure Year (Calendar year)", + ), +} diff --git a/src/ispypsa/templater/new_entrants.py b/src/ispypsa/templater/new_entrants.py index 78c15b85..b1300fb8 100644 --- a/src/ispypsa/templater/new_entrants.py +++ b/src/ispypsa/templater/new_entrants.py @@ -34,14 +34,20 @@ import pandas as pd -from ispypsa.templater.geography import _map_geo_id_to_granularity from ispypsa.templater.helpers import ( + _apply_known_value_replacement, + _assert_table_valid, _derive_phes_symmetric_efficiency, _fuzzy_map_to_allowed_values, + _get_property_value_map, + _group_properties_by_source, _is_battery_row, _is_pumped_hydro_row, _is_storage_row, - _pick_location, + _is_subregion_geo_id, + _map_geo_id_to_granularity, + _required_property_columns, + _set_geo_id, ) from ispypsa.templater.mappings import ( _COMMON_NEW_ENTRANT_PROPERTY_MAP, @@ -132,9 +138,14 @@ "technology": "Pumped Hydro (24hrs storage)", # its generic tech in new_entrants_summary } -_PHES_PROPERTY_KEY_RENAMES = { - _BOTN_CETHANA_DETAILS["full_name"]: _BOTN_CETHANA_DETAILS["name"] -} +# The pumped-hydro table is the lone table that keys BOTN by its full spelling +# (pumped_hydro_new_entrant_properties); every other table -- and BOTN's overridden +# 'technology' (see _override_botn_technology) -- uses the bare name. +_PHES_BOTN_KEY_FIX = dict( + table_name="pumped_hydro_new_entrant_properties", + column="Power Station / Technology", + replacements={_BOTN_CETHANA_DETAILS["full_name"]: _BOTN_CETHANA_DETAILS["name"]}, +) # Typo(?) in 'Regional build cost zone' for PHES rows in NSA subregion: see Open-ISP/ISPyPSA#131. _KNOWN_BUILD_COST_ZONE_TYPOS = { @@ -279,9 +290,9 @@ def _merge_properties( ) -> pd.DataFrame: """Merges every property in ``property_map`` onto ``new_entrants``. - Groups properties by their source (table, technology_col) — see - ``_group_by_source_key`` — so a table that contributes several properties (e.g. - ``battery_properties`` feeds six) is validated and fuzzy-matched against + Groups properties by their source (table, key_col) — see + ``_group_properties_by_source`` — so a table that contributes several properties + (e.g. ``battery_properties`` feeds six) is validated and fuzzy-matched against ``new_entrants``' 'technology' once per property map. I/O Example (property_map = _STORAGE_BATTERY_PROPERTY_MAP, abbreviated): @@ -294,7 +305,7 @@ def _merge_properties( NQ Battery - 2h Battery Storage (2hrs storage) 2.0 92.0 ... """ new_entrants = new_entrants.copy() - for (table_name, technology_col), props in _group_by_source_key( + for (table_name, key_col), props in _group_properties_by_source( property_map ).items(): table = iasr_tables[table_name] @@ -306,7 +317,7 @@ def _merge_properties( ) matched_technology = _fuzzy_map_to_allowed_values( new_entrants["technology"], - table[technology_col], + table[key_col], task_desc=f"merging new entrant properties from '{table_name}'", ) for new_col, attrs in props.items(): @@ -315,127 +326,6 @@ def _merge_properties( return new_entrants -def _group_by_source_key(property_map: dict[str, dict]) -> dict[tuple[str, str], dict]: - """Groups a property map's entries by their source (table, technology_col). - - I/O Example: - property_map: - storage_hours: - {table: battery_properties, technology_col: Technology, value_col: Energy capacity_Hours} - efficiency_charge: - {table: battery_properties, technology_col: Technology, value_col: Charge efficiency_%} - lifetime_technical: - {table: lead_time_and_project_life, technology_col: Technology, value_col: Technical life (years)} - - returns: - (battery_properties, Technology): { - storage_hours: { ... }, - efficiency_charge: { ... }, - } - (lead_time_and_project_life, Technology): { - lifetime_technical: { ... }, - } - where { ... } indicates contents remain unchanged from inputs. - """ - groups = {} - for property_name, attrs in property_map.items(): - source_key = (attrs["table"], attrs["technology_col"]) - groups.setdefault(source_key, {})[property_name] = attrs - return groups - - -def _required_property_columns(props: dict[str, dict]) -> set[str]: - """Returns every ``value_col``/``technology_col`` named across a source's properties. - - I/O Example: - props: - fom: {table: fixed_opex_new_entrants, technology_col: Technology, value_col: Base value} - vom: {table: variable_opex_new_entrants, technology_col: Generator, value_col: Base value} - - returns: - {"Technology", "Generator", "Base value"} - """ - return {d[col] for col in ["value_col", "technology_col"] for d in props.values()} - - -def _get_property_value_map( - table: pd.DataFrame, attrs: dict[str, str | float] -) -> pd.Series: - """Returns one property's value, keyed by technology and scaled. - - Raises: - ValueError: if ``value_col`` contains anything ``pd.to_numeric`` can't parse, - e.g. a stray typo in the IASR table. - - I/O Example: - table: - Technology Base value - Wind 2.0 - CCGT 5.0 - - attrs: {technology_col: Technology, value_col: Base value, scale: 1000.0} - - returns (indexed by Technology): - Wind 2000.0 - CCGT 5000.0 - """ - value_map = pd.to_numeric( - table.set_index(attrs["technology_col"])[attrs["value_col"]], errors="raise" - ) - value_map *= float(attrs.get("scale", 1.0)) - return value_map - - -def _assert_table_valid( - table: pd.DataFrame, table_name: str, required_cols: set[str], merge_desc: str -) -> None: - """Asserts a source table has every required column and isn't empty. - - Shared precondition check for every IASR table merged in this module — guards - against two silent-failure modes: a missing column producing a KeyError, and - an empty table merges to an all-NaN column with no warning. - - Args: - table: the source table to validate, e.g. ``iasr_tables["battery_properties"]``. - table_name: ``table``'s IASR table name, used to name it in error messages. - required_cols: every column the downstream merge reads from ``table``. - merge_desc: short description of what would be merged, named in the - empty-table error, e.g. ``"properties '['fom']'"`` or ``"'lcf_build'"``. - - Raises: - ValueError: if any of ``required_cols`` is missing from ``table``, or if - ``table`` has no rows. - - I/O Example: - table: - Technology Base value Extra Column - Wind 2.0 unused_info - - table_name: "fixed_opex_new_entrants" - required_cols: {"Technology", "Base value"} - merge_desc: "properties '['fom']'" - - # No ValueError raised: table has rows, both required columns present. - """ - missing_cols = required_cols - set(table.columns) - if missing_cols: - raise ValueError( - f"'{table_name}' table missing required columns: {sorted(missing_cols)}" - ) - if table.empty: - raise ValueError(f"'{table_name}' table is empty - cannot merge {merge_desc}") - - -def _set_geo_id(new_entrants: pd.DataFrame) -> pd.DataFrame: - """Adds 'geo_id' column to new_entrants containing REZ ID with Sub-region fallback. - - Applies ``_pick_location`` helper to each row of the new_entrants table to - set their 'geo_id'. Simple wrapper for readability. - """ - new_entrants["geo_id"] = new_entrants.apply(_pick_location, axis=1) - return new_entrants - - # --- regional granularity collapse --- @@ -499,15 +389,6 @@ def _collapse_geo_id_to_granularity( return pd.concat([unchanged, collapsed], ignore_index=True)[new_entrants.columns] -# NOTE: maybe move to helpers.py in future? -def _is_subregion_geo_id( - geo_id: pd.Series, sub_regional_geography: pd.DataFrame -) -> pd.Series: - """Boolean mask of ``geo_id`` values that are sub-region-located (not REZ).""" - geo_type_by_geo_id = sub_regional_geography.set_index("geo_id")["geo_type"] - return geo_id.map(geo_type_by_geo_id) == "subregion" - - def _aggregate_by_geo_id( new_entrants: pd.DataFrame, group_key_columns: list[str], @@ -723,36 +604,23 @@ def _merge_phes_properties( BOTN - Cethana's 'technology' is first overridden to its own name so it draws its own published property rows rather than the generic PHES archetype's (see ``_override_botn_technology``). The pumped-hydro table is the lone table that keys BOTN - by its full spelling, so its key is normalised to the bare name (see - ``_normalise_phes_botn_key``) before a plain technology-keyed merge. The table gives - storage_hours and a single round-trip efficiency directly; charge/discharge efficiency - are then derived from it (see ``_derive_phes_symmetric_efficiency``). The round-trip - column is dropped by the orchestrator's final select. + by its full spelling, so its key is corrected to the bare name (``_PHES_BOTN_KEY_FIX``) + before a plain technology-keyed merge. The table gives storage_hours and a single + round-trip efficiency directly; charge/discharge efficiency are then derived from it + (see ``_derive_phes_symmetric_efficiency``). The round-trip column is dropped by the + orchestrator's final select. """ phes = phes.copy() phes["technology"] = _override_botn_technology(phes) phes = _merge_properties( - phes, _normalise_phes_botn_key(iasr_tables), _STORAGE_PHES_PROPERTY_MAP + phes, + _apply_known_value_replacement(iasr_tables, _PHES_BOTN_KEY_FIX), + _STORAGE_PHES_PROPERTY_MAP, ) phes = _derive_phes_symmetric_efficiency(phes) return phes -def _normalise_phes_botn_key( - iasr_tables: dict[str, pd.DataFrame], -) -> dict[str, pd.DataFrame]: - """Returns ``iasr_tables`` with the pumped-hydro table's BOTN key set to the bare name. - - Renames the lone full-spelling BOTN key (see ``_PHES_PROPERTY_KEY_RENAMES``) in the - pumped-hydro table so it matches BOTN's overridden 'technology'. Returns a shallow copy - of the dict with only that table replaced — the shared ``iasr_tables`` is left untouched. - """ - table_name = "pumped_hydro_new_entrant_properties" - key_col = _STORAGE_PHES_PROPERTY_MAP["storage_hours"]["technology_col"] - normalised = iasr_tables[table_name].replace({key_col: _PHES_PROPERTY_KEY_RENAMES}) - return {**iasr_tables, table_name: normalised} - - def _override_botn_technology(phes: pd.DataFrame) -> pd.Series: """Returns PHES 'technology' with named project 'BOTN - Cethana' set to its own name. diff --git a/src/ispypsa/templater/transmission.py b/src/ispypsa/templater/transmission.py index f126337e..e7ac6eac 100644 --- a/src/ispypsa/templater/transmission.py +++ b/src/ispypsa/templater/transmission.py @@ -2,7 +2,7 @@ import pandas as pd -from ispypsa.templater.geography import _build_geo_region_lookup +from ispypsa.templater.helpers import _build_geo_region_lookup from ispypsa.templater.mappings import _CANONICAL_TIMESLICES, _SINGLE_REGION_ID _HVDC_PATH_IDS = {"NNSW-SQ_Terranora", "WNV-CSA_Murraylink", "TAS-SEV"} diff --git a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py index 32f94b7c..7e6440ac 100644 --- a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py +++ b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py @@ -311,6 +311,16 @@ def test_create_ispypsa_inputs_task_new_format( # REZ location (state-wide VRE/DER). See Open-ISP/ISPyPSA#133 _NON_REZ_PLACEHOLDER_GEO_IDS = {"N0", "V0"} +# Drift-detection only — no collapse step for existing/planned generators (unlike +# new entrant), so this is the same at every granularity. +_EXPECTED_GENERATORS_EXISTING_PLANNED_ROWS_75 = 531 + +# REZ sub-zone ids used by some existing/planned generators that don't appear in +# renewable_energy_zones (only their parent REZ does, e.g. "Q8" not "Q8a"/"Q8b"/ +# "Q8c"). Same gap class as _NON_REZ_PLACEHOLDER_GEO_IDS (#133), different cause. +# TODO: ADDRESS THIS +_MISSING_REZ_SUBZONE_GEO_IDS = {"Q8a", "Q8b", "Q8c"} + # Per-reference-year window patterns decoded from the shipped RefYear5000 # calendar and reference_year_sequence (drift-detection; # granularity-invariant). 14 distinct ids, not 15: TAS Hot Day never @@ -364,6 +374,7 @@ def test_create_ispypsa_inputs_new_format( costs_connection = pd.read_csv(output_dir / "costs_connection.csv") gens_new_entrant = pd.read_csv(output_dir / "generators_new_entrant.csv") storage_new_entrant = pd.read_csv(output_dir / "storage_new_entrant.csv") + gens_existing_planned = pd.read_csv(output_dir / "generators_existing_planned.csv") # network_geography — one row per (sub-)region or REZ; geo_ids are unique. assert len(geo) == _GEOS_PER_GRANULARITY_75[granularity] + _NUM_REZS_75 @@ -422,6 +433,16 @@ def test_create_ispypsa_inputs_new_format( assert storage_new_entrant["name"].is_unique assert set(storage_new_entrant["geo_id"]) <= set(geo["geo_id"]) + # generators_existing_planned — one row per existing/planned generating unit, + # no collapse step (unlike new entrant) so the row count doesn't vary by + # granularity. geo_ids are real network_geography entries, except the two + # pre-existing gaps noted above ("Non-REZ" placeholders and REZ sub-zones). + assert len(gens_existing_planned) == _EXPECTED_GENERATORS_EXISTING_PLANNED_ROWS_75 + assert gens_existing_planned["name"].is_unique + assert set(gens_existing_planned["geo_id"]) <= ( + set(geo["geo_id"]) | _NON_REZ_PLACEHOLDER_GEO_IDS | _MISSING_REZ_SUBZONE_GEO_IDS + ) + # costs_connection - every new entrant technology + geo_id + year has a row # geo_id's are real network_geography entries + _NON_REZ_PLACEHOLDER_GEO_IDS assert len(costs_connection) == _EXPECTED_COSTS_CONNECTION_ROWS_75[granularity] diff --git a/tests/test_templater/test_create_ispypsa_inputs_template.py b/tests/test_templater/test_create_ispypsa_inputs_template.py index 83cd636f..5d0bee8c 100644 --- a/tests/test_templater/test_create_ispypsa_inputs_template.py +++ b/tests/test_templater/test_create_ispypsa_inputs_template.py @@ -136,6 +136,63 @@ def _new_entrant_property_tables(csv_str_to_df) -> dict[str, pd.DataFrame]: } +# NOTE: temporary while existing/planned storage properties not yet wired into +# templater - input tables defined here for brevity until then. +def _existing_planned_tables(csv_str_to_df) -> dict[str, pd.DataFrame]: + """The ECAA summary plus its per-unit property tables, wiring-only fixture. + + BW01 (CNSW coal generator) and Q1G1 (Q1 REZ solar generator) prove the + generator/geo_id wiring at every granularity (CNSW collapses to NSW at + nem_regions/single_region; Q1 stays untouched, matching new entrant's REZ + fixtures above). Q8_BATT_2H proves the storage split still excludes storage + rows from generators_existing_planned's output. Detailed merge behaviour is + covered in test_existing_planned.py; here they just need to be present for + wiring to run. + """ + summary = csv_str_to_df(""" + IASR ID / DLT names, Power Station, Technology Type, REZ ID, Sub-region, Fuel type, Fuel cost mapping + BW01, Bayswater, Steam Sub Critical, Not Applicable, CNSW, Black Coal, Bayswater + Q1G1, Solar Farm, Large scale Solar PV, Q1, NQ, Solar, Solar Farm + SAMPLE_BATT, Sample Battery, Battery Storage (2hrs storage), Not Applicable, CNSW, Battery, Sample Battery + """) + return { + "existing_committed_anticipated_additional_generator_summary": summary, + "pumped_hydro_existing_committed_anticipated_additional_properties": csv_str_to_df( + "Power Station" + ), + "maximum_capacity_existing_committed_anticipated_additional_generators": csv_str_to_df(""" + IASR ID, Installed capacity (MW), Commissioning date + BW01, 660.0, + Q1G1, 100.0, 2028-12-01 + """), + # Built directly - the real column name's trailing "1," is a literal comma + "variable_opex_existing_committed_anticipated_additional_generators": pd.DataFrame( + { + "IASR ID": ["BW01", "Q1G1"], + "Variable OPEX ($/MWh sent out)1,": [8.0, 0.0], + } + ), + "heat_rates_existing_committed_anticipated_additional_generators": csv_str_to_df(""" + IASR ID, Heat rate (GJ/MWh) + BW01, 10.05 + Q1G1, 0.0 + """), + "expected_closure_years": csv_str_to_df(""" + IASR ID, Expected Closure Year (Calendar year) + BW01, 2033 + Q1G1, 2100 + """), + "coal_minimum_stable_level": csv_str_to_df(""" + IASR ID, Technology Type, Minimum Stable Level (MW)_Typical Lowest Band + BW01, Steam Sub Critical, 260.0 + """), + "gpg_min_stable_level_existing_generators": csv_str_to_df(""" + IASR ID, Technology Type, Min Stable Level (MW) + SOME_OTHER_GAS_UNIT, CCGT, 5.0 + """), + } + + def _stub_timeslice_calendar(csv_str_to_df) -> pd.DataFrame: """Minimal raw timeslice calendar: two windows that tile planning year FY2026 — a hot-day peak and a winter window that wraps back to it, so the @@ -373,6 +430,7 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): "efficient_level_of_system_strength_cost": efficient_level_of_system_strength_cost, "new_entrants_summary": new_entrants_summary, **_new_entrant_property_tables(csv_str_to_df), + **_existing_planned_tables(csv_str_to_df), }, # connection_capacity_non_vre is popped out of manually_extracted_tables # into iasr_tables by create_template; supplied so the @@ -485,6 +543,26 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): # BOTN - Cethana (Pumped Hydro), the only storage row in the fixture. assert len(storage_new_entrant) == 1 + # generators_existing_planned — BW01 (CNSW) and Q1G1 (Q1 REZ); SAMPLE_BATT + # is excluded (storage) + generators_existing_planned = result["generators_existing_planned"] + assert set(generators_existing_planned.columns) == { + "name", + "power_station", + "technology", + "geo_id", + "fuel_type", + "fuel_price_mapping", + "capacity", + "vom", + "heat_rate", + "commissioning_date", + "closure_year", + "minimum_load", + } + assert set(generators_existing_planned["geo_id"]) == {"CNSW", "Q1"} + assert len(generators_existing_planned) == 2 + # Custom-constraints tables are spliced into the output via # template.update(template_custom_constraints_from_plexos(...)). The # templater is mocked with _stub_custom_constraints_tables (full content is @@ -632,6 +710,7 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): "efficient_level_of_system_strength_cost": efficient_level_of_system_strength_cost, "new_entrants_summary": new_entrants_summary, **_new_entrant_property_tables(csv_str_to_df), + **_existing_planned_tables(csv_str_to_df), }, manually_extracted_tables={ "connection_capacity_non_vre": connection_capacity_non_vre, @@ -697,6 +776,11 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): storage_new_entrant = result["storage_new_entrant"] assert len(storage_new_entrant) == 3 + # generators_existing_planned — CNSW relabels to NSW; Q1 REZ stays untouched. + generators_existing_planned = result["generators_existing_planned"] + assert set(generators_existing_planned["geo_id"]) == {"NSW", "Q1"} + assert len(generators_existing_planned) == 2 + # Not templated at this granularity (see empty_custom_constraint_tables); # the mock turns a regression in that gate into a clean assertion failure # rather than a PLEXOS-extract disk read. @@ -812,6 +896,7 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): "efficient_level_of_system_strength_cost": efficient_level_of_system_strength_cost, "new_entrants_summary": new_entrants_summary, **_new_entrant_property_tables(csv_str_to_df), + **_existing_planned_tables(csv_str_to_df), }, manually_extracted_tables={ "connection_capacity_non_vre": connection_capacity_non_vre, @@ -875,6 +960,11 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): storage_new_entrant = result["storage_new_entrant"] assert len(storage_new_entrant) == 2 + # generators_existing_planned — CNSW relabels to NEM; Q1 REZ stays untouched. + generators_existing_planned = result["generators_existing_planned"] + assert set(generators_existing_planned["geo_id"]) == {"NEM", "Q1"} + assert len(generators_existing_planned) == 2 + # Not templated at this granularity (see empty_custom_constraint_tables); # the mock turns a regression in that gate into a clean assertion failure # rather than a PLEXOS-extract disk read. diff --git a/tests/test_templater/test_existing_planned.py b/tests/test_templater/test_existing_planned.py index a765995b..0b09237f 100644 --- a/tests/test_templater/test_existing_planned.py +++ b/tests/test_templater/test_existing_planned.py @@ -2,7 +2,11 @@ import pytest from ispypsa.templater.existing_planned import ( + _format_commissioning_date, _is_existing_planned_storage_row, + _merge_minimum_load, + _merge_unit_keyed_properties, + _resolve_unit_keys, _template_generators_existing_planned, _template_storage_existing_planned, _validate_phes_routing, @@ -30,7 +34,8 @@ def test_is_existing_planned_storage_row(csv_str_to_df): # Wivenhoe routes to storage by PHES-table presence despite being labelled plain # "Hydro"; Q8 Battery routes by technology; Tarong is neither; QEJP - Borumba # routes by technology AND is matched to Borumba in phes_properties. - assert list(result) == [True, False, True, True] + expected = pd.Series([True, False, True, True]) + pd.testing.assert_series_equal(result, expected) def test_is_existing_planned_storage_row_empty_summary(): @@ -39,7 +44,8 @@ def test_is_existing_planned_storage_row_empty_summary(): result = _is_existing_planned_storage_row(summary, phes_properties) - assert list(result) == [] + expected = pd.Series([], dtype=bool) + pd.testing.assert_series_equal(result, expected) def test_is_existing_planned_storage_row_empty_phes_properties(csv_str_to_df): @@ -53,17 +59,31 @@ def test_is_existing_planned_storage_row_empty_phes_properties(csv_str_to_df): result = _is_existing_planned_storage_row(summary, phes_properties) - assert list(result) == [False, True] + expected = pd.Series([False, True]) + pd.testing.assert_series_equal(result, expected) + + +def test_is_existing_planned_storage_row_empty_summary_with_phes_properties( + csv_str_to_df, +): + # An empty summary can't account for any PHES station, so routing validation + # raises rather than silently classifying nothing as storage. + summary = pd.DataFrame(columns=["Power Station", "Technology Type"]) + phes_properties = csv_str_to_df(""" + Power Station + Wivenhoe + """) + + result = _is_existing_planned_storage_row(summary, phes_properties) + expected = pd.Series([]) + + pd.testing.assert_series_equal(result, expected, check_dtype=False) # --- _validate_phes_routing --- def test_validate_phes_routing_tolerates_lower_tumut(csv_str_to_df): - # Tumut 3's pump/non-pump unit split means phes_properties' "Lower Tumut" never - # matches any Power Station name in the summary ("Tumut 3" covers all 6 units) - # -> known, no raise. - # Borumba<->QEJP - Borumba name difference gets mapped correctly -> no raise. summary = csv_str_to_df(""" Power Station, Technology Type Tumut 3, Hydro @@ -95,13 +115,346 @@ def test_validate_phes_routing_raises_on_unrecognised_station(csv_str_to_df): _validate_phes_routing(summary, phes_properties) -# --- _template_generators_existing_planned / _template_storage_existing_planned --- +# --- _resolve_unit_keys --- + + +def test_resolve_unit_keys(): + # A single-character typo in the table's key is close enough (threshold=90) to + # resolve -- the *table's* spelling is returned, but in `names` order. + names = pd.Series(["BW01", "BW02", "BAYSWATER01"]) + table_keys = pd.Series(["BW01", "bAYSWATER01", "BW02"]) + + result = _resolve_unit_keys(names, table_keys, "heat_rates_...") + + expected_result = pd.Series(["BW01", "BW02", "bAYSWATER01"]) + pd.testing.assert_series_equal(result, expected_result) + + +def test_resolve_unit_keys_raises_on_unmatched(): + names = pd.Series(["BW01", "UNKNOWN1"]) + table_keys = pd.Series(["BW01"]) + + with pytest.raises(ValueError, match=r"'heat_rates_\.\.\.'.*\['UNKNOWN1'\]"): + _resolve_unit_keys(names, table_keys, "heat_rates_...") + + +# --- _merge_unit_keyed_properties --- + + +def test_merge_unit_keyed_properties_single_table_multiple_columns(csv_str_to_df): + # capacity and commissioning_date both come from the same table - key-resolved once. + # Includes small typo fuzzy-match check (EXAMPLE_GEN <-> EXAMPLE_GEn) and non-numeric + # values (not coerced). + generators = csv_str_to_df(""" + name + BW01 + EXAMPLE_GEN + """) + maximum_capacity = csv_str_to_df(""" + IASR ID, Installed capacity (MW), Commissioning date + BW01, 660.0, 2028-12-01 + EXAMPLE_GEn, 100.0, + """) + property_map = { + "capacity": { + "table": "maximum_capacity", + "key_col": "IASR ID", + "value_col": "Installed capacity (MW)", + }, + "commissioning_date": { + "table": "maximum_capacity", + "key_col": "IASR ID", + "value_col": "Commissioning date", + "numeric": False, + }, + } + iasr_tables = {"maximum_capacity": maximum_capacity} + + result = _merge_unit_keyed_properties(generators, iasr_tables, property_map) + + expected_result = csv_str_to_df(""" + name, capacity, commissioning_date + BW01, 660.0, 2028-12-01 + EXAMPLE_GEN, 100.0, + """) + + pd.testing.assert_frame_equal(result, expected_result) + + +# --- _format_commissioning_date --- + + +def test_format_commissioning_date(csv_str_to_df): + generators = csv_str_to_df(""" + name, commissioning_date + BW01, 2028-12-01 + BW02, + """) + + result = _format_commissioning_date(generators) + + expected = csv_str_to_df(""" + name, commissioning_date + BW01, 01/12/2028 + BW02, + """) + pd.testing.assert_frame_equal(result, expected) + + +# --- _merge_minimum_load --- + + +def test_merge_minimum_load(csv_str_to_df): + generators = csv_str_to_df(""" + name, technology + BW01, Steam Sub Critical + ANGAS1, CCGT + Q1G1, Large scale Solar PV + """) + coal = csv_str_to_df(""" + IASR ID, Technology Type, Minimum Stable Level (MW)_Typical Lowest Band + BW01, Steam Sub Critical, 260.0 + """) + gas = csv_str_to_df(""" + IASR ID, Technology Type, Min Stable Level (MW) + ANGAS1, CCGT, 3.0 + """) + iasr_tables = { + "coal_minimum_stable_level": coal, + "gpg_min_stable_level_existing_generators": gas, + } + + result = _merge_minimum_load(generators, iasr_tables) + + # Q1G1 is neither coal nor gas - left NaN, nan_fill applied downstream. + expected = csv_str_to_df(""" + name, technology, minimum_load + BW01, Steam Sub Critical, 260.0 + ANGAS1, CCGT, 3.0 + Q1G1, Large scale Solar PV, + """) + pd.testing.assert_frame_equal(result, expected) + + +def test_merge_minimum_load_bounds_matching_by_technology(csv_str_to_df): + # The technology filter bounds the fuzzy-match candidate pool: BAYSWATER01 is + # coal-typed so its typo'd key in the coal table still resolves, while BW0l is + # not, so it never gets the chance to match BW01. + generators = csv_str_to_df(""" + name, technology + BAYSWATER01, Steam Sub Critical + BW0l, Large scale Solar PV + """) + coal = csv_str_to_df(""" + IASR ID, Technology Type, Minimum Stable Level (MW)_Typical Lowest Band + BAYSWATER0l, Steam Sub Critical, 260.0 + BW01, Steam Sub Critical, 182.0 + """) + # gas isn't relevant to this test's assertion, but needs a real row -- an empty + # table always raises regardless of whether it would even match anything. + gas = csv_str_to_df(""" + IASR ID, Technology Type, Min Stable Level (MW) + SOME_OTHER_GAS_UNIT, CCGT, 5.0 + """) + iasr_tables = { + "coal_minimum_stable_level": coal, + "gpg_min_stable_level_existing_generators": gas, + } + + result = _merge_minimum_load(generators, iasr_tables) + + expected = csv_str_to_df(""" + name, technology, minimum_load + BAYSWATER01, Steam Sub Critical, 260.0 + BW0l, Large scale Solar PV, + """) + pd.testing.assert_frame_equal(result, expected) + + +def test_merge_minimum_load_empty_generators(csv_str_to_df): + # Nothing to merge onto -- the coal/gas tables aren't even looked at, so an + # empty/invalid one doesn't matter here (mirrors _merge_unit_keyed_properties). + generators = pd.DataFrame(columns=["name", "technology"]) + iasr_tables = { + "coal_minimum_stable_level": pd.DataFrame( + columns=[ + "IASR ID", + "Technology Type", + "Minimum Stable Level (MW)_Typical Lowest Band", + ] + ), + "gpg_min_stable_level_existing_generators": pd.DataFrame( + columns=["IASR ID", "Technology Type", "Min Stable Level (MW)"] + ), + } + + result = _merge_minimum_load(generators, iasr_tables) + + expected = csv_str_to_df(""" + name, technology, minimum_load + """) + pd.testing.assert_frame_equal(result, expected, check_dtype=False) + + +@pytest.mark.parametrize( + "empty_table", + ["coal_minimum_stable_level", "gpg_min_stable_level_existing_generators"], +) +def test_merge_minimum_load_raises_on_empty_property_table(empty_table, csv_str_to_df): + # Both property tables are validated before merging, so an empty one raises + # whichever it is. Exact raise behaviour is covered by _assert_table_valid. + # Test to check that assertion is happening here + generators = csv_str_to_df(""" + name, technology + BW01, Steam Sub Critical + """) + iasr_tables = { + "coal_minimum_stable_level": csv_str_to_df(""" + IASR ID, Technology Type, Minimum Stable Level (MW)_Typical Lowest Band + BW01, Steam Sub Critical, 260.0 + """), + "gpg_min_stable_level_existing_generators": csv_str_to_df(""" + IASR ID, Technology Type, Min Stable Level (MW) + ANGAS1, CCGT, 3.0 + """), + } + iasr_tables[empty_table] = pd.DataFrame(columns=iasr_tables[empty_table].columns) + + with pytest.raises(ValueError, match=f"'{empty_table}' table is empty"): + _merge_minimum_load(generators, iasr_tables) + + +# --- _template_generators_existing_planned --- -def test_template_generators_and_storage_existing_planned(csv_str_to_df): - # Wiring check: the split routes each row to exactly one table, and the spine - # columns are renamed. Every other summary column is expected to pass through - # unchanged — not asserted row-by-row here since none are added/removed yet. +def test_template_generators_existing_planned(csv_str_to_df): + # Wiring only - the behaviour behind each column is covered by the per-helper + # tests above. Columns are compared in order: this is the only test that pins + # _GENERATOR_COLUMNS' schema ordering (elsewhere it's compared as a set). + summary = csv_str_to_df(""" + IASR ID / DLT names, Power Station, Technology Type, REZ ID, Sub-region, Fuel type, Fuel cost mapping + BW01, Bayswater, Steam Sub Critical, Not Applicable, CNSW, Black Coal, Bayswater + Q1G1, Solar Farm, Large scale Solar PV, Q1, SQ, Solar, Solar + """) + phes_properties = pd.DataFrame(columns=["Power Station"]) + maximum_capacity = csv_str_to_df(""" + IASR ID, Installed capacity (MW), Commissioning date + BW01, 660.0, + Q1G1, 100.0, 2028-12-01 + """) + variable_opex = pd.DataFrame( # literal comma + {"IASR ID": ["BW01", "Q1G1"], "Variable OPEX ($/MWh sent out)1,": [8.0, 0.0]} + ) + heat_rates = csv_str_to_df(""" + IASR ID, Heat rate (GJ/MWh) + BW01, 10.05 + Q1G1, 0.0 + """) + closure_years = csv_str_to_df(""" + IASR ID, Expected Closure Year (Calendar year) + BW01, 2033 + Q1G1, 2100 + """) + coal = csv_str_to_df(""" + IASR ID, Technology Type, Minimum Stable Level (MW)_Typical Lowest Band + BW01, Steam Sub Critical, 260.0 + """) + gas = csv_str_to_df(""" + IASR ID, Technology Type, Min Stable Level (MW) + ANGAS1, CCGT, 3.0 + """) # not used, but needs to be non-empty else table validation raises + iasr_tables = { + "existing_committed_anticipated_additional_generator_summary": summary, + "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, + "maximum_capacity_existing_committed_anticipated_additional_generators": maximum_capacity, + "variable_opex_existing_committed_anticipated_additional_generators": variable_opex, + "heat_rates_existing_committed_anticipated_additional_generators": heat_rates, + "expected_closure_years": closure_years, + "coal_minimum_stable_level": coal, + "gpg_min_stable_level_existing_generators": gas, + } + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + Q1, rez, QLD + """) + + result = _template_generators_existing_planned( + iasr_tables, "sub_regions", sub_regional_geography + ) + assert list(result.columns) == [ + "name", + "power_station", + "technology", + "geo_id", + "fuel_type", + "fuel_price_mapping", + "capacity", + "vom", + "heat_rate", + "commissioning_date", + "closure_year", + "minimum_load", + ] + assert len(result) == 2 + + +def test_template_generators_existing_planned_empty(csv_str_to_df): + columns = [ + "IASR ID / DLT names", + "Power Station", + "Technology Type", + "REZ ID", + "Sub-region", + "Fuel type", + "Fuel cost mapping", + ] + summary = pd.DataFrame(columns=columns) + phes_properties = pd.DataFrame(columns=["Power Station"]) + maximum_capacity = pd.DataFrame( + columns=["IASR ID", "Installed capacity (MW)", "Commissioning date"] + ) + variable_opex = pd.DataFrame( + columns=["IASR ID", "Variable OPEX ($/MWh sent out)1,"] + ) + heat_rates = pd.DataFrame(columns=["IASR ID", "Heat rate (GJ/MWh)"]) + closure_years = pd.DataFrame( + columns=["IASR ID", "Expected Closure Year (Calendar year)"] + ) + coal = pd.DataFrame( + columns=[ + "IASR ID", + "Technology Type", + "Minimum Stable Level (MW)_Typical Lowest Band", + ] + ) + gas = pd.DataFrame(columns=["IASR ID", "Technology Type", "Min Stable Level (MW)"]) + iasr_tables = { + "existing_committed_anticipated_additional_generator_summary": summary, + "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, + "maximum_capacity_existing_committed_anticipated_additional_generators": maximum_capacity, + "variable_opex_existing_committed_anticipated_additional_generators": variable_opex, + "heat_rates_existing_committed_anticipated_additional_generators": heat_rates, + "expected_closure_years": closure_years, + "coal_minimum_stable_level": coal, + "gpg_min_stable_level_existing_generators": gas, + } + sub_regional_geography = pd.DataFrame(columns=["geo_id", "geo_type", "region_id"]) + + result = _template_generators_existing_planned( + iasr_tables, "sub_regions", sub_regional_geography + ) + + expected = csv_str_to_df(""" + name, power_station, technology, geo_id, fuel_type, fuel_price_mapping, capacity, vom, heat_rate, commissioning_date, closure_year, minimum_load + """) + pd.testing.assert_frame_equal(result, expected, check_dtype=False) + + +# --- _template_storage_existing_planned --- + + +def test_template_storage_existing_planned(csv_str_to_df): summary = csv_str_to_df(""" IASR ID / DLT names, Power Station, Technology Type BW01, Bayswater, Steam Sub Critical @@ -117,25 +470,17 @@ def test_template_generators_and_storage_existing_planned(csv_str_to_df): "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, } - generators = _template_generators_existing_planned(iasr_tables) storage = _template_storage_existing_planned(iasr_tables) - expected_generators = csv_str_to_df(""" - name, power_station, technology - BW01, Bayswater, Steam Sub Critical - """) expected_storage = csv_str_to_df(""" name, power_station, technology WHOE1, Wivenhoe, Hydro Q8_BATT_2H, Q8 Battery, Battery Storage (2hrs storage) """) - pd.testing.assert_frame_equal( - generators.reset_index(drop=True), expected_generators - ) pd.testing.assert_frame_equal(storage.reset_index(drop=True), expected_storage) -def test_template_generators_and_storage_existing_planned_empty(csv_str_to_df): +def test_template_storage_existing_planned_empty(csv_str_to_df): summary = pd.DataFrame( columns=["IASR ID / DLT names", "Power Station", "Technology Type"] ) @@ -145,15 +490,9 @@ def test_template_generators_and_storage_existing_planned_empty(csv_str_to_df): "pumped_hydro_existing_committed_anticipated_additional_properties": phes_properties, } - generators = _template_generators_existing_planned(iasr_tables) storage = _template_storage_existing_planned(iasr_tables) - expected = csv_str_to_df(""" + expected_storage = csv_str_to_df(""" name, power_station, technology """) - pd.testing.assert_frame_equal( - generators.reset_index(drop=True), expected, check_dtype=False - ) - pd.testing.assert_frame_equal( - storage.reset_index(drop=True), expected, check_dtype=False - ) + pd.testing.assert_frame_equal(storage, expected_storage, check_dtype=False) diff --git a/tests/test_templater/test_geography.py b/tests/test_templater/test_geography.py index 9fcbb743..04d46506 100644 --- a/tests/test_templater/test_geography.py +++ b/tests/test_templater/test_geography.py @@ -2,41 +2,10 @@ from ispypsa.templater.geography import ( _extract_subregion_id, - _map_geo_id_to_granularity, _template_network_geography, ) -def test_map_geo_id_to_granularity_nem_regions(csv_str_to_df): - sub_regional_geography = csv_str_to_df(""" - geo_id, geo_type, region_id - CNSW, subregion, NSW - SNW, subregion, NSW - Q1, rez, QLD - """) - geo_id = pd.Series(["CNSW", "SNW", "Q1"]) - - result = _map_geo_id_to_granularity(geo_id, "nem_regions", sub_regional_geography) - - expected = pd.Series(["NSW", "NSW", "QLD"]) - pd.testing.assert_series_equal(result, expected) - - -def test_map_geo_id_to_granularity_single_region(csv_str_to_df): - # sub_regional_geography's content is irrelevant at "single_region" — every geo_id - # collapses to the constant "NEM" id without being looked up at all. - sub_regional_geography = csv_str_to_df(""" - geo_id, geo_type, region_id - CNSW, subregion, NSW - """) - geo_id = pd.Series(["CNSW", "Q1"]) - - result = _map_geo_id_to_granularity(geo_id, "single_region", sub_regional_geography) - - expected = pd.Series(["NEM", "NEM"]) - pd.testing.assert_series_equal(result, expected) - - def test_extract_subregion_id_with_comma_in_name(): series = pd.Series( ["Sydney, Newcastle, Wollongong (SNW)", "Northern Queensland (NQ)"] diff --git a/tests/test_templater/test_helpers.py b/tests/test_templater/test_helpers.py index 46b493b5..e8a576df 100644 --- a/tests/test_templater/test_helpers.py +++ b/tests/test_templater/test_helpers.py @@ -2,14 +2,23 @@ import pytest from ispypsa.templater.helpers import ( + _apply_known_value_replacement, + _assert_table_valid, + _build_geo_region_lookup, _derive_phes_symmetric_efficiency, + _get_property_value_map, + _group_properties_by_source, _is_battery_row, _is_pumped_hydro_row, _is_storage_row, + _is_subregion_geo_id, _looks_like_financial_year, _manual_remove_footnotes_from_generator_names, + _map_geo_id_to_granularity, _pick_location, + _required_property_columns, _rez_name_to_id_mapping, + _set_geo_id, _snakecase_string, _standardise_storage_capitalisation, _strip_all_text_after_numeric_value, @@ -473,3 +482,326 @@ def test_derive_phes_symmetric_efficiency(csv_str_to_df): NQ Pumped Hydro - 24h, 81.0, 90.0, 90.0 """) pd.testing.assert_frame_equal(result, expected, check_exact=False, rtol=1e-6) + + +# --- _set_geo_id --- + + +def test_set_geo_id(csv_str_to_df): + new_entrants = csv_str_to_df(""" + technology, REZ ID, Sub-region + Wind, N3, CNSW + OCGT (small GT), Not Applicable, NQ + """) + + result = _set_geo_id(new_entrants) + + expected = csv_str_to_df(""" + technology, REZ ID, Sub-region, geo_id + Wind, N3, CNSW, N3 + OCGT (small GT), Not Applicable, NQ, NQ + """) + pd.testing.assert_frame_equal(result, expected) + + +def test_set_geo_id_empty_input(csv_str_to_df): + new_entrants = pd.DataFrame(columns=["technology", "REZ ID", "Sub-region"]) + + result = _set_geo_id(new_entrants) + + expected = csv_str_to_df(""" + technology, REZ ID, Sub-region, geo_id + """) + pd.testing.assert_frame_equal(result, expected, check_dtype=False) + + +# --- _build_geo_region_lookup --- + + +def test_build_geo_region_lookup(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + NQ, subregion, QLD + CNSW, subregion, NSW + Q1, rez, QLD + """) + + result = _build_geo_region_lookup(sub_regional_geography) + + # sub-regions and REZs map to their region; regions map to themselves. + assert result == { + "NQ": "QLD", + "CNSW": "NSW", + "Q1": "QLD", + "QLD": "QLD", + "NSW": "NSW", + } + + +# --- _map_geo_id_to_granularity --- + + +def test_map_geo_id_to_granularity_sub_regions(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + SNW, subregion, NSW + Q1, rez, QLD + """) + geo_id = pd.Series(["CNSW", "SNW", "Q1"]) + + result = _map_geo_id_to_granularity(geo_id, "sub_regions", sub_regional_geography) + + expected = pd.Series(["CNSW", "SNW", "Q1"]) + pd.testing.assert_series_equal(result, expected) + + +def test_map_geo_id_to_granularity_nem_regions(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + SNW, subregion, NSW + Q1, rez, QLD + """) + geo_id = pd.Series(["CNSW", "SNW", "Q1"]) + + result = _map_geo_id_to_granularity(geo_id, "nem_regions", sub_regional_geography) + + expected = pd.Series(["NSW", "NSW", "Q1"]) + pd.testing.assert_series_equal(result, expected) + + +def test_map_geo_id_to_granularity_single_region(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + Q1, rez, QLD + """) + geo_id = pd.Series(["CNSW", "Q1"]) + + result = _map_geo_id_to_granularity(geo_id, "single_region", sub_regional_geography) + + expected = pd.Series(["NEM", "Q1"]) + pd.testing.assert_series_equal(result, expected) + + +# --- _is_subregion_geo_id --- + + +def test_is_subregion_geo_id(csv_str_to_df): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type + CNSW, subregion + Q1, rez + """) + geo_id = pd.Series(["CNSW", "Q1"]) + + result = _is_subregion_geo_id(geo_id, sub_regional_geography) + + expected = pd.Series([True, False]) + pd.testing.assert_series_equal(result, expected) + + +# --- _apply_known_value_replacement --- + + +def test_apply_known_value_replacement(csv_str_to_df): + maximum_capacity = csv_str_to_df(""" + IASR ID, Installed capacity (MW) + KiataWF1, 30.0 + BW01, 660.0 + """) + iasr_tables = { + "maximum_capacity": maximum_capacity, + "some_other_table": pd.DataFrame({"col": [1]}), + } + + correction = dict( + table_name="maximum_capacity", + column="IASR ID", + replacements={"KiataWF1": "KIATAWF1"}, + ) + result = _apply_known_value_replacement(iasr_tables, correction) + + expected = csv_str_to_df(""" + IASR ID, Installed capacity (MW) + KIATAWF1, 30.0 + BW01, 660.0 + """) + pd.testing.assert_frame_equal(result["maximum_capacity"], expected) + + # Other tables pass through untouched; input dict itself isn't mutated. + assert result["some_other_table"] is iasr_tables["some_other_table"] + unmutated = csv_str_to_df(""" + IASR ID, Installed capacity (MW) + KiataWF1, 30.0 + BW01, 660.0 + """) + pd.testing.assert_frame_equal(iasr_tables["maximum_capacity"], unmutated) + + +# --- _group_properties_by_source --- + + +def test_group_properties_by_source(): + # Two properties sharing a (table, key_col) source are grouped together, each + # keeping its original attrs dict unchanged; two properties from the same table + # but with different key_cols are independent. + property_map = { + "storage_hours": { + "table": "battery_properties", + "key_col": "Technology", + "value_col": "Energy capacity_Hours", + }, + "efficiency_charge": { + "table": "battery_properties", + "key_col": "Technology", + "value_col": "Charge efficiency_%", + }, + "lifetime_technical": { + "table": "lead_time_and_project_life", + "key_col": "Technology", + "value_col": "Technical life (years)", + }, + "different_key_col": { + "table": "lead_time_and_project_life", + "key_col": "Alternate Technology", + "value_col": "Test", + }, + } + + result = _group_properties_by_source(property_map) + + expected = { + ("battery_properties", "Technology"): { + "storage_hours": property_map["storage_hours"], + "efficiency_charge": property_map["efficiency_charge"], + }, + ("lead_time_and_project_life", "Technology"): { + "lifetime_technical": property_map["lifetime_technical"], + }, + ("lead_time_and_project_life", "Alternate Technology"): { + "different_key_col": property_map["different_key_col"] + }, + } + assert result == expected + + +# --- _required_property_columns --- + + +def test_required_property_columns(): + # Two properties sharing a source - both properties' value_col/key_col are + # collected into one set. + props = { + "storage_hours": { + "table": "battery_properties", + "key_col": "Technology", + "value_col": "Storage hours", + }, + "degradation_annual": { + "table": "battery_properties", + "key_col": "Technology", + "value_col": "Variable value", + }, + } + + result = _required_property_columns(props) + + assert result == {"Technology", "Storage hours", "Variable value"} + + +# --- _get_property_value_map --- + + +def test_get_property_value_map_numeric_with_scale(csv_str_to_df): + table = csv_str_to_df(""" + Technology, Base value + Wind, 2.0 + CCGT, 5.0 + """) + attrs = {"key_col": "Technology", "value_col": "Base value", "scale": 1000.0} + + result = _get_property_value_map(table, attrs) + + expected = pd.Series( + [2000.0, 5000.0], index=pd.Index(["Wind", "CCGT"], name="Technology") + ) + pd.testing.assert_series_equal(result, expected, check_names=False) + + +def test_get_property_value_map_numeric_false_skips_coercion_and_scale(csv_str_to_df): + # commissioning_date-style column: passed through as-is, no numeric coercion. + table = csv_str_to_df(""" + IASR ID, Commissioning date + BW01, 2028-12-01 + """) + attrs = {"key_col": "IASR ID", "value_col": "Commissioning date", "numeric": False} + + result = _get_property_value_map(table, attrs) + + expected = pd.Series(["2028-12-01"], index=pd.Index(["BW01"], name="IASR ID")) + pd.testing.assert_series_equal(result, expected, check_names=False) + + +def test_get_property_value_map_raises_on_typo(csv_str_to_df): + table = csv_str_to_df(""" + IASR ID, Heat rate (GJ/MWh) + BW01, not_a_number + """) + attrs = {"key_col": "IASR ID", "value_col": "Heat rate (GJ/MWh)"} + + with pytest.raises(ValueError, match=r'Unable to parse string "not_a_number"'): + _get_property_value_map(table, attrs) + + +# --- _assert_table_valid --- + + +def test_assert_table_valid_passes(csv_str_to_df): + # Table has both required columns and at least one row - no error raised. + table = csv_str_to_df(""" + Technology, Base value + Wind, 20.0 + """) + # should not raise + _assert_table_valid( + table, "fixed_opex_new_entrants", {"Technology", "Base value"}, "'fom'" + ) + + +def test_assert_table_valid_raises_missing_columns(csv_str_to_df): + # Table is missing a required column -> raise, naming the table and the column. + table = csv_str_to_df(""" + Technology, Base value + Wind, 20.0 + """) + + with pytest.raises( + ValueError, + match=r"'fixed_opex_new_entrants' table missing required columns: " + r"\['Storage hours'\]", + ): + _assert_table_valid( + table, + table_name="fixed_opex_new_entrants", + required_cols={"Technology", "Storage hours"}, + merge_desc="'fom'", + ) + + +def test_assert_table_valid_raises_empty_table(): + # Table has both required columns but no rows -> raise, naming what would + # have been merged. + table = pd.DataFrame(columns=["Technology", "Base value"]) + + with pytest.raises( + ValueError, + match=r"'fixed_opex_new_entrants' table is empty - cannot merge 'fom'", + ): + _assert_table_valid( + table, + table_name="fixed_opex_new_entrants", + required_cols={"Technology", "Base value"}, + merge_desc="'fom'", + ) diff --git a/tests/test_templater/test_new_entrants.py b/tests/test_templater/test_new_entrants.py index fc14b8b9..133cb46e 100644 --- a/tests/test_templater/test_new_entrants.py +++ b/tests/test_templater/test_new_entrants.py @@ -9,18 +9,13 @@ _add_resource_type, _assert_botn_technology_expected, _assert_build_cost_zone_matches_geo_id, - _assert_table_valid, _collapse_geo_id_to_granularity, - _group_by_source_key, _merge_lcf_build, _merge_lcf_om, _merge_phes_properties, _merge_properties, - _normalise_phes_botn_key, _override_botn_technology, - _required_property_columns, _reshape_technology_specific_lcfs, - _set_geo_id, _template_generators_new_entrant, _template_storage_new_entrant, ) @@ -171,127 +166,10 @@ def test_template_storage_new_entrant(csv_str_to_df): assert len(result) == 3 -# --- _required_property_columns --- - - -def test_required_property_columns(): - # Two properties sharing a source - both properties' value_col/technology_col - # are collected into one set. - props = { - "storage_hours": { - "table": "battery_properties", - "technology_col": "Technology", - "value_col": "Storage hours", - }, - "degradation_annual": { - "table": "battery_properties", - "technology_col": "Technology", - "value_col": "Variable value", - }, - } - - result = _required_property_columns(props) - - assert result == {"Technology", "Storage hours", "Variable value"} - - -# --- _assert_table_valid --- - - -def test_assert_table_valid_passes(csv_str_to_df): - # Table has both required columns and at least one row - no error raised. - table = csv_str_to_df(""" - Technology, Base value - Wind, 20.0 - """) - # should not raise - _assert_table_valid( - table, "fixed_opex_new_entrants", {"Technology", "Base value"}, "'fom'" - ) - - -def test_assert_table_valid_raises_missing_columns(csv_str_to_df): - # Table is missing a required column -> raise, naming the table and the column. - table = csv_str_to_df(""" - Technology, Base value - Wind, 20.0 - """) - - with pytest.raises( - ValueError, - match=r"'fixed_opex_new_entrants' table missing required columns: " - r"\['Storage hours'\]", - ): - _assert_table_valid( - table, - "fixed_opex_new_entrants", - {"Technology", "Storage hours"}, - "'fom'", - ) - - -def test_assert_table_valid_raises_empty_table(): - # Table has both required columns but no rows -> raise, naming what would - # have been merged. - table = pd.DataFrame(columns=["Technology", "Base value"]) - - with pytest.raises( - ValueError, - match=r"'fixed_opex_new_entrants' table is empty - cannot merge 'fom'", - ): - _assert_table_valid( - table, "fixed_opex_new_entrants", {"Technology", "Base value"}, "'fom'" - ) - - -# --- _group_by_source_key --- - - -def test_group_by_source_key(): - # Two properties sharing a (table, technology_col) source are grouped together, - # each keeping its original attrs dict unchanged; two properties from the same - # table but with different technology_cols are independent. - property_map = { - "storage_hours": { - "table": "battery_properties", - "technology_col": "Technology", - "value_col": "Energy capacity_Hours", - }, - "efficiency_charge": { - "table": "battery_properties", - "technology_col": "Technology", - "value_col": "Charge efficiency_%", - }, - "lifetime_technical": { - "table": "lead_time_and_project_life", - "technology_col": "Technology", - "value_col": "Technical life (years)", - }, - "different_tech_col": { - "table": "lead_time_and_project_life", - "technology_col": "Alternate Technology", - "value_col": "Test", - }, - } - - result = _group_by_source_key(property_map) - - expected = { - ("battery_properties", "Technology"): { - "storage_hours": property_map["storage_hours"], - "efficiency_charge": property_map["efficiency_charge"], - }, - ("lead_time_and_project_life", "Technology"): { - "lifetime_technical": property_map["lifetime_technical"], - }, - ("lead_time_and_project_life", "Alternate Technology"): { - "different_tech_col": property_map["different_tech_col"] - }, - } - assert result == expected - - # --- _merge_properties --- +# (_group_properties_by_source, _required_property_columns and +# _get_property_value_map are shared with existing_planned.py and now live in, and +# are tested in, helpers.py / test_helpers.py.) def test_merge_properties(csv_str_to_df, caplog): @@ -308,12 +186,12 @@ def test_merge_properties(csv_str_to_df, caplog): property_map = { "storage_hours": { "table": "battery_properties", - "technology_col": "Technology", + "key_col": "Technology", "value_col": "Energy capacity_Hours", }, "efficiency_charge": { "table": "battery_properties", - "technology_col": "Technology", + "key_col": "Technology", "value_col": "Charge efficiency_%", }, } @@ -353,7 +231,7 @@ def test_merge_properties_raises_on_invalid_source_table(csv_str_to_df): property_map = { "fom": { "table": "fixed_opex_new_entrants", - "technology_col": "Technology", + "key_col": "Technology", "value_col": "Base value", } } @@ -460,68 +338,10 @@ def test_merge_phes_properties_empty(csv_str_to_df): pd.testing.assert_frame_equal(result, expected, check_dtype=False) -# --- _normalise_phes_botn_key --- - - -def test_normalise_phes_botn_key(csv_str_to_df): - # The pumped-hydro table's full BOTN spelling is renamed to the bare name so it matches - # the overridden 'technology'; the shared iasr_tables dict is not mutated. - pumped_hydro = csv_str_to_df(""" - Power Station / Technology, Storage capacity (hours), Pumping efficiency (%) - Pumped Hydro (24hrs storage), 24, 76 - BOTN - Cethana - 20h, 20, 81 - """) - iasr_tables = {"pumped_hydro_new_entrant_properties": pumped_hydro} - before = pumped_hydro.copy() - - result = _normalise_phes_botn_key(iasr_tables) - - expected = csv_str_to_df(""" - Power Station / Technology, Storage capacity (hours), Pumping efficiency (%) - Pumped Hydro (24hrs storage), 24, 76 - BOTN - Cethana, 20, 81 - """) - pd.testing.assert_frame_equal( - result["pumped_hydro_new_entrant_properties"], expected - ) - # the shared dict's table is left untouched - pd.testing.assert_frame_equal( - iasr_tables["pumped_hydro_new_entrant_properties"], before - ) - - -# --- _set_geo_id --- - - -def test_set_geo_id(csv_str_to_df): - # Check that the wrapper adds 'geo_id' column, correctly applying ``_pick_location`` - # and not impacting existing columns. - new_entrants = csv_str_to_df(""" - technology, REZ ID, Sub-region - Wind, N3, CNSW - OCGT (small GT), Not Applicable, NQ - """) - - result = _set_geo_id(new_entrants) - - expected = csv_str_to_df(""" - technology, REZ ID, Sub-region, geo_id - Wind, N3, CNSW, N3 - OCGT (small GT), Not Applicable, NQ, NQ - """) - pd.testing.assert_frame_equal(result, expected) - - -def test_set_geo_id_empty_input(csv_str_to_df): - # Empty input still returns the added geo_id column - new_entrants = pd.DataFrame(columns=["technology", "REZ ID", "Sub-region"]) - - result = _set_geo_id(new_entrants) - - expected = csv_str_to_df(""" - technology, REZ ID, Sub-region, geo_id - """) - pd.testing.assert_frame_equal(result, expected, check_dtype=False) +# (BOTN's pumped-hydro key correction is now a plain _apply_known_value_replacement +# call -- see helpers.py / test_helpers.py for that mechanism's own tests. Its wiring +# here is covered incidentally by test_merge_phes_properties above, which already +# exercises a full-spelling BOTN row resolving correctly.) # --- _collapse_geo_id_to_granularity --- @@ -548,7 +368,12 @@ def test_collapse_geo_id_to_granularity_sub_regions_is_noop(csv_str_to_df): ["value"], ) - pd.testing.assert_frame_equal(result, new_entrants) + expected = csv_str_to_df(""" + name, technology, geo_id, value + CNSW OCGT Small, OCGT, CNSW, 104.0 + Q1_WH, Wind, Q1, 999.0 + """) + pd.testing.assert_frame_equal(result, expected) def test_collapse_geo_id_to_granularity_averages_across_sub_regions(csv_str_to_df): @@ -642,7 +467,10 @@ def test_collapse_geo_id_to_granularity_empty_input(csv_str_to_df): ["value"], ) - pd.testing.assert_frame_equal(result, new_entrants) + expected = csv_str_to_df(""" + name, technology, geo_id, value + """) + pd.testing.assert_frame_equal(result, expected) # --- _add_resource_type (generator-specific) --- From 1febb23d4d1b7c12a3915259be9691fefc0076ca Mon Sep 17 00:00:00 2001 From: EllieKallmier <61219730+EllieKallmier@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:40:49 +1000 Subject: [PATCH 3/4] add comments for context on fix items to come --- src/ispypsa/templater/new_entrants.py | 3 +++ tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ispypsa/templater/new_entrants.py b/src/ispypsa/templater/new_entrants.py index b1300fb8..90d41721 100644 --- a/src/ispypsa/templater/new_entrants.py +++ b/src/ispypsa/templater/new_entrants.py @@ -401,6 +401,9 @@ def _aggregate_by_geo_id( )[value_columns].mean() +# TODO (coming in next PR): fix this to keep naming convention from AEMO sources even when +# granularity collapses. NOTE: IASR names have slightly different order/ +# convention than trace names, but for VRE (REZ-based) so less important here. def _name_collapsed_rows(collapsed: pd.DataFrame) -> pd.DataFrame: """Sets 'name' on merged rows to "{geo_id} {technology}". diff --git a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py index 7e6440ac..4dfbfa3a 100644 --- a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py +++ b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py @@ -318,7 +318,7 @@ def test_create_ispypsa_inputs_task_new_format( # REZ sub-zone ids used by some existing/planned generators that don't appear in # renewable_energy_zones (only their parent REZ does, e.g. "Q8" not "Q8a"/"Q8b"/ # "Q8c"). Same gap class as _NON_REZ_PLACEHOLDER_GEO_IDS (#133), different cause. -# TODO: ADDRESS THIS +# NOTE: placeholder fix for now - will be properly addressed in future PR (next up) _MISSING_REZ_SUBZONE_GEO_IDS = {"Q8a", "Q8b", "Q8c"} # Per-reference-year window patterns decoded from the shipped RefYear5000 From 48ca299ecefe29e56266735d607641b4b7bdb8c3 Mon Sep 17 00:00:00 2001 From: EllieKallmier <61219730+EllieKallmier@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:52:06 +1000 Subject: [PATCH 4/4] add generators_existing_planned output table to expected list --- src/ispypsa/templater/create_template.py | 1 + src/ispypsa/templater/helpers.py | 3 ++- tests/test_templater/test_helpers.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index 4d6f4602..aa8f991b 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -99,6 +99,7 @@ "network_transmission_path_expansion_costs", "timeslices", "costs_connection", + "generators_existing_planned", "generators_new_entrant", "storage_new_entrant", "custom_constraints", diff --git a/src/ispypsa/templater/helpers.py b/src/ispypsa/templater/helpers.py index 595ed31c..d95debd4 100644 --- a/src/ispypsa/templater/helpers.py +++ b/src/ispypsa/templater/helpers.py @@ -475,7 +475,8 @@ def _map_geo_id_to_granularity( geo_id.loc[is_subregion] = geo_id[is_subregion].map( _build_geo_region_lookup(sub_regional_geography) ) - return geo_id + return geo_id + raise ValueError(f"Unknown regional_granularity: {regional_granularity!r}") def _is_subregion_geo_id( diff --git a/tests/test_templater/test_helpers.py b/tests/test_templater/test_helpers.py index e8a576df..feebcb99 100644 --- a/tests/test_templater/test_helpers.py +++ b/tests/test_templater/test_helpers.py @@ -585,6 +585,20 @@ def test_map_geo_id_to_granularity_single_region(csv_str_to_df): pd.testing.assert_series_equal(result, expected) +def test_map_geo_id_to_granularity_raise_unknown_granularity(csv_str_to_df, caplog): + sub_regional_geography = csv_str_to_df(""" + geo_id, geo_type, region_id + CNSW, subregion, NSW + Q1, rez, QLD + """) + geo_id = pd.Series(["CNSW", "Q1"]) + + with pytest.raises( + ValueError, match=r"Unknown regional_granularity: 'solar_system'" + ): + _map_geo_id_to_granularity(geo_id, "solar_system", sub_regional_geography) + + # --- _is_subregion_geo_id ---