Hydraulic Couplings

Hydraulic couplings are used to model multiple reservoirs connected to the same hydraulic system.

There are 5 different hydraulic couplings, 3 who are connected to a plant, and 2 who are not connected to a plant.

Notebook with examples.

Overview

../../../_images/overview.excalidraw.png

Station joined couplings

100

Each reservoir is connected to their own “virtual” power plant.

  • Station controlled discharge

  • No flow between reservoirs

  • Power plants connected to coupling

  • Each power plant can have their own PQ-curves local discharge energy equivalents.

  • Only 1 “virtual” power plant is allowed to be active at each time step.

../../../_images/100.excalidraw.png

Example:

{
    "hydraulic_couplings": [
        {
            "name": "coupling_100"
        }
    ]
}
JSON model
{
    "$schema": "https://gitlab.sintef.no/energy/ltm/pyltmapi/-/raw/main/model.schema.json",
    "model": {
        "global_settings": {
            "name": "global_settings",
            "output_path": "testout_couplings_100/",
            "delete_output_dir": false,
            "generate_output_dir": true,
            "allow_validation_failures": false,
            "simulation_period": {
                "timestamps": [
                    "2023-01-02T00:00:00Z",
                    "2025-12-29T00:00:00Z"
                ]
            },
            "historical_period": {
                "timestamps": [
                    "2000-01-01T00:00:00Z",
                    "2008-01-01T00:00:00Z"
                ]
            },
            "timesteps_per_week": 168,
            "default_spill_cost": 0.01,
            "default_load_penalty": 900.0,
            "currency_unit": "EUR",
            "energy_unit": "MWh"
        },
        "dclines": [
            {
                "#comment": "",
                "name": "DC",
                "forward_capacity": {
                    "scenarios": [
                        [
                            1000
                        ]
                    ]
                },
                "backward_capacity": {
                    "scenarios": [
                        [
                            1000
                        ]
                    ]
                },
                "loss_percentage": 2.0,
                "forward_cost": 2.0,
                "backward_cost": 1.0
            }
        ],
        "market_steps": [
            {
                "name": "market_step",
                "price": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z",
                        "2024-01-01T00:00:00Z",
                        "2024-W20"
                    ],
                    "scenarios": [
                        [
                            150,
                            100,
                            150
                        ]
                    ]
                },
                "capacity": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z",
                        "2023-07-01T00:00:00Z",
                        "2024-W05",
                        "2024-W15",
                        "2024-W25",
                        "2024-W35"
                    ],
                    "scenarios": [
                        [
                            150,
                            250,
                            350,
                            450,
                            550,
                            1000
                        ]
                    ]
                }
            }
        ],
        "loads": [
            {
                "#comment": "Gruppe 16",
                "name": "FLAT",
                "capacity": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z",
                        "2023-W20"
                    ],
                    "scenarios": [
                        [
                            150,
                            500
                        ]
                    ]
                }
            },
            {
                "#comment": "Gruppe 16",
                "name": "FLAT2",
                "capacity": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z",
                        "2024-W40"
                    ],
                    "scenarios": [
                        [
                            150,
                            200
                        ]
                    ]
                }
            }
        ],
        "busbars": [
            {
                "name": "couplings"
            },
            {
                "name": "tev"
            }
        ],
        "inflow_series": [
            {
                "name": "constant",
                "series": {
                    "timestamps": [
                        "1900-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            1.0
                        ]
                    ]
                }
            }
        ],
        "reservoirs": [
            {
                "name": "upper1",
                "average_spill_energy_equivalent": 2.0,
                "degree_of_regulation": 1,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 5,
                "max_discharge": 80,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-15T00:00:00Z",
                        "2024-02-01T00:00:00Z",
                        "2024-03-08T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            450,
                            450,
                            450
                        ]
                    ]
                },
                "initial_volume": 400,
                "volume_curve": {
                    "x": [
                        1500,
                        1550
                    ],
                    "y": [
                        0,
                        500
                    ]
                }
            },
            {
                "name": "upper2",
                "average_spill_energy_equivalent": 2.0,
                "degree_of_regulation": 1,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 10,
                "max_discharge": 100,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-15T00:00:00Z",
                        "2024-02-01T00:00:00Z",
                        "2024-03-08T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            450,
                            450,
                            450
                        ]
                    ]
                },
                "initial_volume": 200,
                "volume_curve": {
                    "x": [
                        1000,
                        1050
                    ],
                    "y": [
                        0,
                        500
                    ]
                }
            },
            {
                "name": "upper3",
                "average_spill_energy_equivalent": 1.0,
                "degree_of_regulation": 1,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 15,
                "max_discharge": 150,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-15T00:00:00Z",
                        "2024-02-01T00:00:00Z",
                        "2024-03-08T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            450,
                            450,
                            450
                        ]
                    ]
                },
                "initial_volume": 400,
                "volume_curve": {
                    "x": [
                        500,
                        550
                    ],
                    "y": [
                        0,
                        500
                    ]
                }
            },
            {
                "name": "buffer1",
                "average_spill_energy_equivalent": 0.0,
                "degree_of_regulation": 0,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 0,
                "max_discharge": 150,
                "reservoir_type": "buffer",
                "reference_curve": {
                    "timestamps": [
                        "2023-01-15T00:00:00Z",
                        "2024-02-01T00:00:00Z",
                        "2024-03-08T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            1,
                            1,
                            1
                        ]
                    ]
                },
                "initial_volume": 400,
                "volume_curve": {
                    "x": [
                        40,
                        45
                    ],
                    "y": [
                        0,
                        1
                    ]
                }
            }
        ],
        "hydraulic_couplings": [
            {
                "name": "coupling_100"
            }
        ],
        "plants": [
            {
                "name": "plant_upper1",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            2.0
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-02T00:00:00Z": {
                        "x": [
                            0.0,
                            30.00
                        ],
                        "y": [
                            0.0,
                            300.0
                        ]
                    }
                },
                "unregulated_inflow_name": "constant",
                "average_unregulated_inflow": 1.0,
                "tailrace_elevation": 50.0,
                "gross_head": 1300.0
            },
            {
                "name": "plant_upper2",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            2
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-02T00:00:00Z": {
                        "x": [
                            0.0,
                            70.00
                        ],
                        "y": [
                            0.0,
                            300.0
                        ]
                    }
                },
                "unregulated_inflow_name": "constant",
                "average_unregulated_inflow": 3.0,
                "tailrace_elevation": 50.0,
                "gross_head": 800.0
            },
            {
                "name": "plant_upper3",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            1
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-02T00:00:00Z": {
                        "x": [
                            0.0,
                            100.00
                        ],
                        "y": [
                            0.0,
                            300.0
                        ]
                    }
                },
                "unregulated_inflow_name": "constant",
                "average_unregulated_inflow": 1.0,
                "tailrace_elevation": 50.0,
                "gross_head": 300.0
            },
            {
                "name": "plant_buffer1",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            0
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-02T00:00:00Z": {
                        "x": [
                            0.0,
                            150.00
                        ],
                        "y": [
                            0.0,
                            150.0
                        ]
                    }
                },
                "unregulated_inflow_name": "constant",
                "average_unregulated_inflow": 1.0,
                "tailrace_elevation": 1.0,
                "gross_head": 40.0
            }
        ],
        "connections": [
            {
                "from": "couplings",
                "to": "DC"
            },
            {
                "from": "DC",
                "to": "tev"
            },
            {
                "from": "market_step",
                "to": "couplings"
            },
            {
                "from": "FLAT",
                "to": "couplings"
            },
            {
                "from": "FLAT2",
                "to": "tev"
            },
            {
                "from": "upper1",
                "to": "couplings"
            },
            {
                "from": "upper2",
                "to": "couplings"
            },
            {
                "from": "upper3",
                "to": "couplings"
            },
            {
                "from": "upper1",
                "to": "plant_upper1"
            },
            {
                "from": "upper2",
                "to": "plant_upper2"
            },
            {
                "from": "upper3",
                "to": "plant_upper3"
            },
            {
                "from": "plant_upper1",
                "to": "coupling_100"
            },
            {
                "from": "plant_upper2",
                "to": "coupling_100"
            },
            {
                "from": "plant_upper3",
                "to": "coupling_100"
            },
            {
                "from": "coupling_100",
                "to": "buffer1"
            },
            {
                "from": "buffer1",
                "to": "plant_buffer1"
            }
        ]
    }
}

120

  • Free flow between reservoirs

  • Limited by tunnel/canal max flow rate

  • Power plant connected to coupling

../../../_images/120.excalidraw.png

Example:

{
    "hydraulic_couplings": [
        {
            "name": "coupling_120",
            "max_flow": 70
        }
    ]
}

130

  • Discharge limited by gates

  • Limited by max flow rate in tunnel/canal

  • Flow between reservoirs limited by gates

  • Power plant connected to coupling

../../../_images/130.excalidraw.png

Example:

{
    "hydraulic_couplings": [
        {
            "name": "coupling_130",
            "max_flow": 70,
            "gate_switch_frequency": 50
        }
    ]
}

Reservoir joined couplings

200

  • Free flow between reservoirs

  • Limited by max flow rate in tunnel/penstock.

  • Power plants connected to 0 or more reservoirs

../../../_images/200.excalidraw.png
{
    "hydraulic_couplings": [
        {
            "name": "coupling_200",
            "max_flow": 70
        }
    ]
}

300

  • Discharge limited by gates

  • Flow between reservoirs limited by max flow rate in tunnel/canal

  • Power plants connected to 1 or more reservoirs

../../../_images/300.excalidraw.png
{
    "hydraulic_couplings": [
        {
            "name": "coupling_300",
            "max_flow": 70,
            "gate_switch_frequency": 50
        }
    ]
}

200+300 example

An example combining couplings 200 and 300 in 1 model.

../../../_images/200-300.excalidraw.png
JSON model with type 200 and type 300 couplings.
{
    "$schema": "https://gitlab.sintef.no/energy/ltm/pyltmapi/-/raw/main/model.schema.json",
    "model": {
        "global_settings": {
            "name": "eops_test",
            "output_path": "testout_couplings_200_300/",
            "delete_output_dir": false,
            "generate_output_dir": true,
            "model_type": "EOPS",
            "simulation_period": {
                "timestamps": [
                    "2024-01-01T00:00:00Z",
                    "2024-12-30T00:00:00Z"
                ]
            },
            "historical_period": {
                "timestamps": [
                    "1979-01-01T00:00:00Z",
                    "1989-01-01T00:00:00Z"
                ]
            },
            "max_iterations": 40,
            "precision": 0.001,
            "timesteps_per_week": 7
        },
        "loads": [
            {
                "#comment": "Gruppe 16",
                "name": "FLAT",
                "capacity": {
                    "timestamps": [
                        "2024-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            7.0
                        ]
                    ]
                },
                "price": {
                    "timestamps": [
                        "2024-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            40.0
                        ]
                    ]
                }
            },
            {
                "#comment": "Gruppe 16",
                "name": "FLAT2",
                "capacity": {
                    "timestamps": [
                        "2024-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            0.0007
                        ]
                    ]
                },
                "price": {
                    "timestamps": [
                        "2024-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            11.0
                        ]
                    ]
                }
            }
        ],
        "market_steps": [
            {
                "name": "ts_spot_purchase",
                "capacity": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            150.0
                        ]
                    ]
                }
            },
            {
                "name": "ts_spot_sale",
                "capacity": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            -120.0
                        ]
                    ]
                }
            }
        ],
        "inflow_series": [
            {
                "name": "zero",
                "series": {
                    "scenarios": [
                        [
                            0.1
                        ]
                    ]
                }
            },
            {
                "name": "constant",
                "series": {
                    "scenarios": [
                        [
                            1.0
                        ]
                    ]
                }
            }
        ],
        "reservoirs": [
            {
                "name": "LABRO",
                "average_spill_energy_equivalent": 0.12,
                "average_regulated_inflow": 6.359381359381359,
                "degree_of_regulation": 4,
                "initial_volume": 50,
                "max_discharge": 30,
                "reference_curve": {
                    "timestamps": [
                        "2024-04-22T00:00:00Z",
                        "2024-06-03T00:00:00Z",
                        "2024-12-30T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            95.01,
                            0.0,
                            95.0
                        ]
                    ]
                },
                "regulated_inflow": {
                    "#comment": "Refers to unregulated inflow label",
                    "timestamps": [
                        "0001-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            37.5954019
                        ]
                    ]
                },
                "volume_curve": {
                    "x": [
                        1050,
                        1100
                    ],
                    "y": [
                        0,
                        100
                    ]
                }
            },
            {
                "name": "upper1",
                "average_spill_energy_equivalent": 1.0,
                "degree_of_regulation": 3,
                "regulated_inflow": {
                    "scenarios": [
                        [
                            3.75954019
                        ]
                    ]
                },
                "average_regulated_inflow": 1,
                "max_discharge": 100,
                "reference_curve": {
                    "timestamps": [
                        "1900-W01"
                    ],
                    "scenarios": [
                        [
                            450
                        ]
                    ]
                },
                "initial_volume": 5,
                "volume_curve": {
                    "x": [
                        1100.0,
                        1130.0
                    ],
                    "y": [
                        0,
                        500
                    ]
                }
            },
            {
                "name": "upper2",
                "average_spill_energy_equivalent": 1.0,
                "degree_of_regulation": 3,
                "regulated_inflow": {
                    "scenarios": [
                        [
                            3.75954019
                        ]
                    ]
                },
                "average_regulated_inflow": 1,
                "max_discharge": 100,
                "reference_curve": {
                    "timestamps": [
                        "1900-W01"
                    ],
                    "scenarios": [
                        [
                            450
                        ]
                    ]
                },
                "initial_volume": 5,
                "volume_curve": {
                    "x": [
                        1115.00,
                        1130.00
                    ],
                    "y": [
                        0,
                        500
                    ]
                },
                "gross_head": 150
            },
            {
                "name": "upper3",
                "average_spill_energy_equivalent": 1.0,
                "degree_of_regulation": 3,
                "regulated_inflow": {
                    "scenarios": [
                        [
                            3.75954019
                        ]
                    ]
                },
                "average_regulated_inflow": 15,
                "max_discharge": 100,
                "reference_curve": {
                    "timestamps": [
                        "1900-W01"
                    ],
                    "scenarios": [
                        [
                            450
                        ]
                    ]
                },
                "initial_volume": 350,
                "volume_curve": {
                    "x": [
                        1120.0,
                        1130.0
                    ],
                    "y": [
                        0,
                        500
                    ]
                },
                "hc_max_flow": 20,
                "gross_head": 720
            },
            {
                "name": "lower1",
                "average_spill_energy_equivalent": 3.0,
                "degree_of_regulation": 0.5,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 1,
                "max_discharge": 200,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            1500
                        ]
                    ]
                },
                "initial_volume": 0,
                "volume_curve": {
                    "x": [
                        100.0,
                        110.0
                    ],
                    "y": [
                        0,
                        1500
                    ]
                },
                "gross_head": 720
            },
            {
                "name": "lower2",
                "average_spill_energy_equivalent": 3.0,
                "degree_of_regulation": 0.5,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 1,
                "max_discharge": 200,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            1500
                        ]
                    ]
                },
                "initial_volume": 0,
                "volume_curve": {
                    "x": [
                        90.0,
                        100.0
                    ],
                    "y": [
                        0,
                        1500
                    ]
                },
                "gross_head": 720
            },
            {
                "name": "lower3",
                "average_spill_energy_equivalent": 1.0,
                "degree_of_regulation": 0.5,
                "regulated_inflow_name": "constant",
                "average_regulated_inflow": 1,
                "max_discharge": 200,
                "reference_curve": {
                    "timestamps": [
                        "2023-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            500
                        ]
                    ]
                },
                "initial_volume": 150,
                "volume_curve": {
                    "x": [
                        80.0,
                        90.0
                    ],
                    "y": [
                        0,
                        1500
                    ]
                }
            }
        ],
        "hydraulic_couplings": [
            {
                "name": "coupling_200",
                "max_flow": 100
            },
            {
                "name": "coupling_300",
                "max_flow": 200,
                "gate_switch_frequency": 25
            }
        ],
        "plants": [
            {
                "name": "LABRO_plant",
                "discharge_energy_equivalent": {
                    "timestamps": [
                        "2023-01-02T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            0.12
                        ]
                    ]
                },
                "pq_curves": {
                    "2024-01-01T00:00:00Z": {
                        "y": [
                            0.0,
                            9.89
                        ],
                        "x": [
                            0.0,
                            24.6
                        ]
                    }
                },
                "average_unregulated_inflow": 0.6359381359,
                "gross_head": 40.0,
                "tailrace_elevation": 1030,
                "unregulated_inflow": {
                    "#comment": "Refers to unregulated inflow label",
                    "timestamps": [
                        "0001-01-01T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            37.5954019
                        ]
                    ]
                }
            },
            {
                "name": "plant",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "scenarios": [
                        [
                            1.0
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-01T00:00:00Z": {
                        "x": [
                            0.0,
                            30.00
                        ],
                        "y": [
                            0.0,
                            300.0
                        ]
                    }
                },
                "unregulated_inflow_name": "zero",
                "average_unregulated_inflow": 0.0,
                "tailrace_elevation": 150.0,
                "gross_head": 800.0
            },
            {
                "name": "plant2",
                "ownership": 100,
                "discharge_energy_equivalent": {
                    "scenarios": [
                        [
                            1
                        ]
                    ]
                },
                "pq_curves": {
                    "2023-01-01T00:00:00Z": {
                        "x": [
                            0.0,
                            100.00
                        ],
                        "y": [
                            0.0,
                            250.0
                        ]
                    }
                },
                "unregulated_inflow_name": "zero",
                "average_unregulated_inflow": 0.0,
                "tailrace_elevation": 0.0,
                "gross_head": 70.0
            }
        ],
        "busbars": [
            {
                "name": "couplings"
            }
        ],
        "price_series_main": [
            {
                "name": "HOVEDPRISREKKE.csv",
                "series": {
                    "timestamps": [
                        "2024-01-01T00:00:00Z",
                        "2024-01-08T00:00:00Z",
                        "2024-01-15T00:00:00Z",
                        "2024-01-22T00:00:00Z",
                        "2024-01-29T00:00:00Z",
                        "2024-02-05T00:00:00Z",
                        "2024-02-12T00:00:00Z",
                        "2024-02-19T00:00:00Z",
                        "2024-02-26T00:00:00Z",
                        "2024-03-04T00:00:00Z"
                    ],
                    "scenarios": [
                        [
                            0.0,
                            10.0,
                            20.0,
                            30.0,
                            40.0,
                            50.0,
                            60.0,
                            70.0,
                            80.0,
                            90.0
                        ],
                        [
                            1.0,
                            11.0,
                            21.0,
                            31.0,
                            41.0,
                            51.0,
                            61.0,
                            71.0,
                            81.0,
                            91.0
                        ],
                        [
                            2.0,
                            12.0,
                            22.0,
                            32.0,
                            42.0,
                            52.0,
                            62.0,
                            72.0,
                            82.0,
                            92.0
                        ],
                        [
                            3.0,
                            13.0,
                            23.0,
                            33.0,
                            43.0,
                            53.0,
                            63.0,
                            73.0,
                            83.0,
                            93.0
                        ],
                        [
                            4.0,
                            14.0,
                            24.0,
                            34.0,
                            44.0,
                            54.0,
                            64.0,
                            74.0,
                            84.0,
                            94.0
                        ],
                        [
                            5.0,
                            15.0,
                            25.0,
                            35.0,
                            45.0,
                            55.0,
                            65.0,
                            75.0,
                            85.0,
                            95.0
                        ],
                        [
                            6.0,
                            16.0,
                            26.0,
                            36.0,
                            46.0,
                            56.0,
                            66.0,
                            76.0,
                            86.0,
                            96.0
                        ],
                        [
                            7.0,
                            17.0,
                            27.0,
                            37.0,
                            47.0,
                            57.0,
                            67.0,
                            77.0,
                            87.0,
                            97.0
                        ],
                        [
                            8.0,
                            18.0,
                            28.0,
                            38.0,
                            48.0,
                            58.0,
                            68.0,
                            78.0,
                            88.0,
                            98.0
                        ],
                        [
                            9.0,
                            19.0,
                            29.0,
                            39.0,
                            49.0,
                            59.0,
                            69.0,
                            79.0,
                            89.0,
                            99.0
                        ]
                    ]
                }
            }
        ],
        "connections": [
            {
                "from": "FLAT",
                "to": "couplings"
            },
            {
                "from": "FLAT2",
                "to": "couplings"
            },
            {
                "from": "LABRO",
                "to": "couplings"
            },
            {
                "from": "LABRO",
                "to": "LABRO_plant"
            },
            {
                "from": "upper1",
                "to": "couplings"
            },
            {
                "from": "upper1",
                "to": "coupling_200"
            },
            {
                "from": "upper2",
                "to": "coupling_200"
            },
            {
                "from": "upper3",
                "to": "coupling_200"
            },
            {
                "from": "upper1",
                "to": "plant"
            },
            {
                "from": "plant",
                "to": "lower1"
            },
            {
                "from": "lower1",
                "to": "coupling_300"
            },
            {
                "from": "lower2",
                "to": "coupling_300"
            },
            {
                "from": "lower3",
                "to": "coupling_300"
            },
            {
                "from": "lower3",
                "to": "plant2"
            },
            {
                "from": "ts_spot_purchase",
                "to": "couplings"
            },
            {
                "from": "ts_spot_sale",
                "to": "couplings"
            }
        ]
    }
}