zepben.ewb 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. zepben/ewb/__init__.py +601 -0
  2. zepben/ewb/auth/__init__.py +10 -0
  3. zepben/ewb/auth/client/__init__.py +5 -0
  4. zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
  5. zepben/ewb/auth/common/__init__.py +5 -0
  6. zepben/ewb/auth/common/auth_exception.py +16 -0
  7. zepben/ewb/auth/common/auth_method.py +28 -0
  8. zepben/ewb/auth/common/auth_provider_config.py +96 -0
  9. zepben/ewb/database/__init__.py +4 -0
  10. zepben/ewb/database/paths/__init__.py +4 -0
  11. zepben/ewb/database/paths/database_type.py +34 -0
  12. zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
  13. zepben/ewb/database/sql/__init__.py +4 -0
  14. zepben/ewb/database/sql/column.py +37 -0
  15. zepben/ewb/database/sql/sql_table.py +142 -0
  16. zepben/ewb/database/sqlite/__init__.py +4 -0
  17. zepben/ewb/database/sqlite/common/__init__.py +4 -0
  18. zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
  19. zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
  20. zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
  21. zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
  22. zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
  23. zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
  24. zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
  25. zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
  26. zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
  27. zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
  28. zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
  29. zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
  30. zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
  31. zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
  32. zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
  33. zepben/ewb/database/sqlite/customer/__init__.py +4 -0
  34. zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
  35. zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
  36. zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
  37. zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
  38. zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
  39. zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
  40. zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
  41. zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
  42. zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
  43. zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
  44. zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
  45. zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
  46. zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
  47. zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
  48. zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
  49. zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
  50. zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
  51. zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
  52. zepben/ewb/database/sqlite/network/__init__.py +4 -0
  53. zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
  54. zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
  55. zepben/ewb/database/sqlite/network/network_database_reader.py +175 -0
  56. zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
  57. zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
  58. zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
  59. zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
  60. zepben/ewb/database/sqlite/tables/__init__.py +4 -0
  61. zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
  62. zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
  63. zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
  64. zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
  65. zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
  66. zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
  67. zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
  68. zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
  69. zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
  70. zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
  71. zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
  72. zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
  73. zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
  74. zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
  75. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
  76. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
  77. zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
  78. zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
  79. zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
  80. zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
  81. zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
  82. zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
  83. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
  84. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
  85. zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
  86. zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
  87. zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
  88. zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
  89. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
  90. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
  91. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
  92. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
  93. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
  94. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
  95. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
  96. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
  97. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
  98. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
  99. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
  100. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
  101. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
  102. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
  103. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
  104. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
  105. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
  106. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
  107. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
  108. zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
  109. zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
  110. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
  111. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
  112. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
  113. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
  114. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
  115. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
  116. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
  117. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
  118. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
  119. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
  120. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
  121. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
  122. zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
  123. zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
  124. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
  125. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
  126. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
  127. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
  128. zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
  129. zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
  130. zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
  131. zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
  132. zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
  133. zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
  134. zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
  135. zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
  136. zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
  137. zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
  138. zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
  139. zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
  140. zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
  141. zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
  142. zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
  143. zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
  144. zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
  145. zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
  146. zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
  147. zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
  148. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
  149. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
  150. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
  151. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
  152. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
  153. zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
  154. zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
  155. zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
  156. zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
  157. zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
  158. zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
  159. zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
  160. zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
  161. zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
  162. zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
  163. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
  164. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
  165. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
  166. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
  167. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
  168. zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
  169. zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
  170. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
  171. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
  172. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
  173. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
  174. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
  175. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
  176. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
  177. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
  178. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
  179. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
  180. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
  181. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
  182. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
  183. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
  184. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
  185. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
  186. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
  187. zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
  188. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
  189. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
  190. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
  191. zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
  192. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
  193. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
  194. zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
  195. zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
  196. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
  197. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
  198. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
  199. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
  200. zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
  201. zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
  202. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
  203. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
  204. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
  205. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
  206. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
  207. zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
  208. zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
  209. zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
  210. zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
  211. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
  212. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
  213. zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
  214. zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
  215. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
  216. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
  217. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
  218. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
  219. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
  220. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
  221. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
  222. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
  223. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
  224. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
  225. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
  226. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
  227. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
  228. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
  229. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
  230. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
  231. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
  232. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
  233. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
  234. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
  235. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
  236. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
  237. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
  238. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
  239. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
  240. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
  241. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
  242. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
  243. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
  244. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
  245. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
  246. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
  247. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
  248. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
  249. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
  250. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
  251. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
  252. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
  253. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
  254. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
  255. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
  256. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
  257. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
  258. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
  259. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
  260. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
  261. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
  262. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
  263. zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
  264. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
  265. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
  266. zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
  267. zepben/ewb/database/sqlite/tables/sqlite_table.py +45 -0
  268. zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
  269. zepben/ewb/database/sqlite/tables/table_version.py +39 -0
  270. zepben/ewb/dataclassy/__init__.py +15 -0
  271. zepben/ewb/dataclassy/dataclass.py +192 -0
  272. zepben/ewb/dataclassy/decorator.py +35 -0
  273. zepben/ewb/dataclassy/functions.py +80 -0
  274. zepben/ewb/examples/__init__.py +6 -0
  275. zepben/ewb/examples/simple_test_network.py +158 -0
  276. zepben/ewb/exceptions.py +52 -0
  277. zepben/ewb/model/__init__.py +4 -0
  278. zepben/ewb/model/busbranch/__init__.py +4 -0
  279. zepben/ewb/model/busbranch/bus_branch.py +1051 -0
  280. zepben/ewb/model/cim/__init__.py +4 -0
  281. zepben/ewb/model/cim/extensions/__init__.py +4 -0
  282. zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
  283. zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
  284. zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
  285. zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
  286. zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
  287. zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
  288. zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
  289. zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
  290. zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
  291. zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
  292. zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
  293. zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
  294. zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
  295. zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
  296. zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
  297. zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
  298. zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
  299. zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +36 -0
  300. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +112 -0
  301. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
  302. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
  303. zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
  304. zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
  305. zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
  306. zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
  307. zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
  308. zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +83 -0
  309. zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +57 -0
  310. zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
  311. zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +293 -0
  312. zepben/ewb/model/cim/extensions/zbex.py +17 -0
  313. zepben/ewb/model/cim/iec61968/__init__.py +4 -0
  314. zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
  315. zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
  316. zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
  317. zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
  318. zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
  319. zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
  320. zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
  321. zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
  322. zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
  323. zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
  324. zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
  325. zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
  326. zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
  327. zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +57 -0
  328. zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
  329. zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
  330. zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
  331. zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
  332. zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
  333. zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
  334. zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
  335. zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
  336. zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
  337. zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
  338. zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
  339. zepben/ewb/model/cim/iec61968/common/document.py +36 -0
  340. zepben/ewb/model/cim/iec61968/common/location.py +129 -0
  341. zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
  342. zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
  343. zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
  344. zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
  345. zepben/ewb/model/cim/iec61968/common/street_detail.py +46 -0
  346. zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
  347. zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
  348. zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
  349. zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
  350. zepben/ewb/model/cim/iec61968/customers/customer_kind.py +69 -0
  351. zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
  352. zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
  353. zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
  354. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
  355. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
  356. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
  357. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +69 -0
  358. zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +45 -0
  359. zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
  360. zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
  361. zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +27 -0
  362. zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
  363. zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
  364. zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
  365. zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +152 -0
  366. zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
  367. zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
  368. zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +48 -0
  369. zepben/ewb/model/cim/iec61968/metering/meter.py +28 -0
  370. zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
  371. zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
  372. zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
  373. zepben/ewb/model/cim/iec61970/__init__.py +4 -0
  374. zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
  375. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
  376. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
  377. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
  378. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
  379. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
  380. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +30 -0
  381. zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
  382. zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
  383. zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
  384. zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
  385. zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
  386. zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
  387. zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
  388. zepben/ewb/model/cim/iec61970/base/core/curve.py +125 -0
  389. zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
  390. zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
  391. zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
  392. zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
  393. zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
  394. zepben/ewb/model/cim/iec61970/base/core/identified_object.py +239 -0
  395. zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
  396. zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
  397. zepben/ewb/model/cim/iec61970/base/core/phase_code.py +202 -0
  398. zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
  399. zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
  400. zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
  401. zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
  402. zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
  403. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
  404. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
  405. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
  406. zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +28 -0
  407. zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +29 -0
  408. zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
  409. zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +494 -0
  410. zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
  411. zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
  412. zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
  413. zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
  414. zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
  415. zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +39 -0
  416. zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
  417. zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
  418. zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
  419. zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
  420. zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
  421. zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
  422. zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
  423. zepben/ewb/model/cim/iec61970/base/meas/analog.py +18 -0
  424. zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
  425. zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
  426. zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
  427. zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
  428. zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
  429. zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
  430. zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
  431. zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
  432. zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
  433. zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
  434. zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
  435. zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
  436. zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
  437. zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
  438. zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
  439. zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
  440. zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
  441. zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
  442. zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
  443. zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
  444. zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
  445. zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
  446. zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
  447. zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
  448. zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
  449. zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
  450. zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
  451. zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
  452. zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
  453. zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
  454. zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
  455. zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
  456. zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
  457. zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
  458. zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
  459. zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
  460. zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
  461. zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
  462. zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
  463. zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
  464. zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
  465. zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
  466. zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
  467. zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +40 -0
  468. zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
  469. zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
  470. zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
  471. zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
  472. zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
  473. zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
  474. zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
  475. zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
  476. zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
  477. zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
  478. zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +48 -0
  479. zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
  480. zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
  481. zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
  482. zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +107 -0
  483. zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
  484. zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +30 -0
  485. zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
  486. zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
  487. zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +46 -0
  488. zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
  489. zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
  490. zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
  491. zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
  492. zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +45 -0
  493. zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
  494. zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
  495. zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
  496. zepben/ewb/model/phases.py +168 -0
  497. zepben/ewb/model/resistance_reactance.py +40 -0
  498. zepben/ewb/services/__init__.py +4 -0
  499. zepben/ewb/services/common/__init__.py +16 -0
  500. zepben/ewb/services/common/base_service.py +383 -0
  501. zepben/ewb/services/common/base_service_comparator.py +394 -0
  502. zepben/ewb/services/common/difference.py +47 -0
  503. zepben/ewb/services/common/enum_mapper.py +55 -0
  504. zepben/ewb/services/common/meta/__init__.py +4 -0
  505. zepben/ewb/services/common/meta/data_source.py +16 -0
  506. zepben/ewb/services/common/meta/metadata_collection.py +28 -0
  507. zepben/ewb/services/common/meta/metadata_translations.py +47 -0
  508. zepben/ewb/services/common/meta/service_info.py +22 -0
  509. zepben/ewb/services/common/reference_resolvers.py +374 -0
  510. zepben/ewb/services/common/resolver.py +597 -0
  511. zepben/ewb/services/common/translator/__init__.py +4 -0
  512. zepben/ewb/services/common/translator/base_cim2proto.py +115 -0
  513. zepben/ewb/services/common/translator/base_proto2cim.py +146 -0
  514. zepben/ewb/services/common/translator/service_differences.py +81 -0
  515. zepben/ewb/services/common/translator/util.py +75 -0
  516. zepben/ewb/services/customer/__init__.py +4 -0
  517. zepben/ewb/services/customer/customer_service_comparator.py +52 -0
  518. zepben/ewb/services/customer/customers.py +23 -0
  519. zepben/ewb/services/customer/translator/__init__.py +21 -0
  520. zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
  521. zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
  522. zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
  523. zepben/ewb/services/diagram/__init__.py +4 -0
  524. zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
  525. zepben/ewb/services/diagram/diagrams.py +107 -0
  526. zepben/ewb/services/diagram/translator/__init__.py +11 -0
  527. zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
  528. zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
  529. zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
  530. zepben/ewb/services/measurement/__init__.py +4 -0
  531. zepben/ewb/services/measurement/measurements.py +35 -0
  532. zepben/ewb/services/measurement/translator/__init__.py +6 -0
  533. zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
  534. zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
  535. zepben/ewb/services/network/__init__.py +4 -0
  536. zepben/ewb/services/network/network_extensions.py +119 -0
  537. zepben/ewb/services/network/network_service.py +302 -0
  538. zepben/ewb/services/network/network_service_comparator.py +1322 -0
  539. zepben/ewb/services/network/network_state.py +36 -0
  540. zepben/ewb/services/network/tracing/__init__.py +4 -0
  541. zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
  542. zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
  543. zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
  544. zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
  545. zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
  546. zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
  547. zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
  548. zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
  549. zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
  550. zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
  551. zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
  552. zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
  553. zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
  554. zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
  555. zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
  556. zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
  557. zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
  558. zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
  559. zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
  560. zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
  561. zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +104 -0
  562. zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +35 -0
  563. zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
  564. zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
  565. zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
  566. zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
  567. zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
  568. zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
  569. zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
  570. zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
  571. zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
  572. zepben/ewb/services/network/tracing/networktrace/network_trace.py +433 -0
  573. zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
  574. zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
  575. zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +128 -0
  576. zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
  577. zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
  578. zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
  579. zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
  580. zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
  581. zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
  582. zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
  583. zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
  584. zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
  585. zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
  586. zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
  587. zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
  588. zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
  589. zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
  590. zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
  591. zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
  592. zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
  593. zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
  594. zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
  595. zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
  596. zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
  597. zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
  598. zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
  599. zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
  600. zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
  601. zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
  602. zepben/ewb/services/network/tracing/util.py +93 -0
  603. zepben/ewb/services/network/translator/__init__.py +392 -0
  604. zepben/ewb/services/network/translator/network_cim2proto.py +1867 -0
  605. zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
  606. zepben/ewb/services/network/translator/network_proto2cim.py +2201 -0
  607. zepben/ewb/services/services.py +48 -0
  608. zepben/ewb/streaming/__init__.py +4 -0
  609. zepben/ewb/streaming/data/__init__.py +4 -0
  610. zepben/ewb/streaming/data/current_state_event.py +314 -0
  611. zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
  612. zepben/ewb/streaming/data/set_current_states_status.py +286 -0
  613. zepben/ewb/streaming/exceptions.py +14 -0
  614. zepben/ewb/streaming/get/__init__.py +4 -0
  615. zepben/ewb/streaming/get/consumer.py +209 -0
  616. zepben/ewb/streaming/get/customer_consumer.py +111 -0
  617. zepben/ewb/streaming/get/diagram_consumer.py +107 -0
  618. zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
  619. zepben/ewb/streaming/get/hierarchy/data.py +27 -0
  620. zepben/ewb/streaming/get/included_energized_containers.py +36 -0
  621. zepben/ewb/streaming/get/included_energizing_containers.py +36 -0
  622. zepben/ewb/streaming/get/network_consumer.py +870 -0
  623. zepben/ewb/streaming/get/query_network_state_client.py +64 -0
  624. zepben/ewb/streaming/get/query_network_state_service.py +94 -0
  625. zepben/ewb/streaming/grpc/__init__.py +4 -0
  626. zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
  627. zepben/ewb/streaming/grpc/connect.py +209 -0
  628. zepben/ewb/streaming/grpc/grpc.py +107 -0
  629. zepben/ewb/streaming/grpc/grpc_channel_builder.py +190 -0
  630. zepben/ewb/streaming/mutations/__init__.py +4 -0
  631. zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
  632. zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
  633. zepben/ewb/testing/__init__.py +4 -0
  634. zepben/ewb/testing/test_network_builder.py +816 -0
  635. zepben/ewb/types.py +17 -0
  636. zepben/ewb/util.py +200 -0
  637. zepben_ewb-1.0.0.dist-info/METADATA +90 -0
  638. zepben_ewb-1.0.0.dist-info/RECORD +641 -0
  639. zepben_ewb-1.0.0.dist-info/WHEEL +5 -0
  640. zepben_ewb-1.0.0.dist-info/licenses/LICENSE +374 -0
  641. zepben_ewb-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1322 @@
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 dataclasses import dataclass
6
+ from typing import Callable, Optional, Any
7
+
8
+ from zepben.ewb import BatteryControl, PanDemandResponseFunction, StaticVarCompensator
9
+ from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import RelayInfo
10
+ from zepben.ewb.model.cim.extensions.iec61970.base.core.site import Site
11
+ from zepben.ewb.model.cim.extensions.iec61970.base.feeder.loop import Loop
12
+ from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_feeder import LvFeeder
13
+ from zepben.ewb.model.cim.extensions.iec61970.base.generation.production.ev_charging_unit import EvChargingUnit
14
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.distance_relay import DistanceRelay
15
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_function import ProtectionRelayFunction
16
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_scheme import ProtectionRelayScheme
17
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_system import ProtectionRelaySystem
18
+ from zepben.ewb.model.cim.extensions.iec61970.base.protection.voltage_relay import VoltageRelay
19
+ from zepben.ewb.model.cim.iec61968.assetinfo.cable_info import CableInfo
20
+ from zepben.ewb.model.cim.iec61968.assetinfo.no_load_test import NoLoadTest
21
+ from zepben.ewb.model.cim.iec61968.assetinfo.open_circuit_test import OpenCircuitTest
22
+ from zepben.ewb.model.cim.iec61968.assetinfo.overhead_wire_info import OverheadWireInfo
23
+ from zepben.ewb.model.cim.iec61968.assetinfo.power_transformer_info import PowerTransformerInfo
24
+ from zepben.ewb.model.cim.iec61968.assetinfo.short_circuit_test import ShortCircuitTest
25
+ from zepben.ewb.model.cim.iec61968.assetinfo.shunt_compensator_info import ShuntCompensatorInfo
26
+ from zepben.ewb.model.cim.iec61968.assetinfo.switch_info import SwitchInfo
27
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_end_info import TransformerEndInfo
28
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_tank_info import TransformerTankInfo
29
+ from zepben.ewb.model.cim.iec61968.assetinfo.transformer_test import TransformerTest
30
+ from zepben.ewb.model.cim.iec61968.assetinfo.wire_info import WireInfo
31
+ from zepben.ewb.model.cim.iec61968.assets.asset import Asset
32
+ from zepben.ewb.model.cim.iec61968.assets.asset_owner import AssetOwner
33
+ from zepben.ewb.model.cim.iec61968.assets.streetlight import Streetlight
34
+ from zepben.ewb.model.cim.iec61968.common.location import Location
35
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.current_transformer_info import CurrentTransformerInfo
36
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassetinfo.potential_transformer_info import PotentialTransformerInfo
37
+ from zepben.ewb.model.cim.iec61968.infiec61968.infassets.pole import Pole
38
+ from zepben.ewb.model.cim.iec61968.metering.end_device import EndDevice
39
+ from zepben.ewb.model.cim.iec61968.metering.end_device_function import EndDeviceFunction
40
+ from zepben.ewb.model.cim.iec61968.metering.meter import Meter
41
+ from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
42
+ from zepben.ewb.model.cim.iec61968.operations.operational_restriction import OperationalRestriction
43
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.auxiliary_equipment import AuxiliaryEquipment
44
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.current_transformer import CurrentTransformer
45
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.fault_indicator import FaultIndicator
46
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.potential_transformer import PotentialTransformer
47
+ from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.sensor import Sensor
48
+ from zepben.ewb.model.cim.iec61970.base.core.base_voltage import BaseVoltage
49
+ from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
50
+ from zepben.ewb.model.cim.iec61970.base.core.connectivity_node import ConnectivityNode
51
+ from zepben.ewb.model.cim.iec61970.base.core.curve import Curve
52
+ from zepben.ewb.model.cim.iec61970.base.core.equipment import Equipment
53
+ from zepben.ewb.model.cim.iec61970.base.core.equipment_container import EquipmentContainer
54
+ from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
55
+ from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
56
+ from zepben.ewb.model.cim.iec61970.base.core.phase_code import PhaseCode
57
+ from zepben.ewb.model.cim.iec61970.base.core.power_system_resource import PowerSystemResource
58
+ from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
59
+ from zepben.ewb.model.cim.iec61970.base.core.substation import Substation
60
+ from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
61
+ from zepben.ewb.model.cim.iec61970.base.equivalents.equivalent_branch import EquivalentBranch
62
+ from zepben.ewb.model.cim.iec61970.base.generation.production.battery_unit import BatteryUnit
63
+ from zepben.ewb.model.cim.iec61970.base.generation.production.photo_voltaic_unit import PhotoVoltaicUnit
64
+ from zepben.ewb.model.cim.iec61970.base.generation.production.power_electronics_unit import PowerElectronicsUnit
65
+ from zepben.ewb.model.cim.iec61970.base.generation.production.power_electronics_wind_unit import PowerElectronicsWindUnit
66
+ from zepben.ewb.model.cim.iec61970.base.meas.accumulator import Accumulator
67
+ from zepben.ewb.model.cim.iec61970.base.meas.analog import Analog
68
+ from zepben.ewb.model.cim.iec61970.base.meas.control import Control
69
+ from zepben.ewb.model.cim.iec61970.base.meas.discrete import Discrete
70
+ from zepben.ewb.model.cim.iec61970.base.meas.measurement import Measurement
71
+ from zepben.ewb.model.cim.iec61970.base.protection.current_relay import CurrentRelay
72
+ from zepben.ewb.model.cim.iec61970.base.scada.remote_control import RemoteControl
73
+ from zepben.ewb.model.cim.iec61970.base.scada.remote_source import RemoteSource
74
+ from zepben.ewb.model.cim.iec61970.base.wires.ac_line_segment import AcLineSegment
75
+ from zepben.ewb.model.cim.iec61970.base.wires.breaker import Breaker
76
+ from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
77
+ from zepben.ewb.model.cim.iec61970.base.wires.clamp import Clamp
78
+ from zepben.ewb.model.cim.iec61970.base.wires.conductor import Conductor
79
+ from zepben.ewb.model.cim.iec61970.base.wires.cut import Cut
80
+ from zepben.ewb.model.cim.iec61970.base.wires.disconnector import Disconnector
81
+ from zepben.ewb.model.cim.iec61970.base.wires.earth_fault_compensator import EarthFaultCompensator
82
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer import EnergyConsumer
83
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_consumer_phase import EnergyConsumerPhase
84
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_source import EnergySource
85
+ from zepben.ewb.model.cim.iec61970.base.wires.energy_source_phase import EnergySourcePhase
86
+ from zepben.ewb.model.cim.iec61970.base.wires.fuse import Fuse
87
+ from zepben.ewb.model.cim.iec61970.base.wires.ground import Ground
88
+ from zepben.ewb.model.cim.iec61970.base.wires.ground_disconnector import GroundDisconnector
89
+ from zepben.ewb.model.cim.iec61970.base.wires.grounding_impedance import GroundingImpedance
90
+ from zepben.ewb.model.cim.iec61970.base.wires.jumper import Jumper
91
+ from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
92
+ from zepben.ewb.model.cim.iec61970.base.wires.linear_shunt_compensator import LinearShuntCompensator
93
+ from zepben.ewb.model.cim.iec61970.base.wires.load_break_switch import LoadBreakSwitch
94
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_phase_impedance import PerLengthPhaseImpedance
95
+ from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
96
+ from zepben.ewb.model.cim.iec61970.base.wires.petersen_coil import PetersenCoil
97
+ from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection import PowerElectronicsConnection
98
+ from zepben.ewb.model.cim.iec61970.base.wires.power_electronics_connection_phase import PowerElectronicsConnectionPhase
99
+ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer import PowerTransformer
100
+ from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd
101
+ from zepben.ewb.model.cim.iec61970.base.wires.protected_switch import ProtectedSwitch
102
+ from zepben.ewb.model.cim.iec61970.base.wires.ratio_tap_changer import RatioTapChanger
103
+ from zepben.ewb.model.cim.iec61970.base.wires.reactive_capability_curve import ReactiveCapabilityCurve
104
+ from zepben.ewb.model.cim.iec61970.base.wires.recloser import Recloser
105
+ from zepben.ewb.model.cim.iec61970.base.wires.regulating_cond_eq import RegulatingCondEq
106
+ from zepben.ewb.model.cim.iec61970.base.wires.regulating_control import RegulatingControl
107
+ from zepben.ewb.model.cim.iec61970.base.wires.rotating_machine import RotatingMachine
108
+ from zepben.ewb.model.cim.iec61970.base.wires.series_compensator import SeriesCompensator
109
+ from zepben.ewb.model.cim.iec61970.base.wires.shunt_compensator import ShuntCompensator
110
+ from zepben.ewb.model.cim.iec61970.base.wires.single_phase_kind import SinglePhaseKind
111
+ from zepben.ewb.model.cim.iec61970.base.wires.switch import Switch
112
+ from zepben.ewb.model.cim.iec61970.base.wires.synchronous_machine import SynchronousMachine
113
+ from zepben.ewb.model.cim.iec61970.base.wires.tap_changer import TapChanger
114
+ from zepben.ewb.model.cim.iec61970.base.wires.tap_changer_control import TapChangerControl
115
+ from zepben.ewb.model.cim.iec61970.base.wires.transformer_end import TransformerEnd
116
+ from zepben.ewb.model.cim.iec61970.base.wires.transformer_star_impedance import TransformerStarImpedance
117
+ from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import Circuit
118
+ from zepben.ewb.services.common.base_service_comparator import BaseServiceComparator
119
+ from zepben.ewb.services.common.difference import ValueDifference
120
+ from zepben.ewb.services.common.translator.service_differences import ObjectDifference
121
+
122
+
123
+ @dataclass
124
+ class NetworkServiceComparatorOptions:
125
+ compare_terminals: bool = True
126
+ compare_traced_phases: bool = True
127
+ compare_feeder_equipment: bool = True
128
+ compare_equipment_containers: bool = True
129
+ compare_lv_simplification: bool = True
130
+
131
+
132
+ #
133
+ # NOTE: The functions below are accessed by reflection rather than directly. Make sure you check the code coverage
134
+ # to ensure they are covered correctly.
135
+ #
136
+
137
+ class NetworkServiceComparator(BaseServiceComparator):
138
+ """
139
+ Compare the objects supported by the network service.
140
+ """
141
+
142
+ def __init__(self, options: NetworkServiceComparatorOptions = NetworkServiceComparatorOptions()):
143
+ """
144
+
145
+ :param options: Indicates which optional checks to perform.
146
+ """
147
+ super().__init__()
148
+ self._options = options
149
+
150
+ ##################################
151
+ # Extensions IEC61968 Asset Info #
152
+ ##################################
153
+
154
+ def _compare_relay_info(self, source: RelayInfo, target: RelayInfo) -> ObjectDifference:
155
+ diff = ObjectDifference(source, target)
156
+
157
+ self._compare_values(diff, RelayInfo.curve_setting, RelayInfo.reclose_fast)
158
+ self._compare_indexed_value_collections(diff, RelayInfo.reclose_delays)
159
+
160
+ return self._compare_asset_info(diff)
161
+
162
+ ################################
163
+ # Extensions IEC61968 Metering #
164
+ ################################
165
+
166
+ def _compare_pan_demand_response_function(self, source: PanDemandResponseFunction, target: PanDemandResponseFunction) -> ObjectDifference:
167
+ diff = ObjectDifference(source, target)
168
+
169
+ # noinspection PyProtectedMember
170
+ self._compare_values(diff, PanDemandResponseFunction.kind, PanDemandResponseFunction._appliance_bitmask)
171
+
172
+ return self._compare_end_device_function(diff)
173
+
174
+ #################################
175
+ # Extensions IEC61970 Base Core #
176
+ #################################
177
+
178
+ def _compare_site(self, source: Site, target: Site) -> ObjectDifference:
179
+ return self._compare_equipment_container(ObjectDifference(source, target))
180
+
181
+ ###################################
182
+ # Extensions IEC61970 Base Feeder #
183
+ ###################################
184
+
185
+ def _compare_loop(self, source: Loop, target: Loop) -> ObjectDifference:
186
+ diff = ObjectDifference(source, target)
187
+
188
+ self._compare_id_reference_collections(diff, Loop.circuits, Loop.substations, Loop.energizing_substations)
189
+
190
+ return self._compare_identified_object(diff)
191
+
192
+ def _compare_lv_feeder(self, source: LvFeeder, target: LvFeeder) -> ObjectDifference:
193
+ diff = ObjectDifference(source, target)
194
+
195
+ self._compare_id_references(diff, LvFeeder.normal_head_terminal)
196
+ self._compare_id_reference_collections(diff, LvFeeder.normal_energizing_feeders)
197
+ if self._options.compare_feeder_equipment:
198
+ self._compare_id_reference_collections(diff, LvFeeder.current_equipment)
199
+ self._compare_id_reference_collections(diff, LvFeeder.current_energizing_feeders)
200
+
201
+ return self._compare_equipment_container(diff)
202
+
203
+ ##################################################
204
+ # Extensions IEC61970 Base Generation Production #
205
+ ##################################################
206
+
207
+ def _compare_ev_charging_unit(self, source: EvChargingUnit, target: EvChargingUnit) -> ObjectDifference:
208
+ diff = ObjectDifference(source, target)
209
+ return self._compare_power_electronics_unit(diff)
210
+
211
+ #######################################
212
+ # Extensions IEC61970 Base Protection #
213
+ #######################################
214
+
215
+ def _compare_distance_relay(self, source: DistanceRelay, target: DistanceRelay) -> ObjectDifference:
216
+ diff = ObjectDifference(source, target)
217
+
218
+ self._compare_floats(
219
+ diff,
220
+ DistanceRelay.backward_blind,
221
+ DistanceRelay.backward_reach,
222
+ DistanceRelay.backward_reactance,
223
+ DistanceRelay.forward_blind,
224
+ DistanceRelay.forward_reach,
225
+ DistanceRelay.forward_reactance,
226
+ DistanceRelay.operation_phase_angle1,
227
+ DistanceRelay.operation_phase_angle2,
228
+ DistanceRelay.operation_phase_angle3,
229
+ )
230
+
231
+ return self._compare_protection_relay_function(diff)
232
+
233
+ def _compare_protection_relay_function(self, diff: ObjectDifference) -> ObjectDifference:
234
+ self._compare_values(
235
+ diff,
236
+ ProtectionRelayFunction.model,
237
+ ProtectionRelayFunction.reclosing,
238
+ ProtectionRelayFunction.protection_kind,
239
+ ProtectionRelayFunction.directable,
240
+ ProtectionRelayFunction.power_direction
241
+ )
242
+ self._compare_floats(diff, ProtectionRelayFunction.relay_delay_time)
243
+ self._compare_indexed_value_collections(
244
+ diff,
245
+ ProtectionRelayFunction.time_limits,
246
+ ProtectionRelayFunction.thresholds
247
+ )
248
+ self._compare_id_reference_collections(
249
+ diff,
250
+ ProtectionRelayFunction.protected_switches,
251
+ ProtectionRelayFunction.sensors,
252
+ ProtectionRelayFunction.schemes,
253
+ )
254
+ self._compare_id_references(diff, ProtectionRelayFunction.relay_info)
255
+
256
+ return self._compare_power_system_resource(diff)
257
+
258
+ def _compare_protection_relay_scheme(self, source: ProtectionRelayScheme, target: ProtectionRelayScheme) -> ObjectDifference:
259
+ diff = ObjectDifference(source, target)
260
+ self._compare_id_references(diff, ProtectionRelayScheme.system)
261
+ self._compare_id_reference_collections(diff, ProtectionRelayScheme.functions)
262
+
263
+ return self._compare_identified_object(diff)
264
+
265
+ def _compare_protection_relay_system(self, source: ProtectionRelaySystem, target: ProtectionRelaySystem) -> ObjectDifference:
266
+ diff = ObjectDifference(source, target)
267
+
268
+ self._compare_values(diff, ProtectionRelaySystem.protection_kind)
269
+ self._compare_id_reference_collections(diff, ProtectionRelaySystem.schemes)
270
+
271
+ return self._compare_equipment(diff)
272
+
273
+ def _compare_voltage_relay(self, source: VoltageRelay, target: VoltageRelay) -> ObjectDifference:
274
+ diff = ObjectDifference(source, target)
275
+
276
+ return self._compare_protection_relay_function(diff)
277
+
278
+ ##################################
279
+ # Extensions IEC61970 Base Wires #
280
+ ##################################
281
+
282
+ def _compare_battery_control(self, source: BatteryControl, target: BatteryControl) -> ObjectDifference:
283
+ diff = ObjectDifference(source, target)
284
+
285
+ self._compare_floats(diff, BatteryControl.charging_rate, BatteryControl.discharging_rate, BatteryControl.reserve_percent)
286
+ self._compare_values(diff, BatteryControl.control_mode)
287
+
288
+ return self._compare_regulating_control(diff)
289
+
290
+ #######################
291
+ # IEC61968 Asset Info #
292
+ #######################
293
+
294
+ def _compare_cable_info(self, source: CableInfo, target: CableInfo) -> ObjectDifference:
295
+ return self._compare_wire_info(ObjectDifference(source, target))
296
+
297
+ def _compare_no_load_test(self, source: NoLoadTest, target: NoLoadTest) -> ObjectDifference:
298
+ diff = ObjectDifference(source, target)
299
+
300
+ self._compare_values(diff, NoLoadTest.energised_end_voltage, NoLoadTest.loss, NoLoadTest.loss_zero)
301
+ self._compare_floats(diff, NoLoadTest.exciting_current, NoLoadTest.exciting_current_zero)
302
+
303
+ return self._compare_transformer_test(diff)
304
+
305
+ def _compare_open_circuit_test(self, source: OpenCircuitTest, target: OpenCircuitTest) -> ObjectDifference:
306
+ diff = ObjectDifference(source, target)
307
+
308
+ self._compare_values(
309
+ diff,
310
+ OpenCircuitTest.energised_end_step,
311
+ OpenCircuitTest.energised_end_voltage,
312
+ OpenCircuitTest.open_end_step,
313
+ OpenCircuitTest.open_end_voltage
314
+ )
315
+ self._compare_floats(diff, OpenCircuitTest.phase_shift)
316
+
317
+ return self._compare_transformer_test(diff)
318
+
319
+ def _compare_overhead_wire_info(self, source: OverheadWireInfo, target: OverheadWireInfo) -> ObjectDifference:
320
+ return self._compare_wire_info(ObjectDifference(source, target))
321
+
322
+ def _compare_power_transformer_info(self, source: PowerTransformerInfo, target: PowerTransformerInfo) -> ObjectDifference:
323
+ diff = ObjectDifference(source, target)
324
+
325
+ self._compare_id_reference_collections(diff, PowerTransformerInfo.transformer_tank_infos)
326
+
327
+ return self._compare_asset_info(diff)
328
+
329
+ def _compare_short_circuit_test(self, source: ShortCircuitTest, target: ShortCircuitTest) -> ObjectDifference:
330
+ diff = ObjectDifference(source, target)
331
+
332
+ self._compare_values(
333
+ diff,
334
+ ShortCircuitTest.energised_end_step,
335
+ ShortCircuitTest.grounded_end_step,
336
+ ShortCircuitTest.loss,
337
+ ShortCircuitTest.loss_zero,
338
+ ShortCircuitTest.power
339
+ )
340
+ self._compare_floats(
341
+ diff,
342
+ ShortCircuitTest.current,
343
+ ShortCircuitTest.leakage_impedance,
344
+ ShortCircuitTest.leakage_impedance_zero,
345
+ ShortCircuitTest.voltage,
346
+ ShortCircuitTest.voltage_ohmic_part
347
+ )
348
+ return self._compare_transformer_test(diff)
349
+
350
+ def _compare_shunt_compensator_info(self, source: ShuntCompensatorInfo, target: ShuntCompensatorInfo) -> ObjectDifference:
351
+ diff = ObjectDifference(source, target)
352
+
353
+ self._compare_values(
354
+ diff,
355
+ ShuntCompensatorInfo.max_power_loss,
356
+ ShuntCompensatorInfo.rated_current,
357
+ ShuntCompensatorInfo.rated_reactive_power,
358
+ ShuntCompensatorInfo.rated_voltage,
359
+ )
360
+
361
+ return self._compare_asset_info(diff)
362
+
363
+ def _compare_switch_info(self, source: SwitchInfo, target: SwitchInfo) -> ObjectDifference:
364
+ diff = ObjectDifference(source, target)
365
+
366
+ self._compare_floats(diff, SwitchInfo.rated_interrupting_time)
367
+
368
+ return self._compare_asset_info(diff)
369
+
370
+ def _compare_transformer_end_info(self, source: TransformerEndInfo, target: TransformerEndInfo) -> ObjectDifference:
371
+ diff = ObjectDifference(source, target)
372
+
373
+ self._compare_id_references(
374
+ diff,
375
+ TransformerEndInfo.transformer_star_impedance,
376
+ TransformerEndInfo.energised_end_no_load_tests,
377
+ TransformerEndInfo.energised_end_short_circuit_tests,
378
+ TransformerEndInfo.grounded_end_short_circuit_tests,
379
+ TransformerEndInfo.open_end_open_circuit_tests,
380
+ TransformerEndInfo.energised_end_open_circuit_tests
381
+ )
382
+ self._compare_values(
383
+ diff,
384
+ TransformerEndInfo.connection_kind,
385
+ TransformerEndInfo.emergency_s,
386
+ TransformerEndInfo.end_number,
387
+ TransformerEndInfo.insulation_u,
388
+ TransformerEndInfo.phase_angle_clock,
389
+ TransformerEndInfo.rated_s,
390
+ TransformerEndInfo.rated_u,
391
+ TransformerEndInfo.short_term_s
392
+ )
393
+ self._compare_floats(diff, TransformerEndInfo.r)
394
+
395
+ return self._compare_asset_info(diff)
396
+
397
+ def _compare_transformer_tank_info(self, source: TransformerTankInfo, target: TransformerTankInfo) -> ObjectDifference:
398
+ diff = ObjectDifference(source, target)
399
+
400
+ self._compare_id_reference_collections(diff, TransformerTankInfo.transformer_end_infos)
401
+
402
+ return self._compare_asset_info(diff)
403
+
404
+ def _compare_transformer_test(self, diff: ObjectDifference) -> ObjectDifference:
405
+ self._compare_values(diff, TransformerTest.base_power)
406
+ self._compare_floats(diff, TransformerTest.temperature)
407
+
408
+ return self._compare_identified_object(diff)
409
+
410
+ def _compare_wire_info(self, diff: ObjectDifference) -> ObjectDifference:
411
+ self._compare_values(diff, WireInfo.rated_current, WireInfo.material)
412
+
413
+ return self._compare_asset_info(diff)
414
+
415
+ ###################
416
+ # IEC61968 Assets #
417
+ ###################
418
+
419
+ def _compare_asset(self, diff: ObjectDifference) -> ObjectDifference:
420
+ self._compare_id_references(diff, Asset.location)
421
+ self._compare_id_reference_collections(diff, Asset.organisation_roles)
422
+ self._compare_id_reference_collections(diff, Asset.power_system_resources)
423
+
424
+ return self._compare_identified_object(diff)
425
+
426
+ def _compare_asset_container(self, diff: ObjectDifference) -> ObjectDifference:
427
+ return self._compare_asset(diff)
428
+
429
+ def _compare_asset_function(self, diff: ObjectDifference) -> ObjectDifference:
430
+ return self._compare_identified_object(diff)
431
+
432
+ def _compare_asset_info(self, diff: ObjectDifference) -> ObjectDifference:
433
+ return self._compare_identified_object(diff)
434
+
435
+ def _compare_asset_organisation_role(self, diff: ObjectDifference) -> ObjectDifference:
436
+ return self._compare_organisation_role(diff)
437
+
438
+ def _compare_asset_owner(self, source: AssetOwner, target: AssetOwner) -> ObjectDifference:
439
+ return self._compare_asset_organisation_role(ObjectDifference(source, target))
440
+
441
+ def _compare_streetlight(self, source: Streetlight, target: Streetlight) -> ObjectDifference:
442
+ diff = ObjectDifference(source, target)
443
+
444
+ self._compare_values(diff, Streetlight.light_rating, Streetlight.lamp_kind)
445
+ self._compare_id_references(diff, Streetlight.pole)
446
+
447
+ return self._compare_asset(diff)
448
+
449
+ def _compare_structure(self, diff: ObjectDifference) -> ObjectDifference:
450
+ return self._compare_asset_container(diff)
451
+
452
+ ###################
453
+ # IEC61968 Common #
454
+ ###################
455
+
456
+ def _compare_location(self, source: Location, target: Location) -> ObjectDifference:
457
+ diff = ObjectDifference(source, target)
458
+
459
+ self._compare_values(diff, Location.main_address)
460
+ self._compare_indexed_value_collections(diff, Location.points)
461
+
462
+ return self._compare_identified_object(diff)
463
+
464
+ #####################################
465
+ # IEC61968 InfIEC61968 InfAssetInfo #
466
+ #####################################
467
+
468
+ def _compare_current_transformer_info(self, source: CurrentTransformerInfo, target: CurrentTransformerInfo) -> ObjectDifference:
469
+ diff = ObjectDifference(source, target)
470
+
471
+ self._compare_values(
472
+ diff,
473
+ CurrentTransformerInfo.accuracy_class,
474
+ CurrentTransformerInfo.core_count,
475
+ CurrentTransformerInfo.ct_class,
476
+ CurrentTransformerInfo.knee_point_voltage,
477
+ CurrentTransformerInfo.max_ratio,
478
+ CurrentTransformerInfo.nominal_ratio,
479
+ CurrentTransformerInfo.rated_current,
480
+ CurrentTransformerInfo.secondary_fls_rating,
481
+ CurrentTransformerInfo.usage
482
+ )
483
+ self._compare_floats(
484
+ diff,
485
+ CurrentTransformerInfo.accuracy_limit,
486
+ CurrentTransformerInfo.primary_ratio,
487
+ CurrentTransformerInfo.secondary_ratio
488
+ )
489
+
490
+ return self._compare_asset_info(diff)
491
+
492
+ def _compare_potential_transformer_info(self, source: PotentialTransformerInfo, target: PotentialTransformerInfo) -> ObjectDifference:
493
+ diff = ObjectDifference(source, target)
494
+
495
+ self._compare_values(
496
+ diff,
497
+ PotentialTransformerInfo.accuracy_class,
498
+ PotentialTransformerInfo.nominal_ratio,
499
+ PotentialTransformerInfo.pt_class,
500
+ PotentialTransformerInfo.rated_voltage,
501
+ )
502
+ self._compare_floats(
503
+ diff,
504
+ PotentialTransformerInfo.primary_ratio,
505
+ PotentialTransformerInfo.secondary_ratio
506
+ )
507
+
508
+ return self._compare_asset_info(diff)
509
+
510
+ ##################################
511
+ # IEC61968 InfIEC61968 InfAssets #
512
+ ##################################
513
+
514
+ def _compare_pole(self, source: Pole, target: Pole) -> ObjectDifference:
515
+ diff = ObjectDifference(source, target)
516
+
517
+ self._compare_values(diff, Pole.classification)
518
+ self._compare_id_reference_collections(diff, Pole.streetlights)
519
+
520
+ return self._compare_structure(diff)
521
+
522
+ #####################
523
+ # IEC61968 Metering #
524
+ #####################
525
+
526
+ def _compare_end_device(self, diff: ObjectDifference) -> ObjectDifference:
527
+ if self._options.compare_lv_simplification:
528
+ self._compare_id_reference_collections(diff, EndDevice.usage_points)
529
+
530
+ self._compare_values(diff, EndDevice.customer_mrid)
531
+ self._compare_id_references(diff, EndDevice.service_location)
532
+ self._compare_id_reference_collections(diff, EndDevice.functions)
533
+
534
+ return self._compare_asset_container(diff)
535
+
536
+ def _compare_end_device_function(self, diff: ObjectDifference) -> ObjectDifference:
537
+ self._compare_values(diff, EndDeviceFunction.enabled)
538
+
539
+ return self._compare_asset_function(diff)
540
+
541
+ def _compare_meter(self, source: Meter, target: Meter) -> ObjectDifference:
542
+ return self._compare_end_device(ObjectDifference(source, target))
543
+
544
+ def _compare_usage_point(self, source: UsagePoint, target: UsagePoint) -> ObjectDifference:
545
+ diff = ObjectDifference(source, target)
546
+
547
+ self._compare_id_references(diff, UsagePoint.usage_point_location)
548
+ self._compare_values(
549
+ diff,
550
+ UsagePoint.is_virtual,
551
+ UsagePoint.connection_category,
552
+ UsagePoint.rated_power,
553
+ UsagePoint.approved_inverter_capacity,
554
+ UsagePoint.phase_code
555
+ )
556
+ if self._options.compare_lv_simplification:
557
+ self._compare_id_reference_collections(diff, UsagePoint.equipment)
558
+ self._compare_id_reference_collections(diff, UsagePoint.end_devices)
559
+
560
+ return self._compare_identified_object(diff)
561
+
562
+ #######################
563
+ # IEC61968 Operations #
564
+ #######################
565
+
566
+ def _compare_operational_restriction(self, source: OperationalRestriction, target: OperationalRestriction) -> ObjectDifference:
567
+ diff = ObjectDifference(source, target)
568
+
569
+ self._compare_id_reference_collections(diff, OperationalRestriction.equipment)
570
+
571
+ return self._compare_document(diff)
572
+
573
+ #####################################
574
+ # IEC61970 Base Auxiliary Equipment #
575
+ #####################################
576
+
577
+ def _compare_auxiliary_equipment(self, diff: ObjectDifference) -> ObjectDifference:
578
+ if self._options.compare_terminals:
579
+ self._compare_id_references(diff, AuxiliaryEquipment.terminal)
580
+
581
+ return self._compare_equipment(diff)
582
+
583
+ def _compare_current_transformer(self, source: CurrentTransformer, target: CurrentTransformer) -> ObjectDifference:
584
+ diff = ObjectDifference(source, target)
585
+
586
+ self._compare_values(diff, CurrentTransformer.core_burden)
587
+ self._compare_id_references(diff, CurrentTransformer.current_transformer_info)
588
+
589
+ return self._compare_sensor(diff)
590
+
591
+ def _compare_fault_indicator(self, source: FaultIndicator, target: FaultIndicator) -> ObjectDifference:
592
+ return self._compare_auxiliary_equipment(ObjectDifference(source, target))
593
+
594
+ def _compare_potential_transformer(self, source: PotentialTransformer, target: PotentialTransformer) -> ObjectDifference:
595
+ diff = ObjectDifference(source, target)
596
+
597
+ self._compare_values(diff, PotentialTransformer.type)
598
+ self._compare_id_references(diff, PotentialTransformer.potential_transformer_info)
599
+
600
+ return self._compare_sensor(diff)
601
+
602
+ def _compare_sensor(self, diff: ObjectDifference) -> ObjectDifference:
603
+ self._compare_id_reference_collections(diff, Sensor.relay_functions)
604
+
605
+ return self._compare_auxiliary_equipment(diff)
606
+
607
+ ######################
608
+ # IEC61970 Base Core #
609
+ ######################
610
+
611
+ def _compare_ac_dc_terminal(self, diff: ObjectDifference) -> ObjectDifference:
612
+ return self._compare_identified_object(diff)
613
+
614
+ def _compare_base_voltage(self, source: BaseVoltage, target: BaseVoltage) -> ObjectDifference:
615
+ diff = ObjectDifference(source, target)
616
+
617
+ self._compare_values(diff, BaseVoltage.nominal_voltage)
618
+
619
+ return self._compare_identified_object(diff)
620
+
621
+ def _compare_conducting_equipment(self, diff: ObjectDifference) -> ObjectDifference:
622
+ self._compare_id_references(diff, ConductingEquipment.base_voltage)
623
+
624
+ if self._options.compare_terminals:
625
+ self._compare_indexed_id_reference_collections(diff, ConductingEquipment.terminals)
626
+
627
+ return self._compare_equipment(diff)
628
+
629
+ def _compare_connectivity_node(self, source: ConnectivityNode, target: ConnectivityNode) -> ObjectDifference:
630
+ diff = ObjectDifference(source, target)
631
+
632
+ self._compare_id_reference_collections(diff, ConnectivityNode.terminals)
633
+
634
+ return self._compare_identified_object(diff)
635
+
636
+ def _compare_connectivity_node_container(self, diff: ObjectDifference) -> ObjectDifference:
637
+ return self._compare_power_system_resource(diff)
638
+
639
+ def _compare_curve(self, diff: ObjectDifference) -> ObjectDifference:
640
+ self._compare_indexed_value_collections(diff, Curve.data)
641
+
642
+ return self._compare_identified_object(diff)
643
+
644
+ def _compare_equipment(self, diff: ObjectDifference) -> ObjectDifference:
645
+ self._compare_values(diff, Equipment.in_service, Equipment.normally_in_service, Equipment.commissioned_date)
646
+
647
+ if self._options.compare_equipment_containers:
648
+ self._compare_id_reference_collections(diff, Equipment.containers, Equipment.current_containers)
649
+
650
+ if self._options.compare_lv_simplification:
651
+ self._compare_id_reference_collections(diff, Equipment.usage_points)
652
+
653
+ self._compare_id_reference_collections(diff, Equipment.operational_restrictions)
654
+
655
+ return self._compare_power_system_resource(diff)
656
+
657
+ def _compare_equipment_container(self, diff: ObjectDifference) -> ObjectDifference:
658
+ self._compare_id_reference_collections(diff, EquipmentContainer.equipment)
659
+
660
+ return self._compare_connectivity_node_container(diff)
661
+
662
+ def _compare_feeder(self, source: Feeder, target: Feeder) -> ObjectDifference:
663
+ diff = ObjectDifference(source, target)
664
+
665
+ self._compare_id_references(diff, Feeder.normal_head_terminal, Feeder.normal_energizing_substation)
666
+ self._compare_id_reference_collections(diff, Feeder.normal_energized_lv_feeders)
667
+ if self._options.compare_feeder_equipment:
668
+ self._compare_id_reference_collections(diff, Feeder.current_equipment)
669
+ self._compare_id_reference_collections(diff, Feeder.current_energized_lv_feeders)
670
+
671
+ return self._compare_equipment_container(diff)
672
+
673
+ def _compare_geographical_region(self, source: GeographicalRegion, target: GeographicalRegion) -> ObjectDifference:
674
+ diff = ObjectDifference(source, target)
675
+
676
+ self._compare_id_reference_collections(diff, GeographicalRegion.sub_geographical_regions)
677
+
678
+ return self._compare_identified_object(diff)
679
+
680
+ def _compare_power_system_resource(self, diff: ObjectDifference) -> ObjectDifference:
681
+ self._compare_id_references(diff, PowerSystemResource.asset_info, PowerSystemResource.location)
682
+ self._compare_id_reference_collections(diff, PowerSystemResource.assets)
683
+
684
+ return self._compare_identified_object(diff)
685
+
686
+ def _compare_sub_geographical_region(self, source: SubGeographicalRegion, target: SubGeographicalRegion) -> ObjectDifference:
687
+ diff = ObjectDifference(source, target)
688
+
689
+ self._compare_id_references(diff, SubGeographicalRegion.geographical_region)
690
+ self._compare_id_reference_collections(diff, SubGeographicalRegion.substations)
691
+
692
+ return self._compare_identified_object(diff)
693
+
694
+ def _compare_substation(self, source: Substation, target: Substation) -> ObjectDifference:
695
+ diff = ObjectDifference(source, target)
696
+
697
+ self._compare_id_references(diff, Substation.sub_geographical_region)
698
+ self._compare_id_reference_collections(diff, Substation.feeders)
699
+
700
+ return self._compare_equipment_container(diff)
701
+
702
+ def _compare_terminal(self, source: Terminal, target: Terminal) -> ObjectDifference:
703
+ diff = ObjectDifference(source, target)
704
+
705
+ self._compare_id_references(diff, Terminal.conducting_equipment, Terminal.connectivity_node)
706
+ self._compare_values(
707
+ diff,
708
+ Terminal.phases,
709
+ Terminal.sequence_number,
710
+ Terminal.normal_feeder_direction,
711
+ Terminal.current_feeder_direction,
712
+ Terminal.phases
713
+ )
714
+
715
+ return self._compare_ac_dc_terminal(diff)
716
+
717
+ #############################
718
+ # IEC61970 Base Equivalents #
719
+ #############################
720
+
721
+ def _compare_equivalent_branch(self, source: EquivalentBranch, target: EquivalentBranch) -> ObjectDifference:
722
+ diff = ObjectDifference(source, target)
723
+
724
+ self._compare_floats(
725
+ diff,
726
+ EquivalentBranch.negative_r12,
727
+ EquivalentBranch.negative_r21,
728
+ EquivalentBranch.negative_x12,
729
+ EquivalentBranch.negative_x21,
730
+ EquivalentBranch.positive_r12,
731
+ EquivalentBranch.positive_r21,
732
+ EquivalentBranch.positive_x12,
733
+ EquivalentBranch.positive_x21,
734
+ EquivalentBranch.r,
735
+ EquivalentBranch.r21,
736
+ EquivalentBranch.x,
737
+ EquivalentBranch.x21,
738
+ EquivalentBranch.zero_r12,
739
+ EquivalentBranch.zero_r21,
740
+ EquivalentBranch.zero_x12,
741
+ EquivalentBranch.zero_x21
742
+ )
743
+
744
+ return self._compare_equivalent_equipment(diff)
745
+
746
+ def _compare_equivalent_equipment(self, diff: ObjectDifference) -> ObjectDifference:
747
+ return self._compare_conducting_equipment(diff)
748
+
749
+ #######################################
750
+ # IEC61970 Base Generation Production #
751
+ #######################################
752
+
753
+ def _compare_battery_unit(self, source: BatteryUnit, target: BatteryUnit) -> ObjectDifference:
754
+ diff = ObjectDifference(source, target)
755
+
756
+ self._compare_values(diff, BatteryUnit.battery_state, BatteryUnit.rated_e, BatteryUnit.stored_e)
757
+ self._compare_id_reference_collections(diff, BatteryUnit.controls)
758
+
759
+ return self._compare_power_electronics_unit(diff)
760
+
761
+ def _compare_photo_voltaic_unit(self, source: PhotoVoltaicUnit, target: PhotoVoltaicUnit) -> ObjectDifference:
762
+ return self._compare_power_electronics_unit(ObjectDifference(source, target))
763
+
764
+ def _compare_power_electronics_unit(self, diff: ObjectDifference) -> ObjectDifference:
765
+ self._compare_id_references(diff, PowerElectronicsUnit.power_electronics_connection)
766
+ self._compare_values(diff, PowerElectronicsUnit.max_p, PowerElectronicsUnit.min_p)
767
+
768
+ return self._compare_equipment(diff)
769
+
770
+ def _compare_power_electronics_wind_unit(self, source: PowerElectronicsWindUnit, target: PowerElectronicsWindUnit) -> ObjectDifference:
771
+ return self._compare_power_electronics_unit(ObjectDifference(source, target))
772
+
773
+ ######################
774
+ # IEC61970 Base Meas #
775
+ ######################
776
+
777
+ def _compare_accumulator(self, source: Accumulator, target: Accumulator) -> ObjectDifference:
778
+ return self._compare_measurement(ObjectDifference(source, target))
779
+
780
+ def _compare_analog(self, source: Analog, target: Analog) -> ObjectDifference:
781
+ diff = ObjectDifference(source, target)
782
+
783
+ self._compare_values(diff, Analog.positive_flow_in)
784
+
785
+ return self._compare_measurement(diff)
786
+
787
+ def _compare_control(self, source: Control, target: Control) -> ObjectDifference:
788
+ diff = ObjectDifference(source, target)
789
+
790
+ self._compare_values(diff, Control.power_system_resource_mrid)
791
+ self._compare_id_references(diff, Control.remote_control)
792
+
793
+ return self._compare_io_point(diff)
794
+
795
+ def _compare_discrete(self, source: Discrete, target: Discrete) -> ObjectDifference:
796
+ return self._compare_measurement(ObjectDifference(source, target))
797
+
798
+ def _compare_io_point(self, diff: ObjectDifference) -> ObjectDifference:
799
+ return self._compare_identified_object(diff)
800
+
801
+ def _compare_measurement(self, diff: ObjectDifference) -> ObjectDifference:
802
+ self._compare_values(diff, Measurement.power_system_resource_mrid, Measurement.unit_symbol, Measurement.phases, Measurement.terminal_mrid)
803
+ self._compare_id_references(diff, Measurement.remote_source)
804
+
805
+ return self._compare_identified_object(diff)
806
+
807
+ ############################
808
+ # IEC61970 Base Protection #
809
+ ############################
810
+
811
+ def _compare_current_relay(self, source: CurrentRelay, target: CurrentRelay) -> ObjectDifference:
812
+ diff = ObjectDifference(source, target)
813
+
814
+ self._compare_values(diff, CurrentRelay.inverse_time_flag)
815
+ self._compare_floats(diff, CurrentRelay.current_limit_1, CurrentRelay.time_delay_1)
816
+
817
+ return self._compare_protection_relay_function(diff)
818
+
819
+ #######################
820
+ # IEC61970 Base Scada #
821
+ #######################
822
+
823
+ def _compare_remote_control(self, source: RemoteControl, target: RemoteControl) -> ObjectDifference:
824
+ diff = ObjectDifference(source, target)
825
+
826
+ self._compare_id_references(diff, RemoteControl.control)
827
+
828
+ return self._compare_remote_point(diff)
829
+
830
+ def _compare_remote_point(self, diff: ObjectDifference) -> ObjectDifference:
831
+ return self._compare_identified_object(diff)
832
+
833
+ def _compare_remote_source(self, source: RemoteSource, target: RemoteSource) -> ObjectDifference:
834
+ diff = ObjectDifference(source, target)
835
+
836
+ self._compare_id_references(diff, RemoteSource.measurement)
837
+
838
+ return self._compare_remote_point(diff)
839
+
840
+ #######################
841
+ # IEC61970 Base Wires #
842
+ #######################
843
+
844
+ def _compare_ac_line_segment(self, source: AcLineSegment, target: AcLineSegment) -> ObjectDifference:
845
+ diff = ObjectDifference(source, target)
846
+
847
+ self._compare_id_references(diff, AcLineSegment.per_length_impedance)
848
+ self._compare_id_reference_collections(diff, AcLineSegment.cuts)
849
+ self._compare_id_reference_collections(diff, AcLineSegment.clamps)
850
+
851
+ return self._compare_conductor(diff)
852
+
853
+ def _compare_breaker(self, source: Breaker, target: Breaker) -> ObjectDifference:
854
+ diff = ObjectDifference(source, target)
855
+
856
+ self._compare_floats(diff, Breaker.in_transit_time)
857
+
858
+ return self._compare_protected_switch(diff)
859
+
860
+ def _compare_busbar_section(self, source: BusbarSection, target: BusbarSection) -> ObjectDifference:
861
+ return self._compare_connector(ObjectDifference(source, target))
862
+
863
+ def _compare_clamp(self, source: Clamp, target: Clamp) -> ObjectDifference:
864
+ diff = ObjectDifference(source, target)
865
+
866
+ self._compare_floats(diff, Clamp.length_from_terminal_1)
867
+ self._compare_id_references(diff, Clamp.ac_line_segment)
868
+
869
+ return self._compare_conducting_equipment(diff)
870
+
871
+ def _compare_conductor(self, diff: ObjectDifference) -> ObjectDifference:
872
+ self._compare_floats(diff, Conductor.length, Conductor.design_rating)
873
+ self._compare_values(diff, Conductor.design_temperature)
874
+ self._compare_id_references(diff, Conductor.wire_info)
875
+
876
+ return self._compare_conducting_equipment(diff)
877
+
878
+ def _compare_connector(self, diff: ObjectDifference) -> ObjectDifference:
879
+ return self._compare_conducting_equipment(diff)
880
+
881
+ def _compare_cut(self, source: Cut, target: Cut) -> ObjectDifference:
882
+ diff = ObjectDifference(source, target)
883
+
884
+ self._compare_floats(diff, Cut.length_from_terminal_1)
885
+ self._compare_id_references(diff, Cut.ac_line_segment)
886
+
887
+ return self._compare_switch(diff)
888
+
889
+ def _compare_disconnector(self, source: Disconnector, target: Disconnector) -> ObjectDifference:
890
+ return self._compare_switch(ObjectDifference(source, target))
891
+
892
+ def _compare_earth_fault_compensator(self, diff: ObjectDifference) -> ObjectDifference:
893
+ self._compare_floats(diff, EarthFaultCompensator.r)
894
+
895
+ return self._compare_conducting_equipment(diff)
896
+
897
+ def _compare_energy_connection(self, diff: ObjectDifference) -> ObjectDifference:
898
+ return self._compare_conducting_equipment(diff)
899
+
900
+ def _compare_energy_consumer(self, source: EnergyConsumer, target: EnergyConsumer) -> ObjectDifference:
901
+ diff = ObjectDifference(source, target)
902
+
903
+ self._compare_id_reference_collections(diff, EnergyConsumer.phases)
904
+ self._compare_values(diff, EnergyConsumer.customer_count, EnergyConsumer.grounded, EnergyConsumer.phase_connection)
905
+ self._compare_floats(diff, EnergyConsumer.p, EnergyConsumer.p_fixed, EnergyConsumer.q, EnergyConsumer.q_fixed)
906
+
907
+ return self._compare_energy_connection(diff)
908
+
909
+ def _compare_energy_consumer_phase(self, source: EnergyConsumerPhase, target: EnergyConsumerPhase) -> ObjectDifference:
910
+ diff = ObjectDifference(source, target)
911
+
912
+ self._compare_id_references(diff, EnergyConsumerPhase.energy_consumer)
913
+ self._compare_values(diff, EnergyConsumerPhase.phase)
914
+ self._compare_floats(diff, EnergyConsumerPhase.p, EnergyConsumerPhase.p_fixed, EnergyConsumerPhase.q, EnergyConsumerPhase.q_fixed)
915
+
916
+ return self._compare_power_system_resource(diff)
917
+
918
+ def _compare_energy_source(self, source: EnergySource, target: EnergySource) -> ObjectDifference:
919
+ diff = ObjectDifference(source, target)
920
+
921
+ self._compare_id_reference_collections(diff, EnergySource.phases)
922
+ self._compare_floats(
923
+ diff,
924
+ EnergySource.active_power,
925
+ EnergySource.reactive_power,
926
+ EnergySource.voltage_angle,
927
+ EnergySource.voltage_magnitude,
928
+ EnergySource.p_max,
929
+ EnergySource.p_min,
930
+ EnergySource.r,
931
+ EnergySource.r0,
932
+ EnergySource.rn,
933
+ EnergySource.x,
934
+ EnergySource.x0,
935
+ EnergySource.xn,
936
+ EnergySource.r_min,
937
+ EnergySource.rn_min,
938
+ EnergySource.r0_min,
939
+ EnergySource.x_min,
940
+ EnergySource.xn_min,
941
+ EnergySource.x0_min,
942
+ EnergySource.r_max,
943
+ EnergySource.rn_max,
944
+ EnergySource.r0_max,
945
+ EnergySource.x_max,
946
+ EnergySource.xn_max,
947
+ EnergySource.x0_max
948
+ )
949
+ self._compare_values(
950
+ diff,
951
+ EnergySource.is_external_grid
952
+ )
953
+
954
+ return self._compare_energy_connection(diff)
955
+
956
+ def _compare_energy_source_phase(self, source: EnergySourcePhase, target: EnergySourcePhase) -> ObjectDifference:
957
+ diff = ObjectDifference(source, target)
958
+
959
+ self._compare_id_references(diff, EnergySourcePhase.energy_source)
960
+ self._compare_values(diff, EnergySourcePhase.phase)
961
+
962
+ return self._compare_power_system_resource(diff)
963
+
964
+ def _compare_fuse(self, source: Fuse, target: Fuse) -> ObjectDifference:
965
+ diff = ObjectDifference(source, target)
966
+ self._compare_id_references(diff, Fuse.function)
967
+ return self._compare_switch(diff)
968
+
969
+ def _compare_ground(self, source: Ground, target: Ground) -> ObjectDifference:
970
+ return self._compare_conducting_equipment(ObjectDifference(source, target))
971
+
972
+ def _compare_ground_disconnector(self, source: GroundDisconnector, target: GroundDisconnector) -> ObjectDifference:
973
+ return self._compare_switch(ObjectDifference(source, target))
974
+
975
+ def _compare_grounding_impedance(self, source: GroundingImpedance, target: GroundingImpedance) -> ObjectDifference:
976
+ diff = ObjectDifference(source, target)
977
+ self._compare_floats(diff, GroundingImpedance.x)
978
+ return self._compare_earth_fault_compensator(diff)
979
+
980
+ def _compare_jumper(self, source: Jumper, target: Jumper) -> ObjectDifference:
981
+ return self._compare_switch(ObjectDifference(source, target))
982
+
983
+ def _compare_junction(self, source: Junction, target: Junction) -> ObjectDifference:
984
+ return self._compare_connector(ObjectDifference(source, target))
985
+
986
+ def _compare_line(self, diff: ObjectDifference) -> ObjectDifference:
987
+ return self._compare_equipment_container(diff)
988
+
989
+ def _compare_linear_shunt_compensator(self, source: LinearShuntCompensator, target: LinearShuntCompensator) -> ObjectDifference:
990
+ diff = ObjectDifference(source, target)
991
+
992
+ self._compare_floats(
993
+ diff,
994
+ LinearShuntCompensator.b0_per_section,
995
+ LinearShuntCompensator.b_per_section,
996
+ LinearShuntCompensator.g0_per_section,
997
+ LinearShuntCompensator.g_per_section
998
+ )
999
+
1000
+ return self._compare_shunt_compensator(diff)
1001
+
1002
+ def _compare_load_break_switch(self, source: LoadBreakSwitch, target: LoadBreakSwitch) -> ObjectDifference:
1003
+ return self._compare_protected_switch(ObjectDifference(source, target))
1004
+
1005
+ def _compare_per_length_impedance(self, diff: ObjectDifference) -> ObjectDifference:
1006
+ return self._compare_per_length_line_parameter(diff)
1007
+
1008
+ def _compare_per_length_line_parameter(self, diff: ObjectDifference) -> ObjectDifference:
1009
+ return self._compare_identified_object(diff)
1010
+
1011
+ def _compare_per_length_phase_impedance(self, source: PerLengthPhaseImpedance, target: PerLengthPhaseImpedance) -> ObjectDifference:
1012
+ diff = ObjectDifference(source, target)
1013
+
1014
+ self._compare_unordered_value_collection(diff, lambda it: f"{it.from_phase}-{it.to_phase}", PerLengthPhaseImpedance.data)
1015
+
1016
+ return self._compare_per_length_impedance(diff)
1017
+
1018
+ def _compare_per_length_sequence_impedance(self, source: PerLengthSequenceImpedance, target: PerLengthSequenceImpedance) -> ObjectDifference:
1019
+ diff = ObjectDifference(source, target)
1020
+
1021
+ self._compare_floats(
1022
+ diff,
1023
+ PerLengthSequenceImpedance.r,
1024
+ PerLengthSequenceImpedance.x,
1025
+ PerLengthSequenceImpedance.bch,
1026
+ PerLengthSequenceImpedance.gch,
1027
+ PerLengthSequenceImpedance.r0,
1028
+ PerLengthSequenceImpedance.x0,
1029
+ PerLengthSequenceImpedance.b0ch,
1030
+ PerLengthSequenceImpedance.g0ch
1031
+ )
1032
+
1033
+ return self._compare_per_length_impedance(diff)
1034
+
1035
+ def _compare_petersen_coil(self, source: PetersenCoil, target: PetersenCoil) -> ObjectDifference:
1036
+ diff = ObjectDifference(source, target)
1037
+ self._compare_floats(diff, PetersenCoil.x_ground_nominal)
1038
+ return self._compare_earth_fault_compensator(diff)
1039
+
1040
+ def _compare_power_electronics_connection(self, source: PowerElectronicsConnection, target: PowerElectronicsConnection) -> ObjectDifference:
1041
+ diff = ObjectDifference(source, target)
1042
+
1043
+ self._compare_id_reference_collections(diff, PowerElectronicsConnection.units, PowerElectronicsConnection.phases)
1044
+ self._compare_values(
1045
+ diff,
1046
+ PowerElectronicsConnection.max_i_fault,
1047
+ PowerElectronicsConnection.rated_s,
1048
+ PowerElectronicsConnection.rated_u,
1049
+ PowerElectronicsConnection.inverter_standard,
1050
+ PowerElectronicsConnection.sustain_op_overvolt_limit,
1051
+ PowerElectronicsConnection.inv_volt_watt_resp_mode,
1052
+ PowerElectronicsConnection.inv_watt_resp_v1,
1053
+ PowerElectronicsConnection.inv_watt_resp_v2,
1054
+ PowerElectronicsConnection.inv_watt_resp_v3,
1055
+ PowerElectronicsConnection.inv_watt_resp_v4,
1056
+ PowerElectronicsConnection.inv_volt_var_resp_mode,
1057
+ PowerElectronicsConnection.inv_var_resp_v1,
1058
+ PowerElectronicsConnection.inv_var_resp_v2,
1059
+ PowerElectronicsConnection.inv_var_resp_v3,
1060
+ PowerElectronicsConnection.inv_var_resp_v4,
1061
+ PowerElectronicsConnection.inv_reactive_power_mode
1062
+ )
1063
+ self._compare_floats(
1064
+ diff,
1065
+ PowerElectronicsConnection.max_q,
1066
+ PowerElectronicsConnection.min_q,
1067
+ PowerElectronicsConnection.p,
1068
+ PowerElectronicsConnection.q,
1069
+ PowerElectronicsConnection.stop_at_over_freq,
1070
+ PowerElectronicsConnection.stop_at_under_freq,
1071
+ PowerElectronicsConnection.inv_watt_resp_p_at_v1,
1072
+ PowerElectronicsConnection.inv_watt_resp_p_at_v2,
1073
+ PowerElectronicsConnection.inv_watt_resp_p_at_v3,
1074
+ PowerElectronicsConnection.inv_watt_resp_p_at_v4,
1075
+ PowerElectronicsConnection.inv_var_resp_q_at_v1,
1076
+ PowerElectronicsConnection.inv_var_resp_q_at_v2,
1077
+ PowerElectronicsConnection.inv_var_resp_q_at_v3,
1078
+ PowerElectronicsConnection.inv_var_resp_q_at_v4,
1079
+ PowerElectronicsConnection.inv_fix_reactive_power
1080
+ )
1081
+
1082
+ return self._compare_regulating_cond_eq(diff)
1083
+
1084
+ def _compare_power_electronics_connection_phase(self, source: PowerElectronicsConnectionPhase, target: PowerElectronicsConnectionPhase) -> ObjectDifference:
1085
+ diff = ObjectDifference(source, target)
1086
+
1087
+ self._compare_id_references(diff, PowerElectronicsConnectionPhase.power_electronics_connection)
1088
+ self._compare_values(diff, PowerElectronicsConnectionPhase.phase)
1089
+ self._compare_floats(diff, PowerElectronicsConnectionPhase.p, PowerElectronicsConnectionPhase.q)
1090
+
1091
+ return self._compare_power_system_resource(diff)
1092
+
1093
+ def _compare_power_transformer(self, source: PowerTransformer, target: PowerTransformer) -> ObjectDifference:
1094
+ diff = ObjectDifference(source, target)
1095
+
1096
+ self._compare_indexed_id_reference_collections(diff, PowerTransformer.ends)
1097
+ self._compare_values(diff, PowerTransformer.vector_group, PowerTransformer.construction_kind, PowerTransformer.function)
1098
+ self._compare_floats(diff, PowerTransformer.transformer_utilisation)
1099
+ self._compare_id_references(diff, PowerTransformer.power_transformer_info)
1100
+
1101
+ return self._compare_conducting_equipment(diff)
1102
+
1103
+ def _compare_power_transformer_end(self, source: PowerTransformerEnd, target: PowerTransformerEnd) -> ObjectDifference:
1104
+ diff = ObjectDifference(source, target)
1105
+
1106
+ self._compare_id_references(diff, PowerTransformerEnd.power_transformer)
1107
+ self._compare_values(
1108
+ diff,
1109
+ PowerTransformerEnd.connection_kind,
1110
+ PowerTransformerEnd.phase_angle_clock,
1111
+ PowerTransformerEnd.rated_s,
1112
+ PowerTransformerEnd.rated_u
1113
+ )
1114
+ self._compare_floats(
1115
+ diff,
1116
+ PowerTransformerEnd.b,
1117
+ PowerTransformerEnd.b0,
1118
+ PowerTransformerEnd.g,
1119
+ PowerTransformerEnd.g0,
1120
+ PowerTransformerEnd.r,
1121
+ PowerTransformerEnd.r0,
1122
+ PowerTransformerEnd.x,
1123
+ PowerTransformerEnd.x0
1124
+ )
1125
+ self._compare_indexed_value_collections(diff, PowerTransformerEnd.s_ratings)
1126
+
1127
+ return self._compare_transformer_end(diff)
1128
+
1129
+ def _compare_protected_switch(self, diff: ObjectDifference) -> ObjectDifference:
1130
+ self._compare_values(diff, ProtectedSwitch.breaking_capacity)
1131
+ self._compare_id_reference_collections(diff, ProtectedSwitch.relay_functions)
1132
+
1133
+ return self._compare_switch(diff)
1134
+
1135
+ def _compare_ratio_tap_changer(self, source: RatioTapChanger, target: RatioTapChanger) -> ObjectDifference:
1136
+ diff = ObjectDifference(source, target)
1137
+
1138
+ self._compare_id_references(diff, RatioTapChanger.transformer_end)
1139
+ self._compare_floats(diff, RatioTapChanger.step_voltage_increment)
1140
+
1141
+ return self._compare_tap_changer(diff)
1142
+
1143
+ def _compare_reactive_capability_curve(self, source: ReactiveCapabilityCurve, target: ReactiveCapabilityCurve) -> ObjectDifference:
1144
+ return self._compare_curve(ObjectDifference(source, target))
1145
+
1146
+ def _compare_recloser(self, source: Recloser, target: Recloser) -> ObjectDifference:
1147
+ return self._compare_protected_switch(ObjectDifference(source, target))
1148
+
1149
+ def _compare_regulating_cond_eq(self, diff: ObjectDifference) -> ObjectDifference:
1150
+ self._compare_values(diff, RegulatingCondEq.control_enabled)
1151
+ self._compare_id_references(diff, RegulatingCondEq.regulating_control)
1152
+
1153
+ return self._compare_energy_connection(diff)
1154
+
1155
+ def _compare_regulating_control(self, diff: ObjectDifference) -> ObjectDifference:
1156
+ self._compare_values(
1157
+ diff,
1158
+ RegulatingControl.discrete,
1159
+ RegulatingControl.mode,
1160
+ RegulatingControl.monitored_phase,
1161
+ RegulatingControl.enabled
1162
+ )
1163
+ self._compare_floats(
1164
+ diff,
1165
+ RegulatingControl.target_deadband,
1166
+ RegulatingControl.target_value,
1167
+ RegulatingControl.max_allowed_target_value,
1168
+ RegulatingControl.min_allowed_target_value,
1169
+ RegulatingControl.rated_current,
1170
+ RegulatingControl.ct_primary,
1171
+ RegulatingControl.min_target_deadband
1172
+ )
1173
+ self._compare_id_references(diff, RegulatingControl.terminal)
1174
+ self._compare_id_reference_collections(diff, RegulatingControl.regulating_conducting_equipment)
1175
+
1176
+ return self._compare_power_system_resource(diff)
1177
+
1178
+ def _compare_rotating_machine(self, diff: ObjectDifference) -> ObjectDifference:
1179
+ self._compare_values(diff, RotatingMachine.rated_u)
1180
+ self._compare_floats(diff, RotatingMachine.rated_power_factor, RotatingMachine.rated_s, RotatingMachine.p, RotatingMachine.q)
1181
+
1182
+ return self._compare_regulating_cond_eq(diff)
1183
+
1184
+ def _compare_series_compensator(self, source: SeriesCompensator, target: SeriesCompensator) -> ObjectDifference:
1185
+ diff = ObjectDifference(source, target)
1186
+ self._compare_values(diff, SeriesCompensator.varistor_rated_current, SeriesCompensator.varistor_voltage_threshold)
1187
+ self._compare_floats(diff, SeriesCompensator.r, SeriesCompensator.r0, SeriesCompensator.x, SeriesCompensator.x0)
1188
+
1189
+ return self._compare_conducting_equipment(diff)
1190
+
1191
+ def _compare_shunt_compensator(self, diff: ObjectDifference) -> ObjectDifference:
1192
+ self._compare_values(diff, ShuntCompensator.grounded, ShuntCompensator.nom_u, ShuntCompensator.phase_connection)
1193
+ self._compare_floats(diff, ShuntCompensator.sections)
1194
+ self._compare_id_references(diff, ShuntCompensator.shunt_compensator_info)
1195
+
1196
+ return self._compare_regulating_cond_eq(diff)
1197
+
1198
+ def _compare_static_var_compensator(self, source: StaticVarCompensator, target: StaticVarCompensator) -> ObjectDifference:
1199
+ diff = ObjectDifference(source, target)
1200
+ self._compare_values(diff, StaticVarCompensator.svc_control_mode, StaticVarCompensator.voltage_set_point)
1201
+ self._compare_floats(
1202
+ diff,
1203
+ StaticVarCompensator.capacitive_rating,
1204
+ StaticVarCompensator.inductive_rating,
1205
+ StaticVarCompensator.q,
1206
+ )
1207
+
1208
+ return self._compare_regulating_cond_eq(diff)
1209
+
1210
+ def _compare_switch(self, diff: ObjectDifference) -> ObjectDifference:
1211
+ self._compare_floats(diff, Switch.rated_current)
1212
+ self._add_if_different(diff, "isNormallyOpen", self._compare_open_status(diff, lambda it, phase: it.is_normally_open(phase)))
1213
+ self._add_if_different(diff, "isOpen", self._compare_open_status(diff, lambda it, phase: it.is_open()))
1214
+ self._compare_id_references(diff, Switch.switch_info)
1215
+
1216
+ return self._compare_conducting_equipment(diff)
1217
+
1218
+ def _compare_synchronous_machine(self, source: SynchronousMachine, target: SynchronousMachine) -> ObjectDifference:
1219
+ diff = ObjectDifference(source, target)
1220
+
1221
+ self._compare_values(
1222
+ diff,
1223
+ SynchronousMachine.condenser_p,
1224
+ SynchronousMachine.earthing,
1225
+ SynchronousMachine.max_u,
1226
+ SynchronousMachine.min_u,
1227
+ SynchronousMachine.type,
1228
+ SynchronousMachine.operating_mode
1229
+ )
1230
+
1231
+ self._compare_floats(
1232
+ diff,
1233
+ SynchronousMachine.base_q,
1234
+ SynchronousMachine.earthing_star_point_r,
1235
+ SynchronousMachine.earthing_star_point_x,
1236
+ SynchronousMachine.ikk,
1237
+ SynchronousMachine.max_q,
1238
+ SynchronousMachine.min_q,
1239
+ SynchronousMachine.mu,
1240
+ SynchronousMachine.r,
1241
+ SynchronousMachine.r0,
1242
+ SynchronousMachine.r2,
1243
+ SynchronousMachine.sat_direct_subtrans_x,
1244
+ SynchronousMachine.sat_direct_sync_x,
1245
+ SynchronousMachine.sat_direct_trans_x,
1246
+ SynchronousMachine.x0,
1247
+ SynchronousMachine.x2,
1248
+ )
1249
+ self._compare_id_reference_collections(diff, SynchronousMachine.curves)
1250
+
1251
+ return self._compare_rotating_machine(diff)
1252
+
1253
+ def _compare_tap_changer(self, diff: ObjectDifference) -> ObjectDifference:
1254
+ self._compare_values(
1255
+ diff,
1256
+ TapChanger.control_enabled,
1257
+ TapChanger.neutral_u,
1258
+ TapChanger.high_step,
1259
+ TapChanger.low_step,
1260
+ TapChanger.neutral_step,
1261
+ TapChanger.normal_step
1262
+ )
1263
+ self._compare_floats(diff, TapChanger.step)
1264
+
1265
+ self._compare_id_references(diff, TapChanger.tap_changer_control)
1266
+ return self._compare_power_system_resource(diff)
1267
+
1268
+ def _compare_tap_changer_control(self, source: TapChangerControl, target: TapChangerControl) -> ObjectDifference:
1269
+ diff = ObjectDifference(source, target)
1270
+
1271
+ self._compare_values(
1272
+ diff,
1273
+ TapChangerControl.limit_voltage,
1274
+ TapChangerControl.line_drop_compensation,
1275
+ TapChangerControl.forward_ldc_blocking,
1276
+ TapChangerControl.co_generation_enabled
1277
+ )
1278
+ self._compare_floats(
1279
+ diff,
1280
+ TapChangerControl.line_drop_r,
1281
+ TapChangerControl.line_drop_x,
1282
+ TapChangerControl.reverse_line_drop_r,
1283
+ TapChangerControl.reverse_line_drop_x,
1284
+ TapChangerControl.time_delay,
1285
+ )
1286
+
1287
+ return self._compare_regulating_control(diff)
1288
+
1289
+ def _compare_transformer_end(self, diff: ObjectDifference) -> ObjectDifference:
1290
+ self._compare_values(diff, TransformerEnd.grounded, TransformerEnd.end_number)
1291
+ self._compare_floats(diff, TransformerEnd.r_ground, TransformerEnd.x_ground)
1292
+ self._compare_id_references(diff, TransformerEnd.base_voltage, TransformerEnd.ratio_tap_changer, TransformerEnd.terminal, TransformerEnd.star_impedance)
1293
+
1294
+ return self._compare_identified_object(diff)
1295
+
1296
+ def _compare_transformer_star_impedance(self, source: TransformerStarImpedance, target: TransformerStarImpedance) -> ObjectDifference:
1297
+ diff = ObjectDifference(source, target)
1298
+
1299
+ self._compare_floats(diff, TransformerStarImpedance.r, TransformerStarImpedance.r0, TransformerStarImpedance.x, TransformerStarImpedance.x0)
1300
+ self._compare_id_references(diff, TransformerStarImpedance.transformer_end_info)
1301
+
1302
+ return self._compare_identified_object(diff)
1303
+
1304
+ ###############################
1305
+ # IEC61970 InfIEC61970 Feeder #
1306
+ ###############################
1307
+
1308
+ def _compare_circuit(self, source: Circuit, target: Circuit) -> ObjectDifference:
1309
+ diff = ObjectDifference(source, target)
1310
+
1311
+ self._compare_id_references(diff, Circuit.loop)
1312
+ self._compare_id_reference_collections(diff, Circuit.end_terminals, Circuit.end_substations)
1313
+
1314
+ return self._compare_line(diff)
1315
+
1316
+ @staticmethod
1317
+ # NOTE: Should be Callable[[Switch, SinglePhaseKind], bool], but type inference does not work correctly.
1318
+ def _compare_open_status(diff: ObjectDifference, open_test: Callable[[Any, SinglePhaseKind], bool]) -> Optional[ValueDifference]:
1319
+ source_status = {phase: open_test(diff.source, phase) for phase in PhaseCode.ABCN.single_phases}
1320
+ target_status = {phase: open_test(diff.target, phase) for phase in PhaseCode.ABCN.single_phases}
1321
+
1322
+ return ValueDifference(source_status, target_status) if source_status != target_status else None