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,816 @@
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
+ from logging import Logger
6
+ from typing import Optional, Callable, List, Union, Type, TypeVar, Protocol
7
+
8
+ from zepben.ewb import (ConductingEquipment, NetworkService, PhaseCode, EnergySource, AcLineSegment, Breaker, Terminal, LvFeeder,
9
+ PowerTransformer, EnergyConsumer, PowerElectronicsConnection, Clamp, Cut)
10
+ from zepben.ewb.model.cim.extensions.iec61970.base.core.site import Site
11
+ from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
12
+ from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
13
+ from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
14
+ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd
15
+ from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
16
+ from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing
17
+
18
+ SubclassesConductingEquipment = TypeVar('SubclassesConductingEquipment', bound=ConductingEquipment)
19
+
20
+
21
+ def null_action(_):
22
+ """
23
+ An action that does nothing.
24
+
25
+ :param _: Any item that will be ignored
26
+ """
27
+
28
+
29
+ class OtherCreator(Protocol):
30
+ """Type hint class"""
31
+
32
+ def __call__(self, mrid: str, *args, **kwargs) -> ConductingEquipment: ...
33
+
34
+
35
+ class TestNetworkBuilder:
36
+ """
37
+ A class for building simple test networks, often used for unit testing.
38
+ """
39
+
40
+ __test__ = False
41
+
42
+ def __init__(self):
43
+ self.network: NetworkService = NetworkService()
44
+ """
45
+ The network where objects are created for this `TestNetworkBuilder`. You should not be readily required to access the network via this property,
46
+ but should instead access it via `build` to ensure the correct tracing is applied before use.
47
+ """
48
+
49
+ self._count = 0
50
+ self._current: Optional[ConductingEquipment] = None
51
+ self._current_terminal: Optional[int] = None
52
+
53
+ def from_source(
54
+ self,
55
+ nominal_phases: PhaseCode = PhaseCode.ABC,
56
+ mrid: Optional[str] = None,
57
+ action: Callable[[EnergySource], None] = null_action
58
+ ) -> 'TestNetworkBuilder':
59
+ """
60
+ Start a new network island from an `EnergySource`, updating the network pointer to the new `EnergySource`.
61
+
62
+ :param nominal_phases: The `PhaseCode` for the new `EnergySource`, used as both the nominal and energising phases. Must be a subset of `PhaseCode.ABCN`.
63
+ :param mrid: Optional mRID for the new source.
64
+ :param action: An action that accepts the new `EnergySource` to allow for additional initialisation.
65
+
66
+ :return: This `TestNetworkBuilder` to allow for fluent use.
67
+ """
68
+ it = self._create_external_source(mrid, nominal_phases)
69
+ action(it)
70
+ self._current = it
71
+ return self
72
+
73
+ def to_source(
74
+ self,
75
+ nominal_phases: PhaseCode = PhaseCode.ABC,
76
+ mrid: Optional[str] = None,
77
+ connectivity_node_mrid: Optional[str] = None,
78
+ action: Callable[[EnergySource], None] = null_action
79
+ ) -> 'TestNetworkBuilder':
80
+ """
81
+ Add a new `EnergySource` to the network and connect it to the current network pointer, updating the network pointer to the new `EnergySource`.
82
+
83
+ :param nominal_phases: The `PhaseCode` for the new `EnergySource`, used as both the nominal and energising phases. Must be a subset of `PhaseCode.ABCN`.
84
+ :param mrid: Optional mRID for the new source.
85
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `EnergySource` to the previous item. Will only be used if the
86
+ previous item is not already connected.
87
+ :param action: An action that accepts the new `EnergySource` to allow for additional initialisation.
88
+
89
+ :return: This `TestNetworkBuilder` to allow for fluent use.
90
+ """
91
+ it = self._create_external_source(mrid, nominal_phases)
92
+ self._connect(self._current, it, connectivity_node_mrid)
93
+ action(it)
94
+ self._current = it
95
+ return self
96
+
97
+ def from_acls(
98
+ self,
99
+ nominal_phases: PhaseCode = PhaseCode.ABC,
100
+ mrid: Optional[str] = None,
101
+ action: Callable[[AcLineSegment], None] = null_action
102
+ ) -> 'TestNetworkBuilder':
103
+ """
104
+ Start a new network island from an `AcLineSegment`, updating the network pointer to the new `AcLineSegment`.
105
+
106
+ :param nominal_phases: The nominal phases for the new `AcLineSegment`.
107
+ :param mrid: Optional mRID for the new `AcLineSegment`.
108
+ :param action: An action that accepts the new `AcLineSegment` to allow for additional initialisation.
109
+
110
+ :return: This `TestNetworkBuilder` to allow for fluent use.
111
+ """
112
+ it = self._create_acls(mrid, nominal_phases)
113
+ action(it)
114
+ self._current = it
115
+ return self
116
+
117
+ def to_acls(
118
+ self,
119
+ nominal_phases: PhaseCode = PhaseCode.ABC,
120
+ mrid: Optional[str] = None,
121
+ connectivity_node_mrid: Optional[str] = None,
122
+ action: Callable[[AcLineSegment], None] = null_action
123
+ ) -> 'TestNetworkBuilder':
124
+ """
125
+ Add a new `AcLineSegment` to the network and connect it to the current network pointer, updating the network pointer to the new `AcLineSegment`.
126
+
127
+ :param nominal_phases: The nominal phases for the new `AcLineSegment`.
128
+ :param mrid: Optional mRID for the new `AcLineSegment`.
129
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `AcLineSegment` to the previous item. Will only be used if the
130
+ previous item is not already connected.
131
+ :param action: An action that accepts the new `AcLineSegment` to allow for additional initialisation.
132
+
133
+ :return: This `TestNetworkBuilder` to allow for fluent use.
134
+ """
135
+ acls = self._create_acls(mrid, nominal_phases)
136
+ self._connect(self._current, acls, connectivity_node_mrid)
137
+ action(acls)
138
+ self._current = acls
139
+ return self
140
+
141
+ def from_breaker(
142
+ self,
143
+ nominal_phases: PhaseCode = PhaseCode.ABC,
144
+ is_normally_open: bool = False,
145
+ is_open: Optional[bool] = None,
146
+ mrid: Optional[str] = None,
147
+ action: Callable[[Breaker], None] = null_action
148
+ ) -> 'TestNetworkBuilder':
149
+ """
150
+ Start a new network island from a `Breaker`, updating the network pointer to the new `Breaker`.
151
+
152
+ :param nominal_phases: The nominal phases for the new `Breaker`.
153
+ :param is_normally_open: The normal state of the switch. Defaults to False.
154
+ :param is_open: The current state of the switch. Defaults to `is_normally_open`.
155
+ :param mrid: Optional mRID for the new `Breaker`.
156
+ :param action: An action that accepts the new `Breaker` to allow for additional initialisation.
157
+
158
+ :return: This `TestNetworkBuilder` to allow for fluent use.
159
+ """
160
+ it = self._create_breaker(mrid, nominal_phases, is_normally_open=is_normally_open, is_open=is_open if is_open is not None else is_normally_open)
161
+ action(it)
162
+ self._current = it
163
+ return self
164
+
165
+ def to_breaker(
166
+ self,
167
+ nominal_phases: PhaseCode = PhaseCode.ABC,
168
+ is_normally_open: bool = False,
169
+ is_open: Optional[bool] = None,
170
+ mrid: Optional[str] = None,
171
+ connectivity_node_mrid: Optional[str] = None,
172
+ action: Callable[[Breaker], None] = null_action
173
+ ) -> 'TestNetworkBuilder':
174
+ """
175
+ Add a new `Breaker` to the network and connect it to the current network pointer, updating the network pointer to the new `Breaker`.
176
+
177
+ :param nominal_phases: The nominal phases for the new `Breaker`.
178
+ :param is_normally_open: The normal state of the switch. Defaults to False.
179
+ :param is_open: The current state of the switch. Defaults to `is_normally_open`.
180
+ :param mrid: Optional mRID for the new `Breaker`.
181
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `Breaker` to the previous item. Will only be used if the
182
+ previous item is not already connected.
183
+ :param action: An action that accepts the new `Breaker` to allow for additional initialisation.
184
+
185
+ :return: This `TestNetworkBuilder` to allow for fluent use.
186
+ """
187
+ it = self._create_breaker(mrid, nominal_phases, is_normally_open=is_normally_open, is_open=is_open if is_open is not None else is_normally_open)
188
+ self._connect(self._current, it, connectivity_node_mrid)
189
+ action(it)
190
+ self._current = it
191
+ return self
192
+
193
+ def from_junction(
194
+ self,
195
+ nominal_phases: PhaseCode = PhaseCode.ABC,
196
+ num_terminals: Optional[int] = None,
197
+ mrid: Optional[str] = None,
198
+ action: Callable[[Junction], None] = null_action
199
+ ) -> 'TestNetworkBuilder':
200
+ """
201
+ Start a new network island from a `Junction`, updating the network pointer to the new `Junction`.
202
+
203
+ :param nominal_phases: The nominal phases for the new `Junction`.
204
+ :param num_terminals: The number of terminals to create on the new `Junction`. Defaults to 2.
205
+ :param mrid: Optional mRID for the new `Junction`.
206
+ :param action: An action that accepts the new `Junction` to allow for additional initialisation.
207
+
208
+ :return: This `TestNetworkBuilder` to allow for fluent use.
209
+ """
210
+ it = self._create_junction(mrid, nominal_phases, num_terminals)
211
+ action(it)
212
+ self._current = it
213
+ return self
214
+
215
+ def to_junction(
216
+ self,
217
+ nominal_phases: PhaseCode = PhaseCode.ABC,
218
+ num_terminals: Optional[int] = None,
219
+ mrid: Optional[str] = None,
220
+ connectivity_node_mrid: Optional[str] = None,
221
+ action: Callable[[Junction], None] = null_action
222
+ ) -> 'TestNetworkBuilder':
223
+ """
224
+ Add a new `Junction` to the network and connect it to the current network pointer, updating the network pointer to the new `Junction`.
225
+
226
+ :param nominal_phases: The nominal phases for the new `Junction`.
227
+ :param num_terminals: The number of terminals to create on the new `Junction`. Defaults to 2.
228
+ :param mrid: Optional mRID for the new `Junction`.
229
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `Junction` to the previous item. Will only be used if the
230
+ previous item is not already connected.
231
+ :param action: An action that accepts the new `Junction` to allow for additional initialisation.
232
+
233
+ :return: This `TestNetworkBuilder` to allow for fluent use.
234
+ """
235
+ it = self._create_junction(mrid, nominal_phases, num_terminals)
236
+ self._connect(self._current, it, connectivity_node_mrid)
237
+ action(it)
238
+ self._current = it
239
+ return self
240
+
241
+ def to_power_electronics_connection(
242
+ self,
243
+ nominal_phases: PhaseCode = PhaseCode.ABC,
244
+ num_terminals: Optional[int] = None,
245
+ mrid: Optional[str] = None,
246
+ connectivity_node_mrid: Optional[str] = None,
247
+ action: Callable[[PowerElectronicsConnection], None] = null_action
248
+ ) -> 'TestNetworkBuilder':
249
+ """
250
+ Add a new `PowerElectronicsConnection` to the network and connect it to the current network pointer, updating the network pointer to the new
251
+ `PowerElectronicsConnection`.
252
+
253
+ :param nominal_phases: The nominal phases for the new `PowerElectronicsConnection`.
254
+ :param num_terminals: The number of terminals to create on the new `PowerElectronicsConnection`. Defaults to 2.
255
+ :param mrid: Optional mRID for the new `PowerElectronicsConnection`.
256
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `PowerElectronicsConnection` to the previous item. Will only be
257
+ used if the previous item is not already connected.
258
+ :param action: An action that accepts the new `PowerElectronicsConnection` to allow for additional initialisation.
259
+
260
+ :return: This `TestNetworkBuilder` to allow for fluent use.
261
+ """
262
+ it = self._create_power_electronics_connection(mrid, nominal_phases, num_terminals)
263
+ self._connect(self._current, it, connectivity_node_mrid)
264
+ action(it)
265
+ self._current = it
266
+ return self
267
+
268
+ def from_power_transformer(
269
+ self,
270
+ nominal_phases: Optional[List[PhaseCode]] = None,
271
+ end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
272
+ mrid: Optional[str] = None,
273
+ action: Callable[[PowerTransformer], None] = null_action
274
+ ) -> 'TestNetworkBuilder':
275
+ """
276
+ Start a new network island from a `PowerTransformer`, updating the network pointer to the new `PowerTransformer`.
277
+
278
+ :param nominal_phases: The nominal phases for each end of the new `PowerTransformer`. Defaults to two `PhaseCode.ABC` ends.
279
+ :param end_actions: Actions that accepts the new `PowerTransformerEnd` to allow for additional initialisation.
280
+ :param action: An action that accepts the new `PowerTransformer` to allow for additional initialisation.
281
+ :param mrid: Optional mRID for the new `PowerTransformer`.
282
+ :return: This `TestNetworkBuilder` to allow for fluent use.
283
+ """
284
+ it = self._create_power_transformer(mrid, nominal_phases or [PhaseCode.ABC, PhaseCode.ABC])
285
+ if end_actions:
286
+ for i in range(0, it.num_ends()):
287
+ end_actions[i](it.get_end_by_num(i + 1))
288
+
289
+ action(it)
290
+ self._current = it
291
+ return self
292
+
293
+ def to_power_transformer(
294
+ self,
295
+ nominal_phases: Optional[List[PhaseCode]] = None,
296
+ end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
297
+ mrid: Optional[str] = None,
298
+ connectivity_node_mrid: Optional[str] = None,
299
+ action: Callable[[PowerTransformer], None] = null_action
300
+ ) -> 'TestNetworkBuilder':
301
+ """
302
+ Add a new `PowerTransformer` to the network and connect it to the current network pointer, updating the network pointer to the new `PowerTransformer`.
303
+
304
+ :param nominal_phases: The nominal phases for each end of the new `PowerTransformer`. Defaults to two `PhaseCode.ABC` ends.
305
+ :param end_actions: Actions that accepts the new `PowerTransformerEnd` to allow for additional initialisation.
306
+ :param action: An action that accepts the new `PowerTransformer` to allow for additional initialisation.
307
+ :param mrid: Optional mRID for the new `PowerTransformer`.
308
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `PowerTransformer` to the previous item. Will only be used if
309
+ the previous item is not already connected.
310
+ :return: This `TestNetworkBuilder` to allow for fluent use.
311
+ """
312
+ it = self._create_power_transformer(mrid, nominal_phases or [PhaseCode.ABC, PhaseCode.ABC])
313
+ self._connect(self._current, it, connectivity_node_mrid)
314
+
315
+ if end_actions:
316
+ for i in range(0, it.num_ends()):
317
+ end_actions[i](it.get_end_by_num(i + 1))
318
+
319
+ action(it)
320
+ self._current = it
321
+ return self
322
+
323
+ def to_energy_consumer(
324
+ self,
325
+ nominal_phases: PhaseCode = PhaseCode.ABC,
326
+ mrid: Optional[str] = None,
327
+ connectivity_node_mrid: Optional[str] = None,
328
+ action: Callable[[EnergyConsumer], None] = null_action
329
+ ) -> 'TestNetworkBuilder':
330
+ """
331
+ Add a new `EnergyConsumer` to the network and connect it to the current network pointer, updating the network pointer to the new
332
+ `EnergyConsumer`.
333
+
334
+ :param nominal_phases: The nominal phases for the new `EnergyConsumer`.
335
+ :param mrid: Optional mRID for the new `EnergyConsumer`.
336
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `EnergyConsumer` to the previous item. Will only be used if the
337
+ previous item is not already connected.
338
+ :param action: An action that accepts the new `EnergyConsumer` to allow for additional initialisation.
339
+
340
+ :return: This `TestNetworkBuilder` to allow for fluent use.
341
+ """
342
+ it = self._create_energy_consumer(mrid, nominal_phases)
343
+ self._connect(self._current, it, connectivity_node_mrid)
344
+ action(it)
345
+ self._current = it
346
+ return self
347
+
348
+ def from_busbar_section(
349
+ self,
350
+ nominal_phases: PhaseCode = PhaseCode.ABC,
351
+ mrid: str = None,
352
+ action: Callable[[BusbarSection], None] = null_action
353
+ ) -> 'TestNetworkBuilder':
354
+ """
355
+ Start a new network island from a `BusbarSection`, updating the network pointer to the new `BusbarSection`.
356
+
357
+ :param nominal_phases: The nominal phases for the new `BusbarSection`.
358
+ :param mrid: Optional mRID for the new `BusbarSection`.
359
+ :param action: An action that accepts the new `BusbarSection` to allow for additional initialisation.
360
+
361
+ :return: This `TestNetworkBuilder` to allow for fluent use.
362
+ """
363
+ it = self._create_busbar_section(mrid, nominal_phases)
364
+ action(it)
365
+ self._current = it
366
+ return self
367
+
368
+ def to_busbar_section(
369
+ self,
370
+ nominal_phases: PhaseCode = PhaseCode.ABC,
371
+ mrid: str = None,
372
+ connectivity_node_mrid: Optional[str] = None,
373
+ action: Callable[[BusbarSection], None] = null_action
374
+ ) -> 'TestNetworkBuilder':
375
+ """
376
+
377
+ Add a new `BusbarSection` to the network and connect it to the current network pointer, updating the network pointer to the new `BusbarSection`.
378
+
379
+ :param nominal_phases: The nominal phases for the new `BusbarSection`.
380
+ :param mrid: Optional mRID for the new `BusbarSection`.
381
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `BusbarSection` to the previous item. Will only be used
382
+ if the previous item is not already connected.
383
+ :param action: An action that accepts the new `BusbarSection` to allow for additional initialisation.
384
+
385
+ :return: This `TestNetworkBuilder` to allow for fluent use.
386
+ """
387
+ it = self._create_busbar_section(mrid, nominal_phases)
388
+ self._connect(self._current, it, connectivity_node_mrid)
389
+ action(it)
390
+ self._current = it
391
+ return self
392
+
393
+ def from_other(
394
+ self,
395
+ creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
396
+ nominal_phases: PhaseCode = PhaseCode.ABC,
397
+ num_terminals: Optional[int] = None,
398
+ mrid: Optional[str] = None,
399
+ action: Callable[[SubclassesConductingEquipment], None] = null_action,
400
+ default_mrid_prefix: Optional[str] = None
401
+ ) -> 'TestNetworkBuilder':
402
+ """
403
+ Start a new network island from a `ConductingEquipment` created by `creator`, updating the network pointer to the new `ConductingEquipment`.
404
+
405
+ :param creator: A callable function used to create the new `ConductingEquipment`. It will be passed the generated mRID for the new
406
+ `ConductingEquipment`.
407
+ :param nominal_phases: The nominal phases for the new `ConductingEquipment`.
408
+ :param num_terminals: The number of terminals to create on the new `ConductingEquipment`. Defaults to 2.
409
+ :param mrid: Optional mRID for the new `ConductingEquipment`.
410
+ :param action: An action that accepts the new `ConductingEquipment` to allow for additional initialisation.
411
+ :param default_mrid_prefix: mRID prefix to use for the new `ConductingEquipment`
412
+
413
+ :return: This `TestNetworkBuilder` to allow for fluent use.
414
+ """
415
+ if mrid and default_mrid_prefix:
416
+ raise ValueError('cant specify both mrid and default_mrid_prefix as your intention is unclear')
417
+ it = self._create_other(mrid, creator, nominal_phases, num_terminals, default_mrid_prefix=default_mrid_prefix)
418
+ action(it)
419
+ self._current = it
420
+ return self
421
+
422
+ def to_other(
423
+ self,
424
+ creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
425
+ nominal_phases: PhaseCode = PhaseCode.ABC,
426
+ num_terminals: Optional[int] = None,
427
+ mrid: Optional[str] = None,
428
+ connectivity_node_mrid: Optional[str] = None,
429
+ action: Callable[[SubclassesConductingEquipment], None] = null_action,
430
+ default_mrid_prefix: Optional[str] = None
431
+ ) -> 'TestNetworkBuilder':
432
+ """
433
+ Add a new `ConductingEquipment` to the network and connect it to the current network pointer, updating the network pointer to the new
434
+ `ConductingEquipment`.
435
+
436
+ :param creator: A callable function used to create the new `ConductingEquipment`. It will be passed the generated mRID for the new
437
+ `ConductingEquipment`.
438
+ :param nominal_phases: The nominal phases for the new `ConductingEquipment`.
439
+ :param num_terminals: The number of terminals to create on the new `ConductingEquipment`. Defaults to 2.
440
+ :param mrid: Optional mRID for the new `ConductingEquipment`.
441
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect this `ConductingEquipment` to the previous item. Will only be used
442
+ if the previous item is not already connected.
443
+ :param action: An action that accepts the new `ConductingEquipment` to allow for additional initialisation.
444
+ :param default_mrid_prefix: mRID prefix to use for the new `ConductingEquipment`
445
+
446
+ :return: This `TestNetworkBuilder` to allow for fluent use.
447
+ """
448
+ if mrid and default_mrid_prefix:
449
+ raise ValueError('cant specify both mrid and default_mrid_prefix as your intention is unclear')
450
+ it = self._create_other(mrid, creator, nominal_phases, num_terminals, default_mrid_prefix=default_mrid_prefix)
451
+ self._connect(self._current, it, connectivity_node_mrid)
452
+ action(it)
453
+ self._current = it
454
+ return self
455
+
456
+ def with_clamp(
457
+ self,
458
+ mrid: Optional[str] = None,
459
+ length_from_terminal_1: float = None,
460
+ nominal_phases: PhaseCode = PhaseCode.ABC,
461
+ action: Callable[[Clamp], None] = null_action
462
+ ) -> 'TestNetworkBuilder':
463
+ """
464
+ Create a clamp on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
465
+
466
+ :param mrid: Optional mRID for the new `Clamp`
467
+ :param length_from_terminal_1: The length from terminal 1 of the `AcLineSegment` being clamped
468
+ :param nominal_phases: The nominal phases for the new `BusbarSection`.
469
+ :param action: An action that accepts the new `Clamp` to allow for additional initialisation.
470
+
471
+ :return: This `TestNetworkBuilder` to allow for fluent use
472
+ """
473
+ acls = self._current
474
+ if not isinstance(acls, AcLineSegment):
475
+ raise ValueError("`with_clamp` can only be called when the last added item was an AcLineSegment")
476
+
477
+ clamp = Clamp(mrid=mrid or f'{acls.mrid}-clamp{acls.num_clamps() + 1}', length_from_terminal_1=length_from_terminal_1)
478
+ self._add_terminal(clamp, 1, nominal_phases)
479
+
480
+ acls.add_clamp(clamp)
481
+ action(clamp)
482
+ self.network.add(clamp)
483
+ return self
484
+
485
+ def with_cut(
486
+ self,
487
+ mrid: Optional[str] = None,
488
+ length_from_terminal_1: Optional[float] = None,
489
+ is_normally_open: bool = True,
490
+ is_open: bool = None,
491
+ nominal_phases: PhaseCode = PhaseCode.ABC,
492
+ action: Callable[[Cut], None] = null_action
493
+ ) -> 'TestNetworkBuilder':
494
+ """
495
+ Create a cut on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
496
+
497
+ :param mrid: Optional mRID for the new `Cut`
498
+ :param length_from_terminal_1: The length from terminal 1 of the `AcLineSegment` being cut
499
+ :param is_normally_open: The normal state of the cut, defaults to True
500
+ :param is_open: The current state of the cut. Defaults to `is_normally_open`
501
+ :param nominal_phases: The nominal phases for the new `BusbarSection`.
502
+ :param action: An action that accepts the new `Cut` to allow for additional initialisation.
503
+
504
+ :return: This `TestNetworkBuilder` to allow for fluent use
505
+ """
506
+ acls = self._current
507
+ if not isinstance(acls, AcLineSegment):
508
+ raise ValueError("`with_cut` can only be called when the last added item was an AcLineSegment")
509
+
510
+ cut = Cut(mrid=mrid or f'{acls.mrid}-cut{acls.num_cuts() + 1}', length_from_terminal_1=length_from_terminal_1)
511
+ for i in [1, 2]:
512
+ self._add_terminal(cut, i, nominal_phases)
513
+
514
+ cut.set_normally_open(is_normally_open)
515
+ if is_open is None:
516
+ cut.set_open(is_normally_open)
517
+ else:
518
+ cut.set_open(is_open)
519
+
520
+ acls.add_cut(cut)
521
+ action(cut)
522
+ self.network.add(cut)
523
+ return self
524
+
525
+ def branch_from(self, from_: str, terminal: Optional[int] = None) -> 'TestNetworkBuilder':
526
+ """
527
+ Move the current network pointer to the specified `from` allowing branching of the network. This has the effect of changing the current network pointer.
528
+
529
+ :param from_: The mRID of the `ConductingEquipment` to split from.
530
+ :param terminal: The terminal to split from. Defaults to last terminal.
531
+
532
+ :return: This `TestNetworkBuilder` to allow for fluent use.
533
+ """
534
+ self._current = self.network.get(from_, ConductingEquipment)
535
+ self._current_terminal = terminal
536
+ return self
537
+
538
+ def connect_to(
539
+ self,
540
+ to: str,
541
+ to_terminal: int = None,
542
+ from_terminal: int = None,
543
+ connectivity_node_mrid: Optional[str] = None
544
+ ) -> 'TestNetworkBuilder':
545
+ """
546
+ Connect to current network pointer to the specified `to` without moving the current network pointer.
547
+
548
+ :param to: The mRID of the second `ConductingEquipment` to be connected.
549
+ :param to_terminal: The sequence number or terminal on `to` which will be connected.
550
+ :param from_terminal: Optional sequence number of the terminal on current network pointer which will be connected.
551
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect the terminals. Will only be used if both terminals are not already
552
+ connected.
553
+ :return: This `TestNetworkBuilder` to allow for fluent use.
554
+ """
555
+
556
+ self._connect(
557
+ self._current,
558
+ self.network.get(to, ConductingEquipment),
559
+ connectivity_node_mrid,
560
+ from_terminal,
561
+ to_terminal
562
+ )
563
+ return self
564
+
565
+ def connect(
566
+ self,
567
+ from_: str,
568
+ to: str,
569
+ from_terminal: int,
570
+ to_terminal: int,
571
+ connectivity_node_mrid: Optional[str] = None
572
+ ) -> 'TestNetworkBuilder':
573
+ """
574
+ Connect the specified `from` and `to` without moving the current network pointer.
575
+
576
+ :param from_: The mRID of the first `ConductingEquipment` to be connected.
577
+ :param to: The mRID of the second `ConductingEquipment` to be connected.
578
+ :param from_terminal: The sequence number of the terminal on `from` which will be connected.
579
+ :param to_terminal: The sequence number of the terminal on `to` which will be connected.
580
+ :param connectivity_node_mrid: Optional id of the connectivity node used to connect the terminals. Will only be used if both terminals are not already
581
+ connected.
582
+
583
+ :return: This `TestNetworkBuilder` to allow for fluent use.
584
+ """
585
+ self._connect(
586
+ self.network.get(from_, ConductingEquipment),
587
+ self.network.get(to, ConductingEquipment),
588
+ connectivity_node_mrid,
589
+ from_terminal,
590
+ to_terminal
591
+ )
592
+ return self
593
+
594
+ def add_feeder(self, head_mrid: str, sequence_number: Optional[int] = None, mrid: Optional[str] = None) -> 'TestNetworkBuilder':
595
+ """
596
+ Create a new feeder with the specified terminal as the head terminal.
597
+
598
+ :param head_mrid: The mRID of the head `ConductingEquipment`.
599
+ :param sequence_number: The `Terminal` sequence number of the head terminal. Defaults to last terminal.
600
+ :param mrid: Optional mRID for the new `Feeder`.
601
+
602
+ :return: This `TestNetworkBuilder` to allow for fluent use.
603
+ """
604
+ self._create_feeder(mrid, self.network.get(head_mrid, ConductingEquipment), sequence_number)
605
+ return self
606
+
607
+ def add_lv_feeder(self, head_mrid: str, sequence_number: Optional[int] = None, mrid: Optional[str] = None) -> 'TestNetworkBuilder':
608
+ """
609
+ Create a new LV feeder with the specified terminal as the head terminal.
610
+
611
+ :param head_mrid: The mRID of the head `ConductingEquipment`.
612
+ :param sequence_number: The `Terminal` sequence number of the head terminal. Defaults to last terminal.
613
+ :param mrid: Optional mRID for the new `LvFeeder`.
614
+
615
+ :return: This `TestNetworkBuilder` to allow for fluent use.
616
+ """
617
+ self._create_lv_feeder(mrid, self.network.get(head_mrid, ConductingEquipment), sequence_number)
618
+ return self
619
+
620
+ def add_site(self, equipment_mrids: List[str], mrid: Optional[str] = None) -> 'TestNetworkBuilder':
621
+ """
622
+ Create a new Site containing the specified equipment.
623
+
624
+ :param equipment_mrids: The mRID's of the equipment to add to the site
625
+ :param mrid: Optional mRID for the new `Site`.
626
+ :return: This [TestNetworkBuilder] to allow for fluent use.
627
+ """
628
+
629
+ site = Site(mrid=self._next_id(mrid, 'site'))
630
+
631
+ for _id in equipment_mrids:
632
+ ce = self.network[_id]
633
+ site.add_equipment(ce)
634
+ ce.add_container(site)
635
+ self.network.add(site)
636
+
637
+ return self
638
+
639
+ async def build(self, apply_directions_from_sources: bool = True, debug_logger: Logger = None) -> NetworkService:
640
+ """
641
+ Get the `NetworkService` after apply traced phasing and feeder directions.
642
+
643
+ Does not infer phasing.
644
+
645
+ :return: The `NetworkService` created by this `TestNetworkBuilder`
646
+ """
647
+ await Tracing.set_direction(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
648
+ await Tracing.set_direction(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
649
+ await Tracing.set_phases(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
650
+ await Tracing.set_phases(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
651
+
652
+ if apply_directions_from_sources:
653
+ for es in self.network.objects(EnergySource):
654
+ for terminal in es.terminals:
655
+ await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.NORMAL)
656
+ await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.CURRENT)
657
+
658
+ await Tracing.assign_equipment_to_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
659
+ await Tracing.assign_equipment_to_lv_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
660
+ await Tracing.assign_equipment_to_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
661
+ await Tracing.assign_equipment_to_lv_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
662
+
663
+ return self.network
664
+
665
+ def _next_id(self, mrid: Optional[str], type_: str) -> str:
666
+ if mrid:
667
+ return mrid
668
+
669
+ id_ = f"{type_}{self._count}"
670
+ self._count += 1
671
+ return id_
672
+
673
+ def _connect(
674
+ self,
675
+ from_: ConductingEquipment,
676
+ to: ConductingEquipment,
677
+ connectivity_node_mrid: Optional[str] = None,
678
+ from_terminal: Optional[int] = None,
679
+ to_terminal: Optional[int] = None
680
+ ):
681
+ from_term = from_.get_terminal_by_sn(from_terminal if from_terminal else self._current_terminal if self._current_terminal else from_.num_terminals())
682
+ to_term = to.get_terminal_by_sn(to_terminal if to_terminal else 1)
683
+ if (connectivity_node_mrid is None) or from_term.connected or to_term.connected:
684
+ self.network.connect_terminals(from_term, to_term)
685
+ else:
686
+ self.network.connect_by_mrid(from_term, connectivity_node_mrid)
687
+ self.network.connect_by_mrid(to_term, connectivity_node_mrid)
688
+ self._current_terminal = None
689
+
690
+ def _create_external_source(self, mrid: Optional[str], nominal_phases: PhaseCode) -> EnergySource:
691
+ if any(it not in PhaseCode.ABCN for it in nominal_phases.single_phases):
692
+ raise ValueError("EnergySource phases must be a subset of ABCN")
693
+
694
+ es = EnergySource(mrid=self._next_id(mrid, "s"), is_external_grid=True)
695
+ self._add_terminal(es, 1, nominal_phases)
696
+
697
+ self.network.add(es)
698
+ return es
699
+
700
+ def _create_acls(self, mrid: Optional[str], nominal_phases: PhaseCode) -> AcLineSegment:
701
+ acls = AcLineSegment(mrid=self._next_id(mrid, "c"))
702
+ self._add_terminal(acls, 1, nominal_phases)
703
+ self._add_terminal(acls, 2, nominal_phases)
704
+
705
+ self.network.add(acls)
706
+ return acls
707
+
708
+ def _create_breaker(self, mrid: Optional[str], nominal_phases: PhaseCode, is_normally_open: bool, is_open: bool) -> Breaker:
709
+ b = Breaker(mrid=self._next_id(mrid, "b"))
710
+ b.set_normally_open(is_normally_open)
711
+ b.set_open(is_open)
712
+
713
+ self._add_terminal(b, 1, nominal_phases)
714
+ self._add_terminal(b, 2, nominal_phases)
715
+
716
+ self.network.add(b)
717
+ return b
718
+
719
+ def _create_junction(self, mrid: Optional[str], nominal_phases: PhaseCode, num_terminals: Optional[int]) -> Junction:
720
+ j = Junction(mrid=self._next_id(mrid, "j"))
721
+ for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
722
+ self._add_terminal(j, i, nominal_phases)
723
+
724
+ self.network.add(j)
725
+ return j
726
+
727
+ def _create_busbar_section(self, mrid: Optional[str], nominal_phases: PhaseCode) -> BusbarSection:
728
+ b = BusbarSection(mrid=self._next_id(mrid, 'bbs'))
729
+ self._add_terminal(b, 1, nominal_phases)
730
+
731
+ self.network.add(b)
732
+ return b
733
+
734
+ def _create_power_electronics_connection(self, mrid: Optional[str], nominal_phases: PhaseCode, num_terminals: Optional[int]) -> PowerElectronicsConnection:
735
+ pec = PowerElectronicsConnection(mrid=self._next_id(mrid, "pec"))
736
+ for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
737
+ self._add_terminal(pec, i, nominal_phases)
738
+
739
+ self.network.add(pec)
740
+ return pec
741
+
742
+ def _create_power_transformer(self, mrid: Optional[str], nominal_phases: List[PhaseCode]):
743
+ tx = PowerTransformer(mrid=self._next_id(mrid, "tx"))
744
+
745
+ i = 1
746
+ for phase_code in nominal_phases:
747
+ t = Terminal(mrid=f"{tx.mrid}-t{i}")
748
+ t.phases = phase_code
749
+ self.network.add(t)
750
+
751
+ tx.add_terminal(t)
752
+
753
+ end = PowerTransformerEnd(mrid=f"{tx.mrid}-e{i}")
754
+ end.terminal = t
755
+ self.network.add(end)
756
+ tx.add_end(end)
757
+
758
+ i += 1
759
+
760
+ self.network.add(tx)
761
+ return tx
762
+
763
+ def _create_energy_consumer(self, mrid: Optional[str], nominal_phases: PhaseCode) -> EnergyConsumer:
764
+ ec = EnergyConsumer(mrid=self._next_id(mrid, "ec"))
765
+ self._add_terminal(ec, 1, nominal_phases)
766
+
767
+ self.network.add(ec)
768
+ return ec
769
+
770
+ def _create_other(
771
+ self,
772
+ mrid: Optional[str],
773
+ creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
774
+ nominal_phases: PhaseCode,
775
+ num_terminals: Optional[int],
776
+ default_mrid_prefix: Optional[str] = None
777
+ ) -> SubclassesConductingEquipment:
778
+ o = creator(mrid=self._next_id(mrid, default_mrid_prefix or "o"))
779
+ for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
780
+ self._add_terminal(o, i, nominal_phases)
781
+
782
+ self.network.add(o)
783
+ return o
784
+
785
+ def _create_feeder(self, mrid: Optional[str], head_equipment: ConductingEquipment, sequence_number: Optional[int] = None) -> Feeder:
786
+ f = Feeder(
787
+ mrid=self._next_id(mrid, "fdr"),
788
+ normal_head_terminal=head_equipment.get_terminal_by_sn(sequence_number if sequence_number else head_equipment.num_terminals())
789
+ )
790
+
791
+ f.add_equipment(head_equipment)
792
+ f.add_current_equipment(head_equipment)
793
+ head_equipment.add_container(f)
794
+ head_equipment.add_current_container(f)
795
+
796
+ self.network.add(f)
797
+ return f
798
+
799
+ def _create_lv_feeder(self, mrid: Optional[str], head_equipment: ConductingEquipment, sequence_number: Optional[int] = None) -> LvFeeder:
800
+ lvf = LvFeeder(
801
+ mrid=self._next_id(mrid, "lvf"),
802
+ normal_head_terminal=head_equipment.get_terminal_by_sn(sequence_number if sequence_number else head_equipment.num_terminals())
803
+ )
804
+
805
+ lvf.add_equipment(head_equipment)
806
+ lvf.add_current_equipment(head_equipment)
807
+ head_equipment.add_container(lvf)
808
+ head_equipment.add_current_container(lvf)
809
+
810
+ self.network.add(lvf)
811
+ return lvf
812
+
813
+ def _add_terminal(self, ce: ConductingEquipment, sn: int, nominal_phases: PhaseCode):
814
+ terminal = Terminal(mrid=f"{ce.mrid}-t{sn}", phases=nominal_phases)
815
+ ce.add_terminal(terminal)
816
+ self.network.add(terminal)