Catalog

Grid reference sheets

The small set of facts you end up looking up again and again: the regions, the six interconnectors and which way they point, the ten FCAS services, the constraint naming grammar, market time, and the three tests that decide whether a row means anything.

Every measured number on this page carries its observation window. Where a source does not give a fact, this page says so rather than filling the gap.

The five regions

Taught in 1. The NEM in five minutes.

One region, one spot price, one five-minute dispatch price. Region ids carry a trailing 1 throughout the MMS model, and the single-letter form is what appears at the front of a constraint id.

REGIONIDRegionLetter in a constraint id
NSW1New South WalesN
QLD1QueenslandQ
VIC1VictoriaV
SA1South AustraliaS
TAS1TasmaniaT

I is not a region. In a constraint set id it marks an inter-regional line outage, and in an FCAS constraint id it marks global scope, meaning the whole NEM.

What this page will not tell you

Regional reference node names. AEMO defines a reference node per region and the price-setter attribution is expressed per 1 MW of reference-node demand, but none of the sources behind this site name those nodes, so they are not listed here. The MMS REGION table carries only REGIONID, DESCRIPTION and REGIONSTATUS.

The six interconnectors

Taught in 5. From marginal value to price.

Six physical assets connect the five regions. Three are regulated interconnectors and three are market network service providers (MNSPs), which bid like a generator and can therefore set a price. The id form gives the type away: an id containing MNSP is one.

INTERCONNECTORIDPhysical nameREGIONFROMREGIONTOType
NSW1-QLD1QNINSW1QLD1regulated
N-Q-MNSP1Terranora, formerly DirectlinkNSW1QLD1MNSP
VIC1-NSW1VIC to NSWVIC1NSW1regulated
V-SAHeywoodVIC1SA1regulated
V-S-MNSP1MurraylinkVIC1SA1MNSP
T-V-MNSP1BasslinkTAS1VIC1MNSP by id form; converted to regulated 1 July 2026

The sign convention, and the direction rule that follows from it

The one fact everything rests on

DISPATCHINTERCONNECTORRES.MWFLOW > 0 means power flows from the interconnector's REGIONFROM to its REGIONTO: the nominal positive, or export, direction. EXPORTLIMIT bounds that positive direction; IMPORTLIMIT bounds the negative, reverse direction.

  • An EXPORT limit binding. REGIONFROM cannot push any more power to REGIONTO. REGIONTO is short of cheap imports and must meet demand from more expensive local plant, so REGIONTO prices high. REGIONFROM has trapped surplus and prices low.
  • An IMPORT limit binding. REGIONFROM cannot pull any more power back from REGIONTO, so REGIONFROM is short and prices high. REGIONTO prices low.

Put shortly: a named export limit points high at REGIONTO, a named import limit points high at REGIONFROM. DISPATCHINTERCONNECTORRES names the responsible constraint in EXPORTGENCONID and IMPORTGENCONID, so the direction question is answerable per interval without any modelling at all.

Orientation is not free

AEMO's INTERCONNECTOR table carries REGIONFROM and REGIONTO, but this project never ingested it: the six assets and their orientations were hardcoded, with a fixture test pinning the map so a refactor could not flip a direction silently. A map that stores an unordered pair of regions cannot answer the direction question, and mixing the two kinds of map is an easy way to invert every conclusion.

The Basslink change is a worked example of why regimes matter more than ids: its regulated conversion on 1 July 2026 restored FCAS transfer across it, and the split-market F_MAIN+ and F_T+*ML_RECL* constraint families (about 838 bound hours per week beforehand) handed over to the NEM-wide F_I+ family. Total bound hours fell about 28% while non-FCAS congestion moved about 4% (measured over the week of 2026-07-18 to 2026-07-25).

The ten FCAS services

Taught in 8. FCAS constraints.

Frequency control ancillary services are Raise and Lower, each across five timeframes: regulation (the AGC service) and four contingency services.

CodeServiceKind
R1Raise 1 secondcontingency
R6Raise 6 secondcontingency
R60Raise 60 secondcontingency
R5Raise 5 minutecontingency
RREGRaise regulationregulation (AGC)
L1Lower 1 secondcontingency
L6Lower 6 secondcontingency
L60Lower 60 secondcontingency
L5Lower 5 minutecontingency
LREGLower regulationregulation (AGC)

Event codes inside an FCAS constraint id

  • MGLoss of the largest mainland generator. Sizes a raise requirement.
  • TGLoss of the largest Tasmanian generator. Sizes a raise requirement.
  • MLLoss of the largest mainland load. Sizes a lower requirement.
  • TLLoss of the largest Tasmanian load. Sizes a lower requirement.
  • BLBasslink trip.
  • NILSystem normal: no contingency assumed.
  • noneNo event code at all means a regulation requirement.

How a requirement is sized

A contingency requirement is the largest credible contingency minus load relief. Mainland load relief is 0.5% of demand per 0.5 Hz; Tasmania is 0%. Regulation is set empirically and can substitute for 5-minute contingency, which is why regulation terms appear on the left-hand side of contingency constraints.

Most FCAS constraints are >= constraints, all FCAS left-hand-side factors are 1, and regional requirement terms sit in SPDREGIONCONSTRAINT with a factor of plus or minus 1. In practice most FCAS constraints carry no region rows at all: their left-hand side is unit-level.

F_MAIN++NIL_BL_R6: R6(Q) + R6(N) + R6(V) + R6(S) - Basslink >= -0.01 x (demand Q + N + V + S)

A worked example from AEMO's own training material: a mainland 6-second raise requirement on a Basslink trip, netted against the link's own flow and reduced by mainland load relief.

Constraint naming grammar

Taught in 6. Reading a constraint name.

A constraint equation id is at most 20 characters and reads left to right:

RegionID + CauseID + [_OutageID] + [_UniqueID]

Cause codes

  • >Thermal overload.
  • ^Voltage stability.
  • :Transient stability.
  • _Other: discretionary, unit-specific or non-network.

Doubling matters. A doubled cause code (>>, ::, ^^) means the equation is fully co-optimised, that is, every left-hand-side term is dispatchable. A single code means the inter-regional or intra-regional form. So N>>NIL_39_11 and N>NIL_94T differ in more than a character.

The site's decoder also treats a leading - as an "other" marker, because ids using it appear in the data. AEMO's own material lists the four codes above.

The outage token

  • NIL means system normal: no outage is assumed.
  • Anything else is a station or line code, or a line number: LTUT, MNYS, 94T.
  • The remaining segments are the unique id, usually the monitored line and the contingency line, or a sequence number. A round number in the tail often is the right-hand-side cap itself.

Examples: N>>NIL_39_11, V^^S_NIL_MAXG_1, Q^^NIL_QNI_SRAR, N::N_BWMP_1.

FCAS ids

F_{scope}{+ | ++}{event}_{service}
  • Scope is I for global, or a region group: MAIN, STHN, NVS, T and others.
  • ++ means the requirement is co-optimised with interconnector transfer; + means it is not.
  • Then the event code, then the service code.

Examples: F_MAIN++NIL_MG_R60, F_T++LREG_0050, F_I+ML_L5_0400.

Constraint set ids

{Region | I}-{OutageID}_{UniqueID}

For example V-NIL_RADIAL or N-MNYS_4. Sets, not equations, are what AEMO invokes and revokes.

Constraint types and set categories

Taught in 2. Why constraints exist and 7. Sets, invocation and outages.

Equation types

Thermal, including dynamic and feedback formulations that read current flows back into the limit. Voltage stability. Transient stability. Oscillatory stability. System strength. FCAS.

Set categories

System normal (the NIL sets, invoked indefinitely). Single outage and multi-outage. Discretionary, which is where the round-number right-hand-side families live. Outage ramping. Post-separation island. Non-conformance. And the EMS constraint automation quick constraints, whose ids start CA_.

Two id forms sit outside the grammar entirely and both must be excluded from any counting:

  • CA_ prefixed ids are EMS-generated quick constraints.
  • # prefixed ids are auto-generated ramping constraints with an ephemeral id, new every day. They will inflate any per-id statistic and can never be learned from.

Market time

Taught in 10. Constraints in the AEMO tables.

  • All MMS timestamps are market time: Australia/Brisbane, no daylight saving. There is no DST discontinuity anywhere in the model.
  • The market day starts at 04:00. Dispatch interval 1 ends at 04:05.
  • DISPATCHINTERVAL is formatted YYYYMMDDPPP, with periods 1 to 288 counted from 04:05 market time. 288 times 5 minutes is 24 hours.
  • A stamp names the interval by its end. Start-of-interval readings (DISPATCH_UNIT_SCADA.SCADAVALUE, "Instantaneous MW reading from SCADA at the start of the Dispatch interval" in AEMO's words, and DISPATCHLOAD.INITIALMW) describe five minutes before the stamp; targets, prices and marginal values describe the stamp itself.
  • Metering uses a different day. NEM12 interval data (MDFF specification, section 3.3.3) runs by calendar day from midnight: interval 1 is the period ending 00:05 for 5-minute meters, 00:15 for 15-minute meters and 00:30 for 30-minute meters, and the last interval of a day ends at 00:00 of the next day. Values are energy accumulated over the period. Times are fixed-offset standard time with no daylight saving.
  • The NEMDE price-setter XML files carry a fixed +10:00 offset. Strip it and store naive market time, or the two clocks will drift apart in your joins.
Publication timing, measured 2026-07-14 over 577 files

DISPATCHIS for the interval ending T uploads at T minus 4 to T minus 1 minutes, because NEMDE solves ex-ante at interval start. Relative to interval start the upload is start plus 1 to 2 minutes typically, plus 3 at the 99th percentile, plus 4 at most. So the freshest label at any instant is the in-progress interval, and a sync that stops at "the newest available file" settles exactly one interval behind.

The tests, the bands, and the exclusions

Taught in 4. Binding and marginal value.

Three tests

QuestionTestWhere
Is it binding?MARGINALVALUE != 0DISPATCHCONSTRAINT; CAPACITYMARGINALVALUE in STPASA_CONSTRAINTSOLUTION
Is it violating?VIOLATIONDEGREE != 0same tables
Is it switched off?abs(RHS) >= ~9,500swamping: AEMO disables an equation by offsetting its right-hand side by plus or minus 10,000

The first test is an epistemic rule, not a convenience. Published NEMDE solutions are ground truth: never recompute a dynamic right-hand side to derive a label. Reconstructing a right-hand side is for explaining a limit, never for labelling one.

The marginal-value bands

  • Median binding absolute marginal value is about $0.38/MWh. Most binding is cheap.
  • Values above about $100,000/MWh are violation penalties, not economics. The band was measured in release 0.71.0: the gap in the distribution sits between 98.2k and 107.5k, and observed penalties run to $27M/MWh.
  • Anything in the penalty band must be excluded from cost rankings. A single penalty row will dominate a dollar-weighted table on its own.
A shadow price is not a payment

Marginal value is the dispatch engine's estimate of how much cheaper an hour would have been with one more MW of room on the constraint. It is the standard way to rank which limits actually mattered. It is an exposure or opportunity measure, not cash that changes hands.

The exclusion list

These never enter a watchlist, a statistic or a training set:

  • Swamped rows, where the absolute right-hand side or the absolute headroom is at or above about 9,500. The equation is disabled, not tight.
  • INCONSISTENT rows.
  • Ephemeral #-prefixed ramping ids, regenerated daily.

Exclusions matter as much as features. Every one of these will otherwise look like a signal.

Right-hand-side term types (SPD_TYPE)

Taught in 9. Inside the right-hand side.

Every row of GENERICCONSTRAINTRHS carries an SPD_TYPE that says what kind of thing the term is.

TypeMeaningPublic?
CConstant, with the value carried in FACTORyes
TScheduled generator MW, the "trader" term; SPD_ID is written DUID.CONNECTIONPOINTIDyes, from DISPATCH_UNIT_SCADA
IInterconnector flowyes, metered flow
RRegion demandyes
A / SSCADA analog / SCADA statusno, falls back to DEFAULTVALUE
EEntered value: ratings, forecastsno, falls back to DEFAULTVALUE
GGroup of terms; members aggregate into the G-term whose TERMID they namestructural
BIf, then, else branch, using PARAMETERTERM1, 2 and 3structural
UStack operation: POW2, SQRT, STEP, ADD, MUL, MAX, MIN, and the blank-operation scale stepstructural
XGeneric equation reference; SPD_ID is an EQUATIONID in GENERICEQUATIONRHSstructural
WSwitch-run status (the Basslink second NEMDE run)no
M / NMNSP maximum / minimum bid availabilityno

Terms process in TERMID order against a stack whose elements sum to the final right-hand side. FACTOR multiplies the operator result; DEFAULTVALUE applies when the data source is unavailable. Pre-dispatch replaces SCADA feedback terms with forecast-based ones, which is what the SCOPE column (DS versus PD) selects between.

How far this was verified, 2026-07

Over 12 sampled live intervals and 11,762 constraint-interval points: every point whose leaves all resolved from public data matched the published right-hand side within $0.50 (340 points across 29 constraints, most exact to the cent), as did all 120 static-right-hand-side points, and no tree hit an unsupported operation. The 717 constraints relying on SCADA or entered leaves evaluate approximately from DEFAULTVALUEs and were flagged rather than trusted.

A worked thermal feedback constraint

Taught in 3. Anatomy of an equation and 9. Inside the right-hand side.

N>>NIL_70_71 limits the Mt Piper to Wallerawang 70 line for overload on a trip of line 71.

1.0 x MtPiper + 0.4285 x BW3,4 + 0.2962 x BW1,2 + 0.2828 x GullenRange - 0.2719 x NSW1-QLD1 + 0.241 x VIC1-NSW1 + 0.2407 x LowerTumut + 0.0939 x Shoalhaven<=RHS

And the right-hand side is the feedback form: rating (an E term) minus the monitored flow (an A term) minus 0.926 times the tripped line's flow (another A term) minus a 30 MW operating margin, the whole thing scaled by 2.462, plus the current values of the left-hand-side terms.

Two things follow. The equation is fully co-optimised, hence the doubled >>. And because the right-hand side reads current flows back in, the headroom you compute from a stale snapshot is not the headroom NEMDE saw.