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,21 @@
|
|
|
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__ = ["TableMetadataDataSources"]
|
|
7
|
+
|
|
8
|
+
from zepben.ewb.database.sql.column import Column, Nullable
|
|
9
|
+
from zepben.ewb.database.sqlite.tables.sqlite_table import SqliteTable
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TableMetadataDataSources(SqliteTable):
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.source: Column = self._create_column("source", "TEXT", Nullable.NOT_NULL)
|
|
16
|
+
self.version: Column = self._create_column("version", "TEXT", Nullable.NOT_NULL)
|
|
17
|
+
self.timestamp: Column = self._create_column("timestamp", "TEXT", Nullable.NOT_NULL)
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def name(self) -> str:
|
|
21
|
+
return "metadata_data_sources"
|
|
@@ -0,0 +1,39 @@
|
|
|
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__ = ["TableVersion"]
|
|
7
|
+
|
|
8
|
+
import sqlite3
|
|
9
|
+
from sqlite3 import Cursor
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.database.sql.column import Column, Nullable
|
|
13
|
+
from zepben.ewb.database.sqlite.tables.sqlite_table import SqliteTable
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TableVersion(SqliteTable):
|
|
17
|
+
SUPPORTED_VERSION = 59
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
super().__init__()
|
|
21
|
+
self.version: Column = self._create_column("version", "TEXT", Nullable.NOT_NULL)
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def name(self) -> str:
|
|
25
|
+
return "version"
|
|
26
|
+
|
|
27
|
+
def get_version(self, cur: Cursor) -> Optional[int]:
|
|
28
|
+
"""
|
|
29
|
+
Helper function to read the version from the database.
|
|
30
|
+
"""
|
|
31
|
+
try:
|
|
32
|
+
cur.execute(self.select_sql)
|
|
33
|
+
rows = cur.fetchall()
|
|
34
|
+
if len(rows) == 1:
|
|
35
|
+
return int(rows[0][0])
|
|
36
|
+
except sqlite3.Error:
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
return None
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
9
|
+
"""
|
|
10
|
+
from .decorator import dataclass, make_dataclass
|
|
11
|
+
from .dataclass import DataClass, Internal
|
|
12
|
+
from .functions import fields, values, as_dict, as_tuple, replace
|
|
13
|
+
|
|
14
|
+
# aliases intended for migration from dataclasses
|
|
15
|
+
asdict, astuple = as_dict, as_tuple
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file contains the internal mechanism that makes data classes
|
|
9
|
+
work, as well as functions which operate on them.
|
|
10
|
+
|
|
11
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2 with this additional bugfix:
|
|
12
|
+
https://github.com/biqqles/dataclassy/commit/ec9273ca02e5caefc08c923112fa9eeecf517246
|
|
13
|
+
"""
|
|
14
|
+
from types import FunctionType as Function
|
|
15
|
+
from typing import Any, Dict, Generic, Hashable, TypeVar
|
|
16
|
+
from reprlib import recursive_repr
|
|
17
|
+
|
|
18
|
+
DataClass = Any # type hint for variables that should be data class instances
|
|
19
|
+
T = TypeVar('T')
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Internal(Generic[T]):
|
|
23
|
+
"""This type hint wrapper represents a field that is internal to the data class and is, for example, not to be
|
|
24
|
+
shown in a repr."""
|
|
25
|
+
@classmethod
|
|
26
|
+
def is_internal(cls, annotation):
|
|
27
|
+
return getattr(annotation, '__origin__', None) is cls or \
|
|
28
|
+
(type(annotation) is str and cls.__name__ in annotation)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class DataClassMeta(type):
|
|
32
|
+
"""The metaclass for a data class."""
|
|
33
|
+
DEFAULT_OPTIONS = dict(init=True, repr=True, eq=True, iter=False, frozen=False, kwargs=False, slots=False,
|
|
34
|
+
order=False, unsafe_hash=True, hide_internals=True)
|
|
35
|
+
|
|
36
|
+
def __new__(mcs, name, bases, dict_, **kwargs):
|
|
37
|
+
# collect annotations, defaults, slots and options from this class' ancestors, in definition order
|
|
38
|
+
all_annotations = {}
|
|
39
|
+
all_defaults = {}
|
|
40
|
+
all_slots = set()
|
|
41
|
+
options = dict(mcs.DEFAULT_OPTIONS)
|
|
42
|
+
|
|
43
|
+
dataclass_bases = [vars(b) for b in bases if hasattr(b, '__dataclass__')]
|
|
44
|
+
for b in dataclass_bases + [dict_]:
|
|
45
|
+
all_annotations.update(b.get('__annotations__', {}))
|
|
46
|
+
all_defaults.update(b.get('__defaults__', dict_))
|
|
47
|
+
all_slots.update(b.get('__slots__', set()))
|
|
48
|
+
options.update(b.get('__dataclass__', {}))
|
|
49
|
+
options.update(kwargs)
|
|
50
|
+
|
|
51
|
+
# fill out this class' dict and store defaults, annotations and decorator options for future subclasses
|
|
52
|
+
dict_.update(all_defaults)
|
|
53
|
+
dict_['__defaults__'] = all_defaults
|
|
54
|
+
dict_['__annotations__'] = all_annotations
|
|
55
|
+
dict_['__dataclass__'] = options
|
|
56
|
+
|
|
57
|
+
# delete what will become stale references so that Python creates new ones
|
|
58
|
+
del dict_['__dict__'], dict_['__weakref__']
|
|
59
|
+
|
|
60
|
+
# create/apply generated methods and attributes
|
|
61
|
+
user_init = type(dict_.get('__init__')) is Function
|
|
62
|
+
|
|
63
|
+
if options['slots']:
|
|
64
|
+
# values with default values must only be present in slots, not dict, otherwise Python will interpret them
|
|
65
|
+
# as read only
|
|
66
|
+
for d in all_annotations.keys() & all_defaults.keys():
|
|
67
|
+
del dict_[d]
|
|
68
|
+
dict_['__slots__'] = all_annotations.keys() - all_slots
|
|
69
|
+
elif '__slots__' in dict_:
|
|
70
|
+
# if the slots option has been removed from an inheriting dataclass we must remove descriptors and __slots__
|
|
71
|
+
for d in all_annotations.keys() - all_defaults.keys() & dict_.keys():
|
|
72
|
+
del dict_[d]
|
|
73
|
+
del dict_['__slots__']
|
|
74
|
+
if options['init']:
|
|
75
|
+
dict_.setdefault('__new__', _generate_new(all_annotations, all_defaults, user_init,
|
|
76
|
+
options['kwargs'], options['frozen']))
|
|
77
|
+
if options['repr']:
|
|
78
|
+
dict_.setdefault('__repr__', recursive_repr()(__repr__))
|
|
79
|
+
if options['eq']:
|
|
80
|
+
dict_.setdefault('__eq__', __eq__)
|
|
81
|
+
if options['iter']:
|
|
82
|
+
dict_.setdefault('__iter__', __iter__)
|
|
83
|
+
if options['frozen']:
|
|
84
|
+
dict_['__delattr__'] = dict_['__setattr__'] = __setattr__
|
|
85
|
+
if options['order']:
|
|
86
|
+
dict_.setdefault('__lt__', __lt__)
|
|
87
|
+
if (options['eq'] and options['frozen']) or options['unsafe_hash']:
|
|
88
|
+
dict_.setdefault('__hash__', __hash__)
|
|
89
|
+
|
|
90
|
+
return type.__new__((DataClassInit if options['init'] and user_init else mcs), name, bases, dict_)
|
|
91
|
+
|
|
92
|
+
def __init__(cls, *args, **kwargs):
|
|
93
|
+
# warn the user if they try to use __post_init__
|
|
94
|
+
if hasattr(cls, '__post_init__'):
|
|
95
|
+
raise TypeError('dataclassy does not use __post_init__. You should rename this method __init__')
|
|
96
|
+
|
|
97
|
+
if cls.__dataclass__['eq'] and cls.__dataclass__['order']:
|
|
98
|
+
from functools import total_ordering
|
|
99
|
+
total_ordering(cls)
|
|
100
|
+
|
|
101
|
+
# determine a static expression for an instance's fields as a tuple, then evaluate this to create a property
|
|
102
|
+
# allowing efficient representation for internal methods
|
|
103
|
+
tuple_expr = f'({", ".join((*(f"self.{f}" for f in fields(cls)), ""))})' # "" ensures closing comma
|
|
104
|
+
cls.__tuple__ = property(eval(f'lambda self: {tuple_expr}'))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class DataClassInit(DataClassMeta):
|
|
108
|
+
"""In the case that a custom __init__ is defined, remove arguments used by __new__ before calling it."""
|
|
109
|
+
def __call__(cls, *args, **kwargs):
|
|
110
|
+
args = iter(args)
|
|
111
|
+
new_kwargs = dict(zip(cls.__annotations__, args)) # convert positional args to keyword for __new__
|
|
112
|
+
instance = cls.__new__(cls, **new_kwargs, **kwargs)
|
|
113
|
+
|
|
114
|
+
for parameter in kwargs.keys() & cls.__annotations__.keys():
|
|
115
|
+
del kwargs[parameter]
|
|
116
|
+
|
|
117
|
+
instance.__init__(*args, **kwargs)
|
|
118
|
+
return instance
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def __signature__(cls):
|
|
122
|
+
"""Defining a __call__ breaks inspect.signature. Lazily generate a Signature object ourselves."""
|
|
123
|
+
import inspect
|
|
124
|
+
parameters = tuple(inspect.signature(cls.__new__).parameters.values())
|
|
125
|
+
return inspect.Signature(parameters[1:]) # remove 'cls' to transform parameters of __new__ into those of class
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _generate_new(annotations: Dict, defaults: Dict, user_init: bool, gen_kwargs: bool, frozen: bool) -> Function:
|
|
129
|
+
"""Generate and return a __new__ method for a data class which has as parameters all fields of the data class.
|
|
130
|
+
When the data class is initialised, arguments to this function are applied to the fields of the new instance. Using
|
|
131
|
+
__new__ frees up __init__, allowing it to be defined by the user to perform additional, custom initialisation.
|
|
132
|
+
|
|
133
|
+
If __init__ is defined, all arguments to __new__ become keyword-only, and the custom __call__ converts positional
|
|
134
|
+
arguments to keyword arguments. This prevents ambiguity during attempts to pass the same argument twice,
|
|
135
|
+
positionally and as a keyword."""
|
|
136
|
+
arguments = [a for a in annotations if a not in defaults]
|
|
137
|
+
default_arguments = [f'{a}={a}' for a in annotations if a in defaults]
|
|
138
|
+
kw_only = ['*'] if user_init and (arguments or default_arguments) else []
|
|
139
|
+
kwargs = ['**kwargs'] if gen_kwargs or user_init else [] # pass through unknown keyword arguments to __init__
|
|
140
|
+
|
|
141
|
+
parameters = ', '.join(kw_only + arguments + default_arguments + kwargs)
|
|
142
|
+
|
|
143
|
+
# determine what to do with arguments before assignment. If the argument matches a mutable default, make a copy
|
|
144
|
+
references = {n: f'{n}.copy() if {n} is self.__defaults__[{n!r}] else {n}'
|
|
145
|
+
if n in defaults and hasattr(defaults[n], 'copy') else n for n in annotations}
|
|
146
|
+
|
|
147
|
+
# if the class is frozen, use the necessary but slightly slower object.__setattr__
|
|
148
|
+
assignments = [f'object.__setattr__(self, {n!r}, {r})' if frozen else f'self.{n} = {r}'
|
|
149
|
+
for n, r in references.items()]
|
|
150
|
+
|
|
151
|
+
# generate the function
|
|
152
|
+
signature = f'def __new__(cls, {parameters}):'
|
|
153
|
+
body = [f'self = object.__new__(cls)', *assignments, 'return self']
|
|
154
|
+
|
|
155
|
+
exec('\n\t'.join([signature, *body]), {}, defaults)
|
|
156
|
+
function = defaults.pop('__new__')
|
|
157
|
+
function.__annotations__ = annotations
|
|
158
|
+
return function
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# generic method implementations common to all data classes
|
|
162
|
+
# these are currently relatively inefficient - it would be better to cache an expression for a class' tuple
|
|
163
|
+
from .functions import values, fields
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def __eq__(self: DataClass, other: DataClass):
|
|
167
|
+
return type(self) is type(other) and self.__tuple__ == other.__tuple__
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def __lt__(self: DataClass, other: DataClass):
|
|
171
|
+
if isinstance(other, type(self)):
|
|
172
|
+
return self.__tuple__ < other.__tuple__
|
|
173
|
+
return NotImplemented
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def __hash__(self):
|
|
177
|
+
# currently not ideal since gives no warning if a field expected to be hashable is not
|
|
178
|
+
return hash((type(self), *(v for v in self.__tuple__ if v is isinstance(v, Hashable))))
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def __iter__(self):
|
|
182
|
+
return iter(self.__tuple__)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def __repr__(self):
|
|
186
|
+
show_internals = not self.__dataclass__['hide_internals']
|
|
187
|
+
field_values = ', '.join(f'{f}={v!r}' for f, v in values(self, show_internals).items())
|
|
188
|
+
return f'{type(self).__name__}({field_values})'
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def __setattr__(self, *args):
|
|
192
|
+
raise AttributeError('Frozen class')
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file contains code relating to dataclassy's decorator.
|
|
9
|
+
|
|
10
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
11
|
+
"""
|
|
12
|
+
from typing import Any, Dict, Optional
|
|
13
|
+
from .dataclass import DataClassMeta
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def dataclass(cls: Optional[type] = None, *, meta=DataClassMeta, **options):
|
|
17
|
+
"""The decorator used to apply DataClassMeta, or optionally a subclass of that metaclass, to a class."""
|
|
18
|
+
assert issubclass(meta, DataClassMeta)
|
|
19
|
+
|
|
20
|
+
def apply_metaclass(to_class, metaclass=meta):
|
|
21
|
+
"""Apply a metaclass to a class."""
|
|
22
|
+
dict_ = dict(vars(to_class), __metaclass__=metaclass)
|
|
23
|
+
return metaclass(to_class.__name__, to_class.__bases__, dict_, **options)
|
|
24
|
+
|
|
25
|
+
if cls: # if decorator used with no arguments, apply metaclass to the class immediately
|
|
26
|
+
if not isinstance(cls, type):
|
|
27
|
+
raise TypeError('This decorator takes no explicit positional arguments')
|
|
28
|
+
return apply_metaclass(cls)
|
|
29
|
+
return apply_metaclass # otherwise, return function for later evaluation
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def make_dataclass(name: str, fields: Dict[str, type], defaults: Dict[str, Any], bases=(), **options) -> type:
|
|
33
|
+
"""Dynamically create a data class with name `name`, fields `fields`, default field values `defaults` and
|
|
34
|
+
inheriting from `bases`."""
|
|
35
|
+
return dataclass(type(name, bases, dict(defaults, __annotations__=fields)), **options)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# LICENCE EXCLUDED
|
|
2
|
+
"""
|
|
3
|
+
Copyright (C) 2020 biqqles.
|
|
4
|
+
This Source Code Form is subject to the terms of the Mozilla Public
|
|
5
|
+
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
|
+
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
7
|
+
|
|
8
|
+
This file defines functions which operate on data classes.
|
|
9
|
+
|
|
10
|
+
Forked from https://github.com/biqqles/dataclassy/tree/v0.6.2
|
|
11
|
+
"""
|
|
12
|
+
from typing import Any, Callable, Dict, Tuple, Type
|
|
13
|
+
|
|
14
|
+
from .dataclass import DataClassMeta, DataClass, Internal
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def is_dataclass(obj: Any) -> bool:
|
|
18
|
+
"""Return True if the given object is a data class as implemented in this package, otherwise False."""
|
|
19
|
+
return isinstance(obj, DataClassMeta) or is_dataclass_instance(obj)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def is_dataclass_instance(obj: Any) -> bool:
|
|
23
|
+
"""Return True if the given object is an instance of a data class, otherwise False."""
|
|
24
|
+
return isinstance(type(obj), DataClassMeta)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def fields(dataclass: Type[DataClass], internals=False) -> Dict[str, Type]:
|
|
28
|
+
"""Return a dict of `dataclass`'s fields and their types. `internals` selects whether to include internal fields.
|
|
29
|
+
`dataclass` can be either a data class or an instance of a data class. A field is defined as a class-level variable
|
|
30
|
+
with a type annotation."""
|
|
31
|
+
assert is_dataclass(dataclass)
|
|
32
|
+
return _filter_annotations(dataclass.__annotations__, internals)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def values(dataclass: DataClass, internals=False) -> Dict[str, Any]:
|
|
36
|
+
"""Return a dict of `dataclass`'s fields and their values. `internals` selects whether to include internal fields.
|
|
37
|
+
`dataclass` must be an instance of a data class. A field is defined as a class-level variable with a type
|
|
38
|
+
annotation."""
|
|
39
|
+
assert is_dataclass_instance(dataclass)
|
|
40
|
+
return {f: getattr(dataclass, f) for f in fields(dataclass, internals)}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def as_dict(dataclass: DataClass, dict_factory=dict) -> Dict[str, Any]:
|
|
44
|
+
"""Recursively create a dict of a dataclass instance's fields and their values.
|
|
45
|
+
This function is recursively called on data classes, named tuples and iterables."""
|
|
46
|
+
assert is_dataclass_instance(dataclass)
|
|
47
|
+
return _recurse_structure(dataclass, dict_factory)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def as_tuple(dataclass: DataClass) -> Tuple:
|
|
51
|
+
"""Recursively create a tuple of the values of a dataclass instance's fields, in definition order.
|
|
52
|
+
This function is recursively called on data classes, named tuples and iterables."""
|
|
53
|
+
assert is_dataclass_instance(dataclass)
|
|
54
|
+
return _recurse_structure(dataclass, lambda k_v: tuple(v for k, v in k_v))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def replace(dataclass: DataClass, **changes) -> DataClass:
|
|
58
|
+
"""Return a new copy of `dataclass` with field values replaced as specified in `changes`."""
|
|
59
|
+
return type(dataclass)(**dict(values(dataclass, internals=True), **changes))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _filter_annotations(annotations: Dict[str, Type], internals: bool) -> Dict[str, Type]:
|
|
63
|
+
"""Filter an annotations dict for to remove or keep internal fields."""
|
|
64
|
+
return annotations if internals else {f: a for f, a in annotations.items()
|
|
65
|
+
if not f.startswith('_') and not Internal.is_internal(a)}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _recurse_structure(var: Any, iter_proc: Callable) -> Any:
|
|
69
|
+
"""Recursively convert an arbitrarily nested structure beginning at `var`, copying and processing any iterables
|
|
70
|
+
encountered with `iter_proc`."""
|
|
71
|
+
if is_dataclass(var):
|
|
72
|
+
var = values(var, internals=True)
|
|
73
|
+
if hasattr(var, '_asdict'): # handle named tuples
|
|
74
|
+
# noinspection PyCallingNonCallable, PyProtectedMember
|
|
75
|
+
var = var._asdict()
|
|
76
|
+
if isinstance(var, dict):
|
|
77
|
+
return iter_proc((_recurse_structure(k, iter_proc), _recurse_structure(v, iter_proc)) for k, v in var.items())
|
|
78
|
+
if isinstance(var, (list, tuple)):
|
|
79
|
+
return type(var)(_recurse_structure(e, iter_proc) for e in var)
|
|
80
|
+
return var
|
|
@@ -0,0 +1,6 @@
|
|
|
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 zepben.ewb.examples.simple_test_network import *
|
|
@@ -0,0 +1,158 @@
|
|
|
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__ = ["simple_test_network"]
|
|
7
|
+
|
|
8
|
+
from typing import List
|
|
9
|
+
|
|
10
|
+
from zepben.ewb import NetworkService, BaseVoltage, PowerTransformerInfo, PhaseCode, EnergySourcePhase, EnergySource, PowerTransformer, Terminal, \
|
|
11
|
+
ConductingEquipment, EnergyConsumer, AcLineSegment, Location
|
|
12
|
+
from zepben.ewb.model.cim.iec61970.base.wires.per_length_sequence_impedance import PerLengthSequenceImpedance
|
|
13
|
+
from zepben.ewb.model.cim.iec61968.common.position_point import PositionPoint
|
|
14
|
+
from zepben.ewb.model.cim.iec61968.assetinfo.overhead_wire_info import OverheadWireInfo
|
|
15
|
+
from zepben.ewb.model.cim.iec61970.base.wires.power_transformer_end import PowerTransformerEnd
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
async def simple_test_network() -> NetworkService:
|
|
19
|
+
# Network
|
|
20
|
+
network = NetworkService()
|
|
21
|
+
|
|
22
|
+
# BaseVoltages
|
|
23
|
+
bv_hv: BaseVoltage = BaseVoltage(mrid="20kV", nominal_voltage=20000, name="20kV")
|
|
24
|
+
bv_lv: BaseVoltage = BaseVoltage(mrid="415V", nominal_voltage=400, name="415V")
|
|
25
|
+
network.add(bv_hv)
|
|
26
|
+
network.add(bv_lv)
|
|
27
|
+
point1 = PositionPoint(x_position=149.12791965570293, y_position=-35.277592101000934)
|
|
28
|
+
point2 = PositionPoint(x_position=149.12779472660375, y_position=-35.278183862759285)
|
|
29
|
+
point3 = PositionPoint(x_position=149.12840360920450, y_position=-35.277171304657690)
|
|
30
|
+
|
|
31
|
+
loc1 = Location().add_point(point1)
|
|
32
|
+
loc2 = Location().add_point(point2)
|
|
33
|
+
loc3 = Location().add_point(point3)
|
|
34
|
+
|
|
35
|
+
# PerLengthSequenceImpedance
|
|
36
|
+
plsi = PerLengthSequenceImpedance(
|
|
37
|
+
mrid="psli",
|
|
38
|
+
r=0.642 / 1000,
|
|
39
|
+
x=0.083 / 1000
|
|
40
|
+
)
|
|
41
|
+
network.add(plsi)
|
|
42
|
+
|
|
43
|
+
# WireInfo
|
|
44
|
+
wire_info = OverheadWireInfo(
|
|
45
|
+
mrid="wire_info",
|
|
46
|
+
rated_current=0.142 * 1000
|
|
47
|
+
)
|
|
48
|
+
network.add(wire_info)
|
|
49
|
+
|
|
50
|
+
# PowerTransformerInfo
|
|
51
|
+
pt_info = PowerTransformerInfo(
|
|
52
|
+
mrid="pt_info"
|
|
53
|
+
)
|
|
54
|
+
network.add(pt_info)
|
|
55
|
+
|
|
56
|
+
# EnergySource
|
|
57
|
+
energy_source_phases = []
|
|
58
|
+
for sp in PhaseCode.ABC.single_phases:
|
|
59
|
+
esp = EnergySourcePhase()
|
|
60
|
+
esp.phase = sp
|
|
61
|
+
energy_source_phases.append(esp)
|
|
62
|
+
network.add(esp)
|
|
63
|
+
es = EnergySource(
|
|
64
|
+
mrid="grid_connection",
|
|
65
|
+
name="Grid Connection",
|
|
66
|
+
voltage_magnitude=1.02 * bv_hv.nominal_voltage,
|
|
67
|
+
energy_source_phases=energy_source_phases,
|
|
68
|
+
location=loc1
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
es.base_voltage = bv_hv
|
|
72
|
+
network.add(es)
|
|
73
|
+
es_t = _create_terminal(es)
|
|
74
|
+
network.add(es_t)
|
|
75
|
+
|
|
76
|
+
# Transformer
|
|
77
|
+
tx = PowerTransformer(mrid="transformer", name="Transformer", location=loc1)
|
|
78
|
+
tx.asset_info = pt_info
|
|
79
|
+
tx_terminals = _create_terminals(tx, [PhaseCode.ABC, PhaseCode.ABN])
|
|
80
|
+
for t in tx_terminals:
|
|
81
|
+
network.add(t)
|
|
82
|
+
network.add(tx)
|
|
83
|
+
|
|
84
|
+
ends = _create_transformer_ends(tx, [20000, 400])
|
|
85
|
+
for end in ends:
|
|
86
|
+
network.add(end)
|
|
87
|
+
|
|
88
|
+
network.connect_terminals(tx_terminals[0], es_t)
|
|
89
|
+
|
|
90
|
+
# Line
|
|
91
|
+
line_location = Location().add_point(point2).add_point(point3)
|
|
92
|
+
network.add(line_location)
|
|
93
|
+
line = AcLineSegment(mrid="line", name="Line", length=100.0, per_length_impedance=plsi,
|
|
94
|
+
location=line_location)
|
|
95
|
+
line.asset_info = wire_info
|
|
96
|
+
line.base_voltage = bv_lv
|
|
97
|
+
line_terminals = _create_terminals(line)
|
|
98
|
+
for t in line_terminals:
|
|
99
|
+
network.add(t)
|
|
100
|
+
network.add(line)
|
|
101
|
+
|
|
102
|
+
network.connect_terminals(tx_terminals[1], line_terminals[0])
|
|
103
|
+
|
|
104
|
+
# Load
|
|
105
|
+
ec = EnergyConsumer(mrid="load", name="Load", p=100000., q=50000., location=loc3)
|
|
106
|
+
ec.base_voltage = bv_lv
|
|
107
|
+
network.add(ec)
|
|
108
|
+
ec_t = _create_terminal(ec)
|
|
109
|
+
network.add(ec_t)
|
|
110
|
+
|
|
111
|
+
network.connect_terminals(line_terminals[1], ec_t)
|
|
112
|
+
|
|
113
|
+
await network.set_phases()
|
|
114
|
+
return network
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _create_terminal(ce: ConductingEquipment, phases: PhaseCode = PhaseCode.ABC) -> Terminal:
|
|
118
|
+
return _create_terminals(ce, [phases])[0]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _create_terminals(ce: ConductingEquipment, phases_per_term: List[PhaseCode] = None) -> List[Terminal]:
|
|
122
|
+
if phases_per_term is None:
|
|
123
|
+
phases_per_term = [PhaseCode.ABC, PhaseCode.ABC]
|
|
124
|
+
|
|
125
|
+
terminals: List[Terminal] = []
|
|
126
|
+
for i in range(0, len(phases_per_term)):
|
|
127
|
+
terminal = Terminal(
|
|
128
|
+
mrid=f"{ce.mrid}_t{i + 1}",
|
|
129
|
+
conducting_equipment=ce,
|
|
130
|
+
phases=phases_per_term[i],
|
|
131
|
+
sequence_number=i + 1
|
|
132
|
+
)
|
|
133
|
+
ce.add_terminal(terminal)
|
|
134
|
+
terminals.append(terminal)
|
|
135
|
+
return terminals
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _create_per_length_sequence_impedance(i: float) -> PerLengthSequenceImpedance:
|
|
139
|
+
return PerLengthSequenceImpedance(mrid=f"plsi{i}", r=i, x=i, bch=i, gch=i, r0=i, x0=i, b0ch=i, g0ch=i)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _create_transformer_ends(tx: PowerTransformer, voltages: List[int] = None) -> List[PowerTransformerEnd]:
|
|
143
|
+
if voltages is None:
|
|
144
|
+
voltages = [11000, 415]
|
|
145
|
+
|
|
146
|
+
ends = []
|
|
147
|
+
for i in range(0, len(voltages)):
|
|
148
|
+
end = PowerTransformerEnd(mrid=f"{tx.mrid}_e{i + 1}", power_transformer=tx, rated_u=voltages[i])
|
|
149
|
+
terminal = tx.get_terminal_by_sn(i + 1)
|
|
150
|
+
|
|
151
|
+
if terminal is None:
|
|
152
|
+
raise ValueError(f"No terminal found to attach transformer end {end.mrid} in power transformer {tx.mrid}")
|
|
153
|
+
|
|
154
|
+
tx.add_end(end)
|
|
155
|
+
end.terminal = terminal
|
|
156
|
+
ends.append(end)
|
|
157
|
+
|
|
158
|
+
return ends
|
zepben/ewb/exceptions.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
class MissingReferenceException(Exception):
|
|
7
|
+
TYPE = 'UNKNOWN'
|
|
8
|
+
|
|
9
|
+
def __init__(self, referenced_mrid: str, referrer=None, **kwargs):
|
|
10
|
+
self.referenced_mrid = referenced_mrid
|
|
11
|
+
self.referrer = referrer
|
|
12
|
+
|
|
13
|
+
super().__init__(kwargs)
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def info(self):
|
|
17
|
+
if self.referrer is not None:
|
|
18
|
+
if hasattr(self.referrer, 'DESCRIPTOR'):
|
|
19
|
+
self.referrer_type = self.referrer.DESCRIPTOR.name
|
|
20
|
+
self.referrer_mrid = self.referrer.mRID
|
|
21
|
+
else:
|
|
22
|
+
self.referrer_type = type(self.referrer).__name__
|
|
23
|
+
self.referrer_mrid = self.referrer.mrid
|
|
24
|
+
return f"{self.TYPE} {self.referenced_mrid} was not found in the network. It must be created before {self.referrer_type}[{self.referrer_mrid}] can reference it."
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class NetworkException(Exception):
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AlreadyExistsException(Exception):
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ReadingException(Exception):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PhaseException(Exception):
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class NominalPhaseException(Exception):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class WiringException(Exception):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TracingException(Exception):
|
|
52
|
+
pass
|