zepben.ewb 1.0.0b9__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. zepben/ewb/auth/client/zepben_token_fetcher.py +62 -42
  2. zepben/ewb/database/sqlite/common/base_cim_reader.py +7 -7
  3. zepben/ewb/database/sqlite/common/base_database_writer.py +2 -2
  4. zepben/ewb/database/sqlite/network/network_cim_reader.py +20 -20
  5. zepben/ewb/database/sqlite/network/network_database_reader.py +4 -2
  6. zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +5 -5
  7. zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +1 -1
  8. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +1 -1
  9. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +3 -3
  10. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +1 -1
  11. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +1 -1
  12. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +1 -1
  13. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +1 -1
  14. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +1 -1
  15. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +1 -1
  16. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +1 -1
  17. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +1 -1
  18. zepben/ewb/model/cim/iec61968/common/document.py +5 -5
  19. zepben/ewb/model/cim/iec61968/common/street_address.py +2 -2
  20. zepben/ewb/model/cim/iec61968/common/street_detail.py +8 -7
  21. zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +1 -1
  22. zepben/ewb/model/cim/iec61968/metering/meter.py +4 -2
  23. zepben/ewb/model/cim/iec61968/metering/usage_point.py +1 -1
  24. zepben/ewb/model/cim/iec61970/base/core/curve.py +2 -1
  25. zepben/ewb/model/cim/iec61970/base/core/identified_object.py +8 -3
  26. zepben/ewb/model/cim/iec61970/base/core/name_type.py +2 -2
  27. zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +2 -2
  28. zepben/ewb/model/cim/iec61970/base/meas/analog.py +3 -1
  29. zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +1 -1
  30. zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +1 -1
  31. zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +1 -1
  32. zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +1 -1
  33. zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +1 -1
  34. zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +1 -1
  35. zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +1 -1
  36. zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +4 -4
  37. zepben/ewb/services/common/translator/base_cim2proto.py +21 -9
  38. zepben/ewb/services/common/translator/base_proto2cim.py +13 -8
  39. zepben/ewb/services/customer/translator/customer_cim2proto.py +10 -10
  40. zepben/ewb/services/customer/translator/customer_proto2cim.py +9 -9
  41. zepben/ewb/services/diagram/translator/diagram_cim2proto.py +8 -8
  42. zepben/ewb/services/diagram/translator/diagram_proto2cim.py +8 -8
  43. zepben/ewb/services/network/tracing/phases/phase_inferrer.py +2 -2
  44. zepben/ewb/services/network/translator/network_cim2proto.py +451 -322
  45. zepben/ewb/services/network/translator/network_proto2cim.py +305 -287
  46. {zepben_ewb-1.0.0b9.dist-info → zepben_ewb-1.0.1.dist-info}/METADATA +4 -6
  47. {zepben_ewb-1.0.0b9.dist-info → zepben_ewb-1.0.1.dist-info}/RECORD +50 -50
  48. {zepben_ewb-1.0.0b9.dist-info → zepben_ewb-1.0.1.dist-info}/WHEEL +0 -0
  49. {zepben_ewb-1.0.0b9.dist-info → zepben_ewb-1.0.1.dist-info}/licenses/LICENSE +0 -0
  50. {zepben_ewb-1.0.0b9.dist-info → zepben_ewb-1.0.1.dist-info}/top_level.txt +0 -0
@@ -325,7 +325,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import
325
325
  from zepben.ewb.model.cim.iec61970.base.wires.winding_connection import *
326
326
  from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import *
327
327
  from zepben.ewb.services.common.translator.base_proto2cim import identified_object_to_cim, organisation_role_to_cim, document_to_cim, add_to_network_or_none, \
328
- bind_to_cim
328
+ bind_to_cim, get_nullable
329
329
  from zepben.ewb.services.common.translator.util import int_or_none, float_or_none, long_or_none, str_or_none, uint_or_none
330
330
  from zepben.ewb.services.network.network_service import NetworkService
331
331
  from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
@@ -341,11 +341,12 @@ def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optio
341
341
  # noinspection PyUnresolvedReferences
342
342
  cim = RelayInfo(
343
343
  mrid=pb.mrid(),
344
- curve_setting=str_or_none(pb.curveSetting),
345
- reclose_fast=None if pb.HasField("recloseFastNull") else pb.recloseFastSet,
344
+ curve_setting=get_nullable(pb, 'curveSetting'),
345
+ reclose_fast=get_nullable(pb, 'recloseFast'),
346
346
  reclose_delays=list(pb.recloseDelays)
347
347
  )
348
348
 
349
+
349
350
  asset_info_to_cim(pb.ai, cim, network_service)
350
351
  return cim
351
352
 
@@ -365,7 +366,7 @@ def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network
365
366
  """
366
367
  # noinspection PyUnresolvedReferences
367
368
  cim = PanDemandResponseFunction(mrid=pb.mrid())
368
- cim.appliance = int_or_none(pb.appliance)
369
+ cim.appliance = get_nullable(pb, 'appliance')
369
370
  cim.kind = EndDeviceFunctionKind(pb.kind)
370
371
  end_device_function_to_cim(pb.edf, cim, network_service)
371
372
 
@@ -445,15 +446,15 @@ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService)
445
446
  # noinspection PyUnresolvedReferences
446
447
  cim = DistanceRelay(
447
448
  mrid=pb.mrid(),
448
- backward_blind=float_or_none(pb.backwardBlind),
449
- backward_reach=float_or_none(pb.backwardReach),
450
- backward_reactance=float_or_none(pb.backwardReactance),
451
- forward_blind=float_or_none(pb.forwardBlind),
452
- forward_reach=float_or_none(pb.forwardReach),
453
- forward_reactance=float_or_none(pb.forwardReactance),
454
- operation_phase_angle1=float_or_none(pb.operationPhaseAngle1),
455
- operation_phase_angle2=float_or_none(pb.operationPhaseAngle2),
456
- operation_phase_angle3=float_or_none(pb.operationPhaseAngle3)
449
+ backward_blind=get_nullable(pb, 'backwardBlind'),
450
+ backward_reach=get_nullable(pb, 'backwardReach'),
451
+ backward_reactance=get_nullable(pb, 'backwardReactance'),
452
+ forward_blind=get_nullable(pb, 'forwardBlind'),
453
+ forward_reach=get_nullable(pb, 'forwardReach'),
454
+ forward_reactance=get_nullable(pb, 'forwardReactance'),
455
+ operation_phase_angle1=get_nullable(pb, 'operationPhaseAngle1'),
456
+ operation_phase_angle2=get_nullable(pb, 'operationPhaseAngle2'),
457
+ operation_phase_angle3=get_nullable(pb, 'operationPhaseAngle3'),
457
458
  )
458
459
 
459
460
  protection_relay_function_to_cim(pb.prf, cim, network_service)
@@ -461,17 +462,17 @@ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService)
461
462
 
462
463
 
463
464
  def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: ProtectionRelayFunction, network_service: NetworkService):
464
- cim.model = str_or_none(pb.model)
465
- cim.reclosing = None if pb.HasField("reclosingNull") else pb.reclosingSet
465
+ cim.model = get_nullable(pb, 'model')
466
+ cim.reclosing = get_nullable(pb, 'reclosing')
466
467
  for time_limit in pb.timeLimits:
467
468
  cim.add_time_limit(time_limit)
468
469
  for threshold in pb.thresholds:
469
470
  cim.add_threshold(relay_setting_to_cim(threshold))
470
- cim.relay_delay_time = float_or_none(pb.relayDelayTime)
471
+ cim.relay_delay_time = get_nullable(pb, 'relayDelayTime')
471
472
  cim.protection_kind = ProtectionKind(pb.protectionKind)
472
473
  for mrid in pb.protectedSwitchMRIDs:
473
474
  network_service.resolve_or_defer_reference(resolver.prf_protected_switch(cim), mrid)
474
- cim.directable = None if pb.HasField("directableNull") else pb.directableSet
475
+ cim.directable = get_nullable(pb, 'directable')
475
476
  cim.power_direction = PowerDirectionKind(pb.powerDirection)
476
477
  for mrid in pb.sensorMRIDs:
477
478
  network_service.resolve_or_defer_reference(resolver.prf_sensor(cim), mrid)
@@ -519,7 +520,7 @@ def protection_relay_system_to_cim(pb: PBProtectionRelaySystem, network_service:
519
520
 
520
521
  def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]:
521
522
  return RelaySetting(
522
- name=pb.name,
523
+ name=get_nullable(pb, 'name'),
523
524
  unit_symbol=unit_symbol_from_id(pb.unitSymbol),
524
525
  value=float_or_none(pb.value)
525
526
  )
@@ -551,10 +552,10 @@ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService
551
552
  # noinspection PyUnresolvedReferences
552
553
  cim = BatteryControl(
553
554
  mrid=pb.mrid(),
554
- charging_rate=float_or_none(pb.chargingRate),
555
- discharging_rate=float_or_none(pb.dischargingRate),
556
- reserve_percent=float_or_none(pb.reservePercent),
557
- control_mode=BatteryControlMode(pb.controlMode)
555
+ charging_rate=get_nullable(pb, 'chargingRate'),
556
+ discharging_rate=get_nullable(pb, 'dischargingRate'),
557
+ reserve_percent=get_nullable(pb, 'reservePercent'),
558
+ control_mode=BatteryControlMode(pb.controlMode),
558
559
  )
559
560
 
560
561
  regulating_control_to_cim(pb.rc, cim, network_service)
@@ -583,11 +584,11 @@ def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Op
583
584
  # noinspection PyUnresolvedReferences
584
585
  cim = NoLoadTest(
585
586
  mrid=pb.mrid(),
586
- energised_end_voltage=int_or_none(pb.energisedEndVoltage),
587
- exciting_current=float_or_none(pb.excitingCurrent),
588
- exciting_current_zero=float_or_none(pb.excitingCurrentZero),
589
- loss=int_or_none(pb.loss),
590
- loss_zero=int_or_none(pb.lossZero),
587
+ energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'),
588
+ exciting_current=get_nullable(pb, 'excitingCurrent'),
589
+ exciting_current_zero=get_nullable(pb, 'excitingCurrentZero'),
590
+ loss=get_nullable(pb, 'loss'),
591
+ loss_zero=get_nullable(pb, 'lossZero'),
591
592
  )
592
593
 
593
594
  transformer_test_to_cim(pb.tt, cim, network_service)
@@ -600,11 +601,11 @@ def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkServ
600
601
  # noinspection PyUnresolvedReferences
601
602
  cim = OpenCircuitTest(
602
603
  mrid=pb.mrid(),
603
- energised_end_step=int_or_none(pb.energisedEndStep),
604
- energised_end_voltage=int_or_none(pb.energisedEndVoltage),
605
- open_end_step=int_or_none(pb.openEndStep),
606
- open_end_voltage=int_or_none(pb.openEndVoltage),
607
- phase_shift=float_or_none(pb.phaseShift),
604
+ energised_end_step=get_nullable(pb, 'energisedEndStep'),
605
+ energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'),
606
+ open_end_step=get_nullable(pb, 'openEndStep'),
607
+ open_end_voltage=get_nullable(pb, 'openEndVoltage'),
608
+ phase_shift=get_nullable(pb, 'phaseShift'),
608
609
  )
609
610
 
610
611
  transformer_test_to_cim(pb.tt, cim, network_service)
@@ -640,16 +641,16 @@ def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkSe
640
641
  # noinspection PyUnresolvedReferences
641
642
  cim = ShortCircuitTest(
642
643
  mrid=pb.mrid(),
643
- current=float_or_none(pb.current),
644
- energised_end_step=int_or_none(pb.energisedEndStep),
645
- grounded_end_step=int_or_none(pb.groundedEndStep),
646
- leakage_impedance=float_or_none(pb.leakageImpedance),
647
- leakage_impedance_zero=float_or_none(pb.leakageImpedanceZero),
648
- loss=int_or_none(pb.loss),
649
- loss_zero=int_or_none(pb.lossZero),
650
- power=int_or_none(pb.power),
651
- voltage=float_or_none(pb.voltage),
652
- voltage_ohmic_part=float_or_none(pb.voltageOhmicPart),
644
+ current=get_nullable(pb, 'current'),
645
+ energised_end_step=get_nullable(pb, 'energisedEndStep'),
646
+ grounded_end_step=get_nullable(pb, 'groundedEndStep'),
647
+ leakage_impedance=get_nullable(pb, 'leakageImpedance'),
648
+ leakage_impedance_zero=get_nullable(pb, 'leakageImpedanceZero'),
649
+ loss=get_nullable(pb, 'loss'),
650
+ loss_zero=get_nullable(pb, 'lossZero'),
651
+ power=get_nullable(pb, 'power'),
652
+ voltage=get_nullable(pb, 'voltage'),
653
+ voltage_ohmic_part=get_nullable(pb, 'voltageOhmicPart'),
653
654
  )
654
655
 
655
656
  transformer_test_to_cim(pb.tt, cim, network_service)
@@ -662,10 +663,10 @@ def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: N
662
663
  # noinspection PyUnresolvedReferences
663
664
  cim = ShuntCompensatorInfo(
664
665
  mrid=pb.mrid(),
665
- max_power_loss=int_or_none(pb.maxPowerLoss),
666
- rated_current=int_or_none(pb.ratedCurrent),
667
- rated_reactive_power=int_or_none(pb.ratedReactivePower),
668
- rated_voltage=int_or_none(pb.ratedVoltage),
666
+ max_power_loss=get_nullable(pb, 'maxPowerLoss'),
667
+ rated_current=get_nullable(pb, 'ratedCurrent'),
668
+ rated_reactive_power=get_nullable(pb, 'ratedReactivePower'),
669
+ rated_voltage=get_nullable(pb, 'ratedVoltage'),
669
670
  )
670
671
 
671
672
  asset_info_to_cim(pb.ai, cim, network_service)
@@ -678,7 +679,7 @@ def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Opt
678
679
  # noinspection PyUnresolvedReferences
679
680
  cim = SwitchInfo(
680
681
  mrid=pb.mrid(),
681
- rated_interrupting_time=float_or_none(pb.ratedInterruptingTime)
682
+ rated_interrupting_time=get_nullable(pb, 'ratedInterruptingTime')
682
683
  )
683
684
 
684
685
  asset_info_to_cim(pb.ai, cim, network_service)
@@ -692,14 +693,14 @@ def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: Netwo
692
693
  cim = TransformerEndInfo(
693
694
  mrid=pb.mrid(),
694
695
  connection_kind=WindingConnection(pb.connectionKind),
695
- emergency_s=int_or_none(pb.emergencyS),
696
+ emergency_s=get_nullable(pb, 'emergencyS'),
696
697
  end_number=pb.endNumber,
697
- insulation_u=int_or_none(pb.insulationU),
698
- phase_angle_clock=int_or_none(pb.phaseAngleClock),
699
- r=float_or_none(pb.r),
700
- rated_s=int_or_none(pb.ratedS),
701
- rated_u=int_or_none(pb.ratedU),
702
- short_term_s=int_or_none(pb.shortTermS),
698
+ insulation_u=get_nullable(pb, 'insulationU'),
699
+ phase_angle_clock=get_nullable(pb, 'phaseAngleClock'),
700
+ r=get_nullable(pb, 'r'),
701
+ rated_s=get_nullable(pb, 'ratedS'),
702
+ rated_u=get_nullable(pb, 'ratedU'),
703
+ short_term_s=get_nullable(pb, 'shortTermS'),
703
704
  )
704
705
 
705
706
  network_service.resolve_or_defer_reference(resolver.transformer_tank_info(cim), pb.transformerTankInfoMRID)
@@ -728,14 +729,14 @@ def transformer_tank_info_to_cim(pb: PBTransformerTankInfo, network_service: Net
728
729
 
729
730
 
730
731
  def transformer_test_to_cim(pb: PBTransformerTest, cim: TransformerTest, network_service: NetworkService):
731
- cim.base_power = int_or_none(pb.basePower)
732
- cim.temperature = float_or_none(pb.temperature)
732
+ cim.base_power = get_nullable(pb, 'basePower')
733
+ cim.temperature = get_nullable(pb, 'temperature')
733
734
 
734
735
  identified_object_to_cim(pb.io, cim, network_service)
735
736
 
736
737
 
737
738
  def wire_info_to_cim(pb: PBWireInfo, cim: WireInfo, network_service: NetworkService):
738
- cim.rated_current = int_or_none(pb.ratedCurrent)
739
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
739
740
  cim.material = WireMaterialKind(pb.material)
740
741
 
741
742
  asset_info_to_cim(pb.ai, cim, network_service)
@@ -797,7 +798,7 @@ def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Op
797
798
  # noinspection PyUnresolvedReferences
798
799
  cim = Streetlight(
799
800
  mrid=pb.mrid(),
800
- light_rating=uint_or_none(pb.lightRating),
801
+ light_rating=get_nullable(pb, 'lightRating'),
801
802
  lamp_kind=StreetlightLampKind(pb.lampKind)
802
803
  )
803
804
 
@@ -834,27 +835,30 @@ def position_point_to_cim(pb: PBPositionPoint) -> Optional[PositionPoint]:
834
835
 
835
836
  def street_address_to_cim(pb: PBStreetAddress) -> Optional[StreetAddress]:
836
837
  return StreetAddress(
837
- postal_code=pb.postalCode,
838
+ postal_code=get_nullable(pb, 'postalCode'),
838
839
  town_detail=town_detail_to_cim(pb.townDetail) if pb.HasField("townDetail") else None,
839
- po_box=pb.poBox,
840
+ po_box=get_nullable(pb, 'poBox'),
840
841
  street_detail=street_detail_to_cim(pb.streetDetail) if pb.HasField("streetDetail") else None
841
842
  )
842
843
 
843
844
 
844
845
  def street_detail_to_cim(pb: PBStreetDetail) -> Optional[StreetDetail]:
845
846
  return StreetDetail(
846
- building_name=pb.buildingName,
847
- floor_identification=pb.floorIdentification,
848
- name=pb.name,
849
- number=pb.number,
850
- suite_number=pb.suiteNumber,
851
- type=pb.type,
852
- display_address=pb.displayAddress
847
+ building_name=get_nullable(pb, 'buildingName'),
848
+ floor_identification=get_nullable(pb, 'floorIdentification'),
849
+ name=get_nullable(pb, 'name'),
850
+ number=get_nullable(pb, 'number'),
851
+ suite_number=get_nullable(pb, 'suiteNumber'),
852
+ type=get_nullable(pb, 'type'),
853
+ display_address=get_nullable(pb, 'displayAddress'),
853
854
  )
854
855
 
855
856
 
856
857
  def town_detail_to_cim(pb: PBTownDetail) -> Optional[TownDetail]:
857
- return TownDetail(name=pb.name, state_or_province=pb.stateOrProvince)
858
+ return TownDetail(
859
+ name=get_nullable(pb, 'name'),
860
+ state_or_province=get_nullable(pb, 'stateOrProvince'),
861
+ )
858
862
 
859
863
 
860
864
  #####################################
@@ -867,18 +871,18 @@ def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_servic
867
871
  # noinspection PyUnresolvedReferences
868
872
  cim = CurrentTransformerInfo(
869
873
  mrid=pb.mrid(),
870
- accuracy_class=str_or_none(pb.accuracyClass),
871
- accuracy_limit=float_or_none(pb.accuracyLimit),
872
- core_count=int_or_none(pb.coreCount),
873
- ct_class=str_or_none(pb.ctClass),
874
- knee_point_voltage=int_or_none(pb.kneePointVoltage),
874
+ accuracy_class=get_nullable(pb, 'accuracyClass'),
875
+ accuracy_limit=get_nullable(pb, 'accuracyLimit'),
876
+ core_count=get_nullable(pb, 'coreCount'),
877
+ ct_class=get_nullable(pb, 'ctClass'),
878
+ knee_point_voltage=get_nullable(pb, 'kneePointVoltage'),
875
879
  max_ratio=ratio_to_cim(pb.maxRatio) if pb.HasField("maxRatio") else None,
876
880
  nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None,
877
- primary_ratio=float_or_none(pb.primaryRatio),
878
- rated_current=int_or_none(pb.ratedCurrent),
879
- secondary_fls_rating=int_or_none(pb.secondaryFlsRating),
880
- secondary_ratio=float_or_none(pb.secondaryRatio),
881
- usage=str_or_none(pb.usage)
881
+ primary_ratio=get_nullable(pb, 'primaryRatio'),
882
+ rated_current=get_nullable(pb, 'ratedCurrent'),
883
+ secondary_fls_rating=get_nullable(pb, 'secondaryFlsRating'),
884
+ secondary_ratio=get_nullable(pb, 'secondaryRatio'),
885
+ usage=get_nullable(pb, 'usage'),
882
886
  )
883
887
 
884
888
  asset_info_to_cim(pb.ai, cim, network_service)
@@ -891,12 +895,12 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se
891
895
  # noinspection PyUnresolvedReferences
892
896
  cim = PotentialTransformerInfo(
893
897
  mrid=pb.mrid(),
894
- accuracy_class=str_or_none(pb.accuracyClass),
898
+ accuracy_class=get_nullable(pb, 'accuracyClass'),
895
899
  nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None,
896
- primary_ratio=float_or_none(pb.primaryRatio),
897
- pt_class=str_or_none(pb.ptClass),
898
- rated_voltage=int_or_none(pb.ratedVoltage),
899
- secondary_ratio=float_or_none(pb.secondaryRatio)
900
+ primary_ratio=get_nullable(pb, 'primaryRatio'),
901
+ pt_class=get_nullable(pb, 'ptClass'),
902
+ rated_voltage=get_nullable(pb, 'ratedVoltage'),
903
+ secondary_ratio=get_nullable(pb, 'secondaryRatio'),
900
904
  )
901
905
 
902
906
  asset_info_to_cim(pb.ai, cim, network_service)
@@ -911,7 +915,10 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se
911
915
  @add_to_network_or_none
912
916
  def pole_to_cim(pb: PBPole, network_service: NetworkService) -> Optional[Pole]:
913
917
  # noinspection PyUnresolvedReferences
914
- cim = Pole(mrid=pb.mrid(), classification=pb.classification)
918
+ cim = Pole(
919
+ mrid=pb.mrid(),
920
+ classification=get_nullable(pb, 'classification')
921
+ )
915
922
 
916
923
  for mrid in pb.streetlightMRIDs:
917
924
  network_service.resolve_or_defer_reference(resolver.streetlights(cim), mrid)
@@ -983,10 +990,10 @@ def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Opt
983
990
  cim = UsagePoint(mrid=pb.mrid())
984
991
 
985
992
  network_service.resolve_or_defer_reference(resolver.usage_point_location(cim), pb.usagePointLocationMRID)
986
- cim.is_virtual = pb.isVirtual
987
- cim.connection_category = pb.connectionCategory if pb.connectionCategory else None
988
- cim.rated_power = int_or_none(pb.ratedPower)
989
- cim.approved_inverter_capacity = int_or_none(pb.approvedInverterCapacity)
993
+ cim.is_virtual = get_nullable(pb, 'isVirtual')
994
+ cim.connection_category = get_nullable(pb, 'connectionCategory')
995
+ cim.rated_power = get_nullable(pb, 'ratedPower')
996
+ cim.approved_inverter_capacity = get_nullable(pb, 'approvedInverterCapacity')
990
997
  cim.phase_code = phase_code_by_id(pb.phaseCode)
991
998
 
992
999
  for mrid in pb.equipmentMRIDs:
@@ -1025,7 +1032,7 @@ def auxiliary_equipment_to_cim(pb: PBAuxiliaryEquipment, cim: AuxiliaryEquipment
1025
1032
  @add_to_network_or_none
1026
1033
  def current_transformer_to_cim(pb: PBCurrentTransformer, network_service: NetworkService) -> Optional[CurrentTransformer]:
1027
1034
  # noinspection PyUnresolvedReferences
1028
- cim = CurrentTransformer(mrid=pb.mrid(), core_burden=int_or_none(pb.coreBurden))
1035
+ cim = CurrentTransformer(mrid=pb.mrid(), core_burden=int_or_none(get_nullable(pb, 'coreBurden')))
1029
1036
 
1030
1037
  # noinspection PyUnresolvedReferences
1031
1038
  network_service.resolve_or_defer_reference(resolver.current_transformer_info(cim), pb.asset_info_mrid())
@@ -1111,7 +1118,12 @@ def curve_to_cim(pb: PBCurve, cim: Curve, network_service: NetworkService):
1111
1118
 
1112
1119
 
1113
1120
  def curve_data_to_cim(pb: PBCurveData) -> Optional[CurveData]:
1114
- return CurveData(pb.xValue, pb.y1Value, float_or_none(pb.y2Value), float_or_none(pb.y3Value))
1121
+ return CurveData(
1122
+ pb.xValue,
1123
+ pb.y1Value,
1124
+ get_nullable(pb, 'y2Value'),
1125
+ get_nullable(pb, 'y3Value'),
1126
+ )
1115
1127
 
1116
1128
 
1117
1129
  def equipment_to_cim(pb: PBEquipment, cim: Equipment, network_service: NetworkService):
@@ -1237,22 +1249,22 @@ def equivalent_branch_to_cim(pb: PBEquivalentBranch, network_service: NetworkSer
1237
1249
  # noinspection PyUnresolvedReferences
1238
1250
  cim = EquivalentBranch(
1239
1251
  mrid=pb.mrid(),
1240
- negative_r12=float_or_none(pb.negativeR12),
1241
- negative_r21=float_or_none(pb.negativeR21),
1242
- negative_x12=float_or_none(pb.negativeX12),
1243
- negative_x21=float_or_none(pb.negativeX21),
1244
- positive_r12=float_or_none(pb.positiveR12),
1245
- positive_r21=float_or_none(pb.positiveR21),
1246
- positive_x12=float_or_none(pb.positiveX12),
1247
- positive_x21=float_or_none(pb.positiveX21),
1248
- r=float_or_none(pb.r),
1249
- r21=float_or_none(pb.r21),
1250
- x=float_or_none(pb.x),
1251
- x21=float_or_none(pb.x21),
1252
- zero_r12=float_or_none(pb.zeroR12),
1253
- zero_r21=float_or_none(pb.zeroR21),
1254
- zero_x12=float_or_none(pb.zeroX12),
1255
- zero_x21=float_or_none(pb.zeroX21),
1252
+ negative_r12=get_nullable(pb, 'negativeR12'),
1253
+ negative_r21=get_nullable(pb, 'negativeR21'),
1254
+ negative_x12=get_nullable(pb, 'negativeX12'),
1255
+ negative_x21=get_nullable(pb, 'negativeX21'),
1256
+ positive_r12=get_nullable(pb, 'positiveR12'),
1257
+ positive_r21=get_nullable(pb, 'positiveR21'),
1258
+ positive_x12=get_nullable(pb, 'positiveX12'),
1259
+ positive_x21=get_nullable(pb, 'positiveX21'),
1260
+ r=get_nullable(pb, 'r'),
1261
+ r21=get_nullable(pb, 'r21'),
1262
+ x=get_nullable(pb, 'x'),
1263
+ x21=get_nullable(pb, 'x21'),
1264
+ zero_r12=get_nullable(pb, 'zeroR12'),
1265
+ zero_r21=get_nullable(pb, 'zeroR21'),
1266
+ zero_x12=get_nullable(pb, 'zeroX12'),
1267
+ zero_x21=get_nullable(pb, 'zeroX21'),
1256
1268
  )
1257
1269
 
1258
1270
  equivalent_equipment_to_cim(pb.ee, cim, network_service)
@@ -1280,8 +1292,8 @@ def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> O
1280
1292
  cim = BatteryUnit(
1281
1293
  mrid=pb.mrid(),
1282
1294
  battery_state=BatteryStateKind(pb.batteryState),
1283
- rated_e=long_or_none(pb.ratedE),
1284
- stored_e=long_or_none(pb.storedE),
1295
+ rated_e=get_nullable(pb, "ratedE"),
1296
+ stored_e=get_nullable(pb, "storedE"),
1285
1297
  )
1286
1298
 
1287
1299
  for mrid in pb.batteryControlMRIDs:
@@ -1302,8 +1314,8 @@ def photo_voltaic_unit_to_cim(pb: PBPhotoVoltaicUnit, network_service: NetworkSe
1302
1314
 
1303
1315
 
1304
1316
  def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectronicsUnit, network_service: NetworkService):
1305
- cim.max_p = int_or_none(pb.maxP)
1306
- cim.min_p = int_or_none(pb.minP)
1317
+ cim.max_p = get_nullable(pb, 'maxP')
1318
+ cim.min_p = get_nullable(pb, 'minP')
1307
1319
 
1308
1320
  network_service.resolve_or_defer_reference(resolver.unit_power_electronics_connection(cim), pb.powerElectronicsConnectionMRID)
1309
1321
 
@@ -1338,7 +1350,7 @@ def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Op
1338
1350
  @add_to_network_or_none
1339
1351
  def analog_to_cim(pb: PBAnalog, network_service: NetworkService) -> Optional[Analog]:
1340
1352
  # noinspection PyUnresolvedReferences
1341
- cim = Analog(mrid=pb.mrid(), positive_flow_in=pb.positiveFlowIn)
1353
+ cim = Analog(mrid=pb.mrid(), positive_flow_in=get_nullable(pb, "positiveFlowIn"))
1342
1354
 
1343
1355
  measurement_to_cim(pb.measurement, cim, network_service)
1344
1356
  return cim
@@ -1394,9 +1406,9 @@ def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) ->
1394
1406
  # noinspection PyUnresolvedReferences
1395
1407
  cim = CurrentRelay(
1396
1408
  mrid=pb.mrid(),
1397
- current_limit_1=float_or_none(pb.currentLimit1),
1398
- inverse_time_flag=None if pb.HasField("inverseTimeFlagNull") else pb.inverseTimeFlagSet,
1399
- time_delay_1=float_or_none(pb.timeDelay1)
1409
+ current_limit_1=get_nullable(pb, "currentLimit1"),
1410
+ inverse_time_flag=get_nullable(pb, "inverseTimeFlag"),
1411
+ time_delay_1=get_nullable(pb, "timeDelay1"),
1400
1412
  )
1401
1413
 
1402
1414
  protection_relay_function_to_cim(pb.prf, cim, network_service)
@@ -1467,7 +1479,7 @@ def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[B
1467
1479
  # noinspection PyUnresolvedReferences
1468
1480
  cim = Breaker(
1469
1481
  mrid=pb.mrid(),
1470
- in_transit_time=float_or_none(pb.inTransitTime)
1482
+ in_transit_time=get_nullable(pb, "inTransitTime")
1471
1483
  )
1472
1484
 
1473
1485
  protected_switch_to_cim(pb.sw, cim, network_service)
@@ -1490,7 +1502,7 @@ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp
1490
1502
  # noinspection PyUnresolvedReferences
1491
1503
  cim = Clamp(mrid=pb.mrid())
1492
1504
 
1493
- cim.length_from_terminal_1 = float_or_none(pb.lengthFromTerminal1)
1505
+ cim.length_from_terminal_1 = get_nullable(pb, "lengthFromTerminal1")
1494
1506
  network_service.resolve_or_defer_reference(resolver.clamp_ac_line_segment(cim), pb.acLineSegmentMRID)
1495
1507
 
1496
1508
  conducting_equipment_to_cim(pb.ce, cim, network_service)
@@ -1498,9 +1510,9 @@ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp
1498
1510
 
1499
1511
 
1500
1512
  def conductor_to_cim(pb: PBConductor, cim: Conductor, network_service: NetworkService):
1501
- cim.length = float_or_none(pb.length)
1502
- cim.design_temperature = int_or_none(pb.designTemperature)
1503
- cim.design_rating = float_or_none(pb.designRating)
1513
+ cim.length = get_nullable(pb, 'length')
1514
+ cim.design_temperature = get_nullable(pb, 'designTemperature')
1515
+ cim.design_rating = get_nullable(pb, 'designRating')
1504
1516
 
1505
1517
  # noinspection PyUnresolvedReferences
1506
1518
  network_service.resolve_or_defer_reference(resolver.wire_info(cim), pb.asset_info_mrid())
@@ -1518,7 +1530,7 @@ def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]:
1518
1530
  # noinspection PyUnresolvedReferences
1519
1531
  cim = Cut(mrid=pb.mrid())
1520
1532
 
1521
- cim.length_from_terminal_1 = float_or_none(pb.lengthFromTerminal1)
1533
+ cim.length_from_terminal_1 = get_nullable(pb, 'lengthFromTerminal1')
1522
1534
  network_service.resolve_or_defer_reference(resolver.cut_ac_line_segment(cim), pb.acLineSegmentMRID)
1523
1535
 
1524
1536
  switch_to_cim(pb.sw, cim, network_service)
@@ -1536,7 +1548,7 @@ def disconnector_to_cim(pb: PBDisconnector, network_service: NetworkService) ->
1536
1548
 
1537
1549
 
1538
1550
  def earth_fault_compensator_to_cim(pb: PBEarthFaultCompensator, cim: EarthFaultCompensator, network_service: NetworkService):
1539
- cim.r = float_or_none(pb.r)
1551
+ cim.r = get_nullable(pb, 'r')
1540
1552
 
1541
1553
  conducting_equipment_to_cim(pb.ce, cim, network_service)
1542
1554
 
@@ -1551,13 +1563,13 @@ def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService
1551
1563
  # noinspection PyUnresolvedReferences
1552
1564
  cim = EnergyConsumer(
1553
1565
  mrid=pb.mrid(),
1554
- customer_count=int_or_none(pb.customerCount),
1555
- grounded=pb.grounded,
1566
+ customer_count=get_nullable(pb, "customerCount"),
1567
+ grounded=get_nullable(pb, 'grounded'),
1556
1568
  phase_connection=PhaseShuntConnectionKind(pb.phaseConnection),
1557
- p=float_or_none(pb.p),
1558
- p_fixed=float_or_none(pb.pFixed),
1559
- q=float_or_none(pb.q),
1560
- q_fixed=float_or_none(pb.qFixed)
1569
+ p=get_nullable(pb, 'p'),
1570
+ p_fixed=get_nullable(pb, 'pFixed'),
1571
+ q=get_nullable(pb, 'q'),
1572
+ q_fixed=get_nullable(pb, 'qFixed'),
1561
1573
  )
1562
1574
 
1563
1575
  for mrid in pb.energyConsumerPhasesMRIDs:
@@ -1574,10 +1586,10 @@ def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: Net
1574
1586
  cim = EnergyConsumerPhase(
1575
1587
  mrid=pb.mrid(),
1576
1588
  phase=single_phase_kind_by_id(pb.phase),
1577
- p=float_or_none(pb.p),
1578
- p_fixed=float_or_none(pb.pFixed),
1579
- q=float_or_none(pb.q),
1580
- q_fixed=float_or_none(pb.qFixed)
1589
+ p=get_nullable(pb, 'p'),
1590
+ p_fixed=get_nullable(pb, 'pFixed'),
1591
+ q=get_nullable(pb, 'q'),
1592
+ q_fixed=get_nullable(pb, 'qFixed'),
1581
1593
  )
1582
1594
 
1583
1595
  network_service.resolve_or_defer_reference(resolver.energy_consumer(cim), pb.energyConsumerMRID)
@@ -1592,31 +1604,31 @@ def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) ->
1592
1604
  # noinspection PyUnresolvedReferences
1593
1605
  cim = EnergySource(
1594
1606
  mrid=pb.mrid(),
1595
- active_power=float_or_none(pb.activePower),
1596
- reactive_power=float_or_none(pb.reactivePower),
1597
- voltage_angle=float_or_none(pb.voltageAngle),
1598
- voltage_magnitude=float_or_none(pb.voltageMagnitude),
1599
- r=float_or_none(pb.r),
1600
- x=float_or_none(pb.x),
1601
- p_max=float_or_none(pb.pMax),
1602
- p_min=float_or_none(pb.pMin),
1603
- r0=float_or_none(pb.r0),
1604
- rn=float_or_none(pb.rn),
1605
- x0=float_or_none(pb.x0),
1606
- xn=float_or_none(pb.xn),
1607
- is_external_grid=pb.isExternalGrid,
1608
- r_min=float_or_none(pb.rMin),
1609
- rn_min=float_or_none(pb.rnMin),
1610
- r0_min=float_or_none(pb.r0Min),
1611
- x_min=float_or_none(pb.xMin),
1612
- xn_min=float_or_none(pb.xnMin),
1613
- x0_min=float_or_none(pb.x0Min),
1614
- r_max=float_or_none(pb.rMax),
1615
- rn_max=float_or_none(pb.rnMax),
1616
- r0_max=float_or_none(pb.r0Max),
1617
- x_max=float_or_none(pb.xMax),
1618
- xn_max=float_or_none(pb.xnMax),
1619
- x0_max=float_or_none(pb.x0Max)
1607
+ active_power=get_nullable(pb, 'activePower'),
1608
+ reactive_power=get_nullable(pb, 'reactivePower'),
1609
+ voltage_angle=get_nullable(pb, 'voltageAngle'),
1610
+ voltage_magnitude=get_nullable(pb, 'voltageMagnitude'),
1611
+ r=get_nullable(pb, 'r'),
1612
+ x=get_nullable(pb, 'x'),
1613
+ p_max=get_nullable(pb, 'pMax'),
1614
+ p_min=get_nullable(pb, 'pMin'),
1615
+ r0=get_nullable(pb, 'r0'),
1616
+ rn=get_nullable(pb, 'rn'),
1617
+ x0=get_nullable(pb, 'x0'),
1618
+ xn=get_nullable(pb, 'xn'),
1619
+ is_external_grid=get_nullable(pb, 'isExternalGrid'),
1620
+ r_min=get_nullable(pb, 'rMin'),
1621
+ rn_min=get_nullable(pb, 'rnMin'),
1622
+ r0_min=get_nullable(pb, 'r0Min'),
1623
+ x_min=get_nullable(pb, 'xMin'),
1624
+ xn_min=get_nullable(pb, 'xnMin'),
1625
+ x0_min=get_nullable(pb, 'x0Min'),
1626
+ r_max=get_nullable(pb, 'rMax'),
1627
+ rn_max=get_nullable(pb, 'rnMax'),
1628
+ r0_max=get_nullable(pb, 'r0Max'),
1629
+ x_max=get_nullable(pb, 'xMax'),
1630
+ xn_max=get_nullable(pb, 'xnMax'),
1631
+ x0_max=get_nullable(pb, 'x0Max'),
1620
1632
  )
1621
1633
 
1622
1634
  for mrid in pb.energySourcePhasesMRIDs:
@@ -1674,7 +1686,7 @@ def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: Networ
1674
1686
  @add_to_network_or_none
1675
1687
  def grounding_impedance_to_cim(pb: PBGroundingImpedance, network_service: NetworkService) -> Optional[GroundingImpedance]:
1676
1688
  # noinspection PyUnresolvedReferences
1677
- cim = GroundingImpedance(mrid=pb.mrid(), x=float_or_none(pb.x))
1689
+ cim = GroundingImpedance(mrid=pb.mrid(), x=get_nullable(pb, "x"))
1678
1690
 
1679
1691
  earth_fault_compensator_to_cim(pb.efc, cim, network_service)
1680
1692
  return cim
@@ -1710,10 +1722,10 @@ def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_servic
1710
1722
  # noinspection PyUnresolvedReferences
1711
1723
  cim = LinearShuntCompensator(
1712
1724
  mrid=pb.mrid(),
1713
- b0_per_section=float_or_none(pb.b0PerSection),
1714
- b_per_section=float_or_none(pb.bPerSection),
1715
- g0_per_section=float_or_none(pb.g0PerSection),
1716
- g_per_section=float_or_none(pb.gPerSection)
1725
+ b0_per_section=get_nullable(pb, 'b0PerSection'),
1726
+ b_per_section=get_nullable(pb, 'bPerSection'),
1727
+ g0_per_section=get_nullable(pb, 'g0PerSection'),
1728
+ g_per_section=get_nullable(pb, 'gPerSection'),
1717
1729
  )
1718
1730
 
1719
1731
  shunt_compensator_to_cim(pb.sc, cim, network_service)
@@ -1763,14 +1775,14 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo
1763
1775
  # noinspection PyUnresolvedReferences
1764
1776
  cim = PerLengthSequenceImpedance(
1765
1777
  mrid=pb.mrid(),
1766
- r=float_or_none(pb.r),
1767
- x=float_or_none(pb.x),
1768
- r0=float_or_none(pb.r0),
1769
- x0=float_or_none(pb.x0),
1770
- bch=float_or_none(pb.bch),
1771
- gch=float_or_none(pb.gch),
1772
- b0ch=float_or_none(pb.b0ch),
1773
- g0ch=float_or_none(pb.g0ch)
1778
+ r=get_nullable(pb, 'r'),
1779
+ x=get_nullable(pb, 'x'),
1780
+ r0=get_nullable(pb, 'r0'),
1781
+ x0=get_nullable(pb, 'x0'),
1782
+ bch=get_nullable(pb, 'bch'),
1783
+ gch=get_nullable(pb, 'gch'),
1784
+ b0ch=get_nullable(pb, 'b0ch'),
1785
+ g0ch=get_nullable(pb, 'g0ch'),
1774
1786
  )
1775
1787
 
1776
1788
  per_length_impedance_to_cim(pb.pli, cim, network_service)
@@ -1781,7 +1793,7 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo
1781
1793
  @add_to_network_or_none
1782
1794
  def petersen_coil_to_cim(pb: PBPetersenCoil, network_service: NetworkService) -> Optional[PetersenCoil]:
1783
1795
  # noinspection PyUnresolvedReferences
1784
- cim = PetersenCoil(mrid=pb.mrid(), x_ground_nominal=float_or_none(pb.xGroundNominal))
1796
+ cim = PetersenCoil(mrid=pb.mrid(), x_ground_nominal=get_nullable(pb, 'xGroundNominal'))
1785
1797
 
1786
1798
  earth_fault_compensator_to_cim(pb.efc, cim, network_service)
1787
1799
  return cim
@@ -1796,10 +1808,10 @@ def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImped
1796
1808
  return PhaseImpedanceData(
1797
1809
  single_phase_kind_by_id(pb.fromPhase),
1798
1810
  single_phase_kind_by_id(pb.toPhase),
1799
- float_or_none(pb.b),
1800
- float_or_none(pb.g),
1801
- float_or_none(pb.r),
1802
- float_or_none(pb.x),
1811
+ get_nullable(pb, "b"),
1812
+ get_nullable(pb, "g"),
1813
+ get_nullable(pb, "r"),
1814
+ get_nullable(pb, "x"),
1803
1815
  )
1804
1816
 
1805
1817
 
@@ -1809,37 +1821,37 @@ def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, networ
1809
1821
  # noinspection PyUnresolvedReferences
1810
1822
  cim = PowerElectronicsConnection(
1811
1823
  mrid=pb.mrid(),
1812
- max_i_fault=int_or_none(pb.maxIFault),
1813
- p=float_or_none(pb.p),
1814
- q=float_or_none(pb.q),
1815
- max_q=float_or_none(pb.maxQ),
1816
- min_q=float_or_none(pb.minQ),
1817
- rated_s=int_or_none(pb.ratedS),
1818
- rated_u=int_or_none(pb.ratedU),
1819
- inverter_standard=str_or_none(pb.inverterStandard),
1820
- sustain_op_overvolt_limit=int_or_none(pb.sustainOpOvervoltLimit),
1821
- stop_at_over_freq=float_or_none(pb.stopAtOverFreq),
1822
- stop_at_under_freq=float_or_none(pb.stopAtUnderFreq),
1823
- inv_volt_watt_resp_mode=None if pb.HasField("invVoltWattRespModeNull") else pb.invVoltWattRespModeSet,
1824
- inv_watt_resp_v1=int_or_none(pb.invWattRespV1),
1825
- inv_watt_resp_v2=int_or_none(pb.invWattRespV2),
1826
- inv_watt_resp_v3=int_or_none(pb.invWattRespV3),
1827
- inv_watt_resp_v4=int_or_none(pb.invWattRespV4),
1828
- inv_watt_resp_p_at_v1=float_or_none(pb.invWattRespPAtV1),
1829
- inv_watt_resp_p_at_v2=float_or_none(pb.invWattRespPAtV2),
1830
- inv_watt_resp_p_at_v3=float_or_none(pb.invWattRespPAtV3),
1831
- inv_watt_resp_p_at_v4=float_or_none(pb.invWattRespPAtV4),
1832
- inv_volt_var_resp_mode=None if pb.HasField("invVoltVarRespModeNull") else pb.invVoltVarRespModeSet,
1833
- inv_var_resp_v1=int_or_none(pb.invVarRespV1),
1834
- inv_var_resp_v2=int_or_none(pb.invVarRespV2),
1835
- inv_var_resp_v3=int_or_none(pb.invVarRespV3),
1836
- inv_var_resp_v4=int_or_none(pb.invVarRespV4),
1837
- inv_var_resp_q_at_v1=float_or_none(pb.invVarRespQAtV1),
1838
- inv_var_resp_q_at_v2=float_or_none(pb.invVarRespQAtV2),
1839
- inv_var_resp_q_at_v3=float_or_none(pb.invVarRespQAtV3),
1840
- inv_var_resp_q_at_v4=float_or_none(pb.invVarRespQAtV4),
1841
- inv_reactive_power_mode=None if pb.HasField("invReactivePowerModeNull") else pb.invReactivePowerModeSet,
1842
- inv_fix_reactive_power=float_or_none(pb.invFixReactivePower)
1824
+ max_i_fault=get_nullable(pb, "maxIFault"),
1825
+ p=get_nullable(pb, 'p'),
1826
+ q=get_nullable(pb, 'q'),
1827
+ max_q=get_nullable(pb, 'maxQ'),
1828
+ min_q=get_nullable(pb, 'minQ'),
1829
+ rated_s=get_nullable(pb, 'ratedS'),
1830
+ rated_u=get_nullable(pb, 'ratedU'),
1831
+ inverter_standard=get_nullable(pb, 'inverterStandard'),
1832
+ sustain_op_overvolt_limit=get_nullable(pb, 'sustainOpOvervoltLimit'),
1833
+ stop_at_over_freq=get_nullable(pb, 'stopAtOverFreq'),
1834
+ stop_at_under_freq=get_nullable(pb, 'stopAtUnderFreq'),
1835
+ inv_volt_watt_resp_mode=get_nullable(pb, "invVoltWattRespMode"),
1836
+ inv_watt_resp_v1=get_nullable(pb, 'invWattRespV1'),
1837
+ inv_watt_resp_v2=get_nullable(pb, 'invWattRespV2'),
1838
+ inv_watt_resp_v3=get_nullable(pb, 'invWattRespV3'),
1839
+ inv_watt_resp_v4=get_nullable(pb, 'invWattRespV4'),
1840
+ inv_watt_resp_p_at_v1=get_nullable(pb, 'invWattRespPAtV1'),
1841
+ inv_watt_resp_p_at_v2=get_nullable(pb, 'invWattRespPAtV2'),
1842
+ inv_watt_resp_p_at_v3=get_nullable(pb, 'invWattRespPAtV3'),
1843
+ inv_watt_resp_p_at_v4=get_nullable(pb, 'invWattRespPAtV4'),
1844
+ inv_volt_var_resp_mode=get_nullable(pb, "invVoltVarRespMode"),
1845
+ inv_var_resp_v1=get_nullable(pb, 'invVarRespV1'),
1846
+ inv_var_resp_v2=get_nullable(pb, 'invVarRespV2'),
1847
+ inv_var_resp_v3=get_nullable(pb, 'invVarRespV3'),
1848
+ inv_var_resp_v4=get_nullable(pb, 'invVarRespV4'),
1849
+ inv_var_resp_q_at_v1=get_nullable(pb, 'invVarRespQAtV1'),
1850
+ inv_var_resp_q_at_v2=get_nullable(pb, 'invVarRespQAtV2'),
1851
+ inv_var_resp_q_at_v3=get_nullable(pb, 'invVarRespQAtV3'),
1852
+ inv_var_resp_q_at_v4=get_nullable(pb, 'invVarRespQAtV4'),
1853
+ inv_reactive_power_mode=get_nullable(pb, "invReactivePowerMode"),
1854
+ inv_fix_reactive_power=get_nullable(pb, 'invFixReactivePower'),
1843
1855
  )
1844
1856
 
1845
1857
  for mrid in pb.powerElectronicsUnitMRIDs:
@@ -1860,8 +1872,8 @@ def power_electronics_connection_phase_to_cim(
1860
1872
  # noinspection PyUnresolvedReferences
1861
1873
  cim = PowerElectronicsConnectionPhase(
1862
1874
  mrid=pb.mrid(),
1863
- p=float_or_none(pb.p),
1864
- q=float_or_none(pb.q),
1875
+ p=get_nullable(pb, "p"),
1876
+ q=get_nullable(pb, "q"),
1865
1877
  phase=single_phase_kind_by_id(pb.phase)
1866
1878
  )
1867
1879
 
@@ -1878,7 +1890,7 @@ def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkSer
1878
1890
  cim = PowerTransformer(
1879
1891
  mrid=pb.mrid(),
1880
1892
  vector_group=VectorGroup(pb.vectorGroup),
1881
- transformer_utilisation=float_or_none(pb.transformerUtilisation),
1893
+ transformer_utilisation=get_nullable(pb, "transformerUtilisation"),
1882
1894
  construction_kind=TransformerConstructionKind(pb.constructionKind),
1883
1895
  function=TransformerFunctionKind(pb.function)
1884
1896
  )
@@ -1898,17 +1910,17 @@ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: Net
1898
1910
  # noinspection PyUnresolvedReferences
1899
1911
  cim = PowerTransformerEnd(
1900
1912
  mrid=pb.mrid(),
1901
- rated_u=int_or_none(pb.ratedU),
1902
- r=float_or_none(pb.r),
1903
- r0=float_or_none(pb.r0),
1904
- x=float_or_none(pb.x),
1905
- x0=float_or_none(pb.x0),
1906
- b=float_or_none(pb.b),
1907
- b0=float_or_none(pb.b0),
1908
- g=float_or_none(pb.g),
1909
- g0=float_or_none(pb.g0),
1913
+ rated_u=get_nullable(pb, 'ratedU'),
1914
+ r=get_nullable(pb, 'r'),
1915
+ r0=get_nullable(pb, 'r0'),
1916
+ x=get_nullable(pb, 'x'),
1917
+ x0=get_nullable(pb, 'x0'),
1918
+ b=get_nullable(pb, 'b'),
1919
+ b0=get_nullable(pb, 'b0'),
1920
+ g=get_nullable(pb, 'g'),
1921
+ g0=get_nullable(pb, 'g0'),
1910
1922
  connection_kind=WindingConnection(pb.connectionKind),
1911
- phase_angle_clock=int_or_none(pb.phaseAngleClock)
1923
+ phase_angle_clock=get_nullable(pb, 'phaseAngleClock'),
1912
1924
  )
1913
1925
 
1914
1926
  for rating in pb.ratings:
@@ -1922,7 +1934,7 @@ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: Net
1922
1934
 
1923
1935
 
1924
1936
  def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network_service: NetworkService):
1925
- cim.breaking_capacity = int_or_none(pb.breakingCapacity)
1937
+ cim.breaking_capacity = get_nullable(pb, 'breakingCapacity')
1926
1938
 
1927
1939
  for mrid in pb.relayFunctionMRIDs:
1928
1940
  network_service.resolve_or_defer_reference(resolver.ps_relay_function(cim), mrid)
@@ -1936,7 +1948,7 @@ def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkServ
1936
1948
  # noinspection PyUnresolvedReferences
1937
1949
  cim = RatioTapChanger(
1938
1950
  mrid=pb.mrid(),
1939
- step_voltage_increment=float_or_none(pb.stepVoltageIncrement)
1951
+ step_voltage_increment=get_nullable(pb, "stepVoltageIncrement")
1940
1952
  )
1941
1953
 
1942
1954
  network_service.resolve_or_defer_reference(resolver.transformer_end(cim), pb.transformerEndMRID)
@@ -1966,7 +1978,7 @@ def recloser_to_cim(pb: PBRecloser, network_service: NetworkService) -> Optional
1966
1978
 
1967
1979
 
1968
1980
  def regulating_cond_eq_to_cim(pb: PBRegulatingCondEq, cim: RegulatingCondEq, network_service: NetworkService):
1969
- cim.control_enabled = pb.controlEnabled
1981
+ cim.control_enabled = get_nullable(pb, 'controlEnabled')
1970
1982
  network_service.resolve_or_defer_reference(resolver.rce_regulating_control(cim), pb.regulatingControlMRID)
1971
1983
 
1972
1984
  energy_connection_to_cim(pb.ec, cim, network_service)
@@ -1976,27 +1988,27 @@ def regulating_control_to_cim(pb: PBRegulatingControl, cim: RegulatingControl, n
1976
1988
  cim.discrete = None if pb.HasField("discreteNull") else pb.discreteSet
1977
1989
  cim.mode = RegulatingControlModeKind(pb.mode)
1978
1990
  cim.monitored_phase = phase_code_by_id(pb.monitoredPhase)
1979
- cim.target_deadband = float_or_none(pb.targetDeadband)
1980
- cim.target_value = float_or_none(pb.targetValue)
1981
- cim.enabled = None if pb.HasField("enabledNull") else pb.enabledSet
1982
- cim.max_allowed_target_value = float_or_none(pb.maxAllowedTargetValue)
1983
- cim.min_allowed_target_value = float_or_none(pb.minAllowedTargetValue)
1984
- cim.rated_current = float_or_none(pb.ratedCurrent)
1991
+ cim.target_deadband = get_nullable(pb, 'targetDeadband')
1992
+ cim.target_value = get_nullable(pb, 'targetValue')
1993
+ cim.enabled = get_nullable(pb, 'enabled')
1994
+ cim.max_allowed_target_value = get_nullable(pb, 'maxAllowedTargetValue')
1995
+ cim.min_allowed_target_value = get_nullable(pb, 'minAllowedTargetValue')
1996
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
1985
1997
  network_service.resolve_or_defer_reference(resolver.rc_terminal(cim), pb.terminalMRID)
1986
1998
  for mrid in pb.regulatingCondEqMRIDs:
1987
1999
  network_service.resolve_or_defer_reference(resolver.rc_regulating_cond_eq(cim), mrid)
1988
- cim.ct_primary = float_or_none(pb.ctPrimary)
1989
- cim.min_target_deadband = float_or_none(pb.minTargetDeadband)
2000
+ cim.ct_primary = get_nullable(pb, 'ctPrimary')
2001
+ cim.min_target_deadband = get_nullable(pb, 'minTargetDeadband')
1990
2002
 
1991
2003
  power_system_resource_to_cim(pb.psr, cim, network_service)
1992
2004
 
1993
2005
 
1994
2006
  def rotating_machine_to_cim(pb: PBRotatingMachine, cim: RotatingMachine, network_service: NetworkService):
1995
- cim.rated_power_factor = float_or_none(pb.ratedPowerFactor)
1996
- cim.rated_s = float_or_none(pb.ratedS)
1997
- cim.rated_u = int_or_none(pb.ratedU)
1998
- cim.p = float_or_none(pb.p)
1999
- cim.q = float_or_none(pb.q)
2007
+ cim.rated_power_factor = get_nullable(pb, 'ratedPowerFactor')
2008
+ cim.rated_s = get_nullable(pb, 'ratedS')
2009
+ cim.rated_u = get_nullable(pb, 'ratedU')
2010
+ cim.p = get_nullable(pb, 'p')
2011
+ cim.q = get_nullable(pb, 'q')
2000
2012
 
2001
2013
  regulating_cond_eq_to_cim(pb.rce, cim, network_service)
2002
2014
 
@@ -2007,12 +2019,12 @@ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkS
2007
2019
  # noinspection PyUnresolvedReferences
2008
2020
  cim = SeriesCompensator(
2009
2021
  mrid=pb.mrid(),
2010
- r=float_or_none(pb.r),
2011
- r0=float_or_none(pb.r0),
2012
- x=float_or_none(pb.x),
2013
- x0=float_or_none(pb.x0),
2014
- varistor_rated_current=int_or_none(pb.varistorRatedCurrent),
2015
- varistor_voltage_threshold=int_or_none(pb.varistorVoltageThreshold)
2022
+ r=get_nullable(pb, 'r'),
2023
+ r0=get_nullable(pb, 'r0'),
2024
+ x=get_nullable(pb, 'x'),
2025
+ x0=get_nullable(pb, 'x0'),
2026
+ varistor_rated_current=get_nullable(pb, 'varistorRatedCurrent'),
2027
+ varistor_voltage_threshold=get_nullable(pb, 'varistorVoltageThreshold'),
2016
2028
  )
2017
2029
 
2018
2030
  conducting_equipment_to_cim(pb.ce, cim, network_service)
@@ -2022,9 +2034,9 @@ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkS
2022
2034
  def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, network_service: NetworkService):
2023
2035
  # noinspection PyUnresolvedReferences
2024
2036
  network_service.resolve_or_defer_reference(resolver.shunt_compensator_info(cim), pb.asset_info_mrid())
2025
- cim.sections = float_or_none(pb.sections)
2026
- cim.grounded = pb.grounded
2027
- cim.nom_u = int_or_none(pb.nomU)
2037
+ cim.sections = get_nullable(pb, 'sections')
2038
+ cim.grounded = get_nullable(pb, 'grounded')
2039
+ cim.nom_u = get_nullable(pb, 'nomU')
2028
2040
  cim.phase_connection = PhaseShuntConnectionKind(pb.phaseConnection)
2029
2041
 
2030
2042
  regulating_cond_eq_to_cim(pb.rce, cim, network_service)
@@ -2042,11 +2054,11 @@ def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: N
2042
2054
  # noinspection PyUnresolvedReferences
2043
2055
  cim = StaticVarCompensator(
2044
2056
  mrid=pb.mrid(),
2045
- capacitive_rating=float_or_none(pb.capacitiveRating),
2046
- inductive_rating=float_or_none(pb.inductiveRating),
2047
- q=float_or_none(pb.q),
2057
+ capacitive_rating=get_nullable(pb, 'capacitiveRating'),
2058
+ inductive_rating=get_nullable(pb, 'inductiveRating'),
2059
+ q=get_nullable(pb, 'q'),
2048
2060
  svc_control_mode=SVCControlMode(pb.svcControlMode),
2049
- voltage_set_point=int_or_none(pb.voltageSetPoint)
2061
+ voltage_set_point=get_nullable(pb, 'voltageSetPoint'),
2050
2062
  )
2051
2063
 
2052
2064
  regulating_cond_eq_to_cim(pb.rce, cim, network_service)
@@ -2056,7 +2068,7 @@ def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: N
2056
2068
  def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService):
2057
2069
  # noinspection PyUnresolvedReferences
2058
2070
  network_service.resolve_or_defer_reference(resolver.switch_info(cim), pb.asset_info_mrid())
2059
- cim.rated_current = float_or_none(pb.ratedCurrent)
2071
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
2060
2072
  cim.set_normally_open(pb.normalOpen)
2061
2073
  cim.set_open(pb.open)
2062
2074
 
@@ -2069,25 +2081,25 @@ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: Networ
2069
2081
  # noinspection PyUnresolvedReferences
2070
2082
  cim = SynchronousMachine(
2071
2083
  mrid=pb.mrid(),
2072
- base_q=float_or_none(pb.baseQ),
2073
- condenser_p=int_or_none(pb.condenserP),
2074
- earthing=pb.earthing,
2075
- earthing_star_point_r=float_or_none(pb.earthingStarPointR),
2076
- earthing_star_point_x=float_or_none(pb.earthingStarPointX),
2077
- ikk=float_or_none(pb.ikk),
2078
- max_q=float_or_none(pb.maxQ),
2079
- max_u=int_or_none(pb.maxU),
2080
- min_q=float_or_none(pb.minQ),
2081
- min_u=int_or_none(pb.minU),
2082
- mu=float_or_none(pb.mu),
2083
- r=float_or_none(pb.r),
2084
- r0=float_or_none(pb.r0),
2085
- r2=float_or_none(pb.r2),
2086
- sat_direct_subtrans_x=float_or_none(pb.satDirectSubtransX),
2087
- sat_direct_sync_x=float_or_none(pb.satDirectSyncX),
2088
- sat_direct_trans_x=float_or_none(pb.satDirectTransX),
2089
- x0=float_or_none(pb.x0),
2090
- x2=float_or_none(pb.x2),
2084
+ base_q=get_nullable(pb, 'baseQ'),
2085
+ condenser_p=get_nullable(pb, 'condenserP'),
2086
+ earthing=get_nullable(pb, 'earthing'),
2087
+ earthing_star_point_r=get_nullable(pb, 'earthingStarPointR'),
2088
+ earthing_star_point_x=get_nullable(pb, 'earthingStarPointX'),
2089
+ ikk=get_nullable(pb, 'ikk'),
2090
+ max_q=get_nullable(pb, 'maxQ'),
2091
+ max_u=get_nullable(pb, 'maxU'),
2092
+ min_q=get_nullable(pb, 'minQ'),
2093
+ min_u=get_nullable(pb, 'minU'),
2094
+ mu=get_nullable(pb, 'mu'),
2095
+ r=get_nullable(pb, 'r'),
2096
+ r0=get_nullable(pb, 'r0'),
2097
+ r2=get_nullable(pb, 'r2'),
2098
+ sat_direct_subtrans_x=get_nullable(pb, 'satDirectSubtransX'),
2099
+ sat_direct_sync_x=get_nullable(pb, 'satDirectSyncX'),
2100
+ sat_direct_trans_x=get_nullable(pb, 'satDirectTransX'),
2101
+ x0=get_nullable(pb, 'x0'),
2102
+ x2=get_nullable(pb, 'x2'),
2091
2103
  type=SynchronousMachineKind(pb.type),
2092
2104
  operating_mode=SynchronousMachineKind(pb.operatingMode)
2093
2105
  )
@@ -2100,13 +2112,13 @@ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: Networ
2100
2112
 
2101
2113
 
2102
2114
  def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: NetworkService):
2103
- cim.high_step = int_or_none(pb.highStep)
2104
- cim.step = float_or_none(pb.step)
2105
- cim.neutral_step = int_or_none(pb.neutralStep)
2106
- cim.normal_step = int_or_none(pb.normalStep)
2107
- cim.low_step = int_or_none(pb.lowStep)
2108
- cim.neutral_u = int_or_none(pb.neutralU)
2109
- cim.control_enabled = pb.controlEnabled
2115
+ cim.high_step = get_nullable(pb, 'highStep')
2116
+ cim.step = get_nullable(pb, 'step')
2117
+ cim.neutral_step = get_nullable(pb, 'neutralStep')
2118
+ cim.normal_step = get_nullable(pb, 'normalStep')
2119
+ cim.low_step = get_nullable(pb, 'lowStep')
2120
+ cim.neutral_u = get_nullable(pb, 'neutralU')
2121
+ cim.control_enabled = get_nullable(pb, 'controlEnabled')
2110
2122
  network_service.resolve_or_defer_reference(resolver.tc_tap_changer_control(cim), pb.tapChangerControlMRID)
2111
2123
 
2112
2124
  power_system_resource_to_cim(pb.psr, cim, network_service)
@@ -2118,15 +2130,15 @@ def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: Network
2118
2130
  # noinspection PyUnresolvedReferences
2119
2131
  cim = TapChangerControl(
2120
2132
  mrid=pb.mrid(),
2121
- limit_voltage=int_or_none(pb.limitVoltage),
2122
- line_drop_compensation=None if pb.HasField("lineDropCompensationNull") else pb.lineDropCompensationSet,
2123
- line_drop_r=float_or_none(pb.lineDropR),
2124
- line_drop_x=float_or_none(pb.lineDropX),
2125
- reverse_line_drop_r=float_or_none(pb.reverseLineDropR),
2126
- reverse_line_drop_x=float_or_none(pb.reverseLineDropX),
2127
- forward_ldc_blocking=None if pb.HasField("forwardLDCBlockingNull") else pb.forwardLDCBlockingSet,
2128
- time_delay=float_or_none(pb.timeDelay),
2129
- co_generation_enabled=None if pb.HasField("coGenerationEnabledNull") else pb.coGenerationEnabledSet
2133
+ limit_voltage=get_nullable(pb, 'limitVoltage'),
2134
+ line_drop_compensation=get_nullable(pb, "lineDropCompensation"),
2135
+ line_drop_r=get_nullable(pb, 'lineDropR'),
2136
+ line_drop_x=get_nullable(pb, 'lineDropX'),
2137
+ reverse_line_drop_r=get_nullable(pb, 'reverseLineDropR'),
2138
+ reverse_line_drop_x=get_nullable(pb, 'reverseLineDropX'),
2139
+ forward_ldc_blocking=get_nullable(pb, "forwardLDCBlocking"),
2140
+ time_delay=get_nullable(pb, 'timeDelay'),
2141
+ co_generation_enabled=get_nullable(pb, "coGenerationEnabled"),
2130
2142
  )
2131
2143
 
2132
2144
  regulating_control_to_cim(pb.rc, cim, network_service)
@@ -2135,9 +2147,9 @@ def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: Network
2135
2147
 
2136
2148
  def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_service: NetworkService):
2137
2149
  cim.end_number = pb.endNumber
2138
- cim.grounded = pb.grounded
2139
- cim.r_ground = float_or_none(pb.rGround)
2140
- cim.x_ground = float_or_none(pb.xGround)
2150
+ cim.grounded = get_nullable(pb, 'grounded')
2151
+ cim.r_ground = get_nullable(pb, 'rGround')
2152
+ cim.x_ground = get_nullable(pb, 'xGround')
2141
2153
 
2142
2154
  network_service.resolve_or_defer_reference(resolver.te_terminal(cim), pb.terminalMRID)
2143
2155
  network_service.resolve_or_defer_reference(resolver.te_base_voltage(cim), pb.baseVoltageMRID)
@@ -2155,7 +2167,13 @@ def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[Trans
2155
2167
  @add_to_network_or_none
2156
2168
  def transformer_star_impedance_to_cim(pb: PBTransformerStarImpedance, network_service: NetworkService) -> Optional[TransformerStarImpedance]:
2157
2169
  # noinspection PyUnresolvedReferences
2158
- cim = TransformerStarImpedance(mrid=pb.mrid(), r=pb.r, r0=pb.r0, x=pb.x, x0=pb.x0)
2170
+ cim = TransformerStarImpedance(
2171
+ mrid=pb.mrid(),
2172
+ r=get_nullable(pb, 'r'),
2173
+ r0=get_nullable(pb, 'r0'),
2174
+ x=get_nullable(pb, 'x'),
2175
+ x0=get_nullable(pb, 'x0'),
2176
+ )
2159
2177
 
2160
2178
  network_service.resolve_or_defer_reference(resolver.star_impedance_transformer_end_info(cim), pb.transformerEndInfoMRID)
2161
2179