From 86fc1251207368584c3806b7a5aa842e535cab21 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Mon, 25 Aug 2025 22:16:55 +1000 Subject: [PATCH 1/7] its alive Signed-off-by: Max Chesterfield --- .../common/translator/base_cim2proto.py | 32 +- .../common/translator/base_proto2cim.py | 21 +- .../customer/translator/customer_cim2proto.py | 20 +- .../customer/translator/customer_proto2cim.py | 17 +- .../diagram/translator/diagram_cim2proto.py | 16 +- .../diagram/translator/diagram_proto2cim.py | 16 +- .../network/translator/network_cim2proto.py | 770 ++++++++++-------- .../network/translator/network_proto2cim.py | 594 +++++++------- .../translator/test_customer_translator.py | 6 +- .../translator/test_diagram_translator.py | 5 +- .../translator/test_network_translator.py | 5 +- test/streaming/get/pb_creators.py | 534 ++++++------ 12 files changed, 1102 insertions(+), 934 deletions(-) diff --git a/src/zepben/ewb/services/common/translator/base_cim2proto.py b/src/zepben/ewb/services/common/translator/base_cim2proto.py index 966b9e360..341e6f555 100644 --- a/src/zepben/ewb/services/common/translator/base_cim2proto.py +++ b/src/zepben/ewb/services/common/translator/base_cim2proto.py @@ -6,10 +6,11 @@ __all__ = ["identified_object_to_pb", "document_to_pb", "organisation_role_to_pb", "organisation_to_pb"] import inspect -from typing import ParamSpec, TypeVar, Callable +from typing import ParamSpec, TypeVar, Callable, Generator # noinspection PyPackageRequirements,PyUnresolvedReferences from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp +from google.protobuf.struct_pb2 import NullValue from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument from zepben.protobuf.cim.iec61968.common.OrganisationRole_pb2 import OrganisationRole as PBOrganisationRole from zepben.protobuf.cim.iec61968.common.Organisation_pb2 import Organisation as PBOrganisation @@ -38,6 +39,13 @@ def bind_to_pb(func: Callable[P, R]) -> Callable[P, R]: inspect.get_annotations(func, eval_str=True)[func.__code__.co_varnames[0]].to_pb = func return func + +def set_or_null(**kwargs): + if 'invWattRespPAtV1' in kwargs.keys(): + print('yo') + return {f'{k}{"Null" if v is None else "Set"}': v if v is not None else NullValue.NULL_VALUE for k, v in kwargs.items()} + + ################### # IEC61968 Common # ################### @@ -51,12 +59,14 @@ def document_to_pb(cim: Document) -> PBDocument: return PBDocument( io=identified_object_to_pb(cim), - title=cim.title, createdDateTime=timestamp, - authorName=cim.author_name, - type=cim.type, - status=cim.status, - comment=cim.comment + **set_or_null( + title=cim.title, + authorName=cim.author_name, + type=cim.type, + status=cim.status, + comment=cim.comment + ) ) @@ -81,8 +91,10 @@ def organisation_role_to_pb(cim: OrganisationRole) -> PBOrganisationRole: def identified_object_to_pb(cim: IdentifiedObject) -> PBIdentifiedObject: return PBIdentifiedObject( mRID=str(cim.mrid), - name=cim.name, - description=cim.description, + **set_or_null( + name=cim.name, + description=cim.description + ), names=[name_to_pb(name) for name in cim.names] ) @@ -99,5 +111,7 @@ def name_to_pb(cim: Name) -> PBName: def name_type_to_pb(cim: NameType) -> PBNameType: return PBNameType( name=cim.name, - description=cim.description + **set_or_null( + description=cim.description + ) ) diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index 12618ff55..a8a2fb197 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -54,6 +54,11 @@ def bind_to_cim(func: Callable[P, R]) -> Callable[P, R]: inspect.get_annotations(func, eval_str=True)[func.__code__.co_varnames[0]].to_cim = func return func +T = TypeVar("T") + +def get_nullable(pb: Message, field: str) -> Optional[T]: + return None if pb.HasField(f'{field}Null') else getattr(pb, f'{field}Set') + ################### # IEC61968 Common # @@ -61,12 +66,12 @@ def bind_to_cim(func: Callable[P, R]) -> Callable[P, R]: @bind_to_cim def document_to_cim(pb: PBDocument, cim: Document, service: BaseService): - cim.title = pb.title + cim.title = get_nullable(pb, 'title') cim.created_date_time = pb.createdDateTime.ToDatetime() if pb.HasField("createdDateTime") else None - cim.author_name = pb.authorName - cim.type = pb.type - cim.status = pb.status - cim.comment = pb.comment + cim.author_name = get_nullable(pb, 'authorName') + cim.type = get_nullable(pb, 'type') + cim.status = get_nullable(pb, 'status') + cim.comment = get_nullable(pb, 'comment') identified_object_to_cim(pb.io, cim, service) @@ -94,8 +99,8 @@ def organisation_role_to_cim(pb: PBOrganisationRole, cim: OrganisationRole, serv @bind_to_cim def identified_object_to_cim(pb: PBIdentifiedObject, cim: IdentifiedObject, service: BaseService): cim.mrid = pb.mRID - cim.name = pb.name - cim.description = pb.description + cim.name = get_nullable(pb, 'name') + cim.description = get_nullable(pb, 'description') [cim.add_name(name_to_cim(name, cim, service).type, name.name) for name in pb.names] @@ -120,7 +125,7 @@ def name_type_to_cim(pb: PBNameType, service: BaseService): nt = NameType(pb.name) service.add_name_type(nt) - nt.description = pb.description + nt.description = get_nullable(pb, 'description') return nt diff --git a/src/zepben/ewb/services/customer/translator/customer_cim2proto.py b/src/zepben/ewb/services/customer/translator/customer_cim2proto.py index 68942cef6..1b8e53bf3 100644 --- a/src/zepben/ewb/services/customer/translator/customer_cim2proto.py +++ b/src/zepben/ewb/services/customer/translator/customer_cim2proto.py @@ -16,7 +16,7 @@ from zepben.ewb.model.cim.iec61968.customers.customer_agreement import CustomerAgreement from zepben.ewb.model.cim.iec61968.customers.pricing_structure import PricingStructure from zepben.ewb.model.cim.iec61968.customers.tariff import Tariff -from zepben.ewb.services.common.translator.base_cim2proto import document_to_pb, organisation_role_to_pb +from zepben.ewb.services.common.translator.base_cim2proto import document_to_pb, organisation_role_to_pb, set_or_null, bind_to_pb from zepben.ewb.services.common.translator.util import mrid_or_empty # noinspection PyProtectedMember from zepben.ewb.services.customer.translator.customer_enum_mappers import _map_customer_kind @@ -26,6 +26,7 @@ # IEC61968 Common # ################### +@bind_to_pb def agreement_to_pb(cim: Agreement) -> PBAgreement: return PBAgreement(doc=document_to_pb(cim)) @@ -34,17 +35,21 @@ def agreement_to_pb(cim: Agreement) -> PBAgreement: # IEC61968 Customers # ###################### +@bind_to_pb def customer_to_pb(cim: Customer) -> PBCustomer: customer = PBCustomer( kind=_map_customer_kind.to_pb(cim.kind), - specialNeed=cim.special_need, - customerAgreementMRIDs=[str(io.mrid) for io in cim.agreements] + customerAgreementMRIDs=[str(io.mrid) for io in cim.agreements], + **set_or_null( + specialNeed=cim.special_need, + ) ) getattr(customer, 'or').CopyFrom(organisation_role_to_pb(cim)) return customer +@bind_to_pb def customer_agreement_to_pb(cim: CustomerAgreement) -> PBCustomerAgreement: return PBCustomerAgreement( agr=agreement_to_pb(cim), @@ -53,6 +58,7 @@ def customer_agreement_to_pb(cim: CustomerAgreement) -> PBCustomerAgreement: ) +@bind_to_pb def pricing_structure_to_pb(cim: PricingStructure) -> PBPricingStructure: return PBPricingStructure( doc=document_to_pb(cim), @@ -60,12 +66,6 @@ def pricing_structure_to_pb(cim: PricingStructure) -> PBPricingStructure: ) +@bind_to_pb def tariff_to_pb(cim: Tariff) -> PBTariff: return PBTariff(doc=document_to_pb(cim)) - - -Agreement.to_pb = agreement_to_pb -Customer.to_pb = customer_to_pb -CustomerAgreement.to_pb = customer_agreement_to_pb -PricingStructure.to_pb = pricing_structure_to_pb -Tariff.to_pb = tariff_to_pb diff --git a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py index ceec37c58..c07ca5156 100644 --- a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py +++ b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py @@ -16,12 +16,13 @@ from zepben.protobuf.cim.iec61968.customers.Tariff_pb2 import Tariff as PBTariff import zepben.ewb.services.common.resolver as resolver -from zepben.ewb import organisation_role_to_cim, document_to_cim, BaseService, CustomerKind +from zepben.ewb import organisation_role_to_cim, document_to_cim, BaseService, CustomerKind, bind_to_cim from zepben.ewb.model.cim.iec61968.common.agreement import Agreement from zepben.ewb.model.cim.iec61968.customers.customer import Customer from zepben.ewb.model.cim.iec61968.customers.customer_agreement import CustomerAgreement from zepben.ewb.model.cim.iec61968.customers.pricing_structure import PricingStructure from zepben.ewb.model.cim.iec61968.customers.tariff import Tariff +from zepben.ewb.services.common.translator.base_proto2cim import get_nullable from zepben.ewb.services.customer.customers import CustomerService @@ -29,6 +30,7 @@ # IEC61968 Common # ################### +@bind_to_cim def agreement_to_cim(pb: PBAgreement, cim: Agreement, service: BaseService): document_to_cim(pb.doc, cim, service) @@ -37,11 +39,12 @@ def agreement_to_cim(pb: PBAgreement, cim: Agreement, service: BaseService): # IEC61968 Customers # ###################### +@bind_to_cim def customer_to_cim(pb: PBCustomer, service: CustomerService) -> Optional[Customer]: cim = Customer( mrid=pb.mrid(), kind=CustomerKind(pb.kind), - special_need=pb.specialNeed if pb.specialNeed else None + special_need=get_nullable(pb, 'specialNeed') ) for mrid in pb.customerAgreementMRIDs: @@ -51,6 +54,7 @@ def customer_to_cim(pb: PBCustomer, service: CustomerService) -> Optional[Custom return cim if service.add(cim) else None +@bind_to_cim def customer_agreement_to_cim(pb: PBCustomerAgreement, service: CustomerService) -> Optional[CustomerAgreement]: cim = CustomerAgreement(mrid=pb.mrid()) @@ -62,6 +66,7 @@ def customer_agreement_to_cim(pb: PBCustomerAgreement, service: CustomerService) return cim if service.add(cim) else None +@bind_to_cim def pricing_structure_to_cim(pb: PBPricingStructure, service: CustomerService) -> Optional[PricingStructure]: cim = PricingStructure(mrid=pb.mrid()) @@ -72,16 +77,10 @@ def pricing_structure_to_cim(pb: PBPricingStructure, service: CustomerService) - return cim if service.add(cim) else None +@bind_to_cim def tariff_to_cim(pb: PBTariff, service: CustomerService) -> Optional[Tariff]: # noinspection PyArgumentList cim = Tariff(mrid=pb.mrid()) document_to_cim(pb.doc, cim, service) return cim if service.add(cim) else None - - -PBAgreement.to_cim = agreement_to_cim -PBCustomer.to_cim = customer_to_cim -PBCustomerAgreement.to_cim = customer_agreement_to_cim -PBPricingStructure.to_cim = pricing_structure_to_cim -PBTariff.to_cim = tariff_to_cim diff --git a/src/zepben/ewb/services/diagram/translator/diagram_cim2proto.py b/src/zepben/ewb/services/diagram/translator/diagram_cim2proto.py index b3a104991..2281d08f8 100644 --- a/src/zepben/ewb/services/diagram/translator/diagram_cim2proto.py +++ b/src/zepben/ewb/services/diagram/translator/diagram_cim2proto.py @@ -12,7 +12,7 @@ from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint -from zepben.ewb.services.common.translator.base_cim2proto import identified_object_to_pb +from zepben.ewb.services.common.translator.base_cim2proto import identified_object_to_pb, set_or_null, bind_to_pb from zepben.ewb.services.common.translator.util import mrid_or_empty # noinspection PyProtectedMember from zepben.ewb.services.diagram.translator.diagram_enum_mappers import _map_diagram_style, _map_orientation_kind @@ -22,6 +22,7 @@ # IEC61970 Base Diagram Layout # ################################ +@bind_to_pb def diagram_to_pb(cim: Diagram) -> PBDiagram: return PBDiagram( io=identified_object_to_pb(cim), @@ -31,21 +32,20 @@ def diagram_to_pb(cim: Diagram) -> PBDiagram: ) +@bind_to_pb def diagram_object_to_pb(cim: DiagramObject) -> PBDiagramObject: return PBDiagramObject( io=identified_object_to_pb(cim), diagramMRID=mrid_or_empty(cim.diagram), identifiedObjectMRID=cim.identified_object_mrid, - diagramObjectStyle=cim.style, + diagramObjectPoints=[diagram_object_point_to_pb(io) for io in cim.points], rotation=cim.rotation, - diagramObjectPoints=[diagram_object_point_to_pb(io) for io in cim.points] + **set_or_null( + diagramObjectStyle=cim.style, + ) ) +@bind_to_pb def diagram_object_point_to_pb(cim: DiagramObjectPoint) -> PBDiagramObjectPoint: return PBDiagramObjectPoint(xPosition=cim.x_position, yPosition=cim.y_position) - - -Diagram.to_pb = diagram_to_pb -DiagramObject.to_pb = diagram_object_to_pb -DiagramObjectPoint.to_pb = diagram_object_point_to_pb diff --git a/src/zepben/ewb/services/diagram/translator/diagram_proto2cim.py b/src/zepben/ewb/services/diagram/translator/diagram_proto2cim.py index f76577a9e..acba879d0 100644 --- a/src/zepben/ewb/services/diagram/translator/diagram_proto2cim.py +++ b/src/zepben/ewb/services/diagram/translator/diagram_proto2cim.py @@ -10,10 +10,11 @@ from zepben.protobuf.cim.iec61970.base.diagramlayout.Diagram_pb2 import Diagram as PBDiagram import zepben.ewb.services.common.resolver as resolver -from zepben.ewb import identified_object_to_cim, OrientationKind, DiagramStyle +from zepben.ewb import identified_object_to_cim, OrientationKind, DiagramStyle, add_to_network_or_none, bind_to_cim from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram import Diagram from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object import DiagramObject from zepben.ewb.model.cim.iec61970.base.diagramlayout.diagram_object_point import DiagramObjectPoint +from zepben.ewb.services.common.translator.base_proto2cim import get_nullable from zepben.ewb.services.diagram.diagrams import DiagramService @@ -21,6 +22,8 @@ # IEC61970 Base Diagram Layout # ################################ +@bind_to_cim +@add_to_network_or_none def diagram_to_cim(pb: PBDiagram, service: DiagramService): cim = Diagram( mrid=pb.mrid(), @@ -32,14 +35,15 @@ def diagram_to_cim(pb: PBDiagram, service: DiagramService): service.resolve_or_defer_reference(resolver.diagram_objects(cim), mrid) identified_object_to_cim(pb.io, cim, service) - return cim if service.add(cim) else None + return cim +@bind_to_cim def diagram_object_to_cim(pb: PBDiagramObject, service: DiagramService): cim = DiagramObject( mrid=pb.mrid(), identified_object_mrid=pb.identifiedObjectMRID if pb.identifiedObjectMRID else None, - style=pb.diagramObjectStyle if pb.diagramObjectStyle else None, + style=get_nullable(pb, 'diagramObjectStyle'), rotation=pb.rotation, ) @@ -51,11 +55,7 @@ def diagram_object_to_cim(pb: PBDiagramObject, service: DiagramService): return cim if service.add_diagram_object(cim) else None +@bind_to_cim def diagram_object_point_to_cim(pb: PBDiagramObjectPoint) -> DiagramObjectPoint: # noinspection PyArgumentList return DiagramObjectPoint(pb.xPosition, pb.yPosition) - - -PBDiagram.to_cim = diagram_to_cim -PBDiagramObject.to_cim = diagram_object_to_cim -PBDiagramObjectPoint.to_cim = diagram_object_point_to_cim diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py index d94aae2fe..bc0035a6c 100644 --- a/src/zepben/ewb/services/network/translator/network_cim2proto.py +++ b/src/zepben/ewb/services/network/translator/network_cim2proto.py @@ -301,7 +301,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import * from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import * from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import * -from zepben.ewb.services.common.translator.base_cim2proto import identified_object_to_pb, organisation_role_to_pb, document_to_pb, bind_to_pb +from zepben.ewb.services.common.translator.base_cim2proto import identified_object_to_pb, organisation_role_to_pb, document_to_pb, bind_to_pb, set_or_null from zepben.ewb.services.common.translator.util import mrid_or_empty, from_nullable_int, from_nullable_float, from_nullable_long, from_nullable_uint, \ nullable_bool_settings # noinspection PyProtectedMember @@ -328,9 +328,11 @@ class CimTranslationException(Exception): def relay_info_to_pb(cim: RelayInfo) -> PBRelayInfo: return PBRelayInfo( ai=asset_info_to_pb(cim), - curveSetting=cim.curve_setting, - **nullable_bool_settings("recloseFast", cim.reclose_fast), - recloseDelays=cim.reclose_delays + recloseDelays=cim.reclose_delays, + **set_or_null( + curveSetting=cim.curve_setting, + recloseFast=cim.reclose_fast, + ) ) @@ -349,7 +351,9 @@ def pan_demand_response_function_to_pb(cim: PanDemandResponseFunction) -> PBPanD return PBPanDemandResponseFunction( edf=end_device_function_to_pb(cim), kind=_map_end_device_function_kind.to_pb(cim.kind), - appliance=from_nullable_int(cim._appliance_bitmask) + **set_or_null( + appliance=cim._appliance_bitmask + ) ) @@ -403,32 +407,36 @@ def ev_charging_unit(cim: EvChargingUnit) -> PBEvChargingUnit: def distance_relay_to_pb(cim: DistanceRelay) -> PBDistanceRelay: return PBDistanceRelay( prf=protection_relay_function_to_pb(cim, True), - backwardBlind=from_nullable_float(cim.backward_blind), - backwardReach=from_nullable_float(cim.backward_reach), - backwardReactance=from_nullable_float(cim.backward_reactance), - forwardBlind=from_nullable_float(cim.forward_blind), - forwardReach=from_nullable_float(cim.forward_reach), - forwardReactance=from_nullable_float(cim.forward_reactance), - operationPhaseAngle1=from_nullable_float(cim.operation_phase_angle1), - operationPhaseAngle2=from_nullable_float(cim.operation_phase_angle2), - operationPhaseAngle3=from_nullable_float(cim.operation_phase_angle3) + **set_or_null( + backwardBlind=cim.backward_blind, + backwardReach=cim.backward_reach, + backwardReactance=cim.backward_reactance, + forwardBlind=cim.forward_blind, + forwardReach=cim.forward_reach, + forwardReactance=cim.forward_reactance, + operationPhaseAngle1=cim.operation_phase_angle1, + operationPhaseAngle2=cim.operation_phase_angle2, + operationPhaseAngle3=cim.operation_phase_angle3, + ) ) def protection_relay_function_to_pb(cim: ProtectionRelayFunction, include_asset_info: bool = False) -> PBProtectionRelayFunction: return PBProtectionRelayFunction( psr=power_system_resource_to_pb(cim, include_asset_info), - model=cim.model, - **nullable_bool_settings("reclosing", cim.reclosing), timeLimits=cim.time_limits, thresholds=[relay_setting_to_pb(rs) for rs in cim.thresholds], - relayDelayTime=from_nullable_float(cim.relay_delay_time), protectionKind=_map_protection_kind.to_pb(cim.protection_kind), protectedSwitchMRIDs=[str(io.mrid) for io in cim.protected_switches], - **nullable_bool_settings("directable", cim.directable), powerDirection=_map_power_direction_kind.to_pb(cim.power_direction), sensorMRIDs=[str(io.mrid) for io in cim.sensors], schemeMRIDs=[str(io.mrid) for io in cim.schemes], + **set_or_null( + model=cim.model, + reclosing=cim.reclosing, + relayDelayTime=cim.relay_delay_time, + directable=cim.directable, + ) ) @@ -436,8 +444,8 @@ def protection_relay_function_to_pb(cim: ProtectionRelayFunction, include_asset_ def protection_relay_scheme_to_pb(cim: ProtectionRelayScheme) -> PBProtectionRelayScheme: return PBProtectionRelayScheme( io=identified_object_to_pb(cim), + functionMRIDs=[str(io.mrid) for io in cim.functions], systemMRID=mrid_or_empty(cim.system), - functionMRIDs=[str(io.mrid) for io in cim.functions] ) @@ -452,9 +460,11 @@ def protection_relay_system_to_pb(cim: ProtectionRelaySystem) -> PBProtectionRel def relay_setting_to_pb(cim: RelaySetting) -> PBRelaySetting: return PBRelaySetting( - name=cim.name, unitSymbol=_map_unit_symbol.to_pb(cim.unit_symbol), - value=from_nullable_float(cim.value) + value=from_nullable_float(cim.value), + **set_or_null( + name=cim.name, + ) ) @@ -479,10 +489,12 @@ def battery_control_to_pb(cim: BatteryControl) -> PBBatteryControl: return PBBatteryControl( rc=regulating_control_to_pb(cim), - chargingRate=from_nullable_float(cim.charging_rate), - dischargingRate=from_nullable_float(cim.discharging_rate), - reservePercent=from_nullable_float(cim.reserve_percent), - controlMode=_map_battery_control_mode.to_pb(cim.control_mode) + controlMode=_map_battery_control_mode.to_pb(cim.control_mode), + **set_or_null( + chargingRate=cim.charging_rate, + dischargingRate=cim.discharging_rate, + reservePercent=cim.reserve_percent, + ) ) @@ -499,11 +511,13 @@ def cable_info_to_pb(cim: CableInfo) -> PBCableInfo: def no_load_test_to_pb(cim: NoLoadTest) -> PBNoLoadTest: return PBNoLoadTest( tt=transformer_test_to_pb(cim), - energisedEndVoltage=from_nullable_int(cim.energised_end_voltage), - excitingCurrent=from_nullable_float(cim.exciting_current), - excitingCurrentZero=from_nullable_float(cim.exciting_current_zero), - loss=from_nullable_int(cim.loss), - lossZero=from_nullable_int(cim.loss_zero), + **set_or_null( + energisedEndVoltage=cim.energised_end_voltage, + excitingCurrent=cim.exciting_current, + excitingCurrentZero=cim.exciting_current_zero, + loss=cim.loss, + lossZero=cim.loss_zero, + ) ) @@ -511,11 +525,13 @@ def no_load_test_to_pb(cim: NoLoadTest) -> PBNoLoadTest: def open_circuit_test_to_pb(cim: OpenCircuitTest) -> PBOpenCircuitTest: return PBOpenCircuitTest( tt=transformer_test_to_pb(cim), - energisedEndStep=from_nullable_int(cim.energised_end_step), - energisedEndVoltage=from_nullable_int(cim.energised_end_voltage), - openEndStep=from_nullable_int(cim.open_end_step), - openEndVoltage=from_nullable_int(cim.open_end_voltage), - phaseShift=from_nullable_float(cim.phase_shift), + **set_or_null( + energisedEndStep=cim.energised_end_step, + energisedEndVoltage=cim.energised_end_voltage, + openEndStep=cim.open_end_step, + openEndVoltage=cim.open_end_voltage, + phaseShift=cim.phase_shift, + ) ) @@ -536,16 +552,18 @@ def power_transformer_info_to_pb(cim: PowerTransformerInfo) -> PBPowerTransforme def short_circuit_test_to_pb(cim: ShortCircuitTest) -> PBShortCircuitTest: return PBShortCircuitTest( tt=transformer_test_to_pb(cim), - current=from_nullable_float(cim.current), - energisedEndStep=from_nullable_int(cim.energised_end_step), - groundedEndStep=from_nullable_int(cim.grounded_end_step), - leakageImpedance=from_nullable_float(cim.leakage_impedance), - leakageImpedanceZero=from_nullable_float(cim.leakage_impedance_zero), - loss=from_nullable_int(cim.loss), - lossZero=from_nullable_int(cim.loss_zero), - power=from_nullable_int(cim.power), - voltage=from_nullable_float(cim.voltage), - voltageOhmicPart=from_nullable_float(cim.voltage_ohmic_part), + **set_or_null( + current=cim.current, + energisedEndStep=cim.energised_end_step, + groundedEndStep=cim.grounded_end_step, + leakageImpedance=cim.leakage_impedance, + leakageImpedanceZero=cim.leakage_impedance_zero, + loss=cim.loss, + lossZero=cim.loss_zero, + power=cim.power, + voltage=cim.voltage, + voltageOhmicPart=cim.voltage_ohmic_part, + ) ) @@ -553,10 +571,12 @@ def short_circuit_test_to_pb(cim: ShortCircuitTest) -> PBShortCircuitTest: def shunt_compensator_info_to_pb(cim: ShuntCompensatorInfo) -> PBShuntCompensatorInfo: return PBShuntCompensatorInfo( ai=asset_info_to_pb(cim), - maxPowerLoss=from_nullable_int(cim.max_power_loss), - ratedCurrent=from_nullable_int(cim.rated_current), - ratedReactivePower=from_nullable_int(cim.rated_reactive_power), - ratedVoltage=from_nullable_int(cim.rated_voltage), + **set_or_null( + maxPowerLoss=cim.max_power_loss, + ratedCurrent=cim.rated_current, + ratedReactivePower=cim.rated_reactive_power, + ratedVoltage=cim.rated_voltage, + ) ) @@ -564,7 +584,9 @@ def shunt_compensator_info_to_pb(cim: ShuntCompensatorInfo) -> PBShuntCompensato def switch_info_to_pb(cim: SwitchInfo) -> PBSwitchInfo: return PBSwitchInfo( ai=asset_info_to_pb(cim), - ratedInterruptingTime=from_nullable_float(cim.rated_interrupting_time) + **set_or_null( + ratedInterruptingTime=cim.rated_interrupting_time + ) ) @@ -573,14 +595,7 @@ def transformer_end_info_to_pb(cim: TransformerEndInfo) -> PBTransformerEndInfo: return PBTransformerEndInfo( ai=asset_info_to_pb(cim), connectionKind=_map_winding_connection.to_pb(cim.connection_kind), - emergencyS=from_nullable_int(cim.emergency_s), endNumber=from_nullable_int(cim.end_number), - insulationU=from_nullable_int(cim.insulation_u), - phaseAngleClock=from_nullable_int(cim.phase_angle_clock), - r=from_nullable_float(cim.r), - ratedS=from_nullable_int(cim.rated_s), - ratedU=from_nullable_int(cim.rated_u), - shortTermS=from_nullable_int(cim.short_term_s), transformerTankInfoMRID=mrid_or_empty(cim.transformer_tank_info), transformerStarImpedanceMRID=mrid_or_empty(cim.transformer_star_impedance), energisedEndNoLoadTestsMRID=mrid_or_empty(cim.energised_end_no_load_tests), @@ -588,6 +603,15 @@ def transformer_end_info_to_pb(cim: TransformerEndInfo) -> PBTransformerEndInfo: groundedEndShortCircuitTestsMRID=mrid_or_empty(cim.grounded_end_short_circuit_tests), openEndOpenCircuitTestsMRID=mrid_or_empty(cim.open_end_open_circuit_tests), energisedEndOpenCircuitTestsMRID=mrid_or_empty(cim.energised_end_open_circuit_tests), + **set_or_null( + emergencyS=cim.emergency_s, + insulationU=cim.insulation_u, + phaseAngleClock=cim.phase_angle_clock, + r=cim.r, + ratedS=cim.rated_s, + ratedU=cim.rated_u, + shortTermS=cim.short_term_s, + ) ) @@ -603,8 +627,10 @@ def transformer_tank_info_to_pb(cim: TransformerTankInfo) -> PBTransformerTankIn def transformer_test_to_pb(cim: TransformerTest) -> PBTransformerTest: return PBTransformerTest( io=identified_object_to_pb(cim), - basePower=from_nullable_int(cim.base_power), - temperature=from_nullable_float(cim.temperature), + **set_or_null( + basePower=cim.base_power, + temperature=cim.temperature, + ) ) @@ -612,8 +638,10 @@ def transformer_test_to_pb(cim: TransformerTest) -> PBTransformerTest: def wire_info_to_pb(cim: WireInfo) -> PBWireInfo: return PBWireInfo( ai=asset_info_to_pb(cim), - ratedCurrent=from_nullable_int(cim.rated_current), - material=_map_wire_material_kind.to_pb(cim.material) + material=_map_wire_material_kind.to_pb(cim.material), + **set_or_null( + ratedCurrent=cim.rated_current, + ) ) @@ -626,7 +654,7 @@ def asset_to_pb(cim: Asset) -> PBAsset: io=identified_object_to_pb(cim), locationMRID=cim.location.mrid if cim.location else None, organisationRoleMRIDs=[str(io.mrid) for io in cim.organisation_roles], - powerSystemResourceMRIDs=[str(io.mrid) for io in cim.power_system_resources] + powerSystemResourceMRIDs=[str(io.mrid) for io in cim.power_system_resources], ) @@ -663,8 +691,10 @@ def streetlight_to_pb(cim: Streetlight) -> PBStreetlight: return PBStreetlight( at=asset_to_pb(cim), poleMRID=mrid_or_empty(cim.pole), - lightRating=from_nullable_uint(cim.light_rating), - lampKind=_map_streetlight_lamp_kind.to_pb(cim.lamp_kind) + lampKind=_map_streetlight_lamp_kind.to_pb(cim.lamp_kind), + **set_or_null( + lightRating=cim.light_rating, + ) ) @@ -686,32 +716,44 @@ def location_to_pb(cim: Location) -> PBLocation: def position_point_to_pb(cim: PositionPoint) -> PBPositionPoint: - return PBPositionPoint(xPosition=cim.x_position, yPosition=cim.y_position) + return PBPositionPoint( + xPosition=cim.x_position, + yPosition=cim.y_position + ) def street_address_to_pb(cim: StreetAddress) -> PBStreetAddress: return PBStreetAddress( - postalCode=cim.postal_code, townDetail=_get_or_none(town_detail_to_pb, cim.town_detail), - poBox=cim.po_box, - streetDetail=_get_or_none(street_detail_to_pb, cim.street_detail) + streetDetail=_get_or_none(street_detail_to_pb, cim.street_detail), + **set_or_null( + postalCode=cim.postal_code, + poBox=cim.po_box, + ) ) def street_detail_to_pb(cim: StreetDetail) -> PBStreetDetail: return PBStreetDetail( - buildingName=cim.building_name, - floorIdentification=cim.floor_identification, - name=cim.name, - number=cim.number, - suiteNumber=cim.suite_number, - type=cim.type, - displayAddress=cim.display_address + **set_or_null( + buildingName=cim.building_name, + floorIdentification=cim.floor_identification, + name=cim.name, + number=cim.number, + suiteNumber=cim.suite_number, + type=cim.type, + displayAddress=cim.display_address + ) ) def town_detail_to_pb(cim: TownDetail) -> PBTownDetail: - return PBTownDetail(name=cim.name, stateOrProvince=cim.state_or_province) + return PBTownDetail( + **set_or_null( + name=cim.name, + stateOrProvince=cim.state_or_province + ) + ) ##################################### @@ -722,18 +764,20 @@ def town_detail_to_pb(cim: TownDetail) -> PBTownDetail: def current_transformer_info_to_pb(cim: CurrentTransformerInfo) -> PBCurrentTransformerInfo: return PBCurrentTransformerInfo( ai=asset_info_to_pb(cim), - accuracyClass=cim.accuracy_class, - accuracyLimit=from_nullable_float(cim.accuracy_limit), - coreCount=from_nullable_int(cim.core_count), - ctClass=cim.ct_class, - kneePointVoltage=from_nullable_int(cim.knee_point_voltage), maxRatio=_get_or_none(ratio_to_pb, cim.max_ratio), nominalRatio=_get_or_none(ratio_to_pb, cim.nominal_ratio), - primaryRatio=from_nullable_float(cim.primary_ratio), - ratedCurrent=from_nullable_int(cim.rated_current), - secondaryFlsRating=from_nullable_int(cim.secondary_fls_rating), - secondaryRatio=from_nullable_float(cim.secondary_ratio), - usage=cim.usage + **set_or_null( + accuracyClass=cim.accuracy_class, + accuracyLimit=cim.accuracy_limit, + coreCount=cim.core_count, + ctClass=cim.ct_class, + kneePointVoltage=cim.knee_point_voltage, + primaryRatio=cim.primary_ratio, + ratedCurrent=cim.rated_current, + secondaryFlsRating=cim.secondary_fls_rating, + secondaryRatio=cim.secondary_ratio, + usage=cim.usage, + ) ) @@ -741,12 +785,15 @@ def current_transformer_info_to_pb(cim: CurrentTransformerInfo) -> PBCurrentTran def potential_transformer_info_to_pb(cim: PotentialTransformerInfo) -> PBPotentialTransformerInfo: return PBPotentialTransformerInfo( ai=asset_info_to_pb(cim), - accuracyClass=cim.accuracy_class, nominalRatio=_get_or_none(ratio_to_pb, cim.nominal_ratio), - primaryRatio=from_nullable_float(cim.primary_ratio), - ptClass=cim.pt_class, - ratedVoltage=from_nullable_int(cim.rated_voltage), - secondaryRatio=from_nullable_float(cim.secondary_ratio) + **set_or_null( + accuracyClass=cim.accuracy_class, + primaryRatio=cim.primary_ratio, + ptClass=cim.pt_class, + ratedVoltage=cim.rated_voltage, + secondaryRatio=cim.secondary_ratio, + + ) ) @@ -759,7 +806,9 @@ def pole_to_pb(cim: Pole) -> PBPole: return PBPole( st=structure_to_pb(cim), streetlightMRIDs=[str(io.mrid) for io in cim.streetlights], - classification=cim.classification + **set_or_null( + classification=cim.classification, + ) ) @@ -786,7 +835,7 @@ def end_device_to_pb(cim: EndDevice) -> PBEndDevice: usagePointMRIDs=[str(io.mrid) for io in cim.usage_points], endDeviceFunctionMRIDs=[str(io.mrid) for io in cim.functions], customerMRID=cim.customer_mrid, - serviceLocationMRID=mrid_or_empty(cim.service_location) + serviceLocationMRID=mrid_or_empty(cim.service_location), ) @@ -798,7 +847,9 @@ def end_device_function_to_pb(cim: EndDeviceFunction) -> PBEndDeviceFunction: """ return PBEndDeviceFunction( af=asset_function_to_pb(cim), - **nullable_bool_settings("enabled", cim.enabled) + **set_or_null( + enabled=cim.enabled, + ) ) @@ -814,11 +865,13 @@ def usage_point_to_pb(cim: UsagePoint) -> PBUsagePoint: usagePointLocationMRID=mrid_or_empty(cim.usage_point_location), equipmentMRIDs=[str(io.mrid) for io in cim.equipment], endDeviceMRIDs=[str(io.mrid) for io in cim.end_devices], - isVirtual=cim.is_virtual, - connectionCategory=cim.connection_category, - ratedPower=from_nullable_int(cim.rated_power), - approvedInverterCapacity=from_nullable_int(cim.approved_inverter_capacity), - phaseCode=_map_phase_code.to_pb(cim.phase_code) + phaseCode=_map_phase_code.to_pb(cim.phase_code), + **set_or_null( + isVirtual=cim.is_virtual, + connectionCategory=cim.connection_category, + ratedPower=cim.rated_power, + approvedInverterCapacity=cim.approved_inverter_capacity, + ), ) @@ -846,7 +899,9 @@ def auxiliary_equipment_to_pb(cim: AuxiliaryEquipment, include_asset_info: bool def current_transformer_to_pb(cim: CurrentTransformer) -> PBCurrentTransformer: return PBCurrentTransformer( sn=sensor_to_pb(cim, True), - coreBurden=from_nullable_int(cim.core_burden) + **set_or_null( + coreBurden=cim.core_burden, + ) ) @@ -911,12 +966,13 @@ def curve_to_pb(cim: Curve) -> PBCurve: def curve_data_to_pb(cim: CurveData) -> PBCurveData: - return PBCurveData( + return PBCurveData(**set_or_null( xValue=cim.x_value, y1Value=cim.y1_value, y2Value=from_nullable_float(cim.y2_value), y3Value=from_nullable_float(cim.y3_value) ) + ) def equipment_to_pb(cim: Equipment, include_asset_info: bool = False) -> PBEquipment: @@ -932,7 +988,7 @@ def equipment_to_pb(cim: Equipment, include_asset_info: bool = False) -> PBEquip usagePointMRIDs=[str(io.mrid) for io in cim.usage_points], operationalRestrictionMRIDs=[str(io.mrid) for io in cim.operational_restrictions], currentContainerMRIDs=[str(io.mrid) for io in cim.current_containers], - commissionedDate=ts + commissionedDate=ts, ) @@ -1012,22 +1068,24 @@ def terminal_to_pb(cim: Terminal) -> PBTerminal: def equivalent_branch_to_pb(cim: EquivalentBranch) -> PBEquivalentBranch: return PBEquivalentBranch( ee=equivalent_equipment_to_pb(cim), - negativeR12=from_nullable_float(cim.negative_r12), - negativeR21=from_nullable_float(cim.negative_r21), - negativeX12=from_nullable_float(cim.negative_x12), - negativeX21=from_nullable_float(cim.negative_x21), - positiveR12=from_nullable_float(cim.positive_r12), - positiveR21=from_nullable_float(cim.positive_r21), - positiveX12=from_nullable_float(cim.positive_x12), - positiveX21=from_nullable_float(cim.positive_x21), - r=from_nullable_float(cim.r), - r21=from_nullable_float(cim.r21), - x=from_nullable_float(cim.x), - x21=from_nullable_float(cim.x21), - zeroR12=from_nullable_float(cim.zero_r12), - zeroR21=from_nullable_float(cim.zero_r21), - zeroX12=from_nullable_float(cim.zero_x12), - zeroX21=from_nullable_float(cim.zero_x21), + **set_or_null( + negativeR12=cim.negative_r12, + negativeR21=cim.negative_r21, + negativeX12=cim.negative_x12, + negativeX21=cim.negative_x21, + positiveR12=cim.positive_r12, + positiveR21=cim.positive_r21, + positiveX12=cim.positive_x12, + positiveX21=cim.positive_x21, + r=cim.r, + r21=cim.r21, + x=cim.x, + x21=cim.x21, + zeroR12=cim.zero_r12, + zeroR21=cim.zero_r21, + zeroX12=cim.zero_x12, + zeroX21=cim.zero_x21, + ) ) @@ -1049,9 +1107,11 @@ def battery_unit_to_pb(cim: BatteryUnit) -> PBBatteryUnit: return PBBatteryUnit( peu=power_electronics_unit_to_pb(cim), batteryControlMRIDs=[str(io.mrid) for io in cim.controls], - ratedE=from_nullable_long(cim.rated_e), - storedE=from_nullable_long(cim.stored_e), - batteryState=_map_battery_state_kind.to_pb(cim.battery_state) + batteryState=_map_battery_state_kind.to_pb(cim.battery_state), + **set_or_null( + ratedE=cim.rated_e, + storedE=cim.stored_e, + ) ) @@ -1063,9 +1123,11 @@ def photo_voltaic_unit_to_pb(cim: PhotoVoltaicUnit) -> PBPhotoVoltaicUnit: def power_electronics_unit_to_pb(cim: PowerElectronicsUnit) -> PBPowerElectronicsUnit: return PBPowerElectronicsUnit( eq=equipment_to_pb(cim), - maxP=from_nullable_int(cim.max_p), - minP=from_nullable_int(cim.min_p), - powerElectronicsConnectionMRID=mrid_or_empty(cim.power_electronics_connection) + powerElectronicsConnectionMRID=mrid_or_empty(cim.power_electronics_connection), + **set_or_null( + maxP=cim.max_p, + minP=cim.min_p, + ) ) @@ -1087,7 +1149,9 @@ def accumulator_to_pb(cim: Accumulator) -> PBAccumulator: def analog_to_pb(cim: Analog) -> PBAnalog: return PBAnalog( measurement=measurement_to_pb(cim), - positiveFlowIn=cim.positive_flow_in + **set_or_null( + positiveFlowIn=cim.positive_flow_in + ) ) @@ -1128,9 +1192,11 @@ def measurement_to_pb(cim: Measurement) -> PBMeasurement: def current_relay_to_pb(cim: CurrentRelay) -> PBCurrentRelay: return PBCurrentRelay( prf=protection_relay_function_to_pb(cim, True), - currentLimit1=from_nullable_float(cim.current_limit_1), - **nullable_bool_settings("inverseTimeFlag", cim.inverse_time_flag), - timeDelay1=from_nullable_float(cim.time_delay_1), + **set_or_null( + currentLimit1=cim.current_limit_1, + inverseTimeFlag=cim.inverse_time_flag, + timeDelay1=cim.time_delay_1, + ) ) @@ -1181,7 +1247,9 @@ def ac_line_segment_to_pb(cim: AcLineSegment) -> PBAcLineSegment: def breaker_to_pb(cim: Breaker) -> PBBreaker: return PBBreaker( sw=protected_switch_to_pb(cim), - inTransitTime=from_nullable_float(cim.in_transit_time) + **set_or_null( + inTransitTime=cim.in_transit_time, + ) ) @@ -1194,17 +1262,21 @@ def busbar_section_to_pb(cim: BusbarSection) -> PBBusbarSection: def clamp_to_pb(cim: Clamp) -> PBClamp: return PBClamp( ce=conducting_equipment_to_pb(cim), - lengthFromTerminal1=from_nullable_float(cim.length_from_terminal_1), - acLineSegmentMRID=mrid_or_empty(cim.ac_line_segment) + acLineSegmentMRID=mrid_or_empty(cim.ac_line_segment), + **set_or_null( + lengthFromTerminal1=cim.length_from_terminal_1, + ) ) def conductor_to_pb(cim: Conductor) -> PBConductor: return PBConductor( ce=conducting_equipment_to_pb(cim, True), - length=from_nullable_float(cim.length), - designTemperature=from_nullable_int(cim.design_temperature), - designRating=from_nullable_float(cim.design_rating) + **set_or_null( + length=cim.length, + designTemperature=cim.design_temperature, + designRating=cim.design_rating, + ) ) @@ -1216,8 +1288,10 @@ def connector_to_pb(cim: Connector) -> PBConnector: def cut_to_pb(cim: Cut) -> PBCut: return PBCut( sw=switch_to_pb(cim), - lengthFromTerminal1=from_nullable_float(cim.length_from_terminal_1), - acLineSegmentMRID=mrid_or_empty(cim.ac_line_segment) + acLineSegmentMRID=mrid_or_empty(cim.ac_line_segment), + **set_or_null( + lengthFromTerminal1=cim.length_from_terminal_1, + ) ) @@ -1229,7 +1303,9 @@ def disconnector_to_pb(cim: Disconnector) -> PBDisconnector: def earth_fault_compensator_to_pb(cim: EarthFaultCompensator) -> PBEarthFaultCompensator: return PBEarthFaultCompensator( ce=conducting_equipment_to_pb(cim), - r=from_nullable_float(cim.r) + **set_or_null( + r=cim.r + ) ) @@ -1242,13 +1318,15 @@ def energy_consumer_to_pb(cim: EnergyConsumer) -> PBEnergyConsumer: return PBEnergyConsumer( ec=energy_connection_to_pb(cim), energyConsumerPhasesMRIDs=[str(io.mrid) for io in cim.phases], - customerCount=from_nullable_int(cim.customer_count), - grounded=cim.grounded, phaseConnection=_map_phase_shunt_connection_kind.to_pb(cim.phase_connection), - p=from_nullable_float(cim.p), - pFixed=from_nullable_float(cim.p_fixed), - q=from_nullable_float(cim.q), - qFixed=from_nullable_float(cim.q_fixed) + **set_or_null( + p=cim.p, + pFixed=cim.p_fixed, + q=cim.q, + qFixed=cim.q_fixed, + customerCount=cim.customer_count, + grounded=cim.grounded, + ) ) @@ -1258,10 +1336,12 @@ def energy_consumer_phase_to_pb(cim: EnergyConsumerPhase) -> PBEnergyConsumerPha psr=power_system_resource_to_pb(cim), energyConsumerMRID=mrid_or_empty(cim.energy_consumer), phase=_map_single_phase_kind.to_pb(cim.phase), - p=from_nullable_float(cim.p), - pFixed=from_nullable_float(cim.p_fixed), - q=from_nullable_float(cim.q), - qFixed=from_nullable_float(cim.q_fixed) + **set_or_null( + p=cim.p, + pFixed=cim.p_fixed, + q=cim.q, + qFixed=cim.q_fixed, + ) ) @@ -1270,31 +1350,33 @@ def energy_source_to_pb(cim: EnergySource) -> PBEnergySource: return PBEnergySource( ec=energy_connection_to_pb(cim), energySourcePhasesMRIDs=[str(io.mrid) for io in cim.phases], - activePower=from_nullable_float(cim.active_power), - reactivePower=from_nullable_float(cim.reactive_power), - voltageAngle=from_nullable_float(cim.voltage_angle), - voltageMagnitude=from_nullable_float(cim.voltage_magnitude), - r=from_nullable_float(cim.r), - x=from_nullable_float(cim.x), - pMax=from_nullable_float(cim.p_max), - pMin=from_nullable_float(cim.p_min), - r0=from_nullable_float(cim.r0), - rn=from_nullable_float(cim.rn), - x0=from_nullable_float(cim.x0), - xn=from_nullable_float(cim.xn), - isExternalGrid=cim.is_external_grid, - rMin=from_nullable_float(cim.r_min), - rnMin=from_nullable_float(cim.rn_min), - r0Min=from_nullable_float(cim.r0_min), - xMin=from_nullable_float(cim.x_min), - xnMin=from_nullable_float(cim.xn_min), - x0Min=from_nullable_float(cim.x0_min), - rMax=from_nullable_float(cim.r_max), - rnMax=from_nullable_float(cim.rn_max), - r0Max=from_nullable_float(cim.r0_max), - xMax=from_nullable_float(cim.x_max), - xnMax=from_nullable_float(cim.xn_max), - x0Max=from_nullable_float(cim.x0_max) + **set_or_null( + activePower=cim.active_power, + reactivePower=cim.reactive_power, + voltageAngle=cim.voltage_angle, + voltageMagnitude=cim.voltage_magnitude, + r=cim.r, + x=cim.x, + pMax=cim.p_max, + pMin=cim.p_min, + r0=cim.r0, + rn=cim.rn, + x0=cim.x0, + xn=cim.xn, + isExternalGrid=cim.is_external_grid, + rMin=cim.r_min, + rnMin=cim.rn_min, + r0Min=cim.r0_min, + xMin=cim.x_min, + xnMin=cim.xn_min, + x0Min=cim.x0_min, + rMax=cim.r_max, + rnMax=cim.rn_max, + r0Max=cim.r0_max, + xMax=cim.x_max, + xnMax=cim.xn_max, + x0Max=cim.x0_max, + ) ) @@ -1333,7 +1415,9 @@ def ground_disconnector_to_pb(cim: GroundDisconnector) -> PBGroundDisconnector: def grounding_impedance_to_pb(cim: GroundingImpedance) -> PBGroundingImpedance: return PBGroundingImpedance( efc=earth_fault_compensator_to_pb(cim), - x=from_nullable_float(cim.x) + **set_or_null( + x=cim.x, + ) ) @@ -1355,10 +1439,12 @@ def line_to_pb(cim: Line) -> PBLine: def linear_shunt_compensator_to_pb(cim: LinearShuntCompensator) -> PBLinearShuntCompensator: return PBLinearShuntCompensator( sc=shunt_compensator_to_pb(cim), - b0PerSection=from_nullable_float(cim.b0_per_section), - bPerSection=from_nullable_float(cim.b_per_section), - g0PerSection=from_nullable_float(cim.g0_per_section), - gPerSection=from_nullable_float(cim.g_per_section) + **set_or_null( + b0PerSection=cim.b0_per_section, + bPerSection=cim.b_per_section, + g0PerSection=cim.g0_per_section, + gPerSection=cim.g_per_section, + ) ) @@ -1392,14 +1478,16 @@ def per_length_phase_impedance_to_pb(cim: PerLengthPhaseImpedance) -> PBPerLengt def per_length_sequence_impedance_to_pb(cim: PerLengthSequenceImpedance) -> PBPerLengthSequenceImpedance: return PBPerLengthSequenceImpedance( pli=per_length_impedance_to_pb(cim), - r=from_nullable_float(cim.r), - x=from_nullable_float(cim.x), - r0=from_nullable_float(cim.r0), - x0=from_nullable_float(cim.x0), - bch=from_nullable_float(cim.bch), - gch=from_nullable_float(cim.gch), - b0ch=from_nullable_float(cim.b0ch), - g0ch=from_nullable_float(cim.g0ch) + **set_or_null( + r=cim.r, + x=cim.x, + r0=cim.r0, + x0=cim.x0, + bch=cim.bch, + gch=cim.gch, + b0ch=cim.b0ch, + g0ch=cim.g0ch, + ) ) @@ -1407,7 +1495,9 @@ def per_length_sequence_impedance_to_pb(cim: PerLengthSequenceImpedance) -> PBPe def petersen_coil_to_pb(cim: PetersenCoil) -> PBPetersenCoil: return PBPetersenCoil( efc=earth_fault_compensator_to_pb(cim), - xGroundNominal=from_nullable_float(cim.x_ground_nominal) + **set_or_null( + xGroundNominal=cim.x_ground_nominal + ) ) @@ -1420,10 +1510,12 @@ def phase_impedance_data_to_pb(cim: PhaseImpedanceData) -> PBPhaseImpedanceData: return PBPhaseImpedanceData( fromPhase=_map_single_phase_kind.to_pb(cim.from_phase), toPhase=_map_single_phase_kind.to_pb(cim.to_phase), - b=from_nullable_float(cim.b), - g=from_nullable_float(cim.g), - r=from_nullable_float(cim.r), - x=from_nullable_float(cim.x), + **set_or_null( + b=cim.b, + g=cim.g, + r=cim.r, + x=cim.x, + ) ) @@ -1433,37 +1525,39 @@ def power_electronics_connection_to_pb(cim: PowerElectronicsConnection) -> PBPow rce=regulating_cond_eq_to_pb(cim), powerElectronicsUnitMRIDs=[str(io.mrid) for io in cim.units], powerElectronicsConnectionPhaseMRIDs=[str(io.mrid) for io in cim.phases], - maxIFault=from_nullable_int(cim.max_i_fault), - maxQ=from_nullable_float(cim.max_q), - minQ=from_nullable_float(cim.min_q), - p=from_nullable_float(cim.p), - q=from_nullable_float(cim.q), - ratedS=from_nullable_int(cim.rated_s), - ratedU=from_nullable_int(cim.rated_u), - inverterStandard=cim.inverter_standard, - sustainOpOvervoltLimit=from_nullable_int(cim.sustain_op_overvolt_limit), - stopAtOverFreq=from_nullable_float(cim.stop_at_over_freq), - stopAtUnderFreq=from_nullable_float(cim.stop_at_under_freq), - **nullable_bool_settings("invVoltWattRespMode", cim.inv_volt_watt_resp_mode), - invWattRespV1=from_nullable_int(cim.inv_watt_resp_v1), - invWattRespV2=from_nullable_int(cim.inv_watt_resp_v2), - invWattRespV3=from_nullable_int(cim.inv_watt_resp_v3), - invWattRespV4=from_nullable_int(cim.inv_watt_resp_v4), - invWattRespPAtV1=from_nullable_float(cim.inv_watt_resp_p_at_v1), - invWattRespPAtV2=from_nullable_float(cim.inv_watt_resp_p_at_v2), - invWattRespPAtV3=from_nullable_float(cim.inv_watt_resp_p_at_v3), - invWattRespPAtV4=from_nullable_float(cim.inv_watt_resp_p_at_v4), - **nullable_bool_settings("invVoltVarRespMode", cim.inv_volt_var_resp_mode), - invVarRespV1=from_nullable_int(cim.inv_var_resp_v1), - invVarRespV2=from_nullable_int(cim.inv_var_resp_v2), - invVarRespV3=from_nullable_int(cim.inv_var_resp_v3), - invVarRespV4=from_nullable_int(cim.inv_var_resp_v4), - invVarRespQAtV1=from_nullable_float(cim.inv_var_resp_q_at_v1), - invVarRespQAtV2=from_nullable_float(cim.inv_var_resp_q_at_v2), - invVarRespQAtV3=from_nullable_float(cim.inv_var_resp_q_at_v3), - invVarRespQAtV4=from_nullable_float(cim.inv_var_resp_q_at_v4), - **nullable_bool_settings("invReactivePowerMode", cim.inv_reactive_power_mode), - invFixReactivePower=from_nullable_float(cim.inv_fix_reactive_power) + **set_or_null( + maxIFault=cim.max_i_fault, + maxQ=cim.max_q, + minQ=cim.min_q, + p=cim.p, + q=cim.q, + ratedS=cim.rated_s, + ratedU=cim.rated_u, + inverterStandard=cim.inverter_standard, + sustainOpOvervoltLimit=cim.sustain_op_overvolt_limit, + stopAtOverFreq=cim.stop_at_over_freq, + stopAtUnderFreq=cim.stop_at_under_freq, + invVoltWattRespMode=cim.inv_volt_watt_resp_mode, + invWattRespV1=cim.inv_watt_resp_v1, + invWattRespV2=cim.inv_watt_resp_v2, + invWattRespV3=cim.inv_watt_resp_v3, + invWattRespV4=cim.inv_watt_resp_v4, + invWattRespPAtV1=cim.inv_watt_resp_p_at_v1, + invWattRespPAtV2=cim.inv_watt_resp_p_at_v2, + invWattRespPAtV3=cim.inv_watt_resp_p_at_v3, + invWattRespPAtV4=cim.inv_watt_resp_p_at_v4, + invVoltVarRespMode=cim.inv_volt_var_resp_mode, + invVarRespV1=cim.inv_var_resp_v1, + invVarRespV2=cim.inv_var_resp_v2, + invVarRespV3=cim.inv_var_resp_v3, + invVarRespV4=cim.inv_var_resp_v4, + invVarRespQAtV1=cim.inv_var_resp_q_at_v1, + invVarRespQAtV2=cim.inv_var_resp_q_at_v2, + invVarRespQAtV3=cim.inv_var_resp_q_at_v3, + invVarRespQAtV4=cim.inv_var_resp_q_at_v4, + invReactivePowerMode=cim.inv_reactive_power_mode, + invFixReactivePower=cim.inv_fix_reactive_power, + ) ) @@ -1472,9 +1566,11 @@ def power_electronics_connection_phase_to_pb(cim: PowerElectronicsConnectionPhas return PBPowerElectronicsConnectionPhase( psr=power_system_resource_to_pb(cim), powerElectronicsConnectionMRID=mrid_or_empty(cim.power_electronics_connection), - p=from_nullable_float(cim.p), - q=from_nullable_float(cim.q), - phase=_map_single_phase_kind.to_pb(cim.phase) + phase=_map_single_phase_kind.to_pb(cim.phase), + **set_or_null( + p=cim.p, + q=cim.q, + ) ) @@ -1484,9 +1580,11 @@ def power_transformer_to_pb(cim: PowerTransformer) -> PBPowerTransformer: ce=conducting_equipment_to_pb(cim, True), powerTransformerEndMRIDs=[str(io.mrid) for io in cim.ends], vectorGroup=_map_vector_group.to_pb(cim.vector_group), - transformerUtilisation=from_nullable_float(cim.transformer_utilisation), constructionKind=_map_transformer_construction_kind.to_pb(cim.construction_kind), - function=_map_transformer_function_kind.to_pb(cim.function) + function=_map_transformer_function_kind.to_pb(cim.function), + **set_or_null( + transformerUtilisation=cim.transformer_utilisation, + ) ) @@ -1495,27 +1593,31 @@ def power_transformer_end_to_pb(cim: PowerTransformerEnd) -> PBPowerTransformerE return PBPowerTransformerEnd( te=transformer_end_to_pb(cim), powerTransformerMRID=mrid_or_empty(cim.power_transformer), - ratedS=from_nullable_int(cim.rated_s), - ratedU=from_nullable_int(cim.rated_u), - r=from_nullable_float(cim.r), - r0=from_nullable_float(cim.r0), - x=from_nullable_float(cim.x), - x0=from_nullable_float(cim.x0), connectionKind=_map_winding_connection.to_pb(cim.connection_kind), - b=from_nullable_float(cim.b), - b0=from_nullable_float(cim.b0), - g=from_nullable_float(cim.g), - g0=from_nullable_float(cim.g0), - phaseAngleClock=from_nullable_int(cim.phase_angle_clock), - ratings=[transformer_end_rated_s_to_pb(it) for it in cim.s_ratings] + ratings=[transformer_end_rated_s_to_pb(it) for it in cim.s_ratings], + **set_or_null( + ratedS=cim.rated_s, + ratedU=cim.rated_u, + r=cim.r, + r0=cim.r0, + x=cim.x, + x0=cim.x0, + b=cim.b, + b0=cim.b0, + g=cim.g, + g0=cim.g0, + phaseAngleClock=cim.phase_angle_clock, + ) ) def protected_switch_to_pb(cim: ProtectedSwitch) -> PBProtectedSwitch: return PBProtectedSwitch( sw=switch_to_pb(cim), - breakingCapacity=from_nullable_int(cim.breaking_capacity), - relayFunctionMRIDs=[str(io.mrid) for io in cim.relay_functions] + relayFunctionMRIDs=[str(io.mrid) for io in cim.relay_functions], + **set_or_null( + breakingCapacity=cim.breaking_capacity, + ) ) @@ -1524,7 +1626,9 @@ def ratio_tap_changer_to_pb(cim: RatioTapChanger) -> PBRatioTapChanger: return PBRatioTapChanger( tc=tap_changer_to_pb(cim), transformerEndMRID=mrid_or_empty(cim.transformer_end), - stepVoltageIncrement=from_nullable_float(cim.step_voltage_increment) + **set_or_null( + stepVoltageIncrement=cim.step_voltage_increment, + ) ) @@ -1541,8 +1645,10 @@ def recloser_to_pb(cim: Recloser) -> PBRecloser: def regulating_cond_eq_to_pb(cim: RegulatingCondEq, include_asset_info=False) -> PBRegulatingCondEq: return PBRegulatingCondEq( ec=energy_connection_to_pb(cim, include_asset_info), - controlEnabled=cim.control_enabled, - regulatingControlMRID=mrid_or_empty(cim.regulating_control) + regulatingControlMRID=mrid_or_empty(cim.regulating_control), + **set_or_null( + controlEnabled=cim.control_enabled, + ) ) @@ -1554,30 +1660,34 @@ def regulating_control_to_pb(cim: RegulatingControl) -> PBRegulatingControl: """ return PBRegulatingControl( psr=power_system_resource_to_pb(cim), - **nullable_bool_settings("discrete", cim.discrete), mode=_map_regulating_control_mode_kind.to_pb(cim.mode), monitoredPhase=_map_phase_code.to_pb(cim.monitored_phase), - targetDeadband=from_nullable_float(cim.target_deadband), - targetValue=from_nullable_float(cim.target_value), - **nullable_bool_settings("enabled", cim.enabled), - maxAllowedTargetValue=from_nullable_float(cim.max_allowed_target_value), - minAllowedTargetValue=from_nullable_float(cim.min_allowed_target_value), - ratedCurrent=from_nullable_float(cim.rated_current), terminalMRID=mrid_or_empty(cim.terminal), - ctPrimary=from_nullable_float(cim.ct_primary), - minTargetDeadband=from_nullable_float(cim.min_target_deadband), - regulatingCondEqMRIDs=[str(io.mrid) for io in cim.regulating_conducting_equipment] + regulatingCondEqMRIDs=[str(io.mrid) for io in cim.regulating_conducting_equipment], + **set_or_null( + discrete=cim.discrete, + targetDeadband=cim.target_deadband, + targetValue=cim.target_value, + enabled=cim.enabled, + maxAllowedTargetValue=cim.max_allowed_target_value, + minAllowedTargetValue=cim.min_allowed_target_value, + ratedCurrent=cim.rated_current, + ctPrimary=cim.ct_primary, + minTargetDeadband=cim.min_target_deadband, + ) ) def rotating_machine_to_pb(cim: RotatingMachine) -> PBRotatingMachine: return PBRotatingMachine( rce=regulating_cond_eq_to_pb(cim, True), - ratedPowerFactor=from_nullable_float(cim.rated_power_factor), - ratedS=from_nullable_float(cim.rated_s), - ratedU=from_nullable_int(cim.rated_u), - p=from_nullable_float(cim.p), - q=from_nullable_float(cim.q) + **set_or_null( + ratedPowerFactor=cim.rated_power_factor, + ratedS=cim.rated_s, + ratedU=cim.rated_u, + p=cim.p, + q=cim.q, + ) ) @@ -1585,22 +1695,26 @@ def rotating_machine_to_pb(cim: RotatingMachine) -> PBRotatingMachine: def series_compensator_to_pb(cim: SeriesCompensator) -> PBSeriesCompensator: return PBSeriesCompensator( ce=conducting_equipment_to_pb(cim, True), - r=from_nullable_float(cim.r), - r0=from_nullable_float(cim.r0), - x=from_nullable_float(cim.x), - x0=from_nullable_float(cim.x0), - varistorRatedCurrent=from_nullable_int(cim.varistor_rated_current), - varistorVoltageThreshold=from_nullable_int(cim.varistor_voltage_threshold), + **set_or_null( + r=cim.r, + r0=cim.r0, + x=cim.x, + x0=cim.x0, + varistorRatedCurrent=cim.varistor_rated_current, + varistorVoltageThreshold=cim.varistor_voltage_threshold, + ) ) def shunt_compensator_to_pb(cim: ShuntCompensator) -> PBShuntCompensator: return PBShuntCompensator( rce=regulating_cond_eq_to_pb(cim, True), - sections=from_nullable_float(cim.sections), - grounded=cim.grounded, - nomU=from_nullable_int(cim.nom_u), - phaseConnection=_map_phase_shunt_connection_kind.to_pb(cim.phase_connection) + phaseConnection=_map_phase_shunt_connection_kind.to_pb(cim.phase_connection), + **set_or_null( + sections=cim.sections, + grounded=cim.grounded, + nomU=cim.nom_u, + ) ) @@ -1613,20 +1727,24 @@ def static_var_compensator_to_pb(cim: StaticVarCompensator) -> PBStaticVarCompen """ return PBStaticVarCompensator( rce=regulating_cond_eq_to_pb(cim), - capacitiveRating=from_nullable_float(cim.capacitive_rating), - inductiveRating=from_nullable_float(cim.inductive_rating), - q=from_nullable_float(cim.q), svcControlMode=_map_svc_control_mode.to_pb(cim.svc_control_mode), - voltageSetPoint=from_nullable_int(cim.voltage_set_point) + **set_or_null( + capacitiveRating=cim.capacitive_rating, + inductiveRating=cim.inductive_rating, + q=cim.q, + voltageSetPoint=cim.voltage_set_point, + ) ) def switch_to_pb(cim: Switch) -> PBSwitch: return PBSwitch( ce=conducting_equipment_to_pb(cim, True), - ratedCurrent=from_nullable_float(cim.rated_current), normalOpen=cim.get_normal_state() != 0, - open=cim.get_state() != 0 + open=cim.get_state() != 0, + **set_or_null( + ratedCurrent=cim.rated_current, + ) ) @@ -1636,41 +1754,45 @@ def synchronous_machine_to_pb(cim: SynchronousMachine) -> PBSynchronousMachine: rm=rotating_machine_to_pb(cim), reactiveCapabilityCurveMRIDs=[str(it.mrid) for it in cim.curves], - baseQ=from_nullable_float(cim.base_q), - condenserP=from_nullable_int(cim.condenser_p), - earthing=cim.earthing, - earthingStarPointR=from_nullable_float(cim.earthing_star_point_r), - earthingStarPointX=from_nullable_float(cim.earthing_star_point_x), - ikk=from_nullable_float(cim.ikk), - maxQ=from_nullable_float(cim.max_q), - maxU=from_nullable_int(cim.max_u), - minQ=from_nullable_float(cim.min_q), - minU=from_nullable_int(cim.min_u), - mu=from_nullable_float(cim.mu), - r=from_nullable_float(cim.r), - r0=from_nullable_float(cim.r0), - r2=from_nullable_float(cim.r2), - satDirectSubtransX=from_nullable_float(cim.sat_direct_subtrans_x), - satDirectSyncX=from_nullable_float(cim.sat_direct_sync_x), - satDirectTransX=from_nullable_float(cim.sat_direct_trans_x), - x0=from_nullable_float(cim.x0), - x2=from_nullable_float(cim.x2), type=_map_synchronous_machine_kind.to_pb(cim.type), - operatingMode=_map_synchronous_machine_kind.to_pb(cim.operating_mode) + operatingMode=_map_synchronous_machine_kind.to_pb(cim.operating_mode), + **set_or_null( + baseQ=cim.base_q, + condenserP=cim.condenser_p, + earthing=cim.earthing, + earthingStarPointR=cim.earthing_star_point_r, + earthingStarPointX=cim.earthing_star_point_x, + ikk=cim.ikk, + maxQ=cim.max_q, + maxU=cim.max_u, + minQ=cim.min_q, + minU=cim.min_u, + mu=cim.mu, + r=cim.r, + r0=cim.r0, + r2=cim.r2, + satDirectSubtransX=cim.sat_direct_subtrans_x, + satDirectSyncX=cim.sat_direct_sync_x, + satDirectTransX=cim.sat_direct_trans_x, + x0=cim.x0, + x2=cim.x2, + ) ) def tap_changer_to_pb(cim: TapChanger) -> PBTapChanger: return PBTapChanger( psr=power_system_resource_to_pb(cim), - highStep=from_nullable_int(cim.high_step), - lowStep=from_nullable_int(cim.low_step), - step=from_nullable_float(cim.step), - neutralStep=from_nullable_int(cim.neutral_step), - neutralU=from_nullable_int(cim.neutral_u), - normalStep=from_nullable_int(cim.normal_step), - controlEnabled=cim.control_enabled, - tapChangerControlMRID=mrid_or_empty(cim.tap_changer_control) + tapChangerControlMRID=mrid_or_empty(cim.tap_changer_control), + **set_or_null( + highStep=cim.high_step, + lowStep=cim.low_step, + step=cim.step, + neutralStep=cim.neutral_step, + neutralU=cim.neutral_u, + normalStep=cim.normal_step, + controlEnabled=cim.control_enabled, + ) ) @@ -1678,15 +1800,17 @@ def tap_changer_to_pb(cim: TapChanger) -> PBTapChanger: def tap_changer_control_to_pb(cim: TapChangerControl) -> PBTapChangerControl: return PBTapChangerControl( rc=regulating_control_to_pb(cim), - limitVoltage=from_nullable_int(cim.limit_voltage), - **nullable_bool_settings("lineDropCompensation", cim.line_drop_compensation), - lineDropR=from_nullable_float(cim.line_drop_r), - lineDropX=from_nullable_float(cim.line_drop_x), - reverseLineDropR=from_nullable_float(cim.reverse_line_drop_r), - reverseLineDropX=from_nullable_float(cim.reverse_line_drop_x), - **nullable_bool_settings("forwardLDCBlocking", cim.forward_ldc_blocking), - timeDelay=from_nullable_float(cim.time_delay), - **nullable_bool_settings("coGenerationEnabled", cim.co_generation_enabled) + **set_or_null( + limitVoltage=cim.limit_voltage, + lineDropCompensation=cim.line_drop_compensation, + lineDropR=cim.line_drop_r, + lineDropX=cim.line_drop_x, + reverseLineDropR=cim.reverse_line_drop_r, + reverseLineDropX=cim.reverse_line_drop_x, + forwardLDCBlocking=cim.forward_ldc_blocking, + timeDelay=cim.time_delay, + coGenerationEnabled=cim.co_generation_enabled + ) ) @@ -1698,16 +1822,20 @@ def transformer_end_to_pb(cim: TransformerEnd) -> PBTransformerEnd: ratioTapChangerMRID=mrid_or_empty(cim.ratio_tap_changer), starImpedanceMRID=mrid_or_empty(cim.star_impedance), endNumber=cim.end_number, - grounded=cim.grounded, - rGround=from_nullable_float(cim.r_ground), - xGround=from_nullable_float(cim.x_ground) + **set_or_null( + grounded=cim.grounded, + rGround=cim.r_ground, + xGround=cim.x_ground, + ) ) def transformer_end_rated_s_to_pb(cim: TransformerEndRatedS) -> PBTransformerEndRatedS: return PBTransformerEndRatedS( - ratedS=cim.rated_s, coolingType=_map_transformer_cooling_type.to_pb(cim.cooling_type) + **set_or_null( + ratedS=cim.rated_s, + ) ) @@ -1715,11 +1843,13 @@ def transformer_end_rated_s_to_pb(cim: TransformerEndRatedS) -> PBTransformerEnd def transformer_star_impedance_to_pb(cim: TransformerStarImpedance) -> PBTransformerStarImpedance: return PBTransformerStarImpedance( io=identified_object_to_pb(cim), - r=cim.r if cim.r else 0.0, - r0=cim.r0 if cim.r0 else 0.0, - x=cim.x if cim.x else 0.0, - x0=cim.x0 if cim.x0 else 0.0, - transformerEndInfoMRID=mrid_or_empty(cim.transformer_end_info) + transformerEndInfoMRID=mrid_or_empty(cim.transformer_end_info), + **set_or_null( + r=cim.r if cim.r else 0.0, + r0=cim.r0 if cim.r0 else 0.0, + x=cim.x if cim.x else 0.0, + x0=cim.x0 if cim.x0 else 0.0, + ) ) diff --git a/src/zepben/ewb/services/network/translator/network_proto2cim.py b/src/zepben/ewb/services/network/translator/network_proto2cim.py index dc21b0483..054fda5ae 100644 --- a/src/zepben/ewb/services/network/translator/network_proto2cim.py +++ b/src/zepben/ewb/services/network/translator/network_proto2cim.py @@ -325,7 +325,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.winding_connection import * from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import * 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, \ - bind_to_cim + bind_to_cim, get_nullable from zepben.ewb.services.common.translator.util import int_or_none, float_or_none, long_or_none, str_or_none, uint_or_none from zepben.ewb.services.network.network_service import NetworkService 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 # noinspection PyUnresolvedReferences cim = RelayInfo( mrid=pb.mrid(), - curve_setting=str_or_none(pb.curveSetting), - reclose_fast=None if pb.HasField("recloseFastNull") else pb.recloseFastSet, + curve_setting=get_nullable(pb, 'curveSetting'), + reclose_fast=get_nullable(pb, 'recloseFast'), reclose_delays=list(pb.recloseDelays) ) + asset_info_to_cim(pb.ai, cim, network_service) return cim @@ -365,7 +366,7 @@ def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network """ # noinspection PyUnresolvedReferences cim = PanDemandResponseFunction(mrid=pb.mrid()) - cim.appliance = int_or_none(pb.appliance) + cim.appliance = get_nullable(pb, 'appliance') cim.kind = EndDeviceFunctionKind(pb.kind) end_device_function_to_cim(pb.edf, cim, network_service) @@ -445,15 +446,15 @@ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) # noinspection PyUnresolvedReferences cim = DistanceRelay( mrid=pb.mrid(), - backward_blind=float_or_none(pb.backwardBlind), - backward_reach=float_or_none(pb.backwardReach), - backward_reactance=float_or_none(pb.backwardReactance), - forward_blind=float_or_none(pb.forwardBlind), - forward_reach=float_or_none(pb.forwardReach), - forward_reactance=float_or_none(pb.forwardReactance), - operation_phase_angle1=float_or_none(pb.operationPhaseAngle1), - operation_phase_angle2=float_or_none(pb.operationPhaseAngle2), - operation_phase_angle3=float_or_none(pb.operationPhaseAngle3) + backward_blind=get_nullable(pb, 'backwardBlind'), + backward_reach=get_nullable(pb, 'backwardReach'), + backward_reactance=get_nullable(pb, 'backwardReactance'), + forward_blind=get_nullable(pb, 'forwardBlind'), + forward_reach=get_nullable(pb, 'forwardReach'), + forward_reactance=get_nullable(pb, 'forwardReactance'), + operation_phase_angle1=get_nullable(pb, 'operationPhaseAngle1'), + operation_phase_angle2=get_nullable(pb, 'operationPhaseAngle2'), + operation_phase_angle3=get_nullable(pb, 'operationPhaseAngle3'), ) protection_relay_function_to_cim(pb.prf, cim, network_service) @@ -461,17 +462,17 @@ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: ProtectionRelayFunction, network_service: NetworkService): - cim.model = str_or_none(pb.model) - cim.reclosing = None if pb.HasField("reclosingNull") else pb.reclosingSet + cim.model = get_nullable(pb, 'model') + cim.reclosing = get_nullable(pb, 'reclosing') for time_limit in pb.timeLimits: cim.add_time_limit(time_limit) for threshold in pb.thresholds: cim.add_threshold(relay_setting_to_cim(threshold)) - cim.relay_delay_time = float_or_none(pb.relayDelayTime) + cim.relay_delay_time = get_nullable(pb, 'relayDelayTime') cim.protection_kind = ProtectionKind(pb.protectionKind) for mrid in pb.protectedSwitchMRIDs: network_service.resolve_or_defer_reference(resolver.prf_protected_switch(cim), mrid) - cim.directable = None if pb.HasField("directableNull") else pb.directableSet + cim.directable = get_nullable(pb, 'directable') cim.power_direction = PowerDirectionKind(pb.powerDirection) for mrid in pb.sensorMRIDs: 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: def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]: return RelaySetting( - name=pb.name, + name=get_nullable(pb, 'name'), unit_symbol=unit_symbol_from_id(pb.unitSymbol), value=float_or_none(pb.value) ) @@ -551,10 +552,10 @@ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService # noinspection PyUnresolvedReferences cim = BatteryControl( mrid=pb.mrid(), - charging_rate=float_or_none(pb.chargingRate), - discharging_rate=float_or_none(pb.dischargingRate), - reserve_percent=float_or_none(pb.reservePercent), - control_mode=BatteryControlMode(pb.controlMode) + charging_rate=get_nullable(pb, 'chargingRate'), + discharging_rate=get_nullable(pb, 'dischargingRate'), + reserve_percent=get_nullable(pb, 'reservePercent'), + control_mode=BatteryControlMode(pb.controlMode), ) 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 # noinspection PyUnresolvedReferences cim = NoLoadTest( mrid=pb.mrid(), - energised_end_voltage=int_or_none(pb.energisedEndVoltage), - exciting_current=float_or_none(pb.excitingCurrent), - exciting_current_zero=float_or_none(pb.excitingCurrentZero), - loss=int_or_none(pb.loss), - loss_zero=int_or_none(pb.lossZero), + energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'), + exciting_current=get_nullable(pb, 'excitingCurrent'), + exciting_current_zero=get_nullable(pb, 'excitingCurrentZero'), + loss=get_nullable(pb, 'loss'), + loss_zero=get_nullable(pb, 'lossZero'), ) transformer_test_to_cim(pb.tt, cim, network_service) @@ -600,11 +601,11 @@ def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkServ # noinspection PyUnresolvedReferences cim = OpenCircuitTest( mrid=pb.mrid(), - energised_end_step=int_or_none(pb.energisedEndStep), - energised_end_voltage=int_or_none(pb.energisedEndVoltage), - open_end_step=int_or_none(pb.openEndStep), - open_end_voltage=int_or_none(pb.openEndVoltage), - phase_shift=float_or_none(pb.phaseShift), + energised_end_step=get_nullable(pb, 'energisedEndStep'), + energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'), + open_end_step=get_nullable(pb, 'openEndStep'), + open_end_voltage=get_nullable(pb, 'openEndVoltage'), + phase_shift=get_nullable(pb, 'phaseShift'), ) transformer_test_to_cim(pb.tt, cim, network_service) @@ -640,16 +641,16 @@ def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkSe # noinspection PyUnresolvedReferences cim = ShortCircuitTest( mrid=pb.mrid(), - current=float_or_none(pb.current), - energised_end_step=int_or_none(pb.energisedEndStep), - grounded_end_step=int_or_none(pb.groundedEndStep), - leakage_impedance=float_or_none(pb.leakageImpedance), - leakage_impedance_zero=float_or_none(pb.leakageImpedanceZero), - loss=int_or_none(pb.loss), - loss_zero=int_or_none(pb.lossZero), - power=int_or_none(pb.power), - voltage=float_or_none(pb.voltage), - voltage_ohmic_part=float_or_none(pb.voltageOhmicPart), + current=get_nullable(pb, 'current'), + energised_end_step=get_nullable(pb, 'energisedEndStep'), + grounded_end_step=get_nullable(pb, 'groundedEndStep'), + leakage_impedance=get_nullable(pb, 'leakageImpedance'), + leakage_impedance_zero=get_nullable(pb, 'leakageImpedanceZero'), + loss=get_nullable(pb, 'loss'), + loss_zero=get_nullable(pb, 'lossZero'), + power=get_nullable(pb, 'power'), + voltage=get_nullable(pb, 'voltage'), + voltage_ohmic_part=get_nullable(pb, 'voltageOhmicPart'), ) transformer_test_to_cim(pb.tt, cim, network_service) @@ -662,10 +663,10 @@ def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: N # noinspection PyUnresolvedReferences cim = ShuntCompensatorInfo( mrid=pb.mrid(), - max_power_loss=int_or_none(pb.maxPowerLoss), - rated_current=int_or_none(pb.ratedCurrent), - rated_reactive_power=int_or_none(pb.ratedReactivePower), - rated_voltage=int_or_none(pb.ratedVoltage), + max_power_loss=get_nullable(pb, 'maxPowerLoss'), + rated_current=get_nullable(pb, 'ratedCurrent'), + rated_reactive_power=get_nullable(pb, 'ratedReactivePower'), + rated_voltage=get_nullable(pb, 'ratedVoltage'), ) asset_info_to_cim(pb.ai, cim, network_service) @@ -678,7 +679,7 @@ def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Opt # noinspection PyUnresolvedReferences cim = SwitchInfo( mrid=pb.mrid(), - rated_interrupting_time=float_or_none(pb.ratedInterruptingTime) + rated_interrupting_time=get_nullable(pb, 'ratedInterruptingTime') ) asset_info_to_cim(pb.ai, cim, network_service) @@ -692,14 +693,14 @@ def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: Netwo cim = TransformerEndInfo( mrid=pb.mrid(), connection_kind=WindingConnection(pb.connectionKind), - emergency_s=int_or_none(pb.emergencyS), + emergency_s=get_nullable(pb, 'emergencyS'), end_number=pb.endNumber, - insulation_u=int_or_none(pb.insulationU), - phase_angle_clock=int_or_none(pb.phaseAngleClock), - r=float_or_none(pb.r), - rated_s=int_or_none(pb.ratedS), - rated_u=int_or_none(pb.ratedU), - short_term_s=int_or_none(pb.shortTermS), + insulation_u=get_nullable(pb, 'insulationU'), + phase_angle_clock=get_nullable(pb, 'phaseAngleClock'), + r=get_nullable(pb, 'r'), + rated_s=get_nullable(pb, 'ratedS'), + rated_u=get_nullable(pb, 'ratedU'), + short_term_s=get_nullable(pb, 'shortTermS'), ) 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 def transformer_test_to_cim(pb: PBTransformerTest, cim: TransformerTest, network_service: NetworkService): - cim.base_power = int_or_none(pb.basePower) - cim.temperature = float_or_none(pb.temperature) + cim.base_power = get_nullable(pb, 'basePower') + cim.temperature = get_nullable(pb, 'temperature') identified_object_to_cim(pb.io, cim, network_service) def wire_info_to_cim(pb: PBWireInfo, cim: WireInfo, network_service: NetworkService): - cim.rated_current = int_or_none(pb.ratedCurrent) + cim.rated_current = get_nullable(pb, 'ratedCurrent') cim.material = WireMaterialKind(pb.material) asset_info_to_cim(pb.ai, cim, network_service) @@ -797,7 +798,7 @@ def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Op # noinspection PyUnresolvedReferences cim = Streetlight( mrid=pb.mrid(), - light_rating=uint_or_none(pb.lightRating), + light_rating=get_nullable(pb, 'lightRating'), lamp_kind=StreetlightLampKind(pb.lampKind) ) @@ -834,27 +835,30 @@ def position_point_to_cim(pb: PBPositionPoint) -> Optional[PositionPoint]: def street_address_to_cim(pb: PBStreetAddress) -> Optional[StreetAddress]: return StreetAddress( - postal_code=pb.postalCode, + postal_code=get_nullable(pb, 'postalCode'), town_detail=town_detail_to_cim(pb.townDetail) if pb.HasField("townDetail") else None, - po_box=pb.poBox, + po_box=get_nullable(pb, 'poBox'), street_detail=street_detail_to_cim(pb.streetDetail) if pb.HasField("streetDetail") else None ) def street_detail_to_cim(pb: PBStreetDetail) -> Optional[StreetDetail]: return StreetDetail( - building_name=pb.buildingName, - floor_identification=pb.floorIdentification, - name=pb.name, - number=pb.number, - suite_number=pb.suiteNumber, - type=pb.type, - display_address=pb.displayAddress + building_name=get_nullable(pb, 'buildingName'), + floor_identification=get_nullable(pb, 'floorIdentification'), + name=get_nullable(pb, 'name'), + number=get_nullable(pb, 'number'), + suite_number=get_nullable(pb, 'suiteNumber'), + type=get_nullable(pb, 'type'), + display_address=get_nullable(pb, 'displayAddress'), ) def town_detail_to_cim(pb: PBTownDetail) -> Optional[TownDetail]: - return TownDetail(name=pb.name, state_or_province=pb.stateOrProvince) + return TownDetail( + name=get_nullable(pb, 'name'), + state_or_province=get_nullable(pb, 'stateOrProvince'), + ) ##################################### @@ -867,18 +871,18 @@ def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_servic # noinspection PyUnresolvedReferences cim = CurrentTransformerInfo( mrid=pb.mrid(), - accuracy_class=str_or_none(pb.accuracyClass), - accuracy_limit=float_or_none(pb.accuracyLimit), - core_count=int_or_none(pb.coreCount), - ct_class=str_or_none(pb.ctClass), - knee_point_voltage=int_or_none(pb.kneePointVoltage), + accuracy_class=get_nullable(pb, 'accuracyClass'), + accuracy_limit=get_nullable(pb, 'accuracyLimit'), + core_count=get_nullable(pb, 'coreCount'), + ct_class=get_nullable(pb, 'ctClass'), + knee_point_voltage=get_nullable(pb, 'kneePointVoltage'), max_ratio=ratio_to_cim(pb.maxRatio) if pb.HasField("maxRatio") else None, nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None, - primary_ratio=float_or_none(pb.primaryRatio), - rated_current=int_or_none(pb.ratedCurrent), - secondary_fls_rating=int_or_none(pb.secondaryFlsRating), - secondary_ratio=float_or_none(pb.secondaryRatio), - usage=str_or_none(pb.usage) + primary_ratio=get_nullable(pb, 'primaryRatio'), + rated_current=get_nullable(pb, 'ratedCurrent'), + secondary_fls_rating=get_nullable(pb, 'secondaryFlsRating'), + secondary_ratio=get_nullable(pb, 'secondaryRatio'), + usage=get_nullable(pb, 'usage'), ) asset_info_to_cim(pb.ai, cim, network_service) @@ -891,12 +895,12 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se # noinspection PyUnresolvedReferences cim = PotentialTransformerInfo( mrid=pb.mrid(), - accuracy_class=str_or_none(pb.accuracyClass), + accuracy_class=get_nullable(pb, 'accuracyClass'), nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None, - primary_ratio=float_or_none(pb.primaryRatio), - pt_class=str_or_none(pb.ptClass), - rated_voltage=int_or_none(pb.ratedVoltage), - secondary_ratio=float_or_none(pb.secondaryRatio) + primary_ratio=get_nullable(pb, 'primaryRatio'), + pt_class=get_nullable(pb, 'ptClass'), + rated_voltage=get_nullable(pb, 'ratedVoltage'), + secondary_ratio=get_nullable(pb, 'secondaryRatio'), ) asset_info_to_cim(pb.ai, cim, network_service) @@ -911,7 +915,10 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se @add_to_network_or_none def pole_to_cim(pb: PBPole, network_service: NetworkService) -> Optional[Pole]: # noinspection PyUnresolvedReferences - cim = Pole(mrid=pb.mrid(), classification=pb.classification) + cim = Pole( + mrid=pb.mrid(), + classification=get_nullable(pb, 'classification') + ) for mrid in pb.streetlightMRIDs: 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 cim = UsagePoint(mrid=pb.mrid()) network_service.resolve_or_defer_reference(resolver.usage_point_location(cim), pb.usagePointLocationMRID) - cim.is_virtual = pb.isVirtual - cim.connection_category = pb.connectionCategory if pb.connectionCategory else None - cim.rated_power = int_or_none(pb.ratedPower) - cim.approved_inverter_capacity = int_or_none(pb.approvedInverterCapacity) + cim.is_virtual = get_nullable(pb, 'isVirtual') + cim.connection_category = get_nullable(pb, 'connectionCategory') + cim.rated_power = get_nullable(pb, 'ratedPower') + cim.approved_inverter_capacity = get_nullable(pb, 'approvedInverterCapacity') cim.phase_code = phase_code_by_id(pb.phaseCode) for mrid in pb.equipmentMRIDs: @@ -1025,7 +1032,7 @@ def auxiliary_equipment_to_cim(pb: PBAuxiliaryEquipment, cim: AuxiliaryEquipment @add_to_network_or_none def current_transformer_to_cim(pb: PBCurrentTransformer, network_service: NetworkService) -> Optional[CurrentTransformer]: # noinspection PyUnresolvedReferences - cim = CurrentTransformer(mrid=pb.mrid(), core_burden=int_or_none(pb.coreBurden)) + cim = CurrentTransformer(mrid=pb.mrid(), core_burden=int_or_none(get_nullable(pb, 'coreBurden'))) # noinspection PyUnresolvedReferences 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): def curve_data_to_cim(pb: PBCurveData) -> Optional[CurveData]: - return CurveData(pb.xValue, pb.y1Value, float_or_none(pb.y2Value), float_or_none(pb.y3Value)) + return CurveData( + get_nullable(pb, 'xValue'), + get_nullable(pb, 'y1Value'), + get_nullable(pb, 'y2Value'), + get_nullable(pb, 'y3Value'), + ) 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 # noinspection PyUnresolvedReferences cim = EquivalentBranch( mrid=pb.mrid(), - negative_r12=float_or_none(pb.negativeR12), - negative_r21=float_or_none(pb.negativeR21), - negative_x12=float_or_none(pb.negativeX12), - negative_x21=float_or_none(pb.negativeX21), - positive_r12=float_or_none(pb.positiveR12), - positive_r21=float_or_none(pb.positiveR21), - positive_x12=float_or_none(pb.positiveX12), - positive_x21=float_or_none(pb.positiveX21), - r=float_or_none(pb.r), - r21=float_or_none(pb.r21), - x=float_or_none(pb.x), - x21=float_or_none(pb.x21), - zero_r12=float_or_none(pb.zeroR12), - zero_r21=float_or_none(pb.zeroR21), - zero_x12=float_or_none(pb.zeroX12), - zero_x21=float_or_none(pb.zeroX21), + negative_r12=get_nullable(pb, 'negativeR12'), + negative_r21=get_nullable(pb, 'negativeR21'), + negative_x12=get_nullable(pb, 'negativeX12'), + negative_x21=get_nullable(pb, 'negativeX21'), + positive_r12=get_nullable(pb, 'positiveR12'), + positive_r21=get_nullable(pb, 'positiveR21'), + positive_x12=get_nullable(pb, 'positiveX12'), + positive_x21=get_nullable(pb, 'positiveX21'), + r=get_nullable(pb, 'r'), + r21=get_nullable(pb, 'r21'), + x=get_nullable(pb, 'x'), + x21=get_nullable(pb, 'x21'), + zero_r12=get_nullable(pb, 'zeroR12'), + zero_r21=get_nullable(pb, 'zeroR21'), + zero_x12=get_nullable(pb, 'zeroX12'), + zero_x21=get_nullable(pb, 'zeroX21'), ) equivalent_equipment_to_cim(pb.ee, cim, network_service) @@ -1280,8 +1292,8 @@ def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> O cim = BatteryUnit( mrid=pb.mrid(), battery_state=BatteryStateKind(pb.batteryState), - rated_e=long_or_none(pb.ratedE), - stored_e=long_or_none(pb.storedE), + rated_e=get_nullable(pb, "ratedE"), + stored_e=get_nullable(pb, "storedE"), ) for mrid in pb.batteryControlMRIDs: @@ -1302,8 +1314,8 @@ def photo_voltaic_unit_to_cim(pb: PBPhotoVoltaicUnit, network_service: NetworkSe def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectronicsUnit, network_service: NetworkService): - cim.max_p = int_or_none(pb.maxP) - cim.min_p = int_or_none(pb.minP) + cim.max_p = get_nullable(pb, 'maxP') + cim.min_p = get_nullable(pb, 'minP') network_service.resolve_or_defer_reference(resolver.unit_power_electronics_connection(cim), pb.powerElectronicsConnectionMRID) @@ -1338,7 +1350,7 @@ def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Op @add_to_network_or_none def analog_to_cim(pb: PBAnalog, network_service: NetworkService) -> Optional[Analog]: # noinspection PyUnresolvedReferences - cim = Analog(mrid=pb.mrid(), positive_flow_in=pb.positiveFlowIn) + cim = Analog(mrid=pb.mrid(), positive_flow_in=get_nullable(pb, "positiveFlowIn")) measurement_to_cim(pb.measurement, cim, network_service) return cim @@ -1394,9 +1406,9 @@ def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> # noinspection PyUnresolvedReferences cim = CurrentRelay( mrid=pb.mrid(), - current_limit_1=float_or_none(pb.currentLimit1), - inverse_time_flag=None if pb.HasField("inverseTimeFlagNull") else pb.inverseTimeFlagSet, - time_delay_1=float_or_none(pb.timeDelay1) + current_limit_1=get_nullable(pb, "currentLimit1"), + inverse_time_flag=get_nullable(pb, "inverseTimeFlag"), + time_delay_1=get_nullable(pb, "timeDelay1"), ) 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 # noinspection PyUnresolvedReferences cim = Breaker( mrid=pb.mrid(), - in_transit_time=float_or_none(pb.inTransitTime) + in_transit_time=get_nullable(pb, "inTransitTime") ) protected_switch_to_cim(pb.sw, cim, network_service) @@ -1490,7 +1502,7 @@ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp # noinspection PyUnresolvedReferences cim = Clamp(mrid=pb.mrid()) - cim.length_from_terminal_1 = float_or_none(pb.lengthFromTerminal1) + cim.length_from_terminal_1 = get_nullable(pb, "lengthFromTerminal1") network_service.resolve_or_defer_reference(resolver.clamp_ac_line_segment(cim), pb.acLineSegmentMRID) conducting_equipment_to_cim(pb.ce, cim, network_service) @@ -1498,9 +1510,9 @@ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp def conductor_to_cim(pb: PBConductor, cim: Conductor, network_service: NetworkService): - cim.length = float_or_none(pb.length) - cim.design_temperature = int_or_none(pb.designTemperature) - cim.design_rating = float_or_none(pb.designRating) + cim.length = get_nullable(pb, 'length') + cim.design_temperature = get_nullable(pb, 'designTemperature') + cim.design_rating = get_nullable(pb, 'designRating') # noinspection PyUnresolvedReferences 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]: # noinspection PyUnresolvedReferences cim = Cut(mrid=pb.mrid()) - cim.length_from_terminal_1 = float_or_none(pb.lengthFromTerminal1) + cim.length_from_terminal_1 = get_nullable(pb, 'lengthFromTerminal1') network_service.resolve_or_defer_reference(resolver.cut_ac_line_segment(cim), pb.acLineSegmentMRID) switch_to_cim(pb.sw, cim, network_service) @@ -1536,7 +1548,7 @@ def disconnector_to_cim(pb: PBDisconnector, network_service: NetworkService) -> def earth_fault_compensator_to_cim(pb: PBEarthFaultCompensator, cim: EarthFaultCompensator, network_service: NetworkService): - cim.r = float_or_none(pb.r) + cim.r = get_nullable(pb, 'r') conducting_equipment_to_cim(pb.ce, cim, network_service) @@ -1551,13 +1563,13 @@ def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService # noinspection PyUnresolvedReferences cim = EnergyConsumer( mrid=pb.mrid(), - customer_count=int_or_none(pb.customerCount), - grounded=pb.grounded, + customer_count=get_nullable(pb, "customerCount"), + grounded=get_nullable(pb, 'grounded'), phase_connection=PhaseShuntConnectionKind(pb.phaseConnection), - p=float_or_none(pb.p), - p_fixed=float_or_none(pb.pFixed), - q=float_or_none(pb.q), - q_fixed=float_or_none(pb.qFixed) + p=get_nullable(pb, 'p'), + p_fixed=get_nullable(pb, 'pFixed'), + q=get_nullable(pb, 'q'), + q_fixed=get_nullable(pb, 'qFixed'), ) for mrid in pb.energyConsumerPhasesMRIDs: @@ -1574,10 +1586,10 @@ def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: Net cim = EnergyConsumerPhase( mrid=pb.mrid(), phase=single_phase_kind_by_id(pb.phase), - p=float_or_none(pb.p), - p_fixed=float_or_none(pb.pFixed), - q=float_or_none(pb.q), - q_fixed=float_or_none(pb.qFixed) + p=get_nullable(pb, 'p'), + p_fixed=get_nullable(pb, 'pFixed'), + q=get_nullable(pb, 'q'), + q_fixed=get_nullable(pb, 'qFixed'), ) 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) -> # noinspection PyUnresolvedReferences cim = EnergySource( mrid=pb.mrid(), - active_power=float_or_none(pb.activePower), - reactive_power=float_or_none(pb.reactivePower), - voltage_angle=float_or_none(pb.voltageAngle), - voltage_magnitude=float_or_none(pb.voltageMagnitude), - r=float_or_none(pb.r), - x=float_or_none(pb.x), - p_max=float_or_none(pb.pMax), - p_min=float_or_none(pb.pMin), - r0=float_or_none(pb.r0), - rn=float_or_none(pb.rn), - x0=float_or_none(pb.x0), - xn=float_or_none(pb.xn), - is_external_grid=pb.isExternalGrid, - r_min=float_or_none(pb.rMin), - rn_min=float_or_none(pb.rnMin), - r0_min=float_or_none(pb.r0Min), - x_min=float_or_none(pb.xMin), - xn_min=float_or_none(pb.xnMin), - x0_min=float_or_none(pb.x0Min), - r_max=float_or_none(pb.rMax), - rn_max=float_or_none(pb.rnMax), - r0_max=float_or_none(pb.r0Max), - x_max=float_or_none(pb.xMax), - xn_max=float_or_none(pb.xnMax), - x0_max=float_or_none(pb.x0Max) + active_power=get_nullable(pb, 'activePower'), + reactive_power=get_nullable(pb, 'reactivePower'), + voltage_angle=get_nullable(pb, 'voltageAngle'), + voltage_magnitude=get_nullable(pb, 'voltageMagnitude'), + r=get_nullable(pb, 'r'), + x=get_nullable(pb, 'x'), + p_max=get_nullable(pb, 'pMax'), + p_min=get_nullable(pb, 'pMin'), + r0=get_nullable(pb, 'r0'), + rn=get_nullable(pb, 'rn'), + x0=get_nullable(pb, 'x0'), + xn=get_nullable(pb, 'xn'), + is_external_grid=get_nullable(pb, 'isExternalGrid'), + r_min=get_nullable(pb, 'rMin'), + rn_min=get_nullable(pb, 'rnMin'), + r0_min=get_nullable(pb, 'r0Min'), + x_min=get_nullable(pb, 'xMin'), + xn_min=get_nullable(pb, 'xnMin'), + x0_min=get_nullable(pb, 'x0Min'), + r_max=get_nullable(pb, 'rMax'), + rn_max=get_nullable(pb, 'rnMax'), + r0_max=get_nullable(pb, 'r0Max'), + x_max=get_nullable(pb, 'xMax'), + xn_max=get_nullable(pb, 'xnMax'), + x0_max=get_nullable(pb, 'x0Max'), ) for mrid in pb.energySourcePhasesMRIDs: @@ -1674,7 +1686,7 @@ def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: Networ @add_to_network_or_none def grounding_impedance_to_cim(pb: PBGroundingImpedance, network_service: NetworkService) -> Optional[GroundingImpedance]: # noinspection PyUnresolvedReferences - cim = GroundingImpedance(mrid=pb.mrid(), x=float_or_none(pb.x)) + cim = GroundingImpedance(mrid=pb.mrid(), x=get_nullable(pb, "x")) earth_fault_compensator_to_cim(pb.efc, cim, network_service) return cim @@ -1710,10 +1722,10 @@ def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_servic # noinspection PyUnresolvedReferences cim = LinearShuntCompensator( mrid=pb.mrid(), - b0_per_section=float_or_none(pb.b0PerSection), - b_per_section=float_or_none(pb.bPerSection), - g0_per_section=float_or_none(pb.g0PerSection), - g_per_section=float_or_none(pb.gPerSection) + b0_per_section=get_nullable(pb, 'b0PerSection'), + b_per_section=get_nullable(pb, 'bPerSection'), + g0_per_section=get_nullable(pb, 'g0PerSection'), + g_per_section=get_nullable(pb, 'gPerSection'), ) shunt_compensator_to_cim(pb.sc, cim, network_service) @@ -1763,14 +1775,14 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo # noinspection PyUnresolvedReferences cim = PerLengthSequenceImpedance( mrid=pb.mrid(), - r=float_or_none(pb.r), - x=float_or_none(pb.x), - r0=float_or_none(pb.r0), - x0=float_or_none(pb.x0), - bch=float_or_none(pb.bch), - gch=float_or_none(pb.gch), - b0ch=float_or_none(pb.b0ch), - g0ch=float_or_none(pb.g0ch) + r=get_nullable(pb, 'r'), + x=get_nullable(pb, 'x'), + r0=get_nullable(pb, 'r0'), + x0=get_nullable(pb, 'x0'), + bch=get_nullable(pb, 'bch'), + gch=get_nullable(pb, 'gch'), + b0ch=get_nullable(pb, 'b0ch'), + g0ch=get_nullable(pb, 'g0ch'), ) per_length_impedance_to_cim(pb.pli, cim, network_service) @@ -1781,7 +1793,7 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo @add_to_network_or_none def petersen_coil_to_cim(pb: PBPetersenCoil, network_service: NetworkService) -> Optional[PetersenCoil]: # noinspection PyUnresolvedReferences - cim = PetersenCoil(mrid=pb.mrid(), x_ground_nominal=float_or_none(pb.xGroundNominal)) + cim = PetersenCoil(mrid=pb.mrid(), x_ground_nominal=get_nullable(pb, 'xGroundNominal')) earth_fault_compensator_to_cim(pb.efc, cim, network_service) return cim @@ -1796,10 +1808,10 @@ def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImped return PhaseImpedanceData( single_phase_kind_by_id(pb.fromPhase), single_phase_kind_by_id(pb.toPhase), - float_or_none(pb.b), - float_or_none(pb.g), - float_or_none(pb.r), - float_or_none(pb.x), + get_nullable(pb, "b"), + get_nullable(pb, "g"), + get_nullable(pb, "r"), + get_nullable(pb, "x"), ) @@ -1809,37 +1821,37 @@ def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, networ # noinspection PyUnresolvedReferences cim = PowerElectronicsConnection( mrid=pb.mrid(), - max_i_fault=int_or_none(pb.maxIFault), - p=float_or_none(pb.p), - q=float_or_none(pb.q), - max_q=float_or_none(pb.maxQ), - min_q=float_or_none(pb.minQ), - rated_s=int_or_none(pb.ratedS), - rated_u=int_or_none(pb.ratedU), - inverter_standard=str_or_none(pb.inverterStandard), - sustain_op_overvolt_limit=int_or_none(pb.sustainOpOvervoltLimit), - stop_at_over_freq=float_or_none(pb.stopAtOverFreq), - stop_at_under_freq=float_or_none(pb.stopAtUnderFreq), - inv_volt_watt_resp_mode=None if pb.HasField("invVoltWattRespModeNull") else pb.invVoltWattRespModeSet, - inv_watt_resp_v1=int_or_none(pb.invWattRespV1), - inv_watt_resp_v2=int_or_none(pb.invWattRespV2), - inv_watt_resp_v3=int_or_none(pb.invWattRespV3), - inv_watt_resp_v4=int_or_none(pb.invWattRespV4), - inv_watt_resp_p_at_v1=float_or_none(pb.invWattRespPAtV1), - inv_watt_resp_p_at_v2=float_or_none(pb.invWattRespPAtV2), - inv_watt_resp_p_at_v3=float_or_none(pb.invWattRespPAtV3), - inv_watt_resp_p_at_v4=float_or_none(pb.invWattRespPAtV4), - inv_volt_var_resp_mode=None if pb.HasField("invVoltVarRespModeNull") else pb.invVoltVarRespModeSet, - inv_var_resp_v1=int_or_none(pb.invVarRespV1), - inv_var_resp_v2=int_or_none(pb.invVarRespV2), - inv_var_resp_v3=int_or_none(pb.invVarRespV3), - inv_var_resp_v4=int_or_none(pb.invVarRespV4), - inv_var_resp_q_at_v1=float_or_none(pb.invVarRespQAtV1), - inv_var_resp_q_at_v2=float_or_none(pb.invVarRespQAtV2), - inv_var_resp_q_at_v3=float_or_none(pb.invVarRespQAtV3), - inv_var_resp_q_at_v4=float_or_none(pb.invVarRespQAtV4), - inv_reactive_power_mode=None if pb.HasField("invReactivePowerModeNull") else pb.invReactivePowerModeSet, - inv_fix_reactive_power=float_or_none(pb.invFixReactivePower) + max_i_fault=get_nullable(pb, "maxIFault"), + p=get_nullable(pb, 'p'), + q=get_nullable(pb, 'q'), + max_q=get_nullable(pb, 'maxQ'), + min_q=get_nullable(pb, 'minQ'), + rated_s=get_nullable(pb, 'ratedS'), + rated_u=get_nullable(pb, 'ratedU'), + inverter_standard=get_nullable(pb, 'inverterStandard'), + sustain_op_overvolt_limit=get_nullable(pb, 'sustainOpOvervoltLimit'), + stop_at_over_freq=get_nullable(pb, 'stopAtOverFreq'), + stop_at_under_freq=get_nullable(pb, 'stopAtUnderFreq'), + inv_volt_watt_resp_mode=get_nullable(pb, "invVoltWattRespMode"), + inv_watt_resp_v1=get_nullable(pb, 'invWattRespV1'), + inv_watt_resp_v2=get_nullable(pb, 'invWattRespV2'), + inv_watt_resp_v3=get_nullable(pb, 'invWattRespV3'), + inv_watt_resp_v4=get_nullable(pb, 'invWattRespV4'), + inv_watt_resp_p_at_v1=get_nullable(pb, 'invWattRespPAtV1'), + inv_watt_resp_p_at_v2=get_nullable(pb, 'invWattRespPAtV2'), + inv_watt_resp_p_at_v3=get_nullable(pb, 'invWattRespPAtV3'), + inv_watt_resp_p_at_v4=get_nullable(pb, 'invWattRespPAtV4'), + inv_volt_var_resp_mode=get_nullable(pb, "invVoltVarRespMode"), + inv_var_resp_v1=get_nullable(pb, 'invVarRespV1'), + inv_var_resp_v2=get_nullable(pb, 'invVarRespV2'), + inv_var_resp_v3=get_nullable(pb, 'invVarRespV3'), + inv_var_resp_v4=get_nullable(pb, 'invVarRespV4'), + inv_var_resp_q_at_v1=get_nullable(pb, 'invVarRespQAtV1'), + inv_var_resp_q_at_v2=get_nullable(pb, 'invVarRespQAtV2'), + inv_var_resp_q_at_v3=get_nullable(pb, 'invVarRespQAtV3'), + inv_var_resp_q_at_v4=get_nullable(pb, 'invVarRespQAtV4'), + inv_reactive_power_mode=get_nullable(pb, "invReactivePowerMode"), + inv_fix_reactive_power=get_nullable(pb, 'invFixReactivePower'), ) for mrid in pb.powerElectronicsUnitMRIDs: @@ -1860,8 +1872,8 @@ def power_electronics_connection_phase_to_cim( # noinspection PyUnresolvedReferences cim = PowerElectronicsConnectionPhase( mrid=pb.mrid(), - p=float_or_none(pb.p), - q=float_or_none(pb.q), + p=get_nullable(pb, "p"), + q=get_nullable(pb, "q"), phase=single_phase_kind_by_id(pb.phase) ) @@ -1878,7 +1890,7 @@ def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkSer cim = PowerTransformer( mrid=pb.mrid(), vector_group=VectorGroup(pb.vectorGroup), - transformer_utilisation=float_or_none(pb.transformerUtilisation), + transformer_utilisation=get_nullable(pb, "transformerUtilisation"), construction_kind=TransformerConstructionKind(pb.constructionKind), function=TransformerFunctionKind(pb.function) ) @@ -1898,17 +1910,17 @@ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: Net # noinspection PyUnresolvedReferences cim = PowerTransformerEnd( mrid=pb.mrid(), - rated_u=int_or_none(pb.ratedU), - r=float_or_none(pb.r), - r0=float_or_none(pb.r0), - x=float_or_none(pb.x), - x0=float_or_none(pb.x0), - b=float_or_none(pb.b), - b0=float_or_none(pb.b0), - g=float_or_none(pb.g), - g0=float_or_none(pb.g0), + rated_u=get_nullable(pb, 'ratedU'), + r=get_nullable(pb, 'r'), + r0=get_nullable(pb, 'r0'), + x=get_nullable(pb, 'x'), + x0=get_nullable(pb, 'x0'), + b=get_nullable(pb, 'b'), + b0=get_nullable(pb, 'b0'), + g=get_nullable(pb, 'g'), + g0=get_nullable(pb, 'g0'), connection_kind=WindingConnection(pb.connectionKind), - phase_angle_clock=int_or_none(pb.phaseAngleClock) + phase_angle_clock=get_nullable(pb, 'phaseAngleClock'), ) for rating in pb.ratings: @@ -1922,7 +1934,7 @@ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: Net def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network_service: NetworkService): - cim.breaking_capacity = int_or_none(pb.breakingCapacity) + cim.breaking_capacity = get_nullable(pb, 'breakingCapacity') for mrid in pb.relayFunctionMRIDs: 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 # noinspection PyUnresolvedReferences cim = RatioTapChanger( mrid=pb.mrid(), - step_voltage_increment=float_or_none(pb.stepVoltageIncrement) + step_voltage_increment=get_nullable(pb, "stepVoltageIncrement") ) 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 def regulating_cond_eq_to_cim(pb: PBRegulatingCondEq, cim: RegulatingCondEq, network_service: NetworkService): - cim.control_enabled = pb.controlEnabled + cim.control_enabled = get_nullable(pb, 'controlEnabled') network_service.resolve_or_defer_reference(resolver.rce_regulating_control(cim), pb.regulatingControlMRID) energy_connection_to_cim(pb.ec, cim, network_service) @@ -1976,27 +1988,27 @@ def regulating_control_to_cim(pb: PBRegulatingControl, cim: RegulatingControl, n cim.discrete = None if pb.HasField("discreteNull") else pb.discreteSet cim.mode = RegulatingControlModeKind(pb.mode) cim.monitored_phase = phase_code_by_id(pb.monitoredPhase) - cim.target_deadband = float_or_none(pb.targetDeadband) - cim.target_value = float_or_none(pb.targetValue) - cim.enabled = None if pb.HasField("enabledNull") else pb.enabledSet - cim.max_allowed_target_value = float_or_none(pb.maxAllowedTargetValue) - cim.min_allowed_target_value = float_or_none(pb.minAllowedTargetValue) - cim.rated_current = float_or_none(pb.ratedCurrent) + cim.target_deadband = get_nullable(pb, 'targetDeadband') + cim.target_value = get_nullable(pb, 'targetValue') + cim.enabled = get_nullable(pb, 'enabled') + cim.max_allowed_target_value = get_nullable(pb, 'maxAllowedTargetValue') + cim.min_allowed_target_value = get_nullable(pb, 'minAllowedTargetValue') + cim.rated_current = get_nullable(pb, 'ratedCurrent') network_service.resolve_or_defer_reference(resolver.rc_terminal(cim), pb.terminalMRID) for mrid in pb.regulatingCondEqMRIDs: network_service.resolve_or_defer_reference(resolver.rc_regulating_cond_eq(cim), mrid) - cim.ct_primary = float_or_none(pb.ctPrimary) - cim.min_target_deadband = float_or_none(pb.minTargetDeadband) + cim.ct_primary = get_nullable(pb, 'ctPrimary') + cim.min_target_deadband = get_nullable(pb, 'minTargetDeadband') power_system_resource_to_cim(pb.psr, cim, network_service) def rotating_machine_to_cim(pb: PBRotatingMachine, cim: RotatingMachine, network_service: NetworkService): - cim.rated_power_factor = float_or_none(pb.ratedPowerFactor) - cim.rated_s = float_or_none(pb.ratedS) - cim.rated_u = int_or_none(pb.ratedU) - cim.p = float_or_none(pb.p) - cim.q = float_or_none(pb.q) + cim.rated_power_factor = get_nullable(pb, 'ratedPowerFactor') + cim.rated_s = get_nullable(pb, 'ratedS') + cim.rated_u = get_nullable(pb, 'ratedU') + cim.p = get_nullable(pb, 'p') + cim.q = get_nullable(pb, 'q') regulating_cond_eq_to_cim(pb.rce, cim, network_service) @@ -2007,12 +2019,12 @@ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkS # noinspection PyUnresolvedReferences cim = SeriesCompensator( mrid=pb.mrid(), - r=float_or_none(pb.r), - r0=float_or_none(pb.r0), - x=float_or_none(pb.x), - x0=float_or_none(pb.x0), - varistor_rated_current=int_or_none(pb.varistorRatedCurrent), - varistor_voltage_threshold=int_or_none(pb.varistorVoltageThreshold) + r=get_nullable(pb, 'r'), + r0=get_nullable(pb, 'r0'), + x=get_nullable(pb, 'x'), + x0=get_nullable(pb, 'x0'), + varistor_rated_current=get_nullable(pb, 'varistorRatedCurrent'), + varistor_voltage_threshold=get_nullable(pb, 'varistorVoltageThreshold'), ) conducting_equipment_to_cim(pb.ce, cim, network_service) @@ -2022,9 +2034,9 @@ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkS def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, network_service: NetworkService): # noinspection PyUnresolvedReferences network_service.resolve_or_defer_reference(resolver.shunt_compensator_info(cim), pb.asset_info_mrid()) - cim.sections = float_or_none(pb.sections) - cim.grounded = pb.grounded - cim.nom_u = int_or_none(pb.nomU) + cim.sections = get_nullable(pb, 'sections') + cim.grounded = get_nullable(pb, 'grounded') + cim.nom_u = get_nullable(pb, 'nomU') cim.phase_connection = PhaseShuntConnectionKind(pb.phaseConnection) 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 # noinspection PyUnresolvedReferences cim = StaticVarCompensator( mrid=pb.mrid(), - capacitive_rating=float_or_none(pb.capacitiveRating), - inductive_rating=float_or_none(pb.inductiveRating), - q=float_or_none(pb.q), + capacitive_rating=get_nullable(pb, 'capacitiveRating'), + inductive_rating=get_nullable(pb, 'inductiveRating'), + q=get_nullable(pb, 'q'), svc_control_mode=SVCControlMode(pb.svcControlMode), - voltage_set_point=int_or_none(pb.voltageSetPoint) + voltage_set_point=get_nullable(pb, 'voltageSetPoint'), ) 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 def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService): # noinspection PyUnresolvedReferences network_service.resolve_or_defer_reference(resolver.switch_info(cim), pb.asset_info_mrid()) - cim.rated_current = float_or_none(pb.ratedCurrent) + cim.rated_current = get_nullable(pb, 'ratedCurrent') cim.set_normally_open(pb.normalOpen) cim.set_open(pb.open) @@ -2069,25 +2081,25 @@ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: Networ # noinspection PyUnresolvedReferences cim = SynchronousMachine( mrid=pb.mrid(), - base_q=float_or_none(pb.baseQ), - condenser_p=int_or_none(pb.condenserP), - earthing=pb.earthing, - earthing_star_point_r=float_or_none(pb.earthingStarPointR), - earthing_star_point_x=float_or_none(pb.earthingStarPointX), - ikk=float_or_none(pb.ikk), - max_q=float_or_none(pb.maxQ), - max_u=int_or_none(pb.maxU), - min_q=float_or_none(pb.minQ), - min_u=int_or_none(pb.minU), - mu=float_or_none(pb.mu), - r=float_or_none(pb.r), - r0=float_or_none(pb.r0), - r2=float_or_none(pb.r2), - sat_direct_subtrans_x=float_or_none(pb.satDirectSubtransX), - sat_direct_sync_x=float_or_none(pb.satDirectSyncX), - sat_direct_trans_x=float_or_none(pb.satDirectTransX), - x0=float_or_none(pb.x0), - x2=float_or_none(pb.x2), + base_q=get_nullable(pb, 'baseQ'), + condenser_p=get_nullable(pb, 'condenserP'), + earthing=get_nullable(pb, 'earthing'), + earthing_star_point_r=get_nullable(pb, 'earthingStarPointR'), + earthing_star_point_x=get_nullable(pb, 'earthingStarPointX'), + ikk=get_nullable(pb, 'ikk'), + max_q=get_nullable(pb, 'maxQ'), + max_u=get_nullable(pb, 'maxU'), + min_q=get_nullable(pb, 'minQ'), + min_u=get_nullable(pb, 'minU'), + mu=get_nullable(pb, 'mu'), + r=get_nullable(pb, 'r'), + r0=get_nullable(pb, 'r0'), + r2=get_nullable(pb, 'r2'), + sat_direct_subtrans_x=get_nullable(pb, 'satDirectSubtransX'), + sat_direct_sync_x=get_nullable(pb, 'satDirectSyncX'), + sat_direct_trans_x=get_nullable(pb, 'satDirectTransX'), + x0=get_nullable(pb, 'x0'), + x2=get_nullable(pb, 'x2'), type=SynchronousMachineKind(pb.type), operating_mode=SynchronousMachineKind(pb.operatingMode) ) @@ -2100,13 +2112,13 @@ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: Networ def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: NetworkService): - cim.high_step = int_or_none(pb.highStep) - cim.step = float_or_none(pb.step) - cim.neutral_step = int_or_none(pb.neutralStep) - cim.normal_step = int_or_none(pb.normalStep) - cim.low_step = int_or_none(pb.lowStep) - cim.neutral_u = int_or_none(pb.neutralU) - cim.control_enabled = pb.controlEnabled + cim.high_step = get_nullable(pb, 'highStep') + cim.step = get_nullable(pb, 'step') + cim.neutral_step = get_nullable(pb, 'neutralStep') + cim.normal_step = get_nullable(pb, 'normalStep') + cim.low_step = get_nullable(pb, 'lowStep') + cim.neutral_u = get_nullable(pb, 'neutralU') + cim.control_enabled = get_nullable(pb, 'controlEnabled') network_service.resolve_or_defer_reference(resolver.tc_tap_changer_control(cim), pb.tapChangerControlMRID) 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 # noinspection PyUnresolvedReferences cim = TapChangerControl( mrid=pb.mrid(), - limit_voltage=int_or_none(pb.limitVoltage), - line_drop_compensation=None if pb.HasField("lineDropCompensationNull") else pb.lineDropCompensationSet, - line_drop_r=float_or_none(pb.lineDropR), - line_drop_x=float_or_none(pb.lineDropX), - reverse_line_drop_r=float_or_none(pb.reverseLineDropR), - reverse_line_drop_x=float_or_none(pb.reverseLineDropX), - forward_ldc_blocking=None if pb.HasField("forwardLDCBlockingNull") else pb.forwardLDCBlockingSet, - time_delay=float_or_none(pb.timeDelay), - co_generation_enabled=None if pb.HasField("coGenerationEnabledNull") else pb.coGenerationEnabledSet + limit_voltage=get_nullable(pb, 'limitVoltage'), + line_drop_compensation=get_nullable(pb, "lineDropCompensation"), + line_drop_r=get_nullable(pb, 'lineDropR'), + line_drop_x=get_nullable(pb, 'lineDropX'), + reverse_line_drop_r=get_nullable(pb, 'reverseLineDropR'), + reverse_line_drop_x=get_nullable(pb, 'reverseLineDropX'), + forward_ldc_blocking=get_nullable(pb, "forwardLDCBlocking"), + time_delay=get_nullable(pb, 'timeDelay'), + co_generation_enabled=get_nullable(pb, "coGenerationEnabled"), ) regulating_control_to_cim(pb.rc, cim, network_service) @@ -2135,9 +2147,9 @@ def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: Network def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_service: NetworkService): cim.end_number = pb.endNumber - cim.grounded = pb.grounded - cim.r_ground = float_or_none(pb.rGround) - cim.x_ground = float_or_none(pb.xGround) + cim.grounded = get_nullable(pb, 'grounded') + cim.r_ground = get_nullable(pb, 'rGround') + cim.x_ground = get_nullable(pb, 'xGround') network_service.resolve_or_defer_reference(resolver.te_terminal(cim), pb.terminalMRID) network_service.resolve_or_defer_reference(resolver.te_base_voltage(cim), pb.baseVoltageMRID) @@ -2148,14 +2160,20 @@ def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_se def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[TransformerEndRatedS]: - return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=pb.ratedS) + return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=get_nullable(pb, 'ratedS')) @bind_to_cim @add_to_network_or_none def transformer_star_impedance_to_cim(pb: PBTransformerStarImpedance, network_service: NetworkService) -> Optional[TransformerStarImpedance]: # noinspection PyUnresolvedReferences - cim = TransformerStarImpedance(mrid=pb.mrid(), r=pb.r, r0=pb.r0, x=pb.x, x0=pb.x0) + cim = TransformerStarImpedance( + mrid=pb.mrid(), + r=get_nullable(pb, 'r'), + r0=get_nullable(pb, 'r0'), + x=get_nullable(pb, 'x'), + x0=get_nullable(pb, 'x0'), + ) network_service.resolve_or_defer_reference(resolver.star_impedance_transformer_end_info(cim), pb.transformerEndInfoMRID) diff --git a/test/services/customer/translator/test_customer_translator.py b/test/services/customer/translator/test_customer_translator.py index 48b08d9f4..05d7ac5f8 100644 --- a/test/services/customer/translator/test_customer_translator.py +++ b/test/services/customer/translator/test_customer_translator.py @@ -7,6 +7,7 @@ from hypothesis import given from zepben.ewb import IdentifiedObject, CustomerService, NameType, CustomerDatabaseTables, TableCustomerAgreementsPricingStructures, \ TablePricingStructuresTariffs +from zepben.ewb.services.common.translator.base_proto2cim import get_nullable from zepben.ewb.services.customer.customer_service_comparator import CustomerServiceComparator from cim.cim_creators import * @@ -58,9 +59,8 @@ def test_creates_new_name_type(): # noinspection PyUnresolvedReferences cim = CustomerService().add_from_pb(pb) - assert cim.name == pb.name - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') def test_updates_existing_name_type(): @@ -75,4 +75,4 @@ def test_updates_existing_name_type(): cim = cs.add_from_pb(pb) assert cim is nt - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') diff --git a/test/services/diagram/translator/test_diagram_translator.py b/test/services/diagram/translator/test_diagram_translator.py index 1c0a9387d..242cead23 100644 --- a/test/services/diagram/translator/test_diagram_translator.py +++ b/test/services/diagram/translator/test_diagram_translator.py @@ -6,6 +6,7 @@ from hypothesis import given from zepben.ewb import IdentifiedObject, DiagramService, NameType, DiagramDatabaseTables, TableDiagramObjectPoints +from zepben.ewb.services.common.translator.base_proto2cim import get_nullable from zepben.ewb.services.diagram.diagram_service_comparator import DiagramServiceComparator from cim.cim_creators import * @@ -50,7 +51,7 @@ def test_creates_new_name_type(): cim = DiagramService().add_from_pb(pb) assert cim.name == pb.name - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') def test_updates_existing_name_type(): @@ -65,4 +66,4 @@ def test_updates_existing_name_type(): cim = ds.add_from_pb(pb) assert cim is nt - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') diff --git a/test/services/network/translator/test_network_translator.py b/test/services/network/translator/test_network_translator.py index 70db5bab2..fa4a884e4 100644 --- a/test/services/network/translator/test_network_translator.py +++ b/test/services/network/translator/test_network_translator.py @@ -17,6 +17,7 @@ TableLocationStreetAddresses, TablePositionPoints, TablePowerTransformerEndRatings, TableProtectionRelayFunctionThresholds, \ TableProtectionRelayFunctionTimeLimits, TableProtectionRelayFunctionsSensors, TableRecloseDelays, TablePhaseImpedanceData, TableBatteryUnitsBatteryControls, \ TableEndDevicesEndDeviceFunctions, TableAssetsPowerSystemResources, TableSynchronousMachinesReactiveCapabilityCurves, TableCurveData +from zepben.ewb.services.common.translator.base_proto2cim import get_nullable T = TypeVar("T", bound=IdentifiedObject) @@ -304,7 +305,7 @@ def test_creates_new_name_type(): cim = NetworkService().add_from_pb(pb) assert cim.name == pb.name - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') def test_updates_existing_name_type(): @@ -319,7 +320,7 @@ def test_updates_existing_name_type(): cim = ns.add_from_pb(pb) assert cim is nt - assert cim.description == pb.description + assert cim.description == get_nullable(pb, 'description') def test_power_transformer_end_order(): diff --git a/test/streaming/get/pb_creators.py b/test/streaming/get/pb_creators.py index 8606cf774..4bf01268c 100644 --- a/test/streaming/get/pb_creators.py +++ b/test/streaming/get/pb_creators.py @@ -209,7 +209,7 @@ def relay_info(): return builds( PBRelayInfo, ai=asset_info(), - curveSetting=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + curveSettingSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), **nullable_bool_settings("recloseFast"), recloseDelays=lists(floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), max_size=3) ) @@ -224,7 +224,7 @@ def pan_demand_response_function(): PBPanDemandResponseFunction, edf=end_device_function(), kind=sampled_from(PBEndDeviceFunctionKind.values()), - appliance=integers(min_value=0, max_value=4095), + applianceSet=integers(min_value=0, max_value=4095), ) @@ -275,15 +275,15 @@ def distance_relay(): return builds( PBDistanceRelay, prf=protection_relay_function(), - backwardBlind=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - backwardReach=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - backwardReactance=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - forwardBlind=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - forwardReach=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - forwardReactance=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - operationPhaseAngle1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - operationPhaseAngle2=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - operationPhaseAngle3=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + backwardBlindSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + backwardReachSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + backwardReactanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + forwardBlindSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + forwardReachSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + forwardReactanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + operationPhaseAngle1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + operationPhaseAngle2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + operationPhaseAngle3Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), ) @@ -291,9 +291,9 @@ def protection_relay_function(): return builds( PBProtectionRelayFunction, psr=power_system_resource(), - model=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + modelSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), **nullable_bool_settings("reclosing"), - relayDelayTime=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + relayDelayTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), protectionKind=sampled_from(PBProtectionKind.values()), **nullable_bool_settings("directable"), powerDirection=sampled_from(PBPowerDirectionKind.values()), @@ -326,7 +326,7 @@ def protection_relay_system(): def relay_setting(): return builds( PBRelaySetting, - name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), unitSymbol=sampled_from(PBUnitSymbol.values()), value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -347,9 +347,9 @@ def battery_control(): return builds( PBBatteryControl, rc=regulating_control(), - chargingRate=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - dischargingRate=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - reservePercent=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + chargingRateSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + dischargingRateSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + reservePercentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), controlMode=sampled_from(PBBatteryControlMode.values()) ) @@ -374,11 +374,11 @@ def no_load_test(): return builds( PBNoLoadTest, tt=transformer_test(), - energisedEndVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - excitingCurrent=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - excitingCurrentZero=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - loss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - lossZero=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) + energisedEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + excitingCurrentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + excitingCurrentZeroSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + lossZeroSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) ) @@ -386,11 +386,11 @@ def open_circuit_test(): return builds( PBOpenCircuitTest, tt=transformer_test(), - energisedEndStep=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - energisedEndVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - openEndStep=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - openEndVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - phaseShift=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + energisedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + energisedEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + openEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + openEndVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + phaseShiftSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -410,16 +410,16 @@ def short_circuit_test(): return builds( PBShortCircuitTest, tt=transformer_test(), - current=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - energisedEndStep=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - groundedEndStep=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - leakageImpedance=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - leakageImpedanceZero=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - loss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - lossZero=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - power=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - voltage=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - voltageOhmicPart=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + currentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + energisedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + groundedEndStepSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + leakageImpedanceSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + leakageImpedanceZeroSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + lossZeroSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + powerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + voltageSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + voltageOhmicPartSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -427,10 +427,10 @@ def shunt_compensator_info(): return builds( PBShuntCompensatorInfo, ai=asset_info(), - maxPowerLoss=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - ratedCurrent=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - ratedReactivePower=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - ratedVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + maxPowerLossSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ratedReactivePowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ratedVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), ) @@ -438,7 +438,7 @@ def switch_info(): return builds( PBSwitchInfo, ai=asset_info(), - ratedInterruptingTime=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + ratedInterruptingTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -447,14 +447,14 @@ def transformer_end_info(): PBTransformerEndInfo, ai=asset_info(), connectionKind=sampled_from(PBWindingConnection.values()), - emergencyS=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + emergencySSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), endNumber=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - insulationU=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - phaseAngleClock=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - ratedS=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - ratedU=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - shortTermS=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + insulationUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + phaseAngleClockSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedSSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + shortTermSSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), transformerStarImpedanceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -471,8 +471,8 @@ def transformer_test(): return builds( PBTransformerTest, io=identified_object(), - basePower=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - temperature=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + basePowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + temperatureSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -480,7 +480,7 @@ def wire_info(): return builds( PBWireInfo, ai=asset_info(), - ratedCurrent=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), material=sampled_from(PBWireMaterialKind.values()) ) @@ -525,7 +525,7 @@ def streetlight(): PBStreetlight, at=asset(), poleMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - lightRating=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + lightRatingSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), lampKind=sampled_from(PBStreetlightLampKind.values()) ) @@ -546,12 +546,12 @@ def document(): return builds( PBDocument, io=identified_object(), - title=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + titleSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), createdDateTime=timestamp(), - authorName=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - type=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - status=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - comment=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + authorNameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + typeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + statusSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + commentSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -574,9 +574,9 @@ def position_point(): def street_address(): return builds( PBStreetAddress, - postalCode=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + postalCodeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), townDetail=town_detail(), - poBox=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + poBoxSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), streetDetail=street_detail() ) @@ -584,18 +584,18 @@ def street_address(): def street_detail(): return builds( PBStreetDetail, - buildingName=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - floorIdentification=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - number=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - suiteNumber=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - type=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - displayAddress=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + buildingNameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + floorIdentificationSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + numberSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + suiteNumberSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + typeSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + displayAddressSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) def town_detail(): - return builds(PBTownDetail, name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), stateOrProvince=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)) + return builds(PBTownDetail, nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), stateOrProvinceSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)) ###################### @@ -645,18 +645,18 @@ def current_transformer_info(): return builds( PBCurrentTransformerInfo, ai=asset_info(), - accuracyClass=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - accuracyLimit=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - coreCount=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - ctClass=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - kneePointVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + accuracyClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + accuracyLimitSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + coreCountSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + ctClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + kneePointVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), maxRatio=ratio(), nominalRatio=ratio(), - primaryRatio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - ratedCurrent=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - secondaryFlsRating=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - secondaryRatio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - usage=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + primaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + secondaryFlsRatingSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + secondaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + usageSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -664,12 +664,12 @@ def potential_transformer_info(): return builds( PBPotentialTransformerInfo, ai=asset_info(), - accuracyClass=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + accuracyClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), nominalRatio=ratio(), - primaryRatio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - ptClass=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - ratedVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - secondaryRatio=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + primaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ptClassSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + ratedVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + secondaryRatioSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -683,7 +683,7 @@ def pole(): PBPole, st=structure(), streetlightMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), - classification=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + classificationSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -729,10 +729,10 @@ def usage_point(): usagePointLocationMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), equipmentMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), endDeviceMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), - isVirtual=booleans(), - connectionCategory=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - ratedPower=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - approvedInverterCapacity=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) + isVirtualSet=booleans(), + connectionCategorySet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + ratedPowerSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + approvedInverterCapacitySet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) ) @@ -753,7 +753,7 @@ def auxiliary_equipment(): def current_transformer(): - return builds(PBCurrentTransformer, sn=sensor(), coreBurden=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)) + return builds(PBCurrentTransformer, sn=sensor(), coreBurdenSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)) def fault_indicator(): @@ -810,8 +810,8 @@ def curve_data(): PBCurveData, xValue=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), y1Value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - y2Value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - y3Value=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + y2ValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + y3ValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), ) @@ -851,8 +851,8 @@ def identified_object(): return builds( PBIdentifiedObject, mRID=uuids(version=4).map(lambda x: str(x)), - name=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - description=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + descriptionSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -919,7 +919,7 @@ def diagram_object(): PBDiagramObject, io=identified_object(), diagramMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - diagramObjectStyle=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + diagramObjectStyleSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), rotation=floats(min_value=0.0, max_value=360.0), identifiedObjectMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), diagramObjectPoints=lists(diagram_object_point(), max_size=2) @@ -942,22 +942,22 @@ def equivalent_branch(): return builds( PBEquivalentBranch, ee=equivalent_equipment(), - negativeR12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - negativeR21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - negativeX12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - negativeX21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - positiveR12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - positiveR21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - positiveX12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - positiveX21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - zeroR12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - zeroR21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - zeroX12=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - zeroX21=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + negativeR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + negativeR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + negativeX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + negativeX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + positiveR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + positiveR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + positiveX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + positiveX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + zeroR12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + zeroR21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + zeroX12Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + zeroX21Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -974,8 +974,8 @@ def battery_unit(): PBBatteryUnit, peu=power_electronics_unit(), batteryState=sampled_from(PBBatteryStateKind.values()), - ratedE=integers(min_value=0, max_value=MAX_64_BIT_INTEGER), - storedE=integers(min_value=0, max_value=MAX_64_BIT_INTEGER), + ratedESet=integers(min_value=0, max_value=MAX_64_BIT_INTEGER), + storedESet=integers(min_value=0, max_value=MAX_64_BIT_INTEGER), batteryControlMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2) ) @@ -989,8 +989,8 @@ def power_electronics_unit(): PBPowerElectronicsUnit, eq=equipment(), powerElectronicsConnectionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - maxP=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - minP=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) + maxPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + minPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) ) @@ -1007,7 +1007,7 @@ def accumulator(): def analog(): - return builds(PBAnalog, measurement=measurement(), positiveFlowIn=booleans()) + return builds(PBAnalog, measurement=measurement(), positiveFlowInSet=booleans()) def control(): @@ -1047,9 +1047,9 @@ def current_relay(): return builds( PBCurrentRelay, prf=protection_relay_function(), - currentLimit1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + currentLimit1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), **nullable_bool_settings("inverseTimeFlag"), - timeDelay1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + timeDelay1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1081,7 +1081,7 @@ def breaker(): return builds( PBBreaker, sw=protected_switch(), - inTransitTime=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + inTransitTimeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1093,13 +1093,13 @@ def clamp(): return builds( PBClamp, ce=conducting_equipment(), - lengthFromTerminal1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lengthFromTerminal1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), acLineSegmentMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), ) def conductor(): - return builds(PBConductor, ce=conducting_equipment(), length=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) + return builds(PBConductor, ce=conducting_equipment(), lengthSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) def connector(): @@ -1110,7 +1110,7 @@ def cut(): return builds( PBCut, sw=switch(), - lengthFromTerminal1=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lengthFromTerminal1Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), acLineSegmentMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), ) @@ -1120,7 +1120,7 @@ def disconnector(): def earth_fault_compensator(): - return builds(PBEarthFaultCompensator, ce=conducting_equipment(), r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) + return builds(PBEarthFaultCompensator, ce=conducting_equipment(), rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) def energy_connection(): @@ -1132,12 +1132,12 @@ def energy_consumer(): PBEnergyConsumer, ec=energy_connection(), energyConsumerPhasesMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), - customerCount=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), - grounded=booleans(), p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - pFixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + customerCountSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + groundedSet=booleans(), pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + pFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), phaseConnection=sampled_from(PBPhaseShuntConnectionKind.values()), - q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - qFixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1147,10 +1147,10 @@ def energy_consumer_phase(): psr=power_system_resource(), energyConsumerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), phase=sampled_from(PBSinglePhaseKind.values()), - p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - pFixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - qFixed=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + pFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qFixedSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1159,18 +1159,18 @@ def energy_source(): PBEnergySource, ec=energy_connection(), energySourcePhasesMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), - activePower=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - reactivePower=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - voltageAngle=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - voltageMagnitude=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - pMax=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - pMin=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - rn=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - xn=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + activePowerSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + reactivePowerSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + voltageAngleSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + voltageMagnitudeSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + pMaxSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + pMinSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rnSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xnSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1196,7 +1196,7 @@ def ground_disconnector(): def grounding_impedance(): - return builds(PBGroundingImpedance, efc=earth_fault_compensator(), x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) + return builds(PBGroundingImpedance, efc=earth_fault_compensator(), xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) def jumper(): @@ -1215,10 +1215,10 @@ def linear_shunt_compensator(): return builds( PBLinearShuntCompensator, sc=shunt_compensator(), - b0PerSection=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - bPerSection=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - g0PerSection=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - gPerSection=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + b0PerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + bPerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + g0PerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + gPerSectionSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1246,14 +1246,14 @@ def per_length_sequence_impedance(): return builds( PBPerLengthSequenceImpedance, pli=per_length_impedance(), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - bch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - gch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - b0ch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - g0ch=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + bchSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + gchSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + b0chSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + g0chSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1262,10 +1262,10 @@ def phase_impedance_data(): PBPhaseImpedanceData, fromPhase=sampled_from(PBSinglePhaseKind.values()), toPhase=sampled_from(PBSinglePhaseKind.values()), - b=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - g=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + bSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + gSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), ) @@ -1275,37 +1275,37 @@ def power_electronics_connection(): rce=regulating_cond_eq(), powerElectronicsUnitMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), powerElectronicsConnectionPhaseMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), - maxIFault=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), - maxQ=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - minQ=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - ratedS=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), - ratedU=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), - inverterStandard=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE), - sustainOpOvervoltLimit=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), - stopAtOverFreq=floats(min_value=51.0, max_value=52.0), - stopAtUnderFreq=floats(min_value=47.0, max_value=49.0), + maxIFaultSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + maxQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + minQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedSSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + ratedUSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + inverterStandardSet=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE), + sustainOpOvervoltLimitSet=integers(min_value=0, max_value=MAX_32_BIT_INTEGER), + stopAtOverFreqSet=floats(min_value=51.0, max_value=52.0), + stopAtUnderFreqSet=floats(min_value=47.0, max_value=49.0), **nullable_bool_settings("invVoltWattRespMode"), - invWattRespV1=integers(min_value=200, max_value=300), - invWattRespV2=integers(min_value=216, max_value=230), - invWattRespV3=integers(min_value=235, max_value=255), - invWattRespV4=integers(min_value=244, max_value=265), - invWattRespPAtV1=floats(min_value=0.0, max_value=1.0), - invWattRespPAtV2=floats(min_value=0.0, max_value=1.0), - invWattRespPAtV3=floats(min_value=0.0, max_value=1.0), - invWattRespPAtV4=floats(min_value=0.0, max_value=0.2), + invWattRespV1Set=integers(min_value=200, max_value=300), + invWattRespV2Set=integers(min_value=216, max_value=230), + invWattRespV3Set=integers(min_value=235, max_value=255), + invWattRespV4Set=integers(min_value=244, max_value=265), + invWattRespPAtV1Set=floats(min_value=0.0, max_value=1.0), + invWattRespPAtV2Set=floats(min_value=0.0, max_value=1.0), + invWattRespPAtV3Set=floats(min_value=0.0, max_value=1.0), + invWattRespPAtV4Set=floats(min_value=0.0, max_value=0.2), **nullable_bool_settings("invVoltVarRespMode"), - invVarRespV1=integers(min_value=200, max_value=300), - invVarRespV2=integers(min_value=200, max_value=300), - invVarRespV3=integers(min_value=200, max_value=300), - invVarRespV4=integers(min_value=200, max_value=300), - invVarRespQAtV1=floats(min_value=0.0, max_value=0.6), - invVarRespQAtV2=floats(min_value=-1.0, max_value=1.0), - invVarRespQAtV3=floats(min_value=-1.0, max_value=1.0), - invVarRespQAtV4=floats(min_value=-0.6, max_value=0.0), + invVarRespV1Set=integers(min_value=200, max_value=300), + invVarRespV2Set=integers(min_value=200, max_value=300), + invVarRespV3Set=integers(min_value=200, max_value=300), + invVarRespV4Set=integers(min_value=200, max_value=300), + invVarRespQAtV1Set=floats(min_value=0.0, max_value=0.6), + invVarRespQAtV2Set=floats(min_value=-1.0, max_value=1.0), + invVarRespQAtV3Set=floats(min_value=-1.0, max_value=1.0), + invVarRespQAtV4Set=floats(min_value=-0.6, max_value=0.0), **nullable_bool_settings("invReactivePowerMode"), - invFixReactivePower=floats(min_value=-1.0, max_value=1.0), + invFixReactivePowerSet=floats(min_value=-1.0, max_value=1.0), ) @@ -1314,8 +1314,8 @@ def power_electronics_connection_phase(): PBPowerElectronicsConnectionPhase, psr=power_system_resource(), powerElectronicsConnectionMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), phase=sampled_from(PBSinglePhaseKind.values()), - p=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1325,7 +1325,7 @@ def power_transformer(): ce=conducting_equipment(), powerTransformerEndMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2), vectorGroup=sampled_from(PBVectorGroup.values()), - transformerUtilisation=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) + transformerUtilisationSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1334,17 +1334,17 @@ def power_transformer_end(): PBPowerTransformerEnd, te=transformer_end(), powerTransformerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - ratedU=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), connectionKind=sampled_from(PBWindingConnection.values()), - b=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - b0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - g=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - g0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - phaseAngleClock=integers(min_value=0, max_value=11), + bSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + b0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + gSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + g0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + phaseAngleClockSet=integers(min_value=0, max_value=11), ratings=lists(transformer_end_rated_s(), max_size=3) ) @@ -1353,7 +1353,7 @@ def protected_switch(): return builds( PBProtectedSwitch, sw=switch(), - breakingCapacity=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + breakingCapacitySet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), relayFunctionMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2) ) @@ -1363,7 +1363,7 @@ def ratio_tap_changer(): PBRatioTapChanger, tc=tap_changer(), transformerEndMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - stepVoltageIncrement=floats(min_value=0.0, max_value=1.0) + stepVoltageIncrementSet=floats(min_value=0.0, max_value=1.0) ) @@ -1382,7 +1382,7 @@ def regulating_cond_eq(): return builds( PBRegulatingCondEq, ec=energy_connection(), - controlEnabled=booleans(), + controlEnabledSet=booleans(), regulatingControlMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -1394,12 +1394,12 @@ def regulating_control(): discreteSet=booleans(), mode=sampled_from(PBRegulatingControlModeKind.values()), monitoredPhase=sampled_from(PBPhaseCode.values()), - targetDeadband=floats(min_value=0.0, max_value=FLOAT_MAX), - targetValue=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + targetDeadbandSet=floats(min_value=0.0, max_value=FLOAT_MAX), + targetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), enabledSet=booleans(), - maxAllowedTargetValue=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - minAllowedTargetValue=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - ratedCurrent=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + maxAllowedTargetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + minAllowedTargetValueSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedCurrentSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), terminalMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), regulatingCondEqMRIDs=lists(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), max_size=2) ) @@ -1409,11 +1409,11 @@ def rotating_machine(): return builds( PBRotatingMachine, rce=regulating_cond_eq(), - ratedPowerFactor=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ratedS=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ratedU=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - p=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - q=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) + ratedPowerFactorSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + ratedSSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + ratedUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), + pSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + qSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) ) @@ -1421,12 +1421,12 @@ def series_compensator(): return builds( PBSeriesCompensator, ce=conducting_equipment(), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - varistorRatedCurrent=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - varistorVoltageThreshold=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + varistorRatedCurrentSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + varistorVoltageThresholdSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), ) @@ -1434,9 +1434,9 @@ def shunt_compensator(): return builds( PBShuntCompensator, rce=regulating_cond_eq(), - sections=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - grounded=booleans(), - nomU=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + sectionsSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + groundedSet=booleans(), + nomUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), phaseConnection=sampled_from(PBPhaseShuntConnectionKind.values()) ) @@ -1445,11 +1445,11 @@ def static_var_compensator(): return builds( PBStaticVarCompensator, rce=regulating_cond_eq(), - capacitiveRating=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - inductiveRating=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - q=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + capacitiveRatingSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + inductiveRatingSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), svcControlMode=sampled_from(PBSVCControlMode.values()), - voltageSetPoint=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) + voltageSetPointSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER) ) @@ -1457,7 +1457,7 @@ def switch(): return builds( PBSwitch, ce=conducting_equipment(), - ratedCurrent=integers(min_value=1, max_value=MAX_32_BIT_INTEGER), + ratedCurrentSet=integers(min_value=1, max_value=MAX_32_BIT_INTEGER), normalOpen=booleans(), open=booleans() ) @@ -1467,25 +1467,25 @@ def synchronous_machine(): return builds( PBSynchronousMachine, rm=rotating_machine(), - baseQ=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - condenserP=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - earthing=booleans(), - earthingStarPointR=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - earthingStarPointX=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ikk=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - maxQ=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - maxU=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - minQ=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - minU=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - mu=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - r=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - r0=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - r2=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectSubtransX=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectSyncX=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectTransX=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - x0=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - x2=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + baseQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + condenserPSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), + earthingSet=booleans(), + earthingStarPointRSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + earthingStarPointXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + ikkSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + maxQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + maxUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), + minQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + minUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), + muSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + rSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + r0Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + r2Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + satDirectSubtransXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + satDirectSyncXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + satDirectTransXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + x0Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + x2Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), type=sampled_from(PBSynchronousMachineKind.values()), operatingMode=sampled_from(PBSynchronousMachineKind.values()), reactiveCapabilityCurveMRIDs=one_of(none(), text(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))), @@ -1496,13 +1496,13 @@ def tap_changer(): return builds( PBTapChanger, psr=power_system_resource(), - highStep=integers(min_value=10, max_value=15), - lowStep=integers(min_value=0, max_value=2), - step=floats(min_value=2.0, max_value=10.0), - neutralStep=integers(min_value=2, max_value=10), - neutralU=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), - normalStep=integers(min_value=2, max_value=10), - controlEnabled=booleans(), + highStepSet=integers(min_value=10, max_value=15), + lowStepSet=integers(min_value=0, max_value=2), + stepSet=floats(min_value=2.0, max_value=10.0), + neutralStepSet=integers(min_value=2, max_value=10), + neutralUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + normalStepSet=integers(min_value=2, max_value=10), + controlEnabledSet=booleans(), tapChangerControlMRID=text(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), ) @@ -1511,14 +1511,14 @@ def tap_changer_control(): return builds( PBTapChangerControl, rc=regulating_control(), - limitVoltage=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + limitVoltageSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), **nullable_bool_settings("lineDropCompensation"), - lineDropR=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - lineDropX=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - reverseLineDropR=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - reverseLineDropX=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lineDropRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + lineDropXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + reverseLineDropRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + reverseLineDropXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), **nullable_bool_settings("forwardLDCBlocking"), - timeDelay=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + timeDelaySet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), **nullable_bool_settings("coGenerationEnabled") ) @@ -1531,9 +1531,9 @@ def transformer_end(): baseVoltageMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), ratioTapChangerMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), endNumber=integers(min_value=MIN_SEQUENCE_NUMBER, max_value=MAX_END_NUMBER), - grounded=booleans(), - rGround=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - xGround=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + groundedSet=booleans(), + rGroundSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xGroundSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), starImpedanceMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) @@ -1542,10 +1542,10 @@ def transformer_star_impedance(): return builds( PBTransformerStarImpedance, io=identified_object(), - r=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - r0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - x0=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + xSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), transformerEndInfoMRID=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) ) From 0681953b2a2e626db632826d34549cd6be4bacfa Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Tue, 26 Aug 2025 13:36:19 +1000 Subject: [PATCH 2/7] sync'd with jvm sdk changes. also removed none() in pb creator where required Signed-off-by: Max Chesterfield --- .../database/sqlite/common/base_cim_reader.py | 14 +++--- .../sqlite/network/network_cim_reader.py | 40 ++++++++-------- .../sqlite/network/network_database_reader.py | 6 ++- .../tables/iec61968/common/table_documents.py | 10 ++-- .../iec61968/common/table_street_addresses.py | 2 +- .../infiec61968/infassets/table_poles.py | 2 +- .../base/core/table_identified_objects.py | 6 +-- .../base/core/table_power_system_resources.py | 2 +- .../iec61970/base/meas/table_analogs.py | 2 +- .../base/wires/table_energy_consumers.py | 2 +- .../base/wires/table_energy_sources.py | 2 +- .../base/wires/table_regulating_cond_eq.py | 2 +- .../base/wires/table_shunt_compensators.py | 2 +- .../iec61970/base/wires/table_tap_changers.py | 2 +- .../base/wires/table_transformer_ends.py | 2 +- .../ewb/model/cim/iec61968/common/document.py | 10 ++-- .../cim/iec61968/common/street_address.py | 4 +- .../cim/iec61968/common/street_detail.py | 15 +++--- .../iec61968/infiec61968/infassets/pole.py | 2 +- .../ewb/model/cim/iec61968/metering/meter.py | 6 ++- .../cim/iec61968/metering/usage_point.py | 2 +- .../iec61970/base/core/identified_object.py | 12 +++-- .../model/cim/iec61970/base/core/name_type.py | 4 +- .../base/core/power_system_resource.py | 4 +- .../model/cim/iec61970/base/meas/analog.py | 4 +- .../iec61970/base/wires/energy_consumer.py | 2 +- .../cim/iec61970/base/wires/energy_source.py | 2 +- .../iec61970/base/wires/regulating_cond_eq.py | 2 +- .../iec61970/base/wires/shunt_compensator.py | 2 +- .../base/wires/synchronous_machine.py | 2 +- .../cim/iec61970/base/wires/tap_changer.py | 2 +- .../iec61970/base/wires/transformer_end.py | 2 +- .../common/translator/base_proto2cim.py | 2 +- .../customer/translator/customer_proto2cim.py | 1 + .../network/tracing/phases/phase_inferrer.py | 4 +- test/cim/cim_creators.py | 8 ++-- test/cim/iec61968/assets/test_pole.py | 2 +- test/cim/iec61968/common/test_document.py | 10 ++-- .../iec61968/common/test_street_address.py | 2 +- .../cim/iec61968/common/test_street_detail.py | 14 +++--- test/cim/iec61968/metering/test_meter.py | 5 +- .../cim/iec61968/metering/test_usage_point.py | 10 ++-- .../base/core/test_identified_object.py | 4 +- test/cim/iec61970/base/core/test_name_type.py | 2 +- .../base/core/test_power_system_resource.py | 2 +- test/cim/iec61970/base/meas/test_analog.py | 5 +- .../base/wires/test_energy_consumer.py | 2 +- .../iec61970/base/wires/test_energy_source.py | 2 +- .../base/wires/test_regulating_cond_eq.py | 2 +- .../base/wires/test_shunt_compensator.py | 2 +- .../iec61970/base/wires/test_tap_changer.py | 2 +- .../base/wires/test_transformer_end.py | 2 +- .../tracing/phases/test_phase_inferrer.py | 4 +- test/streaming/get/pb_creators.py | 48 +++++++++---------- test/streaming/get/test_network_consumer.py | 2 +- 55 files changed, 165 insertions(+), 145 deletions(-) diff --git a/src/zepben/ewb/database/sqlite/common/base_cim_reader.py b/src/zepben/ewb/database/sqlite/common/base_cim_reader.py index 517f8fcd7..bcf175c34 100644 --- a/src/zepben/ewb/database/sqlite/common/base_cim_reader.py +++ b/src/zepben/ewb/database/sqlite/common/base_cim_reader.py @@ -53,12 +53,12 @@ def _load_document(self, document: Document, table: TableDocuments, result_set: :return: True if the `Document` was successfully read from the database and added to the service. :raises SQLException: For any errors encountered reading from the database. """ - document.title = result_set.get_string(table.title.query_index, on_none="") + document.title = result_set.get_string(table.title.query_index, on_none=None) document.created_date_time = result_set.get_instant(table.created_date_time.query_index, on_none=None) - document.author_name = result_set.get_string(table.author_name.query_index, on_none="") - document.type = result_set.get_string(table.type.query_index, on_none="") - document.status = result_set.get_string(table.status.query_index, on_none="") - document.comment = result_set.get_string(table.comment.query_index, on_none="") + document.author_name = result_set.get_string(table.author_name.query_index, on_none=None) + document.type = result_set.get_string(table.type.query_index, on_none=None) + document.status = result_set.get_string(table.status.query_index, on_none=None) + document.comment = result_set.get_string(table.comment.query_index, on_none=None) return self._load_identified_object(document, table, result_set) @@ -111,8 +111,8 @@ def _load_identified_object(identified_object: IdentifiedObject, table: TableIde :return: True if the `IdentifiedObject` was successfully read from the database and added to the service. :raises SQLException: For any errors encountered reading from the database. """ - identified_object.name = result_set.get_string(table.name_.query_index, on_none="") - identified_object.description = result_set.get_string(table.description.query_index, on_none="") + identified_object.name = result_set.get_string(table.name_.query_index, on_none=None) + identified_object.description = result_set.get_string(table.description.query_index, on_none=None) # Currently unused # identified_object.num_diagram_objects = result_set.get_int(table.num_diagram_objects.query_index) diff --git a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py index 72fa5fdd4..4cb9ba3b5 100644 --- a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py +++ b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py @@ -1070,22 +1070,22 @@ def load_position_point(self, table: TablePositionPoints, result_set: ResultSet, def _load_street_address(self, table: TableStreetAddresses, result_set: ResultSet) -> StreetAddress: return StreetAddress( - result_set.get_string(table.postal_code.query_index, on_none=""), + result_set.get_string(table.postal_code.query_index, on_none=None), self._load_town_detail(table, result_set), - result_set.get_string(table.po_box.query_index, on_none=""), + result_set.get_string(table.po_box.query_index, on_none=None), self._load_street_detail(table, result_set) ) @staticmethod def _load_street_detail(table: TableStreetAddresses, result_set: ResultSet) -> Optional[StreetDetail]: sd = StreetDetail( - result_set.get_string(table.building_name.query_index, on_none=""), - result_set.get_string(table.floor_identification.query_index, on_none=""), - result_set.get_string(table.street_name.query_index, on_none=""), - result_set.get_string(table.number.query_index, on_none=""), - result_set.get_string(table.suite_number.query_index, on_none=""), - result_set.get_string(table.type.query_index, on_none=""), - result_set.get_string(table.display_address.query_index, on_none="") + result_set.get_string(table.building_name.query_index, on_none=None), + result_set.get_string(table.floor_identification.query_index, on_none=None), + result_set.get_string(table.street_name.query_index, on_none=None), + result_set.get_string(table.number.query_index, on_none=None), + result_set.get_string(table.suite_number.query_index, on_none=None), + result_set.get_string(table.type.query_index, on_none=None), + result_set.get_string(table.display_address.query_index, on_none=None) ) return sd if not sd.all_fields_empty() else None @@ -1178,7 +1178,7 @@ def load_pole(self, table: TablePoles, result_set: ResultSet, set_identifier: Ca """ pole = Pole(mrid=set_identifier(result_set.get_string(table.mrid.query_index))) - pole.classification = result_set.get_string(table.classification.query_index, on_none="") + pole.classification = result_set.get_string(table.classification.query_index, on_none=None) return self._load_structure(pole, table, result_set) and self._add_or_throw(pole) @@ -1232,7 +1232,7 @@ def load_usage_point(self, table: TableUsagePoints, result_set: ResultSet, set_i result_set.get_string(table.location_mrid.query_index, on_none=None), Location ) - usage_point.is_virtual = result_set.get_boolean(table.is_virtual.query_index) + usage_point.is_virtual = result_set.get_boolean(table.is_virtual.query_index, on_none=None) usage_point.connection_category = result_set.get_string(table.connection_category.query_index, on_none=None) usage_point.rated_power = result_set.get_int(table.rated_power.query_index, on_none=None) usage_point.approved_inverter_capacity = result_set.get_int(table.approved_inverter_capacity.query_index, on_none=None) @@ -1472,7 +1472,7 @@ def _load_power_system_resource(self, power_system_resource: PowerSystemResource result_set.get_string(table.location_mrid.query_index, on_none=None), Location ) - power_system_resource.num_controls = result_set.get_int(table.num_controls.query_index) + power_system_resource.num_controls = result_set.get_int(table.num_controls.query_index, on_none=None) return self._load_identified_object(power_system_resource, table, result_set) @@ -1686,7 +1686,7 @@ def load_analog(self, table: TableAnalogs, result_set: ResultSet, set_identifier """ meas = Analog(mrid=set_identifier(result_set.get_string(table.mrid.query_index))) - meas.positive_flow_in = result_set.get_boolean(table.positive_flow_in.query_index) + meas.positive_flow_in = result_set.get_boolean(table.positive_flow_in.query_index, on_none=None) return self._load_measurement(meas, table, result_set) and self._add_or_throw(meas) @@ -1956,7 +1956,7 @@ def load_energy_consumer(self, table: TableEnergyConsumers, result_set: ResultSe energy_consumer = EnergyConsumer(mrid=set_identifier(result_set.get_string(table.mrid.query_index))) energy_consumer.customer_count = result_set.get_int(table.customer_count.query_index, on_none=None) - energy_consumer.grounded = result_set.get_boolean(table.grounded.query_index) + energy_consumer.grounded = result_set.get_boolean(table.grounded.query_index, on_none=None) energy_consumer.p = result_set.get_float(table.p.query_index, on_none=None) energy_consumer.q = result_set.get_float(table.q.query_index, on_none=None) energy_consumer.p_fixed = result_set.get_float(table.p_fixed.query_index, on_none=None) @@ -2018,7 +2018,7 @@ def load_energy_source(self, table: TableEnergySources, result_set: ResultSet, s energy_source.x = result_set.get_float(table.x.query_index, on_none=None) energy_source.x0 = result_set.get_float(table.x0.query_index, on_none=None) energy_source.xn = result_set.get_float(table.xn.query_index, on_none=None) - energy_source.is_external_grid = result_set.get_boolean(table.is_external_grid.query_index) + energy_source.is_external_grid = result_set.get_boolean(table.is_external_grid.query_index, on_none=None) energy_source.r_min = result_set.get_float(table.r_min.query_index, on_none=None) energy_source.rn_min = result_set.get_float(table.rn_min.query_index, on_none=None) energy_source.r0_min = result_set.get_float(table.r0_min.query_index, on_none=None) @@ -2488,7 +2488,7 @@ def load_recloser(self, table: TableReclosers, result_set: ResultSet, set_identi return self._load_protected_switch(recloser, table, result_set) and self._add_or_throw(recloser) def _load_regulating_cond_eq(self, regulating_cond_eq: RegulatingCondEq, table: TableRegulatingCondEq, result_set: ResultSet) -> bool: - regulating_cond_eq.control_enabled = result_set.get_boolean(table.control_enabled.query_index) + regulating_cond_eq.control_enabled = result_set.get_boolean(table.control_enabled.query_index, on_none=None) # We use a resolver here because there is an ordering conflict between terminals, RegulatingCondEq, and RegulatingControls # We check this resolver has actually been resolved in the postLoad of the database read and throw there if it hasn't. self._service.resolve_or_defer_reference( @@ -2556,7 +2556,7 @@ def _load_shunt_compensator(self, shunt_compensator: ShuntCompensator, table: Ta ShuntCompensatorInfo ) - shunt_compensator.grounded = result_set.get_boolean(table.grounded.query_index) + shunt_compensator.grounded = result_set.get_boolean(table.grounded.query_index, on_none=None) shunt_compensator.nom_u = result_set.get_int(table.nom_u.query_index, on_none=None) shunt_compensator.phase_connection = PhaseShuntConnectionKind[result_set.get_string(table.phase_connection.query_index)] shunt_compensator.sections = result_set.get_float(table.sections.query_index, on_none=None) @@ -2610,7 +2610,7 @@ def load_synchronous_machine(self, table: TableSynchronousMachines, result_set: synchronous_machine.base_q = result_set.get_float(table.base_q.query_index, on_none=None) synchronous_machine.condenser_p = result_set.get_int(table.condenser_p.query_index, on_none=None) - synchronous_machine.earthing = result_set.get_boolean(table.earthing.query_index) + synchronous_machine.earthing = result_set.get_boolean(table.earthing.query_index, on_none=None) synchronous_machine.earthing_star_point_r = result_set.get_float(table.earthing_star_point_r.query_index, on_none=None) synchronous_machine.earthing_star_point_x = result_set.get_float(table.earthing_star_point_x.query_index, on_none=None) synchronous_machine.ikk = result_set.get_float(table.ikk.query_index, on_none=None) @@ -2633,7 +2633,7 @@ def load_synchronous_machine(self, table: TableSynchronousMachines, result_set: return self._load_rotating_machine(synchronous_machine, table, result_set) and self._add_or_throw(synchronous_machine) def _load_tap_changer(self, tap_changer: TapChanger, table: TableTapChangers, result_set: ResultSet) -> bool: - tap_changer.control_enabled = result_set.get_boolean(table.control_enabled.query_index) + tap_changer.control_enabled = result_set.get_boolean(table.control_enabled.query_index, on_none=None) tap_changer.high_step = result_set.get_int(table.high_step.query_index, on_none=None) tap_changer.low_step = result_set.get_int(table.low_step.query_index, on_none=None) tap_changer.neutral_step = result_set.get_int(table.neutral_step.query_index, on_none=None) @@ -2681,7 +2681,7 @@ def _load_transformer_end(self, transformer_end: TransformerEnd, table: TableTra result_set.get_string(table.base_voltage_mrid.query_index, on_none=None), BaseVoltage ) - transformer_end.grounded = result_set.get_boolean(table.grounded.query_index) + transformer_end.grounded = result_set.get_boolean(table.grounded.query_index, on_none=None) transformer_end.r_ground = result_set.get_float(table.r_ground.query_index, on_none=None) transformer_end.x_ground = result_set.get_float(table.x_ground.query_index, on_none=None) transformer_end.star_impedance = self._ensure_get( diff --git a/src/zepben/ewb/database/sqlite/network/network_database_reader.py b/src/zepben/ewb/database/sqlite/network/network_database_reader.py index 01b948289..4c009c6a4 100644 --- a/src/zepben/ewb/database/sqlite/network/network_database_reader.py +++ b/src/zepben/ewb/database/sqlite/network/network_database_reader.py @@ -154,9 +154,11 @@ def head_conducting_equipment_mrid(feeder: Feeder) -> Optional[str]: feeder_start_points = set(map(head_conducting_equipment_mrid, self.service.objects(Feeder))) def has_been_assigned_to_feeder(energy_source: EnergySource) -> bool: - return energy_source.is_external_grid \ - and self._is_on_feeder(energy_source) \ + return ( + energy_source.is_external_grid + and self._is_on_feeder(energy_source) and feeder_start_points.isdisjoint({it.to_equip.mrid for it in connected_equipment(energy_source) if it.to_equip}) + ) for es in self.service.objects(EnergySource): if has_been_assigned_to_feeder(es): diff --git a/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py b/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py index 5f35dde10..e4a58349e 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py @@ -15,9 +15,9 @@ class TableDocuments(TableIdentifiedObjects, ABC): def __init__(self): super().__init__() - self.title: Column = self._create_column("title", "TEXT", Nullable.NOT_NULL) + self.title: Column = self._create_column("title", "TEXT", Nullable.NULL) self.created_date_time: Column = self._create_column("created_date_time", "TEXT", Nullable.NULL) - self.author_name: Column = self._create_column("author_name", "TEXT", Nullable.NOT_NULL) - self.type: Column = self._create_column("type", "TEXT", Nullable.NOT_NULL) - self.status: Column = self._create_column("status", "TEXT", Nullable.NOT_NULL) - self.comment: Column = self._create_column("comment", "TEXT", Nullable.NOT_NULL) + self.author_name: Column = self._create_column("author_name", "TEXT", Nullable.NULL) + self.type: Column = self._create_column("type", "TEXT", Nullable.NULL) + self.status: Column = self._create_column("status", "TEXT", Nullable.NULL) + self.comment: Column = self._create_column("comment", "TEXT", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py b/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py index 4f59a5c75..15a1d6be5 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py @@ -15,7 +15,7 @@ class TableStreetAddresses(TableTownDetails, ABC): def __init__(self): super().__init__() - self.postal_code: Column = self._create_column("postal_code", "TEXT", Nullable.NOT_NULL) + self.postal_code: Column = self._create_column("postal_code", "TEXT", Nullable.NULL) self.po_box: Column = self._create_column("po_box", "TEXT", Nullable.NULL) self.building_name: Column = self._create_column("building_name", "TEXT", Nullable.NULL) self.floor_identification: Column = self._create_column("floor_identification", "TEXT", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py b/src/zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py index 854da5a3a..76dc5558f 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py @@ -13,7 +13,7 @@ class TablePoles(TableStructures): def __init__(self): super().__init__() - self.classification: Column = self._create_column("classification", "TEXT", Nullable.NOT_NULL) + self.classification: Column = self._create_column("classification", "TEXT", Nullable.NULL) @property def name(self) -> str: diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py index 71416b50c..3658046a6 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py @@ -16,9 +16,9 @@ class TableIdentifiedObjects(SqliteTable, ABC): def __init__(self): self.mrid: Column = self._create_column("mrid", "TEXT", Nullable.NOT_NULL) - self.name_: Column = self._create_column("name", "TEXT", Nullable.NOT_NULL) - self.description: Column = self._create_column("description", "TEXT", Nullable.NOT_NULL) - self.num_diagram_objects: Column = self._create_column("num_diagram_objects", "INTEGER", Nullable.NOT_NULL) + self.name_: Column = self._create_column("name", "TEXT", Nullable.NULL) + self.description: Column = self._create_column("description", "TEXT", Nullable.NULL) + self.num_diagram_objects: Column = self._create_column("num_diagram_objects", "INTEGER", Nullable.NULL) @property def unique_index_columns(self) -> Generator[List[Column], None, None]: diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py index e7a0ffcda..e14eb1fcb 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py @@ -16,4 +16,4 @@ class TablePowerSystemResources(TableIdentifiedObjects, ABC): def __init__(self): super().__init__() self.location_mrid: Column = self._create_column("location_mrid", "TEXT", Nullable.NULL) - self.num_controls: Column = self._create_column("num_controls", "INTEGER", Nullable.NOT_NULL) + self.num_controls: Column = self._create_column("num_controls", "INTEGER", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py index a7a552209..9856395fe 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py @@ -13,7 +13,7 @@ class TableAnalogs(TableMeasurements): def __init__(self): super().__init__() - self.positive_flow_in: Column = self._create_column("positive_flow_in", "BOOLEAN", Nullable.NOT_NULL) + self.positive_flow_in: Column = self._create_column("positive_flow_in", "BOOLEAN", Nullable.NULL) @property def name(self) -> str: diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py index ef5e5c430..035a6d7d4 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py @@ -14,7 +14,7 @@ class TableEnergyConsumers(TableEnergyConnections): def __init__(self): super().__init__() self.customer_count: Column = self._create_column("customer_count", "INTEGER", Nullable.NULL) - self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NOT_NULL) + self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NULL) self.p: Column = self._create_column("p", "NUMBER", Nullable.NULL) self.q: Column = self._create_column("q", "NUMBER", Nullable.NULL) self.p_fixed: Column = self._create_column("p_fixed", "NUMBER", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py index b16fbb182..1238ff9de 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py @@ -25,7 +25,7 @@ def __init__(self): self.x: Column = self._create_column("x", "NUMBER", Nullable.NULL) self.x0: Column = self._create_column("x0", "NUMBER", Nullable.NULL) self.xn: Column = self._create_column("xn", "NUMBER", Nullable.NULL) - self.is_external_grid: Column = self._create_column("is_external_grid", "BOOLEAN", Nullable.NOT_NULL) + self.is_external_grid: Column = self._create_column("is_external_grid", "BOOLEAN", Nullable.NULL) self.r_min: Column = self._create_column("r_min", "NUMBER", Nullable.NULL) self.rn_min: Column = self._create_column("rn_min", "NUMBER", Nullable.NULL) self.r0_min: Column = self._create_column("r0_min", "NUMBER", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py index 8f18a8b48..a970a6be1 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py @@ -15,5 +15,5 @@ class TableRegulatingCondEq(TableEnergyConnections, ABC): def __init__(self): super().__init__() - self.control_enabled: Column = self._create_column("control_enabled", "BOOLEAN", Nullable.NOT_NULL) + self.control_enabled: Column = self._create_column("control_enabled", "BOOLEAN", Nullable.NULL) self.regulating_control_mrid: Column = self._create_column("regulating_control_mrid", "TEXT", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py index 08d033aaf..ad2f7e8ba 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py @@ -16,7 +16,7 @@ class TableShuntCompensators(TableRegulatingCondEq, ABC): def __init__(self): super().__init__() self.shunt_compensator_info_mrid: Column = self._create_column("shunt_compensator_info_mrid", "TEXT", Nullable.NULL) - self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NOT_NULL) + self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NULL) self.nom_u: Column = self._create_column("nom_u", "INTEGER", Nullable.NULL) self.phase_connection: Column = self._create_column("phase_connection", "TEXT", Nullable.NOT_NULL) self.sections: Column = self._create_column("sections", "NUMBER", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py index bd0b05085..87d87adfe 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py @@ -15,7 +15,7 @@ class TableTapChangers(TablePowerSystemResources, ABC): def __init__(self): super().__init__() - self.control_enabled: Column = self._create_column("control_enabled", "BOOLEAN", Nullable.NOT_NULL) + self.control_enabled: Column = self._create_column("control_enabled", "BOOLEAN", Nullable.NULL) self.high_step: Column = self._create_column("high_step", "INTEGER", Nullable.NULL) self.low_step: Column = self._create_column("low_step", "INTEGER", Nullable.NULL) self.neutral_step: Column = self._create_column("neutral_step", "INTEGER", Nullable.NULL) diff --git a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py index 5cc3da48f..14c82bcba 100644 --- a/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +++ b/src/zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py @@ -19,7 +19,7 @@ def __init__(self): self.end_number: Column = self._create_column("end_number", "INTEGER", Nullable.NOT_NULL) self.terminal_mrid: Column = self._create_column("terminal_mrid", "TEXT", Nullable.NULL) self.base_voltage_mrid: Column = self._create_column("base_voltage_mrid", "TEXT", Nullable.NULL) - self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NOT_NULL) + self.grounded: Column = self._create_column("grounded", "BOOLEAN", Nullable.NULL) self.r_ground: Column = self._create_column("r_ground", "NUMBER", Nullable.NULL) self.x_ground: Column = self._create_column("x_ground", "NUMBER", Nullable.NULL) self.star_impedance_mrid: Column = self._create_column("star_impedance_mrid", "TEXT", Nullable.NULL) diff --git a/src/zepben/ewb/model/cim/iec61968/common/document.py b/src/zepben/ewb/model/cim/iec61968/common/document.py index f149eb8e9..5c6abde1e 100644 --- a/src/zepben/ewb/model/cim/iec61968/common/document.py +++ b/src/zepben/ewb/model/cim/iec61968/common/document.py @@ -16,21 +16,21 @@ class Document(IdentifiedObject): Parent class for different groupings of information collected and managed as a part of a business process. It will frequently contain references to other objects, such as assets, people and power system resources. """ - title: str = "" + title: Optional[str] = None """Document title.""" created_date_time: Optional[datetime] = None """Date and time that this document was created.""" - author_name: str = "" + author_name: Optional[str] = None """Name of the author of this document.""" - type: str = "" + type: Optional[str] = None """Utility-specific classification of this document, according to its corporate standards, practices, and existing IT systems (e.g., for management of assets, maintenance, work, outage, customers, etc.).""" - status: str = "" + status: Optional[str] = None """Status of subject matter (e.g., Agreement, Work) this document represents.""" - comment: str = "" + comment: Optional[str] = None """Free text comment""" diff --git a/src/zepben/ewb/model/cim/iec61968/common/street_address.py b/src/zepben/ewb/model/cim/iec61968/common/street_address.py index 0e2b460b7..9621f9376 100644 --- a/src/zepben/ewb/model/cim/iec61968/common/street_address.py +++ b/src/zepben/ewb/model/cim/iec61968/common/street_address.py @@ -18,11 +18,11 @@ class StreetAddress(object): General purpose street and postal address information. """ - postal_code: str = "" + postal_code: Optional[str] = None """Postal code for the address.""" town_detail: Optional[TownDetail] = None """Optional `TownDetail` for this address.""" - po_box: str = "" + po_box: Optional[str] = None """Post office box for the address.""" street_detail: Optional[StreetDetail] = None """Optional `StreetDetail` for this address.""" diff --git a/src/zepben/ewb/model/cim/iec61968/common/street_detail.py b/src/zepben/ewb/model/cim/iec61968/common/street_detail.py index 7d9d24bc9..048fe805b 100644 --- a/src/zepben/ewb/model/cim/iec61968/common/street_detail.py +++ b/src/zepben/ewb/model/cim/iec61968/common/street_detail.py @@ -6,6 +6,7 @@ __all__ = ["StreetDetail"] from dataclasses import dataclass +from typing import Optional @dataclass @@ -14,22 +15,22 @@ class StreetDetail(object): Street details, in the context of address. """ - building_name: str = "" + building_name: str = None """ (if applicable) In certain cases the physical location of the place of interest does not have a direct point of entry from the street, but may be located inside a larger structure such as a building, complex, office block, apartment, etc. """ - floor_identification: str = "" + floor_identification: Optional[str] = None """The identification by name or number, expressed as text, of the floor in the building as part of this address.""" - name: str = "" + name: Optional[str] = None """Name of the street.""" - number: str = "" + number: Optional[str] = None """Designator of the specific location on the street.""" - suite_number: str = "" + suite_number: Optional[str] = None """Number of the apartment or suite.""" - type: str = "" + type: Optional[str] = None """Type of street. Examples include: street, circle, boulevard, avenue, road, drive, etc.""" - display_address: str = "" + display_address: Optional[str] = None """The address as it should be displayed to a user.""" def all_fields_empty(self): diff --git a/src/zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py b/src/zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py index 6c7e788a3..27bc7ff65 100644 --- a/src/zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +++ b/src/zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py @@ -19,7 +19,7 @@ class Pole(Structure): """A Pole Asset""" - classification: str = "" + classification: Optional[str] = None """Pole class: 1, 2, 3, 4, 5, 6, 7, H1, H2, Other, Unknown.""" _streetlights: Optional[List[Streetlight]] = None diff --git a/src/zepben/ewb/model/cim/iec61968/metering/meter.py b/src/zepben/ewb/model/cim/iec61968/metering/meter.py index 383e53b77..989668670 100644 --- a/src/zepben/ewb/model/cim/iec61968/metering/meter.py +++ b/src/zepben/ewb/model/cim/iec61968/metering/meter.py @@ -5,6 +5,8 @@ __all__ = ["Meter"] +from typing import Optional + from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice @@ -14,12 +16,12 @@ class Meter(EndDevice): """ @property - def company_meter_id(self): + def company_meter_id(self) -> Optional[str]: """ Returns this `Meter`s ID. Currently stored in `IdentifiedObject.name` """ return self.name @company_meter_id.setter - def company_meter_id(self, meter_id): + def company_meter_id(self, meter_id: str): """ `meter_id` The ID to set for this Meter. Will use `IdentifiedObject.name` as a backing field. """ diff --git a/src/zepben/ewb/model/cim/iec61968/metering/usage_point.py b/src/zepben/ewb/model/cim/iec61968/metering/usage_point.py index 07d3ee3bd..50976dfc4 100644 --- a/src/zepben/ewb/model/cim/iec61968/metering/usage_point.py +++ b/src/zepben/ewb/model/cim/iec61968/metering/usage_point.py @@ -28,7 +28,7 @@ class UsagePoint(IdentifiedObject): usage_point_location: Optional[Location] = None """Service `zepben.ewb.model.cim.iec61968.common.location.Location` where the service delivered by this `UsagePoint` is consumed.""" - is_virtual: bool = False + is_virtual: Optional[bool] = None """ If true, this usage point is virtual, i.e., no physical location exists in the network where a meter could be located to collect the meter readings. For example, one may define a virtual usage point to serve as an aggregation of usage for all diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py index 4a2957730..6b0e75210 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py @@ -34,14 +34,16 @@ class IdentifiedObject(object, metaclass=ABCMeta): """Master resource identifier issued by a model authority. The mRID is unique within an exchange context. Global uniqueness is easily achieved by using a UUID, as specified in RFC 4122, for the mRID. The use of UUID is strongly recommended.""" - name: str = "" + name: Optional[str] = None """The name is any free human readable and possibly non unique text naming the object.""" - description: str = "" + description: Optional[str] = None """a free human readable text describing or naming the object. It may be non unique and may not correlate to a naming hierarchy.""" _names: Optional[List[Name]] = None + # TODO: Missing num_diagram_objects: int = None def has_diagram_objects(self): return (self.num_diagram_objects or 0) > 0 + def __init__(self, names: Optional[List[Name]] = None, **kwargs): super(IdentifiedObject, self).__init__(**kwargs) if names: @@ -49,7 +51,11 @@ def __init__(self, names: Optional[List[Name]] = None, **kwargs): self.add_name(name.type, name.name) def __str__(self): - return f"{self.__class__.__name__}{{{'|'.join(a for a in (str(self.mrid), str(self.name)) if a)}}}" + str = f'{self.__class__.__name__}' + if self.name: + return f'{str}{{{self.mrid}|{self.name}}}' + return f'{str}{{{self.mrid}}}' + return f'{self.__class__.__name__}{{{self.mrid}{f"|{self.name}" if self.name else ""}}}' @property def names(self) -> Generator[Name, None, None]: diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py b/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py index 5b099a05f..63f8bf61a 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/name_type.py @@ -7,7 +7,7 @@ __all__ = ["NameType"] -from typing import Dict, List, Generator, overload, TYPE_CHECKING, Callable +from typing import Dict, List, Generator, overload, TYPE_CHECKING, Callable, Optional from zepben.ewb.dataclassy import dataclass from zepben.ewb.model.cim.iec61970.base.core.name import Name @@ -30,7 +30,7 @@ class NameType: name: str """Name of the name type.""" - description: str = "" + description: Optional[str] = None """Description of the name type.""" _names_index: Dict[str, Name] = dict() diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py b/src/zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py index f4774a432..f11b0dca4 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py @@ -32,7 +32,7 @@ class PowerSystemResource(IdentifiedObject): asset_info: Optional[AssetInfo] = None """A subclass of `zepben.ewb.model.cim.iec61968.assets.asset_info.AssetInfo` providing information about the asset associated with this PowerSystemResource.""" - num_controls: int = 0 + num_controls: Optional[int] = None """Number of Control's known to associate with this [PowerSystemResource]""" _assets: Optional[List[Asset]] = None @@ -48,7 +48,7 @@ def has_controls(self) -> bool: """ * :return: True if this [PowerSystemResource] has at least 1 Control associated with it, false otherwise. """ - return self.num_controls > 0 + return nlen(self.num_controls) > 0 def num_assets(self) -> int: """ diff --git a/src/zepben/ewb/model/cim/iec61970/base/meas/analog.py b/src/zepben/ewb/model/cim/iec61970/base/meas/analog.py index 877cc1068..279901827 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/meas/analog.py +++ b/src/zepben/ewb/model/cim/iec61970/base/meas/analog.py @@ -5,12 +5,14 @@ __all__ = ["Analog"] +from typing import Optional + from zepben.ewb.model.cim.iec61970.base.meas.measurement import Measurement class Analog(Measurement): """Analog represents an analog Measurement.""" - positive_flow_in: bool = False + positive_flow_in: Optional[bool] = None """If true then this measurement is an active power, reactive power or current with the convention that a positive value measured at the Terminal means power is flowing into the related PowerSystemResource.""" diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py b/src/zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py index 73a8e64bb..91854c9b4 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py @@ -26,7 +26,7 @@ class EnergyConsumer(EnergyConnection): customer_count: Optional[int] = None """Number of individual customers represented by this demand.""" - grounded: bool = False + grounded: Optional[bool] = None """Used for Yn and Zn connections. True if the neutral is solidly grounded.""" phase_connection: PhaseShuntConnectionKind = PhaseShuntConnectionKind.D diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/energy_source.py b/src/zepben/ewb/model/cim/iec61970/base/wires/energy_source.py index ba27d7a3d..0f3e470f5 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/energy_source.py @@ -69,7 +69,7 @@ class EnergySource(EnergyConnection): xn: Optional[float] = None """Negative sequence Thevenin reactance.""" - is_external_grid: bool = False + is_external_grid: Optional[bool] = None """ True if this energy source represents the higher-level power grid connection to an external grid that normally is modelled as the slack bus for power flow calculations. diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py index eb6bef51a..4cb35032f 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py @@ -21,7 +21,7 @@ class RegulatingCondEq(EnergyConnection): de-energized. Note that zero-impedance branches can potentially be modeled by other equipment types. """ - control_enabled: bool = True + control_enabled: Optional[bool] = None """Specifies the regulation status of the equipment. True is regulating, false is not regulating.""" _regulating_control: Optional[RegulatingControl] = None diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py b/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py index f4f35178a..964f1e429 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py @@ -20,7 +20,7 @@ class ShuntCompensator(RegulatingCondEq): is an individual capacitor or reactor. A negative value for reactivePerSection indicates that the compensator is a reactor. ShuntCompensator is a single terminal device. Ground is implied. """ - grounded: bool = False + grounded: Optional[bool] = None """Used for Yn and Zn connections. True if the neutral is solidly grounded. nom_u : The voltage at which the nominal reactive power may be calculated. This should normally be within 10% of the voltage at which the capacitor is connected to the network.""" diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py b/src/zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py index 942c0c08a..fcb2fba32 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py @@ -29,7 +29,7 @@ class SynchronousMachine(RotatingMachine): condenser_p: Optional[int] = None """Active power consumed (watts) when in condenser mode operation.""" - earthing: bool = False + earthing: Optional[bool] = None """Indicates whether the generator is earthed. Used for short circuit data exchange according to IEC 60909.""" earthing_star_point_r: Optional[float] = None diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py b/src/zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py index 9e604e638..8ee87b7de 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py @@ -19,7 +19,7 @@ class TapChanger(PowerSystemResource): Mechanism for changing transformer winding tap positions. """ - control_enabled: bool = True + control_enabled: Optional[bool] = None """Specifies the regulation status of the equipment. True is regulating, false is not regulating.""" neutral_u: Optional[int] = None diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py b/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py index fee45d0fd..0341eddb0 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py @@ -24,7 +24,7 @@ class TransformerEnd(IdentifiedObject): In earlier CIM versions, the TransformerWinding class served a similar purpose, but this class is more flexible because it associates to terminal but is not a specialization of ConductingEquipment. """ - grounded: bool = False + grounded: Optional[bool] = None """(for Yn and Zn connections) True if the neutral is solidly grounded.""" r_ground: Optional[float] = None diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index a8a2fb197..1dfbf633c 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -57,7 +57,7 @@ def bind_to_cim(func: Callable[P, R]) -> Callable[P, R]: T = TypeVar("T") def get_nullable(pb: Message, field: str) -> Optional[T]: - return None if pb.HasField(f'{field}Null') else getattr(pb, f'{field}Set') + return getattr(pb, f'{field}Set') if pb.HasField(f'{field}Set') else None ################### diff --git a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py index c07ca5156..7f818ce5a 100644 --- a/src/zepben/ewb/services/customer/translator/customer_proto2cim.py +++ b/src/zepben/ewb/services/customer/translator/customer_proto2cim.py @@ -44,6 +44,7 @@ def customer_to_cim(pb: PBCustomer, service: CustomerService) -> Optional[Custom cim = Customer( mrid=pb.mrid(), kind=CustomerKind(pb.kind), + # TODO: missing num_end_devices from jvm sdk special_need=get_nullable(pb, 'specialNeed') ) diff --git a/src/zepben/ewb/services/network/tracing/phases/phase_inferrer.py b/src/zepben/ewb/services/network/tracing/phases/phase_inferrer.py index aa1795369..3b6a09683 100644 --- a/src/zepben/ewb/services/network/tracing/phases/phase_inferrer.py +++ b/src/zepben/ewb/services/network/tracing/phases/phase_inferrer.py @@ -36,9 +36,9 @@ def __init__(self, conducting_equipment: ConductingEquipment, suspect: bool): @property def description(self) -> str: if self.suspect: - _inner_desc = f"phases for '{self.conducting_equipment.name}' [{self.conducting_equipment.mrid}] which may not be correct. The phases were inferred" + _inner_desc = f"phases for '{str(self.conducting_equipment)}' which may not be correct. The phases were inferred" else: - _inner_desc = f"phase for '{self.conducting_equipment.name}' [{self.conducting_equipment.mrid}] which should be correct. The phase was inferred" + _inner_desc = f"phase for '{str(self.conducting_equipment)}' which should be correct. The phase was inferred" return (f'Inferred missing {_inner_desc} due to a disconnected nominal phase because of an ' f'upstream error in the source data. Phasing information for the upstream equipment should be fixed in the source system.') diff --git a/test/cim/cim_creators.py b/test/cim/cim_creators.py index 98486b3d0..6e7e7a508 100644 --- a/test/cim/cim_creators.py +++ b/test/cim/cim_creators.py @@ -855,8 +855,8 @@ def create_geographical_region(include_runtime: bool = True): def create_identified_object(include_runtime: bool): return { "mrid": uuids(version=4).map(lambda x: str(x)), - "name": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - "description": text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), + "name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), + "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), "names": lists(builds(Name, text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), create_name_type()), max_size=2, unique_by=lambda it: it.name) } @@ -1559,7 +1559,7 @@ def create_recloser(include_runtime: bool = True): def create_regulating_cond_eq(include_runtime: bool): return { **create_energy_connection(include_runtime), - "control_enabled": booleans(), + "control_enabled": one_of(none(), booleans()), "regulating_control": builds(TapChangerControl, **create_identified_object(include_runtime)), } @@ -1661,7 +1661,7 @@ def create_synchronous_machine(include_runtime: bool = True): curves=one_of(none(), lists(builds(ReactiveCapabilityCurve, **create_identified_object(include_runtime)), min_size=1, max_size=2)), base_q=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), condenser_p=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - earthing=booleans(), + earthing=one_of(none(), booleans()), earthing_star_point_r=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), earthing_star_point_x=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), ikk=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), diff --git a/test/cim/iec61968/assets/test_pole.py b/test/cim/iec61968/assets/test_pole.py index 127049f12..c6d4f657f 100644 --- a/test/cim/iec61968/assets/test_pole.py +++ b/test/cim/iec61968/assets/test_pole.py @@ -24,7 +24,7 @@ def test_pole_constructor_default(): p = Pole() verify_structure_constructor_default(p) - assert p.classification == "" + assert p.classification is None assert not list(p.streetlights) diff --git a/test/cim/iec61968/common/test_document.py b/test/cim/iec61968/common/test_document.py index 90b191816..3f5f57a3d 100644 --- a/test/cim/iec61968/common/test_document.py +++ b/test/cim/iec61968/common/test_document.py @@ -26,12 +26,12 @@ def verify_document_constructor_default(d: Document): verify_identified_object_constructor_default(d) - assert d.title == "" + assert d.title is None assert not d.created_date_time - assert d.author_name == "" - assert d.type == "" - assert d.status == "" - assert d.comment == "" + assert d.author_name is None + assert d.type is None + assert d.status is None + assert d.comment is None # noinspection PyShadowingBuiltins diff --git a/test/cim/iec61968/common/test_street_address.py b/test/cim/iec61968/common/test_street_address.py index a712b3590..291aa3901 100644 --- a/test/cim/iec61968/common/test_street_address.py +++ b/test/cim/iec61968/common/test_street_address.py @@ -24,7 +24,7 @@ def test_street_address_constructor_default(): sa = StreetAddress() - assert sa.postal_code == "" + assert sa.postal_code is None assert not sa.town_detail diff --git a/test/cim/iec61968/common/test_street_detail.py b/test/cim/iec61968/common/test_street_detail.py index 58488a100..9090908ea 100644 --- a/test/cim/iec61968/common/test_street_detail.py +++ b/test/cim/iec61968/common/test_street_detail.py @@ -25,13 +25,13 @@ def test_street_detail_constructor_default(): sd = StreetDetail() - assert sd.building_name == "" - assert sd.floor_identification == "" - assert sd.name == "" - assert sd.number == "" - assert sd.suite_number == "" - assert sd.type == "" - assert sd.display_address == "" + assert sd.building_name is None + assert sd.floor_identification is None + assert sd.name is None + assert sd.number is None + assert sd.suite_number is None + assert sd.type is None + assert sd.display_address is None @given(**street_detail_kwargs) diff --git a/test/cim/iec61968/metering/test_meter.py b/test/cim/iec61968/metering/test_meter.py index 03b160bf3..c3cc724cd 100644 --- a/test/cim/iec61968/metering/test_meter.py +++ b/test/cim/iec61968/metering/test_meter.py @@ -14,7 +14,10 @@ def test_meter_constructor_default(): - verify_end_device_constructor_default(Meter()) + meter = Meter() + verify_end_device_constructor_default(meter) + assert meter.company_meter_id is None + assert meter.name is None @given(**meter_kwargs) diff --git a/test/cim/iec61968/metering/test_usage_point.py b/test/cim/iec61968/metering/test_usage_point.py index ca2a0db91..17c568887 100644 --- a/test/cim/iec61968/metering/test_usage_point.py +++ b/test/cim/iec61968/metering/test_usage_point.py @@ -33,11 +33,11 @@ def test_usage_point_constructor_default(): up = UsagePoint() verify_identified_object_constructor_default(up) - assert not up.usage_point_location - assert not up.is_virtual - assert not up.connection_category - assert not up.rated_power - assert not up.approved_inverter_capacity + assert up.usage_point_location is None + assert up.is_virtual is None + assert up.connection_category is None + assert up.rated_power is None + assert up.approved_inverter_capacity is None assert not list(up.equipment) assert not list(up.end_devices) diff --git a/test/cim/iec61970/base/core/test_identified_object.py b/test/cim/iec61970/base/core/test_identified_object.py index dd0116bbb..7dabe5443 100644 --- a/test/cim/iec61970/base/core/test_identified_object.py +++ b/test/cim/iec61970/base/core/test_identified_object.py @@ -36,8 +36,8 @@ def verify_identified_object_constructor_default(io: IdentifiedObject): assert io.mrid - assert io.name == "" - assert io.description == "" + assert io.name is None + assert io.description is None assert not list(io.names) diff --git a/test/cim/iec61970/base/core/test_name_type.py b/test/cim/iec61970/base/core/test_name_type.py index bb3e9fcf3..c464e110f 100644 --- a/test/cim/iec61970/base/core/test_name_type.py +++ b/test/cim/iec61970/base/core/test_name_type.py @@ -25,7 +25,7 @@ def test_name_type_constructor_default(): nt = NameType("nt") assert nt.name == "nt" - assert not nt.description + assert nt.description is None assert not list(nt.names) diff --git a/test/cim/iec61970/base/core/test_power_system_resource.py b/test/cim/iec61970/base/core/test_power_system_resource.py index ed2579b76..3e0a23f1e 100644 --- a/test/cim/iec61970/base/core/test_power_system_resource.py +++ b/test/cim/iec61970/base/core/test_power_system_resource.py @@ -26,7 +26,7 @@ def verify_power_system_resource_constructor_default(psr: PowerSystemResource): verify_identified_object_constructor_default(psr) assert psr.location is None assert psr.asset_info is None - assert psr.num_controls == 0 + assert psr.num_controls is None assert not list(psr.assets) diff --git a/test/cim/iec61970/base/meas/test_analog.py b/test/cim/iec61970/base/meas/test_analog.py index d40e5493f..54f0bef28 100644 --- a/test/cim/iec61970/base/meas/test_analog.py +++ b/test/cim/iec61970/base/meas/test_analog.py @@ -13,7 +13,10 @@ def test_analog_constructor_default(): - verify_measurement_constructor_default(Analog()) + analog = Analog() + verify_measurement_constructor_default(analog) + + assert analog.positive_flow_in is None @given(**analog_kwargs) diff --git a/test/cim/iec61970/base/wires/test_energy_consumer.py b/test/cim/iec61970/base/wires/test_energy_consumer.py index 02cd38c3a..5eb9029b1 100644 --- a/test/cim/iec61970/base/wires/test_energy_consumer.py +++ b/test/cim/iec61970/base/wires/test_energy_consumer.py @@ -33,7 +33,7 @@ def test_energy_consumer_constructor_default(): verify_energy_connection_constructor_default(ec) assert not list(ec.phases) assert ec.customer_count is None - assert not ec.grounded + assert ec.grounded is None assert ec.phase_connection == PhaseShuntConnectionKind.D assert ec.p is None assert ec.p_fixed is None diff --git a/test/cim/iec61970/base/wires/test_energy_source.py b/test/cim/iec61970/base/wires/test_energy_source.py index 02d48b979..48bca2e02 100644 --- a/test/cim/iec61970/base/wires/test_energy_source.py +++ b/test/cim/iec61970/base/wires/test_energy_source.py @@ -62,7 +62,7 @@ def test_energy_source_constructor_default(): assert es.x is None assert es.x0 is None assert es.xn is None - assert es.is_external_grid is False + assert es.is_external_grid is None assert es.r_min is None assert es.rn_min is None assert es.r0_min is None diff --git a/test/cim/iec61970/base/wires/test_regulating_cond_eq.py b/test/cim/iec61970/base/wires/test_regulating_cond_eq.py index b1ac27993..9a302a08f 100644 --- a/test/cim/iec61970/base/wires/test_regulating_cond_eq.py +++ b/test/cim/iec61970/base/wires/test_regulating_cond_eq.py @@ -20,7 +20,7 @@ def verify_regulating_cond_eq_constructor_default(rce: RegulatingCondEq): verify_energy_connection_constructor_default(rce) - assert rce.control_enabled + assert rce.control_enabled is None assert rce.regulating_control is None diff --git a/test/cim/iec61970/base/wires/test_shunt_compensator.py b/test/cim/iec61970/base/wires/test_shunt_compensator.py index 6efd654c2..5418809b0 100644 --- a/test/cim/iec61970/base/wires/test_shunt_compensator.py +++ b/test/cim/iec61970/base/wires/test_shunt_compensator.py @@ -24,7 +24,7 @@ def verify_shunt_compensator_constructor_default(sc: ShuntCompensator): verify_regulating_cond_eq_constructor_default(sc) - assert not sc.grounded + assert sc.grounded is None assert sc.nom_u is None assert sc.phase_connection == PhaseShuntConnectionKind.UNKNOWN assert sc.sections is None diff --git a/test/cim/iec61970/base/wires/test_tap_changer.py b/test/cim/iec61970/base/wires/test_tap_changer.py index bccc01de2..5c41d6247 100644 --- a/test/cim/iec61970/base/wires/test_tap_changer.py +++ b/test/cim/iec61970/base/wires/test_tap_changer.py @@ -31,7 +31,7 @@ def verify_tap_changer_constructor_default(tc: TapChanger): verify_power_system_resource_constructor_default(tc) - assert tc.control_enabled + assert tc.control_enabled is None assert tc.neutral_u is None assert tc.high_step is None assert tc.low_step is None diff --git a/test/cim/iec61970/base/wires/test_transformer_end.py b/test/cim/iec61970/base/wires/test_transformer_end.py index 529bda757..5d8c0524f 100644 --- a/test/cim/iec61970/base/wires/test_transformer_end.py +++ b/test/cim/iec61970/base/wires/test_transformer_end.py @@ -29,7 +29,7 @@ def verify_transformer_end_constructor_default(te: TransformerEnd): verify_identified_object_constructor_default(te) - assert not te.grounded + assert te.grounded is None assert te.r_ground is None assert te.x_ground is None assert not te.ratio_tap_changer diff --git a/test/services/network/tracing/phases/test_phase_inferrer.py b/test/services/network/tracing/phases/test_phase_inferrer.py index f7d4a58d9..8c9ee1a5a 100644 --- a/test/services/network/tracing/phases/test_phase_inferrer.py +++ b/test/services/network/tracing/phases/test_phase_inferrer.py @@ -496,12 +496,12 @@ def _validate_log(self, caplog, correct: Optional[List[str]] = None, suspect: Op @staticmethod def _correct_message(mrid: str) -> str: - return f"*** Action Required *** Inferred missing phase for '' [{mrid}] which should be correct. The phase was inferred due to a disconnected " \ + return f"*** Action Required *** Inferred missing phase for 'AcLineSegment{{{mrid}}}' which should be correct. The phase was inferred due to a disconnected " \ f"nominal phase because of an upstream error in the source data. Phasing information for the upstream equipment should be fixed in the " \ f"source system." @staticmethod def _suspect_message(mrid: str) -> str: - return f"*** Action Required *** Inferred missing phases for '' [{mrid}] which may not be correct. The phases were inferred due to a disconnected " \ + return f"*** Action Required *** Inferred missing phases for 'AcLineSegment{{{mrid}}}' which may not be correct. The phases were inferred due to a disconnected " \ f"nominal phase because of an upstream error in the source data. Phasing information for the upstream equipment should be fixed in the " \ f"source system." diff --git a/test/streaming/get/pb_creators.py b/test/streaming/get/pb_creators.py index 4bf01268c..a245080bb 100644 --- a/test/streaming/get/pb_creators.py +++ b/test/streaming/get/pb_creators.py @@ -852,7 +852,7 @@ def identified_object(): PBIdentifiedObject, mRID=uuids(version=4).map(lambda x: str(x)), nameSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), - descriptionSet=text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE) + descriptionSet=text(alphabet=ALPHANUM, min_size=1, max_size=TEXT_MAX_SIZE) ) @@ -1409,11 +1409,11 @@ def rotating_machine(): return builds( PBRotatingMachine, rce=regulating_cond_eq(), - ratedPowerFactorSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ratedSSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ratedUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - pSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - qSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)) + ratedPowerFactorSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedSSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ratedUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + pSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + qSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -1467,25 +1467,25 @@ def synchronous_machine(): return builds( PBSynchronousMachine, rm=rotating_machine(), - baseQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - condenserPSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), + baseQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + condenserPSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), earthingSet=booleans(), - earthingStarPointRSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - earthingStarPointXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - ikkSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - maxQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - maxUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - minQSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - minUSet=one_of(none(), integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER)), - muSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - rSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - r0Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - r2Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectSubtransXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectSyncXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - satDirectTransXSet=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - x0Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), - x2Set=one_of(none(), floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX)), + earthingStarPointRSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + earthingStarPointXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + ikkSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + maxQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + maxUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + minQSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + minUSet=integers(min_value=MIN_32_BIT_INTEGER, max_value=MAX_32_BIT_INTEGER), + muSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + rSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + r2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + satDirectSubtransXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + satDirectSyncXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + satDirectTransXSet=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x0Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), + x2Set=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), type=sampled_from(PBSynchronousMachineKind.values()), operatingMode=sampled_from(PBSynchronousMachineKind.values()), reactiveCapabilityCurveMRIDs=one_of(none(), text(text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE))), diff --git a/test/streaming/get/test_network_consumer.py b/test/streaming/get/test_network_consumer.py index c90108ddc..900acda68 100644 --- a/test/streaming/get/test_network_consumer.py +++ b/test/streaming/get/test_network_consumer.py @@ -62,7 +62,7 @@ def test_constructor(self): @pytest.mark.asyncio @given(network_identified_objects()) - @settings(max_examples=1, phases=(Phase.explicit, Phase.reuse, Phase.generate)) + @settings(max_examples=1, phases=(Phase.explicit, Phase.reuse, Phase.generate), derandomize=True) async def test_get_identified_objects_supported_types(self, nios): requested = [] for nio in nios: From 67323257af38a11ca1be214850fcad94cdc1ce84 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Wed, 27 Aug 2025 16:10:11 +1000 Subject: [PATCH 3/7] drop 3.9 Signed-off-by: Max Chesterfield --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8e4b659fb..c3dfd0146 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ description = "Python SDK for interacting with the Energy Workbench platform" readme = {file = "README.md", content-type = "text/markdown"} license = "MPL-2.0" - requires-python = '>=3.9,<3.13' + requires-python = '>=3.10,<3.13' authors = [ {name = "Kurt Greaves", email = "kurt.greaves@zepben.com"}, {name = "Max Chesterfield", email = "max.chesterfield@zepben.com"} @@ -32,7 +32,6 @@ ] classifiers = [ "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", From dd82567d9578fd6114b656737c241a64efffcd02 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Wed, 27 Aug 2025 17:33:30 +1000 Subject: [PATCH 4/7] bump protobuf dep to 1.0 added changelog entry Signed-off-by: Max Chesterfield --- changelog.md | 21 +++++++++++++++++++++ pyproject.toml | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 68308cff8..f05249969 100644 --- a/changelog.md +++ b/changelog.md @@ -88,6 +88,27 @@ * The `zepben.auth` dependency has been incorporated into the SDK with the following package change: * `zepben.auth` -> `zepben.ewb.auth`. You can also import these directly from `zepben.ewb`. * `SqliteTable` now subclasses `SqlTable`. +* The following CIM fields have been made nullable. Note if previously accessing these fields you will now have to handle them potentially being null. + * `Analog.positiveFlowIn` + * `Document.*` + * `EnergyConsumer.grounded` + * `EnergySource.isExternalGrid` + * `IdentifiedObject.name` + * `IdentifiedObject.description` + * `IdentifiedObject.numDiagramObjects` + * `Meter.companyMeterId` + * `NameType.description` + * `Pole.classification` + * `PowerSystemResource.numControls` + * `RegulatingCondEq.controlEnabled` + * `ShuntCompensator.grounded` + * `StreetAddress.postalCode` + * `StreetAddress.poBox` + * `StreetDetail.*` + * `SynchronousMachine.earthing` + * `TapChanger.controlEnabled` + * `TransformerEnd.grounded` + * `UsagePoint.isVirtual` ### New Features * Created a new `SqlTable` that doesn't support creating schema creation statements by default. diff --git a/pyproject.toml b/pyproject.toml index c3dfd0146..f69c6ffb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ {name = "Max Chesterfield", email = "max.chesterfield@zepben.com"} ] dependencies = [ - "zepben.protobuf==1.0.0b1", + "zepben.protobuf==1.0.0", "typing_extensions==4.12.2", "requests>=2.26.0, <3.0.0", "urllib3>=1.26.6, <1.27.0", From 1777db6bdcc4b83deaae98089e811da1ad47d120 Mon Sep 17 00:00:00 2001 From: Kurt Greaves Date: Wed, 27 Aug 2025 21:26:46 +1000 Subject: [PATCH 5/7] A bunch of fixes Signed-off-by: Kurt Greaves --- .../cim/iec61968/common/street_detail.py | 2 +- .../ewb/model/cim/iec61968/metering/meter.py | 2 +- .../iec61970/base/core/identified_object.py | 7 +++--- .../base/wires/transformer_star_impedance.py | 8 +++--- .../common/translator/base_cim2proto.py | 2 -- .../network/translator/network_cim2proto.py | 25 +++++++++---------- .../network/translator/network_proto2cim.py | 6 ++--- 7 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/zepben/ewb/model/cim/iec61968/common/street_detail.py b/src/zepben/ewb/model/cim/iec61968/common/street_detail.py index 048fe805b..aa2b4aa8f 100644 --- a/src/zepben/ewb/model/cim/iec61968/common/street_detail.py +++ b/src/zepben/ewb/model/cim/iec61968/common/street_detail.py @@ -15,7 +15,7 @@ class StreetDetail(object): Street details, in the context of address. """ - building_name: str = None + building_name: Optional[str] = None """ (if applicable) In certain cases the physical location of the place of interest does not have a direct point of entry from the street, but may be located inside a larger structure such as a building, complex, office block, apartment, etc. diff --git a/src/zepben/ewb/model/cim/iec61968/metering/meter.py b/src/zepben/ewb/model/cim/iec61968/metering/meter.py index 989668670..228c53cb3 100644 --- a/src/zepben/ewb/model/cim/iec61968/metering/meter.py +++ b/src/zepben/ewb/model/cim/iec61968/metering/meter.py @@ -21,7 +21,7 @@ def company_meter_id(self) -> Optional[str]: return self.name @company_meter_id.setter - def company_meter_id(self, meter_id: str): + def company_meter_id(self, meter_id: Optional[str]): """ `meter_id` The ID to set for this Meter. Will use `IdentifiedObject.name` as a backing field. """ diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py index 6b0e75210..4010d8c63 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/identified_object.py @@ -51,11 +51,10 @@ def __init__(self, names: Optional[List[Name]] = None, **kwargs): self.add_name(name.type, name.name) def __str__(self): - str = f'{self.__class__.__name__}' + class_name = f'{self.__class__.__name__}' if self.name: - return f'{str}{{{self.mrid}|{self.name}}}' - return f'{str}{{{self.mrid}}}' - return f'{self.__class__.__name__}{{{self.mrid}{f"|{self.name}" if self.name else ""}}}' + return f'{class_name}{{{self.mrid}|{self.name}}}' + return f'{class_name}{{{self.mrid}}}' @property def names(self) -> Generator[Name, None, None]: diff --git a/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py b/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py index 406cd25ad..7f7f22a11 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +++ b/src/zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py @@ -21,16 +21,16 @@ class TransformerStarImpedance(IdentifiedObject): For transmission networks use PowerTransformerEnd impedances (r, r0, x, x0, b, b0, g and g0). """ - r: Optional[float] = 0.0 + r: Optional[float] = None """ r : Resistance of the transformer end. Unit: Ohms """ - r0: Optional[float] = 0.0 + r0: Optional[float] = None """ r0 : Zero sequence series resistance of the transformer end. Unit: Ohms""" - x: Optional[float] = 0.0 + x: Optional[float] = None """ x : Positive sequence series reactance of the transformer end. Unit: Ohms""" - x0: Optional[float] = 0.0 + x0: Optional[float] = None """ x0 : Zero sequence series reactance of the transformer end. Unit: Ohms""" transformer_end_info: Optional['TransformerEndInfo'] = None diff --git a/src/zepben/ewb/services/common/translator/base_cim2proto.py b/src/zepben/ewb/services/common/translator/base_cim2proto.py index 341e6f555..b8ce9a0bc 100644 --- a/src/zepben/ewb/services/common/translator/base_cim2proto.py +++ b/src/zepben/ewb/services/common/translator/base_cim2proto.py @@ -41,8 +41,6 @@ def bind_to_pb(func: Callable[P, R]) -> Callable[P, R]: def set_or_null(**kwargs): - if 'invWattRespPAtV1' in kwargs.keys(): - print('yo') return {f'{k}{"Null" if v is None else "Set"}': v if v is not None else NullValue.NULL_VALUE for k, v in kwargs.items()} diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py index bc0035a6c..8b9d3815b 100644 --- a/src/zepben/ewb/services/network/translator/network_cim2proto.py +++ b/src/zepben/ewb/services/network/translator/network_cim2proto.py @@ -595,7 +595,7 @@ def transformer_end_info_to_pb(cim: TransformerEndInfo) -> PBTransformerEndInfo: return PBTransformerEndInfo( ai=asset_info_to_pb(cim), connectionKind=_map_winding_connection.to_pb(cim.connection_kind), - endNumber=from_nullable_int(cim.end_number), + endNumber=cim.end_number, transformerTankInfoMRID=mrid_or_empty(cim.transformer_tank_info), transformerStarImpedanceMRID=mrid_or_empty(cim.transformer_star_impedance), energisedEndNoLoadTestsMRID=mrid_or_empty(cim.energised_end_no_load_tests), @@ -966,12 +966,13 @@ def curve_to_pb(cim: Curve) -> PBCurve: def curve_data_to_pb(cim: CurveData) -> PBCurveData: - return PBCurveData(**set_or_null( + return PBCurveData( xValue=cim.x_value, y1Value=cim.y1_value, - y2Value=from_nullable_float(cim.y2_value), - y3Value=from_nullable_float(cim.y3_value) - ) + **set_or_null( + y2Value=from_nullable_float(cim.y2_value), + y3Value=from_nullable_float(cim.y3_value) + ) ) @@ -1832,10 +1833,8 @@ def transformer_end_to_pb(cim: TransformerEnd) -> PBTransformerEnd: def transformer_end_rated_s_to_pb(cim: TransformerEndRatedS) -> PBTransformerEndRatedS: return PBTransformerEndRatedS( - coolingType=_map_transformer_cooling_type.to_pb(cim.cooling_type) - **set_or_null( - ratedS=cim.rated_s, - ) + coolingType=_map_transformer_cooling_type.to_pb(cim.cooling_type), + ratedS=cim.rated_s, ) @@ -1845,10 +1844,10 @@ def transformer_star_impedance_to_pb(cim: TransformerStarImpedance) -> PBTransfo io=identified_object_to_pb(cim), transformerEndInfoMRID=mrid_or_empty(cim.transformer_end_info), **set_or_null( - r=cim.r if cim.r else 0.0, - r0=cim.r0 if cim.r0 else 0.0, - x=cim.x if cim.x else 0.0, - x0=cim.x0 if cim.x0 else 0.0, + r=cim.r, + r0=cim.r0, + x=cim.x, + x0=cim.x0 ) ) diff --git a/src/zepben/ewb/services/network/translator/network_proto2cim.py b/src/zepben/ewb/services/network/translator/network_proto2cim.py index 054fda5ae..fe2f2d82d 100644 --- a/src/zepben/ewb/services/network/translator/network_proto2cim.py +++ b/src/zepben/ewb/services/network/translator/network_proto2cim.py @@ -1119,8 +1119,8 @@ def curve_to_cim(pb: PBCurve, cim: Curve, network_service: NetworkService): def curve_data_to_cim(pb: PBCurveData) -> Optional[CurveData]: return CurveData( - get_nullable(pb, 'xValue'), - get_nullable(pb, 'y1Value'), + pb.xValue, + pb.y1Value, get_nullable(pb, 'y2Value'), get_nullable(pb, 'y3Value'), ) @@ -2160,7 +2160,7 @@ def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_se def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[TransformerEndRatedS]: - return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=get_nullable(pb, 'ratedS')) + return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=pb.ratedS) @bind_to_cim From 6906cb90990fd3c2c7e8a92cff331c42d2d200b1 Mon Sep 17 00:00:00 2001 From: Kurt Greaves Date: Wed, 27 Aug 2025 23:06:38 +1000 Subject: [PATCH 6/7] Fix bug in database writer... Signed-off-by: Kurt Greaves --- src/zepben/ewb/database/sqlite/common/base_database_writer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zepben/ewb/database/sqlite/common/base_database_writer.py b/src/zepben/ewb/database/sqlite/common/base_database_writer.py index ea2f7ec97..50ab58f43 100644 --- a/src/zepben/ewb/database/sqlite/common/base_database_writer.py +++ b/src/zepben/ewb/database/sqlite/common/base_database_writer.py @@ -11,7 +11,7 @@ from contextlib import closing from pathlib import Path from sqlite3 import Connection, Cursor, OperationalError -from typing import Callable, Union +from typing import Callable, Union, Optional from zepben.ewb.database.sqlite.common.base_database_tables import BaseDatabaseTables from zepben.ewb.database.sqlite.common.base_service_writer import BaseServiceWriter @@ -66,7 +66,7 @@ def __init__( Provider of the connection to the specified database. """ - self._save_connection: Connection + self._save_connection: Optional[Connection] = None self._has_been_used: bool = False def save(self) -> bool: From 375ab69da5ad076422315cd3df80f9b81cac2028 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Thu, 28 Aug 2025 17:12:29 +1000 Subject: [PATCH 7/7] fixed tests, forced populating of every "list". also dropped test data to 32bit floats. Signed-off-by: Max Chesterfield --- .../ewb/model/cim/iec61970/base/core/curve.py | 3 ++- .../network/translator/network_cim2proto.py | 4 ++-- test/cim/cim_creators.py | 13 +++++++------ .../wires/test_transformer_star_impedance.py | 8 ++++---- .../translator/test_network_translator.py | 2 +- test/streaming/get/pb_creators.py | 18 +++++++++++++----- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/zepben/ewb/model/cim/iec61970/base/core/curve.py b/src/zepben/ewb/model/cim/iec61970/base/core/curve.py index 07ef1b24a..df44fe41f 100644 --- a/src/zepben/ewb/model/cim/iec61970/base/core/curve.py +++ b/src/zepben/ewb/model/cim/iec61970/base/core/curve.py @@ -76,7 +76,8 @@ def add_data(self, x: float, y1: float, y2: Optional[float], y3: Optional[float] require(all([it.x_value != x for it in self.data]), lambda: f"Unable to add datapoint to {self}. x_value {x} is invalid, as data with same x_value already exist in this Curve.") - self._data = self._data or [] + if self._data is None: + self._data = [] self._data.append(CurveData(x, y1, y2, y3)) self._data.sort(key=lambda it: it.x_value) diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py index 8b9d3815b..78fefab1e 100644 --- a/src/zepben/ewb/services/network/translator/network_cim2proto.py +++ b/src/zepben/ewb/services/network/translator/network_cim2proto.py @@ -970,8 +970,8 @@ def curve_data_to_pb(cim: CurveData) -> PBCurveData: xValue=cim.x_value, y1Value=cim.y1_value, **set_or_null( - y2Value=from_nullable_float(cim.y2_value), - y3Value=from_nullable_float(cim.y3_value) + y2Value=cim.y2_value, + y3Value=cim.y3_value ) ) diff --git a/test/cim/cim_creators.py b/test/cim/cim_creators.py index 6e7e7a508..559551b71 100644 --- a/test/cim/cim_creators.py +++ b/test/cim/cim_creators.py @@ -45,12 +45,13 @@ from datetime import datetime from random import choice +from streaming.get.pb_creators import lists, floats # @formatter:off # This must be above hypothesis.strategies to avoid conflicting import with zepben.ewb.util.none from zepben.ewb import * -from hypothesis.strategies import builds, text, integers, sampled_from, lists, floats, booleans, uuids, datetimes, one_of, none +from hypothesis.strategies import builds, text, integers, sampled_from, booleans, uuids, datetimes, one_of, none # @formatter:on @@ -632,7 +633,7 @@ def create_ratio(): return builds( Ratio, numerator=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX), - denominator=floats(min_value=0.1, max_value=FLOAT_MAX) + denominator=floats(min_value=FLOAT_MIN, max_value=FLOAT_MAX) ) @@ -857,7 +858,7 @@ def create_identified_object(include_runtime: bool): "mrid": uuids(version=4).map(lambda x: str(x)), "name": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), "description": one_of(none(), text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE)), - "names": lists(builds(Name, text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), create_name_type()), max_size=2, unique_by=lambda it: it.name) + "names": one_of(none(), lists(builds(Name, text(alphabet=ALPHANUM, max_size=TEXT_MAX_SIZE), create_name_type()), max_size=2, unique_by=lambda it: it.name)) } @@ -1466,16 +1467,16 @@ def create_power_electronics_connection(include_runtime: bool = True): inv_watt_resp_p_at_v1=floats(min_value=0.0, max_value=1.0), inv_watt_resp_p_at_v2=floats(min_value=0.0, max_value=1.0), inv_watt_resp_p_at_v3=floats(min_value=0.0, max_value=1.0), - inv_watt_resp_p_at_v4=floats(min_value=0.0, max_value=0.2), + inv_watt_resp_p_at_v4=floats(min_value=0.0, max_value=0.12300000339746475), inv_volt_var_resp_mode=boolean_or_none(), inv_var_resp_v1=integers(min_value=200, max_value=300), inv_var_resp_v2=integers(min_value=200, max_value=300), inv_var_resp_v3=integers(min_value=200, max_value=300), inv_var_resp_v4=integers(min_value=200, max_value=300), - inv_var_resp_q_at_v1=floats(min_value=0.0, max_value=0.6), + inv_var_resp_q_at_v1=floats(min_value=0.0, max_value=0.5120000243186951), inv_var_resp_q_at_v2=floats(min_value=-1.0, max_value=1.0), inv_var_resp_q_at_v3=floats(min_value=-1.0, max_value=1.0), - inv_var_resp_q_at_v4=floats(min_value=-0.6, max_value=0.0), + inv_var_resp_q_at_v4=floats(min_value=-0.5120000243186951, max_value=0.0), inv_reactive_power_mode=boolean_or_none(), inv_fix_reactive_power=floats(min_value=-1.0, max_value=1.0), ) diff --git a/test/cim/iec61970/base/wires/test_transformer_star_impedance.py b/test/cim/iec61970/base/wires/test_transformer_star_impedance.py index 2e752920a..a2514c920 100644 --- a/test/cim/iec61970/base/wires/test_transformer_star_impedance.py +++ b/test/cim/iec61970/base/wires/test_transformer_star_impedance.py @@ -26,10 +26,10 @@ def test_transformer_star_impedance_constructor_default(): tsi = TransformerStarImpedance() verify_identified_object_constructor_default(tsi) - assert tsi.r == 0.0 - assert tsi.r0 == 0.0 - assert tsi.x == 0.0 - assert tsi.x0 == 0.0 + assert tsi.r is None + assert tsi.r0 is None + assert tsi.x is None + assert tsi.x0 is None assert not tsi.transformer_end_info diff --git a/test/services/network/translator/test_network_translator.py b/test/services/network/translator/test_network_translator.py index fa4a884e4..b23812eb9 100644 --- a/test/services/network/translator/test_network_translator.py +++ b/test/services/network/translator/test_network_translator.py @@ -228,7 +228,7 @@ @pytest.mark.timeout(100000) @given(**types_to_test) -@settings(suppress_health_check=[HealthCheck.too_slow, HealthCheck.large_base_example]) +@settings(suppress_health_check=[HealthCheck.too_slow, HealthCheck.large_base_example, HealthCheck.data_too_large]) def test_network_service_translations(**kwargs): # # NOTE: To prevent the `assume` required for the location from making this test take way too long, it has been separated out. diff --git a/test/streaming/get/pb_creators.py b/test/streaming/get/pb_creators.py index a245080bb..905a79fbe 100644 --- a/test/streaming/get/pb_creators.py +++ b/test/streaming/get/pb_creators.py @@ -16,7 +16,7 @@ from google.protobuf.struct_pb2 import NullValue # noinspection PyPackageRequirements,PyUnresolvedReferences from google.protobuf.timestamp_pb2 import Timestamp -from hypothesis.strategies import builds, text, integers, sampled_from, lists, floats, booleans, composite, uuids, one_of, none +from hypothesis.strategies import builds, text, integers, sampled_from, lists as hypo_lists, floats as hypo_floats, booleans, composite, uuids, one_of, none from zepben.protobuf.cc.cc_data_pb2 import CustomerIdentifiedObject from zepben.protobuf.cim.extensions.iec61968.assetinfo.RelayInfo_pb2 import RelayInfo as PBRelayInfo from zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction_pb2 import PanDemandResponseFunction as PBPanDemandResponseFunction @@ -205,6 +205,14 @@ # Extensions IEC61968 Asset Info # ################################## +def floats(*args, **kwargs): + kwargs.update({"width": 32}) + return hypo_floats(*args, **kwargs) + +def lists(*args, **kwargs): + kwargs.update({"min_size": 1}) + return hypo_lists(*args, **kwargs) + def relay_info(): return builds( PBRelayInfo, @@ -692,7 +700,7 @@ def pole(): ################################## def ratio(): - return builds(PBRatio, denominator=floats(min_value=0.1, max_value=1000.0), numerator=floats(min_value=0.0, max_value=1000.0)) + return builds(PBRatio, denominator=floats(min_value=0.10000000149011612, max_value=1000.0), numerator=floats(min_value=0.0, max_value=1000.0)) ##################### @@ -1294,16 +1302,16 @@ def power_electronics_connection(): invWattRespPAtV1Set=floats(min_value=0.0, max_value=1.0), invWattRespPAtV2Set=floats(min_value=0.0, max_value=1.0), invWattRespPAtV3Set=floats(min_value=0.0, max_value=1.0), - invWattRespPAtV4Set=floats(min_value=0.0, max_value=0.2), + invWattRespPAtV4Set=floats(min_value=0.0, max_value=0.20000000298023224), **nullable_bool_settings("invVoltVarRespMode"), invVarRespV1Set=integers(min_value=200, max_value=300), invVarRespV2Set=integers(min_value=200, max_value=300), invVarRespV3Set=integers(min_value=200, max_value=300), invVarRespV4Set=integers(min_value=200, max_value=300), - invVarRespQAtV1Set=floats(min_value=0.0, max_value=0.6), + invVarRespQAtV1Set=floats(min_value=0.0, max_value=0.6000000238418579), invVarRespQAtV2Set=floats(min_value=-1.0, max_value=1.0), invVarRespQAtV3Set=floats(min_value=-1.0, max_value=1.0), - invVarRespQAtV4Set=floats(min_value=-0.6, max_value=0.0), + invVarRespQAtV4Set=floats(min_value=-0.6000000238418579, max_value=0.0), **nullable_bool_settings("invReactivePowerMode"), invFixReactivePowerSet=floats(min_value=-1.0, max_value=1.0), )