zepben.ewb 1.0.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zepben/ewb/__init__.py +601 -0
- zepben/ewb/auth/__init__.py +10 -0
- zepben/ewb/auth/client/__init__.py +5 -0
- zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
- zepben/ewb/auth/common/__init__.py +5 -0
- zepben/ewb/auth/common/auth_exception.py +16 -0
- zepben/ewb/auth/common/auth_method.py +28 -0
- zepben/ewb/auth/common/auth_provider_config.py +96 -0
- zepben/ewb/database/__init__.py +4 -0
- zepben/ewb/database/paths/__init__.py +4 -0
- zepben/ewb/database/paths/database_type.py +34 -0
- zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
- zepben/ewb/database/sqlite/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
- zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
- zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
- zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
- zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
- zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
- zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
- zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
- zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
- zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
- zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
- zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
- zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
- zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
- zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
- zepben/ewb/database/sqlite/customer/__init__.py +4 -0
- zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
- zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
- zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
- zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
- zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
- zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
- zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
- zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
- zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
- zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
- zepben/ewb/database/sqlite/network/__init__.py +4 -0
- zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
- zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
- zepben/ewb/database/sqlite/network/network_database_reader.py +173 -0
- zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
- zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
- zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
- zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
- zepben/ewb/database/sqlite/tables/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
- zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
- zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
- zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
- zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
- zepben/ewb/database/sqlite/tables/column.py +37 -0
- zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
- zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
- zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
- zepben/ewb/database/sqlite/tables/sqlite_table.py +142 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +38 -0
- zepben/ewb/dataclassy/__init__.py +15 -0
- zepben/ewb/dataclassy/dataclass.py +192 -0
- zepben/ewb/dataclassy/decorator.py +35 -0
- zepben/ewb/dataclassy/functions.py +80 -0
- zepben/ewb/examples/__init__.py +6 -0
- zepben/ewb/examples/simple_test_network.py +158 -0
- zepben/ewb/exceptions.py +52 -0
- zepben/ewb/model/__init__.py +4 -0
- zepben/ewb/model/busbranch/__init__.py +4 -0
- zepben/ewb/model/busbranch/bus_branch.py +1051 -0
- zepben/ewb/model/cim/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +113 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +82 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +56 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +292 -0
- zepben/ewb/model/cim/extensions/zbex.py +17 -0
- zepben/ewb/model/cim/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
- zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
- zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +55 -0
- zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
- zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
- zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
- zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
- zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
- zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
- zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
- zepben/ewb/model/cim/iec61968/common/document.py +36 -0
- zepben/ewb/model/cim/iec61968/common/location.py +129 -0
- zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
- zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
- zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
- zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
- zepben/ewb/model/cim/iec61968/common/street_detail.py +45 -0
- zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
- zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
- zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
- zepben/ewb/model/cim/iec61968/customers/customer_kind.py +67 -0
- zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
- zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
- zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +67 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +43 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +25 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
- zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +150 -0
- zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +46 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +26 -0
- zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
- zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
- zepben/ewb/model/cim/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +28 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
- zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
- zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
- zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
- zepben/ewb/model/cim/iec61970/base/core/curve.py +124 -0
- zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
- zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
- zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
- zepben/ewb/model/cim/iec61970/base/core/identified_object.py +234 -0
- zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
- zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
- zepben/ewb/model/cim/iec61970/base/core/phase_code.py +201 -0
- zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
- zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
- zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
- zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +26 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +27 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +492 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
- zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +37 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
- zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
- zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
- zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
- zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
- zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
- zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +38 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
- zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
- zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +46 -0
- zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
- zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
- zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +105 -0
- zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +28 -0
- zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +44 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +43 -0
- zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
- zepben/ewb/model/phases.py +168 -0
- zepben/ewb/model/resistance_reactance.py +40 -0
- zepben/ewb/services/__init__.py +4 -0
- zepben/ewb/services/common/__init__.py +16 -0
- zepben/ewb/services/common/base_service.py +383 -0
- zepben/ewb/services/common/base_service_comparator.py +394 -0
- zepben/ewb/services/common/difference.py +47 -0
- zepben/ewb/services/common/enum_mapper.py +55 -0
- zepben/ewb/services/common/meta/__init__.py +4 -0
- zepben/ewb/services/common/meta/data_source.py +16 -0
- zepben/ewb/services/common/meta/metadata_collection.py +28 -0
- zepben/ewb/services/common/meta/metadata_translations.py +47 -0
- zepben/ewb/services/common/meta/service_info.py +22 -0
- zepben/ewb/services/common/reference_resolvers.py +374 -0
- zepben/ewb/services/common/resolver.py +597 -0
- zepben/ewb/services/common/translator/__init__.py +4 -0
- zepben/ewb/services/common/translator/base_cim2proto.py +92 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +112 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +78 -0
- zepben/ewb/services/customer/__init__.py +4 -0
- zepben/ewb/services/customer/customer_service_comparator.py +52 -0
- zepben/ewb/services/customer/customers.py +23 -0
- zepben/ewb/services/customer/translator/__init__.py +21 -0
- zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
- zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
- zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
- zepben/ewb/services/diagram/__init__.py +4 -0
- zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
- zepben/ewb/services/diagram/diagrams.py +107 -0
- zepben/ewb/services/diagram/translator/__init__.py +11 -0
- zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
- zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
- zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
- zepben/ewb/services/measurement/__init__.py +4 -0
- zepben/ewb/services/measurement/measurements.py +35 -0
- zepben/ewb/services/measurement/translator/__init__.py +6 -0
- zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
- zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
- zepben/ewb/services/network/__init__.py +4 -0
- zepben/ewb/services/network/network_extensions.py +119 -0
- zepben/ewb/services/network/network_service.py +302 -0
- zepben/ewb/services/network/network_service_comparator.py +1322 -0
- zepben/ewb/services/network/network_state.py +34 -0
- zepben/ewb/services/network/tracing/__init__.py +4 -0
- zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
- zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
- zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
- zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
- zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
- zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
- zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
- zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
- zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
- zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
- zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
- zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
- zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
- zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +71 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +37 -0
- zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace.py +450 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +125 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
- zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
- zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
- zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
- zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
- zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
- zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
- zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
- zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
- zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
- zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
- zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
- zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
- zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
- zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
- zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
- zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
- zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
- zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
- zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
- zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
- zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
- zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
- zepben/ewb/services/network/tracing/util.py +93 -0
- zepben/ewb/services/network/translator/__init__.py +392 -0
- zepben/ewb/services/network/translator/network_cim2proto.py +1782 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2147 -0
- zepben/ewb/services/services.py +48 -0
- zepben/ewb/streaming/__init__.py +4 -0
- zepben/ewb/streaming/data/__init__.py +4 -0
- zepben/ewb/streaming/data/current_state_event.py +314 -0
- zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
- zepben/ewb/streaming/data/set_current_states_status.py +286 -0
- zepben/ewb/streaming/exceptions.py +14 -0
- zepben/ewb/streaming/get/__init__.py +4 -0
- zepben/ewb/streaming/get/consumer.py +209 -0
- zepben/ewb/streaming/get/customer_consumer.py +111 -0
- zepben/ewb/streaming/get/diagram_consumer.py +107 -0
- zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
- zepben/ewb/streaming/get/hierarchy/data.py +27 -0
- zepben/ewb/streaming/get/included_energized_containers.py +34 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +34 -0
- zepben/ewb/streaming/get/network_consumer.py +870 -0
- zepben/ewb/streaming/get/query_network_state_client.py +64 -0
- zepben/ewb/streaming/get/query_network_state_service.py +94 -0
- zepben/ewb/streaming/grpc/__init__.py +4 -0
- zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
- zepben/ewb/streaming/grpc/connect.py +209 -0
- zepben/ewb/streaming/grpc/grpc.py +107 -0
- zepben/ewb/streaming/grpc/grpc_channel_builder.py +185 -0
- zepben/ewb/streaming/mutations/__init__.py +4 -0
- zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
- zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
- zepben/ewb/testing/__init__.py +4 -0
- zepben/ewb/testing/test_network_builder.py +816 -0
- zepben/ewb/types.py +17 -0
- zepben/ewb/util.py +189 -0
- zepben_ewb-1.0.0b1.dist-info/METADATA +102 -0
- zepben_ewb-1.0.0b1.dist-info/RECORD +639 -0
- zepben_ewb-1.0.0b1.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0b1.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
from logging import Logger
|
|
6
|
+
from typing import Optional, Callable, List, Union, Type, TypeVar, Protocol
|
|
7
|
+
|
|
8
|
+
from zepben.ewb import (ConductingEquipment, NetworkService, PhaseCode, EnergySource, AcLineSegment, Breaker, Terminal, LvFeeder,
|
|
9
|
+
PowerTransformer, EnergyConsumer, PowerElectronicsConnection, Clamp, Cut)
|
|
10
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.core.site import Site
|
|
11
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.wires.junction import Junction
|
|
14
|
+
from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd
|
|
15
|
+
from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
|
|
16
|
+
from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing
|
|
17
|
+
|
|
18
|
+
SubclassesConductingEquipment = TypeVar('SubclassesConductingEquipment', bound=ConductingEquipment)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def null_action(_):
|
|
22
|
+
"""
|
|
23
|
+
An action that does nothing.
|
|
24
|
+
|
|
25
|
+
:param _: Any item that will be ignored
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class OtherCreator(Protocol):
|
|
30
|
+
"""Type hint class"""
|
|
31
|
+
|
|
32
|
+
def __call__(self, mrid: str, *args, **kwargs) -> ConductingEquipment: ...
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TestNetworkBuilder:
|
|
36
|
+
"""
|
|
37
|
+
A class for building simple test networks, often used for unit testing.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
__test__ = False
|
|
41
|
+
|
|
42
|
+
def __init__(self):
|
|
43
|
+
self.network: NetworkService = NetworkService()
|
|
44
|
+
"""
|
|
45
|
+
The network where objects are created for this `TestNetworkBuilder`. You should not be readily required to access the network via this property,
|
|
46
|
+
but should instead access it via `build` to ensure the correct tracing is applied before use.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
self._count = 0
|
|
50
|
+
self._current: Optional[ConductingEquipment] = None
|
|
51
|
+
self._current_terminal: Optional[int] = None
|
|
52
|
+
|
|
53
|
+
def from_source(
|
|
54
|
+
self,
|
|
55
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
56
|
+
mrid: Optional[str] = None,
|
|
57
|
+
action: Callable[[EnergySource], None] = null_action
|
|
58
|
+
) -> 'TestNetworkBuilder':
|
|
59
|
+
"""
|
|
60
|
+
Start a new network island from an `EnergySource`, updating the network pointer to the new `EnergySource`.
|
|
61
|
+
|
|
62
|
+
:param nominal_phases: The `PhaseCode` for the new `EnergySource`, used as both the nominal and energising phases. Must be a subset of `PhaseCode.ABCN`.
|
|
63
|
+
:param mrid: Optional mRID for the new source.
|
|
64
|
+
:param action: An action that accepts the new `EnergySource` to allow for additional initialisation.
|
|
65
|
+
|
|
66
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
67
|
+
"""
|
|
68
|
+
it = self._create_external_source(mrid, nominal_phases)
|
|
69
|
+
action(it)
|
|
70
|
+
self._current = it
|
|
71
|
+
return self
|
|
72
|
+
|
|
73
|
+
def to_source(
|
|
74
|
+
self,
|
|
75
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
76
|
+
mrid: Optional[str] = None,
|
|
77
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
78
|
+
action: Callable[[EnergySource], None] = null_action
|
|
79
|
+
) -> 'TestNetworkBuilder':
|
|
80
|
+
"""
|
|
81
|
+
Add a new `EnergySource` to the network and connect it to the current network pointer, updating the network pointer to the new `EnergySource`.
|
|
82
|
+
|
|
83
|
+
:param nominal_phases: The `PhaseCode` for the new `EnergySource`, used as both the nominal and energising phases. Must be a subset of `PhaseCode.ABCN`.
|
|
84
|
+
:param mrid: Optional mRID for the new source.
|
|
85
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `EnergySource` to the previous item. Will only be used if the
|
|
86
|
+
previous item is not already connected.
|
|
87
|
+
:param action: An action that accepts the new `EnergySource` to allow for additional initialisation.
|
|
88
|
+
|
|
89
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
90
|
+
"""
|
|
91
|
+
it = self._create_external_source(mrid, nominal_phases)
|
|
92
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
93
|
+
action(it)
|
|
94
|
+
self._current = it
|
|
95
|
+
return self
|
|
96
|
+
|
|
97
|
+
def from_acls(
|
|
98
|
+
self,
|
|
99
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
100
|
+
mrid: Optional[str] = None,
|
|
101
|
+
action: Callable[[AcLineSegment], None] = null_action
|
|
102
|
+
) -> 'TestNetworkBuilder':
|
|
103
|
+
"""
|
|
104
|
+
Start a new network island from an `AcLineSegment`, updating the network pointer to the new `AcLineSegment`.
|
|
105
|
+
|
|
106
|
+
:param nominal_phases: The nominal phases for the new `AcLineSegment`.
|
|
107
|
+
:param mrid: Optional mRID for the new `AcLineSegment`.
|
|
108
|
+
:param action: An action that accepts the new `AcLineSegment` to allow for additional initialisation.
|
|
109
|
+
|
|
110
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
111
|
+
"""
|
|
112
|
+
it = self._create_acls(mrid, nominal_phases)
|
|
113
|
+
action(it)
|
|
114
|
+
self._current = it
|
|
115
|
+
return self
|
|
116
|
+
|
|
117
|
+
def to_acls(
|
|
118
|
+
self,
|
|
119
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
120
|
+
mrid: Optional[str] = None,
|
|
121
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
122
|
+
action: Callable[[AcLineSegment], None] = null_action
|
|
123
|
+
) -> 'TestNetworkBuilder':
|
|
124
|
+
"""
|
|
125
|
+
Add a new `AcLineSegment` to the network and connect it to the current network pointer, updating the network pointer to the new `AcLineSegment`.
|
|
126
|
+
|
|
127
|
+
:param nominal_phases: The nominal phases for the new `AcLineSegment`.
|
|
128
|
+
:param mrid: Optional mRID for the new `AcLineSegment`.
|
|
129
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `AcLineSegment` to the previous item. Will only be used if the
|
|
130
|
+
previous item is not already connected.
|
|
131
|
+
:param action: An action that accepts the new `AcLineSegment` to allow for additional initialisation.
|
|
132
|
+
|
|
133
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
134
|
+
"""
|
|
135
|
+
acls = self._create_acls(mrid, nominal_phases)
|
|
136
|
+
self._connect(self._current, acls, connectivity_node_mrid)
|
|
137
|
+
action(acls)
|
|
138
|
+
self._current = acls
|
|
139
|
+
return self
|
|
140
|
+
|
|
141
|
+
def from_breaker(
|
|
142
|
+
self,
|
|
143
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
144
|
+
is_normally_open: bool = False,
|
|
145
|
+
is_open: Optional[bool] = None,
|
|
146
|
+
mrid: Optional[str] = None,
|
|
147
|
+
action: Callable[[Breaker], None] = null_action
|
|
148
|
+
) -> 'TestNetworkBuilder':
|
|
149
|
+
"""
|
|
150
|
+
Start a new network island from a `Breaker`, updating the network pointer to the new `Breaker`.
|
|
151
|
+
|
|
152
|
+
:param nominal_phases: The nominal phases for the new `Breaker`.
|
|
153
|
+
:param is_normally_open: The normal state of the switch. Defaults to False.
|
|
154
|
+
:param is_open: The current state of the switch. Defaults to `is_normally_open`.
|
|
155
|
+
:param mrid: Optional mRID for the new `Breaker`.
|
|
156
|
+
:param action: An action that accepts the new `Breaker` to allow for additional initialisation.
|
|
157
|
+
|
|
158
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
159
|
+
"""
|
|
160
|
+
it = self._create_breaker(mrid, nominal_phases, is_normally_open=is_normally_open, is_open=is_open if is_open is not None else is_normally_open)
|
|
161
|
+
action(it)
|
|
162
|
+
self._current = it
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
def to_breaker(
|
|
166
|
+
self,
|
|
167
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
168
|
+
is_normally_open: bool = False,
|
|
169
|
+
is_open: Optional[bool] = None,
|
|
170
|
+
mrid: Optional[str] = None,
|
|
171
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
172
|
+
action: Callable[[Breaker], None] = null_action
|
|
173
|
+
) -> 'TestNetworkBuilder':
|
|
174
|
+
"""
|
|
175
|
+
Add a new `Breaker` to the network and connect it to the current network pointer, updating the network pointer to the new `Breaker`.
|
|
176
|
+
|
|
177
|
+
:param nominal_phases: The nominal phases for the new `Breaker`.
|
|
178
|
+
:param is_normally_open: The normal state of the switch. Defaults to False.
|
|
179
|
+
:param is_open: The current state of the switch. Defaults to `is_normally_open`.
|
|
180
|
+
:param mrid: Optional mRID for the new `Breaker`.
|
|
181
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `Breaker` to the previous item. Will only be used if the
|
|
182
|
+
previous item is not already connected.
|
|
183
|
+
:param action: An action that accepts the new `Breaker` to allow for additional initialisation.
|
|
184
|
+
|
|
185
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
186
|
+
"""
|
|
187
|
+
it = self._create_breaker(mrid, nominal_phases, is_normally_open=is_normally_open, is_open=is_open if is_open is not None else is_normally_open)
|
|
188
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
189
|
+
action(it)
|
|
190
|
+
self._current = it
|
|
191
|
+
return self
|
|
192
|
+
|
|
193
|
+
def from_junction(
|
|
194
|
+
self,
|
|
195
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
196
|
+
num_terminals: Optional[int] = None,
|
|
197
|
+
mrid: Optional[str] = None,
|
|
198
|
+
action: Callable[[Junction], None] = null_action
|
|
199
|
+
) -> 'TestNetworkBuilder':
|
|
200
|
+
"""
|
|
201
|
+
Start a new network island from a `Junction`, updating the network pointer to the new `Junction`.
|
|
202
|
+
|
|
203
|
+
:param nominal_phases: The nominal phases for the new `Junction`.
|
|
204
|
+
:param num_terminals: The number of terminals to create on the new `Junction`. Defaults to 2.
|
|
205
|
+
:param mrid: Optional mRID for the new `Junction`.
|
|
206
|
+
:param action: An action that accepts the new `Junction` to allow for additional initialisation.
|
|
207
|
+
|
|
208
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
209
|
+
"""
|
|
210
|
+
it = self._create_junction(mrid, nominal_phases, num_terminals)
|
|
211
|
+
action(it)
|
|
212
|
+
self._current = it
|
|
213
|
+
return self
|
|
214
|
+
|
|
215
|
+
def to_junction(
|
|
216
|
+
self,
|
|
217
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
218
|
+
num_terminals: Optional[int] = None,
|
|
219
|
+
mrid: Optional[str] = None,
|
|
220
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
221
|
+
action: Callable[[Junction], None] = null_action
|
|
222
|
+
) -> 'TestNetworkBuilder':
|
|
223
|
+
"""
|
|
224
|
+
Add a new `Junction` to the network and connect it to the current network pointer, updating the network pointer to the new `Junction`.
|
|
225
|
+
|
|
226
|
+
:param nominal_phases: The nominal phases for the new `Junction`.
|
|
227
|
+
:param num_terminals: The number of terminals to create on the new `Junction`. Defaults to 2.
|
|
228
|
+
:param mrid: Optional mRID for the new `Junction`.
|
|
229
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `Junction` to the previous item. Will only be used if the
|
|
230
|
+
previous item is not already connected.
|
|
231
|
+
:param action: An action that accepts the new `Junction` to allow for additional initialisation.
|
|
232
|
+
|
|
233
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
234
|
+
"""
|
|
235
|
+
it = self._create_junction(mrid, nominal_phases, num_terminals)
|
|
236
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
237
|
+
action(it)
|
|
238
|
+
self._current = it
|
|
239
|
+
return self
|
|
240
|
+
|
|
241
|
+
def to_power_electronics_connection(
|
|
242
|
+
self,
|
|
243
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
244
|
+
num_terminals: Optional[int] = None,
|
|
245
|
+
mrid: Optional[str] = None,
|
|
246
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
247
|
+
action: Callable[[PowerElectronicsConnection], None] = null_action
|
|
248
|
+
) -> 'TestNetworkBuilder':
|
|
249
|
+
"""
|
|
250
|
+
Add a new `PowerElectronicsConnection` to the network and connect it to the current network pointer, updating the network pointer to the new
|
|
251
|
+
`PowerElectronicsConnection`.
|
|
252
|
+
|
|
253
|
+
:param nominal_phases: The nominal phases for the new `PowerElectronicsConnection`.
|
|
254
|
+
:param num_terminals: The number of terminals to create on the new `PowerElectronicsConnection`. Defaults to 2.
|
|
255
|
+
:param mrid: Optional mRID for the new `PowerElectronicsConnection`.
|
|
256
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `PowerElectronicsConnection` to the previous item. Will only be
|
|
257
|
+
used if the previous item is not already connected.
|
|
258
|
+
:param action: An action that accepts the new `PowerElectronicsConnection` to allow for additional initialisation.
|
|
259
|
+
|
|
260
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
261
|
+
"""
|
|
262
|
+
it = self._create_power_electronics_connection(mrid, nominal_phases, num_terminals)
|
|
263
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
264
|
+
action(it)
|
|
265
|
+
self._current = it
|
|
266
|
+
return self
|
|
267
|
+
|
|
268
|
+
def from_power_transformer(
|
|
269
|
+
self,
|
|
270
|
+
nominal_phases: Optional[List[PhaseCode]] = None,
|
|
271
|
+
end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
|
|
272
|
+
mrid: Optional[str] = None,
|
|
273
|
+
action: Callable[[PowerTransformer], None] = null_action
|
|
274
|
+
) -> 'TestNetworkBuilder':
|
|
275
|
+
"""
|
|
276
|
+
Start a new network island from a `PowerTransformer`, updating the network pointer to the new `PowerTransformer`.
|
|
277
|
+
|
|
278
|
+
:param nominal_phases: The nominal phases for each end of the new `PowerTransformer`. Defaults to two `PhaseCode.ABC` ends.
|
|
279
|
+
:param end_actions: Actions that accepts the new `PowerTransformerEnd` to allow for additional initialisation.
|
|
280
|
+
:param action: An action that accepts the new `PowerTransformer` to allow for additional initialisation.
|
|
281
|
+
:param mrid: Optional mRID for the new `PowerTransformer`.
|
|
282
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
283
|
+
"""
|
|
284
|
+
it = self._create_power_transformer(mrid, nominal_phases or [PhaseCode.ABC, PhaseCode.ABC])
|
|
285
|
+
if end_actions:
|
|
286
|
+
for i in range(0, it.num_ends()):
|
|
287
|
+
end_actions[i](it.get_end_by_num(i + 1))
|
|
288
|
+
|
|
289
|
+
action(it)
|
|
290
|
+
self._current = it
|
|
291
|
+
return self
|
|
292
|
+
|
|
293
|
+
def to_power_transformer(
|
|
294
|
+
self,
|
|
295
|
+
nominal_phases: Optional[List[PhaseCode]] = None,
|
|
296
|
+
end_actions: Optional[List[Callable[[PowerTransformerEnd], None]]] = None,
|
|
297
|
+
mrid: Optional[str] = None,
|
|
298
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
299
|
+
action: Callable[[PowerTransformer], None] = null_action
|
|
300
|
+
) -> 'TestNetworkBuilder':
|
|
301
|
+
"""
|
|
302
|
+
Add a new `PowerTransformer` to the network and connect it to the current network pointer, updating the network pointer to the new `PowerTransformer`.
|
|
303
|
+
|
|
304
|
+
:param nominal_phases: The nominal phases for each end of the new `PowerTransformer`. Defaults to two `PhaseCode.ABC` ends.
|
|
305
|
+
:param end_actions: Actions that accepts the new `PowerTransformerEnd` to allow for additional initialisation.
|
|
306
|
+
:param action: An action that accepts the new `PowerTransformer` to allow for additional initialisation.
|
|
307
|
+
:param mrid: Optional mRID for the new `PowerTransformer`.
|
|
308
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `PowerTransformer` to the previous item. Will only be used if
|
|
309
|
+
the previous item is not already connected.
|
|
310
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
311
|
+
"""
|
|
312
|
+
it = self._create_power_transformer(mrid, nominal_phases or [PhaseCode.ABC, PhaseCode.ABC])
|
|
313
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
314
|
+
|
|
315
|
+
if end_actions:
|
|
316
|
+
for i in range(0, it.num_ends()):
|
|
317
|
+
end_actions[i](it.get_end_by_num(i + 1))
|
|
318
|
+
|
|
319
|
+
action(it)
|
|
320
|
+
self._current = it
|
|
321
|
+
return self
|
|
322
|
+
|
|
323
|
+
def to_energy_consumer(
|
|
324
|
+
self,
|
|
325
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
326
|
+
mrid: Optional[str] = None,
|
|
327
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
328
|
+
action: Callable[[EnergyConsumer], None] = null_action
|
|
329
|
+
) -> 'TestNetworkBuilder':
|
|
330
|
+
"""
|
|
331
|
+
Add a new `EnergyConsumer` to the network and connect it to the current network pointer, updating the network pointer to the new
|
|
332
|
+
`EnergyConsumer`.
|
|
333
|
+
|
|
334
|
+
:param nominal_phases: The nominal phases for the new `EnergyConsumer`.
|
|
335
|
+
:param mrid: Optional mRID for the new `EnergyConsumer`.
|
|
336
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `EnergyConsumer` to the previous item. Will only be used if the
|
|
337
|
+
previous item is not already connected.
|
|
338
|
+
:param action: An action that accepts the new `EnergyConsumer` to allow for additional initialisation.
|
|
339
|
+
|
|
340
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
341
|
+
"""
|
|
342
|
+
it = self._create_energy_consumer(mrid, nominal_phases)
|
|
343
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
344
|
+
action(it)
|
|
345
|
+
self._current = it
|
|
346
|
+
return self
|
|
347
|
+
|
|
348
|
+
def from_busbar_section(
|
|
349
|
+
self,
|
|
350
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
351
|
+
mrid: str = None,
|
|
352
|
+
action: Callable[[BusbarSection], None] = null_action
|
|
353
|
+
) -> 'TestNetworkBuilder':
|
|
354
|
+
"""
|
|
355
|
+
Start a new network island from a `BusbarSection`, updating the network pointer to the new `BusbarSection`.
|
|
356
|
+
|
|
357
|
+
:param nominal_phases: The nominal phases for the new `BusbarSection`.
|
|
358
|
+
:param mrid: Optional mRID for the new `BusbarSection`.
|
|
359
|
+
:param action: An action that accepts the new `BusbarSection` to allow for additional initialisation.
|
|
360
|
+
|
|
361
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
362
|
+
"""
|
|
363
|
+
it = self._create_busbar_section(mrid, nominal_phases)
|
|
364
|
+
action(it)
|
|
365
|
+
self._current = it
|
|
366
|
+
return self
|
|
367
|
+
|
|
368
|
+
def to_busbar_section(
|
|
369
|
+
self,
|
|
370
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
371
|
+
mrid: str = None,
|
|
372
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
373
|
+
action: Callable[[BusbarSection], None] = null_action
|
|
374
|
+
) -> 'TestNetworkBuilder':
|
|
375
|
+
"""
|
|
376
|
+
|
|
377
|
+
Add a new `BusbarSection` to the network and connect it to the current network pointer, updating the network pointer to the new `BusbarSection`.
|
|
378
|
+
|
|
379
|
+
:param nominal_phases: The nominal phases for the new `BusbarSection`.
|
|
380
|
+
:param mrid: Optional mRID for the new `BusbarSection`.
|
|
381
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `BusbarSection` to the previous item. Will only be used
|
|
382
|
+
if the previous item is not already connected.
|
|
383
|
+
:param action: An action that accepts the new `BusbarSection` to allow for additional initialisation.
|
|
384
|
+
|
|
385
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
386
|
+
"""
|
|
387
|
+
it = self._create_busbar_section(mrid, nominal_phases)
|
|
388
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
389
|
+
action(it)
|
|
390
|
+
self._current = it
|
|
391
|
+
return self
|
|
392
|
+
|
|
393
|
+
def from_other(
|
|
394
|
+
self,
|
|
395
|
+
creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
|
|
396
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
397
|
+
num_terminals: Optional[int] = None,
|
|
398
|
+
mrid: Optional[str] = None,
|
|
399
|
+
action: Callable[[SubclassesConductingEquipment], None] = null_action,
|
|
400
|
+
default_mrid_prefix: Optional[str] = None
|
|
401
|
+
) -> 'TestNetworkBuilder':
|
|
402
|
+
"""
|
|
403
|
+
Start a new network island from a `ConductingEquipment` created by `creator`, updating the network pointer to the new `ConductingEquipment`.
|
|
404
|
+
|
|
405
|
+
:param creator: A callable function used to create the new `ConductingEquipment`. It will be passed the generated mRID for the new
|
|
406
|
+
`ConductingEquipment`.
|
|
407
|
+
:param nominal_phases: The nominal phases for the new `ConductingEquipment`.
|
|
408
|
+
:param num_terminals: The number of terminals to create on the new `ConductingEquipment`. Defaults to 2.
|
|
409
|
+
:param mrid: Optional mRID for the new `ConductingEquipment`.
|
|
410
|
+
:param action: An action that accepts the new `ConductingEquipment` to allow for additional initialisation.
|
|
411
|
+
:param default_mrid_prefix: mRID prefix to use for the new `ConductingEquipment`
|
|
412
|
+
|
|
413
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
414
|
+
"""
|
|
415
|
+
if mrid and default_mrid_prefix:
|
|
416
|
+
raise ValueError('cant specify both mrid and default_mrid_prefix as your intention is unclear')
|
|
417
|
+
it = self._create_other(mrid, creator, nominal_phases, num_terminals, default_mrid_prefix=default_mrid_prefix)
|
|
418
|
+
action(it)
|
|
419
|
+
self._current = it
|
|
420
|
+
return self
|
|
421
|
+
|
|
422
|
+
def to_other(
|
|
423
|
+
self,
|
|
424
|
+
creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
|
|
425
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
426
|
+
num_terminals: Optional[int] = None,
|
|
427
|
+
mrid: Optional[str] = None,
|
|
428
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
429
|
+
action: Callable[[SubclassesConductingEquipment], None] = null_action,
|
|
430
|
+
default_mrid_prefix: Optional[str] = None
|
|
431
|
+
) -> 'TestNetworkBuilder':
|
|
432
|
+
"""
|
|
433
|
+
Add a new `ConductingEquipment` to the network and connect it to the current network pointer, updating the network pointer to the new
|
|
434
|
+
`ConductingEquipment`.
|
|
435
|
+
|
|
436
|
+
:param creator: A callable function used to create the new `ConductingEquipment`. It will be passed the generated mRID for the new
|
|
437
|
+
`ConductingEquipment`.
|
|
438
|
+
:param nominal_phases: The nominal phases for the new `ConductingEquipment`.
|
|
439
|
+
:param num_terminals: The number of terminals to create on the new `ConductingEquipment`. Defaults to 2.
|
|
440
|
+
:param mrid: Optional mRID for the new `ConductingEquipment`.
|
|
441
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect this `ConductingEquipment` to the previous item. Will only be used
|
|
442
|
+
if the previous item is not already connected.
|
|
443
|
+
:param action: An action that accepts the new `ConductingEquipment` to allow for additional initialisation.
|
|
444
|
+
:param default_mrid_prefix: mRID prefix to use for the new `ConductingEquipment`
|
|
445
|
+
|
|
446
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
447
|
+
"""
|
|
448
|
+
if mrid and default_mrid_prefix:
|
|
449
|
+
raise ValueError('cant specify both mrid and default_mrid_prefix as your intention is unclear')
|
|
450
|
+
it = self._create_other(mrid, creator, nominal_phases, num_terminals, default_mrid_prefix=default_mrid_prefix)
|
|
451
|
+
self._connect(self._current, it, connectivity_node_mrid)
|
|
452
|
+
action(it)
|
|
453
|
+
self._current = it
|
|
454
|
+
return self
|
|
455
|
+
|
|
456
|
+
def with_clamp(
|
|
457
|
+
self,
|
|
458
|
+
mrid: Optional[str] = None,
|
|
459
|
+
length_from_terminal_1: float = None,
|
|
460
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
461
|
+
action: Callable[[Clamp], None] = null_action
|
|
462
|
+
) -> 'TestNetworkBuilder':
|
|
463
|
+
"""
|
|
464
|
+
Create a clamp on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
|
|
465
|
+
|
|
466
|
+
:param mrid: Optional mRID for the new `Clamp`
|
|
467
|
+
:param length_from_terminal_1: The length from terminal 1 of the `AcLineSegment` being clamped
|
|
468
|
+
:param nominal_phases: The nominal phases for the new `BusbarSection`.
|
|
469
|
+
:param action: An action that accepts the new `Clamp` to allow for additional initialisation.
|
|
470
|
+
|
|
471
|
+
:return: This `TestNetworkBuilder` to allow for fluent use
|
|
472
|
+
"""
|
|
473
|
+
acls = self._current
|
|
474
|
+
if not isinstance(acls, AcLineSegment):
|
|
475
|
+
raise ValueError("`with_clamp` can only be called when the last added item was an AcLineSegment")
|
|
476
|
+
|
|
477
|
+
clamp = Clamp(mrid=mrid or f'{acls.mrid}-clamp{acls.num_clamps() + 1}', length_from_terminal_1=length_from_terminal_1)
|
|
478
|
+
self._add_terminal(clamp, 1, nominal_phases)
|
|
479
|
+
|
|
480
|
+
acls.add_clamp(clamp)
|
|
481
|
+
action(clamp)
|
|
482
|
+
self.network.add(clamp)
|
|
483
|
+
return self
|
|
484
|
+
|
|
485
|
+
def with_cut(
|
|
486
|
+
self,
|
|
487
|
+
mrid: Optional[str] = None,
|
|
488
|
+
length_from_terminal_1: Optional[float] = None,
|
|
489
|
+
is_normally_open: bool = True,
|
|
490
|
+
is_open: bool = None,
|
|
491
|
+
nominal_phases: PhaseCode = PhaseCode.ABC,
|
|
492
|
+
action: Callable[[Cut], None] = null_action
|
|
493
|
+
) -> 'TestNetworkBuilder':
|
|
494
|
+
"""
|
|
495
|
+
Create a cut on the current network pointer (must be an `AcLineSegment`) without moving the current network pointer.
|
|
496
|
+
|
|
497
|
+
:param mrid: Optional mRID for the new `Cut`
|
|
498
|
+
:param length_from_terminal_1: The length from terminal 1 of the `AcLineSegment` being cut
|
|
499
|
+
:param is_normally_open: The normal state of the cut, defaults to True
|
|
500
|
+
:param is_open: The current state of the cut. Defaults to `is_normally_open`
|
|
501
|
+
:param nominal_phases: The nominal phases for the new `BusbarSection`.
|
|
502
|
+
:param action: An action that accepts the new `Cut` to allow for additional initialisation.
|
|
503
|
+
|
|
504
|
+
:return: This `TestNetworkBuilder` to allow for fluent use
|
|
505
|
+
"""
|
|
506
|
+
acls = self._current
|
|
507
|
+
if not isinstance(acls, AcLineSegment):
|
|
508
|
+
raise ValueError("`with_cut` can only be called when the last added item was an AcLineSegment")
|
|
509
|
+
|
|
510
|
+
cut = Cut(mrid=mrid or f'{acls.mrid}-cut{acls.num_cuts() + 1}', length_from_terminal_1=length_from_terminal_1)
|
|
511
|
+
for i in [1, 2]:
|
|
512
|
+
self._add_terminal(cut, i, nominal_phases)
|
|
513
|
+
|
|
514
|
+
cut.set_normally_open(is_normally_open)
|
|
515
|
+
if is_open is None:
|
|
516
|
+
cut.set_open(is_normally_open)
|
|
517
|
+
else:
|
|
518
|
+
cut.set_open(is_open)
|
|
519
|
+
|
|
520
|
+
acls.add_cut(cut)
|
|
521
|
+
action(cut)
|
|
522
|
+
self.network.add(cut)
|
|
523
|
+
return self
|
|
524
|
+
|
|
525
|
+
def branch_from(self, from_: str, terminal: Optional[int] = None) -> 'TestNetworkBuilder':
|
|
526
|
+
"""
|
|
527
|
+
Move the current network pointer to the specified `from` allowing branching of the network. This has the effect of changing the current network pointer.
|
|
528
|
+
|
|
529
|
+
:param from_: The mRID of the `ConductingEquipment` to split from.
|
|
530
|
+
:param terminal: The terminal to split from. Defaults to last terminal.
|
|
531
|
+
|
|
532
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
533
|
+
"""
|
|
534
|
+
self._current = self.network.get(from_, ConductingEquipment)
|
|
535
|
+
self._current_terminal = terminal
|
|
536
|
+
return self
|
|
537
|
+
|
|
538
|
+
def connect_to(
|
|
539
|
+
self,
|
|
540
|
+
to: str,
|
|
541
|
+
to_terminal: int = None,
|
|
542
|
+
from_terminal: int = None,
|
|
543
|
+
connectivity_node_mrid: Optional[str] = None
|
|
544
|
+
) -> 'TestNetworkBuilder':
|
|
545
|
+
"""
|
|
546
|
+
Connect to current network pointer to the specified `to` without moving the current network pointer.
|
|
547
|
+
|
|
548
|
+
:param to: The mRID of the second `ConductingEquipment` to be connected.
|
|
549
|
+
:param to_terminal: The sequence number or terminal on `to` which will be connected.
|
|
550
|
+
:param from_terminal: Optional sequence number of the terminal on current network pointer which will be connected.
|
|
551
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect the terminals. Will only be used if both terminals are not already
|
|
552
|
+
connected.
|
|
553
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
554
|
+
"""
|
|
555
|
+
|
|
556
|
+
self._connect(
|
|
557
|
+
self._current,
|
|
558
|
+
self.network.get(to, ConductingEquipment),
|
|
559
|
+
connectivity_node_mrid,
|
|
560
|
+
from_terminal,
|
|
561
|
+
to_terminal
|
|
562
|
+
)
|
|
563
|
+
return self
|
|
564
|
+
|
|
565
|
+
def connect(
|
|
566
|
+
self,
|
|
567
|
+
from_: str,
|
|
568
|
+
to: str,
|
|
569
|
+
from_terminal: int,
|
|
570
|
+
to_terminal: int,
|
|
571
|
+
connectivity_node_mrid: Optional[str] = None
|
|
572
|
+
) -> 'TestNetworkBuilder':
|
|
573
|
+
"""
|
|
574
|
+
Connect the specified `from` and `to` without moving the current network pointer.
|
|
575
|
+
|
|
576
|
+
:param from_: The mRID of the first `ConductingEquipment` to be connected.
|
|
577
|
+
:param to: The mRID of the second `ConductingEquipment` to be connected.
|
|
578
|
+
:param from_terminal: The sequence number of the terminal on `from` which will be connected.
|
|
579
|
+
:param to_terminal: The sequence number of the terminal on `to` which will be connected.
|
|
580
|
+
:param connectivity_node_mrid: Optional id of the connectivity node used to connect the terminals. Will only be used if both terminals are not already
|
|
581
|
+
connected.
|
|
582
|
+
|
|
583
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
584
|
+
"""
|
|
585
|
+
self._connect(
|
|
586
|
+
self.network.get(from_, ConductingEquipment),
|
|
587
|
+
self.network.get(to, ConductingEquipment),
|
|
588
|
+
connectivity_node_mrid,
|
|
589
|
+
from_terminal,
|
|
590
|
+
to_terminal
|
|
591
|
+
)
|
|
592
|
+
return self
|
|
593
|
+
|
|
594
|
+
def add_feeder(self, head_mrid: str, sequence_number: Optional[int] = None, mrid: Optional[str] = None) -> 'TestNetworkBuilder':
|
|
595
|
+
"""
|
|
596
|
+
Create a new feeder with the specified terminal as the head terminal.
|
|
597
|
+
|
|
598
|
+
:param head_mrid: The mRID of the head `ConductingEquipment`.
|
|
599
|
+
:param sequence_number: The `Terminal` sequence number of the head terminal. Defaults to last terminal.
|
|
600
|
+
:param mrid: Optional mRID for the new `Feeder`.
|
|
601
|
+
|
|
602
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
603
|
+
"""
|
|
604
|
+
self._create_feeder(mrid, self.network.get(head_mrid, ConductingEquipment), sequence_number)
|
|
605
|
+
return self
|
|
606
|
+
|
|
607
|
+
def add_lv_feeder(self, head_mrid: str, sequence_number: Optional[int] = None, mrid: Optional[str] = None) -> 'TestNetworkBuilder':
|
|
608
|
+
"""
|
|
609
|
+
Create a new LV feeder with the specified terminal as the head terminal.
|
|
610
|
+
|
|
611
|
+
:param head_mrid: The mRID of the head `ConductingEquipment`.
|
|
612
|
+
:param sequence_number: The `Terminal` sequence number of the head terminal. Defaults to last terminal.
|
|
613
|
+
:param mrid: Optional mRID for the new `LvFeeder`.
|
|
614
|
+
|
|
615
|
+
:return: This `TestNetworkBuilder` to allow for fluent use.
|
|
616
|
+
"""
|
|
617
|
+
self._create_lv_feeder(mrid, self.network.get(head_mrid, ConductingEquipment), sequence_number)
|
|
618
|
+
return self
|
|
619
|
+
|
|
620
|
+
def add_site(self, equipment_mrids: List[str], mrid: Optional[str] = None) -> 'TestNetworkBuilder':
|
|
621
|
+
"""
|
|
622
|
+
Create a new Site containing the specified equipment.
|
|
623
|
+
|
|
624
|
+
:param equipment_mrids: The mRID's of the equipment to add to the site
|
|
625
|
+
:param mrid: Optional mRID for the new `Site`.
|
|
626
|
+
:return: This [TestNetworkBuilder] to allow for fluent use.
|
|
627
|
+
"""
|
|
628
|
+
|
|
629
|
+
site = Site(mrid=self._next_id(mrid, 'site'))
|
|
630
|
+
|
|
631
|
+
for _id in equipment_mrids:
|
|
632
|
+
ce = self.network[_id]
|
|
633
|
+
site.add_equipment(ce)
|
|
634
|
+
ce.add_container(site)
|
|
635
|
+
self.network.add(site)
|
|
636
|
+
|
|
637
|
+
return self
|
|
638
|
+
|
|
639
|
+
async def build(self, apply_directions_from_sources: bool = True, debug_logger: Logger = None) -> NetworkService:
|
|
640
|
+
"""
|
|
641
|
+
Get the `NetworkService` after apply traced phasing and feeder directions.
|
|
642
|
+
|
|
643
|
+
Does not infer phasing.
|
|
644
|
+
|
|
645
|
+
:return: The `NetworkService` created by this `TestNetworkBuilder`
|
|
646
|
+
"""
|
|
647
|
+
await Tracing.set_direction(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
|
|
648
|
+
await Tracing.set_direction(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
|
|
649
|
+
await Tracing.set_phases(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
|
|
650
|
+
await Tracing.set_phases(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
|
|
651
|
+
|
|
652
|
+
if apply_directions_from_sources:
|
|
653
|
+
for es in self.network.objects(EnergySource):
|
|
654
|
+
for terminal in es.terminals:
|
|
655
|
+
await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.NORMAL)
|
|
656
|
+
await Tracing.set_direction(debug_logger=debug_logger).run_terminal(terminal, network_state_operators=NetworkStateOperators.CURRENT)
|
|
657
|
+
|
|
658
|
+
await Tracing.assign_equipment_to_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
|
|
659
|
+
await Tracing.assign_equipment_to_lv_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.NORMAL)
|
|
660
|
+
await Tracing.assign_equipment_to_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
|
|
661
|
+
await Tracing.assign_equipment_to_lv_feeders(debug_logger=debug_logger).run(self.network, network_state_operators=NetworkStateOperators.CURRENT)
|
|
662
|
+
|
|
663
|
+
return self.network
|
|
664
|
+
|
|
665
|
+
def _next_id(self, mrid: Optional[str], type_: str) -> str:
|
|
666
|
+
if mrid:
|
|
667
|
+
return mrid
|
|
668
|
+
|
|
669
|
+
id_ = f"{type_}{self._count}"
|
|
670
|
+
self._count += 1
|
|
671
|
+
return id_
|
|
672
|
+
|
|
673
|
+
def _connect(
|
|
674
|
+
self,
|
|
675
|
+
from_: ConductingEquipment,
|
|
676
|
+
to: ConductingEquipment,
|
|
677
|
+
connectivity_node_mrid: Optional[str] = None,
|
|
678
|
+
from_terminal: Optional[int] = None,
|
|
679
|
+
to_terminal: Optional[int] = None
|
|
680
|
+
):
|
|
681
|
+
from_term = from_.get_terminal_by_sn(from_terminal if from_terminal else self._current_terminal if self._current_terminal else from_.num_terminals())
|
|
682
|
+
to_term = to.get_terminal_by_sn(to_terminal if to_terminal else 1)
|
|
683
|
+
if (connectivity_node_mrid is None) or from_term.connected or to_term.connected:
|
|
684
|
+
self.network.connect_terminals(from_term, to_term)
|
|
685
|
+
else:
|
|
686
|
+
self.network.connect_by_mrid(from_term, connectivity_node_mrid)
|
|
687
|
+
self.network.connect_by_mrid(to_term, connectivity_node_mrid)
|
|
688
|
+
self._current_terminal = None
|
|
689
|
+
|
|
690
|
+
def _create_external_source(self, mrid: Optional[str], nominal_phases: PhaseCode) -> EnergySource:
|
|
691
|
+
if any(it not in PhaseCode.ABCN for it in nominal_phases.single_phases):
|
|
692
|
+
raise ValueError("EnergySource phases must be a subset of ABCN")
|
|
693
|
+
|
|
694
|
+
es = EnergySource(mrid=self._next_id(mrid, "s"), is_external_grid=True)
|
|
695
|
+
self._add_terminal(es, 1, nominal_phases)
|
|
696
|
+
|
|
697
|
+
self.network.add(es)
|
|
698
|
+
return es
|
|
699
|
+
|
|
700
|
+
def _create_acls(self, mrid: Optional[str], nominal_phases: PhaseCode) -> AcLineSegment:
|
|
701
|
+
acls = AcLineSegment(mrid=self._next_id(mrid, "c"))
|
|
702
|
+
self._add_terminal(acls, 1, nominal_phases)
|
|
703
|
+
self._add_terminal(acls, 2, nominal_phases)
|
|
704
|
+
|
|
705
|
+
self.network.add(acls)
|
|
706
|
+
return acls
|
|
707
|
+
|
|
708
|
+
def _create_breaker(self, mrid: Optional[str], nominal_phases: PhaseCode, is_normally_open: bool, is_open: bool) -> Breaker:
|
|
709
|
+
b = Breaker(mrid=self._next_id(mrid, "b"))
|
|
710
|
+
b.set_normally_open(is_normally_open)
|
|
711
|
+
b.set_open(is_open)
|
|
712
|
+
|
|
713
|
+
self._add_terminal(b, 1, nominal_phases)
|
|
714
|
+
self._add_terminal(b, 2, nominal_phases)
|
|
715
|
+
|
|
716
|
+
self.network.add(b)
|
|
717
|
+
return b
|
|
718
|
+
|
|
719
|
+
def _create_junction(self, mrid: Optional[str], nominal_phases: PhaseCode, num_terminals: Optional[int]) -> Junction:
|
|
720
|
+
j = Junction(mrid=self._next_id(mrid, "j"))
|
|
721
|
+
for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
|
|
722
|
+
self._add_terminal(j, i, nominal_phases)
|
|
723
|
+
|
|
724
|
+
self.network.add(j)
|
|
725
|
+
return j
|
|
726
|
+
|
|
727
|
+
def _create_busbar_section(self, mrid: Optional[str], nominal_phases: PhaseCode) -> BusbarSection:
|
|
728
|
+
b = BusbarSection(mrid=self._next_id(mrid, 'bbs'))
|
|
729
|
+
self._add_terminal(b, 1, nominal_phases)
|
|
730
|
+
|
|
731
|
+
self.network.add(b)
|
|
732
|
+
return b
|
|
733
|
+
|
|
734
|
+
def _create_power_electronics_connection(self, mrid: Optional[str], nominal_phases: PhaseCode, num_terminals: Optional[int]) -> PowerElectronicsConnection:
|
|
735
|
+
pec = PowerElectronicsConnection(mrid=self._next_id(mrid, "pec"))
|
|
736
|
+
for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
|
|
737
|
+
self._add_terminal(pec, i, nominal_phases)
|
|
738
|
+
|
|
739
|
+
self.network.add(pec)
|
|
740
|
+
return pec
|
|
741
|
+
|
|
742
|
+
def _create_power_transformer(self, mrid: Optional[str], nominal_phases: List[PhaseCode]):
|
|
743
|
+
tx = PowerTransformer(mrid=self._next_id(mrid, "tx"))
|
|
744
|
+
|
|
745
|
+
i = 1
|
|
746
|
+
for phase_code in nominal_phases:
|
|
747
|
+
t = Terminal(mrid=f"{tx.mrid}-t{i}")
|
|
748
|
+
t.phases = phase_code
|
|
749
|
+
self.network.add(t)
|
|
750
|
+
|
|
751
|
+
tx.add_terminal(t)
|
|
752
|
+
|
|
753
|
+
end = PowerTransformerEnd(mrid=f"{tx.mrid}-e{i}")
|
|
754
|
+
end.terminal = t
|
|
755
|
+
self.network.add(end)
|
|
756
|
+
tx.add_end(end)
|
|
757
|
+
|
|
758
|
+
i += 1
|
|
759
|
+
|
|
760
|
+
self.network.add(tx)
|
|
761
|
+
return tx
|
|
762
|
+
|
|
763
|
+
def _create_energy_consumer(self, mrid: Optional[str], nominal_phases: PhaseCode) -> EnergyConsumer:
|
|
764
|
+
ec = EnergyConsumer(mrid=self._next_id(mrid, "ec"))
|
|
765
|
+
self._add_terminal(ec, 1, nominal_phases)
|
|
766
|
+
|
|
767
|
+
self.network.add(ec)
|
|
768
|
+
return ec
|
|
769
|
+
|
|
770
|
+
def _create_other(
|
|
771
|
+
self,
|
|
772
|
+
mrid: Optional[str],
|
|
773
|
+
creator: Union[OtherCreator, Type[SubclassesConductingEquipment]],
|
|
774
|
+
nominal_phases: PhaseCode,
|
|
775
|
+
num_terminals: Optional[int],
|
|
776
|
+
default_mrid_prefix: Optional[str] = None
|
|
777
|
+
) -> SubclassesConductingEquipment:
|
|
778
|
+
o = creator(mrid=self._next_id(mrid, default_mrid_prefix or "o"))
|
|
779
|
+
for i in range(1, (num_terminals if num_terminals is not None else 2) + 1):
|
|
780
|
+
self._add_terminal(o, i, nominal_phases)
|
|
781
|
+
|
|
782
|
+
self.network.add(o)
|
|
783
|
+
return o
|
|
784
|
+
|
|
785
|
+
def _create_feeder(self, mrid: Optional[str], head_equipment: ConductingEquipment, sequence_number: Optional[int] = None) -> Feeder:
|
|
786
|
+
f = Feeder(
|
|
787
|
+
mrid=self._next_id(mrid, "fdr"),
|
|
788
|
+
normal_head_terminal=head_equipment.get_terminal_by_sn(sequence_number if sequence_number else head_equipment.num_terminals())
|
|
789
|
+
)
|
|
790
|
+
|
|
791
|
+
f.add_equipment(head_equipment)
|
|
792
|
+
f.add_current_equipment(head_equipment)
|
|
793
|
+
head_equipment.add_container(f)
|
|
794
|
+
head_equipment.add_current_container(f)
|
|
795
|
+
|
|
796
|
+
self.network.add(f)
|
|
797
|
+
return f
|
|
798
|
+
|
|
799
|
+
def _create_lv_feeder(self, mrid: Optional[str], head_equipment: ConductingEquipment, sequence_number: Optional[int] = None) -> LvFeeder:
|
|
800
|
+
lvf = LvFeeder(
|
|
801
|
+
mrid=self._next_id(mrid, "lvf"),
|
|
802
|
+
normal_head_terminal=head_equipment.get_terminal_by_sn(sequence_number if sequence_number else head_equipment.num_terminals())
|
|
803
|
+
)
|
|
804
|
+
|
|
805
|
+
lvf.add_equipment(head_equipment)
|
|
806
|
+
lvf.add_current_equipment(head_equipment)
|
|
807
|
+
head_equipment.add_container(lvf)
|
|
808
|
+
head_equipment.add_current_container(lvf)
|
|
809
|
+
|
|
810
|
+
self.network.add(lvf)
|
|
811
|
+
return lvf
|
|
812
|
+
|
|
813
|
+
def _add_terminal(self, ce: ConductingEquipment, sn: int, nominal_phases: PhaseCode):
|
|
814
|
+
terminal = Terminal(mrid=f"{ce.mrid}-t{sn}", phases=nominal_phases)
|
|
815
|
+
ce.add_terminal(terminal)
|
|
816
|
+
self.network.add(terminal)
|