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 = 11takes 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
monrow would take priority over aweekdayrow for Mondays. - Time ranges don’t stack. If two rows for the same charge name overlap in time (e.g.
redandsuper_redboth 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.