Skip to content

[RAO] Create CRAC from API #1162

@bqth29

Description

@bqth29

Describe the current behavior

Only way to use a CRAC is to import it from a JSON file

Describe the expected behavior

Allow the user to create a CRAC using the python API

Describe the motivation

No response

Extra Information

class Crac:

   ...

   # Adders

    def add_instant(self, _id: str, instant_kind: Literal["preventive", "outage", "auto", "curative"]):
        # TODO
        pass

    def add_remedial_action_usage_rule(self, instant_id: str, max_remedial_actions: Optional[int] = None, max_tsos: Optional[int] = None, max_topological_actions_per_tso: Optional[Dict[str, int]] = None, max_psts_per_tso: Optional[Dict[str, int]] = None, max_remedial_actions_per_tso: Optional[Dict[str, int]] = None, max_elementary_actions_per_tso: Optional[Dict[str, int]] = None):
        # TODO
        pass

    def add_contingency(self, _id: str, *network_elements_ids: str):
        # TODO
        pass

    def add_flow_cnec(self, _id: str, network_element_id: str, instant_id: str, name: Optional[str] = None, operator: Optional[str] = None, border: Optional[str] = None, contingency_id: Optional[str] = None, optimized: bool = True, monitored: bool = False, reliability_margin: Optional[float | int] = None):
        # TODO
        pass

    def add_angle_cnec(self, _id: str, exporting_network_element_id: str, importing_network_element_id: str, instant_id: str, name: Optional[str] = None, operator: Optional[str] = None, border: Optional[str] = None, contingency_id: Optional[str] = None, optimized: bool = True, monitored: bool = False, reliability_margin: Optional[float | int] = None):
        # TODO
        pass
    
    def add_voltage_cnec(self, _id: str, network_element_id: str, instant_id: str, name: Optional[str] = None, operator: Optional[str] = None, border: Optional[str] = None, contingency_id: Optional[str] = None, optimized: bool = True, monitored: bool = False, reliability_margin: Optional[float | int] = None):
        # TODO
        pass

    def add_network_action(self, _id: str, name: Optional[str] = None, operator: Optional[str] = None, speed: Optional[int] = None, activation_cost: Optional[float | int] = None):
        # TODO
        pass
    
    def add_threshold(self, cnec_id: str, unit: Literal["megawatt", "ampere", "percent_i_max", "degree", "kilovolt"], lower_bound: Optional[float | int] = None, upper_bound: Optional[float | int] = None, side: Optional[Literal["one", "two"]] = None):
        # TODO
        pass

    def add_terminal_connection_action(self, network_action_id: str, terminal_id: str, action_type: Literal["open", "close"]):
        # TODO
        pass

    def add_phase_tap_changer_tap_position_action(self, network_action_id: str, phase_tap_changer_id: str, tap_position: int):
        # TODO
        pass

    def add_generator_action(self, network_action_id: str, generator_id: str, active_power_value: float):
        # TODO
        pass

    def add_load_action(self, network_action_id: str, load_id: str, active_power_value: float):
        # TODO
        pass

    def add_dangling_line_action(self, network_action_id: str, dangling_line_id: str, active_power_value: float):
        # TODO
        pass

    def add_shunt_compensator_position_action(self, network_action_id: str, shunt_compensator_id: str, section_count: int):
        # TODO
        pass

    def add_switch_action(self, network_action_id: str, switch_id: str, action_type: Literal["open", "close"]):
        # TODO
        pass

    def add_switch_pair(self, network_action_id: str, switch_to_open_id: str, switch_to_close_id: str):
        # TODO
        pass

    def add_pst_range_action(self, _id: str, network_element_id: str, name: Optional[str] = None, operator: Optional[str] = None, speed: Optional[int] = None, activation_cost: Optional[float | int] = None, upward_variation_cost: Optional[float | int] = None, downward_variation_cost: Optional[float | int] = None, group_id: Optional[str] = None):
        # TODO
        pass

    def add_hvdc_range_action(self, _id: str, network_element_id: str, name: Optional[str] = None, operator: Optional[str] = None, speed: Optional[int] = None, activation_cost: Optional[float | int] = None, upward_variation_cost: Optional[float | int] = None, downward_variation_cost: Optional[float | int] = None, group_id: Optional[str] = None):
        # TODO
        pass

    def add_injection_range_action(self, _id: str, network_elements_and_keys: Dict[str, float | int], name: Optional[str] = None, operator: Optional[str] = None, speed: Optional[int] = None, activation_cost: Optional[float | int] = None, upward_variation_cost: Optional[float | int] = None, downward_variation_cost: Optional[float | int] = None, group_id: Optional[str] = None):
        # TODO
        pass

    def add_counter_trade_range_action(self, _id: str, exporting_country: str, importing_country: str, name: Optional[str] = None, operator: Optional[str] = None, speed: Optional[int] = None, activation_cost: Optional[float | int] = None, upward_variation_cost: Optional[float | int] = None, downward_variation_cost: Optional[float | int] = None, group_id: Optional[str] = None):
        # TODO
        pass

    def add_range(self, range_action_id: str, lower_bound: Optional[float | int] = None, upper_bound: Optional[float | int] = None, range_type: Literal["absolute", "relative_to_previous_instant", "relative_to_initial_network", "relative_to_previous_time_step"] = "absolute"):
        # TODO
        pass

    def add_on_instant_usage_rule(self, remedial_action_id: str, instant_id: str):
        # TODO
        pass

    def add_on_contingency_state_usage_rule(self, remedial_action_id: str, instant_id: str, contingency_id: str):
        # TODO
        pass

    def add_on_constraint_usage_rule(self, remedial_action_id: str, instant_id: str, cnec_id: str):
        # TODO
        pass

    def add_on_flow_constraint_in_country_usage_rule(self, remedial_action_id: str, instant_id: str, country: str, contingency_id: Optional[str] = None):
        # TODO
        pass

Metadata

Metadata

Assignees

No one assigned

    Labels

    Release 09/2026raoThis issue or PR relates to the Python API of OpenRAO

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions