{ "cells": [ { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# Multinetwork storage optimization with PandaModels.jl\n", "This tutorial describes how to run a storage optimization over multiple timesteps with a PandaModels.jl multinetwork\n", "together with pandapower.\n", "\n", "To run a storage optimization over multiple time steps, the power system data is copied n_timestep times internally.\n", "This is done efficiently in a julia script. Each network in the multinetwork dict represents a single time step. \n", "The input time series must be written to the loads and generators accordingly to each network. \n", "This is currently done by converting input time series to pandapwower controllers, saving it together with the grid data as a json file and loading the data back in julia. This \"hack\" is probably just a temporary solution. \n", "\n", "Some notes:\n", "* only storages which are set as \"controllable\" are optimized\n", "* time series can be written to load / sgen elements\n", "* output of the optimization is a dict containing pandas DataFrames for every optimized storage and time step \n", "\n", "For more details on PowerModels (PandaModels) storage model see:\n", "\n", "https://lanl-ansi.github.io/PowerModels.jl/stable/storage/ and \n", "https://github.com/e2nIEE/PandaModels.jl/blob/develop/src/models/call_powermodels.jl\n", "\n", "For more details on PowerModels multinetworks see:\n", "\n", "https://lanl-ansi.github.io/PowerModels.jl/stable/multi-networks/\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Installation\n", "You need the standard Julia, PowerModels, Ipopt and JuMP Installation (see the opf_powermodels.ipynb).\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Run the storage optimization\n", "In order to start the optimization and visualize results, we follow four steps:\n", "1) Load the pandapower grid data (here the cigre MV grid)\n", "2) Convert the time series to pandapwoer-controllers\n", "3) Start the optimization\n", "4) Get and plot the results\n" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "## 1) Get the grid data\n", "We load the cigre medium voltage grid with \"pv\" and \"wind\" generators. Also we set some limits and add a storage with\n", "**controllable** == True\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandapower as pp\n", "import pandapower.networks as nw\n", "\n", "def cigre_grid():\n", " net = nw.create_cigre_network_mv(\"pv_wind\")\n", " # set some limits\n", " min_vm_pu = 0.95\n", " max_vm_pu = 1.05\n", "\n", " net[\"bus\"].loc[:, \"min_vm_pu\"] = min_vm_pu\n", " net[\"bus\"].loc[:, \"max_vm_pu\"] = max_vm_pu\n", "\n", " net[\"line\"].loc[:, \"max_loading_percent\"] = 100.\n", "\n", " # close all switches\n", " net.switch.loc[:, \"closed\"] = True\n", " # add storage to bus 10\n", " pp.create_storage(net, 10, p_mw=0.5, max_e_mwh=.2, soc_percent=0., q_mvar=0., controllable=True)\n", "\n", " return net\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2) Convert the time series to pandapower-controllers\n", "The following functions loads the example time series from the input_file and scales the power accordingly.\n", "It then adds the time series data to the grid model by creating controllers.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "import pandas as pd\n", "from pandapower.control import ConstControl\n", "from pandapower.timeseries import DFData\n", "\n", "def convert_timeseries_to_controller(net, input_file):\n", " \n", " # set the load type in the cigre grid, since it is not specified\n", " net[\"load\"].loc[:, \"type\"] = \"residential\"\n", " \n", " # set the sgen type in the cigre grid\n", " net.sgen.loc[:, \"type\"] = \"pv\"\n", " net.sgen.loc[8, \"type\"] = \"wind\"\n", "\n", " # read the example time series\n", " time_series = pd.read_json(input_file)\n", " time_series.sort_index(inplace=True)\n", "\n", " # this example time series has a 15min resolution with 96 time steps for one day\n", " n_timesteps = time_series.shape[0]\n", " \n", " # get rated power\n", " load_p = net[\"load\"].loc[:, \"p_mw\"].values\n", " sgen_p = net[\"sgen\"].loc[:7, \"p_mw\"].values\n", " wind_p = net[\"sgen\"].loc[8, \"p_mw\"]\n", "\n", " load_ts = pd.DataFrame(index=time_series.index.tolist(), columns=net.load.index.tolist())\n", " sgen_ts = pd.DataFrame(index=time_series.index.tolist(), columns=net.sgen.index.tolist())\n", " for t in range(n_timesteps):\n", " load_ts.loc[t] = load_p * time_series.at[t, \"residential\"]\n", " sgen_ts.loc[t][:8] = sgen_p * time_series.at[t, \"pv\"]\n", " sgen_ts.loc[t][8] = wind_p * time_series.at[t, \"wind\"]\n", "\n", " # create time series controller for load and sgen \n", " ConstControl(net, element=\"load\", variable=\"p_mw\",\n", " element_index=net.load.index.tolist(), profile_name=net.load.index.tolist(),\n", " data_source=DFData(load_ts))\n", " ConstControl(net, element=\"sgen\", variable=\"p_mw\",\n", " element_index=net.sgen.index.tolist(), profile_name=net.sgen.index.tolist(),\n", " data_source=DFData(sgen_ts))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3) Start the optimization \n", "Before we start the optimization, we create the grid and controller, adding the time series in 15min resolution. \n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "# open the cigre mv grid\n", "net = cigre_grid()\n", "\n", "# convert the time series to pandapower controller\n", "input_file = \"cigre_timeseries_15min.json\"\n", "convert_timeseries_to_controller(net, input_file)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, the time series is added through (const) controllers, and you can check the created controllers\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--- time series controller: object in_service order level initial_run \\\n", "0 ConstControl [load.p_mw] True -1.0 -1 False \n", "1 ConstControl [sgen.p_mw] True -1.0 -1 False \n", "\n", " recycle \n", "0 {'trafo': False, 'gen': False, 'bus_pq': True} \n", "1 {'trafo': False, 'gen': False, 'bus_pq': True} \n", "--- considered element of controller 0: load\n", "--- considered element index of controller 0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]\n", "--- time series data: 0 1 2 3 4 5 6 \\\n", "0 3.838794 0.070777 0.110512 0.186256 0.140313 0.150247 0.121687 \n", "1 3.731032 0.06879 0.10741 0.181027 0.136374 0.146029 0.118271 \n", "2 3.178328 0.0586 0.091498 0.154211 0.116172 0.124397 0.100751 \n", "3 3.026164 0.055795 0.087118 0.146828 0.11061 0.118441 0.095927 \n", "4 3.136205 0.057823 0.090286 0.152167 0.114632 0.122748 0.099416 \n", ".. ... ... ... ... ... ... ... \n", "91 6.532286 0.120438 0.188053 0.316943 0.238763 0.255667 0.207069 \n", "92 6.160585 0.113585 0.177352 0.298908 0.225177 0.241119 0.195287 \n", "93 5.168657 0.095296 0.148796 0.25078 0.188921 0.202296 0.163843 \n", "94 4.558566 0.084048 0.131233 0.221179 0.166621 0.178418 0.144504 \n", "95 4.293205 0.079155 0.123594 0.208304 0.156922 0.168032 0.136092 \n", "\n", " 7 8 9 10 11 12 13 \\\n", "0 0.084436 3.838794 0.053393 1.240427 0.057669 0.019586 0.146893 \n", "1 0.082066 3.731032 0.051895 1.205606 0.05605 0.019036 0.142769 \n", "2 0.069909 3.178328 0.044207 1.027011 0.047747 0.016216 0.12162 \n", "3 0.066562 3.026164 0.042091 0.977842 0.045461 0.01544 0.115797 \n", "4 0.068982 3.136205 0.043621 1.0134 0.047114 0.016001 0.120008 \n", ".. ... ... ... ... ... ... ... \n", "91 0.143681 6.532286 0.090857 2.110773 0.098132 0.033328 0.24996 \n", "92 0.135505 6.160585 0.085687 1.990665 0.092548 0.031432 0.235737 \n", "93 0.113687 5.168657 0.07189 1.670144 0.077647 0.026371 0.19778 \n", "94 0.100268 4.558566 0.063405 1.473006 0.068482 0.023258 0.174435 \n", "95 0.094431 4.293205 0.059714 1.38726 0.064495 0.021904 0.164281 \n", "\n", " 14 15 16 17 \n", "0 0.017409 1.284206 0.008705 0.084871 \n", "1 0.016921 1.248156 0.00846 0.082489 \n", "2 0.014414 1.063258 0.007207 0.070269 \n", "3 0.013724 1.012354 0.006862 0.066905 \n", "4 0.014223 1.049167 0.007112 0.069338 \n", ".. ... ... ... ... \n", "91 0.029625 2.185271 0.014812 0.144421 \n", "92 0.027939 2.060924 0.01397 0.136203 \n", "93 0.023441 1.72909 0.01172 0.114273 \n", "94 0.020674 1.524994 0.010337 0.100785 \n", "95 0.01947 1.436222 0.009735 0.094918 \n", "\n", "[96 rows x 18 columns]\n" ] } ], "source": [ "# print controller\n", "print(\"--- time series controller:\", net.controller)\n", "\n", "# print time series data in controller\n", "print(\"--- considered element of controller 0:\", net.controller.object[0].__dict__[\"matching_params\"][\"element\"])\n", "print(\"--- considered element index of controller 0:\",net.controller.object[0].__dict__[\"matching_params\"][\"element_index\"])\n", "print(\"--- time series data:\",net.controller.object[0].data_source.df)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start the optimization for timesteps from 0 to 10.\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "hp.pandapower.opf.make_objective - WARNING: no costs are given - overall generated power is minimized\n", "hp.pandapower.opf.run_powermodels - INFO: Optimization ('run_powermodels_multi_storage') is finished in 63.47 seconds:\n" ] } ], "source": [ "# run the optimization for the first ten timesteps (the first run can be slow.\n", "try:\n", " pp.runpm_storage_opf(net, from_time_step=0, to_time_step=10)\n", "except Exception as err:\n", " print(err)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4) Get and plot the results \n", "Get and plot the optimization results for the storage.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from pandapower.opf.pm_storage import read_pm_storage_results\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_storage_results(storage_results):\n", " n_res = len(storage_results.keys())\n", " fig, axes = plt.subplots(n_res, 2)\n", " if n_res == 1:\n", " axes = [axes]\n", " for i, (key, val) in enumerate(storage_results.items()):\n", " res = val\n", " axes[i][0].set_title(\"Storage {}\".format(key))\n", " el = res.loc[:, [\"p_mw\", \"q_mvar\", \"soc_mwh\"]]\n", " el.plot(ax=axes[i][0])\n", " axes[i][0].set_xlabel(\"time step\")\n", " axes[i][0].legend(loc=4)\n", " axes[i][0].grid()\n", " ax2 = axes[i][1]\n", " patch = plt.plot([], [], ms=8, ls=\"--\", mec=None, color=\"grey\", label=\"{:s}\".format(\"soc_percent\"))\n", " ax2.legend(handles=patch)\n", " ax2.set_label(\"SOC percent\")\n", " res.loc[:, \"soc_percent\"].plot(ax=ax2, linestyle=\"--\", color=\"grey\")\n", " ax2.grid()\n", " plt.show()\n", "\n", "# get the results\n", "#storage_results = read_pm_storage_results(net) \n", " \n", "# plot the results\n", "#plot_storage_results(storage_results)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 1 }