Controllable Demand

My understanding is that you can set up demand to be controllable by setting the EDEM profile to have PSETPRCDEF = $0/MWh (non-controlled EDEMs have a value of $100,000) and then using a PAVG scenario event. However when I do that, it flips the demand curve from 100% served to 100% not served.

My intention is to have the controllable demand be called on when needed and not to have the entire demand response be called on 100% of the time.

Please advise all the steps to make a demand controllable.

Thanks!

Hi @jimhSAIntencoord,

Thanks for following up on this.

First, I’ll try to clarify some language. Remember, a production cost model representing a power market is an optimization problem. An optimization problem does not determine when things are “needed” based on some criteria. When an optimization problem is solved, the optimization engine, or “solver”, simply determines what is the value of all variables subject to a set of constraints that results in the minimum value for the objective function. In the case of power market models, the variables that are primarily of interest are the power injection and unit commitment of the generators, the constraints are their operating bounds, and the objective function represents the total cost of operating the system.

I understand this is challenging. The solver is robotic. A modeler must change their frame of reference and help guide it to a realistic solution. This means that you cannot rely on the solver to determine when flexible demand is needed. You either need to tell it directly when flexible demand is needed, or you need to carefully specify when demand flexibility is an option. Once those constraints are defined, the solver will do the rest. Below is a bit deeper explanation of how this works in SAInt.

When a user specifies a PSET event for an EDEM object, this tells the solver that the power withdrawal variable P for that object is equal to the value of PSET: P=PSET. The simplest way to make demand “flexible” in SAInt is to use the PSETPRC property. This tells the solver that the power withdrawal variable P for that object must be less than or equal to PSET: P≤PSET. In this case, it also tells the solver that the objective function should increase by a value of PSETPRC if there is any deviation between P and PSET: the objective function term is (PSET-P)*PSETPRC. In terms of plain English, setting PSETPRC will allow the demand to “curtail” its power withdrawal P if it pays the rate of the “penalty price” PSETPRC.

When a user specifies a PAVG event for an EDEM object, this is entirely different. In this case, the solver is given the following constraint:
PAVG_equation
This is a much more sophisticated representation of “flexible” demand. In terms of plain English, setting PAVG will allow the demand to participate in the market and its power withdrawal variable P at each timestep will be optimized by the solver – along with the value of all other variables – to minimize overall system cost.

The key thing to understand here is that in the absence of additional constraints, the optimal solution will appear very extreme and perhaps unrealistic depending on what the demand is representing. This aligns with what you are describing. Fortunately for you, there are many options available to help the solver find a solution that is realistic. The best solution is to add additional constraints. I would recommend that you also define PMIN and PMAX in conjunction with a PAVG event. This allows you to constrain how much demand is “flexible” at any given time for a specific object.

Using a PAVG event is an advanced but very powerful (and fun!) application in SAInt. However, with great power comes great responsibility :blush:. A couple of other things to keep in mind:

  1. If both a PAVG and PSET event are defined, the software will ignore the PAVG event and use the PSET event.
  2. Some of the Default Charts are not configured to work well with PAVG events out-of-the-box, so be careful!

I hope this helps, and please feel free to continue the conversation here if anything else needs to be clarified.

Happy modeling!

1 Like

Thank you for that insight. I tried to apply that to my model.

Here is an example of what I am trying to create for the VPP DR:

A NE ISO is willing to pay the VPP $XX/kW (let’s say $50) for curtailment and there are 30 such events when that curtailment is needed per year lasting about 1 hour on average.

When I explore the model with PAVG only scenario, the grid draws from that demand but continously, leaving behind only some amount behind based on the Value that I set in that scenario. My intent with the modeling is to use VPP Demand response only during grid crtical events and not continuously.

For PSET approach, when I set PSETPRC to $0 it takes all the demand away. Without trial and error on that value, how do I determine an appropriate penalty price such that it happens very infrequently (e.g. by seeing grid price samples throughout the scenario)?

Btw, I was able to create a DR curtailment spike at $50/MWh for the penalty but not for $100.

Thanks!

Hi @jimhSAIntencoord

Based on your description, it sounds like using the PSETPRC as the $/MWh payment will be the best approach for your use case.

Along the lines of the description above, you would need to specify what constitutes a “grid critical event”. The solver is just crunching numbers, and this context needs to be supplied. There is no one way to define this - it depends on your use case, how your model is implemented in SAInt, and what is the underlying behavior you wish to represent.

Your observation that no demand is served when PSETPRC=0 correctly reflects the math described above. You are also on the right track for picking a good value – viewing the energy prices in a “baseline” scenario is a great idea! The next step is to run a few scenarios to see how things behave differently with different inputs.

Best of luck!

2 Likes