Conversation
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.
This was referenced Sep 28, 2026
m-bossart
marked this pull request as draft
September 28, 2026 21:27
Contributor
Author
|
Based on discussion on 9/28: Explore design where the voltage set points are optional and live on the buses |
Contributor
Author
|
Closed in favor of #71, will return to the design for adding remote voltage control in a separate PR |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
ThermalStandard,HydroTurbine,RenewableDispatch,Source,SynchronousCondenser, storage, …) getsremote_regulated_bus_id, plusvoltage_setpointwith itsvoltage_setpoint_unitsbasis.SwitchedAdmittanceandFACTSControlDevicereplaceregulated_bus_numberwithremote_regulated_bus_id.TwoTerminalVSCLinereplacesremote_bus_control_from/towithremote_regulated_bus_id_from/to. Null alwaysmeans the device's own bus, and a value equal to the own bus is rejected.
regulated_bus_numberbecomesregulated_bus_idplusregulated_bus_side(TransformerRegulatedBusSide), replacing the sign of CONT, andload_drop_compensationcarries CR + jCX with units.rectifier/inverter_commutating_bus_idandrectifier/inverter_tap_transformer_id.VoltageDroopControl(the Q–V characteristic with its deadband, in kV or per unit) andReactivePowerSharing(RMPCT shares with no characteristic). Membership, per-member weight and the converterterminal (
VoltageControlTerminal) live in a newvoltage_control_associationsarray on the system document, one row per (control, member), defaulting to empty so existing documents stay valid.units.jsongains per-unitImpedance;check_psy_parity.pymaps the new id references and association rows to their PowerSystems fields.Breaking
Renames on
TransformerCircuit,SwitchedAdmittance,FACTSControlDeviceandTwoTerminalVSCLine;rmpct_from/toare 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-controlbranches in[sources], and each pin moves back tomainorpsy6as its dependency merges.Depends on: nothing; this PR goes first.