docs: def _integrate_storage(self, timeseries, position, params, voltage_level,
                             reactive_power_timeseries, **kwargs):
          """
          Integrate storage units in the grid.
  
          Parameters
          ----------
          timeseries : :obj:`str` or :pandas:`pandas.Series<series>`
              Parameter used to obtain time series of active power the storage
              storage is charged (negative) or discharged (positive) with. Can
              either be a given time series or an operation strategy. See class
              definition for more information
          position : :obj:`str` or :class:`~.grid.components.Station` or :class:`~.grid.components.BranchTee` or :class:`~.grid.components.Generator` or :class:`~.grid.components.Load`
              Parameter used to place the storage. See class definition for more
              information.
          params : :obj:`dict`
              Dictionary with storage parameters for one storage. See class
              definition for more information on what parameters must be
              provided.
          voltage_level : :obj:`str` or None
              `voltage_level` defines which side of the LV station the storage is
              connected to. Valid options are 'lv' and 'mv'. Default: None. See
              class definition for more information.
          reactive_power_timeseries : :pandas:`pandas.Series<series>` or None
              Reactive power time series in kvar (generator sign convention).
              Index of the series needs to be a
              :pandas:`pandas.DatetimeIndex<datetimeindex>`.
  
          """
          # place storage
          params = self._check_nominal_power(params, timeseries)
          if isinstance(position, Station) or isinstance(position, BranchTee) \
                  or isinstance(position, Generator) \
                  or isinstance(position, Load):
              storage = storage_integration.set_up_storage(
                  node=position, parameters=params, voltage_level=voltage_level)
              line = storage_integration.connect_storage(storage, position)
          elif isinstance(position, str) \
                  and position == 'hvmv_substation_busbar':
              storage, line = storage_integration.storage_at_hvmv_substation(
                  self.edisgo.network.mv_grid, params)
          elif isinstance(position, str) \
                  and position == 'distribute_storages_mv':
              # check active power time series
              if not isinstance(timeseries, pd.Series):
                  raise ValueError(
                      "Storage time series needs to be a pandas Series if "
                      "`position` is 'distribute_storages_mv'.")
              else:
                  timeseries = pd.DataFrame(data={'p': timeseries},
                                            index=timeseries.index)
                  self._check_timeindex(timeseries)
              # check reactive power time series
              if reactive_power_timeseries is not None:
                  self._check_timeindex(reactive_power_timeseries)
                  timeseries['q'] = reactive_power_timeseries.loc[
                      timeseries.index]
              else:
                  timeseries['q'] = 0
              # start storage positioning method
              storage_positioning.one_storage_per_feeder(
                  edisgo=self.edisgo, storage_timeseries=timeseries,
                  storage_nominal_power=params['nominal_power'], **kwargs)
              return
          else:
              message = 'Provided storage position option {} is not ' \
                        'valid.'.format(timeseries)
              logging.error(message)
              raise KeyError(message)
  
          # implement operation strategy (active power)
          if isinstance(timeseries, pd.Series):
              timeseries = pd.DataFrame(data={'p': timeseries},
                                        index=timeseries.index)
              self._check_timeindex(timeseries)
              storage.timeseries = timeseries
          elif isinstance(timeseries, str) and timeseries == 'fifty-fifty':
              storage_operation.fifty_fifty(self.edisgo.network, storage)
          else:
              message = 'Provided storage timeseries option {} is not ' \
                        'valid.'.format(timeseries)
              logging.error(message)
              raise KeyError(message)
  
          # reactive power
          if reactive_power_timeseries is not None:
              self._check_timeindex(reactive_power_timeseries)
              storage.timeseries = pd.DataFrame(
                  {'p': storage.timeseries.p,
                   'q': reactive_power_timeseries.loc[storage.timeseries.index]},
                  index=storage.timeseries.index)
  
          # update pypsa representation
          if self.edisgo.network.pypsa is not None:
              pypsa_io.update_pypsa_storage(
                  self.edisgo.network.pypsa,
                  storages=[storage], storages_lines=[line])