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.
- 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/sql/__init__.py +4 -0
- zepben/ewb/database/sql/column.py +37 -0
- zepben/ewb/database/sql/sql_table.py +142 -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 +175 -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/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 +45 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +39 -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 +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +112 -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 +83 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +57 -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 +293 -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 +57 -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 +46 -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 +69 -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 +69 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +45 -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 +27 -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 +152 -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 +48 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +28 -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 +30 -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 +125 -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 +239 -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 +202 -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 +28 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +29 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +494 -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 +39 -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 +18 -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 +40 -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 +48 -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 +107 -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 +30 -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 +46 -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 +45 -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 +115 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +146 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +75 -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 +36 -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 +104 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +35 -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 +433 -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 +128 -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 +1867 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2201 -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 +36 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +36 -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 +190 -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 +200 -0
- zepben_ewb-1.0.0.dist-info/METADATA +90 -0
- zepben_ewb-1.0.0.dist-info/RECORD +641 -0
- zepben_ewb-1.0.0.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["AssignToLvFeeders"]
|
|
9
|
+
|
|
10
|
+
from functools import singledispatchmethod
|
|
11
|
+
from typing import Collection, List, Generator, TypeVar, Dict, Set, Type, TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from zepben.ewb import Switch, ProtectedSwitch, PowerElectronicsConnection, Terminal, ConductingEquipment, AuxiliaryEquipment, LvFeeder
|
|
14
|
+
from zepben.ewb.services.network.network_service import NetworkService
|
|
15
|
+
from zepben.ewb.services.network.tracing.feeder.assign_to_feeders import BaseFeedersInternal
|
|
16
|
+
from zepben.ewb.services.network.tracing.networktrace.conditions.conditions import stop_at_open
|
|
17
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace import NetworkTrace
|
|
18
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace_action_type import NetworkTraceActionType
|
|
19
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace_step import NetworkTraceStep
|
|
20
|
+
from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
|
|
21
|
+
from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing
|
|
22
|
+
from zepben.ewb.services.network.tracing.traversal.step_context import StepContext
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from logging import Logger
|
|
26
|
+
|
|
27
|
+
T = TypeVar("T")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AssignToLvFeeders:
|
|
31
|
+
"""
|
|
32
|
+
Convenience class that provides methods for assigning LV feeders on a `NetworkService`.
|
|
33
|
+
Requires that a Feeder have a normalHeadTerminal with associated ConductingEquipment.
|
|
34
|
+
This class is backed by a `BasicTraversal`.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self, debug_logger: Logger = None):
|
|
38
|
+
self._debug_logger = debug_logger
|
|
39
|
+
|
|
40
|
+
@singledispatchmethod
|
|
41
|
+
async def run(
|
|
42
|
+
self,
|
|
43
|
+
network: NetworkService,
|
|
44
|
+
network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL,
|
|
45
|
+
start_terminal: Terminal = None
|
|
46
|
+
):
|
|
47
|
+
"""
|
|
48
|
+
Assign equipment to each feeder in the specified network.
|
|
49
|
+
|
|
50
|
+
:param network: The network containing the feeders to process.
|
|
51
|
+
:param network_state_operators: `NetworkStateOperators` to use for stateful operations.
|
|
52
|
+
:param start_terminal: get the lv feeders for this `Terminal`s `ConductingEquipment`.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
await AssignToLvFeedersInternal(
|
|
56
|
+
network_state_operators,
|
|
57
|
+
self._debug_logger
|
|
58
|
+
).run(network, start_terminal)
|
|
59
|
+
|
|
60
|
+
@run.register
|
|
61
|
+
async def _(
|
|
62
|
+
self,
|
|
63
|
+
terminal: Terminal,
|
|
64
|
+
lv_feeder_start_points: Set[ConductingEquipment],
|
|
65
|
+
terminal_to_aux_equipment: Dict[Terminal, List[AuxiliaryEquipment]],
|
|
66
|
+
lv_feeders_to_assign: List[LvFeeder],
|
|
67
|
+
network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL
|
|
68
|
+
):
|
|
69
|
+
await AssignToLvFeedersInternal(
|
|
70
|
+
network_state_operators,
|
|
71
|
+
self._debug_logger
|
|
72
|
+
).run_with_feeders(
|
|
73
|
+
terminal,
|
|
74
|
+
lv_feeder_start_points,
|
|
75
|
+
terminal_to_aux_equipment,
|
|
76
|
+
lv_feeders_to_assign
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class AssignToLvFeedersInternal(BaseFeedersInternal):
|
|
81
|
+
|
|
82
|
+
async def run(
|
|
83
|
+
self,
|
|
84
|
+
network: NetworkService,
|
|
85
|
+
start_terminal: Terminal = None
|
|
86
|
+
):
|
|
87
|
+
lv_feeder_start_points = network.lv_feeder_start_points
|
|
88
|
+
terminal_to_aux_equipment = network.aux_equipment_by_terminal
|
|
89
|
+
|
|
90
|
+
if start_terminal is None:
|
|
91
|
+
for lv_feeder in network.objects(LvFeeder):
|
|
92
|
+
|
|
93
|
+
head_terminal = lv_feeder.normal_head_terminal
|
|
94
|
+
if head_terminal is not None:
|
|
95
|
+
|
|
96
|
+
head_equipment = head_terminal.conducting_equipment
|
|
97
|
+
if head_equipment is not None:
|
|
98
|
+
|
|
99
|
+
for feeder in head_equipment.feeders(self.network_state_operators):
|
|
100
|
+
self.network_state_operators.associate_energizing_feeder(feeder, lv_feeder)
|
|
101
|
+
|
|
102
|
+
# We can run from each LV feeder as we process them, as being associated with their energizing feeders is not a requirement of the trace.
|
|
103
|
+
await self.run_with_feeders(lv_feeder.normal_head_terminal,
|
|
104
|
+
lv_feeder_start_points,
|
|
105
|
+
terminal_to_aux_equipment,
|
|
106
|
+
[lv_feeder])
|
|
107
|
+
|
|
108
|
+
else:
|
|
109
|
+
await self.run_with_feeders(start_terminal,
|
|
110
|
+
lv_feeder_start_points,
|
|
111
|
+
terminal_to_aux_equipment,
|
|
112
|
+
self._lv_feeders_from_terminal(start_terminal))
|
|
113
|
+
|
|
114
|
+
async def run_with_feeders(
|
|
115
|
+
self,
|
|
116
|
+
terminal: Terminal,
|
|
117
|
+
lv_feeder_start_points: Set[ConductingEquipment],
|
|
118
|
+
terminal_to_aux_equipment: Dict[Terminal, List[AuxiliaryEquipment]],
|
|
119
|
+
lv_feeders_to_assign: List[LvFeeder]
|
|
120
|
+
):
|
|
121
|
+
if terminal is None or len(lv_feeders_to_assign) == 0:
|
|
122
|
+
return
|
|
123
|
+
|
|
124
|
+
if isinstance(start_ce := terminal.conducting_equipment, Switch) and self.network_state_operators.is_open(start_ce):
|
|
125
|
+
self._associate_equipment_with_containers(lv_feeders_to_assign, [start_ce])
|
|
126
|
+
else:
|
|
127
|
+
traversal = self._create_trace(terminal_to_aux_equipment, lv_feeder_start_points, lv_feeders_to_assign)
|
|
128
|
+
await traversal.run(terminal, False)
|
|
129
|
+
|
|
130
|
+
def _create_trace(
|
|
131
|
+
self,
|
|
132
|
+
terminal_to_aux_equipment: Dict[Terminal, List[AuxiliaryEquipment]],
|
|
133
|
+
lv_feeder_start_points: Set[ConductingEquipment],
|
|
134
|
+
lv_feeders_to_assign: List[LvFeeder]
|
|
135
|
+
) -> NetworkTrace[T]:
|
|
136
|
+
def _reached_hv(ce: ConductingEquipment):
|
|
137
|
+
return True if ce.base_voltage and ce.base_voltage.nominal_voltage >= 1000 else False
|
|
138
|
+
|
|
139
|
+
async def step_action(nts: NetworkTraceStep, context):
|
|
140
|
+
await self._process(nts.path, nts.data, context, terminal_to_aux_equipment, lv_feeder_start_points, lv_feeders_to_assign)
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
Tracing.network_trace(
|
|
144
|
+
network_state_operators=self.network_state_operators,
|
|
145
|
+
action_step_type=NetworkTraceActionType.ALL_STEPS,
|
|
146
|
+
debug_logger=self._debug_logger,
|
|
147
|
+
name=f'AssignToLvFeeders({self.network_state_operators.description})',
|
|
148
|
+
compute_data=(lambda x, y, next_path: next_path.to_equipment in lv_feeder_start_points)
|
|
149
|
+
)
|
|
150
|
+
.add_condition(stop_at_open())
|
|
151
|
+
.add_stop_condition(lambda step, ctx: step.data)
|
|
152
|
+
.add_queue_condition(
|
|
153
|
+
lambda next_step, *args: next_step.data or not _reached_hv(next_step.path.to_equipment)
|
|
154
|
+
)
|
|
155
|
+
.add_step_action(step_action)
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
async def _process(
|
|
159
|
+
self,
|
|
160
|
+
step_path: NetworkTraceStep.Path,
|
|
161
|
+
found_lv_feeder: bool,
|
|
162
|
+
step_context: StepContext,
|
|
163
|
+
terminal_to_aux_equipment: Dict[Terminal, Collection[AuxiliaryEquipment]],
|
|
164
|
+
lv_feeder_start_points: Set[ConductingEquipment],
|
|
165
|
+
lv_feeders_to_assign: List[LvFeeder]
|
|
166
|
+
):
|
|
167
|
+
if step_path.traced_internally and not step_context.is_start_item:
|
|
168
|
+
return
|
|
169
|
+
|
|
170
|
+
# It might be tempting to check `stepContext.isStopping`, but that would also pick up open points between LV feeders which is not good.
|
|
171
|
+
if found_lv_feeder:
|
|
172
|
+
|
|
173
|
+
for it in (found_lv_feeders := list(self._find_lv_feeders(step_path.to_equipment, lv_feeder_start_points))):
|
|
174
|
+
# Energize the LV feeders that we are processing by the energizing feeders of what we found
|
|
175
|
+
self._feeder_energizes(self.network_state_operators.get_energizing_feeders(it), lv_feeders_to_assign)
|
|
176
|
+
|
|
177
|
+
for it in lv_feeders_to_assign:
|
|
178
|
+
# Energize the LV feeders we found by the energizing feeders we are processing
|
|
179
|
+
self._feeder_energizes(self.network_state_operators.get_energizing_feeders(it), found_lv_feeders)
|
|
180
|
+
|
|
181
|
+
aux_equip_for_this_terminal = terminal_to_aux_equipment.get(step_path.to_terminal, {})
|
|
182
|
+
|
|
183
|
+
self._associate_equipment_with_containers(lv_feeders_to_assign, [step_path.to_equipment])
|
|
184
|
+
self._associate_equipment_with_containers(lv_feeders_to_assign, aux_equip_for_this_terminal)
|
|
185
|
+
|
|
186
|
+
to_equip = step_path.to_equipment
|
|
187
|
+
if isinstance(to_equip, ProtectedSwitch):
|
|
188
|
+
self._associate_relay_systems_with_containers(lv_feeders_to_assign, to_equip)
|
|
189
|
+
elif isinstance(to_equip, PowerElectronicsConnection):
|
|
190
|
+
self._associate_power_electronic_units(lv_feeders_to_assign, to_equip)
|
|
191
|
+
|
|
192
|
+
def _find_lv_feeders(self, ce: ConductingEquipment, lv_feeder_start_points: Set[ConductingEquipment]) -> Generator[LvFeeder, None, None]:
|
|
193
|
+
if sites := list(ce.sites):
|
|
194
|
+
for site in sites:
|
|
195
|
+
for feeder in site.find_lv_feeders(lv_feeder_start_points, self.network_state_operators):
|
|
196
|
+
yield feeder
|
|
197
|
+
else:
|
|
198
|
+
for feeder in ce.lv_feeders(self.network_state_operators):
|
|
199
|
+
yield feeder
|
|
200
|
+
|
|
201
|
+
def _lv_feeders_from_terminal(self, terminal: Terminal) -> List[LvFeeder]:
|
|
202
|
+
return list(terminal.conducting_equipment.lv_feeders(self.network_state_operators))
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ['ClearDirection']
|
|
9
|
+
|
|
10
|
+
from logging import Logger
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Type
|
|
12
|
+
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
|
|
14
|
+
from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
|
|
15
|
+
from zepben.ewb.services.network.tracing.networktrace.conditions.conditions import stop_at_open
|
|
16
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace import NetworkTrace
|
|
17
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace_action_type import NetworkTraceActionType
|
|
18
|
+
from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
|
|
19
|
+
from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing
|
|
20
|
+
from zepben.ewb.services.network.tracing.traversal.weighted_priority_queue import WeightedPriorityQueue
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from zepben.ewb import StepContext, NetworkTraceStep
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ClearDirection:
|
|
27
|
+
"""Convenience class that provides methods for clearing feeder direction on a `NetworkService`"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, debug_logger: Logger = None):
|
|
30
|
+
self._debug_logger = debug_logger
|
|
31
|
+
|
|
32
|
+
# NOTE: We used to try and remove directions in a single pass rather than clearing (and the reapplying where needed) to be more efficient.
|
|
33
|
+
# However, this caused all sorts of pain when trying to determine which directions to remove from dual fed equipment that contains inner loops.
|
|
34
|
+
# We decided it is so much simpler to just clear the directions and reapply from other feeder heads even if its a bit more computationally expensive.
|
|
35
|
+
#
|
|
36
|
+
|
|
37
|
+
async def run(
|
|
38
|
+
self,
|
|
39
|
+
terminal: Terminal,
|
|
40
|
+
network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL
|
|
41
|
+
) -> list[Terminal]:
|
|
42
|
+
"""
|
|
43
|
+
Clears the feeder direction from a terminal and the connected equipment chain.
|
|
44
|
+
This clears directions even if equipment is dual fed. A set of feeder head terminals encountered while running will be returned and directions
|
|
45
|
+
can be reapplied if required using `set_direction`. Note that if you start on a feeder head terminal, this will be returned in the encountered
|
|
46
|
+
feeder heads set.
|
|
47
|
+
|
|
48
|
+
:param terminal: The `Terminal` from which to start the direction removal.
|
|
49
|
+
:param network_state_operators: The `NetworkStateOperators` to be used when removing directions.
|
|
50
|
+
:return : A set of feeder head `Terminal`s encountered when clearing directions
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
trace = self._create_trace(network_state_operators, feeder_head_terminals := [])
|
|
54
|
+
await trace.run(terminal, can_stop_on_start_item=False)
|
|
55
|
+
return feeder_head_terminals
|
|
56
|
+
|
|
57
|
+
def _create_trace(
|
|
58
|
+
self,
|
|
59
|
+
state_operators: Type[NetworkStateOperators],
|
|
60
|
+
visited_feeder_head_terminals: list[Terminal]
|
|
61
|
+
) -> NetworkTrace[Any]:
|
|
62
|
+
def step_action(item: NetworkTraceStep, context: StepContext):
|
|
63
|
+
state_operators.set_direction(item.path.to_terminal, FeederDirection.NONE)
|
|
64
|
+
visited_feeder_head_terminals.append(item.path.to_terminal) if item.path.to_terminal.is_feeder_head_terminal() else None
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
Tracing.network_trace(
|
|
68
|
+
network_state_operators=state_operators,
|
|
69
|
+
action_step_type=NetworkTraceActionType.ALL_STEPS,
|
|
70
|
+
debug_logger=self._debug_logger,
|
|
71
|
+
name=f'ClearDirection({state_operators.description})',
|
|
72
|
+
queue=WeightedPriorityQueue.process_queue(
|
|
73
|
+
lambda it: it.path.to_terminal.phases.num_phases),
|
|
74
|
+
)
|
|
75
|
+
.add_condition(stop_at_open())
|
|
76
|
+
.add_queue_condition(
|
|
77
|
+
lambda step, *args: state_operators.get_direction(step.path.to_terminal) != FeederDirection.NONE
|
|
78
|
+
)
|
|
79
|
+
.add_step_action(step_action)
|
|
80
|
+
)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["normal_direction", "current_direction", "DirectionStatus", "NormalDirection", "CurrentDirection"]
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
|
|
10
|
+
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
|
|
11
|
+
from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def normal_direction(terminal: Terminal):
|
|
15
|
+
return NormalDirection(terminal)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def current_direction(terminal: Terminal):
|
|
19
|
+
return CurrentDirection(terminal)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DirectionStatus(ABC):
|
|
23
|
+
"""
|
|
24
|
+
Interface to query or set the `FeederDirection` for a `Terminal`.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def value(self) -> FeederDirection:
|
|
29
|
+
"""
|
|
30
|
+
Returns The direction added to this status.
|
|
31
|
+
"""
|
|
32
|
+
raise NotImplementedError()
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def set(self, direction: FeederDirection) -> bool:
|
|
36
|
+
"""
|
|
37
|
+
Clears the existing direction and sets it to the specified direction.
|
|
38
|
+
|
|
39
|
+
`direction` The direction of the `Terminal`.
|
|
40
|
+
|
|
41
|
+
Returns True if the direction has been updated, otherwise False.
|
|
42
|
+
"""
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def add(self, direction: FeederDirection) -> bool:
|
|
47
|
+
"""
|
|
48
|
+
Adds the given direction to the `Terminal`.
|
|
49
|
+
|
|
50
|
+
`direction` The direction to add to the `Terminal`.
|
|
51
|
+
|
|
52
|
+
Returns True if the direction has been updated, otherwise False.
|
|
53
|
+
"""
|
|
54
|
+
raise NotImplementedError
|
|
55
|
+
|
|
56
|
+
@abstractmethod
|
|
57
|
+
def remove(self, direction: FeederDirection) -> bool:
|
|
58
|
+
"""
|
|
59
|
+
Removes the given direction from the `Terminal`.
|
|
60
|
+
|
|
61
|
+
`direction` The direction to remove from the `Terminal`.
|
|
62
|
+
|
|
63
|
+
Returns True if the direction has been updated, otherwise False.
|
|
64
|
+
"""
|
|
65
|
+
raise NotImplementedError
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class NormalDirection(DirectionStatus):
|
|
69
|
+
|
|
70
|
+
def __init__(self, terminal: Terminal):
|
|
71
|
+
self.terminal = terminal
|
|
72
|
+
|
|
73
|
+
def value(self) -> FeederDirection:
|
|
74
|
+
return self.terminal.normal_feeder_direction
|
|
75
|
+
|
|
76
|
+
def set(self, direction: FeederDirection) -> bool:
|
|
77
|
+
if self.terminal.normal_feeder_direction == direction:
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
self.terminal.normal_feeder_direction = direction
|
|
81
|
+
return True
|
|
82
|
+
|
|
83
|
+
def add(self, direction: FeederDirection) -> bool:
|
|
84
|
+
previous = self.terminal.normal_feeder_direction
|
|
85
|
+
new = previous + direction
|
|
86
|
+
if new == previous:
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
self.terminal.normal_feeder_direction = new
|
|
90
|
+
return True
|
|
91
|
+
|
|
92
|
+
def remove(self, direction: FeederDirection) -> bool:
|
|
93
|
+
previous = self.terminal.normal_feeder_direction
|
|
94
|
+
new = previous - direction
|
|
95
|
+
if new == previous:
|
|
96
|
+
return False
|
|
97
|
+
|
|
98
|
+
self.terminal.normal_feeder_direction = new
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class CurrentDirection(DirectionStatus):
|
|
103
|
+
|
|
104
|
+
def __init__(self, terminal: Terminal):
|
|
105
|
+
self.terminal = terminal
|
|
106
|
+
|
|
107
|
+
def value(self) -> FeederDirection:
|
|
108
|
+
return self.terminal.current_feeder_direction
|
|
109
|
+
|
|
110
|
+
def set(self, direction: FeederDirection) -> bool:
|
|
111
|
+
if self.terminal.current_feeder_direction == direction:
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
self.terminal.current_feeder_direction = direction
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
def add(self, direction: FeederDirection) -> bool:
|
|
118
|
+
previous = self.terminal.current_feeder_direction
|
|
119
|
+
new = previous + direction
|
|
120
|
+
if new == previous:
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
self.terminal.current_feeder_direction = new
|
|
124
|
+
return True
|
|
125
|
+
|
|
126
|
+
def remove(self, direction: FeederDirection) -> bool:
|
|
127
|
+
previous = self.terminal.current_feeder_direction
|
|
128
|
+
new = previous - direction
|
|
129
|
+
if new == previous:
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
self.terminal.current_feeder_direction = new
|
|
133
|
+
return True
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["FeederDirection"]
|
|
7
|
+
|
|
8
|
+
from enum import Enum
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FeederDirection(Enum):
|
|
12
|
+
"""
|
|
13
|
+
Enumeration of directions along a feeder at a terminal.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
NONE = 0
|
|
17
|
+
"""
|
|
18
|
+
The terminal is not on a feeder.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
UPSTREAM = 1
|
|
22
|
+
"""
|
|
23
|
+
The terminal can be used to trace upstream towards the feeder head.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
DOWNSTREAM = 2
|
|
27
|
+
"""
|
|
28
|
+
The terminal can be used to trace downstream away from the feeder head.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
BOTH = 3
|
|
32
|
+
"""
|
|
33
|
+
The terminal is part of a loop on the feeder and tracing in either direction will allow you
|
|
34
|
+
to trace upstream towards the feeder head, or downstream away from the feeder head.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
CONNECTOR = 4
|
|
38
|
+
"""
|
|
39
|
+
The terminal belongs to a Connector that is modelled with only a single terminal.
|
|
40
|
+
CONNECTOR will match direction UPSTREAM, DOWNSTREAM, and BOTH, however it exists
|
|
41
|
+
to differentiate it from BOTH which is used to indicate loops on the feeder. This
|
|
42
|
+
however means you connected tell if a terminal with CONNECTOR is part of a loop
|
|
43
|
+
directly, you need to check its connected terminals and check for BOTH to determine
|
|
44
|
+
if it is in a loop.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __contains__(self, other):
|
|
48
|
+
"""
|
|
49
|
+
Check whether this `FeederDirection`` contains another `FeederDirection`.
|
|
50
|
+
|
|
51
|
+
:param other: The `FeederDirection` to check.
|
|
52
|
+
:return: `True` if this is `BOTH` and other is not `NONE`, or if the directions are the same, otherwise `False`
|
|
53
|
+
"""
|
|
54
|
+
if self in (FeederDirection.BOTH, FeederDirection.CONNECTOR):
|
|
55
|
+
return other is not FeederDirection.NONE
|
|
56
|
+
else:
|
|
57
|
+
return self is other
|
|
58
|
+
|
|
59
|
+
def __add__(self, other):
|
|
60
|
+
"""
|
|
61
|
+
Add a `FeederDirection` to this `FeederDirection`
|
|
62
|
+
|
|
63
|
+
:param other: The `FeederDirection` to add.
|
|
64
|
+
:return: The resulting `FeederDirection` with `other` added.
|
|
65
|
+
"""
|
|
66
|
+
if self == FeederDirection.CONNECTOR:
|
|
67
|
+
return FeederDirection.CONNECTOR
|
|
68
|
+
|
|
69
|
+
return FeederDirection(self.value | other.value)
|
|
70
|
+
|
|
71
|
+
def __sub__(self, other):
|
|
72
|
+
"""
|
|
73
|
+
Remove a `FeederDirection` from this `FeederDirection`
|
|
74
|
+
|
|
75
|
+
:param other: The `FeederDirection` to remove.
|
|
76
|
+
:return: The resulting `FeederDirection` with `other` removed.
|
|
77
|
+
"""
|
|
78
|
+
if self == FeederDirection.CONNECTOR:
|
|
79
|
+
return FeederDirection.CONNECTOR
|
|
80
|
+
|
|
81
|
+
return FeederDirection(self.value - (self.value & other.value))
|
|
82
|
+
|
|
83
|
+
def __invert__(self):
|
|
84
|
+
if self == FeederDirection.UPSTREAM:
|
|
85
|
+
return FeederDirection.DOWNSTREAM
|
|
86
|
+
elif self == FeederDirection.DOWNSTREAM:
|
|
87
|
+
return FeederDirection.UPSTREAM
|
|
88
|
+
elif self in (FeederDirection.BOTH, FeederDirection.CONNECTOR):
|
|
89
|
+
return FeederDirection.NONE
|
|
90
|
+
else: # lif self == FeederDirection.NONE:
|
|
91
|
+
return FeederDirection.BOTH
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def complementary_external_direction(self):
|
|
95
|
+
if self == FeederDirection.UPSTREAM:
|
|
96
|
+
return FeederDirection.DOWNSTREAM
|
|
97
|
+
elif self == FeederDirection.DOWNSTREAM:
|
|
98
|
+
return FeederDirection.UPSTREAM
|
|
99
|
+
else:
|
|
100
|
+
return self
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def short_name(self) -> str:
|
|
104
|
+
"""
|
|
105
|
+
:return: The name of the enum without the class name.
|
|
106
|
+
"""
|
|
107
|
+
return str(self)[16:]
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["SetDirection"]
|
|
9
|
+
|
|
10
|
+
from functools import singledispatchmethod
|
|
11
|
+
from logging import Logger
|
|
12
|
+
from typing import Optional, TYPE_CHECKING, Type
|
|
13
|
+
|
|
14
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
15
|
+
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
|
|
16
|
+
from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.wires.cut import Cut
|
|
18
|
+
from zepben.ewb.model.cim.iec61970.base.wires.power_transformer import PowerTransformer
|
|
19
|
+
from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
|
|
20
|
+
from zepben.ewb.services.network.tracing.networktrace.conditions.conditions import stop_at_open
|
|
21
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace import NetworkTrace
|
|
22
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace_action_type import NetworkTraceActionType
|
|
23
|
+
from zepben.ewb.services.network.tracing.networktrace.network_trace_step import NetworkTraceStep
|
|
24
|
+
from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
|
|
25
|
+
from zepben.ewb.services.network.tracing.networktrace.tracing import Tracing
|
|
26
|
+
from zepben.ewb.services.network.tracing.traversal.weighted_priority_queue import WeightedPriorityQueue
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from zepben.ewb import NetworkService, Switch, ConductingEquipment
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SetDirection:
|
|
33
|
+
"""
|
|
34
|
+
Convenience class that provides methods for setting feeder direction on a [NetworkService]
|
|
35
|
+
This class is backed by a [BranchRecursiveTraversal].
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, debug_logger: Logger = None):
|
|
39
|
+
self._debug_logger = debug_logger
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _compute_data(
|
|
43
|
+
reprocessed_loop_terminals: list[Terminal],
|
|
44
|
+
state_operators: Type[NetworkStateOperators],
|
|
45
|
+
step: NetworkTraceStep[FeederDirection],
|
|
46
|
+
next_path: NetworkTraceStep.Path
|
|
47
|
+
) -> FeederDirection:
|
|
48
|
+
|
|
49
|
+
if next_path.to_equipment is BusbarSection:
|
|
50
|
+
return FeederDirection.CONNECTOR
|
|
51
|
+
|
|
52
|
+
def next_direction_func():
|
|
53
|
+
if step.data == FeederDirection.NONE:
|
|
54
|
+
return FeederDirection.NONE
|
|
55
|
+
elif next_path.traced_internally:
|
|
56
|
+
return FeederDirection.DOWNSTREAM
|
|
57
|
+
elif isinstance(next_path.to_equipment, Cut):
|
|
58
|
+
return FeederDirection.UPSTREAM
|
|
59
|
+
elif next_path.did_traverse_ac_line_segment:
|
|
60
|
+
return FeederDirection.DOWNSTREAM
|
|
61
|
+
else:
|
|
62
|
+
return FeederDirection.UPSTREAM
|
|
63
|
+
|
|
64
|
+
next_direction = next_direction_func()
|
|
65
|
+
|
|
66
|
+
# NOTE: Stopping / short-circuiting by checking that the next direction is already present in the toTerminal,
|
|
67
|
+
# causes certain looping network configurations not to be reprocessed. This means that some parts of
|
|
68
|
+
# loops do not end up with BOTH directions. This is done to stop massive computational blowout on
|
|
69
|
+
# large networks with weird looping connectivity that rarely happens in reality.
|
|
70
|
+
#
|
|
71
|
+
# To allow these parts of the loop to be correctly processed without the computational blowout, we allow
|
|
72
|
+
# a single re-pass over the loop, controlled by the `reprocessedLoopTerminals` set.
|
|
73
|
+
|
|
74
|
+
next_terminal_direction = state_operators.get_direction(next_path.to_terminal)
|
|
75
|
+
|
|
76
|
+
if next_direction == FeederDirection.NONE:
|
|
77
|
+
return FeederDirection.NONE
|
|
78
|
+
elif next_direction not in next_terminal_direction:
|
|
79
|
+
return next_direction
|
|
80
|
+
elif next_terminal_direction == FeederDirection.BOTH:
|
|
81
|
+
reprocessed_loop_terminals.append(next_path.to_terminal)
|
|
82
|
+
return next_direction
|
|
83
|
+
return FeederDirection.NONE
|
|
84
|
+
|
|
85
|
+
def _create_traversal(self, state_operators: Type[NetworkStateOperators]) -> NetworkTrace[FeederDirection]:
|
|
86
|
+
reprocessed_loop_terminals: list[Terminal] = []
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
Tracing.network_trace_branching(
|
|
90
|
+
network_state_operators=state_operators,
|
|
91
|
+
action_step_type=NetworkTraceActionType.ALL_STEPS,
|
|
92
|
+
debug_logger=self._debug_logger,
|
|
93
|
+
name=f'SetDirection({state_operators.description})',
|
|
94
|
+
queue_factory=lambda: WeightedPriorityQueue.process_queue(lambda it: it.path.to_terminal.phases.num_phases),
|
|
95
|
+
branch_queue_factory=lambda: WeightedPriorityQueue.branch_queue(lambda it: it.path.to_terminal.phases.num_phases),
|
|
96
|
+
compute_data=lambda step, _, next_path: self._compute_data(reprocessed_loop_terminals, state_operators, step, next_path)
|
|
97
|
+
)
|
|
98
|
+
.add_condition(stop_at_open())
|
|
99
|
+
.add_stop_condition(
|
|
100
|
+
lambda nts, ctx: nts.path.to_terminal.is_feeder_head_terminal() or
|
|
101
|
+
self._reached_substation_transformer(nts.path.to_terminal)
|
|
102
|
+
)
|
|
103
|
+
.add_queue_condition(lambda nts, *args: nts.data != FeederDirection.NONE)
|
|
104
|
+
.add_step_action(
|
|
105
|
+
lambda nts, ctx: state_operators.add_direction(nts.path.to_terminal, nts.data)
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _reached_substation_transformer(terminal: Terminal) -> bool:
|
|
111
|
+
if ce := terminal.conducting_equipment:
|
|
112
|
+
return isinstance(ce, PowerTransformer) and ce.num_substations() > 0
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
@staticmethod
|
|
116
|
+
def _is_normally_open_switch(conducting_equipment: Optional[ConductingEquipment]):
|
|
117
|
+
return isinstance(conducting_equipment, Switch) and conducting_equipment.is_normally_open()
|
|
118
|
+
|
|
119
|
+
@singledispatchmethod
|
|
120
|
+
async def run(self, network: NetworkService, network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL):
|
|
121
|
+
"""
|
|
122
|
+
Apply feeder directions from all feeder head terminals in the network.
|
|
123
|
+
|
|
124
|
+
:param network: The network in which to apply feeder directions.
|
|
125
|
+
:param network_state_operators: The `NetworkStateOperators` to be used when setting feeder direction
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
for terminal in (f.normal_head_terminal for f in network.objects(Feeder) if f.normal_head_terminal):
|
|
129
|
+
if (head_terminal := terminal.conducting_equipment) is not None:
|
|
130
|
+
if not network_state_operators.is_open(head_terminal, None):
|
|
131
|
+
await self.run_terminal(terminal, network_state_operators)
|
|
132
|
+
|
|
133
|
+
@run.register
|
|
134
|
+
async def run_terminal(self, terminal: Terminal, network_state_operators: Type[NetworkStateOperators] = NetworkStateOperators.NORMAL):
|
|
135
|
+
"""
|
|
136
|
+
Apply [FeederDirection.DOWNSTREAM] from the [terminal].
|
|
137
|
+
|
|
138
|
+
:param terminal: The terminal to start applying feeder direction from.
|
|
139
|
+
:param network_state_operators: The `NetworkStateOperators` to be used when setting feeder direction
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
return await (self._create_traversal(network_state_operators)
|
|
143
|
+
.run(terminal, FeederDirection.DOWNSTREAM, can_stop_on_start_item=False))
|