Sienna → PLEXOS
This content is for v2.2.0. Switch to the latest version for up-to-date documentation.
Cloning the necessary packages for each translation is important.
uv sync --upgradeuv add --editable /path/to/r2x-siennauv add --editable /path/to/r2x-plexosExample Script
Section titled “Example Script”import jsonfrom importlib.resources import filesfrom pathlib import Pathfrom typing import cast
from infrasys.time_series_manager import TimeSeriesManagerfrom infrasys.time_series_models import TimeSeriesStorageTypefrom infrasys.utils.sqlite import create_in_memory_dbfrom loguru import loggerfrom r2x_plexos import PLEXOSConfigfrom r2x_plexos.exporter import PLEXOSExporterfrom r2x_sienna.parser import SiennaParserfrom r2x_sienna.plugin_config import SiennaConfigfrom r2x_sienna_to_plexos.plugin_config import SiennaToPlexosConfigfrom r2x_sienna_to_plexos.getters_utils import ( ensure_battery_node_memberships, ensure_generator_node_memberships, ensure_generator_time_series, ensure_head_storage_generator_membership, ensure_interface_line_memberships, ensure_line_node_memberships, ensure_pumped_hydro_storages_created, ensure_reference_node_memberships, ensure_region_node_memberships, ensure_reserve_battery_memberships, ensure_reserve_generator_memberships, ensure_tail_storage_generator_membership, ensure_transformer_node_memberships,)
from r2x_core import PluginContext, Rule, System, apply_rules_to_contextfrom r2x_core.logger import setup_loggingfrom r2x_core.store import DataStore
setup_logging(verbosity=1)
base_path = Path("/path/to/sienna-to-plexos")sys_name = "EI_PCM_2023_2012"sys_folder = base_path / sys_name
# =====================================# Sienna PARSER# =====================================model_year=2023weather_year=2012json_path = sys_folder / f"{sys_name}.json"sienna_config = SiennaConfig( json_path=str(json_path), model_year=model_year, system_name=sys_name, skip_validation=True, models=("r2x_sienna.models", "r2x_plexos.models", "r2x_sienna_to_plexos.getters"), )store = DataStore.from_data_files([], path=json_path.parent)context = PluginContext( config=sienna_config, store=store, skip_validation=True)parser = cast(SiennaParser, SiennaParser.from_context(context))sienna_sys = parser.run()sienna_sys = sienna_sys.systemcontext.source_system = sienna_sys
# =====================================# Define Time Series Storage# =====================================tmp_dir = sienna_sys.get_time_series_directory()
sienna_sys.convert_storage( time_series_directory=tmp_dir, time_series_storage_type=TimeSeriesStorageType.ARROW, permanent=True,)
# =====================================# Rules Definition# =====================================rules_path = files("r2x_sienna_to_plexos.config") / "rules.json"rules = Rule.from_records(json.loads(rules_path.read_text()))context.rules = rules
# =====================================# Sienna to PLEXOS (TRANSLATION)# =====================================context.config = SiennaToPlexosConfig(hydro_budget_ts="monthly")
connection = create_in_memory_db()ts_manager = TimeSeriesManager( connection, time_series_directory=tmp_dir, time_series_storage_type=TimeSeriesStorageType.ARROW, permanent=True)
plexos_sys = System( name="PLEXOS", auto_add_composed_components=True, time_series_manager=ts_manager)context.target_system = plexos_sys
apply_rules_to_context(context)ensure_generator_time_series(context)ensure_region_node_memberships(context)ensure_reference_node_memberships(context)ensure_generator_node_memberships(context)ensure_battery_node_memberships(context)ensure_reserve_battery_memberships(context)ensure_reserve_generator_memberships(context)ensure_transformer_node_memberships(context)ensure_line_node_memberships(context)ensure_interface_line_memberships(context)ensure_head_storage_generator_membership(context)ensure_tail_storage_generator_membership(context)ensure_pumped_hydro_storages_created(context)
# =====================================# PLEXOS Exporter# =====================================results_dir = base_path / f"{sys_name}_results"results_dir.mkdir(exist_ok=True)plexos_config = PLEXOSConfig( model_name=sys_name, timeseries_dir=str(results_dir), horizon_year=model_year)exporter_context = PluginContext( config=plexos_config, system=plexos_sys)
exporter = PLEXOSExporter.from_context(exporter_context)exporter.output_path = results_direxporter.solve_year = model_yearexporter.weather_year = weather_year
exporter.on_export()To export hydro budgets as monthly profiles instead of the default weekly aggregation,
set context.config = SiennaToPlexosConfig(hydro_budget_ts="monthly") before calling
ensure_generator_time_series(context).