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,106 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ['PowerSystemResource']
|
|
9
|
+
|
|
10
|
+
from typing import Optional, TYPE_CHECKING, List, Generator, Iterable
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
13
|
+
from zepben.ewb.util import get_by_mrid, nlen, ngen, safe_remove
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from zepben.ewb.model.cim.iec61968.assets.asset import Asset
|
|
17
|
+
from zepben.ewb.model.cim.iec61968.assets.asset_info import AssetInfo
|
|
18
|
+
from zepben.ewb.model.cim.iec61968.common.location import Location
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PowerSystemResource(IdentifiedObject):
|
|
22
|
+
"""
|
|
23
|
+
Abstract class, should only be used through subclasses.
|
|
24
|
+
A power system resource can be an item of equipment such as a switch, an equipment container containing many individual
|
|
25
|
+
items of equipment such as a substation, or an organisational entity such as sub-control area. Power system resources
|
|
26
|
+
can have measurements associated.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
location: Optional[Location] = None
|
|
30
|
+
"""A `zepben.ewb.model.cim.iec61968.common.location.Location` for this resource."""
|
|
31
|
+
|
|
32
|
+
asset_info: Optional[AssetInfo] = None
|
|
33
|
+
"""A subclass of `zepben.ewb.model.cim.iec61968.assets.asset_info.AssetInfo` providing information about the asset associated with this PowerSystemResource."""
|
|
34
|
+
|
|
35
|
+
num_controls: int = 0
|
|
36
|
+
"""Number of Control's known to associate with this [PowerSystemResource]"""
|
|
37
|
+
|
|
38
|
+
_assets: Optional[List[Asset]] = None
|
|
39
|
+
|
|
40
|
+
def __init__(self, assets: Iterable[Asset] = None, **kwargs):
|
|
41
|
+
super(PowerSystemResource, self).__init__(**kwargs)
|
|
42
|
+
if assets:
|
|
43
|
+
for asset in assets:
|
|
44
|
+
self.add_asset(asset)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def has_controls(self) -> bool:
|
|
48
|
+
"""
|
|
49
|
+
* :return: True if this [PowerSystemResource] has at least 1 Control associated with it, false otherwise.
|
|
50
|
+
"""
|
|
51
|
+
return self.num_controls > 0
|
|
52
|
+
|
|
53
|
+
def num_assets(self) -> int:
|
|
54
|
+
"""
|
|
55
|
+
Get the number of `Asset`s associated with this `PowerSystemResource`.
|
|
56
|
+
"""
|
|
57
|
+
return nlen(self._assets)
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def assets(self) -> Generator[Asset, None, None]:
|
|
61
|
+
"""
|
|
62
|
+
The `Asset`s of this `PowerSystemResource`.
|
|
63
|
+
"""
|
|
64
|
+
return ngen(self._assets)
|
|
65
|
+
|
|
66
|
+
def get_asset(self, mrid: str) -> Asset:
|
|
67
|
+
"""
|
|
68
|
+
Get the `Asset` associated with this `PowerSystemResource` identified by `mrid`.
|
|
69
|
+
|
|
70
|
+
`mrid` the mRID of the required `Asset`
|
|
71
|
+
Returns The `Asset` with the specified `mrid`.
|
|
72
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
73
|
+
"""
|
|
74
|
+
return get_by_mrid(self._assets, mrid)
|
|
75
|
+
|
|
76
|
+
def add_asset(self, asset: Asset) -> PowerSystemResource:
|
|
77
|
+
"""
|
|
78
|
+
`asset` The `Asset` to associate with this `PowerSystemResource`.
|
|
79
|
+
Returns A reference to this `PowerSystemResource` to allow fluent use.
|
|
80
|
+
Raises `ValueError` if another `Asset` with the same `mrid` already exists in this `PowerSystemResource`
|
|
81
|
+
"""
|
|
82
|
+
if self._validate_reference(asset, self.get_asset, "An Asset"):
|
|
83
|
+
return self
|
|
84
|
+
|
|
85
|
+
self._assets = list() if self._assets is None else self._assets
|
|
86
|
+
self._assets.append(asset)
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def remove_asset(self, asset: Asset) -> PowerSystemResource:
|
|
90
|
+
"""
|
|
91
|
+
Disassociate an `Asset` from this `PowerSystemResource`.
|
|
92
|
+
|
|
93
|
+
`asset` the `Asset` to disassociate from this `PowerSystemResource`.
|
|
94
|
+
Raises `ValueError` if `asset` was not associated with this `PowerSystemResource`.
|
|
95
|
+
Returns A reference to this `PowerSystemResource` to allow fluent use.
|
|
96
|
+
"""
|
|
97
|
+
self._assets = safe_remove(self._assets, asset)
|
|
98
|
+
return self
|
|
99
|
+
|
|
100
|
+
def clear_assets(self) -> PowerSystemResource:
|
|
101
|
+
"""
|
|
102
|
+
Clear all assets.
|
|
103
|
+
Returns self
|
|
104
|
+
"""
|
|
105
|
+
self._assets = None
|
|
106
|
+
return self
|
|
@@ -0,0 +1,93 @@
|
|
|
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__ = ["SubGeographicalRegion"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, List, Generator, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
13
|
+
from zepben.ewb.util import nlen, ngen, get_by_mrid, safe_remove
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from zepben.ewb.model.cim.iec61970.base.core.geographical_region import GeographicalRegion
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.substation import Substation
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SubGeographicalRegion(IdentifiedObject):
|
|
21
|
+
"""
|
|
22
|
+
A subset of a geographical region of a power system network model.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
geographical_region: Optional[GeographicalRegion] = None
|
|
26
|
+
"""The geographical region to which this sub-geographical region is within."""
|
|
27
|
+
|
|
28
|
+
_substations: Optional[List[Substation]] = None
|
|
29
|
+
|
|
30
|
+
def __init__(self, substations: List[Substation] = None, **kwargs):
|
|
31
|
+
super(SubGeographicalRegion, self).__init__(**kwargs)
|
|
32
|
+
if substations:
|
|
33
|
+
for sub in substations:
|
|
34
|
+
self.add_substation(sub)
|
|
35
|
+
|
|
36
|
+
def num_substations(self) -> int:
|
|
37
|
+
"""
|
|
38
|
+
Returns The number of `Substation`s associated with this `SubGeographicalRegion`
|
|
39
|
+
"""
|
|
40
|
+
return nlen(self._substations)
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def substations(self) -> Generator[Substation, None, None]:
|
|
44
|
+
"""
|
|
45
|
+
All substations belonging to this sub geographical region.
|
|
46
|
+
"""
|
|
47
|
+
return ngen(self._substations)
|
|
48
|
+
|
|
49
|
+
def get_substation(self, mrid: str) -> Substation:
|
|
50
|
+
"""
|
|
51
|
+
Get the `Substation` for this `SubGeographicalRegion` identified by `mrid`
|
|
52
|
+
|
|
53
|
+
`mrid` the mRID of the required `Substation`
|
|
54
|
+
Returns The `Substation` with the specified `mrid` if it exists
|
|
55
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
56
|
+
"""
|
|
57
|
+
return get_by_mrid(self._substations, mrid)
|
|
58
|
+
|
|
59
|
+
def add_substation(self, substation: Substation) -> SubGeographicalRegion:
|
|
60
|
+
"""
|
|
61
|
+
Associate a `Substation` with this `GeographicalRegion`
|
|
62
|
+
|
|
63
|
+
`substation` the `Substation` to associate with this `SubGeographicalRegion`.
|
|
64
|
+
|
|
65
|
+
Returns A reference to this `SubGeographicalRegion` to allow fluent use.
|
|
66
|
+
|
|
67
|
+
Raises `ValueError` if another `Substation` with the same `mrid` already exists for this
|
|
68
|
+
`GeographicalRegion`.
|
|
69
|
+
"""
|
|
70
|
+
if self._validate_reference(substation, self.get_substation, "A Substation"):
|
|
71
|
+
return self
|
|
72
|
+
self._substations = list() if self._substations is None else self._substations
|
|
73
|
+
self._substations.append(substation)
|
|
74
|
+
return self
|
|
75
|
+
|
|
76
|
+
def remove_substation(self, substation: Substation) -> SubGeographicalRegion:
|
|
77
|
+
"""
|
|
78
|
+
Disassociate `substation` from this `GeographicalRegion`
|
|
79
|
+
|
|
80
|
+
`substation` The `Substation` to disassociate from this `SubGeographicalRegion`.
|
|
81
|
+
Returns A reference to this `SubGeographicalRegion` to allow fluent use.
|
|
82
|
+
Raises `ValueError` if `substation` was not associated with this `SubGeographicalRegion`.
|
|
83
|
+
"""
|
|
84
|
+
self._substations = safe_remove(self._substations, substation)
|
|
85
|
+
return self
|
|
86
|
+
|
|
87
|
+
def clear_substations(self) -> SubGeographicalRegion:
|
|
88
|
+
"""
|
|
89
|
+
Clear all `Substations`.
|
|
90
|
+
Returns A reference to this `SubGeographicalRegion` to allow fluent use.
|
|
91
|
+
"""
|
|
92
|
+
self._substations = None
|
|
93
|
+
return self
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["Substation"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, Generator, List, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment_container import EquipmentContainer
|
|
13
|
+
from zepben.ewb.util import nlen, get_by_mrid, ngen, safe_remove
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.loop import Loop
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
18
|
+
from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
|
|
19
|
+
from zepben.ewb.model.cim.iec61970.infiec61970.feeder.circuit import Circuit
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Substation(EquipmentContainer):
|
|
23
|
+
"""
|
|
24
|
+
A collection of equipment for purposes other than generation or utilization, through which electric energy in bulk
|
|
25
|
+
is passed for the purposes of switching or modifying its characteristics.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
sub_geographical_region: Optional[SubGeographicalRegion] = None
|
|
29
|
+
"""The SubGeographicalRegion containing the substation."""
|
|
30
|
+
|
|
31
|
+
_normal_energized_feeders: Optional[List[Feeder]] = None
|
|
32
|
+
|
|
33
|
+
_loops: Optional[List[Loop]] = None
|
|
34
|
+
|
|
35
|
+
_energized_loops: Optional[List[Loop]] = None
|
|
36
|
+
|
|
37
|
+
_circuits: Optional[List[Circuit]] = None
|
|
38
|
+
|
|
39
|
+
def __init__(self, normal_energized_feeders: List[Feeder] = None, loops: List[Loop] = None, energized_loops: List[Loop] = None,
|
|
40
|
+
circuits: List[Circuit] = None, **kwargs):
|
|
41
|
+
super(Substation, self).__init__(**kwargs)
|
|
42
|
+
if normal_energized_feeders:
|
|
43
|
+
for feeder in normal_energized_feeders:
|
|
44
|
+
self.add_feeder(feeder)
|
|
45
|
+
if loops:
|
|
46
|
+
for loop in loops:
|
|
47
|
+
self.add_loop(loop)
|
|
48
|
+
if energized_loops:
|
|
49
|
+
for loop in energized_loops:
|
|
50
|
+
self.add_energized_loop(loop)
|
|
51
|
+
if circuits:
|
|
52
|
+
for circuit in circuits:
|
|
53
|
+
self.add_circuit(circuit)
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def circuits(self) -> Generator[Circuit, None, None]:
|
|
57
|
+
"""
|
|
58
|
+
The `Circuit`s originating from this substation.
|
|
59
|
+
"""
|
|
60
|
+
return ngen(self._circuits)
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def loops(self) -> Generator[Loop, None, None]:
|
|
64
|
+
"""
|
|
65
|
+
The `Loop` originating from this substation.
|
|
66
|
+
"""
|
|
67
|
+
return ngen(self._loops)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def energized_loops(self) -> Generator[Loop, None, None]:
|
|
71
|
+
"""
|
|
72
|
+
The `Loop`s originating from this substation that are energised.
|
|
73
|
+
"""
|
|
74
|
+
return ngen(self._energized_loops)
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def feeders(self) -> Generator[Feeder, None, None]:
|
|
78
|
+
"""
|
|
79
|
+
The normal energized feeders of the substation. Also used for naming purposes.
|
|
80
|
+
"""
|
|
81
|
+
return ngen(self._normal_energized_feeders)
|
|
82
|
+
|
|
83
|
+
def num_feeders(self):
|
|
84
|
+
"""
|
|
85
|
+
Returns The number of `Feeder`s associated with this `Substation`
|
|
86
|
+
"""
|
|
87
|
+
return nlen(self._normal_energized_feeders)
|
|
88
|
+
|
|
89
|
+
def get_feeder(self, mrid: str) -> Feeder:
|
|
90
|
+
"""
|
|
91
|
+
Get the `Feeder` for this `Substation` identified by `mrid`
|
|
92
|
+
|
|
93
|
+
`mrid` The mRID of the required `Feeder`
|
|
94
|
+
Returns The `Feeder` with the specified `mrid` if it exists
|
|
95
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
96
|
+
"""
|
|
97
|
+
return get_by_mrid(self._normal_energized_feeders, mrid)
|
|
98
|
+
|
|
99
|
+
def add_feeder(self, feeder: Feeder) -> Substation:
|
|
100
|
+
"""
|
|
101
|
+
Associate a `Feeder` with this `Substation`
|
|
102
|
+
|
|
103
|
+
`feeder` The `Feeder` to associate with this `Substation`.
|
|
104
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
105
|
+
Raises `ValueError` if another `Feeder` with the same `mrid` already exists for this `Substation`.
|
|
106
|
+
"""
|
|
107
|
+
if self._validate_reference(feeder, self.get_feeder, "A Feeder"):
|
|
108
|
+
return self
|
|
109
|
+
self._normal_energized_feeders = list() if self._normal_energized_feeders is None else self._normal_energized_feeders
|
|
110
|
+
self._normal_energized_feeders.append(feeder)
|
|
111
|
+
return self
|
|
112
|
+
|
|
113
|
+
def remove_feeder(self, feeder: Feeder) -> Substation:
|
|
114
|
+
"""
|
|
115
|
+
Disassociate `feeder` from this `Substation`
|
|
116
|
+
|
|
117
|
+
`feeder` The `Feeder` to disassociate from this `Substation`.
|
|
118
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
119
|
+
Raises `ValueError` if `feeder` was not associated with this `Substation`.
|
|
120
|
+
"""
|
|
121
|
+
self._normal_energized_feeders = safe_remove(self._normal_energized_feeders, feeder)
|
|
122
|
+
return self
|
|
123
|
+
|
|
124
|
+
def clear_feeders(self) -> Substation:
|
|
125
|
+
"""
|
|
126
|
+
Clear all current `Feeder`s.
|
|
127
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
128
|
+
"""
|
|
129
|
+
self._normal_energized_feeders = None
|
|
130
|
+
return self
|
|
131
|
+
|
|
132
|
+
def num_loops(self):
|
|
133
|
+
"""
|
|
134
|
+
Returns The number of `Loop`s associated with this `Substation`
|
|
135
|
+
"""
|
|
136
|
+
return nlen(self._loops)
|
|
137
|
+
|
|
138
|
+
def get_loop(self, mrid: str) -> Loop:
|
|
139
|
+
"""
|
|
140
|
+
Get the `Loop` for this `Substation` identified by `mrid`
|
|
141
|
+
|
|
142
|
+
`mrid` The mRID of the required `Loop`
|
|
143
|
+
Returns The `Loop` with the specified `mrid` if it exists
|
|
144
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
145
|
+
"""
|
|
146
|
+
return get_by_mrid(self._loops, mrid)
|
|
147
|
+
|
|
148
|
+
def add_loop(self, loop: Loop) -> Substation:
|
|
149
|
+
"""
|
|
150
|
+
Associate a `Loop` with this `Substation`
|
|
151
|
+
|
|
152
|
+
`loop` The `Loop` to associate with this `Substation`.
|
|
153
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
154
|
+
Raises `ValueError` if another `Loop` with the same `mrid` already exists for this `Substation`.
|
|
155
|
+
"""
|
|
156
|
+
if self._validate_reference(loop, self.get_loop, "A Loop"):
|
|
157
|
+
return self
|
|
158
|
+
self._loops = list() if self._loops is None else self._loops
|
|
159
|
+
self._loops.append(loop)
|
|
160
|
+
return self
|
|
161
|
+
|
|
162
|
+
def remove_loop(self, loop: Loop) -> Substation:
|
|
163
|
+
"""
|
|
164
|
+
Disassociate `loop` from this `Substation`
|
|
165
|
+
|
|
166
|
+
`loop` The `Loop` to disassociate from this `Substation`.
|
|
167
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
168
|
+
Raises `ValueError` if `loop` was not associated with this `Substation`.
|
|
169
|
+
"""
|
|
170
|
+
self._loops = safe_remove(self._loops, loop)
|
|
171
|
+
return self
|
|
172
|
+
|
|
173
|
+
def clear_loops(self) -> Substation:
|
|
174
|
+
"""
|
|
175
|
+
Clear all current `Loop`s.
|
|
176
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
177
|
+
"""
|
|
178
|
+
self._loops = None
|
|
179
|
+
return self
|
|
180
|
+
|
|
181
|
+
def num_energized_loops(self):
|
|
182
|
+
"""
|
|
183
|
+
Returns The number of `Loop`s associated with this `Substation`
|
|
184
|
+
"""
|
|
185
|
+
return nlen(self._energized_loops)
|
|
186
|
+
|
|
187
|
+
def get_energized_loop(self, mrid: str) -> Loop:
|
|
188
|
+
"""
|
|
189
|
+
Get the `Loop` for this `Substation` identified by `mrid`
|
|
190
|
+
|
|
191
|
+
`mrid` The mRID of the required `Loop`
|
|
192
|
+
Returns The `Loop` with the specified `mrid` if it exists
|
|
193
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
194
|
+
"""
|
|
195
|
+
return get_by_mrid(self._energized_loops, mrid)
|
|
196
|
+
|
|
197
|
+
def add_energized_loop(self, loop: Loop) -> Substation:
|
|
198
|
+
"""
|
|
199
|
+
Associate a `Loop` with this `Substation`
|
|
200
|
+
|
|
201
|
+
`loop` The `Loop` to associate with this `Substation`.
|
|
202
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
203
|
+
Raises `ValueError` if another `Loop` with the same `mrid` already exists for this `Substation`.
|
|
204
|
+
"""
|
|
205
|
+
if self._validate_reference(loop, self.get_energized_loop, "A Loop"):
|
|
206
|
+
return self
|
|
207
|
+
self._energized_loops = list() if self._energized_loops is None else self._energized_loops
|
|
208
|
+
self._energized_loops.append(loop)
|
|
209
|
+
return self
|
|
210
|
+
|
|
211
|
+
def remove_energized_loop(self, loop: Loop) -> Substation:
|
|
212
|
+
"""
|
|
213
|
+
Disassociate `loop` from this `Substation`
|
|
214
|
+
|
|
215
|
+
`loop` The `Loop` to disassociate from this `Substation`.
|
|
216
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
217
|
+
Raises `ValueError` if `loop` was not associated with this `Substation`.
|
|
218
|
+
"""
|
|
219
|
+
self._energized_loops = safe_remove(self._energized_loops, loop)
|
|
220
|
+
return self
|
|
221
|
+
|
|
222
|
+
def clear_energized_loops(self) -> Substation:
|
|
223
|
+
"""
|
|
224
|
+
Clear all current `Loop`s.
|
|
225
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
226
|
+
"""
|
|
227
|
+
self._energized_loops = None
|
|
228
|
+
return self
|
|
229
|
+
|
|
230
|
+
def num_circuits(self):
|
|
231
|
+
"""
|
|
232
|
+
Returns The number of `Circuit`s associated with this `Substation`
|
|
233
|
+
"""
|
|
234
|
+
return nlen(self._circuits)
|
|
235
|
+
|
|
236
|
+
def get_circuit(self, mrid: str) -> Circuit:
|
|
237
|
+
"""
|
|
238
|
+
Get the `Circuit` for this `Substation` identified by `mrid`
|
|
239
|
+
|
|
240
|
+
`mrid` The mRID of the required `Circuit`
|
|
241
|
+
Returns The `Circuit` with the specified `mrid` if it exists
|
|
242
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
243
|
+
"""
|
|
244
|
+
return get_by_mrid(self._circuits, mrid)
|
|
245
|
+
|
|
246
|
+
def add_circuit(self, circuit: Circuit) -> Substation:
|
|
247
|
+
"""
|
|
248
|
+
Associate a `Circuit` with this `Substation`
|
|
249
|
+
|
|
250
|
+
`circuit` The `Circuit` to associate with this `Substation`.
|
|
251
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
252
|
+
Raises `ValueError` if another `Circuit` with the same `mrid` already exists for this `Substation`.
|
|
253
|
+
"""
|
|
254
|
+
if self._validate_reference(circuit, self.get_circuit, "A Circuit"):
|
|
255
|
+
return self
|
|
256
|
+
self._circuits = list() if self._circuits is None else self._circuits
|
|
257
|
+
self._circuits.append(circuit)
|
|
258
|
+
return self
|
|
259
|
+
|
|
260
|
+
def remove_circuit(self, circuit: Circuit) -> Substation:
|
|
261
|
+
"""
|
|
262
|
+
Disassociate `circuit` from this `Substation`
|
|
263
|
+
|
|
264
|
+
`circuit` The `Circuit` to disassociate from this `Substation`.
|
|
265
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
266
|
+
Raises `ValueError` if `circuit` was not associated with this `Substation`.
|
|
267
|
+
"""
|
|
268
|
+
self._circuits = safe_remove(self._circuits, circuit)
|
|
269
|
+
return self
|
|
270
|
+
|
|
271
|
+
def clear_circuits(self) -> Substation:
|
|
272
|
+
"""
|
|
273
|
+
Clear all current `Circuit`s.
|
|
274
|
+
Returns A reference to this `Substation` to allow fluent use.
|
|
275
|
+
"""
|
|
276
|
+
self._circuits = None
|
|
277
|
+
return self
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Optional, Generator
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
from weakref import ref, ReferenceType
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.ac_dc_terminal import AcDcTerminal
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
14
|
+
from zepben.ewb.model.cim.iec61970.base.core.phase_code import PhaseCode
|
|
15
|
+
from zepben.ewb.model.cim.iec61970.base.wires.busbar_section import BusbarSection
|
|
16
|
+
from zepben.ewb.model.phases import TracedPhases
|
|
17
|
+
from zepben.ewb.services.network.tracing.feeder.feeder_direction import FeederDirection
|
|
18
|
+
from zepben.ewb.services.network.tracing.phases.phase_status import PhaseStatus, NormalPhases, CurrentPhases
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from zepben.ewb.model.cim.iec61970.base.core.conducting_equipment import ConductingEquipment
|
|
22
|
+
from zepben.ewb.model.cim.iec61970.base.core.connectivity_node import ConnectivityNode
|
|
23
|
+
|
|
24
|
+
__all__ = ["Terminal"]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Terminal(AcDcTerminal):
|
|
28
|
+
"""
|
|
29
|
+
An AC electrical connection point to a piece of conducting equipment. Terminals are connected at physical connection points called connectivity nodes.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
_conducting_equipment: Optional[ConductingEquipment] = None
|
|
33
|
+
"""The conducting equipment of the terminal. Conducting equipment have terminals that may be connected to other conducting equipment terminals via
|
|
34
|
+
connectivity nodes."""
|
|
35
|
+
|
|
36
|
+
phases: PhaseCode = PhaseCode.ABC
|
|
37
|
+
"""Represents the normal network phasing condition. If the attribute is missing three phases (ABC) shall be assumed."""
|
|
38
|
+
|
|
39
|
+
traced_phases: TracedPhases = TracedPhases()
|
|
40
|
+
"""the phase object representing the traced phases in both the normal and current network. If properly configured you would expect the normal state phases
|
|
41
|
+
to match those in `phases`"""
|
|
42
|
+
|
|
43
|
+
sequence_number: int = 0
|
|
44
|
+
"""The orientation of the terminal connections for a multiple terminal conducting equipment. The sequence numbering starts with 1 and additional
|
|
45
|
+
terminals should follow in increasing order. The first terminal is the "starting point" for a two terminal branch."""
|
|
46
|
+
|
|
47
|
+
normal_feeder_direction: FeederDirection = FeederDirection.NONE
|
|
48
|
+
""" Stores the direction of the feeder head relative to this [Terminal] in the normal state of the network.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
current_feeder_direction: FeederDirection = FeederDirection.NONE
|
|
52
|
+
""" Stores the direction of the feeder head relative to this [Terminal] in the current state of the network.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
_cn: Optional[ReferenceType] = None
|
|
56
|
+
"""This is a weak reference to the connectivity node so if a Network object goes out of scope, holding a single conducting equipment
|
|
57
|
+
reference does not cause everything connected to it in the network to stay in memory."""
|
|
58
|
+
|
|
59
|
+
def __init__(self, conducting_equipment: ConductingEquipment = None, connectivity_node: ConnectivityNode = None, **kwargs):
|
|
60
|
+
super(Terminal, self).__init__(**kwargs)
|
|
61
|
+
if conducting_equipment:
|
|
62
|
+
self.conducting_equipment = conducting_equipment
|
|
63
|
+
|
|
64
|
+
# We set the connectivity node to itself if the name parameter is not used to make sure the positional argument is wrapped in a reference.
|
|
65
|
+
if connectivity_node:
|
|
66
|
+
self.connectivity_node = connectivity_node
|
|
67
|
+
else:
|
|
68
|
+
self.connectivity_node = self._cn
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def normal_phases(self) -> PhaseStatus:
|
|
72
|
+
""" Convenience method for accessing the normal phases"""
|
|
73
|
+
return NormalPhases(self)
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def current_phases(self) -> PhaseStatus:
|
|
77
|
+
""" Convenience method for accessing the current phases"""
|
|
78
|
+
return CurrentPhases(self)
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def conducting_equipment(self):
|
|
82
|
+
"""
|
|
83
|
+
The conducting equipment of the terminal. Conducting equipment have terminals that may be connected to other conducting equipment terminals via
|
|
84
|
+
connectivity nodes.
|
|
85
|
+
"""
|
|
86
|
+
return self._conducting_equipment
|
|
87
|
+
|
|
88
|
+
@conducting_equipment.setter
|
|
89
|
+
def conducting_equipment(self, ce):
|
|
90
|
+
if self._conducting_equipment is None or self._conducting_equipment is ce:
|
|
91
|
+
self._conducting_equipment = ce
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError(f"conducting_equipment for {str(self)} has already been set to {self._conducting_equipment}, cannot reset this field to {ce}")
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def connectivity_node(self) -> Optional[ConnectivityNode]:
|
|
97
|
+
if self._cn:
|
|
98
|
+
return self._cn()
|
|
99
|
+
else:
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
@connectivity_node.setter
|
|
103
|
+
def connectivity_node(self, cn: Optional[ConnectivityNode]):
|
|
104
|
+
if cn:
|
|
105
|
+
self._cn = ref(cn)
|
|
106
|
+
else:
|
|
107
|
+
self._cn = None
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def connected(self) -> bool:
|
|
111
|
+
if self.connectivity_node:
|
|
112
|
+
return True
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def connectivity_node_id(self):
|
|
117
|
+
return self.connectivity_node.mrid if self.connectivity_node is not None else None
|
|
118
|
+
|
|
119
|
+
def __repr__(self):
|
|
120
|
+
return f"Terminal{{{self.mrid}}}"
|
|
121
|
+
|
|
122
|
+
def get_switch(self):
|
|
123
|
+
"""
|
|
124
|
+
Get any associated switch for this Terminal
|
|
125
|
+
Returns Switch if present in this terminals ConnectivityNode, else None
|
|
126
|
+
"""
|
|
127
|
+
return self.connectivity_node.get_switch()
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def base_voltage(self):
|
|
131
|
+
return self.conducting_equipment.get_base_voltage(self)
|
|
132
|
+
|
|
133
|
+
def connected_terminals(self) -> Generator[Terminal]:
|
|
134
|
+
"""
|
|
135
|
+
Get the terminals that are connected to this `Terminal`.
|
|
136
|
+
|
|
137
|
+
:return: A `Generator` of terminals that are connected to this `Terminal`.
|
|
138
|
+
"""
|
|
139
|
+
for t in self.connectivity_node.terminals if self.connectivity_node else []:
|
|
140
|
+
if t is not self:
|
|
141
|
+
yield t
|
|
142
|
+
|
|
143
|
+
def other_terminals(self) -> Generator[Terminal]:
|
|
144
|
+
"""
|
|
145
|
+
* Get the terminals that share the same `ConductingEquipment` as this `Terminal`.
|
|
146
|
+
*
|
|
147
|
+
:return: A `Generator` of terminals that share the same `ConductingEquipment` as this `Terminal`.
|
|
148
|
+
"""
|
|
149
|
+
for t in self.conducting_equipment.terminals:
|
|
150
|
+
if t is not self:
|
|
151
|
+
yield t
|
|
152
|
+
|
|
153
|
+
def connect(self, connectivity_node: ConnectivityNode):
|
|
154
|
+
self.connectivity_node = connectivity_node
|
|
155
|
+
|
|
156
|
+
def disconnect(self):
|
|
157
|
+
self.connectivity_node = None
|
|
158
|
+
|
|
159
|
+
def is_feeder_head_terminal(self):
|
|
160
|
+
if self.conducting_equipment is None:
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
for feeder in filter(lambda c: isinstance(c, Feeder), self.conducting_equipment.containers):
|
|
164
|
+
if feeder.normal_head_terminal == self:
|
|
165
|
+
return True
|
|
166
|
+
|
|
167
|
+
def has_connected_busbars(self):
|
|
168
|
+
try:
|
|
169
|
+
return any(it != self and isinstance(it.conducting_equipment, BusbarSection) for it in self.connectivity_node.terminals) == True
|
|
170
|
+
except AttributeError:
|
|
171
|
+
return False
|