zepben.ewb 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. zepben/ewb/__init__.py +601 -0
  2. zepben/ewb/auth/__init__.py +10 -0
  3. zepben/ewb/auth/client/__init__.py +5 -0
  4. zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
  5. zepben/ewb/auth/common/__init__.py +5 -0
  6. zepben/ewb/auth/common/auth_exception.py +16 -0
  7. zepben/ewb/auth/common/auth_method.py +28 -0
  8. zepben/ewb/auth/common/auth_provider_config.py +96 -0
  9. zepben/ewb/database/__init__.py +4 -0
  10. zepben/ewb/database/paths/__init__.py +4 -0
  11. zepben/ewb/database/paths/database_type.py +34 -0
  12. zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
  13. zepben/ewb/database/sql/__init__.py +4 -0
  14. zepben/ewb/database/sql/column.py +37 -0
  15. zepben/ewb/database/sql/sql_table.py +142 -0
  16. zepben/ewb/database/sqlite/__init__.py +4 -0
  17. zepben/ewb/database/sqlite/common/__init__.py +4 -0
  18. zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
  19. zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
  20. zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
  21. zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
  22. zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
  23. zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
  24. zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
  25. zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
  26. zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
  27. zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
  28. zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
  29. zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
  30. zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
  31. zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
  32. zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
  33. zepben/ewb/database/sqlite/customer/__init__.py +4 -0
  34. zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
  35. zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
  36. zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
  37. zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
  38. zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
  39. zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
  40. zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
  41. zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
  42. zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
  43. zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
  44. zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
  45. zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
  46. zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
  47. zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
  48. zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
  49. zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
  50. zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
  51. zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
  52. zepben/ewb/database/sqlite/network/__init__.py +4 -0
  53. zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
  54. zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
  55. zepben/ewb/database/sqlite/network/network_database_reader.py +175 -0
  56. zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
  57. zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
  58. zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
  59. zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
  60. zepben/ewb/database/sqlite/tables/__init__.py +4 -0
  61. zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
  62. zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
  63. zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
  64. zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
  65. zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
  66. zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
  67. zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
  68. zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
  69. zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
  70. zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
  71. zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
  72. zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
  73. zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
  74. zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
  75. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
  76. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
  77. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
  78. zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
  79. zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
  80. zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
  81. zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
  82. zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
  83. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
  84. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
  85. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
  86. zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
  87. zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
  88. zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
  89. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
  90. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
  91. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
  92. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
  93. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
  94. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
  95. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
  96. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
  97. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
  98. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
  99. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
  100. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
  101. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
  102. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
  103. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
  104. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
  105. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
  106. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
  107. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
  108. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
  109. zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
  110. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
  111. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
  112. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
  113. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
  114. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
  115. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
  116. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
  117. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
  118. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
  119. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
  120. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
  121. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
  122. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
  123. zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
  124. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
  125. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
  126. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
  127. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
  128. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
  129. zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
  130. zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
  131. zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
  132. zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
  133. zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
  134. zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
  135. zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
  136. zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
  137. zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
  138. zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
  139. zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
  140. zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
  141. zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
  142. zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
  143. zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
  144. zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
  145. zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
  146. zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
  147. zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
  148. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
  149. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
  150. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
  151. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
  152. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
  153. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
  154. zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
  155. zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
  156. zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
  157. zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
  158. zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
  159. zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
  160. zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
  161. zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
  162. zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
  163. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
  164. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
  165. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
  166. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
  167. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
  168. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
  169. zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
  170. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
  171. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
  172. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
  173. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
  174. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
  175. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
  176. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
  177. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
  178. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
  179. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
  180. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
  181. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
  182. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
  183. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
  184. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
  185. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
  186. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
  187. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
  188. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
  189. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
  190. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
  191. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
  192. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
  193. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
  194. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
  195. zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
  196. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
  197. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
  198. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
  199. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
  200. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
  201. zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
  202. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
  203. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
  204. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
  205. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
  206. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
  207. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
  208. zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
  209. zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
  210. zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
  211. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
  212. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
  213. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
  214. zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
  215. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
  216. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
  217. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
  218. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
  219. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
  220. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
  221. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
  222. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
  223. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
  224. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
  225. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
  226. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
  227. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
  228. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
  229. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
  230. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
  231. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
  232. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
  233. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
  234. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
  235. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
  236. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
  237. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
  238. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
  239. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
  240. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
  241. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
  242. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
  243. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
  244. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
  245. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
  246. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
  247. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
  248. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
  249. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
  250. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
  251. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
  252. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
  253. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
  254. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
  255. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
  256. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
  257. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
  258. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
  259. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
  260. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
  261. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
  262. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
  263. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
  264. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
  265. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
  266. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
  267. zepben/ewb/database/sqlite/tables/sqlite_table.py +45 -0
  268. zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
  269. zepben/ewb/database/sqlite/tables/table_version.py +39 -0
  270. zepben/ewb/dataclassy/__init__.py +15 -0
  271. zepben/ewb/dataclassy/dataclass.py +192 -0
  272. zepben/ewb/dataclassy/decorator.py +35 -0
  273. zepben/ewb/dataclassy/functions.py +80 -0
  274. zepben/ewb/examples/__init__.py +6 -0
  275. zepben/ewb/examples/simple_test_network.py +158 -0
  276. zepben/ewb/exceptions.py +52 -0
  277. zepben/ewb/model/__init__.py +4 -0
  278. zepben/ewb/model/busbranch/__init__.py +4 -0
  279. zepben/ewb/model/busbranch/bus_branch.py +1051 -0
  280. zepben/ewb/model/cim/__init__.py +4 -0
  281. zepben/ewb/model/cim/extensions/__init__.py +4 -0
  282. zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
  283. zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
  284. zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
  285. zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
  286. zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
  287. zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
  288. zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
  289. zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
  290. zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
  291. zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
  292. zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
  293. zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
  294. zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
  295. zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
  296. zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
  297. zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
  298. zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
  299. zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +36 -0
  300. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +112 -0
  301. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
  302. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
  303. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
  304. zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
  305. zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
  306. zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
  307. zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
  308. zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +83 -0
  309. zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +57 -0
  310. zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
  311. zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +293 -0
  312. zepben/ewb/model/cim/extensions/zbex.py +17 -0
  313. zepben/ewb/model/cim/iec61968/__init__.py +4 -0
  314. zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
  315. zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
  316. zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
  317. zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
  318. zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
  319. zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
  320. zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
  321. zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
  322. zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
  323. zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
  324. zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
  325. zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
  326. zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
  327. zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +57 -0
  328. zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
  329. zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
  330. zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
  331. zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
  332. zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
  333. zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
  334. zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
  335. zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
  336. zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
  337. zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
  338. zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
  339. zepben/ewb/model/cim/iec61968/common/document.py +36 -0
  340. zepben/ewb/model/cim/iec61968/common/location.py +129 -0
  341. zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
  342. zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
  343. zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
  344. zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
  345. zepben/ewb/model/cim/iec61968/common/street_detail.py +46 -0
  346. zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
  347. zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
  348. zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
  349. zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
  350. zepben/ewb/model/cim/iec61968/customers/customer_kind.py +69 -0
  351. zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
  352. zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
  353. zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
  354. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
  355. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
  356. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
  357. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +69 -0
  358. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +45 -0
  359. zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
  360. zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
  361. zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +27 -0
  362. zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
  363. zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
  364. zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
  365. zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +152 -0
  366. zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
  367. zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
  368. zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +48 -0
  369. zepben/ewb/model/cim/iec61968/metering/meter.py +28 -0
  370. zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
  371. zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
  372. zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
  373. zepben/ewb/model/cim/iec61970/__init__.py +4 -0
  374. zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
  375. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
  376. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
  377. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
  378. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
  379. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
  380. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +30 -0
  381. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
  382. zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
  383. zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
  384. zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
  385. zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
  386. zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
  387. zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
  388. zepben/ewb/model/cim/iec61970/base/core/curve.py +125 -0
  389. zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
  390. zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
  391. zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
  392. zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
  393. zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
  394. zepben/ewb/model/cim/iec61970/base/core/identified_object.py +239 -0
  395. zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
  396. zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
  397. zepben/ewb/model/cim/iec61970/base/core/phase_code.py +202 -0
  398. zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
  399. zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
  400. zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
  401. zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
  402. zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
  403. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
  404. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
  405. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
  406. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +28 -0
  407. zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +29 -0
  408. zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
  409. zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +494 -0
  410. zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
  411. zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
  412. zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
  413. zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
  414. zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
  415. zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +39 -0
  416. zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
  417. zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
  418. zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
  419. zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
  420. zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
  421. zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
  422. zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
  423. zepben/ewb/model/cim/iec61970/base/meas/analog.py +18 -0
  424. zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
  425. zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
  426. zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
  427. zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
  428. zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
  429. zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
  430. zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
  431. zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
  432. zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
  433. zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
  434. zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
  435. zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
  436. zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
  437. zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
  438. zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
  439. zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
  440. zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
  441. zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
  442. zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
  443. zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
  444. zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
  445. zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
  446. zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
  447. zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
  448. zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
  449. zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
  450. zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
  451. zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
  452. zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
  453. zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
  454. zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
  455. zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
  456. zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
  457. zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
  458. zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
  459. zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
  460. zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
  461. zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
  462. zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
  463. zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
  464. zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
  465. zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
  466. zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
  467. zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +40 -0
  468. zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
  469. zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
  470. zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
  471. zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
  472. zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
  473. zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
  474. zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
  475. zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
  476. zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
  477. zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
  478. zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +48 -0
  479. zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
  480. zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
  481. zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
  482. zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +107 -0
  483. zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
  484. zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +30 -0
  485. zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
  486. zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
  487. zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +46 -0
  488. zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
  489. zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
  490. zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
  491. zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
  492. zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +45 -0
  493. zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
  494. zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
  495. zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
  496. zepben/ewb/model/phases.py +168 -0
  497. zepben/ewb/model/resistance_reactance.py +40 -0
  498. zepben/ewb/services/__init__.py +4 -0
  499. zepben/ewb/services/common/__init__.py +16 -0
  500. zepben/ewb/services/common/base_service.py +383 -0
  501. zepben/ewb/services/common/base_service_comparator.py +394 -0
  502. zepben/ewb/services/common/difference.py +47 -0
  503. zepben/ewb/services/common/enum_mapper.py +55 -0
  504. zepben/ewb/services/common/meta/__init__.py +4 -0
  505. zepben/ewb/services/common/meta/data_source.py +16 -0
  506. zepben/ewb/services/common/meta/metadata_collection.py +28 -0
  507. zepben/ewb/services/common/meta/metadata_translations.py +47 -0
  508. zepben/ewb/services/common/meta/service_info.py +22 -0
  509. zepben/ewb/services/common/reference_resolvers.py +374 -0
  510. zepben/ewb/services/common/resolver.py +597 -0
  511. zepben/ewb/services/common/translator/__init__.py +4 -0
  512. zepben/ewb/services/common/translator/base_cim2proto.py +115 -0
  513. zepben/ewb/services/common/translator/base_proto2cim.py +146 -0
  514. zepben/ewb/services/common/translator/service_differences.py +81 -0
  515. zepben/ewb/services/common/translator/util.py +75 -0
  516. zepben/ewb/services/customer/__init__.py +4 -0
  517. zepben/ewb/services/customer/customer_service_comparator.py +52 -0
  518. zepben/ewb/services/customer/customers.py +23 -0
  519. zepben/ewb/services/customer/translator/__init__.py +21 -0
  520. zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
  521. zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
  522. zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
  523. zepben/ewb/services/diagram/__init__.py +4 -0
  524. zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
  525. zepben/ewb/services/diagram/diagrams.py +107 -0
  526. zepben/ewb/services/diagram/translator/__init__.py +11 -0
  527. zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
  528. zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
  529. zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
  530. zepben/ewb/services/measurement/__init__.py +4 -0
  531. zepben/ewb/services/measurement/measurements.py +35 -0
  532. zepben/ewb/services/measurement/translator/__init__.py +6 -0
  533. zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
  534. zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
  535. zepben/ewb/services/network/__init__.py +4 -0
  536. zepben/ewb/services/network/network_extensions.py +119 -0
  537. zepben/ewb/services/network/network_service.py +302 -0
  538. zepben/ewb/services/network/network_service_comparator.py +1322 -0
  539. zepben/ewb/services/network/network_state.py +36 -0
  540. zepben/ewb/services/network/tracing/__init__.py +4 -0
  541. zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
  542. zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
  543. zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
  544. zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
  545. zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
  546. zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
  547. zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
  548. zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
  549. zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
  550. zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
  551. zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
  552. zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
  553. zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
  554. zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
  555. zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
  556. zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
  557. zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
  558. zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
  559. zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
  560. zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
  561. zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +104 -0
  562. zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +35 -0
  563. zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
  564. zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
  565. zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
  566. zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
  567. zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
  568. zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
  569. zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
  570. zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
  571. zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
  572. zepben/ewb/services/network/tracing/networktrace/network_trace.py +433 -0
  573. zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
  574. zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
  575. zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +128 -0
  576. zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
  577. zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
  578. zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
  579. zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
  580. zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
  581. zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
  582. zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
  583. zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
  584. zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
  585. zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
  586. zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
  587. zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
  588. zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
  589. zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
  590. zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
  591. zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
  592. zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
  593. zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
  594. zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
  595. zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
  596. zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
  597. zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
  598. zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
  599. zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
  600. zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
  601. zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
  602. zepben/ewb/services/network/tracing/util.py +93 -0
  603. zepben/ewb/services/network/translator/__init__.py +392 -0
  604. zepben/ewb/services/network/translator/network_cim2proto.py +1867 -0
  605. zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
  606. zepben/ewb/services/network/translator/network_proto2cim.py +2201 -0
  607. zepben/ewb/services/services.py +48 -0
  608. zepben/ewb/streaming/__init__.py +4 -0
  609. zepben/ewb/streaming/data/__init__.py +4 -0
  610. zepben/ewb/streaming/data/current_state_event.py +314 -0
  611. zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
  612. zepben/ewb/streaming/data/set_current_states_status.py +286 -0
  613. zepben/ewb/streaming/exceptions.py +14 -0
  614. zepben/ewb/streaming/get/__init__.py +4 -0
  615. zepben/ewb/streaming/get/consumer.py +209 -0
  616. zepben/ewb/streaming/get/customer_consumer.py +111 -0
  617. zepben/ewb/streaming/get/diagram_consumer.py +107 -0
  618. zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
  619. zepben/ewb/streaming/get/hierarchy/data.py +27 -0
  620. zepben/ewb/streaming/get/included_energized_containers.py +36 -0
  621. zepben/ewb/streaming/get/included_energizing_containers.py +36 -0
  622. zepben/ewb/streaming/get/network_consumer.py +870 -0
  623. zepben/ewb/streaming/get/query_network_state_client.py +64 -0
  624. zepben/ewb/streaming/get/query_network_state_service.py +94 -0
  625. zepben/ewb/streaming/grpc/__init__.py +4 -0
  626. zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
  627. zepben/ewb/streaming/grpc/connect.py +209 -0
  628. zepben/ewb/streaming/grpc/grpc.py +107 -0
  629. zepben/ewb/streaming/grpc/grpc_channel_builder.py +190 -0
  630. zepben/ewb/streaming/mutations/__init__.py +4 -0
  631. zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
  632. zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
  633. zepben/ewb/testing/__init__.py +4 -0
  634. zepben/ewb/testing/test_network_builder.py +816 -0
  635. zepben/ewb/types.py +17 -0
  636. zepben/ewb/util.py +200 -0
  637. zepben_ewb-1.0.0.dist-info/METADATA +90 -0
  638. zepben_ewb-1.0.0.dist-info/RECORD +641 -0
  639. zepben_ewb-1.0.0.dist-info/WHEEL +5 -0
  640. zepben_ewb-1.0.0.dist-info/licenses/LICENSE +374 -0
  641. zepben_ewb-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2201 @@
1
+ # Copyright 2024 Zeppelin Bend Pty Ltd
2
+ # This Source Code Form is subject to the terms of the Mozilla Public
3
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ # file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+
6
+ from __future__ import annotations
7
+
8
+ __all__ = [
9
+ "cable_info_to_cim", "no_load_test_to_cim", "open_circuit_test_to_cim", "overhead_wire_info_to_cim", "power_transformer_info_to_cim",
10
+ "short_circuit_test_to_cim", "shunt_compensator_info_to_cim", "switch_info_to_cim", "transformer_end_info_to_cim", "transformer_tank_info_to_cim",
11
+ "transformer_test_to_cim", "wire_info_to_cim", "asset_to_cim", "asset_container_to_cim", "asset_info_to_cim", "asset_organisation_role_to_cim",
12
+ "asset_owner_to_cim", "pole_to_cim", "streetlight_to_cim", "structure_to_cim", "location_to_cim", "position_point_to_cim", "street_address_to_cim",
13
+ "street_detail_to_cim", "town_detail_to_cim", "relay_info_to_cim", "current_transformer_info_to_cim", "potential_transformer_info_to_cim",
14
+ "ratio_to_cim", "end_device_to_cim", "meter_to_cim", "usage_point_to_cim", "operational_restriction_to_cim", "auxiliary_equipment_to_cim",
15
+ "current_transformer_to_cim", "fault_indicator_to_cim", "potential_transformer_to_cim", "sensor_to_cim", "ac_dc_terminal_to_cim", "base_voltage_to_cim",
16
+ "conducting_equipment_to_cim", "connectivity_node_to_cim", "connectivity_node_container_to_cim", "equipment_to_cim", "equipment_container_to_cim",
17
+ "feeder_to_cim", "geographical_region_to_cim", "power_system_resource_to_cim", "site_to_cim", "sub_geographical_region_to_cim", "substation_to_cim",
18
+ "terminal_to_cim", "equivalent_branch_to_cim", "equivalent_equipment_to_cim", "accumulator_to_cim", "analog_to_cim", "control_to_cim", "discrete_to_cim",
19
+ "io_point_to_cim", "measurement_to_cim", "current_relay_to_cim", "protection_relay_function_to_cim", "remote_control_to_cim", "remote_point_to_cim",
20
+ "remote_source_to_cim", "battery_unit_to_cim", "photo_voltaic_unit_to_cim", "power_electronics_unit_to_cim", "power_electronics_wind_unit_to_cim",
21
+ "ac_line_segment_to_cim", "breaker_to_cim", "conductor_to_cim", "connector_to_cim", "disconnector_to_cim", "energy_connection_to_cim",
22
+ "energy_consumer_to_cim", "energy_consumer_phase_to_cim", "energy_source_to_cim", "energy_source_phase_to_cim", "fuse_to_cim", "jumper_to_cim",
23
+ "junction_to_cim", "busbar_section_to_cim", "line_to_cim", "linear_shunt_compensator_to_cim", "load_break_switch_to_cim",
24
+ "per_length_line_parameter_to_cim", "per_length_impedance_to_cim", "per_length_sequence_impedance_to_cim", "power_electronics_connection_to_cim",
25
+ "power_electronics_connection_phase_to_cim", "power_transformer_to_cim", "power_transformer_end_to_cim", "transformer_star_impedance_to_cim",
26
+ "protected_switch_to_cim", "ratio_tap_changer_to_cim", "recloser_to_cim", "regulating_cond_eq_to_cim", "shunt_compensator_to_cim", "switch_to_cim",
27
+ "tap_changer_to_cim", "transformer_end_to_cim", "circuit_to_cim", "loop_to_cim", "lv_feeder_to_cim", "ev_charging_unit_to_cim",
28
+ "transformer_end_rated_s_to_cim", "tap_changer_control_to_cim", "regulating_control_to_cim", "distance_relay_to_cim", "protection_relay_scheme_to_cim",
29
+ "protection_relay_system_to_cim", "relay_setting_to_cim", "voltage_relay_to_cim", "ground_to_cim", "ground_disconnector_to_cim",
30
+ "series_compensator_to_cim", "pan_demand_response_function_to_cim", 'battery_control_to_cim', "asset_function_to_cim", "end_device_function_to_cim",
31
+ "static_var_compensator_to_cim", "clamp_to_cim", "cut_to_cim"
32
+ ]
33
+
34
+ from typing import Optional
35
+
36
+ from zepben.protobuf.cim.extensions.iec61968.assetinfo.RelayInfo_pb2 import RelayInfo as PBRelayInfo
37
+ from zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction_pb2 import PanDemandResponseFunction as PBPanDemandResponseFunction
38
+ from zepben.protobuf.cim.extensions.iec61970.base.core.Site_pb2 import Site as PBSite
39
+ from zepben.protobuf.cim.extensions.iec61970.base.feeder.Loop_pb2 import Loop as PBLoop
40
+ from zepben.protobuf.cim.extensions.iec61970.base.feeder.LvFeeder_pb2 import LvFeeder as PBLvFeeder
41
+ from zepben.protobuf.cim.extensions.iec61970.base.generation.production.EvChargingUnit_pb2 import EvChargingUnit as PBEvChargingUnit
42
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.DistanceRelay_pb2 import DistanceRelay as PBDistanceRelay
43
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelayFunction_pb2 import ProtectionRelayFunction as PBProtectionRelayFunction
44
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelayScheme_pb2 import ProtectionRelayScheme as PBProtectionRelayScheme
45
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.ProtectionRelaySystem_pb2 import ProtectionRelaySystem as PBProtectionRelaySystem
46
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.RelaySetting_pb2 import RelaySetting as PBRelaySetting
47
+ from zepben.protobuf.cim.extensions.iec61970.base.protection.VoltageRelay_pb2 import VoltageRelay as PBVoltageRelay
48
+ from zepben.protobuf.cim.extensions.iec61970.base.wires.BatteryControl_pb2 import BatteryControl as PBBatteryControl
49
+ from zepben.protobuf.cim.extensions.iec61970.base.wires.TransformerEndRatedS_pb2 import TransformerEndRatedS as PBTransformerEndRatedS
50
+ from zepben.protobuf.cim.iec61968.assetinfo.CableInfo_pb2 import CableInfo as PBCableInfo
51
+ from zepben.protobuf.cim.iec61968.assetinfo.NoLoadTest_pb2 import NoLoadTest as PBNoLoadTest
52
+ from zepben.protobuf.cim.iec61968.assetinfo.OpenCircuitTest_pb2 import OpenCircuitTest as PBOpenCircuitTest
53
+ from zepben.protobuf.cim.iec61968.assetinfo.OverheadWireInfo_pb2 import OverheadWireInfo as PBOverheadWireInfo
54
+ from zepben.protobuf.cim.iec61968.assetinfo.PowerTransformerInfo_pb2 import PowerTransformerInfo as PBPowerTransformerInfo
55
+ from zepben.protobuf.cim.iec61968.assetinfo.ShortCircuitTest_pb2 import ShortCircuitTest as PBShortCircuitTest
56
+ from zepben.protobuf.cim.iec61968.assetinfo.ShuntCompensatorInfo_pb2 import ShuntCompensatorInfo as PBShuntCompensatorInfo
57
+ from zepben.protobuf.cim.iec61968.assetinfo.SwitchInfo_pb2 import SwitchInfo as PBSwitchInfo
58
+ from zepben.protobuf.cim.iec61968.assetinfo.TransformerEndInfo_pb2 import TransformerEndInfo as PBTransformerEndInfo
59
+ from zepben.protobuf.cim.iec61968.assetinfo.TransformerTankInfo_pb2 import TransformerTankInfo as PBTransformerTankInfo
60
+ from zepben.protobuf.cim.iec61968.assetinfo.TransformerTest_pb2 import TransformerTest as PBTransformerTest
61
+ from zepben.protobuf.cim.iec61968.assetinfo.WireInfo_pb2 import WireInfo as PBWireInfo
62
+ from zepben.protobuf.cim.iec61968.assets.AssetContainer_pb2 import AssetContainer as PBAssetContainer
63
+ from zepben.protobuf.cim.iec61968.assets.AssetFunction_pb2 import AssetFunction as PBAssetFunction
64
+ from zepben.protobuf.cim.iec61968.assets.AssetInfo_pb2 import AssetInfo as PBAssetInfo
65
+ from zepben.protobuf.cim.iec61968.assets.AssetOrganisationRole_pb2 import AssetOrganisationRole as PBAssetOrganisationRole
66
+ from zepben.protobuf.cim.iec61968.assets.AssetOwner_pb2 import AssetOwner as PBAssetOwner
67
+ from zepben.protobuf.cim.iec61968.assets.Asset_pb2 import Asset as PBAsset
68
+ from zepben.protobuf.cim.iec61968.assets.Streetlight_pb2 import Streetlight as PBStreetlight
69
+ from zepben.protobuf.cim.iec61968.assets.Structure_pb2 import Structure as PBStructure
70
+ from zepben.protobuf.cim.iec61968.common.Location_pb2 import Location as PBLocation
71
+ from zepben.protobuf.cim.iec61968.common.PositionPoint_pb2 import PositionPoint as PBPositionPoint
72
+ from zepben.protobuf.cim.iec61968.common.StreetAddress_pb2 import StreetAddress as PBStreetAddress
73
+ from zepben.protobuf.cim.iec61968.common.StreetDetail_pb2 import StreetDetail as PBStreetDetail
74
+ from zepben.protobuf.cim.iec61968.common.TownDetail_pb2 import TownDetail as PBTownDetail
75
+ from zepben.protobuf.cim.iec61968.infiec61968.infassetinfo.CurrentTransformerInfo_pb2 import CurrentTransformerInfo as PBCurrentTransformerInfo
76
+ from zepben.protobuf.cim.iec61968.infiec61968.infassetinfo.PotentialTransformerInfo_pb2 import PotentialTransformerInfo as PBPotentialTransformerInfo
77
+ from zepben.protobuf.cim.iec61968.infiec61968.infassets.Pole_pb2 import Pole as PBPole
78
+ from zepben.protobuf.cim.iec61968.infiec61968.infcommon.Ratio_pb2 import Ratio as PBRatio
79
+ from zepben.protobuf.cim.iec61968.metering.EndDeviceFunction_pb2 import EndDeviceFunction as PBEndDeviceFunction
80
+ from zepben.protobuf.cim.iec61968.metering.EndDevice_pb2 import EndDevice as PBEndDevice
81
+ from zepben.protobuf.cim.iec61968.metering.Meter_pb2 import Meter as PBMeter
82
+ from zepben.protobuf.cim.iec61968.metering.UsagePoint_pb2 import UsagePoint as PBUsagePoint
83
+ from zepben.protobuf.cim.iec61968.operations.OperationalRestriction_pb2 import OperationalRestriction as PBOperationalRestriction
84
+ from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.AuxiliaryEquipment_pb2 import AuxiliaryEquipment as PBAuxiliaryEquipment
85
+ from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.CurrentTransformer_pb2 import CurrentTransformer as PBCurrentTransformer
86
+ from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.FaultIndicator_pb2 import FaultIndicator as PBFaultIndicator
87
+ from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.PotentialTransformer_pb2 import PotentialTransformer as PBPotentialTransformer
88
+ from zepben.protobuf.cim.iec61970.base.auxiliaryequipment.Sensor_pb2 import Sensor as PBSensor
89
+ from zepben.protobuf.cim.iec61970.base.core.AcDcTerminal_pb2 import AcDcTerminal as PBAcDcTerminal
90
+ from zepben.protobuf.cim.iec61970.base.core.BaseVoltage_pb2 import BaseVoltage as PBBaseVoltage
91
+ from zepben.protobuf.cim.iec61970.base.core.ConductingEquipment_pb2 import ConductingEquipment as PBConductingEquipment
92
+ from zepben.protobuf.cim.iec61970.base.core.ConnectivityNodeContainer_pb2 import ConnectivityNodeContainer as PBConnectivityNodeContainer
93
+ from zepben.protobuf.cim.iec61970.base.core.ConnectivityNode_pb2 import ConnectivityNode as PBConnectivityNode
94
+ from zepben.protobuf.cim.iec61970.base.core.CurveData_pb2 import CurveData as PBCurveData
95
+ from zepben.protobuf.cim.iec61970.base.core.Curve_pb2 import Curve as PBCurve
96
+ from zepben.protobuf.cim.iec61970.base.core.EquipmentContainer_pb2 import EquipmentContainer as PBEquipmentContainer
97
+ from zepben.protobuf.cim.iec61970.base.core.Equipment_pb2 import Equipment as PBEquipment
98
+ from zepben.protobuf.cim.iec61970.base.core.Feeder_pb2 import Feeder as PBFeeder
99
+ from zepben.protobuf.cim.iec61970.base.core.GeographicalRegion_pb2 import GeographicalRegion as PBGeographicalRegion
100
+ from zepben.protobuf.cim.iec61970.base.core.PowerSystemResource_pb2 import PowerSystemResource as PBPowerSystemResource
101
+ from zepben.protobuf.cim.iec61970.base.core.SubGeographicalRegion_pb2 import SubGeographicalRegion as PBSubGeographicalRegion
102
+ from zepben.protobuf.cim.iec61970.base.core.Substation_pb2 import Substation as PBSubstation
103
+ from zepben.protobuf.cim.iec61970.base.core.Terminal_pb2 import Terminal as PBTerminal
104
+ from zepben.protobuf.cim.iec61970.base.equivalents.EquivalentBranch_pb2 import EquivalentBranch as PBEquivalentBranch
105
+ from zepben.protobuf.cim.iec61970.base.equivalents.EquivalentEquipment_pb2 import EquivalentEquipment as PBEquivalentEquipment
106
+ from zepben.protobuf.cim.iec61970.base.generation.production.BatteryUnit_pb2 import BatteryUnit as PBBatteryUnit
107
+ from zepben.protobuf.cim.iec61970.base.generation.production.PhotoVoltaicUnit_pb2 import PhotoVoltaicUnit as PBPhotoVoltaicUnit
108
+ from zepben.protobuf.cim.iec61970.base.generation.production.PowerElectronicsUnit_pb2 import PowerElectronicsUnit as PBPowerElectronicsUnit
109
+ from zepben.protobuf.cim.iec61970.base.generation.production.PowerElectronicsWindUnit_pb2 import PowerElectronicsWindUnit as PBPowerElectronicsWindUnit
110
+ from zepben.protobuf.cim.iec61970.base.meas.Accumulator_pb2 import Accumulator as PBAccumulator
111
+ from zepben.protobuf.cim.iec61970.base.meas.Analog_pb2 import Analog as PBAnalog
112
+ from zepben.protobuf.cim.iec61970.base.meas.Control_pb2 import Control as PBControl
113
+ from zepben.protobuf.cim.iec61970.base.meas.Discrete_pb2 import Discrete as PBDiscrete
114
+ from zepben.protobuf.cim.iec61970.base.meas.IoPoint_pb2 import IoPoint as PBIoPoint
115
+ from zepben.protobuf.cim.iec61970.base.meas.Measurement_pb2 import Measurement as PBMeasurement
116
+ from zepben.protobuf.cim.iec61970.base.protection.CurrentRelay_pb2 import CurrentRelay as PBCurrentRelay
117
+ from zepben.protobuf.cim.iec61970.base.scada.RemoteControl_pb2 import RemoteControl as PBRemoteControl
118
+ from zepben.protobuf.cim.iec61970.base.scada.RemotePoint_pb2 import RemotePoint as PBRemotePoint
119
+ from zepben.protobuf.cim.iec61970.base.scada.RemoteSource_pb2 import RemoteSource as PBRemoteSource
120
+ from zepben.protobuf.cim.iec61970.base.wires.AcLineSegment_pb2 import AcLineSegment as PBAcLineSegment
121
+ from zepben.protobuf.cim.iec61970.base.wires.Breaker_pb2 import Breaker as PBBreaker
122
+ from zepben.protobuf.cim.iec61970.base.wires.BusbarSection_pb2 import BusbarSection as PBBusbarSection
123
+ from zepben.protobuf.cim.iec61970.base.wires.Clamp_pb2 import Clamp as PBClamp
124
+ from zepben.protobuf.cim.iec61970.base.wires.Conductor_pb2 import Conductor as PBConductor
125
+ from zepben.protobuf.cim.iec61970.base.wires.Connector_pb2 import Connector as PBConnector
126
+ from zepben.protobuf.cim.iec61970.base.wires.Cut_pb2 import Cut as PBCut
127
+ from zepben.protobuf.cim.iec61970.base.wires.Disconnector_pb2 import Disconnector as PBDisconnector
128
+ from zepben.protobuf.cim.iec61970.base.wires.EarthFaultCompensator_pb2 import EarthFaultCompensator as PBEarthFaultCompensator
129
+ from zepben.protobuf.cim.iec61970.base.wires.EnergyConnection_pb2 import EnergyConnection as PBEnergyConnection
130
+ from zepben.protobuf.cim.iec61970.base.wires.EnergyConsumerPhase_pb2 import EnergyConsumerPhase as PBEnergyConsumerPhase
131
+ from zepben.protobuf.cim.iec61970.base.wires.EnergyConsumer_pb2 import EnergyConsumer as PBEnergyConsumer
132
+ from zepben.protobuf.cim.iec61970.base.wires.EnergySourcePhase_pb2 import EnergySourcePhase as PBEnergySourcePhase
133
+ from zepben.protobuf.cim.iec61970.base.wires.EnergySource_pb2 import EnergySource as PBEnergySource
134
+ from zepben.protobuf.cim.iec61970.base.wires.Fuse_pb2 import Fuse as PBFuse
135
+ from zepben.protobuf.cim.iec61970.base.wires.GroundDisconnector_pb2 import GroundDisconnector as PBGroundDisconnector
136
+ from zepben.protobuf.cim.iec61970.base.wires.Ground_pb2 import Ground as PBGround
137
+ from zepben.protobuf.cim.iec61970.base.wires.GroundingImpedance_pb2 import GroundingImpedance as PBGroundingImpedance
138
+ from zepben.protobuf.cim.iec61970.base.wires.Jumper_pb2 import Jumper as PBJumper
139
+ from zepben.protobuf.cim.iec61970.base.wires.Junction_pb2 import Junction as PBJunction
140
+ from zepben.protobuf.cim.iec61970.base.wires.Line_pb2 import Line as PBLine
141
+ from zepben.protobuf.cim.iec61970.base.wires.LinearShuntCompensator_pb2 import LinearShuntCompensator as PBLinearShuntCompensator
142
+ from zepben.protobuf.cim.iec61970.base.wires.LoadBreakSwitch_pb2 import LoadBreakSwitch as PBLoadBreakSwitch
143
+ from zepben.protobuf.cim.iec61970.base.wires.PerLengthImpedance_pb2 import PerLengthImpedance as PBPerLengthImpedance
144
+ from zepben.protobuf.cim.iec61970.base.wires.PerLengthLineParameter_pb2 import PerLengthLineParameter as PBPerLengthLineParameter
145
+ from zepben.protobuf.cim.iec61970.base.wires.PerLengthPhaseImpedance_pb2 import PerLengthPhaseImpedance as PBPerLengthPhaseImpedance
146
+ from zepben.protobuf.cim.iec61970.base.wires.PerLengthSequenceImpedance_pb2 import PerLengthSequenceImpedance as PBPerLengthSequenceImpedance
147
+ from zepben.protobuf.cim.iec61970.base.wires.PetersenCoil_pb2 import PetersenCoil as PBPetersenCoil
148
+ from zepben.protobuf.cim.iec61970.base.wires.PhaseImpedanceData_pb2 import PhaseImpedanceData as PBPhaseImpedanceData
149
+ from zepben.protobuf.cim.iec61970.base.wires.PowerElectronicsConnectionPhase_pb2 import PowerElectronicsConnectionPhase as PBPowerElectronicsConnectionPhase
150
+ from zepben.protobuf.cim.iec61970.base.wires.PowerElectronicsConnection_pb2 import PowerElectronicsConnection as PBPowerElectronicsConnection
151
+ from zepben.protobuf.cim.iec61970.base.wires.PowerTransformerEnd_pb2 import PowerTransformerEnd as PBPowerTransformerEnd
152
+ from zepben.protobuf.cim.iec61970.base.wires.PowerTransformer_pb2 import PowerTransformer as PBPowerTransformer
153
+ from zepben.protobuf.cim.iec61970.base.wires.ProtectedSwitch_pb2 import ProtectedSwitch as PBProtectedSwitch
154
+ from zepben.protobuf.cim.iec61970.base.wires.RatioTapChanger_pb2 import RatioTapChanger as PBRatioTapChanger
155
+ from zepben.protobuf.cim.iec61970.base.wires.ReactiveCapabilityCurve_pb2 import ReactiveCapabilityCurve as PBReactiveCapabilityCurve
156
+ from zepben.protobuf.cim.iec61970.base.wires.Recloser_pb2 import Recloser as PBRecloser
157
+ from zepben.protobuf.cim.iec61970.base.wires.RegulatingCondEq_pb2 import RegulatingCondEq as PBRegulatingCondEq
158
+ from zepben.protobuf.cim.iec61970.base.wires.RegulatingControl_pb2 import RegulatingControl as PBRegulatingControl
159
+ from zepben.protobuf.cim.iec61970.base.wires.RotatingMachine_pb2 import RotatingMachine as PBRotatingMachine
160
+ from zepben.protobuf.cim.iec61970.base.wires.SeriesCompensator_pb2 import SeriesCompensator as PBSeriesCompensator
161
+ from zepben.protobuf.cim.iec61970.base.wires.ShuntCompensator_pb2 import ShuntCompensator as PBShuntCompensator
162
+ from zepben.protobuf.cim.iec61970.base.wires.StaticVarCompensator_pb2 import StaticVarCompensator as PBStaticVarCompensator
163
+ from zepben.protobuf.cim.iec61970.base.wires.Switch_pb2 import Switch as PBSwitch
164
+ from zepben.protobuf.cim.iec61970.base.wires.SynchronousMachine_pb2 import SynchronousMachine as PBSynchronousMachine
165
+ from zepben.protobuf.cim.iec61970.base.wires.TapChangerControl_pb2 import TapChangerControl as PBTapChangerControl
166
+ from zepben.protobuf.cim.iec61970.base.wires.TapChanger_pb2 import TapChanger as PBTapChanger
167
+ from zepben.protobuf.cim.iec61970.base.wires.TransformerEnd_pb2 import TransformerEnd as PBTransformerEnd
168
+ from zepben.protobuf.cim.iec61970.base.wires.TransformerStarImpedance_pb2 import TransformerStarImpedance as PBTransformerStarImpedance
169
+ from zepben.protobuf.cim.iec61970.infiec61970.feeder.Circuit_pb2 import Circuit as PBCircuit
170
+
171
+ import zepben.ewb.services.common.resolver as resolver
172
+ from zepben.ewb import IdentifiedObject
173
+ from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import *
174
+ from zepben.ewb.model.cim.extensions.iec61968.metering.pan_demand_reponse_function import PanDemandResponseFunction
175
+ from zepben.ewb.model.cim.extensions.iec61970.base.core.site import *
176
+ from zepben.ewb.model.cim.extensions.iec61970.base.feeder.loop import *
177
+ from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_feeder import *
178
+ from zepben.ewb.model.cim.extensions.iec61970.base.generation.production.ev_charging_unit import *
179
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.distance_relay import *
180
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.power_direction_kind import *
181
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_kind import *
182
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_function import *
183
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_scheme import *
184
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_system import *
185
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.relay_setting import *
186
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.voltage_relay import *
187
+ from zepben.ewb.model.cim.extensions.iec61970.base.wires.battery_control import BatteryControl
188
+ from zepben.ewb.model.cim.extensions.iec61970.base.wires.battery_control_mode import BatteryControlMode
189
+ from zepben.ewb.model.cim.extensions.iec61970.base.wires.transformer_cooling_type import *
190
+ from zepben.ewb.model.cim.extensions.iec61970.base.wires.transformer_end_rated_s import TransformerEndRatedS
191
+ from zepben.ewb.model.cim.extensions.iec61970.base.wires.vector_group import *
192
+ from zepben.ewb.model.cim.iec61968.assetinfo.cable_info import CableInfo
193
+ from zepben.ewb.model.cim.iec61968.assetinfo.no_load_test import *
194
+ from zepben.ewb.model.cim.iec61968.assetinfo.open_circuit_test import *
195
+ from zepben.ewb.model.cim.iec61968.assetinfo.overhead_wire_info import OverheadWireInfo
196
+ from zepben.ewb.model.cim.iec61968.assetinfo.power_transformer_info import *
197
+ from zepben.ewb.model.cim.iec61968.assetinfo.short_circuit_test import *
198
+ from zepben.ewb.model.cim.iec61968.assetinfo.shunt_compensator_info import *
199
+ from zepben.ewb.model.cim.iec61968.assetinfo.switch_info import *
200
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_end_info import *
201
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_tank_info import *
202
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_test import *
203
+ from zepben.ewb.model.cim.iec61968.assetinfo.wire_info import *
204
+ from zepben.ewb.model.cim.iec61968.assetinfo.wire_material_kind import *
205
+ from zepben.ewb.model.cim.iec61968.assets.asset import *
206
+ from zepben.ewb.model.cim.iec61968.assets.asset_container import *
207
+ from zepben.ewb.model.cim.iec61968.assets.asset_function import AssetFunction
208
+ from zepben.ewb.model.cim.iec61968.assets.asset_info import *
209
+ from zepben.ewb.model.cim.iec61968.assets.asset_organisation_role import *
210
+ from zepben.ewb.model.cim.iec61968.assets.asset_owner import *
211
+ from zepben.ewb.model.cim.iec61968.assets.streetlight import *
212
+ from zepben.ewb.model.cim.iec61968.assets.structure import *
213
+ from zepben.ewb.model.cim.iec61968.common.location import *
214
+ from zepben.ewb.model.cim.iec61968.common.position_point import *
215
+ from zepben.ewb.model.cim.iec61968.common.street_address import *
216
+ from zepben.ewb.model.cim.iec61968.common.street_detail import *
217
+ from zepben.ewb.model.cim.iec61968.common.town_detail import *
218
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.current_transformer_info import *
219
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.potential_transformer_info import *
220
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.transformer_construction_kind import *
221
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.transformer_function_kind import *
222
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassets.pole import *
223
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassets.streetlight_lamp_kind import StreetlightLampKind
224
+ from zepben.ewb.model.cim.iec61968.infiec61968.infcommon.ratio import *
225
+ from zepben.ewb.model.cim.iec61968.metering.end_device import *
226
+ from zepben.ewb.model.cim.iec61968.metering.end_device_function import *
227
+ from zepben.ewb.model.cim.iec61968.metering.end_device_function_kind import *
228
+ from zepben.ewb.model.cim.iec61968.metering.meter import *
229
+ from zepben.ewb.model.cim.iec61968.metering.usage_point import *
230
+ from zepben.ewb.model.cim.iec61968.operations.operational_restriction import *
231
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.auxiliary_equipment import *
232
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.current_transformer import *
233
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.fault_indicator import *
234
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.potential_transformer import *
235
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.potential_transformer_kind import *
236
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.sensor import *
237
+ from zepben.ewb.model.cim.iec61970.base.core.ac_dc_terminal import AcDcTerminal
238
+ from zepben.ewb.model.cim.iec61970.base.core.base_voltage import *
239
+ from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import *
240
+ from zepben.ewb.model.cim.iec61970.base.core.connectivity_node import *
241
+ from zepben.ewb.model.cim.iec61970.base.core.connectivity_node_container import *
242
+ from zepben.ewb.model.cim.iec61970.base.core.curve import Curve
243
+ from zepben.ewb.model.cim.iec61970.base.core.curve_data import CurveData
244
+ from zepben.ewb.model.cim.iec61970.base.core.equipment import *
245
+ from zepben.ewb.model.cim.iec61970.base.core.equipment_container import *
246
+ from zepben.ewb.model.cim.iec61970.base.core.feeder import *
247
+ from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
248
+ from zepben.ewb.model.cim.iec61970.base.core.phase_code import *
249
+ from zepben.ewb.model.cim.iec61970.base.core.power_system_resource import *
250
+ from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
251
+ from zepben.ewb.model.cim.iec61970.base.core.substation import *
252
+ from zepben.ewb.model.cim.iec61970.base.core.terminal import *
253
+ from zepben.ewb.model.cim.iec61970.base.domain.unit_symbol import *
254
+ from zepben.ewb.model.cim.iec61970.base.equivalents.equivalent_branch import *
255
+ from zepben.ewb.model.cim.iec61970.base.equivalents.equivalent_equipment import *
256
+ from zepben.ewb.model.cim.iec61970.base.generation.production.battery_state_kind import *
257
+ from zepben.ewb.model.cim.iec61970.base.generation.production.battery_unit import *
258
+ from zepben.ewb.model.cim.iec61970.base.generation.production.photo_voltaic_unit import *
259
+ from zepben.ewb.model.cim.iec61970.base.generation.production.power_electronics_unit import *
260
+ from zepben.ewb.model.cim.iec61970.base.generation.production.power_electronics_wind_unit import *
261
+ from zepben.ewb.model.cim.iec61970.base.meas.accumulator import *
262
+ from zepben.ewb.model.cim.iec61970.base.meas.analog import *
263
+ from zepben.ewb.model.cim.iec61970.base.meas.control import *
264
+ from zepben.ewb.model.cim.iec61970.base.meas.discrete import *
265
+ from zepben.ewb.model.cim.iec61970.base.meas.iopoint import *
266
+ from zepben.ewb.model.cim.iec61970.base.meas.measurement import *
267
+ from zepben.ewb.model.cim.iec61970.base.protection.current_relay import *
268
+ from zepben.ewb.model.cim.iec61970.base.scada.remote_control import *
269
+ from zepben.ewb.model.cim.iec61970.base.scada.remote_point import *
270
+ from zepben.ewb.model.cim.iec61970.base.scada.remote_source import *
271
+ from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment import *
272
+ from zepben.ewb.model.cim.iec61970.base.wires.breaker import Breaker
273
+ from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import *
274
+ from zepben.ewb.model.cim.iec61970.base.wires.clamp import *
275
+ from zepben.ewb.model.cim.iec61970.base.wires.conductor import *
276
+ from zepben.ewb.model.cim.iec61970.base.wires.connector import *
277
+ from zepben.ewb.model.cim.iec61970.base.wires.cut import *
278
+ from zepben.ewb.model.cim.iec61970.base.wires.disconnector import Disconnector
279
+ from zepben.ewb.model.cim.iec61970.base.wires.earth_fault_compensator import EarthFaultCompensator
280
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_connection import *
281
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer import *
282
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer_phase import *
283
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_source import *
284
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_source_phase import *
285
+ from zepben.ewb.model.cim.iec61970.base.wires.fuse import Fuse
286
+ from zepben.ewb.model.cim.iec61970.base.wires.ground import *
287
+ from zepben.ewb.model.cim.iec61970.base.wires.ground_disconnector import *
288
+ from zepben.ewb.model.cim.iec61970.base.wires.grounding_impedance import GroundingImpedance
289
+ from zepben.ewb.model.cim.iec61970.base.wires.jumper import Jumper
290
+ from zepben.ewb.model.cim.iec61970.base.wires.junction import *
291
+ from zepben.ewb.model.cim.iec61970.base.wires.line import *
292
+ from zepben.ewb.model.cim.iec61970.base.wires.linear_shunt_compensator import LinearShuntCompensator
293
+ from zepben.ewb.model.cim.iec61970.base.wires.load_break_switch import LoadBreakSwitch
294
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_impedance import PerLengthImpedance
295
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_line_parameter import PerLengthLineParameter
296
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_phase_impedance import *
297
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
298
+ from zepben.ewb.model.cim.iec61970.base.wires.petersen_coil import PetersenCoil
299
+ from zepben.ewb.model.cim.iec61970.base.wires.phase_impedance_data import *
300
+ from zepben.ewb.model.cim.iec61970.base.wires.phase_shunt_connection_kind import *
301
+ from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection import *
302
+ from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase
303
+ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer import *
304
+ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd
305
+ from zepben.ewb.model.cim.iec61970.base.wires.protected_switch import ProtectedSwitch
306
+ from zepben.ewb.model.cim.iec61970.base.wires.ratio_tap_changer import RatioTapChanger
307
+ from zepben.ewb.model.cim.iec61970.base.wires.reactive_capability_curve import ReactiveCapabilityCurve
308
+ from zepben.ewb.model.cim.iec61970.base.wires.recloser import Recloser
309
+ from zepben.ewb.model.cim.iec61970.base.wires.regulating_cond_eq import *
310
+ from zepben.ewb.model.cim.iec61970.base.wires.regulating_control import *
311
+ from zepben.ewb.model.cim.iec61970.base.wires.regulating_control_mode_kind import *
312
+ from zepben.ewb.model.cim.iec61970.base.wires.rotating_machine import RotatingMachine
313
+ from zepben.ewb.model.cim.iec61970.base.wires.series_compensator import *
314
+ from zepben.ewb.model.cim.iec61970.base.wires.shunt_compensator import *
315
+ from zepben.ewb.model.cim.iec61970.base.wires.single_phase_kind import *
316
+ from zepben.ewb.model.cim.iec61970.base.wires.static_var_compensator import StaticVarCompensator
317
+ from zepben.ewb.model.cim.iec61970.base.wires.svc_control_mode import SVCControlMode
318
+ from zepben.ewb.model.cim.iec61970.base.wires.switch import *
319
+ from zepben.ewb.model.cim.iec61970.base.wires.synchronous_machine import SynchronousMachine
320
+ from zepben.ewb.model.cim.iec61970.base.wires.synchronous_machine_kind import SynchronousMachineKind
321
+ from zepben.ewb.model.cim.iec61970.base.wires.tap_changer import TapChanger
322
+ from zepben.ewb.model.cim.iec61970.base.wires.tap_changer_control import *
323
+ from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
324
+ from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import *
325
+ from zepben.ewb.model.cim.iec61970.base.wires.winding_connection import *
326
+ from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import *
327
+ from zepben.ewb.services.common.translator.base_proto2cim import identified_object_to_cim, organisation_role_to_cim, document_to_cim, add_to_network_or_none, \
328
+ bind_to_cim, get_nullable
329
+ from zepben.ewb.services.common.translator.util import int_or_none, float_or_none, long_or_none, str_or_none, uint_or_none
330
+ from zepben.ewb.services.network.network_service import NetworkService
331
+ from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
332
+
333
+
334
+ ##################################
335
+ # Extensions IEC61968 Asset Info #
336
+ ##################################
337
+
338
+ @bind_to_cim
339
+ @add_to_network_or_none
340
+ def relay_info_to_cim(pb: PBRelayInfo, network_service: NetworkService) -> Optional[RelayInfo]:
341
+ # noinspection PyUnresolvedReferences
342
+ cim = RelayInfo(
343
+ mrid=pb.mrid(),
344
+ curve_setting=get_nullable(pb, 'curveSetting'),
345
+ reclose_fast=get_nullable(pb, 'recloseFast'),
346
+ reclose_delays=list(pb.recloseDelays)
347
+ )
348
+
349
+
350
+ asset_info_to_cim(pb.ai, cim, network_service)
351
+ return cim
352
+
353
+
354
+ ################################
355
+ # Extensions IEC61968 Metering #
356
+ ################################
357
+
358
+ @bind_to_cim
359
+ @add_to_network_or_none
360
+ def pan_demand_response_function_to_cim(pb: PBPanDemandResponseFunction, network_service: NetworkService) -> PanDemandResponseFunction:
361
+ """
362
+ Convert the protobuf :class:`PBPanDemandResponseFunction` into its CIM counterpart.
363
+ :param pb: The protobuf :class:`PBPanDemandResponseFunction` to convert
364
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
365
+ :return: The converted `pb` as a CIM :class:`PanDemandResponseFunction`
366
+ """
367
+ # noinspection PyUnresolvedReferences
368
+ cim = PanDemandResponseFunction(mrid=pb.mrid())
369
+ cim.appliance = get_nullable(pb, 'appliance')
370
+ cim.kind = EndDeviceFunctionKind(pb.kind)
371
+ end_device_function_to_cim(pb.edf, cim, network_service)
372
+
373
+ return cim
374
+
375
+
376
+ #################################
377
+ # Extensions IEC61970 Base Core #
378
+ #################################
379
+
380
+ @bind_to_cim
381
+ @add_to_network_or_none
382
+ def site_to_cim(pb: PBSite, network_service: NetworkService) -> Optional[Site]:
383
+ # noinspection PyUnresolvedReferences
384
+ cim = Site(mrid=pb.mrid())
385
+
386
+ equipment_container_to_cim(pb.ec, cim, network_service)
387
+ return cim
388
+
389
+
390
+ ###################################
391
+ # Extensions IEC61970 Base Feeder #
392
+ ###################################
393
+
394
+ @bind_to_cim
395
+ @add_to_network_or_none
396
+ def loop_to_cim(pb: PBLoop, network_service: NetworkService) -> Optional[Loop]:
397
+ # noinspection PyUnresolvedReferences
398
+ cim = Loop(mrid=pb.mrid())
399
+
400
+ for mrid in pb.circuitMRIDs:
401
+ network_service.resolve_or_defer_reference(resolver.loop_circuits(cim), mrid)
402
+ for mrid in pb.substationMRIDs:
403
+ network_service.resolve_or_defer_reference(resolver.loop_substations(cim), mrid)
404
+ for mrid in pb.normalEnergizingSubstationMRIDs:
405
+ network_service.resolve_or_defer_reference(resolver.loop_energizing_substations(cim), mrid)
406
+
407
+ identified_object_to_cim(pb.io, cim, network_service)
408
+ return cim
409
+
410
+
411
+ @bind_to_cim
412
+ @add_to_network_or_none
413
+ def lv_feeder_to_cim(pb: PBLvFeeder, network_service: NetworkService) -> Optional[LvFeeder]:
414
+ # noinspection PyUnresolvedReferences
415
+ cim = LvFeeder(mrid=pb.mrid())
416
+
417
+ network_service.resolve_or_defer_reference(resolver.lv_feeder_normal_head_terminal(cim), pb.normalHeadTerminalMRID)
418
+ for mrid in pb.normalEnergizingFeederMRIDs:
419
+ network_service.resolve_or_defer_reference(resolver.normal_energizing_feeders(cim), mrid)
420
+ for mrid in pb.currentlyEnergizingFeederMRIDs:
421
+ network_service.resolve_or_defer_reference(resolver.current_energizing_feeders(cim), mrid)
422
+
423
+ equipment_container_to_cim(pb.ec, cim, network_service)
424
+ return cim
425
+
426
+
427
+ ##################################################
428
+ # Extensions IEC61970 Base Generation Production #
429
+ ##################################################
430
+
431
+ @bind_to_cim
432
+ @add_to_network_or_none
433
+ def ev_charging_unit_to_cim(pb: PBEvChargingUnit, network_service: NetworkService) -> Optional[EvChargingUnit]:
434
+ # noinspection PyUnresolvedReferences
435
+ cim = EvChargingUnit(mrid=pb.mrid())
436
+ power_electronics_unit_to_cim(pb.peu, cim, network_service)
437
+ return cim
438
+
439
+ #######################################
440
+ # Extensions IEC61970 Base Protection #
441
+ #######################################
442
+
443
+ @bind_to_cim
444
+ @add_to_network_or_none
445
+ def distance_relay_to_cim(pb: PBDistanceRelay, network_service: NetworkService) -> Optional[DistanceRelay]:
446
+ # noinspection PyUnresolvedReferences
447
+ cim = DistanceRelay(
448
+ mrid=pb.mrid(),
449
+ backward_blind=get_nullable(pb, 'backwardBlind'),
450
+ backward_reach=get_nullable(pb, 'backwardReach'),
451
+ backward_reactance=get_nullable(pb, 'backwardReactance'),
452
+ forward_blind=get_nullable(pb, 'forwardBlind'),
453
+ forward_reach=get_nullable(pb, 'forwardReach'),
454
+ forward_reactance=get_nullable(pb, 'forwardReactance'),
455
+ operation_phase_angle1=get_nullable(pb, 'operationPhaseAngle1'),
456
+ operation_phase_angle2=get_nullable(pb, 'operationPhaseAngle2'),
457
+ operation_phase_angle3=get_nullable(pb, 'operationPhaseAngle3'),
458
+ )
459
+
460
+ protection_relay_function_to_cim(pb.prf, cim, network_service)
461
+ return cim
462
+
463
+
464
+ def protection_relay_function_to_cim(pb: PBProtectionRelayFunction, cim: ProtectionRelayFunction, network_service: NetworkService):
465
+ cim.model = get_nullable(pb, 'model')
466
+ cim.reclosing = get_nullable(pb, 'reclosing')
467
+ for time_limit in pb.timeLimits:
468
+ cim.add_time_limit(time_limit)
469
+ for threshold in pb.thresholds:
470
+ cim.add_threshold(relay_setting_to_cim(threshold))
471
+ cim.relay_delay_time = get_nullable(pb, 'relayDelayTime')
472
+ cim.protection_kind = ProtectionKind(pb.protectionKind)
473
+ for mrid in pb.protectedSwitchMRIDs:
474
+ network_service.resolve_or_defer_reference(resolver.prf_protected_switch(cim), mrid)
475
+ cim.directable = get_nullable(pb, 'directable')
476
+ cim.power_direction = PowerDirectionKind(pb.powerDirection)
477
+ for mrid in pb.sensorMRIDs:
478
+ network_service.resolve_or_defer_reference(resolver.prf_sensor(cim), mrid)
479
+ for mrid in pb.schemeMRIDs:
480
+ network_service.resolve_or_defer_reference(resolver.prf_scheme(cim), mrid)
481
+ # noinspection PyUnresolvedReferences
482
+ network_service.resolve_or_defer_reference(resolver.relay_info(cim), pb.asset_info_mrid())
483
+
484
+ power_system_resource_to_cim(pb.psr, cim, network_service)
485
+
486
+
487
+ @bind_to_cim
488
+ @add_to_network_or_none
489
+ def protection_relay_scheme_to_cim(pb: PBProtectionRelayScheme, network_service: NetworkService) -> Optional[ProtectionRelayScheme]:
490
+ # noinspection PyUnresolvedReferences
491
+ cim = ProtectionRelayScheme(
492
+ mrid=pb.mrid()
493
+ )
494
+
495
+ # TODO: I think I just throw the nullable mrid at the bound resolver safely?
496
+ network_service.resolve_or_defer_reference(resolver.prscheme_system(cim), pb.systemMRID)
497
+
498
+ for mrid in pb.functionMRIDs:
499
+ network_service.resolve_or_defer_reference(resolver.prscheme_function(cim), mrid)
500
+
501
+ identified_object_to_cim(pb.io, cim, network_service)
502
+ return cim
503
+
504
+
505
+ @bind_to_cim
506
+ @add_to_network_or_none
507
+ def protection_relay_system_to_cim(pb: PBProtectionRelaySystem, network_service: NetworkService) -> Optional[ProtectionRelaySystem]:
508
+ # noinspection PyUnresolvedReferences
509
+ cim = ProtectionRelaySystem(
510
+ mrid=pb.mrid(),
511
+ protection_kind=ProtectionKind(pb.protectionKind)
512
+ )
513
+
514
+ for mrid in pb.schemeMRIDs:
515
+ network_service.resolve_or_defer_reference(resolver.prsystem_scheme(cim), mrid)
516
+
517
+ equipment_to_cim(pb.eq, cim, network_service)
518
+ return cim
519
+
520
+
521
+ def relay_setting_to_cim(pb: PBRelaySetting) -> Optional[RelaySetting]:
522
+ return RelaySetting(
523
+ name=get_nullable(pb, 'name'),
524
+ unit_symbol=unit_symbol_from_id(pb.unitSymbol),
525
+ value=float_or_none(pb.value)
526
+ )
527
+
528
+
529
+ @bind_to_cim
530
+ @add_to_network_or_none
531
+ def voltage_relay_to_cim(pb: PBVoltageRelay, network_service: NetworkService) -> Optional[VoltageRelay]:
532
+ # noinspection PyUnresolvedReferences
533
+ cim = VoltageRelay(mrid=pb.mrid())
534
+
535
+ protection_relay_function_to_cim(pb.prf, cim, network_service)
536
+ return cim
537
+
538
+
539
+ ##################################
540
+ # Extensions IEC61970 Base Wires #
541
+ ##################################
542
+
543
+ @bind_to_cim
544
+ @add_to_network_or_none
545
+ def battery_control_to_cim(pb: PBBatteryControl, network_service: NetworkService) -> BatteryControl:
546
+ """
547
+ Convert the protobuf :class:`PBBatteryControl` into its CIM counterpart.
548
+ :param pb: The protobuf :class:`PBBatteryControl` to convert
549
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
550
+ :return: The converted `pb` as a CIM :class:`BatteryControl`
551
+ """
552
+ # noinspection PyUnresolvedReferences
553
+ cim = BatteryControl(
554
+ mrid=pb.mrid(),
555
+ charging_rate=get_nullable(pb, 'chargingRate'),
556
+ discharging_rate=get_nullable(pb, 'dischargingRate'),
557
+ reserve_percent=get_nullable(pb, 'reservePercent'),
558
+ control_mode=BatteryControlMode(pb.controlMode),
559
+ )
560
+
561
+ regulating_control_to_cim(pb.rc, cim, network_service)
562
+
563
+ return cim
564
+
565
+
566
+ #######################
567
+ # IEC61968 Asset Info #
568
+ #######################
569
+
570
+
571
+ @bind_to_cim
572
+ @add_to_network_or_none
573
+ def cable_info_to_cim(pb: PBCableInfo, network_service: NetworkService) -> Optional[CableInfo]:
574
+ # noinspection PyUnresolvedReferences
575
+ cim = CableInfo(mrid=pb.mrid())
576
+
577
+ wire_info_to_cim(pb.wi, cim, network_service)
578
+ return cim
579
+
580
+
581
+ @bind_to_cim
582
+ @add_to_network_or_none
583
+ def no_load_test_to_cim(pb: PBNoLoadTest, network_service: NetworkService) -> Optional[NoLoadTest]:
584
+ # noinspection PyUnresolvedReferences
585
+ cim = NoLoadTest(
586
+ mrid=pb.mrid(),
587
+ energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'),
588
+ exciting_current=get_nullable(pb, 'excitingCurrent'),
589
+ exciting_current_zero=get_nullable(pb, 'excitingCurrentZero'),
590
+ loss=get_nullable(pb, 'loss'),
591
+ loss_zero=get_nullable(pb, 'lossZero'),
592
+ )
593
+
594
+ transformer_test_to_cim(pb.tt, cim, network_service)
595
+ return cim
596
+
597
+
598
+ @bind_to_cim
599
+ @add_to_network_or_none
600
+ def open_circuit_test_to_cim(pb: PBOpenCircuitTest, network_service: NetworkService) -> Optional[OpenCircuitTest]:
601
+ # noinspection PyUnresolvedReferences
602
+ cim = OpenCircuitTest(
603
+ mrid=pb.mrid(),
604
+ energised_end_step=get_nullable(pb, 'energisedEndStep'),
605
+ energised_end_voltage=get_nullable(pb, 'energisedEndVoltage'),
606
+ open_end_step=get_nullable(pb, 'openEndStep'),
607
+ open_end_voltage=get_nullable(pb, 'openEndVoltage'),
608
+ phase_shift=get_nullable(pb, 'phaseShift'),
609
+ )
610
+
611
+ transformer_test_to_cim(pb.tt, cim, network_service)
612
+ return cim
613
+
614
+
615
+ @bind_to_cim
616
+ @add_to_network_or_none
617
+ def overhead_wire_info_to_cim(pb: PBOverheadWireInfo, network_service: NetworkService) -> Optional[OverheadWireInfo]:
618
+ # noinspection PyUnresolvedReferences
619
+ cim = OverheadWireInfo(mrid=pb.mrid())
620
+
621
+ wire_info_to_cim(pb.wi, cim, network_service)
622
+ return cim
623
+
624
+
625
+ @bind_to_cim
626
+ @add_to_network_or_none
627
+ def power_transformer_info_to_cim(pb: PBPowerTransformerInfo, network_service: NetworkService) -> Optional[PowerTransformerInfo]:
628
+ # noinspection PyUnresolvedReferences
629
+ cim = PowerTransformerInfo(mrid=pb.mrid())
630
+
631
+ for mrid in pb.transformerTankInfoMRIDs:
632
+ network_service.resolve_or_defer_reference(resolver.power_transformer_info_transformer_tank_info(cim), mrid)
633
+
634
+ asset_info_to_cim(pb.ai, cim, network_service)
635
+ return cim
636
+
637
+
638
+ @bind_to_cim
639
+ @add_to_network_or_none
640
+ def short_circuit_test_to_cim(pb: PBShortCircuitTest, network_service: NetworkService) -> Optional[ShortCircuitTest]:
641
+ # noinspection PyUnresolvedReferences
642
+ cim = ShortCircuitTest(
643
+ mrid=pb.mrid(),
644
+ current=get_nullable(pb, 'current'),
645
+ energised_end_step=get_nullable(pb, 'energisedEndStep'),
646
+ grounded_end_step=get_nullable(pb, 'groundedEndStep'),
647
+ leakage_impedance=get_nullable(pb, 'leakageImpedance'),
648
+ leakage_impedance_zero=get_nullable(pb, 'leakageImpedanceZero'),
649
+ loss=get_nullable(pb, 'loss'),
650
+ loss_zero=get_nullable(pb, 'lossZero'),
651
+ power=get_nullable(pb, 'power'),
652
+ voltage=get_nullable(pb, 'voltage'),
653
+ voltage_ohmic_part=get_nullable(pb, 'voltageOhmicPart'),
654
+ )
655
+
656
+ transformer_test_to_cim(pb.tt, cim, network_service)
657
+ return cim
658
+
659
+
660
+ @bind_to_cim
661
+ @add_to_network_or_none
662
+ def shunt_compensator_info_to_cim(pb: PBShuntCompensatorInfo, network_service: NetworkService) -> Optional[ShuntCompensatorInfo]:
663
+ # noinspection PyUnresolvedReferences
664
+ cim = ShuntCompensatorInfo(
665
+ mrid=pb.mrid(),
666
+ max_power_loss=get_nullable(pb, 'maxPowerLoss'),
667
+ rated_current=get_nullable(pb, 'ratedCurrent'),
668
+ rated_reactive_power=get_nullable(pb, 'ratedReactivePower'),
669
+ rated_voltage=get_nullable(pb, 'ratedVoltage'),
670
+ )
671
+
672
+ asset_info_to_cim(pb.ai, cim, network_service)
673
+ return cim
674
+
675
+
676
+ @bind_to_cim
677
+ @add_to_network_or_none
678
+ def switch_info_to_cim(pb: PBSwitchInfo, network_service: NetworkService) -> Optional[SwitchInfo]:
679
+ # noinspection PyUnresolvedReferences
680
+ cim = SwitchInfo(
681
+ mrid=pb.mrid(),
682
+ rated_interrupting_time=get_nullable(pb, 'ratedInterruptingTime')
683
+ )
684
+
685
+ asset_info_to_cim(pb.ai, cim, network_service)
686
+ return cim
687
+
688
+
689
+ @bind_to_cim
690
+ @add_to_network_or_none
691
+ def transformer_end_info_to_cim(pb: PBTransformerEndInfo, network_service: NetworkService) -> Optional[TransformerEndInfo]:
692
+ # noinspection PyUnresolvedReferences
693
+ cim = TransformerEndInfo(
694
+ mrid=pb.mrid(),
695
+ connection_kind=WindingConnection(pb.connectionKind),
696
+ emergency_s=get_nullable(pb, 'emergencyS'),
697
+ end_number=pb.endNumber,
698
+ insulation_u=get_nullable(pb, 'insulationU'),
699
+ phase_angle_clock=get_nullable(pb, 'phaseAngleClock'),
700
+ r=get_nullable(pb, 'r'),
701
+ rated_s=get_nullable(pb, 'ratedS'),
702
+ rated_u=get_nullable(pb, 'ratedU'),
703
+ short_term_s=get_nullable(pb, 'shortTermS'),
704
+ )
705
+
706
+ network_service.resolve_or_defer_reference(resolver.transformer_tank_info(cim), pb.transformerTankInfoMRID)
707
+ network_service.resolve_or_defer_reference(resolver.transformer_star_impedance(cim), pb.transformerStarImpedanceMRID)
708
+ network_service.resolve_or_defer_reference(resolver.energised_end_no_load_tests(cim), pb.energisedEndNoLoadTestsMRID)
709
+ network_service.resolve_or_defer_reference(resolver.energised_end_short_circuit_tests(cim), pb.energisedEndShortCircuitTestsMRID)
710
+ network_service.resolve_or_defer_reference(resolver.grounded_end_short_circuit_tests(cim), pb.groundedEndShortCircuitTestsMRID)
711
+ network_service.resolve_or_defer_reference(resolver.open_end_open_circuit_tests(cim), pb.openEndOpenCircuitTestsMRID)
712
+ network_service.resolve_or_defer_reference(resolver.energised_end_open_circuit_tests(cim), pb.energisedEndOpenCircuitTestsMRID)
713
+
714
+ asset_info_to_cim(pb.ai, cim, network_service)
715
+ return cim
716
+
717
+
718
+ @bind_to_cim
719
+ @add_to_network_or_none
720
+ def transformer_tank_info_to_cim(pb: PBTransformerTankInfo, network_service: NetworkService) -> Optional[TransformerTankInfo]:
721
+ # noinspection PyUnresolvedReferences
722
+ cim = TransformerTankInfo(mrid=pb.mrid())
723
+
724
+ for mrid in pb.transformerEndInfoMRIDs:
725
+ network_service.resolve_or_defer_reference(resolver.transformer_end_info(cim), mrid)
726
+
727
+ asset_info_to_cim(pb.ai, cim, network_service)
728
+ return cim
729
+
730
+
731
+ def transformer_test_to_cim(pb: PBTransformerTest, cim: TransformerTest, network_service: NetworkService):
732
+ cim.base_power = get_nullable(pb, 'basePower')
733
+ cim.temperature = get_nullable(pb, 'temperature')
734
+
735
+ identified_object_to_cim(pb.io, cim, network_service)
736
+
737
+
738
+ def wire_info_to_cim(pb: PBWireInfo, cim: WireInfo, network_service: NetworkService):
739
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
740
+ cim.material = WireMaterialKind(pb.material)
741
+
742
+ asset_info_to_cim(pb.ai, cim, network_service)
743
+
744
+
745
+ ###################
746
+ # IEC61968 Assets #
747
+ ###################
748
+
749
+ def asset_to_cim(pb: PBAsset, cim: Asset, network_service: NetworkService):
750
+ network_service.resolve_or_defer_reference(resolver.at_location(cim), pb.locationMRID)
751
+
752
+ for mrid in pb.organisationRoleMRIDs:
753
+ network_service.resolve_or_defer_reference(resolver.organisation_roles(cim), mrid)
754
+
755
+ for mrid in pb.powerSystemResourceMRIDs:
756
+ network_service.resolve_or_defer_reference(resolver.power_system_resources(cim), mrid)
757
+
758
+ identified_object_to_cim(pb.io, cim, network_service)
759
+
760
+
761
+ def asset_container_to_cim(pb: PBAssetContainer, cim: AssetContainer, network_service: NetworkService):
762
+ asset_to_cim(pb.at, cim, network_service)
763
+
764
+
765
+ def asset_function_to_cim(pb: PBAssetFunction, cim: AssetFunction, network_service: NetworkService):
766
+ """
767
+ Convert the protobuf :class:`PBAssetFunction` into its CIM counterpart.
768
+ :param pb: The protobuf :class:`PBAssetFunction` to convert.
769
+ :param cim: The CIM :class:`AssetFunction` undergoing construction.
770
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
771
+ :return: The converted `pb` as a CIM :class:`AssetFunction`
772
+ """
773
+ identified_object_to_cim(pb.io, cim, network_service)
774
+
775
+
776
+ def asset_info_to_cim(pb: PBAssetInfo, cim: AssetInfo, network_service: NetworkService):
777
+ identified_object_to_cim(pb.io, cim, network_service)
778
+
779
+
780
+ def asset_organisation_role_to_cim(pb: PBAssetOrganisationRole, cim: AssetOrganisationRole,
781
+ network_service: NetworkService):
782
+ organisation_role_to_cim(getattr(pb, "or"), cim, network_service)
783
+
784
+
785
+ @bind_to_cim
786
+ @add_to_network_or_none
787
+ def asset_owner_to_cim(pb: PBAssetOwner, network_service: NetworkService) -> Optional[AssetOwner]:
788
+ # noinspection PyUnresolvedReferences
789
+ cim = AssetOwner(mrid=pb.mrid())
790
+
791
+ asset_organisation_role_to_cim(pb.aor, cim, network_service)
792
+ return cim
793
+
794
+
795
+ @bind_to_cim
796
+ @add_to_network_or_none
797
+ def streetlight_to_cim(pb: PBStreetlight, network_service: NetworkService) -> Optional[Streetlight]:
798
+ # noinspection PyUnresolvedReferences
799
+ cim = Streetlight(
800
+ mrid=pb.mrid(),
801
+ light_rating=get_nullable(pb, 'lightRating'),
802
+ lamp_kind=StreetlightLampKind(pb.lampKind)
803
+ )
804
+
805
+ network_service.resolve_or_defer_reference(resolver.pole(cim), pb.poleMRID)
806
+
807
+ asset_to_cim(pb.at, cim, network_service)
808
+ return cim
809
+
810
+
811
+ def structure_to_cim(pb: PBStructure, cim: Structure, network_service: NetworkService):
812
+ asset_container_to_cim(pb.ac, cim, network_service)
813
+
814
+
815
+ ###################
816
+ # IEC61968 Common #
817
+ ###################
818
+
819
+ @bind_to_cim
820
+ @add_to_network_or_none
821
+ def location_to_cim(pb: PBLocation, network_service: NetworkService) -> Optional[Location]:
822
+ # noinspection PyUnresolvedReferences
823
+ cim = Location(mrid=pb.mrid(), main_address=street_address_to_cim(pb.mainAddress) if pb.HasField("mainAddress") else None)
824
+
825
+ for point in pb.positionPoints:
826
+ cim.add_point(position_point_to_cim(point))
827
+
828
+ identified_object_to_cim(pb.io, cim, network_service)
829
+ return cim
830
+
831
+
832
+ def position_point_to_cim(pb: PBPositionPoint) -> Optional[PositionPoint]:
833
+ return PositionPoint(pb.xPosition, pb.yPosition)
834
+
835
+
836
+ def street_address_to_cim(pb: PBStreetAddress) -> Optional[StreetAddress]:
837
+ return StreetAddress(
838
+ postal_code=get_nullable(pb, 'postalCode'),
839
+ town_detail=town_detail_to_cim(pb.townDetail) if pb.HasField("townDetail") else None,
840
+ po_box=get_nullable(pb, 'poBox'),
841
+ street_detail=street_detail_to_cim(pb.streetDetail) if pb.HasField("streetDetail") else None
842
+ )
843
+
844
+
845
+ def street_detail_to_cim(pb: PBStreetDetail) -> Optional[StreetDetail]:
846
+ return StreetDetail(
847
+ building_name=get_nullable(pb, 'buildingName'),
848
+ floor_identification=get_nullable(pb, 'floorIdentification'),
849
+ name=get_nullable(pb, 'name'),
850
+ number=get_nullable(pb, 'number'),
851
+ suite_number=get_nullable(pb, 'suiteNumber'),
852
+ type=get_nullable(pb, 'type'),
853
+ display_address=get_nullable(pb, 'displayAddress'),
854
+ )
855
+
856
+
857
+ def town_detail_to_cim(pb: PBTownDetail) -> Optional[TownDetail]:
858
+ return TownDetail(
859
+ name=get_nullable(pb, 'name'),
860
+ state_or_province=get_nullable(pb, 'stateOrProvince'),
861
+ )
862
+
863
+
864
+ #####################################
865
+ # IEC61968 InfIEC61968 InfAssetInfo #
866
+ #####################################
867
+
868
+ @bind_to_cim
869
+ @add_to_network_or_none
870
+ def current_transformer_info_to_cim(pb: PBCurrentTransformerInfo, network_service: NetworkService) -> Optional[CurrentTransformerInfo]:
871
+ # noinspection PyUnresolvedReferences
872
+ cim = CurrentTransformerInfo(
873
+ mrid=pb.mrid(),
874
+ accuracy_class=get_nullable(pb, 'accuracyClass'),
875
+ accuracy_limit=get_nullable(pb, 'accuracyLimit'),
876
+ core_count=get_nullable(pb, 'coreCount'),
877
+ ct_class=get_nullable(pb, 'ctClass'),
878
+ knee_point_voltage=get_nullable(pb, 'kneePointVoltage'),
879
+ max_ratio=ratio_to_cim(pb.maxRatio) if pb.HasField("maxRatio") else None,
880
+ nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None,
881
+ primary_ratio=get_nullable(pb, 'primaryRatio'),
882
+ rated_current=get_nullable(pb, 'ratedCurrent'),
883
+ secondary_fls_rating=get_nullable(pb, 'secondaryFlsRating'),
884
+ secondary_ratio=get_nullable(pb, 'secondaryRatio'),
885
+ usage=get_nullable(pb, 'usage'),
886
+ )
887
+
888
+ asset_info_to_cim(pb.ai, cim, network_service)
889
+ return cim
890
+
891
+
892
+ @bind_to_cim
893
+ @add_to_network_or_none
894
+ def potential_transformer_info_to_cim(pb: PBPotentialTransformerInfo, network_service: NetworkService) -> Optional[PotentialTransformerInfo]:
895
+ # noinspection PyUnresolvedReferences
896
+ cim = PotentialTransformerInfo(
897
+ mrid=pb.mrid(),
898
+ accuracy_class=get_nullable(pb, 'accuracyClass'),
899
+ nominal_ratio=ratio_to_cim(pb.nominalRatio) if pb.HasField("nominalRatio") else None,
900
+ primary_ratio=get_nullable(pb, 'primaryRatio'),
901
+ pt_class=get_nullable(pb, 'ptClass'),
902
+ rated_voltage=get_nullable(pb, 'ratedVoltage'),
903
+ secondary_ratio=get_nullable(pb, 'secondaryRatio'),
904
+ )
905
+
906
+ asset_info_to_cim(pb.ai, cim, network_service)
907
+ return cim
908
+
909
+
910
+ ##################################
911
+ # IEC61968 InfIEC61968 InfAssets #
912
+ ##################################
913
+
914
+ @bind_to_cim
915
+ @add_to_network_or_none
916
+ def pole_to_cim(pb: PBPole, network_service: NetworkService) -> Optional[Pole]:
917
+ # noinspection PyUnresolvedReferences
918
+ cim = Pole(
919
+ mrid=pb.mrid(),
920
+ classification=get_nullable(pb, 'classification')
921
+ )
922
+
923
+ for mrid in pb.streetlightMRIDs:
924
+ network_service.resolve_or_defer_reference(resolver.streetlights(cim), mrid)
925
+
926
+ structure_to_cim(pb.st, cim, network_service)
927
+ return cim
928
+
929
+
930
+ ##################################
931
+ # IEC61968 InfIEC61968 InfCommon #
932
+ ##################################
933
+
934
+ @bind_to_cim
935
+ def ratio_to_cim(pb: PBRatio) -> Ratio:
936
+ return Ratio(pb.numerator, pb.denominator)
937
+
938
+
939
+ #####################
940
+ # IEC61968 Metering #
941
+ #####################
942
+
943
+
944
+ def end_device_to_cim(pb: PBEndDevice, cim: EndDevice, network_service: NetworkService):
945
+ """
946
+ Convert the protobuf :class:`PBEndDevice` into its CIM counterpart.
947
+ :param pb: The protobuf :class:`PBEndDevice` to convert.
948
+ :param cim: The CIM :class:`EndDevice` undergoing construction.
949
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
950
+ :return: The converted `pb` as a CIM :class:`EndDevice`
951
+ """
952
+ cim.customer_mrid = pb.customerMRID if pb.customerMRID else None
953
+
954
+ for mrid in pb.usagePointMRIDs:
955
+ network_service.resolve_or_defer_reference(resolver.ed_usage_points(cim), mrid)
956
+
957
+ for mrid in pb.endDeviceFunctionMRIDs:
958
+ network_service.resolve_or_defer_reference(resolver.end_device_functions(cim), mrid)
959
+
960
+ network_service.resolve_or_defer_reference(resolver.service_location(cim), pb.serviceLocationMRID)
961
+ asset_container_to_cim(pb.ac, cim, network_service)
962
+
963
+
964
+ def end_device_function_to_cim(pb: PBEndDeviceFunction, cim: EndDeviceFunction, network_service: NetworkService):
965
+ """
966
+ Convert the protobuf :class:`PBEndDeviceFunction` into its CIM counterpart.
967
+ :param pb: The protobuf :class:`PBEndDeviceFunction` to convert.
968
+ :param cim: The CIM :class:`EndDeviceFunction` undergoing construction.
969
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
970
+ :return: The converted `pb` as a CIM :class:`EndDeviceFunction`
971
+ """
972
+ cim.enabled = None if pb.HasField("enabledNull") else pb.enabledSet
973
+ asset_function_to_cim(pb.af, cim, network_service)
974
+
975
+
976
+ @bind_to_cim
977
+ @add_to_network_or_none
978
+ def meter_to_cim(pb: PBMeter, network_service: NetworkService) -> Optional[Meter]:
979
+ # noinspection PyUnresolvedReferences
980
+ cim = Meter(mrid=pb.mrid())
981
+
982
+ end_device_to_cim(pb.ed, cim, network_service)
983
+ return cim
984
+
985
+
986
+ @bind_to_cim
987
+ @add_to_network_or_none
988
+ def usage_point_to_cim(pb: PBUsagePoint, network_service: NetworkService) -> Optional[UsagePoint]:
989
+ # noinspection PyUnresolvedReferences
990
+ cim = UsagePoint(mrid=pb.mrid())
991
+
992
+ network_service.resolve_or_defer_reference(resolver.usage_point_location(cim), pb.usagePointLocationMRID)
993
+ cim.is_virtual = get_nullable(pb, 'isVirtual')
994
+ cim.connection_category = get_nullable(pb, 'connectionCategory')
995
+ cim.rated_power = get_nullable(pb, 'ratedPower')
996
+ cim.approved_inverter_capacity = get_nullable(pb, 'approvedInverterCapacity')
997
+ cim.phase_code = phase_code_by_id(pb.phaseCode)
998
+
999
+ for mrid in pb.equipmentMRIDs:
1000
+ network_service.resolve_or_defer_reference(resolver.up_equipment(cim), mrid)
1001
+ for mrid in pb.endDeviceMRIDs:
1002
+ network_service.resolve_or_defer_reference(resolver.end_devices(cim), mrid)
1003
+
1004
+ identified_object_to_cim(pb.io, cim, network_service)
1005
+ return cim
1006
+
1007
+
1008
+ #######################
1009
+ # IEC61968 Operations #
1010
+ #######################
1011
+
1012
+ @bind_to_cim
1013
+ @add_to_network_or_none
1014
+ def operational_restriction_to_cim(pb: PBOperationalRestriction, network_service: NetworkService) -> Optional[OperationalRestriction]:
1015
+ # noinspection PyUnresolvedReferences
1016
+ cim = OperationalRestriction(mrid=pb.mrid())
1017
+ document_to_cim(pb.doc, cim, network_service)
1018
+ return cim
1019
+
1020
+
1021
+ #####################################
1022
+ # IEC61970 Base Auxiliary Equipment #
1023
+ #####################################
1024
+
1025
+ def auxiliary_equipment_to_cim(pb: PBAuxiliaryEquipment, cim: AuxiliaryEquipment, network_service: NetworkService):
1026
+ network_service.resolve_or_defer_reference(resolver.ae_terminal(cim), pb.terminalMRID)
1027
+
1028
+ equipment_to_cim(pb.eq, cim, network_service)
1029
+
1030
+
1031
+ @bind_to_cim
1032
+ @add_to_network_or_none
1033
+ def current_transformer_to_cim(pb: PBCurrentTransformer, network_service: NetworkService) -> Optional[CurrentTransformer]:
1034
+ # noinspection PyUnresolvedReferences
1035
+ cim = CurrentTransformer(mrid=pb.mrid(), core_burden=int_or_none(get_nullable(pb, 'coreBurden')))
1036
+
1037
+ # noinspection PyUnresolvedReferences
1038
+ network_service.resolve_or_defer_reference(resolver.current_transformer_info(cim), pb.asset_info_mrid())
1039
+
1040
+ sensor_to_cim(pb.sn, cim, network_service)
1041
+ return cim
1042
+
1043
+
1044
+ @bind_to_cim
1045
+ @add_to_network_or_none
1046
+ def fault_indicator_to_cim(pb: PBFaultIndicator, network_service: NetworkService) -> Optional[FaultIndicator]:
1047
+ # noinspection PyUnresolvedReferences
1048
+ cim = FaultIndicator(mrid=pb.mrid())
1049
+
1050
+ auxiliary_equipment_to_cim(pb.ae, cim, network_service)
1051
+ return cim
1052
+
1053
+
1054
+ @bind_to_cim
1055
+ @add_to_network_or_none
1056
+ def potential_transformer_to_cim(pb: PBPotentialTransformer, network_service: NetworkService) -> Optional[PotentialTransformer]:
1057
+ # noinspection PyUnresolvedReferences
1058
+ cim = PotentialTransformer(mrid=pb.mrid(), type=PotentialTransformerKind(pb.type))
1059
+
1060
+ # noinspection PyUnresolvedReferences
1061
+ network_service.resolve_or_defer_reference(resolver.potential_transformer_info(cim), pb.asset_info_mrid())
1062
+
1063
+ sensor_to_cim(pb.sn, cim, network_service)
1064
+ return cim
1065
+
1066
+
1067
+ def sensor_to_cim(pb: PBSensor, cim: Sensor, network_service: NetworkService):
1068
+ for mrid in pb.relayFunctionMRIDs:
1069
+ network_service.resolve_or_defer_reference(resolver.sen_relay_function(cim), mrid)
1070
+ auxiliary_equipment_to_cim(pb.ae, cim, network_service)
1071
+
1072
+
1073
+ ######################
1074
+ # IEC61970 Base Core #
1075
+ ######################
1076
+
1077
+ def ac_dc_terminal_to_cim(pb: PBAcDcTerminal, cim: AcDcTerminal, network_service: NetworkService):
1078
+ identified_object_to_cim(pb.io, cim, network_service)
1079
+
1080
+
1081
+ @bind_to_cim
1082
+ @add_to_network_or_none
1083
+ def base_voltage_to_cim(pb: PBBaseVoltage, network_service: NetworkService) -> Optional[BaseVoltage]:
1084
+ # noinspection PyUnresolvedReferences
1085
+ cim = BaseVoltage(mrid=pb.mrid(), nominal_voltage=pb.nominalVoltage)
1086
+
1087
+ identified_object_to_cim(pb.io, cim, network_service)
1088
+ return cim
1089
+
1090
+
1091
+ def conducting_equipment_to_cim(pb: PBConductingEquipment, cim: ConductingEquipment, network_service: NetworkService):
1092
+ network_service.resolve_or_defer_reference(resolver.ce_base_voltage(cim), pb.baseVoltageMRID)
1093
+ for mrid in pb.terminalMRIDs:
1094
+ network_service.resolve_or_defer_reference(resolver.ce_terminals(cim), mrid)
1095
+
1096
+ equipment_to_cim(pb.eq, cim, network_service)
1097
+
1098
+
1099
+ @bind_to_cim
1100
+ @add_to_network_or_none
1101
+ def connectivity_node_to_cim(pb: PBConnectivityNode, network_service: NetworkService) -> Optional[ConnectivityNode]:
1102
+ # noinspection PyUnresolvedReferences
1103
+ cim = ConnectivityNode(mrid=pb.mrid())
1104
+
1105
+ identified_object_to_cim(pb.io, cim, network_service)
1106
+ return cim
1107
+
1108
+
1109
+ def connectivity_node_container_to_cim(pb: PBConnectivityNodeContainer, cim: ConnectivityNodeContainer, network_service: NetworkService):
1110
+ power_system_resource_to_cim(pb.psr, cim, network_service)
1111
+
1112
+
1113
+ def curve_to_cim(pb: PBCurve, cim: Curve, network_service: NetworkService):
1114
+ for curve_data in pb.curveData:
1115
+ cim.add_curve_data(curve_data_to_cim(curve_data))
1116
+
1117
+ identified_object_to_cim(pb.io, cim, network_service)
1118
+
1119
+
1120
+ def curve_data_to_cim(pb: PBCurveData) -> Optional[CurveData]:
1121
+ return CurveData(
1122
+ pb.xValue,
1123
+ pb.y1Value,
1124
+ get_nullable(pb, 'y2Value'),
1125
+ get_nullable(pb, 'y3Value'),
1126
+ )
1127
+
1128
+
1129
+ def equipment_to_cim(pb: PBEquipment, cim: Equipment, network_service: NetworkService):
1130
+ cim.in_service = pb.inService
1131
+ cim.normally_in_service = pb.normallyInService
1132
+ cim.commissioned_date = pb.commissionedDate.ToDatetime() if pb.HasField("commissionedDate") else None
1133
+
1134
+ for mrid in pb.equipmentContainerMRIDs:
1135
+ network_service.resolve_or_defer_reference(resolver.containers(cim), mrid)
1136
+ for mrid in pb.usagePointMRIDs:
1137
+ network_service.resolve_or_defer_reference(resolver.eq_usage_points(cim), mrid)
1138
+ for mrid in pb.operationalRestrictionMRIDs:
1139
+ network_service.resolve_or_defer_reference(resolver.operational_restrictions(cim), mrid)
1140
+ for mrid in pb.currentContainerMRIDs:
1141
+ network_service.resolve_or_defer_reference(resolver.current_containers(cim), mrid)
1142
+
1143
+ power_system_resource_to_cim(pb.psr, cim, network_service)
1144
+
1145
+
1146
+ def equipment_container_to_cim(pb: PBEquipmentContainer, cim: EquipmentContainer, network_service: NetworkService):
1147
+ connectivity_node_container_to_cim(pb.cnc, cim, network_service)
1148
+
1149
+
1150
+ @bind_to_cim
1151
+ @add_to_network_or_none
1152
+ def feeder_to_cim(pb: PBFeeder, network_service: NetworkService) -> Optional[Feeder]:
1153
+ # noinspection PyUnresolvedReferences
1154
+ cim = Feeder(mrid=pb.mrid())
1155
+
1156
+ network_service.resolve_or_defer_reference(resolver.normal_head_terminal(cim), pb.normalHeadTerminalMRID)
1157
+ network_service.resolve_or_defer_reference(resolver.normal_energizing_substation(cim), pb.normalEnergizingSubstationMRID)
1158
+ for mrid in pb.normalEnergizedLvFeederMRIDs:
1159
+ network_service.resolve_or_defer_reference(resolver.normal_energized_lv_feeders(cim), mrid)
1160
+ for mrid in pb.currentlyEnergizedLvFeedersMRIDs:
1161
+ network_service.resolve_or_defer_reference(resolver.current_energized_lv_feeders(cim), mrid)
1162
+
1163
+ equipment_container_to_cim(pb.ec, cim, network_service)
1164
+ return cim
1165
+
1166
+
1167
+ @bind_to_cim
1168
+ @add_to_network_or_none
1169
+ def geographical_region_to_cim(pb: PBGeographicalRegion, network_service: NetworkService) -> Optional[GeographicalRegion]:
1170
+ # noinspection PyUnresolvedReferences
1171
+ cim = GeographicalRegion(mrid=pb.mrid())
1172
+
1173
+ for mrid in pb.subGeographicalRegionMRIDs:
1174
+ network_service.resolve_or_defer_reference(resolver.sub_geographical_regions(cim), mrid)
1175
+
1176
+ identified_object_to_cim(pb.io, cim, network_service)
1177
+ return cim
1178
+
1179
+
1180
+ def power_system_resource_to_cim(pb: PBPowerSystemResource, cim: PowerSystemResource, network_service: NetworkService):
1181
+ network_service.resolve_or_defer_reference(resolver.psr_location(cim), pb.locationMRID)
1182
+
1183
+ for mrid in pb.assetMRIDs:
1184
+ network_service.resolve_or_defer_reference(resolver.assets(cim), mrid)
1185
+
1186
+ identified_object_to_cim(pb.io, cim, network_service)
1187
+
1188
+
1189
+ @bind_to_cim
1190
+ @add_to_network_or_none
1191
+ def sub_geographical_region_to_cim(pb: PBSubGeographicalRegion, network_service: NetworkService) -> Optional[SubGeographicalRegion]:
1192
+ # noinspection PyUnresolvedReferences
1193
+ cim = SubGeographicalRegion(mrid=pb.mrid())
1194
+
1195
+ network_service.resolve_or_defer_reference(resolver.geographical_region(cim), pb.geographicalRegionMRID)
1196
+ for mrid in pb.substationMRIDs:
1197
+ network_service.resolve_or_defer_reference(resolver.substations(cim), mrid)
1198
+
1199
+ identified_object_to_cim(pb.io, cim, network_service)
1200
+ return cim
1201
+
1202
+
1203
+ @bind_to_cim
1204
+ @add_to_network_or_none
1205
+ def substation_to_cim(pb: PBSubstation, network_service: NetworkService) -> Optional[Substation]:
1206
+ # noinspection PyUnresolvedReferences
1207
+ cim = Substation(mrid=pb.mrid())
1208
+
1209
+ network_service.resolve_or_defer_reference(resolver.sub_geographical_region(cim), pb.subGeographicalRegionMRID)
1210
+ for mrid in pb.normalEnergizedFeederMRIDs:
1211
+ network_service.resolve_or_defer_reference(resolver.normal_energized_feeders(cim), mrid)
1212
+ for mrid in pb.loopMRIDs:
1213
+ network_service.resolve_or_defer_reference(resolver.loops(cim), mrid)
1214
+ for mrid in pb.normalEnergizedLoopMRIDs:
1215
+ network_service.resolve_or_defer_reference(resolver.normal_energized_loops(cim), mrid)
1216
+ for mrid in pb.circuitMRIDs:
1217
+ network_service.resolve_or_defer_reference(resolver.circuits(cim), mrid)
1218
+
1219
+ equipment_container_to_cim(pb.ec, cim, network_service)
1220
+ return cim
1221
+
1222
+
1223
+ @bind_to_cim
1224
+ @add_to_network_or_none
1225
+ def terminal_to_cim(pb: PBTerminal, network_service: NetworkService) -> Optional[Terminal]:
1226
+ # noinspection PyUnresolvedReferences
1227
+ cim = Terminal(
1228
+ mrid=pb.mrid(),
1229
+ phases=phase_code_by_id(pb.phases),
1230
+ sequence_number=pb.sequenceNumber,
1231
+ normal_feeder_direction=FeederDirection(pb.normalFeederDirection),
1232
+ current_feeder_direction=FeederDirection(pb.currentFeederDirection),
1233
+ )
1234
+
1235
+ network_service.resolve_or_defer_reference(resolver.conducting_equipment(cim), pb.conductingEquipmentMRID)
1236
+ network_service.resolve_or_defer_reference(resolver.connectivity_node(cim), pb.connectivityNodeMRID)
1237
+
1238
+ ac_dc_terminal_to_cim(pb.ad, cim, network_service)
1239
+ return cim
1240
+
1241
+
1242
+ #############################
1243
+ # IEC61970 Base Equivalents #
1244
+ #############################
1245
+
1246
+ @bind_to_cim
1247
+ @add_to_network_or_none
1248
+ def equivalent_branch_to_cim(pb: PBEquivalentBranch, network_service: NetworkService) -> Optional[EquivalentBranch]:
1249
+ # noinspection PyUnresolvedReferences
1250
+ cim = EquivalentBranch(
1251
+ mrid=pb.mrid(),
1252
+ negative_r12=get_nullable(pb, 'negativeR12'),
1253
+ negative_r21=get_nullable(pb, 'negativeR21'),
1254
+ negative_x12=get_nullable(pb, 'negativeX12'),
1255
+ negative_x21=get_nullable(pb, 'negativeX21'),
1256
+ positive_r12=get_nullable(pb, 'positiveR12'),
1257
+ positive_r21=get_nullable(pb, 'positiveR21'),
1258
+ positive_x12=get_nullable(pb, 'positiveX12'),
1259
+ positive_x21=get_nullable(pb, 'positiveX21'),
1260
+ r=get_nullable(pb, 'r'),
1261
+ r21=get_nullable(pb, 'r21'),
1262
+ x=get_nullable(pb, 'x'),
1263
+ x21=get_nullable(pb, 'x21'),
1264
+ zero_r12=get_nullable(pb, 'zeroR12'),
1265
+ zero_r21=get_nullable(pb, 'zeroR21'),
1266
+ zero_x12=get_nullable(pb, 'zeroX12'),
1267
+ zero_x21=get_nullable(pb, 'zeroX21'),
1268
+ )
1269
+
1270
+ equivalent_equipment_to_cim(pb.ee, cim, network_service)
1271
+ return cim
1272
+
1273
+
1274
+ def equivalent_equipment_to_cim(pb: PBEquivalentEquipment, cim: EquivalentEquipment, network_service: NetworkService):
1275
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1276
+
1277
+
1278
+ #######################################
1279
+ # IEC61970 Base Generation Production #
1280
+ #######################################
1281
+
1282
+ @bind_to_cim
1283
+ @add_to_network_or_none
1284
+ def battery_unit_to_cim(pb: PBBatteryUnit, network_service: NetworkService) -> Optional[BatteryUnit]:
1285
+ """
1286
+ Convert the protobuf :class:`PBBatteryUnit` into its CIM counterpart.
1287
+ :param pb: The protobuf :class:`PBBatteryUnit` to convert.
1288
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
1289
+ :return: The converted `pb` as a CIM :class:`BatteryUnit`
1290
+ """
1291
+ # noinspection PyUnresolvedReferences
1292
+ cim = BatteryUnit(
1293
+ mrid=pb.mrid(),
1294
+ battery_state=BatteryStateKind(pb.batteryState),
1295
+ rated_e=get_nullable(pb, "ratedE"),
1296
+ stored_e=get_nullable(pb, "storedE"),
1297
+ )
1298
+
1299
+ for mrid in pb.batteryControlMRIDs:
1300
+ network_service.resolve_or_defer_reference(resolver.battery_controls(cim), mrid)
1301
+
1302
+ power_electronics_unit_to_cim(pb.peu, cim, network_service)
1303
+ return cim
1304
+
1305
+
1306
+ @bind_to_cim
1307
+ @add_to_network_or_none
1308
+ def photo_voltaic_unit_to_cim(pb: PBPhotoVoltaicUnit, network_service: NetworkService) -> Optional[PhotoVoltaicUnit]:
1309
+ # noinspection PyUnresolvedReferences
1310
+ cim = PhotoVoltaicUnit(mrid=pb.mrid())
1311
+
1312
+ power_electronics_unit_to_cim(pb.peu, cim, network_service)
1313
+ return cim
1314
+
1315
+
1316
+ def power_electronics_unit_to_cim(pb: PBPowerElectronicsUnit, cim: PowerElectronicsUnit, network_service: NetworkService):
1317
+ cim.max_p = get_nullable(pb, 'maxP')
1318
+ cim.min_p = get_nullable(pb, 'minP')
1319
+
1320
+ network_service.resolve_or_defer_reference(resolver.unit_power_electronics_connection(cim), pb.powerElectronicsConnectionMRID)
1321
+
1322
+ equipment_to_cim(pb.eq, cim, network_service)
1323
+
1324
+
1325
+ @bind_to_cim
1326
+ @add_to_network_or_none
1327
+ def power_electronics_wind_unit_to_cim(pb: PBPowerElectronicsWindUnit, network_service: NetworkService) -> Optional[PowerElectronicsWindUnit]:
1328
+ # noinspection PyUnresolvedReferences
1329
+ cim = PowerElectronicsWindUnit(mrid=pb.mrid())
1330
+
1331
+ power_electronics_unit_to_cim(pb.peu, cim, network_service)
1332
+ return cim
1333
+
1334
+
1335
+ ######################
1336
+ # IEC61970 Base Meas #
1337
+ ######################
1338
+
1339
+ @bind_to_cim
1340
+ @add_to_network_or_none
1341
+ def accumulator_to_cim(pb: PBAccumulator, network_service: NetworkService) -> Optional[Accumulator]:
1342
+ # noinspection PyUnresolvedReferences
1343
+ cim = Accumulator(mrid=pb.mrid())
1344
+
1345
+ measurement_to_cim(pb.measurement, cim, network_service)
1346
+ return cim
1347
+
1348
+
1349
+ @bind_to_cim
1350
+ @add_to_network_or_none
1351
+ def analog_to_cim(pb: PBAnalog, network_service: NetworkService) -> Optional[Analog]:
1352
+ # noinspection PyUnresolvedReferences
1353
+ cim = Analog(mrid=pb.mrid(), positive_flow_in=get_nullable(pb, "positiveFlowIn"))
1354
+
1355
+ measurement_to_cim(pb.measurement, cim, network_service)
1356
+ return cim
1357
+
1358
+ @bind_to_cim
1359
+ @add_to_network_or_none
1360
+ def control_to_cim(pb: PBControl, network_service: NetworkService) -> Optional[Control]:
1361
+ # noinspection PyUnresolvedReferences
1362
+ cim = Control(
1363
+ mrid=pb.mrid(),
1364
+ # noinspection PyUnresolvedReferences
1365
+ power_system_resource_mrid=pb.powerSystemResourceMRID if pb.powerSystemResourceMRID else None
1366
+ )
1367
+
1368
+ network_service.resolve_or_defer_reference(resolver.remote_control(cim), pb.remoteControlMRID)
1369
+
1370
+ io_point_to_cim(pb.ip, cim, network_service)
1371
+ return cim
1372
+
1373
+
1374
+ @bind_to_cim
1375
+ @add_to_network_or_none
1376
+ def discrete_to_cim(pb: PBDiscrete, network_service: NetworkService) -> Optional[Discrete]:
1377
+ # noinspection PyUnresolvedReferences
1378
+ cim = Discrete(mrid=pb.mrid())
1379
+
1380
+ measurement_to_cim(pb.measurement, cim, network_service)
1381
+ return cim
1382
+
1383
+
1384
+ def io_point_to_cim(pb: PBIoPoint, cim: IoPoint, service: NetworkService):
1385
+ identified_object_to_cim(pb.io, cim, service)
1386
+
1387
+
1388
+ def measurement_to_cim(pb: PBMeasurement, cim: Measurement, service: NetworkService):
1389
+ cim.power_system_resource_mrid = str_or_none(pb.powerSystemResourceMRID)
1390
+ cim.terminal_mrid = str_or_none(pb.terminalMRID)
1391
+ cim.phases = phase_code_by_id(pb.phases)
1392
+ cim.unit_symbol = unit_symbol_from_id(pb.unitSymbol)
1393
+
1394
+ service.resolve_or_defer_reference(resolver.remote_source(cim), pb.remoteSourceMRID)
1395
+
1396
+ identified_object_to_cim(pb.io, cim, service)
1397
+
1398
+
1399
+ ############################
1400
+ # IEC61970 Base Protection #
1401
+ ############################
1402
+
1403
+ @bind_to_cim
1404
+ @add_to_network_or_none
1405
+ def current_relay_to_cim(pb: PBCurrentRelay, network_service: NetworkService) -> Optional[CurrentRelay]:
1406
+ # noinspection PyUnresolvedReferences
1407
+ cim = CurrentRelay(
1408
+ mrid=pb.mrid(),
1409
+ current_limit_1=get_nullable(pb, "currentLimit1"),
1410
+ inverse_time_flag=get_nullable(pb, "inverseTimeFlag"),
1411
+ time_delay_1=get_nullable(pb, "timeDelay1"),
1412
+ )
1413
+
1414
+ protection_relay_function_to_cim(pb.prf, cim, network_service)
1415
+ return cim
1416
+
1417
+
1418
+ #######################
1419
+ # IEC61970 Base Scada #
1420
+ #######################
1421
+
1422
+ @bind_to_cim
1423
+ @add_to_network_or_none
1424
+ def remote_control_to_cim(pb: PBRemoteControl, network_service: NetworkService) -> Optional[RemoteControl]:
1425
+ # noinspection PyUnresolvedReferences
1426
+ cim = RemoteControl(mrid=pb.mrid())
1427
+
1428
+ network_service.resolve_or_defer_reference(resolver.control(cim), pb.controlMRID)
1429
+
1430
+ remote_point_to_cim(pb.rp, cim, network_service)
1431
+ return cim
1432
+
1433
+
1434
+ def remote_point_to_cim(pb: PBRemotePoint, cim: RemotePoint, service: NetworkService):
1435
+ identified_object_to_cim(pb.io, cim, service)
1436
+
1437
+
1438
+ @bind_to_cim
1439
+ @add_to_network_or_none
1440
+ def remote_source_to_cim(pb: PBRemoteSource, network_service: NetworkService) -> Optional[RemoteSource]:
1441
+ # noinspection PyUnresolvedReferences
1442
+ cim = RemoteSource(mrid=pb.mrid())
1443
+
1444
+ network_service.resolve_or_defer_reference(resolver.measurement(cim), pb.measurementMRID)
1445
+
1446
+ remote_point_to_cim(pb.rp, cim, network_service)
1447
+ return cim
1448
+
1449
+
1450
+ #######################
1451
+ # IEC61970 Base Wires #
1452
+ #######################
1453
+
1454
+ @bind_to_cim
1455
+ @add_to_network_or_none
1456
+ def ac_line_segment_to_cim(pb: PBAcLineSegment, network_service: NetworkService) -> Optional[AcLineSegment]:
1457
+ """
1458
+ Convert the protobuf :class:`PBAcLineSegment` into its CIM counterpart.
1459
+ :param pb: The protobuf :class:`PBAcLineSegment` to convert.
1460
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
1461
+ :return: The converted `pb` as a CIM :class:`AcLineSegment`
1462
+ """
1463
+ # noinspection PyUnresolvedReferences
1464
+ cim = AcLineSegment(mrid=pb.mrid())
1465
+
1466
+ network_service.resolve_or_defer_reference(resolver.per_length_impedance(cim), pb.perLengthImpedanceMRID)
1467
+ for mrid in pb.cutMRIDs:
1468
+ network_service.resolve_or_defer_reference(resolver.cuts(cim), mrid)
1469
+ for mrid in pb.clampMRIDs:
1470
+ network_service.resolve_or_defer_reference(resolver.clamps(cim), mrid)
1471
+
1472
+ conductor_to_cim(pb.cd, cim, network_service)
1473
+ return cim
1474
+
1475
+
1476
+ @bind_to_cim
1477
+ @add_to_network_or_none
1478
+ def breaker_to_cim(pb: PBBreaker, network_service: NetworkService) -> Optional[Breaker]:
1479
+ # noinspection PyUnresolvedReferences
1480
+ cim = Breaker(
1481
+ mrid=pb.mrid(),
1482
+ in_transit_time=get_nullable(pb, "inTransitTime")
1483
+ )
1484
+
1485
+ protected_switch_to_cim(pb.sw, cim, network_service)
1486
+ return cim
1487
+
1488
+
1489
+ @bind_to_cim
1490
+ @add_to_network_or_none
1491
+ def busbar_section_to_cim(pb: PBBusbarSection, network_service: NetworkService) -> Optional[BusbarSection]:
1492
+ # noinspection PyUnresolvedReferences
1493
+ cim = BusbarSection(mrid=pb.mrid())
1494
+
1495
+ connector_to_cim(pb.cn, cim, network_service)
1496
+ return cim
1497
+
1498
+
1499
+ @bind_to_cim
1500
+ @add_to_network_or_none
1501
+ def clamp_to_cim(pb: PBClamp, network_service: NetworkService) -> Optional[Clamp]:
1502
+ # noinspection PyUnresolvedReferences
1503
+ cim = Clamp(mrid=pb.mrid())
1504
+
1505
+ cim.length_from_terminal_1 = get_nullable(pb, "lengthFromTerminal1")
1506
+ network_service.resolve_or_defer_reference(resolver.clamp_ac_line_segment(cim), pb.acLineSegmentMRID)
1507
+
1508
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1509
+ return cim
1510
+
1511
+
1512
+ def conductor_to_cim(pb: PBConductor, cim: Conductor, network_service: NetworkService):
1513
+ cim.length = get_nullable(pb, 'length')
1514
+ cim.design_temperature = get_nullable(pb, 'designTemperature')
1515
+ cim.design_rating = get_nullable(pb, 'designRating')
1516
+
1517
+ # noinspection PyUnresolvedReferences
1518
+ network_service.resolve_or_defer_reference(resolver.wire_info(cim), pb.asset_info_mrid())
1519
+
1520
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1521
+
1522
+
1523
+ def connector_to_cim(pb: PBConnector, cim: Connector, network_service: NetworkService):
1524
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1525
+
1526
+
1527
+ @bind_to_cim
1528
+ @add_to_network_or_none
1529
+ def cut_to_cim(pb: PBCut, network_service: NetworkService) -> Optional[Cut]:
1530
+ # noinspection PyUnresolvedReferences
1531
+ cim = Cut(mrid=pb.mrid())
1532
+
1533
+ cim.length_from_terminal_1 = get_nullable(pb, 'lengthFromTerminal1')
1534
+ network_service.resolve_or_defer_reference(resolver.cut_ac_line_segment(cim), pb.acLineSegmentMRID)
1535
+
1536
+ switch_to_cim(pb.sw, cim, network_service)
1537
+ return cim
1538
+
1539
+
1540
+ @bind_to_cim
1541
+ @add_to_network_or_none
1542
+ def disconnector_to_cim(pb: PBDisconnector, network_service: NetworkService) -> Optional[Disconnector]:
1543
+ # noinspection PyUnresolvedReferences
1544
+ cim = Disconnector(mrid=pb.mrid())
1545
+
1546
+ switch_to_cim(pb.sw, cim, network_service)
1547
+ return cim
1548
+
1549
+
1550
+ def earth_fault_compensator_to_cim(pb: PBEarthFaultCompensator, cim: EarthFaultCompensator, network_service: NetworkService):
1551
+ cim.r = get_nullable(pb, 'r')
1552
+
1553
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1554
+
1555
+
1556
+ def energy_connection_to_cim(pb: PBEnergyConnection, cim: EnergyConnection, network_service: NetworkService):
1557
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1558
+
1559
+
1560
+ @bind_to_cim
1561
+ @add_to_network_or_none
1562
+ def energy_consumer_to_cim(pb: PBEnergyConsumer, network_service: NetworkService) -> Optional[EnergyConsumer]:
1563
+ # noinspection PyUnresolvedReferences
1564
+ cim = EnergyConsumer(
1565
+ mrid=pb.mrid(),
1566
+ customer_count=get_nullable(pb, "customerCount"),
1567
+ grounded=get_nullable(pb, 'grounded'),
1568
+ phase_connection=PhaseShuntConnectionKind(pb.phaseConnection),
1569
+ p=get_nullable(pb, 'p'),
1570
+ p_fixed=get_nullable(pb, 'pFixed'),
1571
+ q=get_nullable(pb, 'q'),
1572
+ q_fixed=get_nullable(pb, 'qFixed'),
1573
+ )
1574
+
1575
+ for mrid in pb.energyConsumerPhasesMRIDs:
1576
+ network_service.resolve_or_defer_reference(resolver.ec_phases(cim), mrid)
1577
+
1578
+ energy_connection_to_cim(pb.ec, cim, network_service)
1579
+ return cim
1580
+
1581
+
1582
+ @bind_to_cim
1583
+ @add_to_network_or_none
1584
+ def energy_consumer_phase_to_cim(pb: PBEnergyConsumerPhase, network_service: NetworkService) -> Optional[EnergyConsumerPhase]:
1585
+ # noinspection PyUnresolvedReferences
1586
+ cim = EnergyConsumerPhase(
1587
+ mrid=pb.mrid(),
1588
+ phase=single_phase_kind_by_id(pb.phase),
1589
+ p=get_nullable(pb, 'p'),
1590
+ p_fixed=get_nullable(pb, 'pFixed'),
1591
+ q=get_nullable(pb, 'q'),
1592
+ q_fixed=get_nullable(pb, 'qFixed'),
1593
+ )
1594
+
1595
+ network_service.resolve_or_defer_reference(resolver.energy_consumer(cim), pb.energyConsumerMRID)
1596
+
1597
+ power_system_resource_to_cim(pb.psr, cim, network_service)
1598
+ return cim
1599
+
1600
+
1601
+ @bind_to_cim
1602
+ @add_to_network_or_none
1603
+ def energy_source_to_cim(pb: PBEnergySource, network_service: NetworkService) -> Optional[EnergySource]:
1604
+ # noinspection PyUnresolvedReferences
1605
+ cim = EnergySource(
1606
+ mrid=pb.mrid(),
1607
+ active_power=get_nullable(pb, 'activePower'),
1608
+ reactive_power=get_nullable(pb, 'reactivePower'),
1609
+ voltage_angle=get_nullable(pb, 'voltageAngle'),
1610
+ voltage_magnitude=get_nullable(pb, 'voltageMagnitude'),
1611
+ r=get_nullable(pb, 'r'),
1612
+ x=get_nullable(pb, 'x'),
1613
+ p_max=get_nullable(pb, 'pMax'),
1614
+ p_min=get_nullable(pb, 'pMin'),
1615
+ r0=get_nullable(pb, 'r0'),
1616
+ rn=get_nullable(pb, 'rn'),
1617
+ x0=get_nullable(pb, 'x0'),
1618
+ xn=get_nullable(pb, 'xn'),
1619
+ is_external_grid=get_nullable(pb, 'isExternalGrid'),
1620
+ r_min=get_nullable(pb, 'rMin'),
1621
+ rn_min=get_nullable(pb, 'rnMin'),
1622
+ r0_min=get_nullable(pb, 'r0Min'),
1623
+ x_min=get_nullable(pb, 'xMin'),
1624
+ xn_min=get_nullable(pb, 'xnMin'),
1625
+ x0_min=get_nullable(pb, 'x0Min'),
1626
+ r_max=get_nullable(pb, 'rMax'),
1627
+ rn_max=get_nullable(pb, 'rnMax'),
1628
+ r0_max=get_nullable(pb, 'r0Max'),
1629
+ x_max=get_nullable(pb, 'xMax'),
1630
+ xn_max=get_nullable(pb, 'xnMax'),
1631
+ x0_max=get_nullable(pb, 'x0Max'),
1632
+ )
1633
+
1634
+ for mrid in pb.energySourcePhasesMRIDs:
1635
+ network_service.resolve_or_defer_reference(resolver.es_phases(cim), mrid)
1636
+
1637
+ energy_connection_to_cim(pb.ec, cim, network_service)
1638
+ return cim
1639
+
1640
+
1641
+ @bind_to_cim
1642
+ @add_to_network_or_none
1643
+ def energy_source_phase_to_cim(pb: PBEnergySourcePhase, network_service: NetworkService) -> Optional[EnergySourcePhase]:
1644
+ # noinspection PyUnresolvedReferences
1645
+ cim = EnergySourcePhase(mrid=pb.mrid(), phase=single_phase_kind_by_id(pb.phase))
1646
+
1647
+ network_service.resolve_or_defer_reference(resolver.energy_source(cim), pb.energySourceMRID)
1648
+
1649
+ power_system_resource_to_cim(pb.psr, cim, network_service)
1650
+ return cim
1651
+
1652
+
1653
+ @bind_to_cim
1654
+ @add_to_network_or_none
1655
+ def fuse_to_cim(pb: PBFuse, network_service: NetworkService) -> Optional[Fuse]:
1656
+ # noinspection PyUnresolvedReferences
1657
+ cim = Fuse(mrid=pb.mrid())
1658
+
1659
+ network_service.resolve_or_defer_reference(resolver.fuse_function(cim), pb.functionMRID)
1660
+
1661
+ switch_to_cim(pb.sw, cim, network_service)
1662
+ return cim
1663
+
1664
+
1665
+ @bind_to_cim
1666
+ @add_to_network_or_none
1667
+ def ground_to_cim(pb: PBGround, network_service: NetworkService) -> Optional[Ground]:
1668
+ # noinspection PyUnresolvedReferences
1669
+ cim = Ground(mrid=pb.mrid())
1670
+
1671
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1672
+ return cim
1673
+
1674
+
1675
+ @bind_to_cim
1676
+ @add_to_network_or_none
1677
+ def ground_disconnector_to_cim(pb: PBGroundDisconnector, network_service: NetworkService) -> Optional[GroundDisconnector]:
1678
+ # noinspection PyUnresolvedReferences
1679
+ cim = GroundDisconnector(mrid=pb.mrid())
1680
+
1681
+ switch_to_cim(pb.sw, cim, network_service)
1682
+ return cim
1683
+
1684
+
1685
+ @bind_to_cim
1686
+ @add_to_network_or_none
1687
+ def grounding_impedance_to_cim(pb: PBGroundingImpedance, network_service: NetworkService) -> Optional[GroundingImpedance]:
1688
+ # noinspection PyUnresolvedReferences
1689
+ cim = GroundingImpedance(mrid=pb.mrid(), x=get_nullable(pb, "x"))
1690
+
1691
+ earth_fault_compensator_to_cim(pb.efc, cim, network_service)
1692
+ return cim
1693
+
1694
+
1695
+ @bind_to_cim
1696
+ @add_to_network_or_none
1697
+ def jumper_to_cim(pb: PBJumper, network_service: NetworkService) -> Optional[Jumper]:
1698
+ # noinspection PyUnresolvedReferences
1699
+ cim = Jumper(mrid=pb.mrid())
1700
+
1701
+ switch_to_cim(pb.sw, cim, network_service)
1702
+ return cim
1703
+
1704
+
1705
+ @bind_to_cim
1706
+ @add_to_network_or_none
1707
+ def junction_to_cim(pb: PBJunction, network_service: NetworkService) -> Optional[Junction]:
1708
+ # noinspection PyUnresolvedReferences
1709
+ cim = Junction(mrid=pb.mrid())
1710
+
1711
+ connector_to_cim(pb.cn, cim, network_service)
1712
+ return cim
1713
+
1714
+
1715
+ def line_to_cim(pb: PBLine, cim: Line, network_service: NetworkService):
1716
+ equipment_container_to_cim(pb.ec, cim, network_service)
1717
+
1718
+
1719
+ @bind_to_cim
1720
+ @add_to_network_or_none
1721
+ def linear_shunt_compensator_to_cim(pb: PBLinearShuntCompensator, network_service: NetworkService) -> Optional[LinearShuntCompensator]:
1722
+ # noinspection PyUnresolvedReferences
1723
+ cim = LinearShuntCompensator(
1724
+ mrid=pb.mrid(),
1725
+ b0_per_section=get_nullable(pb, 'b0PerSection'),
1726
+ b_per_section=get_nullable(pb, 'bPerSection'),
1727
+ g0_per_section=get_nullable(pb, 'g0PerSection'),
1728
+ g_per_section=get_nullable(pb, 'gPerSection'),
1729
+ )
1730
+
1731
+ shunt_compensator_to_cim(pb.sc, cim, network_service)
1732
+ return cim
1733
+
1734
+
1735
+ @bind_to_cim
1736
+ @add_to_network_or_none
1737
+ def load_break_switch_to_cim(pb: PBLoadBreakSwitch, network_service: NetworkService) -> Optional[LoadBreakSwitch]:
1738
+ # noinspection PyUnresolvedReferences
1739
+ cim = LoadBreakSwitch(mrid=pb.mrid())
1740
+
1741
+ protected_switch_to_cim(pb.ps, cim, network_service)
1742
+ return cim
1743
+
1744
+
1745
+ def per_length_line_parameter_to_cim(pb: PBPerLengthLineParameter, cim: PerLengthLineParameter, network_service: NetworkService):
1746
+ identified_object_to_cim(pb.io, cim, network_service)
1747
+
1748
+
1749
+ def per_length_impedance_to_cim(pb: PBPerLengthImpedance, cim: PerLengthImpedance, network_service: NetworkService):
1750
+ per_length_line_parameter_to_cim(pb.lp, cim, network_service)
1751
+
1752
+
1753
+ @bind_to_cim
1754
+ @add_to_network_or_none
1755
+ def per_length_phase_impedance_to_cim(pb: PBPerLengthPhaseImpedance, network_service: NetworkService) -> Optional[PerLengthPhaseImpedance]:
1756
+ """
1757
+ Convert the protobuf :class:`PBPerLengthPhaseImpedance` into its CIM counterpart.
1758
+ :param pb: The protobuf :class:`PBPerLengthPhaseImpedance` to convert.
1759
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
1760
+ :return: The converted `pb` as a CIM :class:`PerLengthPhaseImpedance`
1761
+ """
1762
+ # noinspection PyUnresolvedReferences
1763
+ cim = PerLengthPhaseImpedance(mrid=pb.mrid())
1764
+
1765
+ for phase_impedance_data in pb.phaseImpedanceData:
1766
+ cim.add_data(phase_impedance_data_to_cim(phase_impedance_data))
1767
+
1768
+ per_length_impedance_to_cim(pb.pli, cim, network_service)
1769
+ return cim
1770
+
1771
+
1772
+ @bind_to_cim
1773
+ @add_to_network_or_none
1774
+ def per_length_sequence_impedance_to_cim(pb: PBPerLengthSequenceImpedance, network_service: NetworkService) -> Optional[PerLengthSequenceImpedance]:
1775
+ # noinspection PyUnresolvedReferences
1776
+ cim = PerLengthSequenceImpedance(
1777
+ mrid=pb.mrid(),
1778
+ r=get_nullable(pb, 'r'),
1779
+ x=get_nullable(pb, 'x'),
1780
+ r0=get_nullable(pb, 'r0'),
1781
+ x0=get_nullable(pb, 'x0'),
1782
+ bch=get_nullable(pb, 'bch'),
1783
+ gch=get_nullable(pb, 'gch'),
1784
+ b0ch=get_nullable(pb, 'b0ch'),
1785
+ g0ch=get_nullable(pb, 'g0ch'),
1786
+ )
1787
+
1788
+ per_length_impedance_to_cim(pb.pli, cim, network_service)
1789
+ return cim
1790
+
1791
+
1792
+ @bind_to_cim
1793
+ @add_to_network_or_none
1794
+ def petersen_coil_to_cim(pb: PBPetersenCoil, network_service: NetworkService) -> Optional[PetersenCoil]:
1795
+ # noinspection PyUnresolvedReferences
1796
+ cim = PetersenCoil(mrid=pb.mrid(), x_ground_nominal=get_nullable(pb, 'xGroundNominal'))
1797
+
1798
+ earth_fault_compensator_to_cim(pb.efc, cim, network_service)
1799
+ return cim
1800
+
1801
+
1802
+ def phase_impedance_data_to_cim(pb: PBPhaseImpedanceData) -> Optional[PhaseImpedanceData]:
1803
+ """
1804
+ Convert the protobuf :class:`PBPhaseImpedanceData` into its CIM counterpart.
1805
+ :param pb: The protobuf :class:`PBPhaseImpedanceData` to convert.
1806
+ :return: The converted `pb` as a CIM :class:`PhaseImpedanceData`
1807
+ """
1808
+ return PhaseImpedanceData(
1809
+ single_phase_kind_by_id(pb.fromPhase),
1810
+ single_phase_kind_by_id(pb.toPhase),
1811
+ get_nullable(pb, "b"),
1812
+ get_nullable(pb, "g"),
1813
+ get_nullable(pb, "r"),
1814
+ get_nullable(pb, "x"),
1815
+ )
1816
+
1817
+
1818
+ @bind_to_cim
1819
+ @add_to_network_or_none
1820
+ def power_electronics_connection_to_cim(pb: PBPowerElectronicsConnection, network_service: NetworkService) -> Optional[PowerElectronicsConnection]:
1821
+ # noinspection PyUnresolvedReferences
1822
+ cim = PowerElectronicsConnection(
1823
+ mrid=pb.mrid(),
1824
+ max_i_fault=get_nullable(pb, "maxIFault"),
1825
+ p=get_nullable(pb, 'p'),
1826
+ q=get_nullable(pb, 'q'),
1827
+ max_q=get_nullable(pb, 'maxQ'),
1828
+ min_q=get_nullable(pb, 'minQ'),
1829
+ rated_s=get_nullable(pb, 'ratedS'),
1830
+ rated_u=get_nullable(pb, 'ratedU'),
1831
+ inverter_standard=get_nullable(pb, 'inverterStandard'),
1832
+ sustain_op_overvolt_limit=get_nullable(pb, 'sustainOpOvervoltLimit'),
1833
+ stop_at_over_freq=get_nullable(pb, 'stopAtOverFreq'),
1834
+ stop_at_under_freq=get_nullable(pb, 'stopAtUnderFreq'),
1835
+ inv_volt_watt_resp_mode=get_nullable(pb, "invVoltWattRespMode"),
1836
+ inv_watt_resp_v1=get_nullable(pb, 'invWattRespV1'),
1837
+ inv_watt_resp_v2=get_nullable(pb, 'invWattRespV2'),
1838
+ inv_watt_resp_v3=get_nullable(pb, 'invWattRespV3'),
1839
+ inv_watt_resp_v4=get_nullable(pb, 'invWattRespV4'),
1840
+ inv_watt_resp_p_at_v1=get_nullable(pb, 'invWattRespPAtV1'),
1841
+ inv_watt_resp_p_at_v2=get_nullable(pb, 'invWattRespPAtV2'),
1842
+ inv_watt_resp_p_at_v3=get_nullable(pb, 'invWattRespPAtV3'),
1843
+ inv_watt_resp_p_at_v4=get_nullable(pb, 'invWattRespPAtV4'),
1844
+ inv_volt_var_resp_mode=get_nullable(pb, "invVoltVarRespMode"),
1845
+ inv_var_resp_v1=get_nullable(pb, 'invVarRespV1'),
1846
+ inv_var_resp_v2=get_nullable(pb, 'invVarRespV2'),
1847
+ inv_var_resp_v3=get_nullable(pb, 'invVarRespV3'),
1848
+ inv_var_resp_v4=get_nullable(pb, 'invVarRespV4'),
1849
+ inv_var_resp_q_at_v1=get_nullable(pb, 'invVarRespQAtV1'),
1850
+ inv_var_resp_q_at_v2=get_nullable(pb, 'invVarRespQAtV2'),
1851
+ inv_var_resp_q_at_v3=get_nullable(pb, 'invVarRespQAtV3'),
1852
+ inv_var_resp_q_at_v4=get_nullable(pb, 'invVarRespQAtV4'),
1853
+ inv_reactive_power_mode=get_nullable(pb, "invReactivePowerMode"),
1854
+ inv_fix_reactive_power=get_nullable(pb, 'invFixReactivePower'),
1855
+ )
1856
+
1857
+ for mrid in pb.powerElectronicsUnitMRIDs:
1858
+ network_service.resolve_or_defer_reference(resolver.power_electronics_unit(cim), mrid)
1859
+ for mrid in pb.powerElectronicsConnectionPhaseMRIDs:
1860
+ network_service.resolve_or_defer_reference(resolver.power_electronics_connection_phase(cim), mrid)
1861
+
1862
+ regulating_cond_eq_to_cim(pb.rce, cim, network_service)
1863
+ return cim
1864
+
1865
+
1866
+ @bind_to_cim
1867
+ @add_to_network_or_none
1868
+ def power_electronics_connection_phase_to_cim(
1869
+ pb: PBPowerElectronicsConnectionPhase,
1870
+ network_service: NetworkService
1871
+ ) -> Optional[PowerElectronicsConnectionPhase]:
1872
+ # noinspection PyUnresolvedReferences
1873
+ cim = PowerElectronicsConnectionPhase(
1874
+ mrid=pb.mrid(),
1875
+ p=get_nullable(pb, "p"),
1876
+ q=get_nullable(pb, "q"),
1877
+ phase=single_phase_kind_by_id(pb.phase)
1878
+ )
1879
+
1880
+ network_service.resolve_or_defer_reference(resolver.phase_power_electronics_connection(cim), pb.powerElectronicsConnectionMRID)
1881
+
1882
+ power_system_resource_to_cim(pb.psr, cim, network_service)
1883
+ return cim
1884
+
1885
+
1886
+ @bind_to_cim
1887
+ @add_to_network_or_none
1888
+ def power_transformer_to_cim(pb: PBPowerTransformer, network_service: NetworkService) -> Optional[PowerTransformer]:
1889
+ # noinspection PyUnresolvedReferences
1890
+ cim = PowerTransformer(
1891
+ mrid=pb.mrid(),
1892
+ vector_group=VectorGroup(pb.vectorGroup),
1893
+ transformer_utilisation=get_nullable(pb, "transformerUtilisation"),
1894
+ construction_kind=TransformerConstructionKind(pb.constructionKind),
1895
+ function=TransformerFunctionKind(pb.function)
1896
+ )
1897
+
1898
+ for mrid in pb.powerTransformerEndMRIDs:
1899
+ network_service.resolve_or_defer_reference(resolver.ends(cim), mrid)
1900
+ # noinspection PyUnresolvedReferences
1901
+ network_service.resolve_or_defer_reference(resolver.power_transformer_info(cim), pb.asset_info_mrid())
1902
+
1903
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
1904
+ return cim
1905
+
1906
+
1907
+ @bind_to_cim
1908
+ @add_to_network_or_none
1909
+ def power_transformer_end_to_cim(pb: PBPowerTransformerEnd, network_service: NetworkService) -> Optional[PowerTransformerEnd]:
1910
+ # noinspection PyUnresolvedReferences
1911
+ cim = PowerTransformerEnd(
1912
+ mrid=pb.mrid(),
1913
+ rated_u=get_nullable(pb, 'ratedU'),
1914
+ r=get_nullable(pb, 'r'),
1915
+ r0=get_nullable(pb, 'r0'),
1916
+ x=get_nullable(pb, 'x'),
1917
+ x0=get_nullable(pb, 'x0'),
1918
+ b=get_nullable(pb, 'b'),
1919
+ b0=get_nullable(pb, 'b0'),
1920
+ g=get_nullable(pb, 'g'),
1921
+ g0=get_nullable(pb, 'g0'),
1922
+ connection_kind=WindingConnection(pb.connectionKind),
1923
+ phase_angle_clock=get_nullable(pb, 'phaseAngleClock'),
1924
+ )
1925
+
1926
+ for rating in pb.ratings:
1927
+ cim.add_transformer_end_rated_s(transformer_end_rated_s_to_cim(rating))
1928
+
1929
+ # Set end number before associating with power transformer to prevent incorrectly sorted cim.power_transformer.ends
1930
+ transformer_end_to_cim(pb.te, cim, network_service)
1931
+
1932
+ network_service.resolve_or_defer_reference(resolver.power_transformer(cim), pb.powerTransformerMRID)
1933
+ return cim
1934
+
1935
+
1936
+ def protected_switch_to_cim(pb: PBProtectedSwitch, cim: ProtectedSwitch, network_service: NetworkService):
1937
+ cim.breaking_capacity = get_nullable(pb, 'breakingCapacity')
1938
+
1939
+ for mrid in pb.relayFunctionMRIDs:
1940
+ network_service.resolve_or_defer_reference(resolver.ps_relay_function(cim), mrid)
1941
+
1942
+ switch_to_cim(pb.sw, cim, network_service)
1943
+
1944
+
1945
+ @bind_to_cim
1946
+ @add_to_network_or_none
1947
+ def ratio_tap_changer_to_cim(pb: PBRatioTapChanger, network_service: NetworkService) -> Optional[RatioTapChanger]:
1948
+ # noinspection PyUnresolvedReferences
1949
+ cim = RatioTapChanger(
1950
+ mrid=pb.mrid(),
1951
+ step_voltage_increment=get_nullable(pb, "stepVoltageIncrement")
1952
+ )
1953
+
1954
+ network_service.resolve_or_defer_reference(resolver.transformer_end(cim), pb.transformerEndMRID)
1955
+
1956
+ tap_changer_to_cim(pb.tc, cim, network_service)
1957
+ return cim
1958
+
1959
+
1960
+ @bind_to_cim
1961
+ @add_to_network_or_none
1962
+ def reactive_capability_curve_to_cim(pb: PBReactiveCapabilityCurve, network_service: NetworkService) -> Optional[ReactiveCapabilityCurve]:
1963
+ # noinspection PyUnresolvedReferences
1964
+ cim = ReactiveCapabilityCurve(mrid=pb.mrid())
1965
+
1966
+ curve_to_cim(pb.c, cim, network_service)
1967
+ return cim
1968
+
1969
+
1970
+ @bind_to_cim
1971
+ @add_to_network_or_none
1972
+ def recloser_to_cim(pb: PBRecloser, network_service: NetworkService) -> Optional[Recloser]:
1973
+ # noinspection PyUnresolvedReferences
1974
+ cim = Recloser(mrid=pb.mrid())
1975
+
1976
+ protected_switch_to_cim(pb.sw, cim, network_service)
1977
+ return cim
1978
+
1979
+
1980
+ def regulating_cond_eq_to_cim(pb: PBRegulatingCondEq, cim: RegulatingCondEq, network_service: NetworkService):
1981
+ cim.control_enabled = get_nullable(pb, 'controlEnabled')
1982
+ network_service.resolve_or_defer_reference(resolver.rce_regulating_control(cim), pb.regulatingControlMRID)
1983
+
1984
+ energy_connection_to_cim(pb.ec, cim, network_service)
1985
+
1986
+
1987
+ def regulating_control_to_cim(pb: PBRegulatingControl, cim: RegulatingControl, network_service: NetworkService):
1988
+ cim.discrete = None if pb.HasField("discreteNull") else pb.discreteSet
1989
+ cim.mode = RegulatingControlModeKind(pb.mode)
1990
+ cim.monitored_phase = phase_code_by_id(pb.monitoredPhase)
1991
+ cim.target_deadband = get_nullable(pb, 'targetDeadband')
1992
+ cim.target_value = get_nullable(pb, 'targetValue')
1993
+ cim.enabled = get_nullable(pb, 'enabled')
1994
+ cim.max_allowed_target_value = get_nullable(pb, 'maxAllowedTargetValue')
1995
+ cim.min_allowed_target_value = get_nullable(pb, 'minAllowedTargetValue')
1996
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
1997
+ network_service.resolve_or_defer_reference(resolver.rc_terminal(cim), pb.terminalMRID)
1998
+ for mrid in pb.regulatingCondEqMRIDs:
1999
+ network_service.resolve_or_defer_reference(resolver.rc_regulating_cond_eq(cim), mrid)
2000
+ cim.ct_primary = get_nullable(pb, 'ctPrimary')
2001
+ cim.min_target_deadband = get_nullable(pb, 'minTargetDeadband')
2002
+
2003
+ power_system_resource_to_cim(pb.psr, cim, network_service)
2004
+
2005
+
2006
+ def rotating_machine_to_cim(pb: PBRotatingMachine, cim: RotatingMachine, network_service: NetworkService):
2007
+ cim.rated_power_factor = get_nullable(pb, 'ratedPowerFactor')
2008
+ cim.rated_s = get_nullable(pb, 'ratedS')
2009
+ cim.rated_u = get_nullable(pb, 'ratedU')
2010
+ cim.p = get_nullable(pb, 'p')
2011
+ cim.q = get_nullable(pb, 'q')
2012
+
2013
+ regulating_cond_eq_to_cim(pb.rce, cim, network_service)
2014
+
2015
+
2016
+ @bind_to_cim
2017
+ @add_to_network_or_none
2018
+ def series_compensator_to_cim(pb: PBSeriesCompensator, network_service: NetworkService) -> Optional[SeriesCompensator]:
2019
+ # noinspection PyUnresolvedReferences
2020
+ cim = SeriesCompensator(
2021
+ mrid=pb.mrid(),
2022
+ r=get_nullable(pb, 'r'),
2023
+ r0=get_nullable(pb, 'r0'),
2024
+ x=get_nullable(pb, 'x'),
2025
+ x0=get_nullable(pb, 'x0'),
2026
+ varistor_rated_current=get_nullable(pb, 'varistorRatedCurrent'),
2027
+ varistor_voltage_threshold=get_nullable(pb, 'varistorVoltageThreshold'),
2028
+ )
2029
+
2030
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
2031
+ return cim
2032
+
2033
+
2034
+ def shunt_compensator_to_cim(pb: PBShuntCompensator, cim: ShuntCompensator, network_service: NetworkService):
2035
+ # noinspection PyUnresolvedReferences
2036
+ network_service.resolve_or_defer_reference(resolver.shunt_compensator_info(cim), pb.asset_info_mrid())
2037
+ cim.sections = get_nullable(pb, 'sections')
2038
+ cim.grounded = get_nullable(pb, 'grounded')
2039
+ cim.nom_u = get_nullable(pb, 'nomU')
2040
+ cim.phase_connection = PhaseShuntConnectionKind(pb.phaseConnection)
2041
+
2042
+ regulating_cond_eq_to_cim(pb.rce, cim, network_service)
2043
+
2044
+
2045
+ @bind_to_cim
2046
+ @add_to_network_or_none
2047
+ def static_var_compensator_to_cim(pb: PBStaticVarCompensator, network_service: NetworkService):
2048
+ """
2049
+ Convert the protobuf :class:`PBStaticVarCompensator` into its CIM counterpart.
2050
+ :param pb: The protobuf :class:`PBStaticVarCompensator` to convert.
2051
+ :param network_service: The :class:`NetworkService` the converted CIM object will be added to.
2052
+ :return: The converted `pb` as a CIM :class:`StaticVarCompensator`
2053
+ """
2054
+ # noinspection PyUnresolvedReferences
2055
+ cim = StaticVarCompensator(
2056
+ mrid=pb.mrid(),
2057
+ capacitive_rating=get_nullable(pb, 'capacitiveRating'),
2058
+ inductive_rating=get_nullable(pb, 'inductiveRating'),
2059
+ q=get_nullable(pb, 'q'),
2060
+ svc_control_mode=SVCControlMode(pb.svcControlMode),
2061
+ voltage_set_point=get_nullable(pb, 'voltageSetPoint'),
2062
+ )
2063
+
2064
+ regulating_cond_eq_to_cim(pb.rce, cim, network_service)
2065
+ return cim
2066
+
2067
+
2068
+ def switch_to_cim(pb: PBSwitch, cim: Switch, network_service: NetworkService):
2069
+ # noinspection PyUnresolvedReferences
2070
+ network_service.resolve_or_defer_reference(resolver.switch_info(cim), pb.asset_info_mrid())
2071
+ cim.rated_current = get_nullable(pb, 'ratedCurrent')
2072
+ cim.set_normally_open(pb.normalOpen)
2073
+ cim.set_open(pb.open)
2074
+
2075
+ conducting_equipment_to_cim(pb.ce, cim, network_service)
2076
+
2077
+
2078
+ @bind_to_cim
2079
+ @add_to_network_or_none
2080
+ def synchronous_machine_to_cim(pb: PBSynchronousMachine, network_service: NetworkService) -> Optional[SynchronousMachine]:
2081
+ # noinspection PyUnresolvedReferences
2082
+ cim = SynchronousMachine(
2083
+ mrid=pb.mrid(),
2084
+ base_q=get_nullable(pb, 'baseQ'),
2085
+ condenser_p=get_nullable(pb, 'condenserP'),
2086
+ earthing=get_nullable(pb, 'earthing'),
2087
+ earthing_star_point_r=get_nullable(pb, 'earthingStarPointR'),
2088
+ earthing_star_point_x=get_nullable(pb, 'earthingStarPointX'),
2089
+ ikk=get_nullable(pb, 'ikk'),
2090
+ max_q=get_nullable(pb, 'maxQ'),
2091
+ max_u=get_nullable(pb, 'maxU'),
2092
+ min_q=get_nullable(pb, 'minQ'),
2093
+ min_u=get_nullable(pb, 'minU'),
2094
+ mu=get_nullable(pb, 'mu'),
2095
+ r=get_nullable(pb, 'r'),
2096
+ r0=get_nullable(pb, 'r0'),
2097
+ r2=get_nullable(pb, 'r2'),
2098
+ sat_direct_subtrans_x=get_nullable(pb, 'satDirectSubtransX'),
2099
+ sat_direct_sync_x=get_nullable(pb, 'satDirectSyncX'),
2100
+ sat_direct_trans_x=get_nullable(pb, 'satDirectTransX'),
2101
+ x0=get_nullable(pb, 'x0'),
2102
+ x2=get_nullable(pb, 'x2'),
2103
+ type=SynchronousMachineKind(pb.type),
2104
+ operating_mode=SynchronousMachineKind(pb.operatingMode)
2105
+ )
2106
+
2107
+ for mrid in pb.reactiveCapabilityCurveMRIDs:
2108
+ network_service.resolve_or_defer_reference(resolver.reactive_capability_curve(cim), mrid)
2109
+
2110
+ rotating_machine_to_cim(pb.rm, cim, network_service)
2111
+ return cim
2112
+
2113
+
2114
+ def tap_changer_to_cim(pb: PBTapChanger, cim: TapChanger, network_service: NetworkService):
2115
+ cim.high_step = get_nullable(pb, 'highStep')
2116
+ cim.step = get_nullable(pb, 'step')
2117
+ cim.neutral_step = get_nullable(pb, 'neutralStep')
2118
+ cim.normal_step = get_nullable(pb, 'normalStep')
2119
+ cim.low_step = get_nullable(pb, 'lowStep')
2120
+ cim.neutral_u = get_nullable(pb, 'neutralU')
2121
+ cim.control_enabled = get_nullable(pb, 'controlEnabled')
2122
+ network_service.resolve_or_defer_reference(resolver.tc_tap_changer_control(cim), pb.tapChangerControlMRID)
2123
+
2124
+ power_system_resource_to_cim(pb.psr, cim, network_service)
2125
+
2126
+
2127
+ @bind_to_cim
2128
+ @add_to_network_or_none
2129
+ def tap_changer_control_to_cim(pb: PBTapChangerControl, network_service: NetworkService) -> Optional[TapChangerControl]:
2130
+ # noinspection PyUnresolvedReferences
2131
+ cim = TapChangerControl(
2132
+ mrid=pb.mrid(),
2133
+ limit_voltage=get_nullable(pb, 'limitVoltage'),
2134
+ line_drop_compensation=get_nullable(pb, "lineDropCompensation"),
2135
+ line_drop_r=get_nullable(pb, 'lineDropR'),
2136
+ line_drop_x=get_nullable(pb, 'lineDropX'),
2137
+ reverse_line_drop_r=get_nullable(pb, 'reverseLineDropR'),
2138
+ reverse_line_drop_x=get_nullable(pb, 'reverseLineDropX'),
2139
+ forward_ldc_blocking=get_nullable(pb, "forwardLDCBlocking"),
2140
+ time_delay=get_nullable(pb, 'timeDelay'),
2141
+ co_generation_enabled=get_nullable(pb, "coGenerationEnabled"),
2142
+ )
2143
+
2144
+ regulating_control_to_cim(pb.rc, cim, network_service)
2145
+ return cim
2146
+
2147
+
2148
+ def transformer_end_to_cim(pb: PBTransformerEnd, cim: TransformerEnd, network_service: NetworkService):
2149
+ cim.end_number = pb.endNumber
2150
+ cim.grounded = get_nullable(pb, 'grounded')
2151
+ cim.r_ground = get_nullable(pb, 'rGround')
2152
+ cim.x_ground = get_nullable(pb, 'xGround')
2153
+
2154
+ network_service.resolve_or_defer_reference(resolver.te_terminal(cim), pb.terminalMRID)
2155
+ network_service.resolve_or_defer_reference(resolver.te_base_voltage(cim), pb.baseVoltageMRID)
2156
+ network_service.resolve_or_defer_reference(resolver.ratio_tap_changer(cim), pb.ratioTapChangerMRID)
2157
+ network_service.resolve_or_defer_reference(resolver.transformer_end_transformer_star_impedance(cim), pb.starImpedanceMRID)
2158
+
2159
+ identified_object_to_cim(pb.io, cim, network_service)
2160
+
2161
+
2162
+ def transformer_end_rated_s_to_cim(pb: PBTransformerEndRatedS) -> Optional[TransformerEndRatedS]:
2163
+ return TransformerEndRatedS(cooling_type=TransformerCoolingType(pb.coolingType), rated_s=pb.ratedS)
2164
+
2165
+
2166
+ @bind_to_cim
2167
+ @add_to_network_or_none
2168
+ def transformer_star_impedance_to_cim(pb: PBTransformerStarImpedance, network_service: NetworkService) -> Optional[TransformerStarImpedance]:
2169
+ # noinspection PyUnresolvedReferences
2170
+ cim = TransformerStarImpedance(
2171
+ mrid=pb.mrid(),
2172
+ r=get_nullable(pb, 'r'),
2173
+ r0=get_nullable(pb, 'r0'),
2174
+ x=get_nullable(pb, 'x'),
2175
+ x0=get_nullable(pb, 'x0'),
2176
+ )
2177
+
2178
+ network_service.resolve_or_defer_reference(resolver.star_impedance_transformer_end_info(cim), pb.transformerEndInfoMRID)
2179
+
2180
+ identified_object_to_cim(pb.io, cim, network_service)
2181
+ return cim
2182
+
2183
+
2184
+ ###############################
2185
+ # IEC61970 InfIEC61970 Feeder #
2186
+ ###############################
2187
+
2188
+ @bind_to_cim
2189
+ @add_to_network_or_none
2190
+ def circuit_to_cim(pb: PBCircuit, network_service: NetworkService) -> Optional[Circuit]:
2191
+ # noinspection PyUnresolvedReferences
2192
+ cim = Circuit(mrid=pb.mrid())
2193
+
2194
+ network_service.resolve_or_defer_reference(resolver.loop(cim), pb.loopMRID)
2195
+ for mrid in pb.endTerminalMRIDs:
2196
+ network_service.resolve_or_defer_reference(resolver.end_terminal(cim), mrid)
2197
+ for mrid in pb.endSubstationMRIDs:
2198
+ network_service.resolve_or_defer_reference(resolver.end_substation(cim), mrid)
2199
+
2200
+ line_to_cim(pb.l, cim, network_service)
2201
+ return cim