Scheduled Interruptions¶
Overview¶
Scheduled interruptions let you take an infrastructure element out of service — fully or as a partial derate — over explicit time windows that the optimizer must respect. Typical uses are planned maintenance, a forced outage, or a seasonal fuel-supply disruption.
Each interruption is one record — an outage window — that applies an
availability multiplier to a single element over an absolute hour range of
the simulation horizon. 0.0 is a full cut; 0.5 a 50 % derate; 1.0 has no
effect. The whole schedule is compiled into per-element, per-timestep capacity
masks before the solve, so the operational model simply sees reduced capacity in
those hours — the formulation itself is unchanged, and a system with an empty
schedule behaves exactly as before.
Different from N-1 contingency analysis
Scheduled interruptions are deterministic events you place on the calendar. They are not the automatic N-1 security screening, which tests the survivability of losing any single element. Use interruptions for known maintenance/outages; use N-1 for reliability against unplanned single-element failures.
How it works¶
- Absolute hours. Hour
0is 00:00 on 1 January of the system'sbase_year. A window covers[start_hour, end_hour)— start inclusive, end exclusive. A one-week maintenance from the start of week 20 isstart_hour = 20 * 168 = 3360,end_hour = 3360 + 168 = 3528. - Availability multiplier. During the window the element's capacity is
scaled by
availability∈ [0, 1] (0= offline,1= unaffected). Outside the window the element is fully available. - Per element. Each window targets exactly one element. Overlapping windows on the same element combine (the tighter derate wins for that hour).
- Persisted. The schedule is saved with the project and travels inside
.esfexpbundles.
From the GUI¶
The interruptions calendar¶
Edit → Interruptions… opens the Service Interruptions calendar for the current system — a Gantt-style timeline with one row per element, grouped by category:
- Generators
- Batteries
- Transmission lines
- Transformers
- AC/DC converters
- Frequency converters
Drag on an element's row to create an interruption over that span; click an existing window to edit it. Each window exposes:
| Field | Meaning |
|---|---|
| Start / End | The window's absolute hour range on the horizon |
| Availability | Capacity fraction during the window (0 = full cut, 1 = no effect) |
| Note | Optional free-text label shown on the calendar |
Use Add / Delete to manage windows directly.
From the element tree¶
Right-click any generator, battery, line, transformer, or converter in the element tree and choose Schedule interruption… to open the calendar already focused on that element's row.
From YAML¶
The same data lives under each system's outage_schedule as a list of outage
windows:
systems:
- name: MySystem
# ...
outage_schedule:
# Two-week full maintenance outage of generator "Nuclear_1"
- element_type: generator
element_id: Nuclear_1
start_hour: 3360 # start of week 20
end_hour: 3696 # + 2 weeks (2 * 168)
availability: 0.0 # fully offline
label: "Annual refuelling"
# Summer 50% derate of a transmission line (by line id)
- element_type: line
element_id: L_north_tie
start_hour: 4344 # ~1 July
end_hour: 5088
availability: 0.5
label: "Conductor thermal derate"
Element types and element_id¶
element_type |
GUI | element_id refers to |
|---|---|---|
generator |
✅ | Generator unit key (its name in the config) |
battery |
✅ | Battery unit key |
line |
✅ | Transmission line line_id (or its list index as a string) |
transformer |
✅ | Transformer name (or list index as a string) |
acdc_converter |
✅ | Converter name (or list index as a string) |
freq_converter |
✅ | Frequency-converter name (or list index as a string) |
fuel_source |
— | Fuel name (edited via YAML; applies a supply-disruption window) |
Elements marked ✅ are editable in the interruptions calendar; fuel_source
outages are configured in YAML.
Window fields¶
| Field | Required | Default | Meaning |
|---|---|---|---|
element_type |
✅ | — | One of the types above |
element_id |
✅ | — | Target element key/id (see table) |
start_hour |
✅ | — | Absolute horizon hour, inclusive (≥ 0) |
end_hour |
✅ | — | Absolute horizon hour, exclusive (> start_hour) |
availability |
— | 0.0 |
Capacity fraction in the window (0 = full cut, 1 = none) |
label |
— | "" |
Optional note shown on the calendar |
Examples¶
outage_schedule:
# Battery offline for a firmware upgrade (3 days)
- {element_type: battery, element_id: Bat_A, start_hour: 1200, end_hour: 1272,
availability: 0.0, label: "BMS upgrade"}
# AC/DC converter running at 70% for a month
- {element_type: acdc_converter, element_id: Conv_1, start_hour: 2000,
end_hour: 2744, availability: 0.7, label: "Cooling maintenance"}
# Winter gas-supply disruption (config-only)
- {element_type: fuel_source, element_id: NaturalGas, start_hour: 0,
end_hour: 720, availability: 0.3, label: "Pipeline curtailment"}
Notes¶
- An empty
outage_scheduleleaves the model unchanged. availability = 0.0removes the element for the window; a value in(0, 1)derates it. The reduced capacity is a hard cap the dispatch cannot exceed.- Reference elements by the names/ids shown in the GUI element tree (the config
keys). An unknown
element_idis simply ignored (no mask applied), so double-check names when a scheduled outage seems to have no effect. - Windows round-trip through save/load and
.esfexpbundles. - For usage-driven maintenance (every X operating hours) you currently place windows manually; automatic maintenance scheduling is not yet available. ```