Skip to content

Class: BusRecord

Bus data record for DistOPF three-phase distribution OPF.

URI: distopf:BusRecord

 classDiagram
    class BusRecord
    click BusRecord href "../BusRecord/"
      BusRecord : bus_type

      BusRecord : cvr_p

      BusRecord : cvr_q

      BusRecord : has_cap

      BusRecord : has_gen

      BusRecord : has_load

      BusRecord : id

      BusRecord : latitude

      BusRecord : load_shape

      BusRecord : longitude

      BusRecord : name

      BusRecord : phases

      BusRecord : pl_a

      BusRecord : pl_b

      BusRecord : pl_c

      BusRecord : ql_a

      BusRecord : ql_b

      BusRecord : ql_c

      BusRecord : s_base

      BusRecord : v_a

      BusRecord : v_b

      BusRecord : v_c

      BusRecord : v_ln_base

      BusRecord : v_max

      BusRecord : v_min

Slots

Name Cardinality and Range Description Inheritance
id 1
Integer
Bus integer index (one-based row number) direct
name 0..1
String
Bus name label (matches the original feeder bus number) direct
pl_a 0..1
Float
Phase A active load in per-unit (base s_base) direct
ql_a 0..1
Float
Phase A reactive load in per-unit (base s_base) direct
pl_b 0..1
Float
Phase B active load in per-unit (base s_base) direct
ql_b 0..1
Float
Phase B reactive load in per-unit (base s_base) direct
pl_c 0..1
Float
Phase C active load in per-unit (base s_base) direct
ql_c 0..1
Float
Phase C reactive load in per-unit (base s_base) direct
bus_type 0..1
String
Bus type (SWING = slack bus, PQ = load bus) direct
v_a 0..1
Float
Phase A initial voltage magnitude in per-unit (base v_ln_base) direct
v_b 0..1
Float
Phase B initial voltage magnitude in per-unit (base v_ln_base) direct
v_c 0..1
Float
Phase C initial voltage magnitude in per-unit (base v_ln_base) direct
v_ln_base 0..1
Float
Line-to-neutral base voltage, in volts direct
s_base 0..1
Float
Apparent power base, in volt-amperes direct
v_min 0..1
Float
Minimum voltage magnitude limit, in per-unit direct
v_max 0..1
Float
Maximum voltage magnitude limit, in per-unit direct
cvr_p 0..1
Float
Conservation Voltage Reduction (CVR) active power coefficient direct
cvr_q 0..1
Float
Conservation Voltage Reduction (CVR) reactive power coefficient direct
phases 0..1
String
Active phases at this bus (abc, a, b, c, ab, ac, bc) direct
has_gen 0..1
Boolean
True if a generator is connected at this bus direct
has_load 0..1
Boolean
True if a load is connected at this bus direct
has_cap 0..1
Boolean
True if a capacitor is connected at this bus direct
latitude 0..1
Float
Geographic latitude, in degrees direct
longitude 0..1
Float
Geographic longitude, in degrees direct
load_shape 0..1
String
Name of the load-shape profile applied to this bus direct

Usages

used by used in type used
DistopfModel bus_records range BusRecord

Comments

  • DistOPF BusRecord maps primarily to a CIM ConnectivityNode, with an associated BaseVoltage/VoltageLevel/Substation created (or reused) for the bus's base voltage, and an optional EnergyConsumer when the bus carries load. Import creates all of these from a single record. Export starts from the ConnectivityNode and traverses its Terminals to recover load, generation, and capacitor presence.

Identifier and Mapping Information

Schema Source

  • from schema: https://gridappsd.org/cimhub/distopf

Mappings

Mapping Type Mapped Value
self distopf:BusRecord
native distopf:BusRecord
exact cim:ConnectivityNode

LinkML Source

Direct

name: BusRecord
description: Bus data record for DistOPF three-phase distribution OPF.
comments:
- DistOPF BusRecord maps primarily to a CIM ConnectivityNode, with an associated BaseVoltage/VoltageLevel/Substation
  created (or reused) for the bus's base voltage, and an optional EnergyConsumer when
  the bus carries load. Import creates all of these from a single record. Export starts
  from the ConnectivityNode and traverses its Terminals to recover load, generation,
  and capacitor presence.
from_schema: https://gridappsd.org/cimhub/distopf
exact_mappings:
- cim:ConnectivityNode
attributes:
  id:
    name: id
    annotations:
      order:
        tag: order
        value: 1
      value_type:
        tag: value_type
        value: int
      separator:
        tag: separator
        value: ','
    description: Bus integer index (one-based row number).
    comments:
    - 'DistOPF-only: a row index used to key this record and resolved by branch/generator/capacitor/battery
      records via fb/tb. Not stored on the CIM ConnectivityNode, which is identified
      by its own mRID. Export assigns fresh 1-based indices to ConnectivityNodes in
      traversal order, so round-tripped indices are not guaranteed to match the original
      import.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    identifier: true
    domain_of:
    - BusRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    - RegulatorRecord
    range: integer
    required: true
  name:
    name: name
    annotations:
      order:
        tag: order
        value: 2
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Bus name label (matches the original feeder bus number).
    comments:
    - 'Direct name mapping in both directions: name  ConnectivityNode.name.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    exact_mappings:
    - cim:IdentifiedObject.name
    rank: 1000
    ifabsent: string("")
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    range: string
    required: false
  pl_a:
    name: pl_a
    annotations:
      order:
        tag: order
        value: 3
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase A active load in per-unit (base s_base).
    comments:
    - 'Import: pl_a, pl_b, and pl_c are summed and converted to a single EnergyConsumer.p
      = (pl_a + pl_b + pl_c) × s_base (per-unit to watts); there is no per-phase EnergyConsumerPhase
      created, so the load is not split back out per phase on the CIM side. Export:
      pl_a = EnergyConsumerPhase(phase=A).p / s_base when per-phase children exist
      on the connected EnergyConsumer; otherwise the total EnergyConsumer.p / s_base
      is written to pl_a alone (pl_b and pl_c are left at zero).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:EnergyConsumerPhase.p
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_a:
    name: ql_a
    annotations:
      order:
        tag: order
        value: 4
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase A reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_a (reactive power): see the pl_a comment for
      the full EnergyConsumer.q derivation.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:EnergyConsumerPhase.q
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  pl_b:
    name: pl_b
    annotations:
      order:
        tag: order
        value: 5
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase B active load in per-unit (base s_base).
    comments:
    - 'Import: included in the pl_a+pl_b+pl_c sum written to EnergyConsumer.p (see
      the pl_a comment). Export: pl_b = EnergyConsumerPhase(phase=B).p / s_base when
      per-phase children exist; otherwise left at zero (the fallback total goes to
      pl_a only).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_b:
    name: ql_b
    annotations:
      order:
        tag: order
        value: 6
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase B reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_b (reactive power): see the pl_b and pl_a
      comments.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  pl_c:
    name: pl_c
    annotations:
      order:
        tag: order
        value: 7
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase C active load in per-unit (base s_base).
    comments:
    - 'Import: included in the pl_a+pl_b+pl_c sum written to EnergyConsumer.p (see
      the pl_a comment). Export: pl_c = EnergyConsumerPhase(phase=C).p / s_base when
      per-phase children exist; otherwise left at zero (the fallback total goes to
      pl_a only).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_c:
    name: ql_c
    annotations:
      order:
        tag: order
        value: 8
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase C reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_c (reactive power): see the pl_c and pl_a
      comments.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  bus_type:
    name: bus_type
    annotations:
      order:
        tag: order
        value: 9
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Bus type (SWING = slack bus, PQ = load bus).
    comments:
    - 'Not used on import (the bus/slack designation is not derived from this field).
      Export: bus_type = "SWING" when the ConnectivityNode has a Terminal connected
      to an EnergySource, otherwise "PQ"  i.e. the swing bus is detected structurally,
      not read from a dedicated CIM attribute.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergySource.Terminals
    rank: 1000
    ifabsent: string("PQ")
    domain_of:
    - BusRecord
    range: string
    required: false
  v_a:
    name: v_a
    annotations:
      order:
        tag: order
        value: 10
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase A initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_b:
    name: v_b
    annotations:
      order:
        tag: order
        value: 11
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase B initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_c:
    name: v_c
    annotations:
      order:
        tag: order
        value: 12
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase C initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_ln_base:
    name: v_ln_base
    annotations:
      order:
        tag: order
        value: 13
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 10
      separator:
        tag: separator
        value: ','
    description: Line-to-neutral base voltage, in volts.
    todos:
    - 'Import and export disagree on whether BaseVoltage.nominalVoltage is line-to-neutral
      or line-to-line: import stores v_ln_base unconverted, but export divides by
      √3 assuming a line-to-line value. This asymmetry breaks round-tripping and should
      be reconciled.'
    comments:
    - 'Import: BaseVoltage.nominalVoltage = v_ln_base directly (both are line-to-neutral
      volts; the importer does not apply a √3 factor). Export: v_ln_base = nominalVoltage
      / √3, resolved by traversing ConnectivityNode  Terminal  ConductingEquipment
       BaseVoltage (or, for a transformer terminal, PowerTransformerEnd.ratedU /
      √3)  i.e. export treats the stored CIM value as phase-phase and converts to
      phase-neutral, which is the opposite convention from import.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:BaseVoltage.nominalVoltage
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    - BranchRecord
    range: float
    required: false
    unit:
      ucum_code: V
  s_base:
    name: s_base
    annotations:
      order:
        tag: order
        value: 14
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 1
      separator:
        tag: separator
        value: ','
    description: Apparent power base, in volt-amperes.
    todos:
    - Export hard-codes s_base = 1e6 (_S_BASE) rather than resolving a per-bus base
      voltage/power combination.
    comments:
    - DistOPF-only scaling constant used to convert the per-unit load fields (pl_*/ql_*)
      to and from CIM's SI-unit power values; not itself stored on the CIM object.
      Both import and export currently use a fixed 1e6 VA (1 MVA) base regardless
      of this field's value.
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1000000.0)
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    range: float
    required: false
    unit:
      ucum_code: VA
  v_min:
    name: v_min
    annotations:
      order:
        tag: order
        value: 15
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Minimum voltage magnitude limit, in per-unit.
    todos:
    - No CIM equivalent for a per-bus minimum voltage limit; the closest CIM concept
      (an OperationalLimit on a VoltageLimit) is not wired up.
    comments:
    - 'DistOPF-only (N/A): OPF voltage constraint lower bound; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.95)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_max:
    name: v_max
    annotations:
      order:
        tag: order
        value: 16
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Maximum voltage magnitude limit, in per-unit.
    todos:
    - No CIM equivalent for a per-bus maximum voltage limit; the closest CIM concept
      (an OperationalLimit on a VoltageLimit) is not wired up.
    comments:
    - 'DistOPF-only (N/A): OPF voltage constraint upper bound; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.05)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  cvr_p:
    name: cvr_p
    annotations:
      order:
        tag: order
        value: 17
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Conservation Voltage Reduction (CVR) active power coefficient.
    todos:
    - No CIM equivalent for a per-bus CVR active-power coefficient (the closest concept,
      EnergyConsumer.pVoltageExponent, is not wired up); would need a converter to
      roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF voltage-dependent load coefficient; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
  cvr_q:
    name: cvr_q
    annotations:
      order:
        tag: order
        value: 18
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Conservation Voltage Reduction (CVR) reactive power coefficient.
    todos:
    - No CIM equivalent for a per-bus CVR reactive-power coefficient (the closest
      concept, EnergyConsumer.qVoltageExponent, is not wired up); would need a converter
      to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF voltage-dependent load coefficient; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
  phases:
    name: phases
    annotations:
      order:
        tag: order
        value: 19
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Active phases at this bus (abc, a, b, c, ab, ac, bc).
    comments:
    - 'Not used on import. Export: derived from the set of phases with an EnergyConsumerPhase
      child on a connected EnergyConsumer; defaults to "abc" when no per-phase children
      are present (even if the load is genuinely single-phase  see the pl_a family
      of comments).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergyConsumerPhase.phase
    rank: 1000
    ifabsent: string("abc")
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    - RegulatorRecord
    range: string
    required: false
  has_gen:
    name: has_gen
    annotations:
      order:
        tag: order
        value: 20
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a generator is connected at this bus.
    comments:
    - 'Not used on import (generator equipment is created separately by the GeneratorRecord
      converter and linked by ConnectivityNode). Export: has_gen = True if any Terminal
      on this ConnectivityNode connects to a SynchronousMachine or PowerElectronicsConnection.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:SynchronousMachine
    - cim:PowerElectronicsConnection
    rank: 1000
    ifabsent: 'false'
    domain_of:
    - BusRecord
    range: boolean
    required: false
  has_load:
    name: has_load
    annotations:
      order:
        tag: order
        value: 21
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a load is connected at this bus.
    comments:
    - 'Import: has_load gates whether an EnergyConsumer is created for this bus at
      all. Export: has_load = True if any Terminal on this ConnectivityNode connects
      to an EnergyConsumer.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergyConsumer
    rank: 1000
    ifabsent: 'false'
    domain_of:
    - BusRecord
    range: boolean
    required: false
  has_cap:
    name: has_cap
    annotations:
      order:
        tag: order
        value: 22
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a capacitor is connected at this bus.
    comments:
    - 'Not used on import (capacitor equipment is created separately by the CapacitorRecord
      converter and linked by ConnectivityNode). Export: has_cap = True if any Terminal
      on this ConnectivityNode connects to a LinearShuntCompensator.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:LinearShuntCompensator
    rank: 1000
    ifabsent: 'false'
    domain_of:
    - BusRecord
    range: boolean
    required: false
  latitude:
    name: latitude
    annotations:
      order:
        tag: order
        value: 23
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 4
      separator:
        tag: separator
        value: ','
    description: Geographic latitude, in degrees.
    todos:
    - No CIM equivalent wired up. CIM's PositionPoint (via Location) could carry this,
      but ConnectivityNode does not currently traverse to one.
    comments:
    - 'DistOPF-only (N/A): geographic coordinate; not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: deg
  longitude:
    name: longitude
    annotations:
      order:
        tag: order
        value: 24
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 4
      separator:
        tag: separator
        value: ','
    description: Geographic longitude, in degrees.
    todos:
    - No CIM equivalent wired up. CIM's PositionPoint (via Location) could carry this,
      but ConnectivityNode does not currently traverse to one.
    comments:
    - 'DistOPF-only (N/A): geographic coordinate; not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: deg
  load_shape:
    name: load_shape
    annotations:
      order:
        tag: order
        value: 25
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ''
    description: Name of the load-shape profile applied to this bus.
    todos:
    - No CIM equivalent is wired up; implementing this depends on the ScheduleRecord
      → RegularIntervalSchedule converter described in case/schedule.yaml's class-level
      todo.
    comments:
    - 'DistOPF-only: names a row in the separate ScheduleRecord table (see case/schedule.yaml),
      which itself has no CIM converter yet. Not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:RegularIntervalSchedule
    rank: 1000
    ifabsent: string("default")
    domain_of:
    - BusRecord
    range: string
    required: false

Induced

name: BusRecord
description: Bus data record for DistOPF three-phase distribution OPF.
comments:
- DistOPF BusRecord maps primarily to a CIM ConnectivityNode, with an associated BaseVoltage/VoltageLevel/Substation
  created (or reused) for the bus's base voltage, and an optional EnergyConsumer when
  the bus carries load. Import creates all of these from a single record. Export starts
  from the ConnectivityNode and traverses its Terminals to recover load, generation,
  and capacitor presence.
from_schema: https://gridappsd.org/cimhub/distopf
exact_mappings:
- cim:ConnectivityNode
attributes:
  id:
    name: id
    annotations:
      order:
        tag: order
        value: 1
      value_type:
        tag: value_type
        value: int
      separator:
        tag: separator
        value: ','
    description: Bus integer index (one-based row number).
    comments:
    - 'DistOPF-only: a row index used to key this record and resolved by branch/generator/capacitor/battery
      records via fb/tb. Not stored on the CIM ConnectivityNode, which is identified
      by its own mRID. Export assigns fresh 1-based indices to ConnectivityNodes in
      traversal order, so round-tripped indices are not guaranteed to match the original
      import.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    identifier: true
    owner: BusRecord
    domain_of:
    - BusRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    - RegulatorRecord
    range: integer
    required: true
  name:
    name: name
    annotations:
      order:
        tag: order
        value: 2
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Bus name label (matches the original feeder bus number).
    comments:
    - 'Direct name mapping in both directions: name  ConnectivityNode.name.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    exact_mappings:
    - cim:IdentifiedObject.name
    rank: 1000
    ifabsent: string("")
    owner: BusRecord
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    range: string
    required: false
  pl_a:
    name: pl_a
    annotations:
      order:
        tag: order
        value: 3
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase A active load in per-unit (base s_base).
    comments:
    - 'Import: pl_a, pl_b, and pl_c are summed and converted to a single EnergyConsumer.p
      = (pl_a + pl_b + pl_c) × s_base (per-unit to watts); there is no per-phase EnergyConsumerPhase
      created, so the load is not split back out per phase on the CIM side. Export:
      pl_a = EnergyConsumerPhase(phase=A).p / s_base when per-phase children exist
      on the connected EnergyConsumer; otherwise the total EnergyConsumer.p / s_base
      is written to pl_a alone (pl_b and pl_c are left at zero).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:EnergyConsumerPhase.p
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_a:
    name: ql_a
    annotations:
      order:
        tag: order
        value: 4
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase A reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_a (reactive power): see the pl_a comment for
      the full EnergyConsumer.q derivation.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:EnergyConsumerPhase.q
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  pl_b:
    name: pl_b
    annotations:
      order:
        tag: order
        value: 5
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase B active load in per-unit (base s_base).
    comments:
    - 'Import: included in the pl_a+pl_b+pl_c sum written to EnergyConsumer.p (see
      the pl_a comment). Export: pl_b = EnergyConsumerPhase(phase=B).p / s_base when
      per-phase children exist; otherwise left at zero (the fallback total goes to
      pl_a only).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_b:
    name: ql_b
    annotations:
      order:
        tag: order
        value: 6
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase B reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_b (reactive power): see the pl_b and pl_a
      comments.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  pl_c:
    name: pl_c
    annotations:
      order:
        tag: order
        value: 7
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase C active load in per-unit (base s_base).
    comments:
    - 'Import: included in the pl_a+pl_b+pl_c sum written to EnergyConsumer.p (see
      the pl_a comment). Export: pl_c = EnergyConsumerPhase(phase=C).p / s_base when
      per-phase children exist; otherwise left at zero (the fallback total goes to
      pl_a only).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  ql_c:
    name: ql_c
    annotations:
      order:
        tag: order
        value: 8
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 16
      separator:
        tag: separator
        value: ','
    description: Phase C reactive load in per-unit (base s_base).
    comments:
    - 'Same import/export formula as pl_c (reactive power): see the pl_c and pl_a
      comments.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  bus_type:
    name: bus_type
    annotations:
      order:
        tag: order
        value: 9
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Bus type (SWING = slack bus, PQ = load bus).
    comments:
    - 'Not used on import (the bus/slack designation is not derived from this field).
      Export: bus_type = "SWING" when the ConnectivityNode has a Terminal connected
      to an EnergySource, otherwise "PQ"  i.e. the swing bus is detected structurally,
      not read from a dedicated CIM attribute.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergySource.Terminals
    rank: 1000
    ifabsent: string("PQ")
    owner: BusRecord
    domain_of:
    - BusRecord
    range: string
    required: false
  v_a:
    name: v_a
    annotations:
      order:
        tag: order
        value: 10
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase A initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_b:
    name: v_b
    annotations:
      order:
        tag: order
        value: 11
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase B initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_c:
    name: v_c
    annotations:
      order:
        tag: order
        value: 12
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Phase C initial voltage magnitude in per-unit (base v_ln_base).
    todos:
    - No CIM equivalent for a per-phase OPF initial voltage guess on ConnectivityNode;
      would need a CIM extension (or a SvVoltage state-variable link) to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF initial-guess/flat-start voltage; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_ln_base:
    name: v_ln_base
    annotations:
      order:
        tag: order
        value: 13
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 10
      separator:
        tag: separator
        value: ','
    description: Line-to-neutral base voltage, in volts.
    todos:
    - 'Import and export disagree on whether BaseVoltage.nominalVoltage is line-to-neutral
      or line-to-line: import stores v_ln_base unconverted, but export divides by
      √3 assuming a line-to-line value. This asymmetry breaks round-tripping and should
      be reconciled.'
    comments:
    - 'Import: BaseVoltage.nominalVoltage = v_ln_base directly (both are line-to-neutral
      volts; the importer does not apply a √3 factor). Export: v_ln_base = nominalVoltage
      / √3, resolved by traversing ConnectivityNode  Terminal  ConductingEquipment
       BaseVoltage (or, for a transformer terminal, PowerTransformerEnd.ratedU /
      √3)  i.e. export treats the stored CIM value as phase-phase and converts to
      phase-neutral, which is the opposite convention from import.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    close_mappings:
    - cim:BaseVoltage.nominalVoltage
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    - BranchRecord
    range: float
    required: false
    unit:
      ucum_code: V
  s_base:
    name: s_base
    annotations:
      order:
        tag: order
        value: 14
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 1
      separator:
        tag: separator
        value: ','
    description: Apparent power base, in volt-amperes.
    todos:
    - Export hard-codes s_base = 1e6 (_S_BASE) rather than resolving a per-bus base
      voltage/power combination.
    comments:
    - DistOPF-only scaling constant used to convert the per-unit load fields (pl_*/ql_*)
      to and from CIM's SI-unit power values; not itself stored on the CIM object.
      Both import and export currently use a fixed 1e6 VA (1 MVA) base regardless
      of this field's value.
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1000000.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    range: float
    required: false
    unit:
      ucum_code: VA
  v_min:
    name: v_min
    annotations:
      order:
        tag: order
        value: 15
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Minimum voltage magnitude limit, in per-unit.
    todos:
    - No CIM equivalent for a per-bus minimum voltage limit; the closest CIM concept
      (an OperationalLimit on a VoltageLimit) is not wired up.
    comments:
    - 'DistOPF-only (N/A): OPF voltage constraint lower bound; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.95)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  v_max:
    name: v_max
    annotations:
      order:
        tag: order
        value: 16
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Maximum voltage magnitude limit, in per-unit.
    todos:
    - No CIM equivalent for a per-bus maximum voltage limit; the closest CIM concept
      (an OperationalLimit on a VoltageLimit) is not wired up.
    comments:
    - 'DistOPF-only (N/A): OPF voltage constraint upper bound; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(1.05)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: pu
  cvr_p:
    name: cvr_p
    annotations:
      order:
        tag: order
        value: 17
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Conservation Voltage Reduction (CVR) active power coefficient.
    todos:
    - No CIM equivalent for a per-bus CVR active-power coefficient (the closest concept,
      EnergyConsumer.pVoltageExponent, is not wired up); would need a converter to
      roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF voltage-dependent load coefficient; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
  cvr_q:
    name: cvr_q
    annotations:
      order:
        tag: order
        value: 18
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 6
      separator:
        tag: separator
        value: ','
    description: Conservation Voltage Reduction (CVR) reactive power coefficient.
    todos:
    - No CIM equivalent for a per-bus CVR reactive-power coefficient (the closest
      concept, EnergyConsumer.qVoltageExponent, is not wired up); would need a converter
      to roundtrip.
    comments:
    - 'DistOPF-only (N/A): OPF voltage-dependent load coefficient; not read or written
      by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
  phases:
    name: phases
    annotations:
      order:
        tag: order
        value: 19
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ','
    description: Active phases at this bus (abc, a, b, c, ab, ac, bc).
    comments:
    - 'Not used on import. Export: derived from the set of phases with an EnergyConsumerPhase
      child on a connected EnergyConsumer; defaults to "abc" when no per-phase children
      are present (even if the load is genuinely single-phase  see the pl_a family
      of comments).'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergyConsumerPhase.phase
    rank: 1000
    ifabsent: string("abc")
    owner: BusRecord
    domain_of:
    - BusRecord
    - BranchRecord
    - GeneratorRecord
    - CapacitorRecord
    - BatteryRecord
    - RegulatorRecord
    range: string
    required: false
  has_gen:
    name: has_gen
    annotations:
      order:
        tag: order
        value: 20
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a generator is connected at this bus.
    comments:
    - 'Not used on import (generator equipment is created separately by the GeneratorRecord
      converter and linked by ConnectivityNode). Export: has_gen = True if any Terminal
      on this ConnectivityNode connects to a SynchronousMachine or PowerElectronicsConnection.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:SynchronousMachine
    - cim:PowerElectronicsConnection
    rank: 1000
    ifabsent: 'false'
    owner: BusRecord
    domain_of:
    - BusRecord
    range: boolean
    required: false
  has_load:
    name: has_load
    annotations:
      order:
        tag: order
        value: 21
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a load is connected at this bus.
    comments:
    - 'Import: has_load gates whether an EnergyConsumer is created for this bus at
      all. Export: has_load = True if any Terminal on this ConnectivityNode connects
      to an EnergyConsumer.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:EnergyConsumer
    rank: 1000
    ifabsent: 'false'
    owner: BusRecord
    domain_of:
    - BusRecord
    range: boolean
    required: false
  has_cap:
    name: has_cap
    annotations:
      order:
        tag: order
        value: 22
      value_type:
        tag: value_type
        value: bool
      separator:
        tag: separator
        value: ','
    description: True if a capacitor is connected at this bus.
    comments:
    - 'Not used on import (capacitor equipment is created separately by the CapacitorRecord
      converter and linked by ConnectivityNode). Export: has_cap = True if any Terminal
      on this ConnectivityNode connects to a LinearShuntCompensator.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:LinearShuntCompensator
    rank: 1000
    ifabsent: 'false'
    owner: BusRecord
    domain_of:
    - BusRecord
    range: boolean
    required: false
  latitude:
    name: latitude
    annotations:
      order:
        tag: order
        value: 23
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 4
      separator:
        tag: separator
        value: ','
    description: Geographic latitude, in degrees.
    todos:
    - No CIM equivalent wired up. CIM's PositionPoint (via Location) could carry this,
      but ConnectivityNode does not currently traverse to one.
    comments:
    - 'DistOPF-only (N/A): geographic coordinate; not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: deg
  longitude:
    name: longitude
    annotations:
      order:
        tag: order
        value: 24
      value_type:
        tag: value_type
        value: float
      precision:
        tag: precision
        value: 4
      separator:
        tag: separator
        value: ','
    description: Geographic longitude, in degrees.
    todos:
    - No CIM equivalent wired up. CIM's PositionPoint (via Location) could carry this,
      but ConnectivityNode does not currently traverse to one.
    comments:
    - 'DistOPF-only (N/A): geographic coordinate; not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    rank: 1000
    ifabsent: float(0.0)
    owner: BusRecord
    domain_of:
    - BusRecord
    range: float
    required: false
    unit:
      ucum_code: deg
  load_shape:
    name: load_shape
    annotations:
      order:
        tag: order
        value: 25
      value_type:
        tag: value_type
        value: string
      quote:
        tag: quote
        value: false
      separator:
        tag: separator
        value: ''
    description: Name of the load-shape profile applied to this bus.
    todos:
    - No CIM equivalent is wired up; implementing this depends on the ScheduleRecord
      → RegularIntervalSchedule converter described in case/schedule.yaml's class-level
      todo.
    comments:
    - 'DistOPF-only: names a row in the separate ScheduleRecord table (see case/schedule.yaml),
      which itself has no CIM converter yet. Not read or written by the CIM converters.'
    from_schema: https://gridappsd.org/cimhub/distopf/classes/bus
    related_mappings:
    - cim:RegularIntervalSchedule
    rank: 1000
    ifabsent: string("default")
    owner: BusRecord
    domain_of:
    - BusRecord
    range: string
    required: false