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,199 @@
|
|
|
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__ = ['EquipmentContainer']
|
|
9
|
+
|
|
10
|
+
from typing import Optional, Dict, Generator, List, TYPE_CHECKING, TypeVar
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.connectivity_node_container import ConnectivityNodeContainer
|
|
13
|
+
from zepben.ewb.util import nlen, ngen, safe_remove_by_id
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment import Equipment
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
18
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_feeder import LvFeeder
|
|
19
|
+
|
|
20
|
+
T = TypeVar("T")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EquipmentContainer(ConnectivityNodeContainer):
|
|
24
|
+
"""
|
|
25
|
+
A modeling construct to provide a root class for containing equipment.
|
|
26
|
+
Unless overridden, all functions operating on currentEquipment simply operate on the equipment collection. i.e. currentEquipment = equipment
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
_equipment: Optional[Dict[str, Equipment]] = None
|
|
30
|
+
"""Map of Equipment in this EquipmentContainer by their mRID"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, equipment: List[Equipment] = None, **kwargs):
|
|
33
|
+
super(EquipmentContainer, self).__init__(**kwargs)
|
|
34
|
+
if equipment:
|
|
35
|
+
for eq in equipment:
|
|
36
|
+
self.add_equipment(eq)
|
|
37
|
+
|
|
38
|
+
def num_equipment(self):
|
|
39
|
+
"""
|
|
40
|
+
Returns The number of `Equipment` associated with this `EquipmentContainer`
|
|
41
|
+
"""
|
|
42
|
+
return nlen(self._equipment)
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def equipment(self) -> Generator[Equipment, None, None]:
|
|
46
|
+
"""
|
|
47
|
+
The `Equipment` contained in this `EquipmentContainer`
|
|
48
|
+
"""
|
|
49
|
+
return ngen(self._equipment.values() if self._equipment is not None else None)
|
|
50
|
+
|
|
51
|
+
def get_equipment(self, mrid: str) -> Equipment:
|
|
52
|
+
"""
|
|
53
|
+
Get the `Equipment` for this `EquipmentContainer` identified by `mrid`
|
|
54
|
+
|
|
55
|
+
`mrid` the mRID of the required `Equipment`
|
|
56
|
+
Returns The `Equipment` with the specified `mrid` if it exists
|
|
57
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
58
|
+
"""
|
|
59
|
+
if not self._equipment:
|
|
60
|
+
raise KeyError(mrid)
|
|
61
|
+
try:
|
|
62
|
+
return self._equipment[mrid]
|
|
63
|
+
except AttributeError:
|
|
64
|
+
raise KeyError(mrid)
|
|
65
|
+
|
|
66
|
+
def add_equipment(self, equipment: Equipment) -> EquipmentContainer:
|
|
67
|
+
"""
|
|
68
|
+
Associate `equipment` with this `EquipmentContainer`.
|
|
69
|
+
|
|
70
|
+
`equipment` The `Equipment` to associate with this `EquipmentContainer`.
|
|
71
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
72
|
+
Raises `ValueError` if another `Equipment` with the same `mrid` already exists for this `EquipmentContainer`.
|
|
73
|
+
"""
|
|
74
|
+
if self._validate_reference(equipment, self.get_equipment, "An Equipment"):
|
|
75
|
+
return self
|
|
76
|
+
if self._equipment is None:
|
|
77
|
+
self._equipment = dict()
|
|
78
|
+
self._equipment[equipment.mrid] = equipment
|
|
79
|
+
return self
|
|
80
|
+
|
|
81
|
+
def remove_equipment(self, equipment: Equipment) -> EquipmentContainer:
|
|
82
|
+
"""
|
|
83
|
+
Disassociate `equipment` from this `EquipmentContainer`
|
|
84
|
+
|
|
85
|
+
`equipment` The `Equipment` to disassociate with this `EquipmentContainer`.
|
|
86
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
87
|
+
Raises `KeyError` if `equipment` was not associated with this `EquipmentContainer`.
|
|
88
|
+
"""
|
|
89
|
+
self._equipment = safe_remove_by_id(self._equipment, equipment)
|
|
90
|
+
return self
|
|
91
|
+
|
|
92
|
+
def clear_equipment(self) -> EquipmentContainer:
|
|
93
|
+
"""
|
|
94
|
+
Clear all equipment.
|
|
95
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
96
|
+
"""
|
|
97
|
+
self._equipment = None
|
|
98
|
+
return self
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def current_equipment(self) -> Generator[Equipment, None, None]:
|
|
102
|
+
"""
|
|
103
|
+
Contained `Equipment` using the current state of the network.
|
|
104
|
+
"""
|
|
105
|
+
return self.equipment
|
|
106
|
+
|
|
107
|
+
def num_current_equipment(self) -> int:
|
|
108
|
+
"""
|
|
109
|
+
Returns The number of `Equipment` contained in this `EquipmentContainer` in the current state of the network.
|
|
110
|
+
"""
|
|
111
|
+
return self.num_equipment()
|
|
112
|
+
|
|
113
|
+
def get_current_equipment(self, mrid: str) -> Equipment:
|
|
114
|
+
"""
|
|
115
|
+
Get the `Equipment` contained in this `EquipmentContainer` in the current state of the network, identified by `mrid`
|
|
116
|
+
|
|
117
|
+
`mrid` The mRID of the required `Equipment`
|
|
118
|
+
Returns The `Equipment` with the specified `mrid` if it exists
|
|
119
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
120
|
+
"""
|
|
121
|
+
return self.get_equipment(mrid)
|
|
122
|
+
|
|
123
|
+
def add_current_equipment(self, equipment: Equipment) -> EquipmentContainer:
|
|
124
|
+
"""
|
|
125
|
+
Associate `equipment` with this `EquipmentContainer` in the current state of the network.
|
|
126
|
+
|
|
127
|
+
`equipment` the `Equipment` to associate with this `EquipmentContainer` in the current state of the network.
|
|
128
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
129
|
+
Raises `ValueError` if another `Equipment` with the same `mrid` already exists for this `EquipmentContainer`.
|
|
130
|
+
"""
|
|
131
|
+
self.add_equipment(equipment)
|
|
132
|
+
return self
|
|
133
|
+
|
|
134
|
+
def remove_current_equipment(self, equipment: Equipment) -> EquipmentContainer:
|
|
135
|
+
"""
|
|
136
|
+
Disassociate `equipment` from this `EquipmentContainer` in the current state of the network.
|
|
137
|
+
|
|
138
|
+
`equipment` The `Equipment` to disassociate from this `EquipmentContainer` in the current state of the network.
|
|
139
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
140
|
+
Raises `KeyError` if `equipment` was not associated with this `EquipmentContainer`.
|
|
141
|
+
"""
|
|
142
|
+
self.remove_equipment(equipment)
|
|
143
|
+
return self
|
|
144
|
+
|
|
145
|
+
def clear_current_equipment(self) -> EquipmentContainer:
|
|
146
|
+
"""
|
|
147
|
+
Clear all `Equipment` from this `EquipmentContainer` in the current state of the network.
|
|
148
|
+
Returns A reference to this `EquipmentContainer` to allow fluent use.
|
|
149
|
+
"""
|
|
150
|
+
self.clear_equipment()
|
|
151
|
+
return self
|
|
152
|
+
|
|
153
|
+
def current_feeders(self) -> Generator[Feeder, None, None]:
|
|
154
|
+
"""
|
|
155
|
+
Convenience function to find all of the current feeders of the equipment associated with this equipment container.
|
|
156
|
+
Returns the current feeders for all associated feeders
|
|
157
|
+
"""
|
|
158
|
+
seen = set()
|
|
159
|
+
for equip in self._equipment.values():
|
|
160
|
+
for f in equip.current_feeders:
|
|
161
|
+
if f not in seen:
|
|
162
|
+
seen.add(f.mrid)
|
|
163
|
+
yield f
|
|
164
|
+
|
|
165
|
+
def normal_feeders(self) -> Generator[Feeder, None, None]:
|
|
166
|
+
"""
|
|
167
|
+
Convenience function to find all of the normal feeders of the equipment associated with this equipment container.
|
|
168
|
+
Returns the normal feeders for all associated feeders
|
|
169
|
+
"""
|
|
170
|
+
seen = set()
|
|
171
|
+
for equip in self._equipment.values():
|
|
172
|
+
for f in equip.normal_feeders:
|
|
173
|
+
if f not in seen:
|
|
174
|
+
seen.add(f.mrid)
|
|
175
|
+
yield f
|
|
176
|
+
|
|
177
|
+
def current_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
178
|
+
"""
|
|
179
|
+
Convenience function to find all of the normal LV feeders of the equipment associated with this equipment container.
|
|
180
|
+
Returns the normal LV feeders for all associated LV feeders
|
|
181
|
+
"""
|
|
182
|
+
seen = set()
|
|
183
|
+
for equip in self._equipment.values():
|
|
184
|
+
for f in equip.current_lv_feeders:
|
|
185
|
+
if f not in seen:
|
|
186
|
+
seen.add(f.mrid)
|
|
187
|
+
yield f
|
|
188
|
+
|
|
189
|
+
def normal_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
190
|
+
"""
|
|
191
|
+
Convenience function to find all the normal LV feeders of the equipment associated with this equipment container.
|
|
192
|
+
Returns the normal LV feeders for all associated LV feeders
|
|
193
|
+
"""
|
|
194
|
+
seen = set()
|
|
195
|
+
for equip in self._equipment.values():
|
|
196
|
+
for f in equip.normal_lv_feeders:
|
|
197
|
+
if f not in seen:
|
|
198
|
+
seen.add(f.mrid)
|
|
199
|
+
yield f
|
|
@@ -0,0 +1,260 @@
|
|
|
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__ = ["Feeder"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, Dict, List, Generator, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment_container import EquipmentContainer
|
|
13
|
+
from zepben.ewb.util import ngen, nlen, safe_remove_by_id
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_feeder import LvFeeder
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment import Equipment
|
|
18
|
+
from zepben.ewb.model.cim.iec61970.base.core.substation import Substation
|
|
19
|
+
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Feeder(EquipmentContainer):
|
|
23
|
+
"""
|
|
24
|
+
A collection of equipment for organizational purposes, used for grouping distribution resources.
|
|
25
|
+
The organization of a feeder does not necessarily reflect connectivity or current operation state.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
_normal_head_terminal: Optional[Terminal] = None
|
|
29
|
+
"""The normal head terminal or terminals of the feeder."""
|
|
30
|
+
|
|
31
|
+
normal_energizing_substation: Optional[Substation] = None
|
|
32
|
+
"""The substation that nominally energizes the feeder. Also used for naming purposes."""
|
|
33
|
+
|
|
34
|
+
_current_equipment: Optional[Dict[str, Equipment]] = None
|
|
35
|
+
"""The equipment contained in this feeder in the current state of the network."""
|
|
36
|
+
|
|
37
|
+
_normal_energized_lv_feeders: Optional[Dict[str, LvFeeder]] = None
|
|
38
|
+
"""The LV feeders that are energized by this feeder in the normal state of the network."""
|
|
39
|
+
|
|
40
|
+
_current_energized_lv_feeders: Optional[Dict[str, LvFeeder]] = None
|
|
41
|
+
"""The LV feeders that are energized by this feeder in the current state of the network."""
|
|
42
|
+
|
|
43
|
+
def __init__(
|
|
44
|
+
self,
|
|
45
|
+
normal_head_terminal: Terminal = None,
|
|
46
|
+
normal_energizing_substation: Substation = None,
|
|
47
|
+
current_equipment: List[Equipment] = None,
|
|
48
|
+
normal_energized_lv_feeders: List[LvFeeder] = None,
|
|
49
|
+
current_energized_lv_feeders: List[LvFeeder] = None,
|
|
50
|
+
**kwargs
|
|
51
|
+
):
|
|
52
|
+
super(Feeder, self).__init__(**kwargs)
|
|
53
|
+
if normal_head_terminal:
|
|
54
|
+
self.normal_head_terminal = normal_head_terminal
|
|
55
|
+
if normal_energizing_substation:
|
|
56
|
+
self.normal_energizing_substation = normal_energizing_substation
|
|
57
|
+
if normal_energized_lv_feeders:
|
|
58
|
+
for lv_feeder in normal_energized_lv_feeders:
|
|
59
|
+
self.add_normal_energized_lv_feeder(lv_feeder)
|
|
60
|
+
if current_equipment:
|
|
61
|
+
for eq in current_equipment:
|
|
62
|
+
self.add_current_equipment(eq)
|
|
63
|
+
if current_energized_lv_feeders:
|
|
64
|
+
for lv_feeder in current_energized_lv_feeders:
|
|
65
|
+
self.add_current_energized_lv_feeder(lv_feeder)
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def normal_head_terminal(self) -> Optional[Terminal]:
|
|
69
|
+
"""The normal head terminal or terminals of the feeder."""
|
|
70
|
+
return self._normal_head_terminal
|
|
71
|
+
|
|
72
|
+
@normal_head_terminal.setter
|
|
73
|
+
def normal_head_terminal(self, term: Optional[Terminal]):
|
|
74
|
+
if self._normal_head_terminal is None or self._normal_head_terminal is term or (self.num_equipment() == 0 and self.num_current_equipment() == 0):
|
|
75
|
+
self._normal_head_terminal = term
|
|
76
|
+
else:
|
|
77
|
+
raise ValueError(f"Feeder {self.mrid} has equipment assigned to it. Cannot update normalHeadTerminal on a feeder with equipment assigned.")
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def current_equipment(self) -> Generator[Equipment, None, None]:
|
|
81
|
+
"""
|
|
82
|
+
Contained `Equipment` using the current state of the network.
|
|
83
|
+
"""
|
|
84
|
+
return ngen(self._current_equipment.values() if self._current_equipment is not None else None)
|
|
85
|
+
|
|
86
|
+
def num_current_equipment(self):
|
|
87
|
+
"""
|
|
88
|
+
Returns The number of `Equipment` associated with this `Feeder`
|
|
89
|
+
"""
|
|
90
|
+
return nlen(self._current_equipment)
|
|
91
|
+
|
|
92
|
+
def get_current_equipment(self, mrid: str) -> Equipment:
|
|
93
|
+
"""
|
|
94
|
+
Get the `Equipment` for this `Feeder` identified by `mrid`
|
|
95
|
+
|
|
96
|
+
`mrid` The mRID of the required `Equipment`
|
|
97
|
+
Returns The `Equipment` with the specified `mrid` if it exists
|
|
98
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
99
|
+
"""
|
|
100
|
+
if not self._current_equipment:
|
|
101
|
+
raise KeyError(mrid)
|
|
102
|
+
try:
|
|
103
|
+
return self._current_equipment[mrid]
|
|
104
|
+
except AttributeError:
|
|
105
|
+
raise KeyError(mrid)
|
|
106
|
+
|
|
107
|
+
def add_current_equipment(self, equipment: Equipment) -> Feeder:
|
|
108
|
+
"""
|
|
109
|
+
Associate `equipment` with this `Feeder`.
|
|
110
|
+
|
|
111
|
+
`equipment` the `Equipment` to associate with this `Feeder`.
|
|
112
|
+
Returns A reference to this `Feeder` to allow fluent use.
|
|
113
|
+
Raises `ValueError` if another `Equipment` with the same `mrid` already exists for this `Feeder`.
|
|
114
|
+
"""
|
|
115
|
+
if self._validate_reference(equipment, self.get_current_equipment, "An Equipment"):
|
|
116
|
+
return self
|
|
117
|
+
self._current_equipment = dict() if self._current_equipment is None else self._current_equipment
|
|
118
|
+
self._current_equipment[equipment.mrid] = equipment
|
|
119
|
+
return self
|
|
120
|
+
|
|
121
|
+
def remove_current_equipment(self, equipment: Equipment) -> Feeder:
|
|
122
|
+
"""
|
|
123
|
+
Disassociate `equipment` from this `Feeder`
|
|
124
|
+
|
|
125
|
+
`equipment` The `Equipment` to disassociate from this `Feeder`.
|
|
126
|
+
Returns A reference to this `Feeder` to allow fluent use.
|
|
127
|
+
Raises `KeyError` if `equipment` was not associated with this `Feeder`.
|
|
128
|
+
"""
|
|
129
|
+
self._current_equipment = safe_remove_by_id(self._current_equipment, equipment)
|
|
130
|
+
return self
|
|
131
|
+
|
|
132
|
+
def clear_current_equipment(self) -> Feeder:
|
|
133
|
+
"""
|
|
134
|
+
Clear all equipment.
|
|
135
|
+
Returns A reference to this `Feeder` to allow fluent use.
|
|
136
|
+
"""
|
|
137
|
+
self._current_equipment = None
|
|
138
|
+
return self
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def normal_energized_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
142
|
+
"""
|
|
143
|
+
The LV feeders that are normally energized by this feeder.
|
|
144
|
+
"""
|
|
145
|
+
return ngen(self._normal_energized_lv_feeders.values() if self._normal_energized_lv_feeders is not None else None)
|
|
146
|
+
|
|
147
|
+
def num_normal_energized_lv_feeders(self) -> int:
|
|
148
|
+
"""
|
|
149
|
+
Get the number of LV feeders that are normally energized by this feeder.
|
|
150
|
+
"""
|
|
151
|
+
return nlen(self._normal_energized_lv_feeders)
|
|
152
|
+
|
|
153
|
+
def get_normal_energized_lv_feeder(self, mrid: str) -> LvFeeder:
|
|
154
|
+
"""
|
|
155
|
+
Energized LvFeeder in the normal state of the network.
|
|
156
|
+
|
|
157
|
+
@param mrid: The mrid of the `LvFeeder`.
|
|
158
|
+
@return A matching `LvFeeder` that is energized by this `Feeder` in the normal state of the network.
|
|
159
|
+
@raise A `KeyError` if no matching `LvFeeder` was found.
|
|
160
|
+
"""
|
|
161
|
+
if not self._normal_energized_lv_feeders:
|
|
162
|
+
raise KeyError(mrid)
|
|
163
|
+
try:
|
|
164
|
+
return self._normal_energized_lv_feeders[mrid]
|
|
165
|
+
except AttributeError:
|
|
166
|
+
raise KeyError(mrid)
|
|
167
|
+
|
|
168
|
+
def add_normal_energized_lv_feeder(self, lv_feeder: LvFeeder) -> Feeder:
|
|
169
|
+
"""
|
|
170
|
+
Associate this `Feeder` with an `LvFeeder` in the normal state of the network.
|
|
171
|
+
|
|
172
|
+
@param lv_feeder: the LV feeder to associate with this feeder in the normal state of the network.
|
|
173
|
+
@return: This `Feeder` for fluent use.
|
|
174
|
+
"""
|
|
175
|
+
if self._validate_reference(lv_feeder, self.get_normal_energized_lv_feeder, "An LvFeeder"):
|
|
176
|
+
return self
|
|
177
|
+
self._normal_energized_lv_feeders = dict() if self._normal_energized_lv_feeders is None else self._normal_energized_lv_feeders
|
|
178
|
+
self._normal_energized_lv_feeders[lv_feeder.mrid] = lv_feeder
|
|
179
|
+
return self
|
|
180
|
+
|
|
181
|
+
def remove_normal_energized_lv_feeder(self, lv_feeder: LvFeeder) -> Feeder:
|
|
182
|
+
"""
|
|
183
|
+
Disassociate this `Feeder` from an `LvFeeder` in the normal state of the network.
|
|
184
|
+
|
|
185
|
+
@param lv_feeder: the LV feeder to disassociate from this feeder in the normal state of the network.
|
|
186
|
+
@return: This `Feeder` for fluent use.
|
|
187
|
+
@raise: A `ValueError` if `lv_feeder` is not found in the normal energized lv feeders collection.
|
|
188
|
+
"""
|
|
189
|
+
self._normal_energized_lv_feeders = safe_remove_by_id(self._normal_energized_lv_feeders, lv_feeder)
|
|
190
|
+
return self
|
|
191
|
+
|
|
192
|
+
def clear_normal_energized_lv_feeders(self) -> Feeder:
|
|
193
|
+
"""
|
|
194
|
+
Clear all `LvFeeder`s associated with `Feeder` in the normal state of the network.
|
|
195
|
+
|
|
196
|
+
@return: This `Feeder` for fluent use.
|
|
197
|
+
"""
|
|
198
|
+
self._normal_energized_lv_feeders = None
|
|
199
|
+
return self
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def current_energized_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
203
|
+
"""
|
|
204
|
+
The LV feeders that are currently energized by this feeder.
|
|
205
|
+
"""
|
|
206
|
+
return ngen(self._current_energized_lv_feeders.values() if self._current_energized_lv_feeders is not None else self._current_energized_lv_feeders)
|
|
207
|
+
|
|
208
|
+
def num_current_energized_lv_feeders(self) -> int:
|
|
209
|
+
"""
|
|
210
|
+
Get the number of LV feeders that are currently energized by this feeder.
|
|
211
|
+
"""
|
|
212
|
+
return nlen(self._current_energized_lv_feeders)
|
|
213
|
+
|
|
214
|
+
def get_current_energized_lv_feeder(self, mrid: str) -> LvFeeder:
|
|
215
|
+
"""
|
|
216
|
+
Energized LvFeeder in the current state of the network.
|
|
217
|
+
|
|
218
|
+
@param mrid: The mrid of the `LvFeeder`.
|
|
219
|
+
@return A matching `LvFeeder` that is energized by this `Feeder` in the current state of the network.
|
|
220
|
+
@raise A `KeyError` if no matching `LvFeeder` was found.
|
|
221
|
+
"""
|
|
222
|
+
if not self._current_energized_lv_feeders:
|
|
223
|
+
raise KeyError(mrid)
|
|
224
|
+
try:
|
|
225
|
+
return self._current_energized_lv_feeders[mrid]
|
|
226
|
+
except AttributeError:
|
|
227
|
+
raise KeyError(mrid)
|
|
228
|
+
|
|
229
|
+
def add_current_energized_lv_feeder(self, lv_feeder: LvFeeder) -> Feeder:
|
|
230
|
+
"""
|
|
231
|
+
Associate this `Feeder` with an `LvFeeder` in the current state of the network.
|
|
232
|
+
|
|
233
|
+
@param lv_feeder: the LV feeder to associate with this feeder in the current state of the network.
|
|
234
|
+
@return: This `Feeder` for fluent use.
|
|
235
|
+
"""
|
|
236
|
+
if self._validate_reference(lv_feeder, self.get_current_energized_lv_feeder, "An LvFeeder"):
|
|
237
|
+
return self
|
|
238
|
+
self._current_energized_lv_feeders = dict() if self._current_energized_lv_feeders is None else self._current_energized_lv_feeders
|
|
239
|
+
self._current_energized_lv_feeders[lv_feeder.mrid] = lv_feeder
|
|
240
|
+
return self
|
|
241
|
+
|
|
242
|
+
def remove_current_energized_lv_feeder(self, lv_feeder: LvFeeder) -> Feeder:
|
|
243
|
+
"""
|
|
244
|
+
Disassociate this `Feeder` from an `LvFeeder` in the current state of the network.
|
|
245
|
+
|
|
246
|
+
@param lv_feeder: the LV feeder to disassociate from this feeder in the current state of the network.
|
|
247
|
+
@return: This `Feeder` for fluent use.
|
|
248
|
+
@raise: A `ValueError` if `lv_feeder` is not found in the current energized lv feeders collection.
|
|
249
|
+
"""
|
|
250
|
+
self._current_energized_lv_feeders = safe_remove_by_id(self._current_energized_lv_feeders, lv_feeder)
|
|
251
|
+
return self
|
|
252
|
+
|
|
253
|
+
def clear_current_energized_lv_feeders(self) -> Feeder:
|
|
254
|
+
"""
|
|
255
|
+
Clear all `LvFeeder`s associated with `Feeder` in the current state of the network.
|
|
256
|
+
|
|
257
|
+
@return: This `Feeder` for fluent use.
|
|
258
|
+
"""
|
|
259
|
+
self._current_energized_lv_feeders = None
|
|
260
|
+
return self
|
|
@@ -0,0 +1,82 @@
|
|
|
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__ = ["GeographicalRegion"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, List, Generator
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.core.sub_geographical_region import SubGeographicalRegion
|
|
14
|
+
from zepben.ewb.util import nlen, ngen, get_by_mrid, safe_remove
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GeographicalRegion(IdentifiedObject):
|
|
18
|
+
"""
|
|
19
|
+
A geographical region of a power system network phases.
|
|
20
|
+
"""
|
|
21
|
+
_sub_geographical_regions: Optional[List[SubGeographicalRegion]] = None
|
|
22
|
+
|
|
23
|
+
def __init__(self, sub_geographical_regions: List[SubGeographicalRegion] = None, **kwargs):
|
|
24
|
+
super(GeographicalRegion, self).__init__(**kwargs)
|
|
25
|
+
if sub_geographical_regions:
|
|
26
|
+
for sgr in sub_geographical_regions:
|
|
27
|
+
self.add_sub_geographical_region(sgr)
|
|
28
|
+
|
|
29
|
+
def num_sub_geographical_regions(self) -> int:
|
|
30
|
+
"""
|
|
31
|
+
Returns The number of `SubGeographicalRegion`s associated with this `GeographicalRegion`
|
|
32
|
+
"""
|
|
33
|
+
return nlen(self._sub_geographical_regions)
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def sub_geographical_regions(self) -> Generator[SubGeographicalRegion, None, None]:
|
|
37
|
+
"""
|
|
38
|
+
The `SubGeographicalRegion`s of this `GeographicalRegion`.
|
|
39
|
+
"""
|
|
40
|
+
return ngen(self._sub_geographical_regions)
|
|
41
|
+
|
|
42
|
+
def get_sub_geographical_region(self, mrid: str) -> SubGeographicalRegion:
|
|
43
|
+
"""
|
|
44
|
+
Get the `SubGeographicalRegion` for this `GeographicalRegion` identified by `mrid`
|
|
45
|
+
|
|
46
|
+
`mrid` The mRID of the required `SubGeographicalRegion`
|
|
47
|
+
Returns The `SubGeographicalRegion` with the specified `mrid` if it exists
|
|
48
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
49
|
+
"""
|
|
50
|
+
return get_by_mrid(self._sub_geographical_regions, mrid)
|
|
51
|
+
|
|
52
|
+
def add_sub_geographical_region(self, sub_geographical_region: SubGeographicalRegion) -> GeographicalRegion:
|
|
53
|
+
"""
|
|
54
|
+
Associate a `SubGeographicalRegion` with this `GeographicalRegion`
|
|
55
|
+
|
|
56
|
+
`sub_geographical_region` The `SubGeographicalRegion` to associate with this `GeographicalRegion`.
|
|
57
|
+
Returns A reference to this `GeographicalRegion` to allow fluent use.
|
|
58
|
+
Raises `ValueError` if another `SubGeographicalRegion` with the same `mrid` already exists for this `GeographicalRegion`.
|
|
59
|
+
"""
|
|
60
|
+
if self._validate_reference(sub_geographical_region, self.get_sub_geographical_region, "A SubGeographicalRegion"):
|
|
61
|
+
return self
|
|
62
|
+
self._sub_geographical_regions = list() if self._sub_geographical_regions is None else self._sub_geographical_regions
|
|
63
|
+
self._sub_geographical_regions.append(sub_geographical_region)
|
|
64
|
+
return self
|
|
65
|
+
|
|
66
|
+
def remove_sub_geographical_region(self, sub_geographical_region: SubGeographicalRegion) -> GeographicalRegion:
|
|
67
|
+
"""
|
|
68
|
+
Disassociate `sub_geographical_region` from this `GeographicalRegion`
|
|
69
|
+
`sub_geographical_region` The `SubGeographicalRegion` to disassociate from this `GeographicalRegion`.
|
|
70
|
+
Returns A reference to this `GeographicalRegion` to allow fluent use.
|
|
71
|
+
Raises `ValueError` if `sub_geographical_region` was not associated with this `GeographicalRegion`.
|
|
72
|
+
"""
|
|
73
|
+
self._sub_geographical_regions = safe_remove(self._sub_geographical_regions, sub_geographical_region)
|
|
74
|
+
return self
|
|
75
|
+
|
|
76
|
+
def clear_sub_geographical_regions(self) -> GeographicalRegion:
|
|
77
|
+
"""
|
|
78
|
+
Clear all SubGeographicalRegions.
|
|
79
|
+
Returns A reference to this `GeographicalRegion` to allow fluent use.
|
|
80
|
+
"""
|
|
81
|
+
self._sub_geographical_regions = None
|
|
82
|
+
return self
|