Skip to content

Remote and shared voltage control - #67

Closed
m-bossart wants to merge 6 commits into
mainfrom
mb/remote-control
Closed

m-bossart wants to merge 6 commits into
mainfrom
mb/remote-control

Conversation

@m-bossart

@m-bossart m-bossart commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Adds the PSS/E remote and shared voltage control data to the schemas so that IREG/VS, RMPCT, CONT with its sign, CR + jCX, the LCC commutating buses and tap transformers, and voltage droop controllers round-trip through the OpenAPI document.

What changes

  • Remote regulated bus references. Every voltage-regulating injector (ThermalStandard, HydroTurbine, RenewableDispatch, Source, SynchronousCondenser, storage, …) gets remote_regulated_bus_id, plus voltage_setpoint with its
    voltage_setpoint_units basis. SwitchedAdmittance and FACTSControlDevice replace regulated_bus_number with remote_regulated_bus_id. TwoTerminalVSCLine replaces remote_bus_control_from/to with remote_regulated_bus_id_from/to. Null always
    means the device's own bus, and a value equal to the own bus is rejected.
  • Transformer circuits. regulated_bus_number becomes regulated_bus_id plus regulated_bus_side (TransformerRegulatedBusSide), replacing the sign of CONT, and load_drop_compensation carries CR + jCX with units.
  • LCC lines. rectifier/inverter_commutating_bus_id and rectifier/inverter_tap_transformer_id.
  • Control groups as supplemental attributes. VoltageDroopControl (the Q–V characteristic with its deadband, in kV or per unit) and ReactivePowerSharing (RMPCT shares with no characteristic). Membership, per-member weight and the converter
    terminal (VoltageControlTerminal) live in a new voltage_control_associations array on the system document, one row per (control, member), defaulting to empty so existing documents stay valid.
  • units.json gains per-unit Impedance; check_psy_parity.py maps the new id references and association rows to their PowerSystems fields.

Breaking

Renames on TransformerCircuit, SwitchedAdmittance, FACTSControlDevice and TwoTerminalVSCLine; rmpct_from/to are removed from the VSC line in favor of association rows. No document written today carries these fields yet.

Stack

Merge in this order.
The Julia branches pin each other's mb/remote-control branches in [sources], and each pin moves back to main or psy6 as its dependency merges.

Depends on: nothing; this PR goes first.

Devices that regulate voltage gain a nullable remote_regulated_bus_id (null
means the device's own bus) and generators gain a voltage_setpoint with its
unit basis. Transformer circuits replace the signed PSS/E CONT number with
regulated_bus_id, a nullable regulated_bus_side, and a load_drop_compensation
impedance. LCC lines reference their commutating buses and tap transformers by
id. The converter and VSC line rmpct fields move to per-member weights on the
new VoltageControlAssociation, which links devices to the new
VoltageDroopControl and ReactivePowerSharing supplemental attributes, and the
system document carries the rows in voltage_control_associations.

FACTSControlDevice.reactive_power_required becomes the solver-populated
reactive power discriminated by power_units, matching PowerSystems, and the
vocabulary registers pu for Impedance.
…e fields

Complex admittances (the transformers' magnetizing_shunt, FixedAdmittance.Y and
SwitchedAdmittance.Y_increase) were declared as Susceptance, the kind of their
imaginary part, because no kind existed for the whole value. Admittance now has
the admittance dimension with S and pu rows, and the PowerSystems parity check
accepts it in the :siemens family.
…connection_impedance as Impedance

Every other series impedance in the schemas is an r/x pair, and PSS/E carries
CR and CX as two fields, so the transformer circuit's load drop compensation
follows that shape with Resistance and Reactance kinds. HybridSystem's
interconnection_impedance is a complex impedance and now says so.
Eleven dynamics properties typed number or integer carried a string default.
The Julia and Python generators coerced it; the TypeScript generator emitted a
string default on a numeric zod field and the typecheck rejected it.
…NED member

The schemas' enums say 'not stated' with a sentinel member, never with a null
type, so regulated_bus_side and the association terminal follow
TransformerControlObjective: a plain enum reference defaulting to UNDEFINED.
…ields

The gate compared the schemas against psy6, which lacks the remote voltage
control fields, and reported every one of them as drift. It reads
mb/remote-control while both branches are open; the ref returns to psy6 once
PowerSystems merges.
@m-bossart

Copy link
Copy Markdown
Contributor Author

Based on discussion on 9/28: Explore design where the voltage set points are optional and live on the buses

@m-bossart

Copy link
Copy Markdown
Contributor Author

Closed in favor of #71, will return to the design for adding remote voltage control in a separate PR

@m-bossart m-bossart closed this Sep 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant