How do we model custom grid charges?

Grid charges - such as DUoS (Distribution Use of System) - can vary by time of day, day of week, and season. They directly affect the profitability of battery dispatch by changing the effective cost of importing and exporting power.

By default, the dispatch model does not include grid charges, unless specified for a given region. You can upload a custom grid charges CSV to include them in the optimisation.


What does the CSV look like?

The CSV has the following columns:

Column Required Description
charge_name Yes Name of the charge, e.g. “DUoS”
charge_subtype No Optional breakdown label, e.g. “red”, “amber”, “green”
year No Year the charge applies to. If blank, the charge is carried forward from the previous defined year
month No Month (1-12) the charge applies to. If blank, the charge applies all year. Month-specific rows override year-round rows
day_type Yes One of: weekday, weekend, all, or a named day (mon, tue, etc.)
start_time Yes Start time in HH:MM format, must be on a half-hour boundary
end_time No End time in HH:MM format. If blank, the charge applies until the next start_time for that day type
import_charge_local_ccy_per_mwh Yes Import charge in local currency per MWh
export_charge_local_ccy_per_mwh Yes Export charge in local currency per MWh
fixed_charge_local_ccy_per_day No Fixed daily charge in local currency. Not used in the optimisation - included in revenue outputs only

Example: GB DUoS charges

A typical GB DUoS tariff might look like this in the CSV:

charge_name charge_subtype year month day_type start_time end_time import_charge_local_ccy_per_mwh export_charge_local_ccy_per_mwh fixed_charge_local_ccy_per_day
DUoS green 2025   weekday 00:00 07:00 1.5 0.5  
DUoS amber 2025   weekday 07:00 16:00 5.0 2.0  
DUoS red 2025   weekday 16:00 19:00 15.0 5.0  
DUoS amber 2025   weekday 19:00 00:00 5.0 2.0  
DUoS green 2025   weekend 00:00   1.5 0.5  
DUoS super_red 2025 11 weekday 16:00 19:00 25.0 8.0  
DUoS super_red 2025 12 weekday 16:00 19:00 25.0 8.0  
DUoS super_red 2025 1 weekday 16:00 19:00 25.0 8.0  
DUoS super_red 2025 2 weekday 16:00 19:00 25.0 8.0  
DUoS Fixed Charges       all 00:00   0 0 600

Notice the super_red rows for November through February. These override the standard red rows for those months because month-specific rows take precedence over year-round rows.


How are grid charges used in the optimisation?

Time-varying grid charges (import and export) are expanded to a half-hourly timeseries and fed into the dispatch optimisation as adders to the wholesale price.

For the battery, the optimiser accounts for grid charges when deciding when to charge and discharge. Higher import charges during peak periods make charging more expensive, while higher export charges during those same periods can make discharging more valuable.

For co-located solar and wind assets, export charges are applied to exported generation.

Any half-hourly periods not covered by the CSV default to zero charges.


What about fixed charges?

Fixed daily charges (like standing charges) are not included in the optimisation. They don’t affect dispatch decisions because they are incurred regardless of how the battery operates.

Instead, fixed charges are calculated separately and included in the revenue output as a line item. This keeps the optimisation clean while still giving you the full picture of grid charge costs.


How do the precedence rules work?

When multiple rows could apply to the same timestep, the processor uses these rules to decide which one wins:

  • Month-specific rows override year-round rows. A row with month = 11 takes priority over a row with no month specified, for any timestep in November.
  • Year is carried forward. If a year is defined for one set of rows but not the next, the last defined year continues to apply.
  • Named day types are more specific than broad ones. A mon row would take priority over a weekday row for Mondays.
  • Time ranges don’t stack. If two rows for the same charge name overlap in time (e.g. red and super_red both covering 16:00-19:00), the more specific one replaces the other entirely.

What do I see in the outputs?

The revenue outputs include a breakdown by charge_name and charge_subtype, showing:

  • Import MWh and cost per charge subtype
  • Export MWh and revenue per charge subtype
  • Fixed daily charges (if provided)

This lets you see, for example, how much of your import cost came from red-band DUoS charges versus green-band.