This page is for solar providers who wish to quote Solar PV systems that include behind the meter energy storage. Including energy storage in your quotes involves additional steps in order to align the charge and discharge schedule of the battery with the net hourly calculation of the electricity and solar profiles. As we outline below, this process is slightly different depending on the type of meter the utility requires post-solar.

For most tariffs you will calculate the forecasted savings with solar and storage by including a storage model with charge and discharge values. However, for tariffs that require dual register meters, you will need to create a profile that combines electricity, solar, and storage into a final net profile to calculate the forecasted savings with solar and storage.

Methods for Forecasting Savings with Solar and Storage

Below we describe two approaches to calculating savings with solar and storage.

Method Pros Cons Steps
Account Cost Calculation (Recommended) Ultimate flexibility in applying custom battery modeling (degradation, etc.) Need to recreate all the savings calculations from the savings analysis call including projections 1-6
Savings Analysis Savings and projections included in results No projection of battery degradation and with dual register meters, no calculation of solar production and subsequent degradation 1, 3-5, 7

1. Provision an Account with Electricity and Solar Profiles

The process begins with provisioning an account, just as you would when quoting only solar. This defines your customer’s tariff, pre-solar electric usage (kWh) and estimated solar production.

To do this, you will follow the first four steps of the Forecasted Savings Tutorial when you are quoting solar PV systems with behind the meter energy storage.

2. Calculate the Costs without Solar and Storage

This step is required for the Account Cost Calculation method.

Now we will calculate the customer’s pre-solar and storage costs using the electricity profile. The results from this calculation provide the pre-solar baseline costs used when calculating first year savings with solar and storage in a later step.

Here is a sample calculation:

POST /rest/v1/accounts/pid/{providerAccountId}/calculate/
1
2
3
4
5
6
7
8
9
10
11
{ 
"fromDateTime": "2017-01-01T00:00:00", 
"toDateTime": "2018-01-01T00:00:00", 
"useIntelligentBaselining": "true", 
"includeDefaultProfile": "true",
"autoBaseline": "true", 
"minimums": "false", 
"detailLevel": "CHARGE_TYPE", 
"groupBy": "MONTH", 
"fields": "EXT"
}

The response will return the customer’s total costs per month without solar and storage. Here is a snippet of the response for the month of January:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* edited for length */
        {
          "fromDateTime": "2017-01-01T00:00:00-10:00",
          "toDateTime": "2017-02-01T00:00:00-10:00",
          "quantityKey": "fixed",
          "rateAmount": 5.135,
          "itemQuantity": 2,
          "cost": 10.27,
          "chargeType": "FIXED_PRICE"
        },
        {
          "fromDateTime": "2017-01-01T00:00:00-10:00",
          "toDateTime": "2017-02-01T00:00:00-10:00",
          "quantityKey": "consumption",
          "rateAmount": 0.24747042,
          "itemQuantity": 372.557409,
          "cost": 92.19693848,
          "chargeType": "CONSUMPTION_BASED"
        },
/* edited for length */

Visit our documentation on the Account Cost Calculation endpoint for more information.

3. Retrieve the Net Hourly Profile

To build your storage profile you will need to understand, hour by hour, the customer’s estimated usage and solar production. This will allow you to match your charge/discharge schedule to the estimated scenario. This is true whether you are charging when the price is low and discharging when the price is high or if you charging when there is excess solar production and discharging to replace power received from the grid.

IMPORTANT NOTE ON DATES: The date range you use in this calculation MUST match the date range in your subsequent storage profile (Step 4) AND in your final savings calculations (Steps 6 or 8). This is to ensure that the charge and discharge hours line up correctly or else the forecasted savings calculation will not be accurate.

To retrieve the net hourly profile, you will run a calculation for the date range of your first year calculation using the electricity profile and solar profile. When you created the electricity profile, you set the electricity profile as the default profile on the account. Therefore, you will include the electricity profile in the calculation by using the parameter "includeDefaultProfile": "true". In addition to the electricity profile, you will pass the solar profile under tariffInputs with "operator": "-" since you are subtracting the solar production from the customer’s electricity usage.

You will also include the following parameters in the Account Cost Calculation request to enable Intelligent Baselining to move your customer’s electricity data to a future date (the estimated interconnection data) and to extrapolate the annual usage if you are using less than 12 months of data:

  • "useIntelligentBaselining": "true"
  • "autoBaseline": "true"

You will set the "detailLevel": "CHARGE_TYPE_AND_TOU" so the time of use periods for each hour will be returned if you are using a time of use tariff. With this information you can model the storage profile where the battery discharges during on-peak hours and the battery charges during off-peak hours.

Below is a sample request to retrieve the net hourly profile using the tariff that is set on the account. NOTE: You will only be interested in the records with "chargeType": "CONSUMPTION_BASED".

POST /rest/v1/accounts/pid/{providerAccountId}/calculate/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{ 
"fromDateTime": "2017-01-01T00:00:00", 
"toDateTime": "2018-01-01T00:00:00", 
"useIntelligentBaselining": "true", 
"includeDefaultProfile": "true",
"autoBaseline": "true", 
"minimums": "false", 
"detailLevel": "CHARGE_TYPE_AND_TOU", 
"groupBy": "HOUR", 
"fields": "EXT",
"tariffInputs": [{
	"keyName": "profileId",
	"dataValue": "{profileId of solar profile}",
	"operator": "-"
}]
}

Here is the snippet of the response you will receive for a time of use tariff:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* edited for length */
        {
          "fromDateTime": "2017-01-01T17:00:00-10:00",
          "toDateTime": "2017-01-01T18:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.44956642,
          "itemQuantity": 0.51576,
          "cost": 0.23190247,
          "chargeType": "CONSUMPTION_BASED",
          "period": "PARTIAL_PEAK",
          "touId": 3119,
          "touName": "Mid-Peak"
        },
        {
          "fromDateTime": "2017-01-01T18:00:00-10:00",
          "toDateTime": "2017-01-01T19:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.44956642,
          "itemQuantity": 0.595127,
          "cost": 0.26757248,
          "chargeType": "CONSUMPTION_BASED",
          "period": "PARTIAL_PEAK",
          "touId": 3119,
          "touName": "Mid-Peak"
        },
        {
          "fromDateTime": "2017-01-01T19:00:00-10:00",
          "toDateTime": "2017-01-01T20:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.44956642,
          "itemQuantity": 0.581265,
          "cost": 0.26136164,
          "chargeType": "CONSUMPTION_BASED",
          "period": "PARTIAL_PEAK",
          "touId": 3119,
          "touName": "Mid-Peak"
        },
/* edited for length */

Here is a sample request to retrieve the net hourly profile with a tariff specified in the request:

POST /rest/v1/accounts/pid/{providerAccountId}/calculate/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{ 
"fromDateTime": "2017-01-01T00:00:00", 
"toDateTime": "2018-01-01T00:00:00", 
"masterTariffId": 3256713, 
"useIntelligentBaselining": "true", 
"includeDefaultProfile": "true",
"autoBaseline": "true", 
"minimums": "false", 
"detailLevel": "CHARGE_TYPE_AND_TOU", 
"groupBy": "HOUR", 
"fields": "EXT",
"tariffInputs": [{
	"keyName": "profileId",
	"dataValue": "{profileId of solar profile}",
	"operator": "-"
}]
}

Here is a snippet of the response you will receive for a non-time of use tariff:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* edited for length */
        {
          "fromDateTime": "2017-01-01T00:00:00-10:00",
          "toDateTime": "2017-01-01T01:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.246772,
          "itemQuantity": 0.277411,
          "cost": 0.06845727,
          "chargeType": "CONSUMPTION_BASED"
        },
        {
          "fromDateTime": "2017-01-01T01:00:00-10:00",
          "toDateTime": "2017-01-01T02:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.246772,
          "itemQuantity": 0.253721,
          "cost": 0.06261124,
          "chargeType": "CONSUMPTION_BASED"
        },
        {
          "fromDateTime": "2017-01-01T02:00:00-10:00",
          "toDateTime": "2017-01-01T03:00:00-10:00",
          "quantityKey": "consumption",
          "rateType": "COST_PER_UNIT",
          "rateAmount": 0.246772,
          "itemQuantity": 0.248678,
          "cost": 0.06136677,
          "chargeType": "CONSUMPTION_BASED"
        },
/* edited for length */

Visit our documentation on Account Cost Calculation to learn more about this endpoint.

4. Model the Storage Profile

Now that you have the customer’s estimated hourly kWh and costs, you can use this to inform your battery profile. There are two basic approaches to modeling storage: (1) Time of use Arbitrage where you charge the battery when the price is low and discharge when the price is high and (2) Grid Independence where you charge the battery with excess solar production and discharge from the battery instead of buying from the grid. These are hardly the only approaches to modeling storage but they are the most common.

Time of Use Arbitrage: When you are modeling the storage profile for a time of use tariff, you will discharge the battery during on-peak hours and you will charge the battery during off-peak hours. You may also use the hourly rate instead of or in addition to the time of use period to determine your charge and discharge schedule.

Grid Independence: When you are modeling the storage profile with grid independence, you will charge the battery when the solar system is producing more energy than it is being consumed. The battery will discharge when the solar system is producing less energy than used.

5. Create a Storage Profile or Combination Profile of Electricity, Solar, and Storage

From here on out it is important to know if you are working with a tariff that requires dual register meters or not.

If the tariff you are working with requires dual register meters (primarily Hawaiian tariffs), you will follow Step B. Otherwise you will follow Step A.

Using the storage model, this section goes over how to upload a storage profile and for rates with dual register meters, a net profile that includes electricity, solar, and storage.

A. Create a Storage Profile for Tariffs

For tariffs that do not require dual register meters, you will upload your storage model of charge and discharge values so you can add this profile to your calculation to forecast savings. After modeling the storage profile from the net hourly profile, you will create the storage profile that will hold 8,760 kWh values of the battery usage. The storage profile will have an identical date range to your first year calculation. Please note that the serviceTypes for the storage profile is ELECTRICITY.

Positive values are used when the battery is charging:

1
2
3
4
5
6
      { 
        "fromDateTime" : "2017-01-01T14:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "1.67291",
        "toDateTime" : "2017-01-01T15:00:00-10:00"
      }

Negative values are used when the battery is discharging:

1
2
3
4
5
6
      { 
        "fromDateTime" : "2017-01-01T17:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "-0.344736",
        "toDateTime" : "2017-01-01T18:00:00-10:00"
      }

Here is an example of creating a storage profile with charging and discharging values:

POST /rest/v1/profiles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{ 
  "providerAccountId" : "{providerAccountId}",
  "providerProfileId" : "{providerProfileId of storage profile}",
  "profileName" : "Example of Storage Profile",
  "serviceTypes" : "ELECTRICITY",
  "sourceId" : "ReadingEntry",
  "readingData" : [ 
/* edited for length */
      { "fromDateTime" : "2017-01-01T14:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "1.67291",
        "toDateTime" : "2017-01-01T15:00:00-10:00"
      },{ "fromDateTime" : "2017-01-01T15:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.904214",
        "toDateTime" : "2017-01-01T16:00:00-10:00"
      },{ "fromDateTime" : "2017-01-01T16:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.159734",
        "toDateTime" : "2017-01-01T17:00:00-10:00"
      },{ "fromDateTime" : "2017-01-01T17:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "-0.344736",
        "toDateTime" : "2017-01-01T18:00:00-10:00"
      },{ "fromDateTime" : "2017-01-01T18:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "-0.595127",
        "toDateTime" : "2017-01-01T19:00:00-10:00"
      },    
/* edited for length */
  ]
}

B. Create a Combination Profile for Electricity, Solar, and Storage for Tariffs with Dual Register Meters

For tariffs that require dual register meters, you will create a profile that represents the post-solar and storage scenario. You will calculate the hourly import and export values for the combination of electricity, solar, and storage. In other words, you will create a profile with electricity - solar production - storage discharge + storage charge.

Let’s go through an example on how to calculate for the combination profile. Let’s say the following values occur on 1/2/2017 at 10:00AM:

  • Consumption: 0.58 kWh
  • Solar Production: 3.174 kWh
  • Storage Discharge: 0 kWh
  • Storage Charge: 2.594 kWh

Therefore, when you are calculating for the combination, it will be 0 kWh for 1/2/2017 at 10:00AM:

0.58 kWh - 3.174 kWh - 0 kWh + 2.594 kWh = 0 kWh

Here is an example of creating a profile that is a combination of electricity, solar, and storage:

POST /rest/v1/profiles
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{ 
  "providerAccountId" : "{providerAccountId}",
  "providerProfileId" : "{providerProfileId of storage profile}",
  "profileName" : "Example of Combination Profile",
  "serviceTypes" : "ELECTRICITY",
  "sourceId" : "ReadingEntry",
  "readingData" : [ 
/* edited for length */
      { "fromDateTime" : "2017-01-01T00:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.346",
        "toDateTime" : "2017-01-01T01:00:00-10:00"
      },{ "fromDateTime" : "2017-01-01T01:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.324",
        "toDateTime" : "2017-01-01T02:00:00-10:00"
      },
/* edited for length */
      { "fromDateTime" : "2017-01-10T04:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.347",
        "toDateTime" : "2017-01-10T05:00:00-10:00"
      },{ "fromDateTime" : "2017-01-10T05:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.428",
        "toDateTime" : "2017-01-10T06:00:00-10:00"
      },{ "fromDateTime" : "2017-01-10T06:00:00-10:00",
        "quantityUnit" : "kWh",
        "quantityValue" : "0.651",
        "toDateTime" : "2017-01-10T07:00:00-10:00"
      },    
/* edited for length */
  ]
}

6. Calculate the Costs with Solar and Storage via Account Cost Calculation

Now we will go through the steps to calculate the first year costs with solar and storage using the Account Cost Calculation endpoint. You will compare the results from Step 2 and this step to arrive at the first year savings with solar and storage.

If the tariff you are working with has dual register meters (primarily Hawaiian tariffs), you will follow Step B. Otherwise you will follow Step A.

A. For Tariffs without Dual Register Meters

For tariffs that do not require dual register meters, you will calculate the first year costs with solar and storage by including the solar and storage profiles in your calculation. This is exactly the same calculation call as the previous call with just solar except you explicitly add in the storage profile. Please note that it is imperative that the date range of the battery profile is identical to the calculation so that the storage charge and discharge hours line up correctly, otherwise the calculation will not be accurate.

Here is a sample request which subtracts the solar profile and adds the storage profile to the electricity profile:

POST /rest/v1/accounts/pid/{providerAccountId}/calculate/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{ 
"fromDateTime": "2017-01-01T00:00:00", 
"toDateTime": "2018-01-01T00:00:00", 
"useIntelligentBaselining": "true", 
"includeDefaultProfile": "true",
"autoBaseline": "true", 
"minimums": "false", 
"detailLevel": "CHARGE_TYPE", 
"groupBy": "MONTH", 
"fields": "EXT",
"tariffInputs": [{
	"keyName": "profileId",
	"dataValue": "{profileId of solar profile}",
	"operator": "-"
},{
	"keyName": "profileId",
	"dataValue": "{profileId of storage profile}",
	"operator": "+"
}]
}

B. For Tariffs with Dual Register Meters

For tariffs that require dual register meters, you will calculate the first year costs with solar and storage by using the profile that is a combination of the electricity, solar, and storage. You will set the "includeDefaultProfile" to "false" and you will also not include the solar profile as a tariffInput since the combination profile includes the electricity profile and the solar profile.

Here is a sample request:

POST /rest/v1/accounts/pid/{providerAccountId}/calculate/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{ 
"fromDateTime": "2017-01-01T00:00:00", 
"toDateTime": "2018-01-01T00:00:00", 
"useIntelligentBaselining": "true", 
"includeDefaultProfile": "false",
"autoBaseline": "true", 
"minimums": "false", 
"detailLevel": "CHARGE_TYPE", 
"groupBy": "MONTH", 
"fields": "EXT",
"tariffInputs": [{
	"keyName": "profileId",
	"dataValue": "{profileId of combination profile}",
	"operator": "+"
}]
}

7. Run a Savings Analysis with Solar and Storage

You can run a savings analysis to forecast savings with solar and storage for a potential customer.

If you are using a tariff that does not require dual register meters, you will include the storage profile in the savings analysis request (see Step A for more information). However, if you are using a tariff with dual register meters, you will use the combination profile of electricity, solar, and storage in the after scenario (see Step B for more information).

Please note that there are caveats when you are running a savings analysis with solar and storage:

  • The lifetime solar costs will reflect the behavior of the storage.
  • The first year solar costs will not be available if you have a dual register meter and you are passing the combination profile of electricity, solar, and storage.

The standard scenarios ran for an analysis of a solar and storage customer are:

  • "before" which is what the electricity bill would be in the future without solar and storage
  • "solar" which denotes what the solar system being considered would produce and cost
  • "after" which is what the electricity bill would be in the future with solar and storage
  • “savings” which is the net savings between "before" and "after" scenarios

However, the Savings Analysis requests are different if you are using a tariff that requires dual register meters.

A. For Tariffs without Dual Register Meters

Below is a sample savings analysis for solar and storage when you are using tariffs that do not require dual register meters. You will use the parameter "operator": "+" to include the storage profile’s charging and discharging values in the calculation.

POST /rest/v1/accounts/analysis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
  "providerAccountId" : "{providerAccountId}",
  "fromDateTime" : "2017-01-01",
  "fields": "ext",
  "propertyInputs" : [ {
    "scenarios" : "before",
    "keyName" : "masterTariffId",
    "dataValue" : "2415"
  }, {
    "scenarios" : "before,after",
    "keyName" : "rateInflation",
    "dataValue" : "3.5"
  }, {
    "scenarios" : "solar",
    "keyName" : "rateInflation",
    "dataValue" : "1.9"
  }, {
    "scenarios" : "after,solar",
    "keyName" : "solarDegradation",
    "dataValue" : "1.5"
  }, {
    "scenarios" : "before, after",
    "keyName" : "providerProfileId",
    "dataValue" : "{providerProfileId of electricity profile}"
  }, {
    "scenarios" : "after, solar",
    "keyName" : "providerProfileId",
    "dataValue" : "{providerProfileId of solar profile}"
  }, {
    "scenarios" : "after",
    "keyName" : "providerProfileId",
    "dataValue" : "{providerProfileId of storage profile}",
    "operator": "+"
  } ],
  "rateInputs" : [ {
    "scenarios" : "solar",
    "chargeType" : "FIXED_PRICE",
    "rateBands" : [ {
      "rateAmount" : 137.05
    } ]
  } ]
}

B. For Tariffs with Dual Register Meters

For tariffs that require dual register meters, you will use the electricity profile in the “before” scenario and the combination profile of electricity, solar, and storage in the “after” scenario. Here is a sample request:

POST /rest/v1/accounts/analysis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "providerAccountId" : "{providerAccountId}",
  "fromDateTime" : "2017-01-01",
  "fields": "ext",
  "propertyInputs" : [ {
    "scenarios" : "before",
    "keyName" : "masterTariffId",
    "dataValue" : "2415"
  }, {
    "scenarios" : "before,after",
    "keyName" : "rateInflation",
    "dataValue" : "3.5"
  }, {
    "scenarios" : "before",
    "keyName" : "providerProfileId",
    "dataValue" : "{providerProfileId of electricity profile}"
  }, {
    "scenarios" : "after",
    "keyName" : "providerProfileId",
    "dataValue" : "{providerProfileId of combination profile}",
  } ]
}

There is no solar scenario in the request above since the impact of the solar is already included in your net profile. This also means that series 3 (first year solar) will not be populated for this request as it requires a solar profile to be passed in. We recommend retrieving the total solar production from the profile via the Get Profile request.

You can learn more about the Savings Analysis in its API reference document.