Source code for edisgo.flex_opt.storage_operation

import pandas as pd
from math import sqrt


[docs]def fifty_fifty(network, storage, feedin_threshold=0.5): """ Operational mode where the storage operation depends on actual power by generators. If cumulative generation exceeds 50% of nominal power, the storage is charged. Otherwise, the storage is discharged. The time series for active power is written into the storage. Parameters ----------- network : :class:`~.grid.network.Network` storage : :class:`~.grid.components.Storage` Storage instance for which to generate time series. feedin_threshold : :obj:`float` Ratio of generation to installed power specifying when to charge or discharge the storage. If feed-in threshold is e.g. 0.5 the storage will be charged when the total generation is 50% of the installed generator capacity and discharged when it is below. """ # determine generators cumulative apparent power output generators = network.mv_grid.generators + \ [generators for lv_grid in network.mv_grid.lv_grids for generators in lv_grid.generators] generators_p = pd.concat([_.timeseries['p'] for _ in generators], axis=1).sum(axis=1).rename('p') generators_q = pd.concat([_.timeseries['q'] for _ in generators], axis=1).sum(axis=1).rename('q') generation = pd.concat([generators_p, generators_q], axis=1) generation['s'] = generation.apply( lambda x: sqrt(x['p'] ** 2 + x['q'] ** 2), axis=1) generators_nom_capacity = sum([_.nominal_capacity for _ in generators]) feedin_bool = generation['s'] > (feedin_threshold * generators_nom_capacity) feedin = feedin_bool.apply( lambda x: storage.nominal_power if x else -storage.nominal_power).rename('p').to_frame() storage.timeseries = feedin