Peak shaving with energy storage: peak shaving level as a function of the energy storage capacity for a given load profile

Background

Peak shaving has been around for many years and it still has some interesting applications. One obvious application is the reduction of high load peaks of industrial processes in order to reduce the demand charge which is determined by the maximum load that occurred within a given time frame, i.e. the lower the peak demand, the lower the demand charge for the given time frame. Another interesting application can be found in the electric distribution grid space. Distribution grid transformers that are close to their loading limits could be supported by nearby installed energy storage systems in order to defer the need for a transformer upgrade.

If you want to perform the analysis for your specific scenario, download the Python code. Just click on the banner below to go to the resources section and find out more. The step-by-step description of how to use the code can be found at the end of the post.

Call to action to download the code

So let’s get down to business. What do we need to know? To start off, we just need historical load profiles of the installation we want to do peak shaving for. Those load profiles can be directly plugged into the algorithm and used to calculate how much the maximum load can be reduced for given storage specifications. Of course, the energy storage specifications, such as the capacity, max. charging and discharging power and efficiency, are user-specific and can be adapted as needed. 

Load profiles 

The yearly load profiles are standard profiles provided by the Austrian Balance Group Coordinator (Austrian Power Clearing and Settlement – APCS). The profiles represent the per unit consumption of each time unit and can be scaled with the yearly consumption. The profiles can be downloaded on the website of the APCS.

In this case, I use two load profiles with different properties to show the impact of the actual load profile on the peak shaving application. The first one is called “Gewerbe_durchgehend” (= industry_continuous) and the second one is “Gewerbe_stark” (= industry_heavy). Both profiles are based on the same yearly energy consumption (10 MWh), but their consumption pattern is very different. Fig. 1 shows the two load profiles for a week in January. The continuous industry has a more regular pattern in the sense that the daily pattern is very similar, while the heavy industry profile has a few high consumption peaks and otherwise a quite low consumption. Both profiles also entail a seasonal variation where the consumption is lower in Summer and higher in Winter.

The infographic shows the continuous and heavy load profile for one week in January
Fig. 1: Continuous and heavy load profile for one week in January

Algorithm

The algorithm to calculate the peak shaving level is actually quite simple. First, a baseline is defined, above which the storage discharges, and below which the storage charges. The charging and discharging power is determined by the difference between the baseline and the load (charging power = baseline – load) at each time step. Throughout all time steps, the energy storage limitations need to be respected, e.g. no discharging when the energy content of the storage is zero. The goal of the algorithm is to find the lowest baseline where the load + storage power is smaller or equal than the baseline for all time steps. In other words, find the baseline where the storage system is optimally utilized as shown in the example in Fig. 2.

At the first iteration, the baseline is set to the nearest lower integer of the average load. This choice is rather arbitrary, but since the optimal baseline is always higher than the medim load due to the losses of the energy storage, it is a reasonable starting point.

At the end of each iteration, it is checked if the baseline is greater or equal than load + storage for all time steps (please refer to Fig. 2). If not, the baseline is too low and the storage cannot cover the required energy of the peak above the baseline. Therefore, the baseline is increased until the baseline is greater or equal than the load + storage for all time steps. The step size for the baseline increase is 0.01 kW.

The infographic shows an example of the baseline approach applied to the heavy industry profile for a week in January. The storage charges when the load is below the baseline and discharges when the load is above. The baseline is at its minimum and the resulting demand (load+storage) is smaller or equal than the baseline for all time steps.
Fig. 2: Example of the baseline approach applied to the heavy industry profile for a week in January. The storage charges when the load is below the baseline and discharges when the load is above. The baseline is at its minimum and the resulting demand (load+storage) is smaller or equal than the baseline for all time steps.

Study Case

Calculation of the optimal baseline (peak shaving level) for the two above described load profiles for different storage capacities and discussion of the differences. Another important aspect is to analyze how an increase of the energy consumption impacts the peak shaving results. This is interesting because, in general, the (yearly) energy consumption increases over time, and in this way, the future performance of peak shaving can be analyzed. Table 1 summarizes the energy storage specifications used in the analysis.

Table 1: Energy storage specifications

Energy storage specificationValue/RangeUnitDescription
Efficiency0.9-Efficiency for charging and discharging.
Energy storage capacity0 - 100kWhMaximum capacity: The higher the capacity the more energy can be stored.
Max. discharging power-1* storage capacitykWMaximum discharging power: The power rating is defined to be 100 % of the storage capacity, e.g. for a capacity of 10 kWh the max. discharging power is 10 kW.
Max. charging power+1* storage capacitykWMaximum charging power: The power rating is defined to be 100% of the storage capacity, e.g. for a capacity of 10 kWh the max. charging power is 10 kW.

Fig. 3 shows the maximum load in absolute and relative terms for both considered load profiles. The upper subplot shows the absolute peak in kilowatts, while the lower subplot shows the peak relative to the initial maximum load peak. For storage capacities above 85 kWh, the peak of the heavy industrial profile can be reduced to about 31 % and the peak of the continuous profile to about 55 % of the initial peak, respectively. The heavy industrial profile can be reduced more than the peak of the continuous industrial profile because there are longer charging periods between the peaks where the battery can charge so that there is sufficient energy to discharge during the peaks.

Practically speaking, in both cases, a reduction of the peak consumption to about 60 % of the initial peak can already be achieved with a storage of approximately 10 kWh. Putting that in context with the yearly consumption of 10 MWh, only a storage capacity of  0.1 % of the yearly consumption is needed to reduce the peak load by 40 %.

Another interesting fact is, that the absolute peak from the heavy industrial profile approaches the absolute peak from the continuous profile at higher storage capacities. However, the peak of the heavy profile stabilizes slightly above the continuous profile due to a higher number of charging/discharging cycles and therefore higher storage losses.

The infographic shows the absolute and relative peak for different storage capacities for the heavy and continuous load profile
Fig. 3: Absolute and relative peak for different storage capacities for the heavy and continuous load profile

Now, assume you expect an increase in energy consumption of 10 % in the next year(s). How does this affect peak shaving? It is an important question because the storage capacity shall be high enough to support the appropriate peak shaving operation for the coming years (or until the energy consumption exceeds the evaluated level). Therefore, it is interesting to analyze the effects of the increased consumption on the peak shaving application.

Fig. 4 shows how a 10 % yearly energy increase impacts peak shaving of the heavy industry profile. For storage capacities above 85 kWh, the peak with increased consumption stabilizes at around 1.68 kW, whereas initially, it was about 1.51 kW which is about 11 % higher than initially. Particularly interesting is the range of storage capacities below 20 kWh, which would be a realistic capacity for application, the higher demand leads to an increased storage requirement to keep the same peak shaving level. For example: to keep the peak load to max. 3 kW, initially a 10 kWh storage is sufficient, but with increased consumption, at least 13 kWh are needed to keep the same level.

c absolute and relative peak for different storage capacities - heavy industry profile with a 10 % increased yearly consumption
Fig. 4: Absolute and relative peak for different storage capacities – heavy industry profile with a 10 % increased yearly consumption

Fig. 5 shows the comparison of the continuous industry profile with a 10 % increased yearly consumption. For storage capacities above 20 kWh, the peak with increased consumption stabilizes at around 1.5 kW, whereas initially, it was about 1.36 kW which is slightly more than 10 % higher than initially. Comparing that to the heavy profile, the increased energy consumption leads to a smaller impact on the continuous profile. This again stems from the fact that there are higher storage losses for the heavy industry profile due to the higher number of charging/discharging cycles (that were already mentioned before). In both cases, the increased consumption does not significantly change the results of the relative peak reduction.

The infographic shows the absolute and relative peak for different storage capacities - continuous industry profile with a 10 % increased yearly consumption
Fig. 5: Absolute and relative peak for different storage capacities – continuous industry profile with a 10 % increased yearly consumption

Summary

The type of load profile has a significant impact on the application of peak shaving. For load profiles with pronounced peaks (here represented by the heavy industrial profile), the peak shaving potential is higher than for load profiles with a more regular pattern (here represented by the continuous industrial profile). In both cases, a reduction of the peak consumption to about 60 % of the initial peak can already be achieved with a storage of approximately 10 kWh. Compared to the yearly consumption of 10 MWh, only a storage capacity of  0.1 % of the yearly consumption is needed to achieve a reduction by 40 %. To make the solution future fit, the increase in energy consumption over the coming years can be considered by scaling up the load profile by the expected energy increase and calculation of the required storage capacity for the desired peak reduction.

Below are the step-wise instructions on how to use the code.

The scripts are flexible so that different scenarios in terms of consumption and energy storage specifications can be analyzed. All parameters that are shown in Table 1 can be adjusted. Additionally, four different load profiles are available:

  • Gewerbe = industry
  • Gewerbe_stark = industry heavy
  • Gewerbe_durchgehend = industry continuous
  • Baeckerei = bakery

The Python code for the analysis is divided into two scripts. Only one additional data file (PS_synthload2021.xlsx) with the yearly load profiles is needed. This file is delivered along with the code. In the following, you find a stepwise description of how to use the two scripts and what’s happening in each of them.

Note: of course you can also plug in your own load profiles. Just make sure that they have the same format as the ones in ‘PS_data_load.pkl’ which are the result of the data pre-processing. Remember that the profiles represent the per unit energy consumption for each time unit over the whole year. Accordingly, the sum of each per unit profile is equal to one.

Before you continue: Unpack the downloaded zip-file somewhere on your hard drive.

Script 1: PS_01_data_preprocessing.py

How?

  • Simply run the script if you keep the file ‘PS_synthload2021.xlsx’ in the same folder as the script, no adjustments needed.
  • If you keep ‘PS_synthload2021.xlsx’ in a different folder, add the path between the single quotation marks as shown in Screenshot 1 before you run the script. Suggestion: Keep the file in the same folder as the script, because then nothing needs to be changed.
A screenshot of Python showing the optional definition of the path to ‘PS_synthload2021.xlsx’
Screenshot 1: Optional definition of the path to ‘PS_synthload2021.xlsx’

What?

  • Resamples the load profiles from quarter-hourly to hourly resolution. 
  • Rescales the data to per unit, i.e. the sum of each load profile over one year is equal to one, thus, the profiles can be easily scaled with the yearly consumption. 
  • Saves the profiles as ‘PS_data_load.pkl’.

Script 2: PS_02_peak_vs_capacity.py

How?

  • Define the parameters for the calculation as shown in Screenshot 2.
    • Load Profile: Select load profile by defining the ‘profilename’ as one of the following options:
      • ‘Gewerbe’
      • ‘Gewerbe_stark’
      • ‘Gewerbe_durchgehend’
      • ‘Baeckerei’
    • Yearly consumption
      • E_load_yearly: yearly consumption (kWh)
    • Part of the data to be used in the calculation
      • idx_from, idx_to: start and end index of the load profile to be used in the calculation. Useful, if you want to use only a specific range of the data, e.g. the first 24 hours (idx_from = 0, idx_to = 24). In the script, it is set so that the whole year is used, i.e. 8760 hours.
    • Storage
      • spec_eta: efficiency (pu)
      • spec_Emin: min. energy content (kWh)
      • spec_E0: initial energy content (kWh) must be greater or equal than the min. energy content. Suggestion = 0.
      • spec_P_minmax_scale: min./max. power rating (pu) based on the storage capacity, Pmin/Pmax = -/+ spec_P_minmax_scale * storage capacity
      • E_from, E_to, E_step: storage capacity (kWh) to be analyzed. Example: E_from, E_to, E_step = 0, 15, 3 means from 0 to 15 kWh in 3 kWh steps. Recommendation: always start from 0 kWh, because it represents the base case – without storage – which makes it easier to interpret the results.
  • Run the script.
A screenshot of Python showing the parameter definition
Screenshot 2: Parameter definition

What?

  • Scales the load profile with the specified yearly consumption.
  • Calculates the optimal baseline (peak shaving level) for the given load profile and storage specifications. The algorithm takes care of ensuring that the storage specifications are satisfied at all points in time, e.g. max. capacity. 
  • Repeats the calculation for the specified energy storage capacities.
  • Saves a result file containing the load profile and the calculated storage schedules for the given storage capacities over the whole year. The file name includes the most relevant parameters of the calculation, e.g. name of the load profile, yearly consumption, etc. Screenshot 3 shows an example of a result file (yearly consumption = 10000 kWh, Emax = 0 – 30 kWh in 10 kWh steps, eta = 0.9 and E0 = 0 kWh).
A screenshot of Python showing an example of a result file
Screenshot 3: Example of a result file
  • Calculates the max. peak for the resulting load profiles (load + storage) for each storage capacity. The peak is presented in absolute values and relative values compared to the initial peak (without storage).
  • Presents the summary of results in the console as shown in Screenshot 4. For each storage capacity, the max. peak in absolute and relative terms is shown.
A screenshot of Python showing the result summary
Screenshot 4: Result summary
  • Presents the results in form of two plots. Screenshot 6 shows the time domain results of the load and storage including the baseline. Of course, the results are only shown for one storage capacity (given in the title). Screenshot 5 shows the standard setting, which plots the results for the highest storage capacity, i.e. plt_show = -1. If you want to plot the results for another storage capacity, you can enter a number between 0 and the number of evaluated storage capacities, e.g. plt_show = 1 will show you the 10 kWh case here, etc. The second line (plt_from, plt_to) allows showing only a subset of time steps. The standard setting is the full period, which plots all the time steps.
Screenshot 5: Time domain plot settings
A screenshot of Python showing the time domain plot showing the load, storage and baseline
Screenshot 6: Time domain plot showing the load, storage and baseline
  • Screenshot 7 shows the max. peak vs. storage capacity in absolute and relative terms. The results of the plot correspond to the numbers shown in the console summary displayed in Screenshot 4.
A screenshot of Python showing the absolute and relative peak vs. storage capacity
Screenshot 7: Absolute and relative peak vs. storage capacity

I hope you find this article insightful. Consider leaving a comment to let me know your thoughts on the topic.

More insights within energy are to follow in the next article.

Michael

Call to action to download the code
Share this post:

Similar Posts

2 Comments

Leave a Reply