From 048c317e68f02762b9d81409e834545b73437aeb Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Tue, 12 Aug 2025 03:56:47 +1000 Subject: [PATCH 1/4] :shrug: Signed-off-by: Max Chesterfield --- .../common/translator/base_proto2cim.py | 51 +- .../ewb/services/common/translator/util.py | 9 +- .../network/translator/network_proto2cim.py | 485 ++++++++++-------- 3 files changed, 303 insertions(+), 242 deletions(-) diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index 19b095911..156597120 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -3,11 +3,18 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. -__all__ = ["identified_object_to_cim", "document_to_cim", "organisation_to_cim", "organisation_role_to_cim", "BaseProtoToCim"] +from __future__ import annotations +__all__ = ["identified_object_to_cim", "document_to_cim", "organisation_to_cim", "organisation_role_to_cim", + "BaseProtoToCim", "with_network_service", "bind_to_cim"] + +import functools +import inspect from abc import ABCMeta -from typing import Optional +from typing import Optional, Callable, TypeVar +from google.protobuf.message import Message +from typing_extensions import ParamSpec # noinspection PyPackageRequirements from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument from zepben.protobuf.cim.iec61968.common.OrganisationRole_pb2 import OrganisationRole as PBOrganisationRole @@ -23,10 +30,32 @@ from zepben.ewb.services.common.base_service import BaseService +TProtoToCimFunc = Callable[[Message, BaseService], Optional[IdentifiedObject]] +P = ParamSpec("P") +R = TypeVar("R") + + +def with_network_service(func: TProtoToCimFunc) -> TProtoToCimFunc: + @functools.wraps(func) + def wrapper(pb: Message, service: BaseService) -> Optional[IdentifiedObject]: + return cim if service.add(cim := func(pb, service)) else None + return wrapper + + +def bind_to_cim(func: Callable[P, R]) -> Callable[P, R]: + """ + Get the object described in the type hint of the first argument of the function we are wrapping + set that object's `to_cim` function to be the function we are wrapping + """ + inspect.get_annotations(func, eval_str=True)[func.__code__.co_varnames[0]].to_cim = func + return func + + ################### # IEC61968 Common # ################### +@bind_to_cim def document_to_cim(pb: PBDocument, cim: Document, service: BaseService): cim.title = pb.title cim.created_date_time = pb.createdDateTime.ToDatetime() if pb.HasField("createdDateTime") else None @@ -38,28 +67,27 @@ def document_to_cim(pb: PBDocument, cim: Document, service: BaseService): identified_object_to_cim(pb.io, cim, service) +@bind_to_cim +@with_network_service def organisation_to_cim(pb: PBOrganisation, service: BaseService) -> Optional[Organisation]: cim = Organisation() identified_object_to_cim(pb.io, cim, service) - return cim if service.add(cim) else None + return cim +@bind_to_cim def organisation_role_to_cim(pb: PBOrganisationRole, cim: OrganisationRole, service: BaseService): service.resolve_or_defer_reference(resolver.organisation(cim), pb.organisationMRID) identified_object_to_cim(pb.io, cim, service) -PBDocument.to_cim = document_to_cim -PBOrganisation.to_cim = organisation_to_cim -PBOrganisationRole.to_cim = organisation_role_to_cim - - ###################### # IEC61970 Base Core # ###################### +@bind_to_cim def identified_object_to_cim(pb: PBIdentifiedObject, cim: IdentifiedObject, service: BaseService): cim.mrid = pb.mRID cim.name = pb.name @@ -67,6 +95,7 @@ def identified_object_to_cim(pb: PBIdentifiedObject, cim: IdentifiedObject, serv [cim.add_name(name_to_cim(name, cim, service).type, name.name) for name in pb.names] +@bind_to_cim def name_to_cim(pb: PBName, io: IdentifiedObject, service: BaseService): try: nt = service.get_name_type(pb.type) @@ -78,6 +107,7 @@ def name_to_cim(pb: PBName, io: IdentifiedObject, service: BaseService): return nt.get_or_add_name(pb.name, io) +@bind_to_cim def name_type_to_cim(pb: PBNameType, service: BaseService): try: nt = service.get_name_type(pb.name) @@ -90,11 +120,6 @@ def name_type_to_cim(pb: PBNameType, service: BaseService): return nt -PBIdentifiedObject.to_cim = identified_object_to_cim -PBName.to_cim = name_to_cim -PBNameType.to_cim = name_type_to_cim - - @dataclass(slots=True) class BaseProtoToCim(object, metaclass=ABCMeta): service: BaseService diff --git a/src/zepben/ewb/services/common/translator/util.py b/src/zepben/ewb/services/common/translator/util.py index a2216883b..b17305e71 100644 --- a/src/zepben/ewb/services/common/translator/util.py +++ b/src/zepben/ewb/services/common/translator/util.py @@ -49,7 +49,7 @@ def long_or_none(value: int) -> Optional[int]: def str_or_none(value: str) -> Optional[str]: - return value if value else None + return value or None def from_nullable_int(value: Optional[int]) -> int: @@ -69,10 +69,7 @@ def from_nullable_long(value: Optional[int]) -> int: def nullable_bool_settings(flag_name: str, value: Optional[bool]) -> Dict: - settings = {} if value is None: - settings[f"{flag_name}Null"] = NullValue.NULL_VALUE + return {f'{flag_name}Null': NullValue.NULL_VALUE} else: - settings[f"{flag_name}Set"] = value - - return settings + return {f'{flag_name}Set': value} diff --git a/src/zepben/ewb/services/network/translator/network_proto2cim.py b/src/zepben/ewb/services/network/translator/network_proto2cim.py index eeb956358..f5e25e056 100644 --- a/src/zepben/ewb/services/network/translator/network_proto2cim.py +++ b/src/zepben/ewb/services/network/translator/network_proto2cim.py @@ -31,8 +31,10 @@ "static_var_compensator_to_cim", "clamp_to_cim", "cut_to_cim" ] -from typing import Optional +import functools +from typing import Optional, Callable +from google.protobuf.message import Message 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 from zepben.protobuf.cim.extensions.iec61970.base.core.Site_pb2 import Site as PBSite @@ -169,6 +171,7 @@ from zepben.protobuf.cim.iec61970.infiec61970.feeder.Circuit_pb2 import Circuit as PBCircuit import zepben.ewb.services.common.resolver as resolver +from zepben.ewb import IdentifiedObject from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import * from zepben.ewb.model.cim.extensions.iec61968.metering.pan_demand_reponse_function import PanDemandResponseFunction from zepben.ewb.model.cim.extensions.iec61970.base.core.site import * @@ -323,7 +326,8 @@ from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import * 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 +from zepben.ewb.services.common.translator.base_proto2cim import identified_object_to_cim, organisation_role_to_cim, document_to_cim, with_network_service, \ + bind_to_cim 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 @@ -333,6 +337,8 @@ # Extensions IEC61968 Asset Info # ################################## +@bind_to_cim +@with_network_service def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optional[RelayInfo]: # noinspection PyUnresolvedReferences cim = RelayInfo( @@ -343,16 +349,15 @@ def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optio ) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None - - -PBRelayInfo.to_cim = relay_info_to_cim + return cim ################################ # Extensions IEC61968 Metering # ################################ +@bind_to_cim +@with_network_service def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network_service: NetworkService) -> PanDemandResponseFunction: """ Convert the protobuf :class:`PBPanDemandResponseFunction` into its CIM counterpart. @@ -366,31 +371,29 @@ def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network cim.kind = EndDeviceFunctionKind(pb.kind) end_device_function_to_cim(pb.edf, cim, network_service) - return cim if network_service.add(cim) else None - - -PBPanDemandResponseFunction.to_cim = pan_demand_response_function_to_cim + return cim ################################# # Extensions IEC61970 Base Core # ################################# +@bind_to_cim +@with_network_service def site_to_cim(pb: PBSite, network_service: NetworkService) -> Optional[Site]: # noinspection PyUnresolvedReferences cim = Site(mrid=pb.mrid()) equipment_container_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None - - -PBSite.to_cim = site_to_cim + return cim ################################### # Extensions IEC61970 Base Feeder # ################################### +@bind_to_cim +@with_network_service def loop_to_cim(pb: PBLoop, network_service: NetworkService) -> Optional[Loop]: # noinspection PyUnresolvedReferences cim = Loop(mrid=pb.mrid()) @@ -403,9 +406,11 @@ def loop_to_cim(pb: PBLoop, network_service: NetworkService) -> Optional[Loop]: network_service.resolve_or_defer_reference(resolver.loop_energizing_substations(cim), mrid) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def lv_feeder_to_cim(pb: PBLvFeeder, network_service: NetworkService) -> Optional[LvFeeder]: # noinspection PyUnresolvedReferences cim = LvFeeder(mrid=pb.mrid()) @@ -417,31 +422,28 @@ def lv_feeder_to_cim(pb: PBLvFeeder, network_service: NetworkService) -> Optiona network_service.resolve_or_defer_reference(resolver.current_energizing_feeders(cim), mrid) equipment_container_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None - - -PBLoop.to_cim = loop_to_cim -PBLvFeeder.to_cim = lv_feeder_to_cim + return cim ################################################## # Extensions IEC61970 Base Generation Production # ################################################## +@bind_to_cim +@with_network_service def ev_charging_unit_to_cim(pb: PBEvChargingUnit, network_service: NetworkService) -> Optional[EvChargingUnit]: # noinspection PyUnresolvedReferences cim = EvChargingUnit(mrid=pb.mrid()) power_electronics_unit_to_cim(pb.peu, cim, network_service) - return cim if network_service.add(cim) else None - - -PBEvChargingUnit.to_cim = ev_charging_unit_to_cim + return cim ####################################### # Extensions IEC61970 Base Protection # ####################################### +@bind_to_cim +@with_network_service def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) -> Optional[DistanceRelay]: # noinspection PyUnresolvedReferences cim = DistanceRelay( @@ -458,7 +460,7 @@ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) ) protection_relay_function_to_cim(pb.prf, cim, network_service) - return cim if network_service.add(cim) else None + return cim def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: ProtectionRelayFunction, network_service: NetworkService): @@ -484,6 +486,8 @@ def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: Protect power_system_resource_to_cim(pb.psr, cim, network_service) +@bind_to_cim +@with_network_service def protection_relay_scheme_to_cim(pb: PBProtectionRelayScheme, network_service: NetworkService) -> Optional[ProtectionRelayScheme]: # noinspection PyUnresolvedReferences cim = ProtectionRelayScheme( @@ -497,9 +501,11 @@ def protection_relay_scheme_to_cim(pb: PBProtectionRelayScheme, network_service: network_service.resolve_or_defer_reference(resolver.prscheme_function(cim), mrid) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def protection_relay_system_to_cim(pb: PBProtectionRelaySystem, network_service: NetworkService) -> Optional[ProtectionRelaySystem]: # noinspection PyUnresolvedReferences cim = ProtectionRelaySystem( @@ -511,7 +517,7 @@ def protection_relay_system_to_cim(pb: PBProtectionRelaySystem, network_service: network_service.resolve_or_defer_reference(resolver.prsystem_scheme(cim), mrid) equipment_to_cim(pb.eq, cim, network_service) - return cim if network_service.add(cim) else None + return cim def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]: @@ -522,24 +528,22 @@ def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]: ) +@bind_to_cim +@with_network_service def voltage_relay_to_cim(pb: PBVoltageRelay, network_service: NetworkService) -> Optional[VoltageRelay]: # noinspection PyUnresolvedReferences cim = VoltageRelay(mrid=pb.mrid()) protection_relay_function_to_cim(pb.prf, cim, network_service) - return cim if network_service.add(cim) else None - - -PBDistanceRelay.to_cim = distance_relay_to_cim -PBProtectionRelayScheme.to_cim = protection_relay_scheme_to_cim -PBProtectionRelaySystem.to_cim = protection_relay_system_to_cim -PBVoltageRelay.to_cim = voltage_relay_to_cim + return cim ################################## # Extensions IEC61970 Base Wires # ################################## +@bind_to_cim +@with_network_service def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService) -> BatteryControl: """ Convert the protobuf :class:`PBBatteryControl` into its CIM counterpart. @@ -558,10 +562,7 @@ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService regulating_control_to_cim(pb.rc, cim, network_service) - return cim if network_service.add(cim) else None - - -PBBatteryControl.to_cim = battery_control_to_cim + return cim ####################### @@ -569,14 +570,18 @@ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService ####################### +@bind_to_cim +@with_network_service def cable_info_to_cim(pb: PBCableInfo, network_service: NetworkService) -> Optional[CableInfo]: # noinspection PyUnresolvedReferences cim = CableInfo(mrid=pb.mrid()) wire_info_to_cim(pb.wi, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Optional[NoLoadTest]: # noinspection PyUnresolvedReferences cim = NoLoadTest( @@ -589,9 +594,11 @@ def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Op ) transformer_test_to_cim(pb.tt, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkService) -> Optional[OpenCircuitTest]: # noinspection PyUnresolvedReferences cim = OpenCircuitTest( @@ -604,17 +611,21 @@ def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkServ ) transformer_test_to_cim(pb.tt, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def overhead_wire_info_to_cim(pb: PBOverheadWireInfo, network_service: NetworkService) -> Optional[OverheadWireInfo]: # noinspection PyUnresolvedReferences cim = OverheadWireInfo(mrid=pb.mrid()) wire_info_to_cim(pb.wi, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def power_transformer_info_to_cim(pb: PBPowerTransformerInfo, network_service: NetworkService) -> Optional[PowerTransformerInfo]: # noinspection PyUnresolvedReferences cim = PowerTransformerInfo(mrid=pb.mrid()) @@ -623,9 +634,11 @@ def power_transformer_info_to_cim(pb: PBPowerTransformerInfo, network_service: N network_service.resolve_or_defer_reference(resolver.power_transformer_info_transformer_tank_info(cim), mrid) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkService) -> Optional[ShortCircuitTest]: # noinspection PyUnresolvedReferences cim = ShortCircuitTest( @@ -643,9 +656,11 @@ def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkSe ) transformer_test_to_cim(pb.tt, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: NetworkService) -> Optional[ShuntCompensatorInfo]: # noinspection PyUnresolvedReferences cim = ShuntCompensatorInfo( @@ -657,9 +672,11 @@ def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: N ) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Optional[SwitchInfo]: # noinspection PyUnresolvedReferences cim = SwitchInfo( @@ -668,9 +685,11 @@ def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Opt ) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: NetworkService) -> Optional[TransformerEndInfo]: # noinspection PyUnresolvedReferences cim = TransformerEndInfo( @@ -695,9 +714,11 @@ def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: Netwo network_service.resolve_or_defer_reference(resolver.energised_end_open_circuit_tests(cim), pb.energisedEndOpenCircuitTestsMRID) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def transformer_tank_info_to_cim(pb: PBTransformerTankInfo, network_service: NetworkService) -> Optional[TransformerTankInfo]: # noinspection PyUnresolvedReferences cim = TransformerTankInfo(mrid=pb.mrid()) @@ -706,7 +727,7 @@ def transformer_tank_info_to_cim(pb: PBTransformerTankInfo, network_service: Net network_service.resolve_or_defer_reference(resolver.transformer_end_info(cim), mrid) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim def transformer_test_to_cim(pb: PBTransformerTest, cim: TransformerTest, network_service: NetworkService): @@ -723,18 +744,6 @@ def wire_info_to_cim(pb: PBWireInfo, cim: WireInfo, network_service: NetworkServ asset_info_to_cim(pb.ai, cim, network_service) -PBCableInfo.to_cim = cable_info_to_cim -PBNoLoadTest.to_cim = no_load_test_to_cim -PBOpenCircuitTest.to_cim = open_circuit_test_to_cim -PBOverheadWireInfo.to_cim = overhead_wire_info_to_cim -PBPowerTransformerInfo.to_cim = power_transformer_info_to_cim -PBShortCircuitTest.to_cim = short_circuit_test_to_cim -PBShuntCompensatorInfo.to_cim = shunt_compensator_info_to_cim -PBSwitchInfo.to_cim = switch_info_to_cim -PBTransformerEndInfo.to_cim = transformer_end_info_to_cim -PBTransformerTankInfo.to_cim = transformer_tank_info_to_cim - - ################### # IEC61968 Assets # ################### @@ -775,14 +784,18 @@ def asset_organisation_role_to_cim(pb: PBAssetOrganisationRole, cim: AssetOrgani organisation_role_to_cim(getattr(pb, "or"), cim, network_service) +@bind_to_cim +@with_network_service def asset_owner_to_cim(pb: PBAssetOwner, network_service: NetworkService) -> Optional[AssetOwner]: # noinspection PyUnresolvedReferences cim = AssetOwner(mrid=pb.mrid()) asset_organisation_role_to_cim(pb.aor, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Optional[Streetlight]: # noinspection PyUnresolvedReferences cim = Streetlight( @@ -794,21 +807,19 @@ def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Op network_service.resolve_or_defer_reference(resolver.pole(cim), pb.poleMRID) asset_to_cim(pb.at, cim, network_service) - return cim if network_service.add(cim) else None + return cim def structure_to_cim(pb: PBStructure, cim: Structure, network_service: NetworkService): asset_container_to_cim(pb.ac, cim, network_service) -PBAssetOwner.to_cim = asset_owner_to_cim -PBStreetlight.to_cim = streetlight_to_cim - - ################### # IEC61968 Common # ################### +@bind_to_cim +@with_network_service def location_to_cim(pb: PBLocation, network_service: NetworkService) -> Optional[Location]: # noinspection PyUnresolvedReferences cim = Location(mrid=pb.mrid(), main_address=street_address_to_cim(pb.mainAddress) if pb.HasField("mainAddress") else None) @@ -817,7 +828,7 @@ def location_to_cim(pb: PBLocation, network_service: NetworkService) -> Optional cim.add_point(position_point_to_cim(point)) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim def position_point_to_cim(pb: PBPositionPoint) -> Optional[PositionPoint]: @@ -849,14 +860,12 @@ def town_detail_to_cim(pb: PBTownDetail) -> Optional[TownDetail]: return TownDetail(name=pb.name, state_or_province=pb.stateOrProvince) -PBLocation.to_cim = location_to_cim -PBPositionPoint.to_cim = position_point_to_cim - - ##################################### # IEC61968 InfIEC61968 InfAssetInfo # ##################################### +@bind_to_cim +@with_network_service def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_service: NetworkService) -> Optional[CurrentTransformerInfo]: # noinspection PyUnresolvedReferences cim = CurrentTransformerInfo( @@ -876,9 +885,11 @@ def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_servic ) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_service: NetworkService) -> Optional[PotentialTransformerInfo]: # noinspection PyUnresolvedReferences cim = PotentialTransformerInfo( @@ -892,17 +903,15 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se ) asset_info_to_cim(pb.ai, cim, network_service) - return cim if network_service.add(cim) else None - - -PBCurrentTransformerInfo.to_cim = current_transformer_info_to_cim -PBPotentialTransformerInfo.to_cim = potential_transformer_info_to_cim + return cim ################################## # IEC61968 InfIEC61968 InfAssets # ################################## +@bind_to_cim +@with_network_service def pole_to_cim(pb: PBPole, network_service: NetworkService) -> Optional[Pole]: # noinspection PyUnresolvedReferences cim = Pole(mrid=pb.mrid(), classification=pb.classification) @@ -911,23 +920,18 @@ def pole_to_cim(pb: PBPole, network_service: NetworkService) -> Optional[Pole]: network_service.resolve_or_defer_reference(resolver.streetlights(cim), mrid) structure_to_cim(pb.st, cim, network_service) - return cim if network_service.add(cim) else None - - -PBPole.to_cim = pole_to_cim + return cim ################################## # IEC61968 InfIEC61968 InfCommon # ################################## +@bind_to_cim def ratio_to_cim(pb: PBRatio) -> Ratio: return Ratio(pb.numerator, pb.denominator) -PBRatio.to_cim = ratio_to_cim - - ##################### # IEC61968 Metering # ##################### @@ -965,14 +969,18 @@ def end_device_function_to_cim(pb: PBEndDeviceFunction, cim: EndDeviceFunction, asset_function_to_cim(pb.af, cim, network_service) +@bind_to_cim +@with_network_service def meter_to_cim(pb: PBMeter, network_service: NetworkService) -> Optional[Meter]: # noinspection PyUnresolvedReferences cim = Meter(mrid=pb.mrid()) end_device_to_cim(pb.ed, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Optional[UsagePoint]: # noinspection PyUnresolvedReferences cim = UsagePoint(mrid=pb.mrid()) @@ -990,25 +998,20 @@ def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Opt network_service.resolve_or_defer_reference(resolver.end_devices(cim), mrid) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None - - -PBMeter.to_cim = meter_to_cim -PBUsagePoint.to_cim = usage_point_to_cim + return cim ####################### # IEC61968 Operations # ####################### +@bind_to_cim +@with_network_service def operational_restriction_to_cim(pb: PBOperationalRestriction, network_service: NetworkService) -> Optional[OperationalRestriction]: # noinspection PyUnresolvedReferences cim = OperationalRestriction(mrid=pb.mrid()) document_to_cim(pb.doc, cim, network_service) - return cim if network_service.add(cim) else None - - -PBOperationalRestriction.to_cim = operational_restriction_to_cim + return cim ##################################### @@ -1021,6 +1024,8 @@ def auxiliary_equipment_to_cim(pb: PBAuxiliaryEquipment, cim: AuxiliaryEquipment equipment_to_cim(pb.eq, cim, network_service) +@bind_to_cim +@with_network_service 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)) @@ -1029,17 +1034,21 @@ def current_transformer_to_cim(pb: PBCurrentTransformer, network_service: Networ network_service.resolve_or_defer_reference(resolver.current_transformer_info(cim), pb.asset_info_mrid()) sensor_to_cim(pb.sn, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def fault_indicator_to_cim(pb: PBFaultIndicator, network_service: NetworkService) -> Optional[FaultIndicator]: # noinspection PyUnresolvedReferences cim = FaultIndicator(mrid=pb.mrid()) auxiliary_equipment_to_cim(pb.ae, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def potential_transformer_to_cim(pb: PBPotentialTransformer, network_service: NetworkService) -> Optional[PotentialTransformer]: # noinspection PyUnresolvedReferences cim = PotentialTransformer(mrid=pb.mrid(), type=PotentialTransformerKind(pb.type)) @@ -1048,7 +1057,7 @@ def potential_transformer_to_cim(pb: PBPotentialTransformer, network_service: Ne network_service.resolve_or_defer_reference(resolver.potential_transformer_info(cim), pb.asset_info_mrid()) sensor_to_cim(pb.sn, cim, network_service) - return cim if network_service.add(cim) else None + return cim def sensor_to_cim(pb: PBSensor, cim: Sensor, network_service: NetworkService): @@ -1057,11 +1066,6 @@ def sensor_to_cim(pb: PBSensor, cim: Sensor, network_service: NetworkService): auxiliary_equipment_to_cim(pb.ae, cim, network_service) -PBCurrentTransformer.to_cim = current_transformer_to_cim -PBFaultIndicator.to_cim = fault_indicator_to_cim -PBPotentialTransformer.to_cim = potential_transformer_to_cim - - ###################### # IEC61970 Base Core # ###################### @@ -1070,12 +1074,14 @@ def ac_dc_terminal_to_cim(pb: PBAcDcTerminal, cim: AcDcTerminal, network_service identified_object_to_cim(pb.io, cim, network_service) +@bind_to_cim +@with_network_service def base_voltage_to_cim(pb: PBBaseVoltage, network_service: NetworkService) -> Optional[BaseVoltage]: # noinspection PyUnresolvedReferences cim = BaseVoltage(mrid=pb.mrid(), nominal_voltage=pb.nominalVoltage) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim def conducting_equipment_to_cim(pb: PBConductingEquipment, cim: ConductingEquipment, network_service: NetworkService): @@ -1086,12 +1092,14 @@ def conducting_equipment_to_cim(pb: PBConductingEquipment, cim: ConductingEquipm equipment_to_cim(pb.eq, cim, network_service) +@bind_to_cim +@with_network_service def connectivity_node_to_cim(pb: PBConnectivityNode, network_service: NetworkService) -> Optional[ConnectivityNode]: # noinspection PyUnresolvedReferences cim = ConnectivityNode(mrid=pb.mrid()) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim def connectivity_node_container_to_cim(pb: PBConnectivityNodeContainer, cim: ConnectivityNodeContainer, network_service: NetworkService): @@ -1130,6 +1138,8 @@ def equipment_container_to_cim(pb: PBEquipmentContainer, cim: EquipmentContainer connectivity_node_container_to_cim(pb.cnc, cim, network_service) +@bind_to_cim +@with_network_service def feeder_to_cim(pb: PBFeeder, network_service: NetworkService) -> Optional[Feeder]: # noinspection PyUnresolvedReferences cim = Feeder(mrid=pb.mrid()) @@ -1142,9 +1152,11 @@ def feeder_to_cim(pb: PBFeeder, network_service: NetworkService) -> Optional[Fee network_service.resolve_or_defer_reference(resolver.current_energized_lv_feeders(cim), mrid) equipment_container_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def geographical_region_to_cim(pb: PBGeographicalRegion, network_service: NetworkService) -> Optional[GeographicalRegion]: # noinspection PyUnresolvedReferences cim = GeographicalRegion(mrid=pb.mrid()) @@ -1153,7 +1165,7 @@ def geographical_region_to_cim(pb: PBGeographicalRegion, network_service: Networ network_service.resolve_or_defer_reference(resolver.sub_geographical_regions(cim), mrid) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim def power_system_resource_to_cim(pb: PBPowerSystemResource, cim: PowerSystemResource, network_service: NetworkService): @@ -1165,6 +1177,8 @@ def power_system_resource_to_cim(pb: PBPowerSystemResource, cim: PowerSystemReso identified_object_to_cim(pb.io, cim, network_service) +@bind_to_cim +@with_network_service def sub_geographical_region_to_cim(pb: PBSubGeographicalRegion, network_service: NetworkService) -> Optional[SubGeographicalRegion]: # noinspection PyUnresolvedReferences cim = SubGeographicalRegion(mrid=pb.mrid()) @@ -1174,9 +1188,11 @@ def sub_geographical_region_to_cim(pb: PBSubGeographicalRegion, network_service: network_service.resolve_or_defer_reference(resolver.substations(cim), mrid) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def substation_to_cim(pb: PBSubstation, network_service: NetworkService) -> Optional[Substation]: # noinspection PyUnresolvedReferences cim = Substation(mrid=pb.mrid()) @@ -1192,9 +1208,11 @@ def substation_to_cim(pb: PBSubstation, network_service: NetworkService) -> Opti network_service.resolve_or_defer_reference(resolver.circuits(cim), mrid) equipment_container_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def terminal_to_cim(pb: PBTerminal, network_service: NetworkService) -> Optional[Terminal]: # noinspection PyUnresolvedReferences cim = Terminal( @@ -1209,22 +1227,15 @@ def terminal_to_cim(pb: PBTerminal, network_service: NetworkService) -> Optional network_service.resolve_or_defer_reference(resolver.connectivity_node(cim), pb.connectivityNodeMRID) ac_dc_terminal_to_cim(pb.ad, cim, network_service) - return cim if network_service.add(cim) else None - - -PBBaseVoltage.to_cim = base_voltage_to_cim -PBConnectivityNode.to_cim = connectivity_node_to_cim -PBFeeder.to_cim = feeder_to_cim -PBGeographicalRegion.to_cim = geographical_region_to_cim -PBSubGeographicalRegion.to_cim = sub_geographical_region_to_cim -PBSubstation.to_cim = substation_to_cim -PBTerminal.to_cim = terminal_to_cim + return cim ############################# # IEC61970 Base Equivalents # ############################# +@bind_to_cim +@with_network_service def equivalent_branch_to_cim(pb: PBEquivalentBranch, network_service: NetworkService) -> Optional[EquivalentBranch]: # noinspection PyUnresolvedReferences cim = EquivalentBranch( @@ -1248,20 +1259,19 @@ def equivalent_branch_to_cim(pb: PBEquivalentBranch, network_service: NetworkSer ) equivalent_equipment_to_cim(pb.ee, cim, network_service) - return cim if network_service.add(cim) else None + return cim def equivalent_equipment_to_cim(pb: PBEquivalentEquipment, cim: EquivalentEquipment, network_service: NetworkService): conducting_equipment_to_cim(pb.ce, cim, network_service) -PBEquivalentBranch.to_cim = equivalent_branch_to_cim - - ####################################### # IEC61970 Base Generation Production # ####################################### +@bind_to_cim +@with_network_service def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> Optional[BatteryUnit]: """ Convert the protobuf :class:`PBBatteryUnit` into its CIM counterpart. @@ -1281,15 +1291,17 @@ def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> O network_service.resolve_or_defer_reference(resolver.battery_controls(cim), mrid) power_electronics_unit_to_cim(pb.peu, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def photo_voltaic_unit_to_cim(pb: PBPhotoVoltaicUnit, network_service: NetworkService) -> Optional[PhotoVoltaicUnit]: # noinspection PyUnresolvedReferences cim = PhotoVoltaicUnit(mrid=pb.mrid()) power_electronics_unit_to_cim(pb.peu, cim, network_service) - return cim if network_service.add(cim) else None + return cim def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectronicsUnit, network_service: NetworkService): @@ -1301,39 +1313,41 @@ def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectron equipment_to_cim(pb.eq, cim, network_service) +@bind_to_cim +@with_network_service def power_electronics_wind_unit_to_cim(pb: PBPowerElectronicsWindUnit, network_service: NetworkService) -> Optional[PowerElectronicsWindUnit]: # noinspection PyUnresolvedReferences cim = PowerElectronicsWindUnit(mrid=pb.mrid()) power_electronics_unit_to_cim(pb.peu, cim, network_service) - return cim if network_service.add(cim) else None - - -PBBatteryUnit.to_cim = battery_unit_to_cim -PBPhotoVoltaicUnit.to_cim = photo_voltaic_unit_to_cim -PBPowerElectronicsWindUnit.to_cim = power_electronics_wind_unit_to_cim + return cim ###################### # IEC61970 Base Meas # ###################### +@bind_to_cim +@with_network_service def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Optional[Accumulator]: # noinspection PyUnresolvedReferences cim = Accumulator(mrid=pb.mrid()) measurement_to_cim(pb.measurement, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def analog_to_cim(pb: PBAnalog, network_service: NetworkService) -> Optional[Analog]: # noinspection PyUnresolvedReferences cim = Analog(mrid=pb.mrid(), positive_flow_in=pb.positiveFlowIn) measurement_to_cim(pb.measurement, cim, network_service) - return cim if network_service.add(cim) else None - + return cim +@bind_to_cim +@with_network_service def control_to_cim(pb: PBControl, network_service: NetworkService) -> Optional[Control]: # noinspection PyUnresolvedReferences cim = Control( @@ -1345,15 +1359,17 @@ def control_to_cim(pb: PBControl, network_service: NetworkService) -> Optional[C network_service.resolve_or_defer_reference(resolver.remote_control(cim), pb.remoteControlMRID) io_point_to_cim(pb.ip, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def discrete_to_cim(pb: PBDiscrete, network_service: NetworkService) -> Optional[Discrete]: # noinspection PyUnresolvedReferences cim = Discrete(mrid=pb.mrid()) measurement_to_cim(pb.measurement, cim, network_service) - return cim if network_service.add(cim) else None + return cim def io_point_to_cim(pb: PBIoPoint, cim: IoPoint, service: NetworkService): @@ -1371,16 +1387,12 @@ def measurement_to_cim(pb: PBMeasurement, cim: Measurement, service: NetworkServ identified_object_to_cim(pb.io, cim, service) -PBAccumulator.to_cim = accumulator_to_cim -PBAnalog.to_cim = analog_to_cim -PBControl.to_cim = control_to_cim -PBDiscrete.to_cim = discrete_to_cim - - ############################ # IEC61970 Base Protection # ############################ +@bind_to_cim +@with_network_service def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> Optional[CurrentRelay]: # noinspection PyUnresolvedReferences cim = CurrentRelay( @@ -1391,16 +1403,15 @@ def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> ) protection_relay_function_to_cim(pb.prf, cim, network_service) - return cim if network_service.add(cim) else None - - -PBCurrentRelay.to_cim = current_relay_to_cim + return cim ####################### # IEC61970 Base Scada # ####################### +@bind_to_cim +@with_network_service def remote_control_to_cim(pb: PBRemoteControl, network_service: NetworkService) -> Optional[RemoteControl]: # noinspection PyUnresolvedReferences cim = RemoteControl(mrid=pb.mrid()) @@ -1408,13 +1419,15 @@ def remote_control_to_cim(pb: PBRemoteControl, network_service: NetworkService) network_service.resolve_or_defer_reference(resolver.control(cim), pb.controlMRID) remote_point_to_cim(pb.rp, cim, network_service) - return cim if network_service.add(cim) else None + return cim def remote_point_to_cim(pb: PBRemotePoint, cim: RemotePoint, service: NetworkService): identified_object_to_cim(pb.io, cim, service) +@bind_to_cim +@with_network_service def remote_source_to_cim(pb: PBRemoteSource, network_service: NetworkService) -> Optional[RemoteSource]: # noinspection PyUnresolvedReferences cim = RemoteSource(mrid=pb.mrid()) @@ -1422,17 +1435,15 @@ def remote_source_to_cim(pb: PBRemoteSource, network_service: NetworkService) -> network_service.resolve_or_defer_reference(resolver.measurement(cim), pb.measurementMRID) remote_point_to_cim(pb.rp, cim, network_service) - return cim if network_service.add(cim) else None - - -PBRemoteControl.to_cim = remote_control_to_cim -PBRemoteSource.to_cim = remote_source_to_cim + return cim ####################### # IEC61970 Base Wires # ####################### +@bind_to_cim +@with_network_service def ac_line_segment_to_cim(pb: PBAcLineSegment, network_service: NetworkService) -> Optional[AcLineSegment]: """ Convert the protobuf :class:`PBAcLineSegment` into its CIM counterpart. @@ -1450,9 +1461,11 @@ def ac_line_segment_to_cim(pb: PBAcLineSegment, network_service: NetworkService) network_service.resolve_or_defer_reference(resolver.clamps(cim), mrid) conductor_to_cim(pb.cd, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[Breaker]: # noinspection PyUnresolvedReferences cim = Breaker( @@ -1461,17 +1474,21 @@ def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[B ) protected_switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def busbar_section_to_cim(pb: PBBusbarSection, network_service: NetworkService) -> Optional[BusbarSection]: # noinspection PyUnresolvedReferences cim = BusbarSection(mrid=pb.mrid()) connector_to_cim(pb.cn, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp]: # noinspection PyUnresolvedReferences cim = Clamp(mrid=pb.mrid()) @@ -1480,7 +1497,7 @@ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp network_service.resolve_or_defer_reference(resolver.clamp_ac_line_segment(cim), pb.acLineSegmentMRID) conducting_equipment_to_cim(pb.ce, cim, network_service) - return cim if network_service.add(cim) else None + return cim def conductor_to_cim(pb: PBConductor, cim: Conductor, network_service: NetworkService): @@ -1498,6 +1515,8 @@ def connector_to_cim(pb: PBConnector, cim: Connector, network_service: NetworkSe conducting_equipment_to_cim(pb.ce, cim, network_service) +@bind_to_cim +@with_network_service def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]: # noinspection PyUnresolvedReferences cim = Cut(mrid=pb.mrid()) @@ -1506,15 +1525,17 @@ def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]: network_service.resolve_or_defer_reference(resolver.cut_ac_line_segment(cim), pb.acLineSegmentMRID) switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def disconnector_to_cim(pb: PBDisconnector, network_service: NetworkService) -> Optional[Disconnector]: # noinspection PyUnresolvedReferences cim = Disconnector(mrid=pb.mrid()) switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim def earth_fault_compensator_to_cim(pb: PBEarthFaultCompensator, cim: EarthFaultCompensator, network_service: NetworkService): @@ -1527,6 +1548,8 @@ def energy_connection_to_cim(pb: PBEnergyConnection, cim: EnergyConnection, netw conducting_equipment_to_cim(pb.ce, cim, network_service) +@bind_to_cim +@with_network_service def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService) -> Optional[EnergyConsumer]: # noinspection PyUnresolvedReferences cim = EnergyConsumer( @@ -1544,9 +1567,11 @@ def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService network_service.resolve_or_defer_reference(resolver.ec_phases(cim), mrid) energy_connection_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: NetworkService) -> Optional[EnergyConsumerPhase]: # noinspection PyUnresolvedReferences cim = EnergyConsumerPhase( @@ -1561,9 +1586,11 @@ def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: Net network_service.resolve_or_defer_reference(resolver.energy_consumer(cim), pb.energyConsumerMRID) power_system_resource_to_cim(pb.psr, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) -> Optional[EnergySource]: # noinspection PyUnresolvedReferences cim = EnergySource( @@ -1599,9 +1626,11 @@ def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) -> network_service.resolve_or_defer_reference(resolver.es_phases(cim), mrid) energy_connection_to_cim(pb.ec, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def energy_source_phase_to_cim(pb: PBEnergySourcePhase, network_service: NetworkService) -> Optional[EnergySourcePhase]: # noinspection PyUnresolvedReferences cim = EnergySourcePhase(mrid=pb.mrid(), phase=single_phase_kind_by_id(pb.phase)) @@ -1609,9 +1638,11 @@ def energy_source_phase_to_cim(pb: PBEnergySourcePhase, network_service: Network network_service.resolve_or_defer_reference(resolver.energy_source(cim), pb.energySourceMRID) power_system_resource_to_cim(pb.psr, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def fuse_to_cim(pb: PBFuse, network_service: NetworkService) -> Optional[Fuse]: # noinspection PyUnresolvedReferences cim = Fuse(mrid=pb.mrid()) @@ -1619,53 +1650,65 @@ def fuse_to_cim(pb: PBFuse, network_service: NetworkService) -> Optional[Fuse]: network_service.resolve_or_defer_reference(resolver.fuse_function(cim), pb.functionMRID) switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def ground_to_cim(pb: PBGround, network_service: NetworkService) -> Optional[Ground]: # noinspection PyUnresolvedReferences cim = Ground(mrid=pb.mrid()) conducting_equipment_to_cim(pb.ce, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: NetworkService) -> Optional[GroundDisconnector]: # noinspection PyUnresolvedReferences cim = GroundDisconnector(mrid=pb.mrid()) switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service 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)) earth_fault_compensator_to_cim(pb.efc, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def jumper_to_cim(pb: PBJumper, network_service: NetworkService) -> Optional[Jumper]: # noinspection PyUnresolvedReferences cim = Jumper(mrid=pb.mrid()) switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def junction_to_cim(pb: PBJunction, network_service: NetworkService) -> Optional[Junction]: # noinspection PyUnresolvedReferences cim = Junction(mrid=pb.mrid()) connector_to_cim(pb.cn, cim, network_service) - return cim if network_service.add(cim) else None + return cim def line_to_cim(pb: PBLine, cim: Line, network_service: NetworkService): equipment_container_to_cim(pb.ec, cim, network_service) +@bind_to_cim +@with_network_service def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_service: NetworkService) -> Optional[LinearShuntCompensator]: # noinspection PyUnresolvedReferences cim = LinearShuntCompensator( @@ -1677,15 +1720,17 @@ def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_servic ) shunt_compensator_to_cim(pb.sc, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def load_break_switch_to_cim(pb: PBLoadBreakSwitch, network_service: NetworkService) -> Optional[LoadBreakSwitch]: # noinspection PyUnresolvedReferences cim = LoadBreakSwitch(mrid=pb.mrid()) protected_switch_to_cim(pb.ps, cim, network_service) - return cim if network_service.add(cim) else None + return cim def per_length_line_parameter_to_cim(pb: PBPerLengthLineParameter, cim: PerLengthLineParameter, network_service: NetworkService): @@ -1696,6 +1741,8 @@ def per_length_impedance_to_cim(pb: PBPerLengthImpedance, cim: PerLengthImpedanc per_length_line_parameter_to_cim(pb.lp, cim, network_service) +@bind_to_cim +@with_network_service def per_length_phase_impedance_to_cim(pb: PBPerLengthPhaseImpedance, network_service: NetworkService) -> Optional[PerLengthPhaseImpedance]: """ Convert the protobuf :class:`PBPerLengthPhaseImpedance` into its CIM counterpart. @@ -1710,9 +1757,11 @@ def per_length_phase_impedance_to_cim(pb: PBPerLengthPhaseImpedance, network_ser cim.add_data(phase_impedance_data_to_cim(phase_impedance_data)) per_length_impedance_to_cim(pb.pli, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, network_service: NetworkService) -> Optional[PerLengthSequenceImpedance]: # noinspection PyUnresolvedReferences cim = PerLengthSequenceImpedance( @@ -1728,15 +1777,17 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo ) per_length_impedance_to_cim(pb.pli, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service 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)) earth_fault_compensator_to_cim(pb.efc, cim, network_service) - return cim if network_service.add(cim) else None + return cim def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImpedanceData]: @@ -1755,6 +1806,8 @@ def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImped ) +@bind_to_cim +@with_network_service def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, network_service: NetworkService) -> Optional[PowerElectronicsConnection]: # noinspection PyUnresolvedReferences cim = PowerElectronicsConnection( @@ -1798,9 +1851,11 @@ def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, networ network_service.resolve_or_defer_reference(resolver.power_electronics_connection_phase(cim), mrid) regulating_cond_eq_to_cim(pb.rce, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def power_electronics_connection_phase_to_cim( pb: PBPowerElectronicsConnectionPhase, network_service: NetworkService @@ -1816,9 +1871,11 @@ def power_electronics_connection_phase_to_cim( network_service.resolve_or_defer_reference(resolver.phase_power_electronics_connection(cim), pb.powerElectronicsConnectionMRID) power_system_resource_to_cim(pb.psr, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkService) -> Optional[PowerTransformer]: # noinspection PyUnresolvedReferences cim = PowerTransformer( @@ -1835,9 +1892,11 @@ def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkSer network_service.resolve_or_defer_reference(resolver.power_transformer_info(cim), pb.asset_info_mrid()) conducting_equipment_to_cim(pb.ce, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: NetworkService) -> Optional[PowerTransformerEnd]: # noinspection PyUnresolvedReferences cim = PowerTransformerEnd( @@ -1862,7 +1921,7 @@ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: Net transformer_end_to_cim(pb.te, cim, network_service) network_service.resolve_or_defer_reference(resolver.power_transformer(cim), pb.powerTransformerMRID) - return cim if network_service.add(cim) else None + return cim def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network_service: NetworkService): @@ -1874,6 +1933,8 @@ def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network switch_to_cim(pb.sw, cim, network_service) +@bind_to_cim +@with_network_service def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkService) -> Optional[RatioTapChanger]: # noinspection PyUnresolvedReferences cim = RatioTapChanger( @@ -1884,23 +1945,27 @@ def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkServ network_service.resolve_or_defer_reference(resolver.transformer_end(cim), pb.transformerEndMRID) tap_changer_to_cim(pb.tc, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def reactive_capability_curve_to_cim(pb: PBReactiveCapabilityCurve, network_service: NetworkService) -> Optional[ReactiveCapabilityCurve]: # noinspection PyUnresolvedReferences cim = ReactiveCapabilityCurve(mrid=pb.mrid()) curve_to_cim(pb.c, cim, network_service) - return cim if network_service.add(cim) else None + return cim +@bind_to_cim +@with_network_service def recloser_to_cim(pb: PBRecloser, network_service: NetworkService) -> Optional[Recloser]: # noinspection PyUnresolvedReferences cim = Recloser(mrid=pb.mrid()) protected_switch_to_cim(pb.sw, cim, network_service) - return cim if network_service.add(cim) else None + return cim def regulating_cond_eq_to_cim(pb: PBRegulatingCondEq, cim: RegulatingCondEq, network_service: NetworkService): @@ -1939,6 +2004,8 @@ def rotating_machine_to_cim(pb: PBRotatingMachine, cim: RotatingMachine, network regulating_cond_eq_to_cim(pb.rce, cim, network_service) +@bind_to_cim +@with_network_service def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkService) -> Optional[SeriesCompensator]: # noinspection PyUnresolvedReferences cim = SeriesCompensator( @@ -1952,7 +2019,7 @@ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkS ) conducting_equipment_to_cim(pb.ce, cim, network_service) - return cim if network_service.add(cim) else None + return cim def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, network_service: NetworkService): @@ -1966,6 +2033,8 @@ def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, netw regulating_cond_eq_to_cim(pb.rce, cim, network_service) +@bind_to_cim +@with_network_service def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: NetworkService): """ Convert the protobuf :class:`PBStaticVarCompensator` into its CIM counterpart. @@ -1984,7 +2053,7 @@ def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: N ) regulating_cond_eq_to_cim(pb.rce, cim, network_service) - return cim if network_service.add(cim) else None + return cim def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService): @@ -1997,6 +2066,8 @@ def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService): conducting_equipment_to_cim(pb.ce, cim, network_service) +@bind_to_cim +@with_network_service def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: NetworkService) -> Optional[SynchronousMachine]: # noinspection PyUnresolvedReferences cim = SynchronousMachine( @@ -2028,7 +2099,7 @@ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: Networ network_service.resolve_or_defer_reference(resolver.reactive_capability_curve(cim), mrid) rotating_machine_to_cim(pb.rm, cim, network_service) - return cim if network_service.add(cim) else None + return cim def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: NetworkService): @@ -2044,6 +2115,8 @@ def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: Netwo power_system_resource_to_cim(pb.psr, cim, network_service) +@bind_to_cim +@with_network_service def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: NetworkService) -> Optional[TapChangerControl]: # noinspection PyUnresolvedReferences cim = TapChangerControl( @@ -2060,7 +2133,7 @@ def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: Network ) regulating_control_to_cim(pb.rc, cim, network_service) - return cim if network_service.add(cim) else None + return cim def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_service: NetworkService): @@ -2081,6 +2154,8 @@ def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[Trans return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=pb.ratedS) +@bind_to_cim +@with_network_service 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) @@ -2088,48 +2163,15 @@ def transformer_star_impedance_to_cim(pb: PBTransformerStarImpedance, network_se network_service.resolve_or_defer_reference(resolver.star_impedance_transformer_end_info(cim), pb.transformerEndInfoMRID) identified_object_to_cim(pb.io, cim, network_service) - return cim if network_service.add(cim) else None - - -PBAcLineSegment.to_cim = ac_line_segment_to_cim -PBBreaker.to_cim = breaker_to_cim -PBBusbarSection.to_cim = busbar_section_to_cim -PBClamp.to_cim = clamp_to_cim -PBCut.to_cim = cut_to_cim -PBDisconnector.to_cim = disconnector_to_cim -PBEnergyConsumer.to_cim = energy_consumer_to_cim -PBEnergyConsumerPhase.to_cim = energy_consumer_phase_to_cim -PBEnergySource.to_cim = energy_source_to_cim -PBEnergySourcePhase.to_cim = energy_source_phase_to_cim -PBFuse.to_cim = fuse_to_cim -PBGround.to_cim = ground_to_cim -PBGroundDisconnector.to_cim = ground_disconnector_to_cim -PBGroundingImpedance.to_cim = grounding_impedance_to_cim -PBJumper.to_cim = jumper_to_cim -PBJunction.to_cim = junction_to_cim -PBLinearShuntCompensator.to_cim = linear_shunt_compensator_to_cim -PBLoadBreakSwitch.to_cim = load_break_switch_to_cim -PBPerLengthPhaseImpedance.to_cim = per_length_phase_impedance_to_cim -PBPerLengthSequenceImpedance.to_cim = per_length_sequence_impedance_to_cim -PBPetersenCoil.to_cim = petersen_coil_to_cim -PBPowerElectronicsConnection.to_cim = power_electronics_connection_to_cim -PBPowerElectronicsConnectionPhase.to_cim = power_electronics_connection_phase_to_cim -PBPowerTransformer.to_cim = power_transformer_to_cim -PBPowerTransformerEnd.to_cim = power_transformer_end_to_cim -PBRatioTapChanger.to_cim = ratio_tap_changer_to_cim -PBReactiveCapabilityCurve.to_cim = reactive_capability_curve_to_cim -PBRecloser.to_cim = recloser_to_cim -PBSeriesCompensator.to_cim = series_compensator_to_cim -PBStaticVarCompensator.to_cim = static_var_compensator_to_cim -PBSynchronousMachine.to_cim = synchronous_machine_to_cim -PBTapChangerControl.to_cim = tap_changer_control_to_cim -PBTransformerStarImpedance.to_cim = transformer_star_impedance_to_cim + return cim ############################### # IEC61970 InfIEC61970 Feeder # ############################### +@bind_to_cim +@with_network_service def circuit_to_cim(pb: PBCircuit, network_service: NetworkService) -> Optional[Circuit]: # noinspection PyUnresolvedReferences cim = Circuit(mrid=pb.mrid()) @@ -2141,7 +2183,4 @@ def circuit_to_cim(pb: PBCircuit, network_service: NetworkService) -> Optional[C network_service.resolve_or_defer_reference(resolver.end_substation(cim), mrid) line_to_cim(pb.l, cim, network_service) - return cim if network_service.add(cim) else None - - -PBCircuit.to_cim = circuit_to_cim + return cim From bb2657eab1fbf290663fd7788f205de7328b6a2b Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Wed, 20 Aug 2025 17:56:36 +1000 Subject: [PATCH 2/4] renamed for clearer Signed-off-by: Max Chesterfield --- .../common/translator/base_proto2cim.py | 6 +- .../network/translator/network_proto2cim.py | 177 +++++++++--------- 2 files changed, 90 insertions(+), 93 deletions(-) diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index 156597120..33d45076d 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -6,7 +6,7 @@ from __future__ import annotations __all__ = ["identified_object_to_cim", "document_to_cim", "organisation_to_cim", "organisation_role_to_cim", - "BaseProtoToCim", "with_network_service", "bind_to_cim"] + "BaseProtoToCim", "add_to_network_or_none", "bind_to_cim"] import functools import inspect @@ -35,7 +35,7 @@ R = TypeVar("R") -def with_network_service(func: TProtoToCimFunc) -> TProtoToCimFunc: +def add_to_network_or_none(func: TProtoToCimFunc) -> TProtoToCimFunc: @functools.wraps(func) def wrapper(pb: Message, service: BaseService) -> Optional[IdentifiedObject]: return cim if service.add(cim := func(pb, service)) else None @@ -68,7 +68,7 @@ def document_to_cim(pb: PBDocument, cim: Document, service: BaseService): @bind_to_cim -@with_network_service +@add_to_network_or_none def organisation_to_cim(pb: PBOrganisation, service: BaseService) -> Optional[Organisation]: cim = Organisation() diff --git a/src/zepben/ewb/services/network/translator/network_proto2cim.py b/src/zepben/ewb/services/network/translator/network_proto2cim.py index f5e25e056..dc21b0483 100644 --- a/src/zepben/ewb/services/network/translator/network_proto2cim.py +++ b/src/zepben/ewb/services/network/translator/network_proto2cim.py @@ -31,10 +31,8 @@ "static_var_compensator_to_cim", "clamp_to_cim", "cut_to_cim" ] -import functools -from typing import Optional, Callable +from typing import Optional -from google.protobuf.message import Message 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 from zepben.protobuf.cim.extensions.iec61970.base.core.Site_pb2 import Site as PBSite @@ -326,7 +324,7 @@ from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import * 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, with_network_service, \ +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 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 @@ -338,7 +336,7 @@ ################################## @bind_to_cim -@with_network_service +@add_to_network_or_none def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optional[RelayInfo]: # noinspection PyUnresolvedReferences cim = RelayInfo( @@ -357,7 +355,7 @@ def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optio ################################ @bind_to_cim -@with_network_service +@add_to_network_or_none def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network_service: NetworkService) -> PanDemandResponseFunction: """ Convert the protobuf :class:`PBPanDemandResponseFunction` into its CIM counterpart. @@ -379,7 +377,7 @@ def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network ################################# @bind_to_cim -@with_network_service +@add_to_network_or_none def site_to_cim(pb: PBSite, network_service: NetworkService) -> Optional[Site]: # noinspection PyUnresolvedReferences cim = Site(mrid=pb.mrid()) @@ -393,7 +391,7 @@ def site_to_cim(pb: PBSite, network_service: NetworkService) -> Optional[Site]: ################################### @bind_to_cim -@with_network_service +@add_to_network_or_none def loop_to_cim(pb: PBLoop, network_service: NetworkService) -> Optional[Loop]: # noinspection PyUnresolvedReferences cim = Loop(mrid=pb.mrid()) @@ -410,7 +408,7 @@ def loop_to_cim(pb: PBLoop, network_service: NetworkService) -> Optional[Loop]: @bind_to_cim -@with_network_service +@add_to_network_or_none def lv_feeder_to_cim(pb: PBLvFeeder, network_service: NetworkService) -> Optional[LvFeeder]: # noinspection PyUnresolvedReferences cim = LvFeeder(mrid=pb.mrid()) @@ -430,20 +428,19 @@ def lv_feeder_to_cim(pb: PBLvFeeder, network_service: NetworkService) -> Optiona ################################################## @bind_to_cim -@with_network_service +@add_to_network_or_none def ev_charging_unit_to_cim(pb: PBEvChargingUnit, network_service: NetworkService) -> Optional[EvChargingUnit]: # noinspection PyUnresolvedReferences cim = EvChargingUnit(mrid=pb.mrid()) power_electronics_unit_to_cim(pb.peu, cim, network_service) return cim - ####################################### # Extensions IEC61970 Base Protection # ####################################### @bind_to_cim -@with_network_service +@add_to_network_or_none def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) -> Optional[DistanceRelay]: # noinspection PyUnresolvedReferences cim = DistanceRelay( @@ -487,7 +484,7 @@ def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: Protect @bind_to_cim -@with_network_service +@add_to_network_or_none def protection_relay_scheme_to_cim(pb: PBProtectionRelayScheme, network_service: NetworkService) -> Optional[ProtectionRelayScheme]: # noinspection PyUnresolvedReferences cim = ProtectionRelayScheme( @@ -505,7 +502,7 @@ def protection_relay_scheme_to_cim(pb: PBProtectionRelayScheme, network_service: @bind_to_cim -@with_network_service +@add_to_network_or_none def protection_relay_system_to_cim(pb: PBProtectionRelaySystem, network_service: NetworkService) -> Optional[ProtectionRelaySystem]: # noinspection PyUnresolvedReferences cim = ProtectionRelaySystem( @@ -529,7 +526,7 @@ def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]: @bind_to_cim -@with_network_service +@add_to_network_or_none def voltage_relay_to_cim(pb: PBVoltageRelay, network_service: NetworkService) -> Optional[VoltageRelay]: # noinspection PyUnresolvedReferences cim = VoltageRelay(mrid=pb.mrid()) @@ -543,7 +540,7 @@ def voltage_relay_to_cim(pb: PBVoltageRelay, network_service: NetworkService) -> ################################## @bind_to_cim -@with_network_service +@add_to_network_or_none def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService) -> BatteryControl: """ Convert the protobuf :class:`PBBatteryControl` into its CIM counterpart. @@ -571,7 +568,7 @@ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService @bind_to_cim -@with_network_service +@add_to_network_or_none def cable_info_to_cim(pb: PBCableInfo, network_service: NetworkService) -> Optional[CableInfo]: # noinspection PyUnresolvedReferences cim = CableInfo(mrid=pb.mrid()) @@ -581,7 +578,7 @@ def cable_info_to_cim(pb: PBCableInfo, network_service: NetworkService) -> Optio @bind_to_cim -@with_network_service +@add_to_network_or_none def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Optional[NoLoadTest]: # noinspection PyUnresolvedReferences cim = NoLoadTest( @@ -598,7 +595,7 @@ def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Op @bind_to_cim -@with_network_service +@add_to_network_or_none def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkService) -> Optional[OpenCircuitTest]: # noinspection PyUnresolvedReferences cim = OpenCircuitTest( @@ -615,7 +612,7 @@ def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkServ @bind_to_cim -@with_network_service +@add_to_network_or_none def overhead_wire_info_to_cim(pb: PBOverheadWireInfo, network_service: NetworkService) -> Optional[OverheadWireInfo]: # noinspection PyUnresolvedReferences cim = OverheadWireInfo(mrid=pb.mrid()) @@ -625,7 +622,7 @@ def overhead_wire_info_to_cim(pb: PBOverheadWireInfo, network_service: NetworkSe @bind_to_cim -@with_network_service +@add_to_network_or_none def power_transformer_info_to_cim(pb: PBPowerTransformerInfo, network_service: NetworkService) -> Optional[PowerTransformerInfo]: # noinspection PyUnresolvedReferences cim = PowerTransformerInfo(mrid=pb.mrid()) @@ -638,7 +635,7 @@ def power_transformer_info_to_cim(pb: PBPowerTransformerInfo, network_service: N @bind_to_cim -@with_network_service +@add_to_network_or_none def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkService) -> Optional[ShortCircuitTest]: # noinspection PyUnresolvedReferences cim = ShortCircuitTest( @@ -660,7 +657,7 @@ def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkSe @bind_to_cim -@with_network_service +@add_to_network_or_none def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: NetworkService) -> Optional[ShuntCompensatorInfo]: # noinspection PyUnresolvedReferences cim = ShuntCompensatorInfo( @@ -676,7 +673,7 @@ def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: N @bind_to_cim -@with_network_service +@add_to_network_or_none def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Optional[SwitchInfo]: # noinspection PyUnresolvedReferences cim = SwitchInfo( @@ -689,7 +686,7 @@ def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Opt @bind_to_cim -@with_network_service +@add_to_network_or_none def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: NetworkService) -> Optional[TransformerEndInfo]: # noinspection PyUnresolvedReferences cim = TransformerEndInfo( @@ -718,7 +715,7 @@ def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: Netwo @bind_to_cim -@with_network_service +@add_to_network_or_none def transformer_tank_info_to_cim(pb: PBTransformerTankInfo, network_service: NetworkService) -> Optional[TransformerTankInfo]: # noinspection PyUnresolvedReferences cim = TransformerTankInfo(mrid=pb.mrid()) @@ -785,7 +782,7 @@ def asset_organisation_role_to_cim(pb: PBAssetOrganisationRole, cim: AssetOrgani @bind_to_cim -@with_network_service +@add_to_network_or_none def asset_owner_to_cim(pb: PBAssetOwner, network_service: NetworkService) -> Optional[AssetOwner]: # noinspection PyUnresolvedReferences cim = AssetOwner(mrid=pb.mrid()) @@ -795,7 +792,7 @@ def asset_owner_to_cim(pb: PBAssetOwner, network_service: NetworkService) -> Opt @bind_to_cim -@with_network_service +@add_to_network_or_none def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Optional[Streetlight]: # noinspection PyUnresolvedReferences cim = Streetlight( @@ -819,7 +816,7 @@ def structure_to_cim(pb: PBStructure, cim: Structure, network_service: NetworkSe ################### @bind_to_cim -@with_network_service +@add_to_network_or_none def location_to_cim(pb: PBLocation, network_service: NetworkService) -> Optional[Location]: # noinspection PyUnresolvedReferences cim = Location(mrid=pb.mrid(), main_address=street_address_to_cim(pb.mainAddress) if pb.HasField("mainAddress") else None) @@ -865,7 +862,7 @@ def town_detail_to_cim(pb: PBTownDetail) -> Optional[TownDetail]: ##################################### @bind_to_cim -@with_network_service +@add_to_network_or_none def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_service: NetworkService) -> Optional[CurrentTransformerInfo]: # noinspection PyUnresolvedReferences cim = CurrentTransformerInfo( @@ -889,7 +886,7 @@ def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_servic @bind_to_cim -@with_network_service +@add_to_network_or_none def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_service: NetworkService) -> Optional[PotentialTransformerInfo]: # noinspection PyUnresolvedReferences cim = PotentialTransformerInfo( @@ -911,7 +908,7 @@ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_se ################################## @bind_to_cim -@with_network_service +@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) @@ -970,7 +967,7 @@ def end_device_function_to_cim(pb: PBEndDeviceFunction, cim: EndDeviceFunction, @bind_to_cim -@with_network_service +@add_to_network_or_none def meter_to_cim(pb: PBMeter, network_service: NetworkService) -> Optional[Meter]: # noinspection PyUnresolvedReferences cim = Meter(mrid=pb.mrid()) @@ -980,7 +977,7 @@ def meter_to_cim(pb: PBMeter, network_service: NetworkService) -> Optional[Meter @bind_to_cim -@with_network_service +@add_to_network_or_none def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Optional[UsagePoint]: # noinspection PyUnresolvedReferences cim = UsagePoint(mrid=pb.mrid()) @@ -1006,7 +1003,7 @@ def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Opt ####################### @bind_to_cim -@with_network_service +@add_to_network_or_none def operational_restriction_to_cim(pb: PBOperationalRestriction, network_service: NetworkService) -> Optional[OperationalRestriction]: # noinspection PyUnresolvedReferences cim = OperationalRestriction(mrid=pb.mrid()) @@ -1025,7 +1022,7 @@ def auxiliary_equipment_to_cim(pb: PBAuxiliaryEquipment, cim: AuxiliaryEquipment @bind_to_cim -@with_network_service +@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)) @@ -1038,7 +1035,7 @@ def current_transformer_to_cim(pb: PBCurrentTransformer, network_service: Networ @bind_to_cim -@with_network_service +@add_to_network_or_none def fault_indicator_to_cim(pb: PBFaultIndicator, network_service: NetworkService) -> Optional[FaultIndicator]: # noinspection PyUnresolvedReferences cim = FaultIndicator(mrid=pb.mrid()) @@ -1048,7 +1045,7 @@ def fault_indicator_to_cim(pb: PBFaultIndicator, network_service: NetworkService @bind_to_cim -@with_network_service +@add_to_network_or_none def potential_transformer_to_cim(pb: PBPotentialTransformer, network_service: NetworkService) -> Optional[PotentialTransformer]: # noinspection PyUnresolvedReferences cim = PotentialTransformer(mrid=pb.mrid(), type=PotentialTransformerKind(pb.type)) @@ -1075,7 +1072,7 @@ def ac_dc_terminal_to_cim(pb: PBAcDcTerminal, cim: AcDcTerminal, network_service @bind_to_cim -@with_network_service +@add_to_network_or_none def base_voltage_to_cim(pb: PBBaseVoltage, network_service: NetworkService) -> Optional[BaseVoltage]: # noinspection PyUnresolvedReferences cim = BaseVoltage(mrid=pb.mrid(), nominal_voltage=pb.nominalVoltage) @@ -1093,7 +1090,7 @@ def conducting_equipment_to_cim(pb: PBConductingEquipment, cim: ConductingEquipm @bind_to_cim -@with_network_service +@add_to_network_or_none def connectivity_node_to_cim(pb: PBConnectivityNode, network_service: NetworkService) -> Optional[ConnectivityNode]: # noinspection PyUnresolvedReferences cim = ConnectivityNode(mrid=pb.mrid()) @@ -1139,7 +1136,7 @@ def equipment_container_to_cim(pb: PBEquipmentContainer, cim: EquipmentContainer @bind_to_cim -@with_network_service +@add_to_network_or_none def feeder_to_cim(pb: PBFeeder, network_service: NetworkService) -> Optional[Feeder]: # noinspection PyUnresolvedReferences cim = Feeder(mrid=pb.mrid()) @@ -1156,7 +1153,7 @@ def feeder_to_cim(pb: PBFeeder, network_service: NetworkService) -> Optional[Fee @bind_to_cim -@with_network_service +@add_to_network_or_none def geographical_region_to_cim(pb: PBGeographicalRegion, network_service: NetworkService) -> Optional[GeographicalRegion]: # noinspection PyUnresolvedReferences cim = GeographicalRegion(mrid=pb.mrid()) @@ -1178,7 +1175,7 @@ def power_system_resource_to_cim(pb: PBPowerSystemResource, cim: PowerSystemReso @bind_to_cim -@with_network_service +@add_to_network_or_none def sub_geographical_region_to_cim(pb: PBSubGeographicalRegion, network_service: NetworkService) -> Optional[SubGeographicalRegion]: # noinspection PyUnresolvedReferences cim = SubGeographicalRegion(mrid=pb.mrid()) @@ -1192,7 +1189,7 @@ def sub_geographical_region_to_cim(pb: PBSubGeographicalRegion, network_service: @bind_to_cim -@with_network_service +@add_to_network_or_none def substation_to_cim(pb: PBSubstation, network_service: NetworkService) -> Optional[Substation]: # noinspection PyUnresolvedReferences cim = Substation(mrid=pb.mrid()) @@ -1212,7 +1209,7 @@ def substation_to_cim(pb: PBSubstation, network_service: NetworkService) -> Opti @bind_to_cim -@with_network_service +@add_to_network_or_none def terminal_to_cim(pb: PBTerminal, network_service: NetworkService) -> Optional[Terminal]: # noinspection PyUnresolvedReferences cim = Terminal( @@ -1235,7 +1232,7 @@ def terminal_to_cim(pb: PBTerminal, network_service: NetworkService) -> Optional ############################# @bind_to_cim -@with_network_service +@add_to_network_or_none def equivalent_branch_to_cim(pb: PBEquivalentBranch, network_service: NetworkService) -> Optional[EquivalentBranch]: # noinspection PyUnresolvedReferences cim = EquivalentBranch( @@ -1271,7 +1268,7 @@ def equivalent_equipment_to_cim(pb: PBEquivalentEquipment, cim: EquivalentEquipm ####################################### @bind_to_cim -@with_network_service +@add_to_network_or_none def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> Optional[BatteryUnit]: """ Convert the protobuf :class:`PBBatteryUnit` into its CIM counterpart. @@ -1295,7 +1292,7 @@ def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> O @bind_to_cim -@with_network_service +@add_to_network_or_none def photo_voltaic_unit_to_cim(pb: PBPhotoVoltaicUnit, network_service: NetworkService) -> Optional[PhotoVoltaicUnit]: # noinspection PyUnresolvedReferences cim = PhotoVoltaicUnit(mrid=pb.mrid()) @@ -1314,7 +1311,7 @@ def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectron @bind_to_cim -@with_network_service +@add_to_network_or_none def power_electronics_wind_unit_to_cim(pb: PBPowerElectronicsWindUnit, network_service: NetworkService) -> Optional[PowerElectronicsWindUnit]: # noinspection PyUnresolvedReferences cim = PowerElectronicsWindUnit(mrid=pb.mrid()) @@ -1328,7 +1325,7 @@ def power_electronics_wind_unit_to_cim(pb: PBPowerElectronicsWindUnit, network_s ###################### @bind_to_cim -@with_network_service +@add_to_network_or_none def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Optional[Accumulator]: # noinspection PyUnresolvedReferences cim = Accumulator(mrid=pb.mrid()) @@ -1338,7 +1335,7 @@ def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Op @bind_to_cim -@with_network_service +@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) @@ -1347,7 +1344,7 @@ def analog_to_cim(pb: PBAnalog, network_service: NetworkService) -> Optional[Ana return cim @bind_to_cim -@with_network_service +@add_to_network_or_none def control_to_cim(pb: PBControl, network_service: NetworkService) -> Optional[Control]: # noinspection PyUnresolvedReferences cim = Control( @@ -1363,7 +1360,7 @@ def control_to_cim(pb: PBControl, network_service: NetworkService) -> Optional[C @bind_to_cim -@with_network_service +@add_to_network_or_none def discrete_to_cim(pb: PBDiscrete, network_service: NetworkService) -> Optional[Discrete]: # noinspection PyUnresolvedReferences cim = Discrete(mrid=pb.mrid()) @@ -1392,7 +1389,7 @@ def measurement_to_cim(pb: PBMeasurement, cim: Measurement, service: NetworkServ ############################ @bind_to_cim -@with_network_service +@add_to_network_or_none def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> Optional[CurrentRelay]: # noinspection PyUnresolvedReferences cim = CurrentRelay( @@ -1411,7 +1408,7 @@ def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> ####################### @bind_to_cim -@with_network_service +@add_to_network_or_none def remote_control_to_cim(pb: PBRemoteControl, network_service: NetworkService) -> Optional[RemoteControl]: # noinspection PyUnresolvedReferences cim = RemoteControl(mrid=pb.mrid()) @@ -1427,7 +1424,7 @@ def remote_point_to_cim(pb: PBRemotePoint, cim: RemotePoint, service: NetworkSer @bind_to_cim -@with_network_service +@add_to_network_or_none def remote_source_to_cim(pb: PBRemoteSource, network_service: NetworkService) -> Optional[RemoteSource]: # noinspection PyUnresolvedReferences cim = RemoteSource(mrid=pb.mrid()) @@ -1443,7 +1440,7 @@ def remote_source_to_cim(pb: PBRemoteSource, network_service: NetworkService) -> ####################### @bind_to_cim -@with_network_service +@add_to_network_or_none def ac_line_segment_to_cim(pb: PBAcLineSegment, network_service: NetworkService) -> Optional[AcLineSegment]: """ Convert the protobuf :class:`PBAcLineSegment` into its CIM counterpart. @@ -1465,7 +1462,7 @@ def ac_line_segment_to_cim(pb: PBAcLineSegment, network_service: NetworkService) @bind_to_cim -@with_network_service +@add_to_network_or_none def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[Breaker]: # noinspection PyUnresolvedReferences cim = Breaker( @@ -1478,7 +1475,7 @@ def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[B @bind_to_cim -@with_network_service +@add_to_network_or_none def busbar_section_to_cim(pb: PBBusbarSection, network_service: NetworkService) -> Optional[BusbarSection]: # noinspection PyUnresolvedReferences cim = BusbarSection(mrid=pb.mrid()) @@ -1488,7 +1485,7 @@ def busbar_section_to_cim(pb: PBBusbarSection, network_service: NetworkService) @bind_to_cim -@with_network_service +@add_to_network_or_none def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp]: # noinspection PyUnresolvedReferences cim = Clamp(mrid=pb.mrid()) @@ -1516,7 +1513,7 @@ def connector_to_cim(pb: PBConnector, cim: Connector, network_service: NetworkSe @bind_to_cim -@with_network_service +@add_to_network_or_none def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]: # noinspection PyUnresolvedReferences cim = Cut(mrid=pb.mrid()) @@ -1529,7 +1526,7 @@ def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]: @bind_to_cim -@with_network_service +@add_to_network_or_none def disconnector_to_cim(pb: PBDisconnector, network_service: NetworkService) -> Optional[Disconnector]: # noinspection PyUnresolvedReferences cim = Disconnector(mrid=pb.mrid()) @@ -1549,7 +1546,7 @@ def energy_connection_to_cim(pb: PBEnergyConnection, cim: EnergyConnection, netw @bind_to_cim -@with_network_service +@add_to_network_or_none def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService) -> Optional[EnergyConsumer]: # noinspection PyUnresolvedReferences cim = EnergyConsumer( @@ -1571,7 +1568,7 @@ def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService @bind_to_cim -@with_network_service +@add_to_network_or_none def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: NetworkService) -> Optional[EnergyConsumerPhase]: # noinspection PyUnresolvedReferences cim = EnergyConsumerPhase( @@ -1590,7 +1587,7 @@ def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: Net @bind_to_cim -@with_network_service +@add_to_network_or_none def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) -> Optional[EnergySource]: # noinspection PyUnresolvedReferences cim = EnergySource( @@ -1630,7 +1627,7 @@ def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) -> @bind_to_cim -@with_network_service +@add_to_network_or_none def energy_source_phase_to_cim(pb: PBEnergySourcePhase, network_service: NetworkService) -> Optional[EnergySourcePhase]: # noinspection PyUnresolvedReferences cim = EnergySourcePhase(mrid=pb.mrid(), phase=single_phase_kind_by_id(pb.phase)) @@ -1642,7 +1639,7 @@ def energy_source_phase_to_cim(pb: PBEnergySourcePhase, network_service: Network @bind_to_cim -@with_network_service +@add_to_network_or_none def fuse_to_cim(pb: PBFuse, network_service: NetworkService) -> Optional[Fuse]: # noinspection PyUnresolvedReferences cim = Fuse(mrid=pb.mrid()) @@ -1654,7 +1651,7 @@ def fuse_to_cim(pb: PBFuse, network_service: NetworkService) -> Optional[Fuse]: @bind_to_cim -@with_network_service +@add_to_network_or_none def ground_to_cim(pb: PBGround, network_service: NetworkService) -> Optional[Ground]: # noinspection PyUnresolvedReferences cim = Ground(mrid=pb.mrid()) @@ -1664,7 +1661,7 @@ def ground_to_cim(pb: PBGround, network_service: NetworkService) -> Optional[Gro @bind_to_cim -@with_network_service +@add_to_network_or_none def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: NetworkService) -> Optional[GroundDisconnector]: # noinspection PyUnresolvedReferences cim = GroundDisconnector(mrid=pb.mrid()) @@ -1674,7 +1671,7 @@ def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: Networ @bind_to_cim -@with_network_service +@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)) @@ -1684,7 +1681,7 @@ def grounding_impedance_to_cim(pb: PBGroundingImpedance, network_service: Networ @bind_to_cim -@with_network_service +@add_to_network_or_none def jumper_to_cim(pb: PBJumper, network_service: NetworkService) -> Optional[Jumper]: # noinspection PyUnresolvedReferences cim = Jumper(mrid=pb.mrid()) @@ -1694,7 +1691,7 @@ def jumper_to_cim(pb: PBJumper, network_service: NetworkService) -> Optional[Jum @bind_to_cim -@with_network_service +@add_to_network_or_none def junction_to_cim(pb: PBJunction, network_service: NetworkService) -> Optional[Junction]: # noinspection PyUnresolvedReferences cim = Junction(mrid=pb.mrid()) @@ -1708,7 +1705,7 @@ def line_to_cim(pb: PBLine, cim: Line, network_service: NetworkService): @bind_to_cim -@with_network_service +@add_to_network_or_none def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_service: NetworkService) -> Optional[LinearShuntCompensator]: # noinspection PyUnresolvedReferences cim = LinearShuntCompensator( @@ -1724,7 +1721,7 @@ def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_servic @bind_to_cim -@with_network_service +@add_to_network_or_none def load_break_switch_to_cim(pb: PBLoadBreakSwitch, network_service: NetworkService) -> Optional[LoadBreakSwitch]: # noinspection PyUnresolvedReferences cim = LoadBreakSwitch(mrid=pb.mrid()) @@ -1742,7 +1739,7 @@ def per_length_impedance_to_cim(pb: PBPerLengthImpedance, cim: PerLengthImpedanc @bind_to_cim -@with_network_service +@add_to_network_or_none def per_length_phase_impedance_to_cim(pb: PBPerLengthPhaseImpedance, network_service: NetworkService) -> Optional[PerLengthPhaseImpedance]: """ Convert the protobuf :class:`PBPerLengthPhaseImpedance` into its CIM counterpart. @@ -1761,7 +1758,7 @@ def per_length_phase_impedance_to_cim(pb: PBPerLengthPhaseImpedance, network_ser @bind_to_cim -@with_network_service +@add_to_network_or_none def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, network_service: NetworkService) -> Optional[PerLengthSequenceImpedance]: # noinspection PyUnresolvedReferences cim = PerLengthSequenceImpedance( @@ -1781,7 +1778,7 @@ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, netwo @bind_to_cim -@with_network_service +@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)) @@ -1807,7 +1804,7 @@ def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImped @bind_to_cim -@with_network_service +@add_to_network_or_none def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, network_service: NetworkService) -> Optional[PowerElectronicsConnection]: # noinspection PyUnresolvedReferences cim = PowerElectronicsConnection( @@ -1855,7 +1852,7 @@ def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, networ @bind_to_cim -@with_network_service +@add_to_network_or_none def power_electronics_connection_phase_to_cim( pb: PBPowerElectronicsConnectionPhase, network_service: NetworkService @@ -1875,7 +1872,7 @@ def power_electronics_connection_phase_to_cim( @bind_to_cim -@with_network_service +@add_to_network_or_none def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkService) -> Optional[PowerTransformer]: # noinspection PyUnresolvedReferences cim = PowerTransformer( @@ -1896,7 +1893,7 @@ def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkSer @bind_to_cim -@with_network_service +@add_to_network_or_none def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: NetworkService) -> Optional[PowerTransformerEnd]: # noinspection PyUnresolvedReferences cim = PowerTransformerEnd( @@ -1934,7 +1931,7 @@ def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network @bind_to_cim -@with_network_service +@add_to_network_or_none def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkService) -> Optional[RatioTapChanger]: # noinspection PyUnresolvedReferences cim = RatioTapChanger( @@ -1949,7 +1946,7 @@ def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkServ @bind_to_cim -@with_network_service +@add_to_network_or_none def reactive_capability_curve_to_cim(pb: PBReactiveCapabilityCurve, network_service: NetworkService) -> Optional[ReactiveCapabilityCurve]: # noinspection PyUnresolvedReferences cim = ReactiveCapabilityCurve(mrid=pb.mrid()) @@ -1959,7 +1956,7 @@ def reactive_capability_curve_to_cim(pb: PBReactiveCapabilityCurve, network_serv @bind_to_cim -@with_network_service +@add_to_network_or_none def recloser_to_cim(pb: PBRecloser, network_service: NetworkService) -> Optional[Recloser]: # noinspection PyUnresolvedReferences cim = Recloser(mrid=pb.mrid()) @@ -2005,7 +2002,7 @@ def rotating_machine_to_cim(pb: PBRotatingMachine, cim: RotatingMachine, network @bind_to_cim -@with_network_service +@add_to_network_or_none def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkService) -> Optional[SeriesCompensator]: # noinspection PyUnresolvedReferences cim = SeriesCompensator( @@ -2034,7 +2031,7 @@ def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, netw @bind_to_cim -@with_network_service +@add_to_network_or_none def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: NetworkService): """ Convert the protobuf :class:`PBStaticVarCompensator` into its CIM counterpart. @@ -2067,7 +2064,7 @@ def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService): @bind_to_cim -@with_network_service +@add_to_network_or_none def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: NetworkService) -> Optional[SynchronousMachine]: # noinspection PyUnresolvedReferences cim = SynchronousMachine( @@ -2116,7 +2113,7 @@ def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: Netwo @bind_to_cim -@with_network_service +@add_to_network_or_none def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: NetworkService) -> Optional[TapChangerControl]: # noinspection PyUnresolvedReferences cim = TapChangerControl( @@ -2155,7 +2152,7 @@ def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[Trans @bind_to_cim -@with_network_service +@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) @@ -2171,7 +2168,7 @@ def transformer_star_impedance_to_cim(pb: PBTransformerStarImpedance, network_se ############################### @bind_to_cim -@with_network_service +@add_to_network_or_none def circuit_to_cim(pb: PBCircuit, network_service: NetworkService) -> Optional[Circuit]: # noinspection PyUnresolvedReferences cim = Circuit(mrid=pb.mrid()) From 657b28c62032b9e1ca62075a65919092fba98248 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Thu, 21 Aug 2025 00:18:00 +1000 Subject: [PATCH 3/4] add docs Signed-off-by: Max Chesterfield --- CONTRIBUTING.md | 2 +- src/zepben/ewb/services/common/translator/base_proto2cim.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c5b827cd1..5a8329f69 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ to prevent the test from timing out while you step through the code: * ```import as PB``` * Add ```def _to_pb``` * Add ```"_to_cim"``` to ```__all__``` - * Add ```_to_cim = _to_cim``` + * Annotate ```_to_cim``` with the ```@bind_to_cim``` decorator 1. Add reference resolver(s) to resolvers in [common package](src/zepben/ewb/services/common) (if new associations). 1. Update database schema: 1. Increment `TablesVersion.SUPPORTED_VERSION` by 1 in [table_version.py](src/zepben/ewb/database/sqlite/tables/table_version.py) diff --git a/src/zepben/ewb/services/common/translator/base_proto2cim.py b/src/zepben/ewb/services/common/translator/base_proto2cim.py index 33d45076d..12618ff55 100644 --- a/src/zepben/ewb/services/common/translator/base_proto2cim.py +++ b/src/zepben/ewb/services/common/translator/base_proto2cim.py @@ -36,6 +36,10 @@ def add_to_network_or_none(func: TProtoToCimFunc) -> TProtoToCimFunc: + """ + This should wrap any leaf class of the hierarchy, for example, If you're porting over ewb-sdk-jvm + changes, any of the classes that get used in a `network.add(Class)` + """ @functools.wraps(func) def wrapper(pb: Message, service: BaseService) -> Optional[IdentifiedObject]: return cim if service.add(cim := func(pb, service)) else None From 1311089131aa91238077720b6f5a680223d2f346 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Thu, 21 Aug 2025 00:34:05 +1000 Subject: [PATCH 4/4] add .to_pb decorator too, and docs Signed-off-by: Max Chesterfield --- CONTRIBUTING.md | 2 +- .../common/translator/base_cim2proto.py | 31 ++- .../network/translator/network_cim2proto.py | 220 +++++++----------- 3 files changed, 110 insertions(+), 143 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5a8329f69..be2a46a1e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,7 +62,7 @@ to prevent the test from timing out while you step through the code: * ```import as PB``` * Add ```def _to_pb``` * Add ```"_to_pb"``` to ```__all__``` - * Add ```.to_pb = _to_pb``` + * Annotate ```_to_pb``` with the ```@bind_to_pb``` decorator 1. Update [network_proto2cim.py](src/zepben/ewb/services/network/translator/network_proto2cim.py) * ```import as PB``` * Add ```def _to_pb``` diff --git a/src/zepben/ewb/services/common/translator/base_cim2proto.py b/src/zepben/ewb/services/common/translator/base_cim2proto.py index 3163c2c73..966b9e360 100644 --- a/src/zepben/ewb/services/common/translator/base_cim2proto.py +++ b/src/zepben/ewb/services/common/translator/base_cim2proto.py @@ -5,6 +5,9 @@ __all__ = ["identified_object_to_pb", "document_to_pb", "organisation_role_to_pb", "organisation_to_pb"] +import inspect +from typing import ParamSpec, TypeVar, Callable + # noinspection PyPackageRequirements,PyUnresolvedReferences from google.protobuf.timestamp_pb2 import Timestamp as PBTimestamp from zepben.protobuf.cim.iec61968.common.Document_pb2 import Document as PBDocument @@ -23,10 +26,23 @@ from zepben.ewb.services.common.translator.util import mrid_or_empty +P = ParamSpec("P") +R = TypeVar("R") + + +def bind_to_pb(func: Callable[P, R]) -> Callable[P, R]: + """ + Get the object described in the type hint of the first argument of the function we are wrapping + set that object's `to_pb` function to be the function we are wrapping + """ + inspect.get_annotations(func, eval_str=True)[func.__code__.co_varnames[0]].to_pb = func + return func + ################### # IEC61968 Common # ################### +@bind_to_pb def document_to_pb(cim: Document) -> PBDocument: timestamp = None if cim.created_date_time: @@ -44,10 +60,12 @@ def document_to_pb(cim: Document) -> PBDocument: ) +@bind_to_pb def organisation_to_pb(cim: Organisation) -> PBOrganisation: return PBOrganisation(io=identified_object_to_pb(cim)) +@bind_to_pb def organisation_role_to_pb(cim: OrganisationRole) -> PBOrganisationRole: return PBOrganisationRole( io=identified_object_to_pb(cim), @@ -55,15 +73,11 @@ def organisation_role_to_pb(cim: OrganisationRole) -> PBOrganisationRole: ) -Document.to_pb = document_to_pb -Organisation.to_pb = organisation_to_pb -OrganisationRole.to_pb = organisation_role_to_pb - - ###################### # IEC61970 Base Core # ###################### +@bind_to_pb def identified_object_to_pb(cim: IdentifiedObject) -> PBIdentifiedObject: return PBIdentifiedObject( mRID=str(cim.mrid), @@ -73,6 +87,7 @@ def identified_object_to_pb(cim: IdentifiedObject) -> PBIdentifiedObject: ) +@bind_to_pb def name_to_pb(cim: Name) -> PBName: return PBName( name=cim.name, @@ -80,13 +95,9 @@ def name_to_pb(cim: Name) -> PBName: ) +@bind_to_pb def name_type_to_pb(cim: NameType) -> PBNameType: return PBNameType( name=cim.name, description=cim.description ) - - -IdentifiedObject.to_pb = identified_object_to_pb -Name.to_pb = name_to_pb -NameType.to_pb = name_type_to_pb diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py index 140bed5d6..d94aae2fe 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 +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.util import mrid_or_empty, from_nullable_int, from_nullable_float, from_nullable_long, from_nullable_uint, \ nullable_bool_settings # noinspection PyProtectedMember @@ -324,6 +324,7 @@ class CimTranslationException(Exception): # Extensions IEC61968 Asset Info # ################################## +@bind_to_pb def relay_info_to_pb(cim: RelayInfo) -> PBRelayInfo: return PBRelayInfo( ai=asset_info_to_pb(cim), @@ -333,13 +334,11 @@ def relay_info_to_pb(cim: RelayInfo) -> PBRelayInfo: ) -RelayInfo.to_pb = relay_info_to_pb - - ################################ # Extensions IEC61968 Metering # ################################ +@bind_to_pb def pan_demand_response_function_to_pb(cim: PanDemandResponseFunction) -> PBPanDemandResponseFunction: """ Convert the :class:`PanDemandResponseFunction` into its protobuf counterpart. @@ -354,24 +353,20 @@ def pan_demand_response_function_to_pb(cim: PanDemandResponseFunction) -> PBPanD ) -PanDemandResponseFunction.to_pb = pan_demand_response_function_to_pb - - ################################# # Extensions IEC61970 Base Core # ################################# +@bind_to_pb def site_to_pb(cim: Site) -> PBSite: return PBSite(ec=equipment_container_to_pb(cim)) -Site.to_pb = site_to_pb - - ################################### # Extensions IEC61970 Base Feeder # ################################### +@bind_to_pb def loop_to_pb(cim: Loop) -> PBLoop: return PBLoop( io=identified_object_to_pb(cim), @@ -381,6 +376,7 @@ def loop_to_pb(cim: Loop) -> PBLoop: ) +@bind_to_pb def lv_feeder_to_pb(cim: LvFeeder) -> PBLvFeeder: return PBLvFeeder( ec=equipment_container_to_pb(cim), @@ -390,25 +386,20 @@ def lv_feeder_to_pb(cim: LvFeeder) -> PBLvFeeder: ) -Loop.to_pb = loop_to_pb -LvFeeder.to_pb = lv_feeder_to_pb - - ################################################## # Extensions IEC61970 Base Generation Production # ################################################## +@bind_to_pb def ev_charging_unit(cim: EvChargingUnit) -> PBEvChargingUnit: return PBEvChargingUnit(peu=power_electronics_unit_to_pb(cim)) -EvChargingUnit.to_pb = ev_charging_unit - - ####################################### # Extensions IEC61970 Base Protection # ####################################### +@bind_to_pb def distance_relay_to_pb(cim: DistanceRelay) -> PBDistanceRelay: return PBDistanceRelay( prf=protection_relay_function_to_pb(cim, True), @@ -441,6 +432,7 @@ def protection_relay_function_to_pb(cim: ProtectionRelayFunction, include_asset_ ) +@bind_to_pb def protection_relay_scheme_to_pb(cim: ProtectionRelayScheme) -> PBProtectionRelayScheme: return PBProtectionRelayScheme( io=identified_object_to_pb(cim), @@ -449,6 +441,7 @@ def protection_relay_scheme_to_pb(cim: ProtectionRelayScheme) -> PBProtectionRel ) +@bind_to_pb def protection_relay_system_to_pb(cim: ProtectionRelaySystem) -> PBProtectionRelaySystem: return PBProtectionRelaySystem( eq=equipment_to_pb(cim), @@ -465,22 +458,18 @@ def relay_setting_to_pb(cim: RelaySetting) -> PBRelaySetting: ) +@bind_to_pb def voltage_relay_to_pb(cim: VoltageRelay) -> PBVoltageRelay: return PBVoltageRelay( prf=protection_relay_function_to_pb(cim, True), ) -DistanceRelay.to_pb = distance_relay_to_pb -ProtectionRelayScheme.to_pb = protection_relay_scheme_to_pb -ProtectionRelaySystem.to_pb = protection_relay_system_to_pb -VoltageRelay.to_pb = voltage_relay_to_pb - - ################################## # Extensions IEC61970 Base Wires # ################################## +@bind_to_pb def battery_control_to_pb(cim: BatteryControl) -> PBBatteryControl: """ Convert the :class:`BatteryControl` into its protobuf counterpart. @@ -497,17 +486,16 @@ def battery_control_to_pb(cim: BatteryControl) -> PBBatteryControl: ) -BatteryControl.to_pb = battery_control_to_pb - - ####################### # IEC61968 Asset Info # ####################### +@bind_to_pb def cable_info_to_pb(cim: CableInfo) -> PBCableInfo: return PBCableInfo(wi=wire_info_to_pb(cim)) +@bind_to_pb def no_load_test_to_pb(cim: NoLoadTest) -> PBNoLoadTest: return PBNoLoadTest( tt=transformer_test_to_pb(cim), @@ -519,6 +507,7 @@ def no_load_test_to_pb(cim: NoLoadTest) -> PBNoLoadTest: ) +@bind_to_pb def open_circuit_test_to_pb(cim: OpenCircuitTest) -> PBOpenCircuitTest: return PBOpenCircuitTest( tt=transformer_test_to_pb(cim), @@ -530,10 +519,12 @@ def open_circuit_test_to_pb(cim: OpenCircuitTest) -> PBOpenCircuitTest: ) +@bind_to_pb def overhead_wire_info_to_pb(cim: OverheadWireInfo) -> PBOverheadWireInfo: return PBOverheadWireInfo(wi=wire_info_to_pb(cim)) +@bind_to_pb def power_transformer_info_to_pb(cim: PowerTransformerInfo) -> PBPowerTransformerInfo: return PBPowerTransformerInfo( ai=asset_info_to_pb(cim), @@ -541,6 +532,7 @@ def power_transformer_info_to_pb(cim: PowerTransformerInfo) -> PBPowerTransforme ) +@bind_to_pb def short_circuit_test_to_pb(cim: ShortCircuitTest) -> PBShortCircuitTest: return PBShortCircuitTest( tt=transformer_test_to_pb(cim), @@ -557,6 +549,7 @@ def short_circuit_test_to_pb(cim: ShortCircuitTest) -> PBShortCircuitTest: ) +@bind_to_pb def shunt_compensator_info_to_pb(cim: ShuntCompensatorInfo) -> PBShuntCompensatorInfo: return PBShuntCompensatorInfo( ai=asset_info_to_pb(cim), @@ -567,6 +560,7 @@ def shunt_compensator_info_to_pb(cim: ShuntCompensatorInfo) -> PBShuntCompensato ) +@bind_to_pb def switch_info_to_pb(cim: SwitchInfo) -> PBSwitchInfo: return PBSwitchInfo( ai=asset_info_to_pb(cim), @@ -574,6 +568,7 @@ def switch_info_to_pb(cim: SwitchInfo) -> PBSwitchInfo: ) +@bind_to_pb def transformer_end_info_to_pb(cim: TransformerEndInfo) -> PBTransformerEndInfo: return PBTransformerEndInfo( ai=asset_info_to_pb(cim), @@ -596,6 +591,7 @@ def transformer_end_info_to_pb(cim: TransformerEndInfo) -> PBTransformerEndInfo: ) +@bind_to_pb def transformer_tank_info_to_pb(cim: TransformerTankInfo) -> PBTransformerTankInfo: return PBTransformerTankInfo( ai=asset_info_to_pb(cim), @@ -603,6 +599,7 @@ def transformer_tank_info_to_pb(cim: TransformerTankInfo) -> PBTransformerTankIn ) +@bind_to_pb def transformer_test_to_pb(cim: TransformerTest) -> PBTransformerTest: return PBTransformerTest( io=identified_object_to_pb(cim), @@ -611,6 +608,7 @@ def transformer_test_to_pb(cim: TransformerTest) -> PBTransformerTest: ) +@bind_to_pb def wire_info_to_pb(cim: WireInfo) -> PBWireInfo: return PBWireInfo( ai=asset_info_to_pb(cim), @@ -619,18 +617,6 @@ def wire_info_to_pb(cim: WireInfo) -> PBWireInfo: ) -CableInfo.to_pb = cable_info_to_pb -NoLoadTest.to_pb = no_load_test_to_pb -OpenCircuitTest.to_pb = open_circuit_test_to_pb -OverheadWireInfo.to_pb = overhead_wire_info_to_pb -PowerTransformerInfo.to_pb = power_transformer_info_to_pb -ShortCircuitTest.to_pb = short_circuit_test_to_pb -ShuntCompensatorInfo.to_pb = shunt_compensator_info_to_pb -SwitchInfo.to_pb = switch_info_to_pb -TransformerEndInfo.to_pb = transformer_end_info_to_pb -TransformerTankInfo.to_pb = transformer_tank_info_to_pb - - ################### # IEC61968 Assets # ################### @@ -667,10 +653,12 @@ def asset_organisation_role_to_pb(cim: AssetOrganisationRole) -> PBAssetOrganisa return pb +@bind_to_pb def asset_owner_to_pb(cim: AssetOwner) -> PBAssetOwner: return PBAssetOwner(aor=asset_organisation_role_to_pb(cim)) +@bind_to_pb def streetlight_to_pb(cim: Streetlight) -> PBStreetlight: return PBStreetlight( at=asset_to_pb(cim), @@ -684,14 +672,11 @@ def structure_to_pb(cim: Structure) -> PBStructure: return PBStructure(ac=asset_container_to_pb(cim)) -AssetOwner.to_pb = asset_owner_to_pb -Streetlight.to_pb = streetlight_to_pb - - ################### # IEC61968 Common # ################### +@bind_to_pb def location_to_pb(cim: Location) -> PBLocation: return PBLocation( io=identified_object_to_pb(cim), @@ -729,13 +714,11 @@ def town_detail_to_pb(cim: TownDetail) -> PBTownDetail: return PBTownDetail(name=cim.name, stateOrProvince=cim.state_or_province) -Location.to_pb = location_to_pb - - ##################################### # IEC61968 InfIEC61968 InfAssetInfo # ##################################### +@bind_to_pb def current_transformer_info_to_pb(cim: CurrentTransformerInfo) -> PBCurrentTransformerInfo: return PBCurrentTransformerInfo( ai=asset_info_to_pb(cim), @@ -754,6 +737,7 @@ def current_transformer_info_to_pb(cim: CurrentTransformerInfo) -> PBCurrentTran ) +@bind_to_pb def potential_transformer_info_to_pb(cim: PotentialTransformerInfo) -> PBPotentialTransformerInfo: return PBPotentialTransformerInfo( ai=asset_info_to_pb(cim), @@ -766,14 +750,11 @@ def potential_transformer_info_to_pb(cim: PotentialTransformerInfo) -> PBPotenti ) -CurrentTransformerInfo.to_pb = current_transformer_info_to_pb -PotentialTransformerInfo.to_pb = potential_transformer_info_to_pb - - ################################## # IEC61968 InfIEC61968 InfAssets # ################################## +@bind_to_pb def pole_to_pb(cim: Pole) -> PBPole: return PBPole( st=structure_to_pb(cim), @@ -782,9 +763,6 @@ def pole_to_pb(cim: Pole) -> PBPole: ) -Pole.to_pb = pole_to_pb - - ################################## # IEC61968 InfIEC61968 InfCommon # ################################## @@ -824,10 +802,12 @@ def end_device_function_to_pb(cim: EndDeviceFunction) -> PBEndDeviceFunction: ) +@bind_to_pb def meter_to_pb(cim: Meter) -> PBMeter: return PBMeter(ed=end_device_to_pb(cim)) +@bind_to_pb def usage_point_to_pb(cim: UsagePoint) -> PBUsagePoint: return PBUsagePoint( io=identified_object_to_pb(cim), @@ -842,21 +822,15 @@ def usage_point_to_pb(cim: UsagePoint) -> PBUsagePoint: ) -Meter.to_pb = meter_to_pb -UsagePoint.to_pb = usage_point_to_pb - - ####################### # IEC61968 Operations # ####################### +@bind_to_pb def operational_restriction_to_pb(cim: OperationalRestriction) -> PBOperationalRestriction: return PBOperationalRestriction(doc=document_to_pb(cim)) -OperationalRestriction.to_pb = operational_restriction_to_pb - - ##################################### # IEC61970 Base Auxiliary Equipment # ##################################### @@ -868,6 +842,7 @@ def auxiliary_equipment_to_pb(cim: AuxiliaryEquipment, include_asset_info: bool ) +@bind_to_pb def current_transformer_to_pb(cim: CurrentTransformer) -> PBCurrentTransformer: return PBCurrentTransformer( sn=sensor_to_pb(cim, True), @@ -875,10 +850,12 @@ def current_transformer_to_pb(cim: CurrentTransformer) -> PBCurrentTransformer: ) +@bind_to_pb def fault_indicator_to_pb(cim: FaultIndicator) -> PBFaultIndicator: return PBFaultIndicator(ae=auxiliary_equipment_to_pb(cim)) +@bind_to_pb def potential_transformer_to_pb(cim: PotentialTransformer) -> PBPotentialTransformer: return PBPotentialTransformer( sn=sensor_to_pb(cim, True), @@ -893,11 +870,6 @@ def sensor_to_pb(cim: Sensor, include_asset_info: bool = False) -> PBSensor: ) -CurrentTransformer.to_pb = current_transformer_to_pb -FaultIndicator.to_pb = fault_indicator_to_pb -PotentialTransformer.to_pb = potential_transformer_to_pb - - ###################### # IEC61970 Base Core # ###################### @@ -906,6 +878,7 @@ def ac_dc_terminal_to_pb(cim: AcDcTerminal) -> PBAcDcTerminal: return PBAcDcTerminal(io=identified_object_to_pb(cim)) +@bind_to_pb def base_voltage_to_pb(cim: BaseVoltage) -> PBBaseVoltage: return PBBaseVoltage( io=identified_object_to_pb(cim), @@ -921,6 +894,7 @@ def conducting_equipment_to_pb(cim: ConductingEquipment, include_asset_info: boo ) +@bind_to_pb def connectivity_node_to_pb(cim: ConnectivityNode) -> PBConnectivityNode: return PBConnectivityNode(io=identified_object_to_pb(cim)) @@ -966,6 +940,7 @@ def equipment_container_to_pb(cim: EquipmentContainer) -> PBEquipmentContainer: return PBEquipmentContainer(cnc=connectivity_node_container_to_pb(cim)) +@bind_to_pb def feeder_to_pb(cim: Feeder) -> PBFeeder: return PBFeeder( ec=equipment_container_to_pb(cim), @@ -976,6 +951,7 @@ def feeder_to_pb(cim: Feeder) -> PBFeeder: ) +@bind_to_pb def geographical_region_to_pb(cim: GeographicalRegion) -> PBGeographicalRegion: return PBGeographicalRegion( io=identified_object_to_pb(cim), @@ -992,6 +968,7 @@ def power_system_resource_to_pb(cim: PowerSystemResource, include_asset_info: bo ) +@bind_to_pb def sub_geographical_region_to_pb(cim: SubGeographicalRegion) -> PBSubGeographicalRegion: return PBSubGeographicalRegion( io=identified_object_to_pb(cim), @@ -1000,6 +977,7 @@ def sub_geographical_region_to_pb(cim: SubGeographicalRegion) -> PBSubGeographic ) +@bind_to_pb def substation_to_pb(cim: Substation) -> PBSubstation: return PBSubstation( ec=equipment_container_to_pb(cim), @@ -1011,6 +989,7 @@ def substation_to_pb(cim: Substation) -> PBSubstation: ) +@bind_to_pb def terminal_to_pb(cim: Terminal) -> PBTerminal: # noinspection PyProtectedMember return PBTerminal( @@ -1025,19 +1004,11 @@ def terminal_to_pb(cim: Terminal) -> PBTerminal: ) -BaseVoltage.to_pb = base_voltage_to_pb -ConnectivityNode.to_pb = connectivity_node_to_pb -Feeder.to_pb = feeder_to_pb -GeographicalRegion.to_pb = geographical_region_to_pb -SubGeographicalRegion.to_pb = sub_geographical_region_to_pb -Substation.to_pb = substation_to_pb -Terminal.to_pb = terminal_to_pb - - ############################# # IEC61970 Base Equivalents # ############################# +@bind_to_pb def equivalent_branch_to_pb(cim: EquivalentBranch) -> PBEquivalentBranch: return PBEquivalentBranch( ee=equivalent_equipment_to_pb(cim), @@ -1064,13 +1035,11 @@ def equivalent_equipment_to_pb(cim: EquivalentEquipment) -> PBEquivalentEquipmen return PBEquivalentEquipment(ce=conducting_equipment_to_pb(cim)) -EquivalentBranch.to_pb = equivalent_branch_to_pb - - ####################################### # IEC61970 Base Generation Production # ####################################### +@bind_to_pb def battery_unit_to_pb(cim: BatteryUnit) -> PBBatteryUnit: """ Convert the :class:`BatteryUnit` into its protobuf counterpart. @@ -1086,6 +1055,7 @@ def battery_unit_to_pb(cim: BatteryUnit) -> PBBatteryUnit: ) +@bind_to_pb def photo_voltaic_unit_to_pb(cim: PhotoVoltaicUnit) -> PBPhotoVoltaicUnit: return PBPhotoVoltaicUnit(peu=power_electronics_unit_to_pb(cim)) @@ -1099,23 +1069,21 @@ def power_electronics_unit_to_pb(cim: PowerElectronicsUnit) -> PBPowerElectronic ) +@bind_to_pb def power_electronics_wind_unit_to_pb(cim: PowerElectronicsWindUnit) -> PBPowerElectronicsWindUnit: return PBPowerElectronicsWindUnit(peu=power_electronics_unit_to_pb(cim)) -BatteryUnit.to_pb = battery_unit_to_pb -PhotoVoltaicUnit.to_pb = photo_voltaic_unit_to_pb -PowerElectronicsWindUnit.to_pb = power_electronics_wind_unit_to_pb - - ###################### # IEC61970 Base Meas # ###################### +@bind_to_pb def accumulator_to_pb(cim: Accumulator) -> PBAccumulator: return PBAccumulator(measurement=measurement_to_pb(cim)) +@bind_to_pb def analog_to_pb(cim: Analog) -> PBAnalog: return PBAnalog( measurement=measurement_to_pb(cim), @@ -1123,6 +1091,7 @@ def analog_to_pb(cim: Analog) -> PBAnalog: ) +@bind_to_pb def control_to_pb(cim: Control) -> PBControl: return PBControl( ip=io_point_to_pb(cim), @@ -1131,6 +1100,7 @@ def control_to_pb(cim: Control) -> PBControl: ) +@bind_to_pb def discrete_to_pb(cim: Discrete) -> PBDiscrete: return PBDiscrete(measurement=measurement_to_pb(cim)) @@ -1150,16 +1120,11 @@ def measurement_to_pb(cim: Measurement) -> PBMeasurement: ) -Accumulator.to_pb = accumulator_to_pb -Analog.to_pb = analog_to_pb -Control.to_pb = control_to_pb -Discrete.to_pb = discrete_to_pb - - ############################ # IEC61970 Base Protection # ############################ +@bind_to_pb def current_relay_to_pb(cim: CurrentRelay) -> PBCurrentRelay: return PBCurrentRelay( prf=protection_relay_function_to_pb(cim, True), @@ -1169,13 +1134,11 @@ def current_relay_to_pb(cim: CurrentRelay) -> PBCurrentRelay: ) -CurrentRelay.to_pb = current_relay_to_pb - - ####################### # IEC61970 Base Scada # ####################### +@bind_to_pb def remote_control_to_pb(cim: RemoteControl) -> PBRemoteControl: return PBRemoteControl( rp=remote_point_to_pb(cim), @@ -1187,6 +1150,7 @@ def remote_point_to_pb(cim: RemotePoint) -> PBRemotePoint: return PBRemotePoint(io=identified_object_to_pb(cim)) +@bind_to_pb def remote_source_to_pb(cim: RemoteSource) -> PBRemoteSource: return PBRemoteSource( rp=remote_point_to_pb(cim), @@ -1194,14 +1158,11 @@ def remote_source_to_pb(cim: RemoteSource) -> PBRemoteSource: ) -RemoteControl.to_pb = remote_control_to_pb -RemoteSource.to_pb = remote_source_to_pb - - ####################### # IEC61970 Base Wires # ####################### +@bind_to_pb def ac_line_segment_to_pb(cim: AcLineSegment) -> PBAcLineSegment: """ Convert the :class:`AcLineSegment` into its protobuf counterpart. @@ -1216,6 +1177,7 @@ def ac_line_segment_to_pb(cim: AcLineSegment) -> PBAcLineSegment: ) +@bind_to_pb def breaker_to_pb(cim: Breaker) -> PBBreaker: return PBBreaker( sw=protected_switch_to_pb(cim), @@ -1223,10 +1185,12 @@ def breaker_to_pb(cim: Breaker) -> PBBreaker: ) +@bind_to_pb def busbar_section_to_pb(cim: BusbarSection) -> PBBusbarSection: return PBBusbarSection(cn=connector_to_pb(cim)) +@bind_to_pb def clamp_to_pb(cim: Clamp) -> PBClamp: return PBClamp( ce=conducting_equipment_to_pb(cim), @@ -1248,6 +1212,7 @@ def connector_to_pb(cim: Connector) -> PBConnector: return PBConnector(ce=conducting_equipment_to_pb(cim)) +@bind_to_pb def cut_to_pb(cim: Cut) -> PBCut: return PBCut( sw=switch_to_pb(cim), @@ -1256,6 +1221,7 @@ def cut_to_pb(cim: Cut) -> PBCut: ) +@bind_to_pb def disconnector_to_pb(cim: Disconnector) -> PBDisconnector: return PBDisconnector(sw=switch_to_pb(cim)) @@ -1271,6 +1237,7 @@ def energy_connection_to_pb(cim: EnergyConnection, include_asset_info=False) -> return PBEnergyConnection(ce=conducting_equipment_to_pb(cim, include_asset_info)) +@bind_to_pb def energy_consumer_to_pb(cim: EnergyConsumer) -> PBEnergyConsumer: return PBEnergyConsumer( ec=energy_connection_to_pb(cim), @@ -1285,6 +1252,7 @@ def energy_consumer_to_pb(cim: EnergyConsumer) -> PBEnergyConsumer: ) +@bind_to_pb def energy_consumer_phase_to_pb(cim: EnergyConsumerPhase) -> PBEnergyConsumerPhase: return PBEnergyConsumerPhase( psr=power_system_resource_to_pb(cim), @@ -1297,6 +1265,7 @@ def energy_consumer_phase_to_pb(cim: EnergyConsumerPhase) -> PBEnergyConsumerPha ) +@bind_to_pb def energy_source_to_pb(cim: EnergySource) -> PBEnergySource: return PBEnergySource( ec=energy_connection_to_pb(cim), @@ -1329,6 +1298,7 @@ def energy_source_to_pb(cim: EnergySource) -> PBEnergySource: ) +@bind_to_pb def energy_source_phase_to_pb(cim: EnergySourcePhase) -> PBEnergySourcePhase: return PBEnergySourcePhase( psr=power_system_resource_to_pb(cim), @@ -1337,6 +1307,7 @@ def energy_source_phase_to_pb(cim: EnergySourcePhase) -> PBEnergySourcePhase: ) +@bind_to_pb def fuse_to_pb(cim: Fuse) -> PBFuse: return PBFuse( sw=switch_to_pb(cim), @@ -1344,18 +1315,21 @@ def fuse_to_pb(cim: Fuse) -> PBFuse: ) +@bind_to_pb def ground_to_pb(cim: Ground) -> PBGround: return PBGround( ce=conducting_equipment_to_pb(cim, True) ) +@bind_to_pb def ground_disconnector_to_pb(cim: GroundDisconnector) -> PBGroundDisconnector: return PBGroundDisconnector( sw=switch_to_pb(cim) ) +@bind_to_pb def grounding_impedance_to_pb(cim: GroundingImpedance) -> PBGroundingImpedance: return PBGroundingImpedance( efc=earth_fault_compensator_to_pb(cim), @@ -1363,10 +1337,12 @@ def grounding_impedance_to_pb(cim: GroundingImpedance) -> PBGroundingImpedance: ) +@bind_to_pb def jumper_to_pb(cim: Jumper) -> PBJumper: return PBJumper(sw=switch_to_pb(cim)) +@bind_to_pb def junction_to_pb(cim: Junction) -> PBJunction: return PBJunction(cn=connector_to_pb(cim)) @@ -1375,6 +1351,7 @@ def line_to_pb(cim: Line) -> PBLine: return PBLine(ec=equipment_container_to_pb(cim)) +@bind_to_pb def linear_shunt_compensator_to_pb(cim: LinearShuntCompensator) -> PBLinearShuntCompensator: return PBLinearShuntCompensator( sc=shunt_compensator_to_pb(cim), @@ -1385,6 +1362,7 @@ def linear_shunt_compensator_to_pb(cim: LinearShuntCompensator) -> PBLinearShunt ) +@bind_to_pb def load_break_switch_to_pb(cim: LoadBreakSwitch) -> PBLoadBreakSwitch: return PBLoadBreakSwitch(ps=protected_switch_to_pb(cim)) @@ -1397,6 +1375,7 @@ def per_length_line_parameter_to_pb(cim: PerLengthLineParameter) -> PBPerLengthL return PBPerLengthLineParameter(io=identified_object_to_pb(cim)) +@bind_to_pb def per_length_phase_impedance_to_pb(cim: PerLengthPhaseImpedance) -> PBPerLengthPhaseImpedance: """ Convert the :class:`PerLengthPhaseImpedance` into its protobuf counterpart. @@ -1409,6 +1388,7 @@ def per_length_phase_impedance_to_pb(cim: PerLengthPhaseImpedance) -> PBPerLengt ) +@bind_to_pb def per_length_sequence_impedance_to_pb(cim: PerLengthSequenceImpedance) -> PBPerLengthSequenceImpedance: return PBPerLengthSequenceImpedance( pli=per_length_impedance_to_pb(cim), @@ -1423,6 +1403,7 @@ def per_length_sequence_impedance_to_pb(cim: PerLengthSequenceImpedance) -> PBPe ) +@bind_to_pb def petersen_coil_to_pb(cim: PetersenCoil) -> PBPetersenCoil: return PBPetersenCoil( efc=earth_fault_compensator_to_pb(cim), @@ -1446,6 +1427,7 @@ def phase_impedance_data_to_pb(cim: PhaseImpedanceData) -> PBPhaseImpedanceData: ) +@bind_to_pb def power_electronics_connection_to_pb(cim: PowerElectronicsConnection) -> PBPowerElectronicsConnection: return PBPowerElectronicsConnection( rce=regulating_cond_eq_to_pb(cim), @@ -1485,6 +1467,7 @@ def power_electronics_connection_to_pb(cim: PowerElectronicsConnection) -> PBPow ) +@bind_to_pb def power_electronics_connection_phase_to_pb(cim: PowerElectronicsConnectionPhase) -> PBPowerElectronicsConnectionPhase: return PBPowerElectronicsConnectionPhase( psr=power_system_resource_to_pb(cim), @@ -1495,6 +1478,7 @@ def power_electronics_connection_phase_to_pb(cim: PowerElectronicsConnectionPhas ) +@bind_to_pb def power_transformer_to_pb(cim: PowerTransformer) -> PBPowerTransformer: return PBPowerTransformer( ce=conducting_equipment_to_pb(cim, True), @@ -1506,6 +1490,7 @@ def power_transformer_to_pb(cim: PowerTransformer) -> PBPowerTransformer: ) +@bind_to_pb def power_transformer_end_to_pb(cim: PowerTransformerEnd) -> PBPowerTransformerEnd: return PBPowerTransformerEnd( te=transformer_end_to_pb(cim), @@ -1534,6 +1519,7 @@ def protected_switch_to_pb(cim: ProtectedSwitch) -> PBProtectedSwitch: ) +@bind_to_pb def ratio_tap_changer_to_pb(cim: RatioTapChanger) -> PBRatioTapChanger: return PBRatioTapChanger( tc=tap_changer_to_pb(cim), @@ -1542,10 +1528,12 @@ def ratio_tap_changer_to_pb(cim: RatioTapChanger) -> PBRatioTapChanger: ) +@bind_to_pb def reactive_capability_curve_to_pb(cim: ReactiveCapabilityCurve) -> PBReactiveCapabilityCurve: return PBReactiveCapabilityCurve(c=curve_to_pb(cim)) +@bind_to_pb def recloser_to_pb(cim: Recloser) -> PBRecloser: return PBRecloser(sw=protected_switch_to_pb(cim)) @@ -1593,6 +1581,7 @@ def rotating_machine_to_pb(cim: RotatingMachine) -> PBRotatingMachine: ) +@bind_to_pb def series_compensator_to_pb(cim: SeriesCompensator) -> PBSeriesCompensator: return PBSeriesCompensator( ce=conducting_equipment_to_pb(cim, True), @@ -1615,6 +1604,7 @@ def shunt_compensator_to_pb(cim: ShuntCompensator) -> PBShuntCompensator: ) +@bind_to_pb def static_var_compensator_to_pb(cim: StaticVarCompensator) -> PBStaticVarCompensator: """ Convert the :class:`StaticVarCompensator` into its protobuf counterpart. @@ -1640,6 +1630,7 @@ def switch_to_pb(cim: Switch) -> PBSwitch: ) +@bind_to_pb def synchronous_machine_to_pb(cim: SynchronousMachine) -> PBSynchronousMachine: return PBSynchronousMachine( rm=rotating_machine_to_pb(cim), @@ -1683,6 +1674,7 @@ def tap_changer_to_pb(cim: TapChanger) -> PBTapChanger: ) +@bind_to_pb def tap_changer_control_to_pb(cim: TapChangerControl) -> PBTapChangerControl: return PBTapChangerControl( rc=regulating_control_to_pb(cim), @@ -1719,6 +1711,7 @@ def transformer_end_rated_s_to_pb(cim: TransformerEndRatedS) -> PBTransformerEnd ) +@bind_to_pb def transformer_star_impedance_to_pb(cim: TransformerStarImpedance) -> PBTransformerStarImpedance: return PBTransformerStarImpedance( io=identified_object_to_pb(cim), @@ -1730,46 +1723,12 @@ def transformer_star_impedance_to_pb(cim: TransformerStarImpedance) -> PBTransfo ) -AcLineSegment.to_pb = ac_line_segment_to_pb -Breaker.to_pb = breaker_to_pb -BusbarSection.to_pb = busbar_section_to_pb -Clamp.to_pb = clamp_to_pb -Cut.to_pb = cut_to_pb -Disconnector.to_pb = disconnector_to_pb -EnergyConsumer.to_pb = energy_consumer_to_pb -EnergyConsumerPhase.to_pb = energy_consumer_phase_to_pb -EnergySource.to_pb = energy_source_to_pb -EnergySourcePhase.to_pb = energy_source_phase_to_pb -Fuse.to_pb = fuse_to_pb -Ground.to_pb = ground_to_pb -GroundDisconnector.to_pb = ground_disconnector_to_pb -GroundingImpedance.to_pb = grounding_impedance_to_pb -Jumper.to_pb = jumper_to_pb -Junction.to_pb = junction_to_pb -LinearShuntCompensator.to_pb = linear_shunt_compensator_to_pb -LoadBreakSwitch.to_pb = load_break_switch_to_pb -PerLengthPhaseImpedance.to_pb = per_length_phase_impedance_to_pb -PerLengthSequenceImpedance.to_pb = per_length_sequence_impedance_to_pb -PetersenCoil.to_pb = petersen_coil_to_pb -PowerElectronicsConnection.to_pb = power_electronics_connection_to_pb -PowerElectronicsConnectionPhase.to_pb = power_electronics_connection_phase_to_pb -PowerTransformer.to_pb = power_transformer_to_pb -PowerTransformerEnd.to_pb = power_transformer_end_to_pb -RatioTapChanger.to_pb = ratio_tap_changer_to_pb -ReactiveCapabilityCurve.to_pb = reactive_capability_curve_to_pb -Recloser.to_pb = recloser_to_pb -SeriesCompensator.to_pb = series_compensator_to_pb -StaticVarCompensator.to_pb = static_var_compensator_to_pb -SynchronousMachine.to_pb = synchronous_machine_to_pb -TapChangerControl.to_pb = tap_changer_control_to_pb -TransformerStarImpedance.to_pb = transformer_star_impedance_to_pb - - ############################### # IEC61970 InfIEC61970 Feeder # ############################### +@bind_to_pb def circuit_to_pb(cim: Circuit) -> PBCircuit: return PBCircuit( l=line_to_pb(cim), @@ -1777,6 +1736,3 @@ def circuit_to_pb(cim: Circuit) -> PBCircuit: endTerminalMRIDs=[str(io.mrid) for io in cim.end_terminals], endSubstationMRIDs=[str(io.mrid) for io in cim.end_substations] ) - - -Circuit.to_pb = circuit_to_pb