zepben.ewb 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zepben/ewb/__init__.py +601 -0
- zepben/ewb/auth/__init__.py +10 -0
- zepben/ewb/auth/client/__init__.py +5 -0
- zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
- zepben/ewb/auth/common/__init__.py +5 -0
- zepben/ewb/auth/common/auth_exception.py +16 -0
- zepben/ewb/auth/common/auth_method.py +28 -0
- zepben/ewb/auth/common/auth_provider_config.py +96 -0
- zepben/ewb/database/__init__.py +4 -0
- zepben/ewb/database/paths/__init__.py +4 -0
- zepben/ewb/database/paths/database_type.py +34 -0
- zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
- zepben/ewb/database/sql/__init__.py +4 -0
- zepben/ewb/database/sql/column.py +37 -0
- zepben/ewb/database/sql/sql_table.py +142 -0
- zepben/ewb/database/sqlite/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
- zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
- zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
- zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
- zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
- zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
- zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
- zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
- zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
- zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
- zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
- zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
- zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
- zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
- zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
- zepben/ewb/database/sqlite/customer/__init__.py +4 -0
- zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
- zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
- zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
- zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
- zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
- zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
- zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
- zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
- zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
- zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
- zepben/ewb/database/sqlite/network/__init__.py +4 -0
- zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
- zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
- zepben/ewb/database/sqlite/network/network_database_reader.py +175 -0
- zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
- zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
- zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
- zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
- zepben/ewb/database/sqlite/tables/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
- zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
- zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
- zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
- zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
- zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
- zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
- zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
- zepben/ewb/database/sqlite/tables/sqlite_table.py +45 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +39 -0
- zepben/ewb/dataclassy/__init__.py +15 -0
- zepben/ewb/dataclassy/dataclass.py +192 -0
- zepben/ewb/dataclassy/decorator.py +35 -0
- zepben/ewb/dataclassy/functions.py +80 -0
- zepben/ewb/examples/__init__.py +6 -0
- zepben/ewb/examples/simple_test_network.py +158 -0
- zepben/ewb/exceptions.py +52 -0
- zepben/ewb/model/__init__.py +4 -0
- zepben/ewb/model/busbranch/__init__.py +4 -0
- zepben/ewb/model/busbranch/bus_branch.py +1051 -0
- zepben/ewb/model/cim/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +83 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +57 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +293 -0
- zepben/ewb/model/cim/extensions/zbex.py +17 -0
- zepben/ewb/model/cim/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
- zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
- zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +57 -0
- zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
- zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
- zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
- zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
- zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
- zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
- zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
- zepben/ewb/model/cim/iec61968/common/document.py +36 -0
- zepben/ewb/model/cim/iec61968/common/location.py +129 -0
- zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
- zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
- zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
- zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
- zepben/ewb/model/cim/iec61968/common/street_detail.py +46 -0
- zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
- zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
- zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
- zepben/ewb/model/cim/iec61968/customers/customer_kind.py +69 -0
- zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
- zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
- zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +69 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +45 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +27 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
- zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +152 -0
- zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +48 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +28 -0
- zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
- zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
- zepben/ewb/model/cim/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +30 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
- zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
- zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
- zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
- zepben/ewb/model/cim/iec61970/base/core/curve.py +125 -0
- zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
- zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
- zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
- zepben/ewb/model/cim/iec61970/base/core/identified_object.py +239 -0
- zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
- zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
- zepben/ewb/model/cim/iec61970/base/core/phase_code.py +202 -0
- zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
- zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
- zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
- zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +28 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +29 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +494 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
- zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +39 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog.py +18 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
- zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
- zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
- zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
- zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
- zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
- zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
- zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
- zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
- zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
- zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +46 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +45 -0
- zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
- zepben/ewb/model/phases.py +168 -0
- zepben/ewb/model/resistance_reactance.py +40 -0
- zepben/ewb/services/__init__.py +4 -0
- zepben/ewb/services/common/__init__.py +16 -0
- zepben/ewb/services/common/base_service.py +383 -0
- zepben/ewb/services/common/base_service_comparator.py +394 -0
- zepben/ewb/services/common/difference.py +47 -0
- zepben/ewb/services/common/enum_mapper.py +55 -0
- zepben/ewb/services/common/meta/__init__.py +4 -0
- zepben/ewb/services/common/meta/data_source.py +16 -0
- zepben/ewb/services/common/meta/metadata_collection.py +28 -0
- zepben/ewb/services/common/meta/metadata_translations.py +47 -0
- zepben/ewb/services/common/meta/service_info.py +22 -0
- zepben/ewb/services/common/reference_resolvers.py +374 -0
- zepben/ewb/services/common/resolver.py +597 -0
- zepben/ewb/services/common/translator/__init__.py +4 -0
- zepben/ewb/services/common/translator/base_cim2proto.py +115 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +146 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +75 -0
- zepben/ewb/services/customer/__init__.py +4 -0
- zepben/ewb/services/customer/customer_service_comparator.py +52 -0
- zepben/ewb/services/customer/customers.py +23 -0
- zepben/ewb/services/customer/translator/__init__.py +21 -0
- zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
- zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
- zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
- zepben/ewb/services/diagram/__init__.py +4 -0
- zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
- zepben/ewb/services/diagram/diagrams.py +107 -0
- zepben/ewb/services/diagram/translator/__init__.py +11 -0
- zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
- zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
- zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
- zepben/ewb/services/measurement/__init__.py +4 -0
- zepben/ewb/services/measurement/measurements.py +35 -0
- zepben/ewb/services/measurement/translator/__init__.py +6 -0
- zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
- zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
- zepben/ewb/services/network/__init__.py +4 -0
- zepben/ewb/services/network/network_extensions.py +119 -0
- zepben/ewb/services/network/network_service.py +302 -0
- zepben/ewb/services/network/network_service_comparator.py +1322 -0
- zepben/ewb/services/network/network_state.py +36 -0
- zepben/ewb/services/network/tracing/__init__.py +4 -0
- zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
- zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
- zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
- zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
- zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
- zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
- zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
- zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
- zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
- zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
- zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
- zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
- zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
- zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +35 -0
- zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace.py +433 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +128 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
- zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
- zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
- zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
- zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
- zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
- zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
- zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
- zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
- zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
- zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
- zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
- zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
- zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
- zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
- zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
- zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
- zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
- zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
- zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
- zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
- zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
- zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
- zepben/ewb/services/network/tracing/util.py +93 -0
- zepben/ewb/services/network/translator/__init__.py +392 -0
- zepben/ewb/services/network/translator/network_cim2proto.py +1867 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2201 -0
- zepben/ewb/services/services.py +48 -0
- zepben/ewb/streaming/__init__.py +4 -0
- zepben/ewb/streaming/data/__init__.py +4 -0
- zepben/ewb/streaming/data/current_state_event.py +314 -0
- zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
- zepben/ewb/streaming/data/set_current_states_status.py +286 -0
- zepben/ewb/streaming/exceptions.py +14 -0
- zepben/ewb/streaming/get/__init__.py +4 -0
- zepben/ewb/streaming/get/consumer.py +209 -0
- zepben/ewb/streaming/get/customer_consumer.py +111 -0
- zepben/ewb/streaming/get/diagram_consumer.py +107 -0
- zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
- zepben/ewb/streaming/get/hierarchy/data.py +27 -0
- zepben/ewb/streaming/get/included_energized_containers.py +36 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +36 -0
- zepben/ewb/streaming/get/network_consumer.py +870 -0
- zepben/ewb/streaming/get/query_network_state_client.py +64 -0
- zepben/ewb/streaming/get/query_network_state_service.py +94 -0
- zepben/ewb/streaming/grpc/__init__.py +4 -0
- zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
- zepben/ewb/streaming/grpc/connect.py +209 -0
- zepben/ewb/streaming/grpc/grpc.py +107 -0
- zepben/ewb/streaming/grpc/grpc_channel_builder.py +190 -0
- zepben/ewb/streaming/mutations/__init__.py +4 -0
- zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
- zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
- zepben/ewb/testing/__init__.py +4 -0
- zepben/ewb/testing/test_network_builder.py +816 -0
- zepben/ewb/types.py +17 -0
- zepben/ewb/util.py +200 -0
- zepben_ewb-1.0.0.dist-info/METADATA +90 -0
- zepben_ewb-1.0.0.dist-info/RECORD +641 -0
- zepben_ewb-1.0.0.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,105 @@
|
|
|
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__ = ["ConnectivityNode"]
|
|
9
|
+
|
|
10
|
+
from typing import Generator, List, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.dataclassy import dataclass
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
14
|
+
from zepben.ewb.util import get_by_mrid, ngen
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.terminal import Terminal
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(slots=False)
|
|
21
|
+
class ConnectivityNode(IdentifiedObject):
|
|
22
|
+
"""
|
|
23
|
+
Connectivity nodes are points where terminals of AC conducting equipment are connected together with zero impedance.
|
|
24
|
+
"""
|
|
25
|
+
# noinspection PyDunderSlots
|
|
26
|
+
__slots__ = ["_terminals", "__weakref__"]
|
|
27
|
+
_terminals: List[Terminal] = []
|
|
28
|
+
|
|
29
|
+
def __init__(self, terminals: List[Terminal] = None, **kwargs):
|
|
30
|
+
super(ConnectivityNode, self).__init__(**kwargs)
|
|
31
|
+
if terminals:
|
|
32
|
+
for term in terminals:
|
|
33
|
+
self.add_terminal(term)
|
|
34
|
+
|
|
35
|
+
def __iter__(self):
|
|
36
|
+
return iter(self._terminals)
|
|
37
|
+
|
|
38
|
+
def num_terminals(self):
|
|
39
|
+
"""
|
|
40
|
+
Get the number of `Terminal`s for this `ConnectivityNode`.
|
|
41
|
+
"""
|
|
42
|
+
return len(self._terminals)
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def terminals(self) -> Generator[Terminal, None, None]:
|
|
46
|
+
"""
|
|
47
|
+
The `Terminal`s attached to this `ConnectivityNode`
|
|
48
|
+
"""
|
|
49
|
+
return ngen(self._terminals)
|
|
50
|
+
|
|
51
|
+
def get_terminal(self, mrid: str) -> Terminal:
|
|
52
|
+
"""
|
|
53
|
+
Get the `Terminal` for this `ConnectivityNode` identified by `mrid`
|
|
54
|
+
|
|
55
|
+
`mrid` The mRID of the required `Terminal`
|
|
56
|
+
Returns The `Terminal` with the specified `mrid` if it exists
|
|
57
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
58
|
+
"""
|
|
59
|
+
return get_by_mrid(self._terminals, mrid)
|
|
60
|
+
|
|
61
|
+
def add_terminal(self, terminal: Terminal) -> ConnectivityNode:
|
|
62
|
+
"""
|
|
63
|
+
Associate a `terminal.Terminal` with this `ConnectivityNode`
|
|
64
|
+
|
|
65
|
+
`terminal` The `Terminal` to add. Will only add to this object if it is not already associated.
|
|
66
|
+
Returns A reference to this `ConnectivityNode` to allow fluent use.
|
|
67
|
+
Raises `ValueError` if another `Terminal` with the same `mrid` already exists for this `ConnectivityNode`.
|
|
68
|
+
"""
|
|
69
|
+
if self._validate_reference(terminal, self.get_terminal, "A Terminal"):
|
|
70
|
+
return self
|
|
71
|
+
|
|
72
|
+
self._terminals.append(terminal)
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
def remove_terminal(self, terminal: Terminal) -> ConnectivityNode:
|
|
76
|
+
"""
|
|
77
|
+
Disassociate `terminal` from this `ConnectivityNode`.
|
|
78
|
+
|
|
79
|
+
`terminal` The `Terminal` to disassociate from this `ConnectivityNode`.
|
|
80
|
+
Returns A reference to this `ConnectivityNode` to allow fluent use.
|
|
81
|
+
Raises `ValueError` if `terminal` was not associated with this `ConnectivityNode`.
|
|
82
|
+
"""
|
|
83
|
+
self._terminals.remove(terminal)
|
|
84
|
+
return self
|
|
85
|
+
|
|
86
|
+
def clear_terminals(self) -> ConnectivityNode:
|
|
87
|
+
"""
|
|
88
|
+
Clear all terminals.
|
|
89
|
+
Returns A reference to this `ConnectivityNode` to allow fluent use.
|
|
90
|
+
"""
|
|
91
|
+
self._terminals.clear()
|
|
92
|
+
return self
|
|
93
|
+
|
|
94
|
+
def is_switched(self):
|
|
95
|
+
return self.get_switch() is not None
|
|
96
|
+
|
|
97
|
+
def get_switch(self):
|
|
98
|
+
for term in self._terminals:
|
|
99
|
+
try:
|
|
100
|
+
# All switches should implement is_open
|
|
101
|
+
_ = term.conducting_equipment.is_open()
|
|
102
|
+
return term.conducting_equipment
|
|
103
|
+
except AttributeError:
|
|
104
|
+
pass
|
|
105
|
+
return None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["ConnectivityNodeContainer"]
|
|
7
|
+
|
|
8
|
+
from zepben.ewb.model.cim.iec61970.base.core.power_system_resource import PowerSystemResource
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ConnectivityNodeContainer(PowerSystemResource):
|
|
12
|
+
"""
|
|
13
|
+
A base class for all objects that may contain connectivity nodes or topological nodes.
|
|
14
|
+
"""
|
|
15
|
+
pass
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["Curve"]
|
|
7
|
+
|
|
8
|
+
from typing import Optional, List, Generator
|
|
9
|
+
|
|
10
|
+
from zepben.ewb.model.cim.iec61970.base.core.curve_data import CurveData
|
|
11
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
12
|
+
from zepben.ewb.util import require, ngen, nlen, safe_remove
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Curve(IdentifiedObject):
|
|
16
|
+
"""
|
|
17
|
+
The Curve class is a multipurpose functional relationship between an independent variable (X-axis) and dependent (Y-axis) variables.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
_data: Optional[List[CurveData]] = None
|
|
21
|
+
|
|
22
|
+
def __init__(self, data: List[CurveData] = None, **kwargs):
|
|
23
|
+
"""
|
|
24
|
+
`data` A list of `CurveData`s to associate with this `Curve`.
|
|
25
|
+
"""
|
|
26
|
+
super(Curve, self).__init__(**kwargs)
|
|
27
|
+
if data:
|
|
28
|
+
for curve_data in data:
|
|
29
|
+
self.add_curve_data(curve_data)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def data(self) -> Generator[CurveData, None, None]:
|
|
33
|
+
"""
|
|
34
|
+
The point data values that define this curve, sorted by `x_value` in ascending order.
|
|
35
|
+
"""
|
|
36
|
+
return ngen(self._data)
|
|
37
|
+
|
|
38
|
+
def num_data(self):
|
|
39
|
+
"""Return the number of :class:`CurveData` associated with this :class:`Curve`."""
|
|
40
|
+
return nlen(self._data)
|
|
41
|
+
|
|
42
|
+
def get_data(self, x: float) -> CurveData:
|
|
43
|
+
"""
|
|
44
|
+
Get the :class:`CurveData` for this :class:`Curve` identified by its `x_value`.
|
|
45
|
+
|
|
46
|
+
:param x: The X value of the required :class:`CurveData`.
|
|
47
|
+
:returns: The :class:`CurveData` with the specified `x` if it exists.
|
|
48
|
+
:raises KeyError: When no `CurveData` was found with `x`.
|
|
49
|
+
"""
|
|
50
|
+
if self._data:
|
|
51
|
+
curve_data = next((it for it in self._data if it.x_value == x), None)
|
|
52
|
+
if curve_data:
|
|
53
|
+
return curve_data
|
|
54
|
+
raise KeyError(x)
|
|
55
|
+
|
|
56
|
+
def __getitem__(self, x: float) -> CurveData:
|
|
57
|
+
"""
|
|
58
|
+
Get the :class:`CurveData` for this :class:`Curve` identified by its `x_value`.
|
|
59
|
+
|
|
60
|
+
:param x: The X value of the required :class:`CurveData`.
|
|
61
|
+
:returns: The :class:`CurveData` with the specified `x` if it exists.
|
|
62
|
+
:raises IndexError: When no `CurveData` was found with `x`.
|
|
63
|
+
"""
|
|
64
|
+
return self.get_data(x)
|
|
65
|
+
|
|
66
|
+
def add_data(self, x: float, y1: float, y2: Optional[float], y3: Optional[float]) -> 'Curve':
|
|
67
|
+
"""
|
|
68
|
+
Add a data point to this :class:`Curve`.
|
|
69
|
+
|
|
70
|
+
:param x: The data value of the X-axis variable, depending on the X-axis units.
|
|
71
|
+
:param y1: The data value of the first Y-axis variable, depending on the Y-axis units.
|
|
72
|
+
:param y2: The data value of the second Y-axis variable (if present), depending on the Y-axis units.
|
|
73
|
+
:param y3: The data value of the third Y-axis variable (if present), depending on the Y-axis units.
|
|
74
|
+
:raises ValueError: if a :class:`CurveData` for the provided `x` value already exists for this :class:`Curve`.
|
|
75
|
+
"""
|
|
76
|
+
require(all([it.x_value != x for it in self.data]),
|
|
77
|
+
lambda: f"Unable to add datapoint to {self}. x_value {x} is invalid, as data with same x_value already exist in this Curve.")
|
|
78
|
+
|
|
79
|
+
if self._data is None:
|
|
80
|
+
self._data = []
|
|
81
|
+
self._data.append(CurveData(x, y1, y2, y3))
|
|
82
|
+
self._data.sort(key=lambda it: it.x_value)
|
|
83
|
+
|
|
84
|
+
return self
|
|
85
|
+
|
|
86
|
+
def add_curve_data(self, curve_data: CurveData) -> 'Curve':
|
|
87
|
+
"""
|
|
88
|
+
Associate a :class:`CurveData` with this :class:`Curve`.
|
|
89
|
+
|
|
90
|
+
:param curve_data: The :class:`CurveData` to associate with this :class:`Curve`.
|
|
91
|
+
:returns: A reference to this :class:`Curve` to allow fluent use.
|
|
92
|
+
:raises ValueError: If another :class:`CurveData` with the same `x_value` already exists for this :class:`Curve`.
|
|
93
|
+
"""
|
|
94
|
+
return self.add_data(curve_data.x_value, curve_data.y1_value, curve_data.y2_value, curve_data.y3_value)
|
|
95
|
+
|
|
96
|
+
def remove_data(self, curve_data: CurveData) -> 'Curve':
|
|
97
|
+
"""
|
|
98
|
+
Disassociate a :class:`CurveData` from this :class:`Curve`.
|
|
99
|
+
|
|
100
|
+
:param curve_data: The :class:`CurveData` to disassociate from this :class:`Curve`.
|
|
101
|
+
:returns: A reference to this :class:`Curve` to allow fluent use.
|
|
102
|
+
:raises ValueError: If `curve_data` was not associated with this :class:`Curve`.
|
|
103
|
+
"""
|
|
104
|
+
self._data = safe_remove(self._data, curve_data)
|
|
105
|
+
return self
|
|
106
|
+
|
|
107
|
+
def remove_data_at(self, x: float) -> CurveData:
|
|
108
|
+
"""
|
|
109
|
+
Disassociate a :class:`CurveData` from this :class:`Curve` based on its `x_value`.
|
|
110
|
+
|
|
111
|
+
:param x: The :class:`CurveData` to disassociate from this :class:`Curve`.
|
|
112
|
+
:returns: A reference to the removed :class:`CurveData`.
|
|
113
|
+
:raises IndexError: If no :class:`CurveData` with a value of `x` was not associated with this :class:`Curve`.
|
|
114
|
+
"""
|
|
115
|
+
data = self.get_data(x)
|
|
116
|
+
self._data = safe_remove(self._data, data)
|
|
117
|
+
return data
|
|
118
|
+
|
|
119
|
+
def clear_data(self) -> 'Curve':
|
|
120
|
+
"""
|
|
121
|
+
Clear all :class:`CurveData` associated with this :class:`Curve`.
|
|
122
|
+
:returns: A reference to this :class:`Curve` to allow fluent use.
|
|
123
|
+
"""
|
|
124
|
+
self._data = None
|
|
125
|
+
return self
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Copyright 2024 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["CurveData"]
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class CurveData:
|
|
14
|
+
"""
|
|
15
|
+
Multipurpose data points for defining a curve. The use of this generic class is discouraged if a more specific class can be used to specify the X and
|
|
16
|
+
Y axis values along with their specific data types.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
x_value: float
|
|
20
|
+
"""The data value of the X-axis variable, depending on the X-axis units."""
|
|
21
|
+
|
|
22
|
+
y1_value: float
|
|
23
|
+
"""The data value of the first Y-axis variable, depending on the Y-axis units."""
|
|
24
|
+
|
|
25
|
+
y2_value: Optional[float] = None
|
|
26
|
+
"""The data value of the second Y-axis variable (if present), depending on the Y-axis units."""
|
|
27
|
+
|
|
28
|
+
y3_value: Optional[float] = None
|
|
29
|
+
"""The data value of the third Y-axis variable (if present), depending on the Y-axis units."""
|
|
@@ -0,0 +1,366 @@
|
|
|
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__ = ['Equipment']
|
|
9
|
+
|
|
10
|
+
import datetime
|
|
11
|
+
from typing import Optional, Generator, List, TYPE_CHECKING, TypeVar, Type
|
|
12
|
+
|
|
13
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.core.site import Site
|
|
14
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.feeder.lv_feeder import LvFeeder
|
|
15
|
+
from zepben.ewb.model.cim.iec61970.base.core.feeder import Feeder
|
|
16
|
+
from zepben.ewb.model.cim.iec61970.base.core.power_system_resource import PowerSystemResource
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.substation import Substation
|
|
18
|
+
from zepben.ewb.util import nlen, get_by_mrid, ngen, safe_remove
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from zepben.ewb.model.cim.iec61968.metering.usage_point import UsagePoint
|
|
22
|
+
from zepben.ewb.model.cim.iec61968.operations.operational_restriction import OperationalRestriction
|
|
23
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment_container import EquipmentContainer
|
|
24
|
+
from zepben.ewb.services.network.tracing.networktrace.operators.network_state_operators import NetworkStateOperators
|
|
25
|
+
TEquipmentContainer = TypeVar("TEquipmentContainer", bound=EquipmentContainer)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Equipment(PowerSystemResource):
|
|
29
|
+
"""
|
|
30
|
+
Abstract class, should only be used through subclasses.
|
|
31
|
+
Any part of a power system that is a physical device, electronic or mechanical.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
in_service: bool = True
|
|
35
|
+
"""If True, the equipment is in service."""
|
|
36
|
+
normally_in_service: bool = True
|
|
37
|
+
"""If True, the equipment is _normally_ in service."""
|
|
38
|
+
commissioned_date: Optional[datetime.datetime] = None
|
|
39
|
+
"""The date this equipment was commissioned into service."""
|
|
40
|
+
|
|
41
|
+
_usage_points: Optional[List[UsagePoint]] = None
|
|
42
|
+
_equipment_containers: Optional[List[EquipmentContainer]] = None
|
|
43
|
+
_operational_restrictions: Optional[List[OperationalRestriction]] = None
|
|
44
|
+
_current_containers: Optional[List[EquipmentContainer]] = None
|
|
45
|
+
|
|
46
|
+
def __init__(self, usage_points: List[UsagePoint] = None, equipment_containers: List[EquipmentContainer] = None,
|
|
47
|
+
operational_restrictions: List[OperationalRestriction] = None, current_containers: List[EquipmentContainer] = None, **kwargs):
|
|
48
|
+
super(Equipment, self).__init__(**kwargs)
|
|
49
|
+
if usage_points:
|
|
50
|
+
for up in usage_points:
|
|
51
|
+
self.add_usage_point(up)
|
|
52
|
+
if equipment_containers:
|
|
53
|
+
for container in equipment_containers:
|
|
54
|
+
self.add_container(container)
|
|
55
|
+
if operational_restrictions:
|
|
56
|
+
for restriction in operational_restrictions:
|
|
57
|
+
self.add_operational_restriction(restriction)
|
|
58
|
+
if current_containers:
|
|
59
|
+
for cf in current_containers:
|
|
60
|
+
self.add_current_container(cf)
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def sites(self) -> Generator[Site, None, None]:
|
|
64
|
+
"""
|
|
65
|
+
The `Site`s this equipment belongs to.
|
|
66
|
+
"""
|
|
67
|
+
return ngen(_of_type(self._equipment_containers, Site))
|
|
68
|
+
|
|
69
|
+
def feeders(self, network_state_operators: Type[NetworkStateOperators]) -> Generator[Feeder, None, None]:
|
|
70
|
+
"""
|
|
71
|
+
The `Feeder` this equipment belongs too based on `NetworkStateOperators`
|
|
72
|
+
"""
|
|
73
|
+
if network_state_operators.NORMAL:
|
|
74
|
+
return self.normal_feeders
|
|
75
|
+
else:
|
|
76
|
+
return self.current_feeders
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def normal_feeders(self) -> Generator[Feeder, None, None]:
|
|
80
|
+
"""
|
|
81
|
+
The normal `Feeder`s this equipment belongs to.
|
|
82
|
+
"""
|
|
83
|
+
return ngen(_of_type(self._equipment_containers, Feeder))
|
|
84
|
+
|
|
85
|
+
def lv_feeders(self, network_state_operators: Type[NetworkStateOperators]) -> Generator[LvFeeder, None, None]:
|
|
86
|
+
"""
|
|
87
|
+
The `LvFeeder` this equipment belongs too based on `NetworkStateOperators`
|
|
88
|
+
"""
|
|
89
|
+
if network_state_operators.NORMAL:
|
|
90
|
+
return self.normal_lv_feeders
|
|
91
|
+
else:
|
|
92
|
+
return self.current_lv_feeders
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def normal_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
96
|
+
"""
|
|
97
|
+
The normal `LvFeeder`s this equipment belongs to.
|
|
98
|
+
"""
|
|
99
|
+
return ngen(_of_type(self._equipment_containers, LvFeeder))
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def substations(self) -> Generator[Substation, None, None]:
|
|
103
|
+
"""
|
|
104
|
+
The `Substation`s this equipment belongs to.
|
|
105
|
+
"""
|
|
106
|
+
return ngen(_of_type(self._equipment_containers, Substation))
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def current_feeders(self) -> Generator[Feeder, None, None]:
|
|
110
|
+
"""
|
|
111
|
+
The current `Feeder`s this equipment belongs to.
|
|
112
|
+
"""
|
|
113
|
+
return ngen(_of_type(self._current_containers, Feeder))
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def current_lv_feeders(self) -> Generator[LvFeeder, None, None]:
|
|
117
|
+
"""
|
|
118
|
+
The current `LvFeeder`s this equipment belongs to.
|
|
119
|
+
"""
|
|
120
|
+
return ngen(_of_type(self._current_containers, LvFeeder))
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def containers(self) -> Generator[EquipmentContainer, None, None]:
|
|
124
|
+
"""
|
|
125
|
+
The `EquipmentContainer`s this equipment belongs to.
|
|
126
|
+
"""
|
|
127
|
+
return ngen(self._equipment_containers)
|
|
128
|
+
|
|
129
|
+
def num_containers(self) -> int:
|
|
130
|
+
"""
|
|
131
|
+
Returns The number of `EquipmentContainer`s associated with this `Equipment`
|
|
132
|
+
"""
|
|
133
|
+
return nlen(self._equipment_containers)
|
|
134
|
+
|
|
135
|
+
def num_substations(self) -> int:
|
|
136
|
+
"""
|
|
137
|
+
Returns The number of `zepben.ewb.model.cim.iec61970.base.core.substation.Substation`s associated with this `Equipment`
|
|
138
|
+
"""
|
|
139
|
+
return len(list(_of_type(self._equipment_containers, Substation)))
|
|
140
|
+
|
|
141
|
+
def num_sites(self) -> int:
|
|
142
|
+
"""
|
|
143
|
+
Returns The number of `Site`s associated with this `Equipment`
|
|
144
|
+
"""
|
|
145
|
+
return len(list(_of_type(self._equipment_containers, Site)))
|
|
146
|
+
|
|
147
|
+
def num_normal_feeders(self) -> int:
|
|
148
|
+
"""
|
|
149
|
+
Returns The number of normal `Feeder`s associated with this `Equipment`
|
|
150
|
+
"""
|
|
151
|
+
return len(list(_of_type(self._equipment_containers, Feeder)))
|
|
152
|
+
|
|
153
|
+
def num_usage_points(self) -> int:
|
|
154
|
+
"""
|
|
155
|
+
Returns The number of `UsagePoint`s associated with this `Equipment`
|
|
156
|
+
"""
|
|
157
|
+
return nlen(self._usage_points)
|
|
158
|
+
|
|
159
|
+
def num_current_containers(self) -> int:
|
|
160
|
+
"""
|
|
161
|
+
Returns The number of `EquipmentContainer`s associated with this `Equipment`
|
|
162
|
+
"""
|
|
163
|
+
return nlen(self._current_containers)
|
|
164
|
+
|
|
165
|
+
def num_operational_restrictions(self) -> int:
|
|
166
|
+
"""
|
|
167
|
+
Returns The number of `OperationalRestriction`s associated with this `Equipment`
|
|
168
|
+
"""
|
|
169
|
+
return nlen(self._operational_restrictions)
|
|
170
|
+
|
|
171
|
+
def get_container(self, mrid: str) -> EquipmentContainer:
|
|
172
|
+
"""
|
|
173
|
+
Get the `EquipmentContainer` for this `Equipment` identified by `mrid`
|
|
174
|
+
|
|
175
|
+
`mrid` The mRID of the required `EquipmentContainer`
|
|
176
|
+
Returns The `EquipmentContainer` with the specified `mrid` if it exists
|
|
177
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
178
|
+
"""
|
|
179
|
+
return get_by_mrid(self._equipment_containers, mrid)
|
|
180
|
+
|
|
181
|
+
def add_container(self, ec: EquipmentContainer) -> Equipment:
|
|
182
|
+
"""
|
|
183
|
+
Associate an `EquipmentContainer` with this `Equipment`
|
|
184
|
+
|
|
185
|
+
`ec` The `EquipmentContainer` to associate with this `Equipment`.
|
|
186
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
187
|
+
Raises `ValueError` if another `EquipmentContainer` with the same `mrid` already exists for this `Equipment`.
|
|
188
|
+
"""
|
|
189
|
+
if self._validate_reference(ec, self.get_container, "An EquipmentContainer"):
|
|
190
|
+
return self
|
|
191
|
+
self._equipment_containers = list() if self._equipment_containers is None else self._equipment_containers
|
|
192
|
+
self._equipment_containers.append(ec)
|
|
193
|
+
return self
|
|
194
|
+
|
|
195
|
+
def remove_container(self, ec: EquipmentContainer) -> Equipment:
|
|
196
|
+
"""
|
|
197
|
+
Disassociate `ec` from this `Equipment`.
|
|
198
|
+
|
|
199
|
+
`ec` The `EquipmentContainer` to disassociate from this `Equipment`.
|
|
200
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
201
|
+
Raises `ValueError` if `ec` was not associated with this `Equipment`.
|
|
202
|
+
"""
|
|
203
|
+
self._equipment_containers = safe_remove(self._equipment_containers, ec)
|
|
204
|
+
return self
|
|
205
|
+
|
|
206
|
+
def clear_containers(self) -> Equipment:
|
|
207
|
+
"""
|
|
208
|
+
Clear all equipment.
|
|
209
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
210
|
+
"""
|
|
211
|
+
self._equipment_containers = None
|
|
212
|
+
return self
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def current_containers(self) -> Generator[EquipmentContainer, None, None]:
|
|
216
|
+
"""
|
|
217
|
+
The `EquipmentContainer`s this equipment belongs to in the current state of the network.
|
|
218
|
+
"""
|
|
219
|
+
return ngen(self._current_containers)
|
|
220
|
+
|
|
221
|
+
def get_current_container(self, mrid: str) -> EquipmentContainer:
|
|
222
|
+
"""
|
|
223
|
+
Get the `EquipmentContainer` for this `Equipment` in the current state of the network, identified by `mrid`
|
|
224
|
+
|
|
225
|
+
`mrid` The mRID of the required `EquipmentContainer`
|
|
226
|
+
Returns The `EquipmentContainer` with the specified `mrid` if it exists
|
|
227
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
228
|
+
"""
|
|
229
|
+
return get_by_mrid(self._current_containers, mrid)
|
|
230
|
+
|
|
231
|
+
def add_current_container(self, equipment_container: EquipmentContainer) -> Equipment:
|
|
232
|
+
"""
|
|
233
|
+
Associate `equipment_container` with this `Equipment` in the current state of the network.
|
|
234
|
+
|
|
235
|
+
`equipment_container` The `EquipmentContainer` to associate with this `Equipment`.
|
|
236
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
237
|
+
Raises `ValueError` if another `EquipmentContainer` with the same `mrid` already exists for this `Equipment`.
|
|
238
|
+
"""
|
|
239
|
+
if self._validate_reference(equipment_container, self.get_current_container, "A current EquipmentContainer"):
|
|
240
|
+
return self
|
|
241
|
+
self._current_containers = list() if self._current_containers is None else self._current_containers
|
|
242
|
+
self._current_containers.append(equipment_container)
|
|
243
|
+
return self
|
|
244
|
+
|
|
245
|
+
def remove_current_container(self, equipment_container: EquipmentContainer) -> Equipment:
|
|
246
|
+
"""
|
|
247
|
+
Disassociate `equipment_container` from this `Equipment` in the current state of the network.
|
|
248
|
+
|
|
249
|
+
`equipment_container` The `EquipmentContainer` to disassociate from this `Equipment`.
|
|
250
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
251
|
+
Raises `ValueError` if `equipment_container` was not associated with this `Equipment`.
|
|
252
|
+
"""
|
|
253
|
+
self._current_containers = safe_remove(self._current_containers, equipment_container)
|
|
254
|
+
return self
|
|
255
|
+
|
|
256
|
+
def clear_current_containers(self) -> Equipment:
|
|
257
|
+
"""
|
|
258
|
+
Clear all current `EquipmentContainer`s in the current state of the network.
|
|
259
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
260
|
+
"""
|
|
261
|
+
self._current_containers = None
|
|
262
|
+
return self
|
|
263
|
+
|
|
264
|
+
@property
|
|
265
|
+
def usage_points(self) -> Generator[UsagePoint, None, None]:
|
|
266
|
+
"""
|
|
267
|
+
The `UsagePoint`s for this equipment.
|
|
268
|
+
"""
|
|
269
|
+
return ngen(self._usage_points)
|
|
270
|
+
|
|
271
|
+
def get_usage_point(self, mrid: str) -> UsagePoint:
|
|
272
|
+
"""
|
|
273
|
+
Get the `UsagePoint` for this `Equipment` identified by `mrid`
|
|
274
|
+
|
|
275
|
+
`mrid` The mRID of the required `UsagePoint`
|
|
276
|
+
Returns The `UsagePoint` with the specified `mrid` if it exists
|
|
277
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
278
|
+
"""
|
|
279
|
+
return get_by_mrid(self._usage_points, mrid)
|
|
280
|
+
|
|
281
|
+
def add_usage_point(self, up: UsagePoint) -> Equipment:
|
|
282
|
+
"""
|
|
283
|
+
Associate `up` with this `Equipment`.
|
|
284
|
+
|
|
285
|
+
`up` the `UsagePoint` to associate with this `Equipment`.
|
|
286
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
287
|
+
Raises `ValueError` if another `UsagePoint` with the same `mrid` already exists for this `Equipment`.
|
|
288
|
+
"""
|
|
289
|
+
if self._validate_reference(up, self.get_usage_point, "A UsagePoint"):
|
|
290
|
+
return self
|
|
291
|
+
self._usage_points = list() if self._usage_points is None else self._usage_points
|
|
292
|
+
self._usage_points.append(up)
|
|
293
|
+
return self
|
|
294
|
+
|
|
295
|
+
def remove_usage_point(self, up: UsagePoint) -> Equipment:
|
|
296
|
+
"""
|
|
297
|
+
Disassociate `up` from this `Equipment`.
|
|
298
|
+
|
|
299
|
+
`up` The `UsagePoint` to disassociate from this `Equipment`.
|
|
300
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
301
|
+
Raises `ValueError` if `up` was not associated with this `Equipment`.
|
|
302
|
+
"""
|
|
303
|
+
self._usage_points = safe_remove(self._usage_points, up)
|
|
304
|
+
return self
|
|
305
|
+
|
|
306
|
+
def clear_usage_points(self) -> Equipment:
|
|
307
|
+
"""
|
|
308
|
+
Clear all usage_points.
|
|
309
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
310
|
+
"""
|
|
311
|
+
self._usage_points = None
|
|
312
|
+
return self
|
|
313
|
+
|
|
314
|
+
@property
|
|
315
|
+
def operational_restrictions(self) -> Generator[OperationalRestriction, None, None]:
|
|
316
|
+
"""
|
|
317
|
+
The `OperationalRestriction`s that this equipment is associated with.
|
|
318
|
+
"""
|
|
319
|
+
return ngen(self._operational_restrictions)
|
|
320
|
+
|
|
321
|
+
def get_operational_restriction(self, mrid: str) -> OperationalRestriction:
|
|
322
|
+
"""
|
|
323
|
+
Get the `OperationalRestriction` for this `Equipment` identified by `mrid`
|
|
324
|
+
|
|
325
|
+
`mrid` The mRID of the required `OperationalRestriction`
|
|
326
|
+
Returns The `OperationalRestriction` with the specified `mrid` if it exists
|
|
327
|
+
Raises `KeyError` if `mrid` wasn't present.
|
|
328
|
+
"""
|
|
329
|
+
return get_by_mrid(self._operational_restrictions, mrid)
|
|
330
|
+
|
|
331
|
+
def add_operational_restriction(self, op: OperationalRestriction) -> Equipment:
|
|
332
|
+
"""
|
|
333
|
+
Associate `op` with this `Equipment`.
|
|
334
|
+
|
|
335
|
+
`op` The `OperationalRestriction` to associate with this `Equipment`.
|
|
336
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
337
|
+
Raises `ValueError` if another `OperationalRestriction` with the same `mrid` already exists for this `Equipment`.
|
|
338
|
+
"""
|
|
339
|
+
if self._validate_reference(op, self.get_operational_restriction, "An OperationalRestriction"):
|
|
340
|
+
return self
|
|
341
|
+
self._operational_restrictions = list() if self._operational_restrictions is None else self._operational_restrictions
|
|
342
|
+
self._operational_restrictions.append(op)
|
|
343
|
+
return self
|
|
344
|
+
|
|
345
|
+
def remove_operational_restriction(self, op: OperationalRestriction) -> Equipment:
|
|
346
|
+
"""
|
|
347
|
+
Disassociate `up` from this `Equipment`.
|
|
348
|
+
|
|
349
|
+
`op` The `OperationalRestriction` to disassociate from this `Equipment`.
|
|
350
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
351
|
+
Raises `ValueError` if `op` was not associated with this `Equipment`.
|
|
352
|
+
"""
|
|
353
|
+
self._operational_restrictions = safe_remove(self._operational_restrictions, op)
|
|
354
|
+
return self
|
|
355
|
+
|
|
356
|
+
def clear_operational_restrictions(self) -> Equipment:
|
|
357
|
+
"""
|
|
358
|
+
Clear all `OperationalRestrictions`.
|
|
359
|
+
Returns A reference to this `Equipment` to allow fluent use.
|
|
360
|
+
"""
|
|
361
|
+
self._operational_restrictions = None
|
|
362
|
+
return self
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def _of_type(containers: Optional[List[EquipmentContainer]], ectype: Type[TEquipmentContainer]) -> Generator[TEquipmentContainer, None, None]:
|
|
366
|
+
yield from (ec for ec in containers if isinstance(ec, ectype)) if containers is not None else {}
|