GMLC-1-4-2 / battery_interface

Implemenation of Device Models and their Battery Equivalent Interface
MIT License
5 stars 0 forks source link

API Variables for EnergyMarket service #90

Closed afernandezcanosa closed 5 years ago

afernandezcanosa commented 5 years ago

@jmaguire1 @raselmahmud02 @ORNLJD @rkadavil @can7huang @emayhorn @Hayden-Reeve @hlngo @TomEdmunds

For the integration of the current version of the Energy Market service, apart from the forecast method, some API variables are required to be different than None. In particular, these four are used by the service to build the request:

  1. response.Eff_charge
  2. response.Eff_discharge
  3. response.P_service_max
  4. response.P_service_min

The first two are used to calculate the roundtrip efficiency matrix and the last two are fed into the model to incorporate certain constraints.

For the fleet developers, please try to return something different than None for these four variables so that we can integrate this service into the Battery-Equivalent interface.

Thanks!

afernandezcanosa commented 5 years ago

@emayhorn @Hayden-Reeve @DavidWiniarski-pnnl I have started to code the calculation of the strike price as a function of the State of Charge price by using the equation that we discussed in the last meeting. This is the expression that we were supposed to use:

(Equation edited)

In this expression, the nameplate capacity is known and can be estimated in the fleet class, the state of charge price is also estimated by using simplified assumptions. However, the duration of the grid service cannot be known beforehand by the fleet. This variable is defined as "duration of grid service high price event, i.e., the duration of “higher than normal” prices over which a curtailment of consumption would be expected" so it might be computed by the energy market algorithm that @TomEdmunds @can7huang came up with.

Also, in the "test" strike price vector that @TomEdmunds and @can7huang use their algorithm, there are certain times where is zero and certain times when it is a different value. I was wondering if the algorithm will work with a constant strike price value.

Let me know what are your thoughts. Thanks!

TomEdmunds commented 5 years ago

Alejandro,

This appears to be consistent with the way I define SP in my code. SP = $ penalty for one MWh of energy shifted from t1 to t2 relative to the baseline power consumption (see attached). The right hand side below is $/MWhhrMW = $ so the units match.

The dispatch code would work with a constant strike price for any pair of hours t1 and t2. For your vehicle charging device, I believe you were using a zero round trip efficiency value to preclude discharging when you wanted to vehicle to be charged. (You could also enforce this behavior with a high SP in those hours.)

Tom

From: Alejandro Fernandez Canosa notifications@github.com Sent: Wednesday, May 15, 2019 9:29 AM To: GMLC-1-4-2/battery_interface battery_interface@noreply.github.com Cc: Edmunds, Thomas A. edmunds2@llnl.gov; Mention mention@noreply.github.com Subject: Re: [GMLC-1-4-2/battery_interface] API Variables for EnergyMarket service (#90)

@emayhornhttps://github.com/emayhorn @Hayden-Reevehttps://github.com/Hayden-Reeve @DavidWiniarski-pnnlhttps://github.com/DavidWiniarski-pnnl I have started to code the calculation of the strike price as a function of the State of Charge price by using the equation that we discussed in the last meeting. This is the expression that we were supposed to use:

[https://camo.githubusercontent.com/64325403dad65ffed217c5f016cd5b728ba52508/68747470733a2f2f6c617465782e636f6465636f67732e636f6d2f6769662e6c617465783f5c626567696e7b616c69676e2a7d2673706163653b53502673706163653b263d2673706163653b5c667261637b317d7b327d536f435f502673706163653b5c63646f742673706163653b5c44656c74612673706163653b742673706163653b5c63646f742673706163653b435e2a2673706163653b5c5c2673706163653b5c746578747b77686572657d2c5c5c2673706163653b53502673706163653b263d2673706163653b5c746578747b537472696b652673706163653b50726963657d2673706163653b5c5c2673706163653b536f435f502673706163653b263d2673706163653b5c746578747b53746174652673706163653b6f662673706163653b4368617267652673706163653b50726963657d2673706163653b5c5c2673706163653b5c44656c74612673706163653b742673706163653b263d2673706163653b5c746578747b4475726174696f6e2673706163653b6f662673706163653b7468652673706163653b677269642673706163653b736572766963657d5c5c2673706163653b432a2673706163653b263d2673706163653b5c746578747b4e616d65706c6174652673706163653b63617061636974792673706163653b6f662673706163653b7468652673706163653b6465766963657d2673706163653b5c656e647b616c69676e2a7d]https://www.codecogs.com/eqnedit.php?latex=\begin%7balign*%7d&space;SP&space;&=&space;\frac%7b1%7d%7b2%7dSoC_P&space;\cdot&space;\Delta&space;t&space;\cdot&space;C%5e*&space;\\&space;\text%7bwhere%7d,\\&space;SP&space;&=&space;\text%7bStrike&space;Price%7d&space;\\&space;SoC_P&space;&=&space;\text%7bState&space;of&space;Charge&space;Price%7d&space;\\&space;\Delta&space;t&space;&=&space;\text%7bDuration&space;of&space;the&space;grid&space;service%7d\\&space;C*&space;&=&space;\text%7bNameplate&space;capacity&space;of&space;the&space;device%7d&space;\end%7balign*%7d

In this expression, the nameplate capacity is known and can be estimated in the fleet class, the state of charge price is also estimated by using simplified assumptions. However, the duration of the grid service cannot be known beforehand by the fleet. This variable is defined as "duration of grid service high price event, i.e., the duration of “higher than normal” prices over which a curtailment of consumption would be expected" so it might be computed by the energy market algorithm that @TomEdmundshttps://github.com/TomEdmunds @can7huanghttps://github.com/can7huang came up with.

Also, in the "test" strike price vector that @TomEdmundshttps://github.com/TomEdmunds and @can7huanghttps://github.com/can7huang use their algorithm, there are certain times where is zero and certain times when it is a different value. I was wondering if the algorithm will work with a constant strike price value.

Let me know what are your thoughts. Thanks!

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/GMLC-1-4-2/battery_interface/issues/90?email_source=notifications&email_token=AJV2GXRHMSP53HVEN3G6RHTPVQ23HA5CNFSM4HIXP6TKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODVPGVAY#issuecomment-492726915, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AJV2GXWSH3MSZJTEOTVAWLDPVQ23HANCNFSM4HIXP6TA.

afernandezcanosa commented 5 years ago

@TomEdmunds Sorry, but the equation shown above should read:

At least, this is the equation that we discussed last week's meeting.

afernandezcanosa commented 5 years ago

For your information, these are the exact definitions of the variables:

SP = Strike price for a DER to produce energy, i.e., the required minimum price differential between the time it is charged to the time it is discharged (if it stores energy), or, for generation devices, the electricity price at which it is cost effective to operate given current fuel costs

∆t = duration of grid service high price event, i.e., the duration of “higher than normal” prices over which a curtailment of consumption would be expected

C* = the nameplate energy storage capacity of the device

SoCP = State-of-Charge (Deficit) Price, i.e., the hourly incentive or compensation [$/hr] required by the device owner for the inconvenience or loss of amenity associated with a state-of-charge deficit equal to the energy storage capacity (assumed to be a linear relationship)

afernandezcanosa commented 5 years ago

@emayhorn @Hayden-Reeve @DavidWiniarski-pnnl @TomEdmunds I have been thinking about how to implement the strike price for the entire fleet by using the equation above, and I found some questions that do not allow me to implement it. Perhaps you can help me with them:

  1. Should we use the capacity of the entire fleet? If so, the Strike Price will be a very small number and probably this will be a problem when we try to run the service. The current "dummy" strike price vector is of the order of 10-20 $/MWh. I think that the equation above makes more sense device by device and then aggregate the results for the entire fleet.
  2. How can we know the duration of the grid service, ∆t? Maybe, I can pass this information through the process-request method. Is this the entire duration of the grid service or just the duration of "higher than normal" price?

Thank you!

Hayden-Reeve commented 5 years ago

@afernandezcanosa , defining capacity just on fleet members that are technically capable of responding seems to make sense to me. I don't know enough to answer the other question. I suspect each charging and discharging period is one hour.