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