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,48 @@
|
|
|
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
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from zepben.ewb import NetworkService, DiagramService, CustomerService
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Services:
|
|
11
|
+
"""
|
|
12
|
+
A convenience class for storing the data supported by the SDK.
|
|
13
|
+
|
|
14
|
+
:param network_service: An optional `NetworkService` to add to the services, otherwise an empty `NetworkService` will be created.
|
|
15
|
+
:param diagram_service: An optional `NetworkService` to add to the services, otherwise an empty `NetworkService` will be created.
|
|
16
|
+
:param customer_service: An optional `NetworkService` to add to the services, otherwise an empty `NetworkService` will be created.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
network_service: Optional[NetworkService] = NetworkService(),
|
|
22
|
+
diagram_service: Optional[DiagramService] = DiagramService(),
|
|
23
|
+
customer_service: Optional[CustomerService] = CustomerService()
|
|
24
|
+
):
|
|
25
|
+
super().__init__()
|
|
26
|
+
self.network_service = network_service
|
|
27
|
+
"""The `NetworkService` of these services."""
|
|
28
|
+
|
|
29
|
+
self.diagram_service = diagram_service
|
|
30
|
+
"""The `DiagramService` of these services."""
|
|
31
|
+
|
|
32
|
+
self.customer_service = customer_service
|
|
33
|
+
"""The `CustomerService` of these services."""
|
|
34
|
+
|
|
35
|
+
def __iter__(self):
|
|
36
|
+
self._iter_index = 0
|
|
37
|
+
return self
|
|
38
|
+
|
|
39
|
+
def __next__(self):
|
|
40
|
+
self._iter_index += 1
|
|
41
|
+
if self._iter_index == 1:
|
|
42
|
+
return self.network_service
|
|
43
|
+
elif self._iter_index == 2:
|
|
44
|
+
return self.diagram_service
|
|
45
|
+
elif self._iter_index == 3:
|
|
46
|
+
return self.customer_service
|
|
47
|
+
else:
|
|
48
|
+
raise StopIteration
|
|
@@ -0,0 +1,314 @@
|
|
|
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__ = ["CurrentStateEvent", "SwitchStateEvent", "SwitchAction", "AddCutEvent", "RemoveCutEvent", "AddJumperEvent", "RemoveJumperEvent", "JumperConnection"]
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from enum import Enum
|
|
12
|
+
|
|
13
|
+
from zepben.protobuf.ns.data.change_events_pb2 import CurrentStateEvent as PBCurrentStateEvent, SwitchStateEvent as PBSwitchStateEvent, \
|
|
14
|
+
AddCutEvent as PBAddCutEvent, RemoveCutEvent as PBRemoveCutEvent, AddJumperEvent as PBAddJumperEvent, RemoveJumperEvent as PBRemoveJumperEvent, \
|
|
15
|
+
JumperConnection as PBJumperConnection, SwitchAction as PBSwitchAction
|
|
16
|
+
|
|
17
|
+
from zepben.ewb.model.cim.iec61970.base.core.phase_code import PhaseCode, phase_code_by_id
|
|
18
|
+
# noinspection PyProtectedMember
|
|
19
|
+
from zepben.ewb.services.common.enum_mapper import EnumMapper
|
|
20
|
+
# noinspection PyProtectedMember
|
|
21
|
+
from zepben.ewb.services.network.translator.network_enum_mappers import _map_phase_code
|
|
22
|
+
from zepben.ewb.util import datetime_to_timestamp
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class CurrentStateEvent(ABC):
|
|
27
|
+
"""
|
|
28
|
+
An event to apply to the current state of the network.
|
|
29
|
+
|
|
30
|
+
Attributes:
|
|
31
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
32
|
+
duplicates when requesting events via dates versus those streamed via live updates.
|
|
33
|
+
timestamp: The timestamp when the event occurred.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, event_id: str, timestamp: datetime):
|
|
37
|
+
self.event_id = event_id
|
|
38
|
+
self.timestamp = timestamp
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def from_pb(event: PBCurrentStateEvent) -> 'CurrentStateEvent':
|
|
42
|
+
"""
|
|
43
|
+
Creates a `CurrentStateEvent` object from a protobuf `CurrentStateEvent`.
|
|
44
|
+
"""
|
|
45
|
+
active_event = event.WhichOneof("event")
|
|
46
|
+
if active_event == "switch":
|
|
47
|
+
return SwitchStateEvent.from_pb(event)
|
|
48
|
+
elif active_event == "addCut":
|
|
49
|
+
return AddCutEvent.from_pb(event)
|
|
50
|
+
elif active_event == "removeCut":
|
|
51
|
+
return RemoveCutEvent.from_pb(event)
|
|
52
|
+
elif active_event == "addJumper":
|
|
53
|
+
return AddJumperEvent.from_pb(event)
|
|
54
|
+
elif active_event == "removeJumper":
|
|
55
|
+
return RemoveJumperEvent.from_pb(event)
|
|
56
|
+
else:
|
|
57
|
+
raise NotImplementedError(f"'{active_event}' is currently unsupported.")
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
61
|
+
"""
|
|
62
|
+
Creates a protobuf `CurrentStateEvent` object with switch from this `CurrentStateEvent`.
|
|
63
|
+
"""
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class SwitchStateEvent(CurrentStateEvent):
|
|
69
|
+
"""
|
|
70
|
+
An event to update the state of a switch.
|
|
71
|
+
|
|
72
|
+
Attributes:
|
|
73
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
74
|
+
duplicates when requesting events via dates versus those streamed via live updates.
|
|
75
|
+
timestamp: The timestamp when the event occurred, always in UTC (Coordinated Universal Time).
|
|
76
|
+
mrid: The mRID of the switch affected by this event.
|
|
77
|
+
action: The action to take on the switch for the specified phases.
|
|
78
|
+
phases: The phases affected by this event. Defaults to 'NONE'.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
def __init__(self, event_id: str, timestamp: datetime, mrid: str, action: 'SwitchAction', phases: PhaseCode = PhaseCode.NONE):
|
|
82
|
+
super().__init__(event_id, timestamp)
|
|
83
|
+
self.mrid = mrid
|
|
84
|
+
self.action = action
|
|
85
|
+
self.phases = phases
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def from_pb(event: PBCurrentStateEvent) -> 'SwitchStateEvent':
|
|
89
|
+
"""
|
|
90
|
+
Creates a `SwitchStateEvent` object from a protobuf `CurrentStateEvent`.
|
|
91
|
+
"""
|
|
92
|
+
return SwitchStateEvent(
|
|
93
|
+
event.eventId,
|
|
94
|
+
event.timestamp.ToDatetime(),
|
|
95
|
+
event.switch.mRID,
|
|
96
|
+
SwitchAction(event.switch.action),
|
|
97
|
+
phase_code_by_id(event.switch.phases)
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
101
|
+
"""
|
|
102
|
+
Creates a protobuf `CurrentStateEvent` object with `switch` from this `SwitchStateEvent`.
|
|
103
|
+
"""
|
|
104
|
+
return PBCurrentStateEvent(
|
|
105
|
+
eventId=self.event_id,
|
|
106
|
+
timestamp=datetime_to_timestamp(self.timestamp),
|
|
107
|
+
switch=PBSwitchStateEvent(mRID=self.mrid, action=_map_switch_action.to_pb(self.action), phases=_map_phase_code.to_pb(self.phases))
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass
|
|
112
|
+
class AddCutEvent(CurrentStateEvent):
|
|
113
|
+
"""
|
|
114
|
+
An event to add a cut to the network.
|
|
115
|
+
|
|
116
|
+
Attributes:
|
|
117
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
118
|
+
duplicates when requesting events via dates vs those streamed via live updates.
|
|
119
|
+
timestamp: The timestamp when the event occurred. This is always handled as UTC (Coordinated Universal Time).
|
|
120
|
+
mrid: The mRID of the cut defined by this event. This should match any future remove instructions.
|
|
121
|
+
acls_mrid: The mRID of the AC line segment that was cut.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
def __init__(self, event_id: str, timestamp: datetime, mrid: str, acls_mrid: str):
|
|
125
|
+
super().__init__(event_id, timestamp)
|
|
126
|
+
self.mrid = mrid
|
|
127
|
+
self.acls_mrid = acls_mrid
|
|
128
|
+
|
|
129
|
+
@staticmethod
|
|
130
|
+
def from_pb(event: PBCurrentStateEvent) -> 'AddCutEvent':
|
|
131
|
+
"""
|
|
132
|
+
Creates an `AddCutEvent` object from a protobuf `PBCurrentStateEvent`
|
|
133
|
+
"""
|
|
134
|
+
return AddCutEvent(
|
|
135
|
+
event.eventId,
|
|
136
|
+
event.timestamp.ToDatetime(),
|
|
137
|
+
event.addCut.mRID,
|
|
138
|
+
event.addCut.aclsMRID
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
142
|
+
"""
|
|
143
|
+
Creates a protobuf `PBCurrentStateEvent` object with `addCut` from this `AddCutEvent`
|
|
144
|
+
"""
|
|
145
|
+
return PBCurrentStateEvent(
|
|
146
|
+
eventId=self.event_id,
|
|
147
|
+
timestamp=datetime_to_timestamp(self.timestamp),
|
|
148
|
+
addCut=PBAddCutEvent(mRID=self.mrid, aclsMRID=self.acls_mrid)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@dataclass
|
|
153
|
+
class RemoveCutEvent(CurrentStateEvent):
|
|
154
|
+
"""
|
|
155
|
+
An event to remove a cut from the network.
|
|
156
|
+
|
|
157
|
+
Attributes:
|
|
158
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
159
|
+
duplicates when requesting events via dates vs those streamed via live updates.
|
|
160
|
+
timestamp: The timestamp when the event occurred. This is always handled as UTC (Coordinated Universal Time).
|
|
161
|
+
mrid: The mRID of the cut to remove. This should match a previously added cut.
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
def __init__(self, event_id: str, timestamp: datetime, mrid: str):
|
|
165
|
+
super().__init__(event_id, timestamp)
|
|
166
|
+
self.mrid = mrid
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def from_pb(event: PBCurrentStateEvent) -> 'RemoveCutEvent':
|
|
170
|
+
"""
|
|
171
|
+
Creates a `RemoveCutEvent` object from protobuf `PBCurrentStateEvent`
|
|
172
|
+
"""
|
|
173
|
+
return RemoveCutEvent(
|
|
174
|
+
event.eventId,
|
|
175
|
+
event.timestamp.ToDatetime(),
|
|
176
|
+
event.removeCut.mRID
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
180
|
+
"""
|
|
181
|
+
Creates a protobuf `PBCurrentStateEvent` object with `removeCut` from this `RemoveCutEvent`
|
|
182
|
+
"""
|
|
183
|
+
return PBCurrentStateEvent(
|
|
184
|
+
eventId=self.event_id,
|
|
185
|
+
timestamp=datetime_to_timestamp(self.timestamp),
|
|
186
|
+
removeCut=PBRemoveCutEvent(mRID=self.mrid)
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
@dataclass
|
|
191
|
+
class AddJumperEvent(CurrentStateEvent):
|
|
192
|
+
"""
|
|
193
|
+
An event to add a jumper to the network.
|
|
194
|
+
|
|
195
|
+
Attributes:
|
|
196
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
197
|
+
duplicates when requesting events via dates vs those streamed via live updates.
|
|
198
|
+
timestamp: The timestamp when the event occurred. This is always handled as UTC (Coordinated Universal Time).
|
|
199
|
+
mrid: The mRID of the jumper affected by this event.
|
|
200
|
+
from_connection: Information on how this jumper is connected at one end of the jumper.
|
|
201
|
+
to_connection: Information on how this jumper is connected at the other end of the jumper.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
def __init__(self, event_id: str, timestamp: datetime, mrid: str, from_connection: 'JumperConnection', to_connection: 'JumperConnection'):
|
|
205
|
+
super().__init__(event_id, timestamp)
|
|
206
|
+
self.mrid = mrid
|
|
207
|
+
self.from_connection = from_connection
|
|
208
|
+
self.to_connection = to_connection
|
|
209
|
+
|
|
210
|
+
@staticmethod
|
|
211
|
+
def from_pb(event: PBCurrentStateEvent) -> 'AddJumperEvent':
|
|
212
|
+
"""
|
|
213
|
+
Creates an `AddJumperEvent` object from protobuf `PBCurrentStateEvent`
|
|
214
|
+
"""
|
|
215
|
+
return AddJumperEvent(
|
|
216
|
+
event.eventId,
|
|
217
|
+
event.timestamp.ToDatetime(),
|
|
218
|
+
event.addJumper.mRID,
|
|
219
|
+
JumperConnection.from_pb(event.addJumper.fromConnection),
|
|
220
|
+
JumperConnection.from_pb(event.addJumper.toConnection)
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
224
|
+
"""
|
|
225
|
+
Creates a protobuf `PBCurrentStateEvent` object with `addJumper` from this `AddJumperEvent`
|
|
226
|
+
"""
|
|
227
|
+
return PBCurrentStateEvent(
|
|
228
|
+
eventId=self.event_id,
|
|
229
|
+
timestamp=datetime_to_timestamp(self.timestamp),
|
|
230
|
+
addJumper=PBAddJumperEvent(mRID=self.mrid, fromConnection=self.from_connection.to_pb(), toConnection=self.to_connection.to_pb())
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@dataclass
|
|
235
|
+
class RemoveJumperEvent(CurrentStateEvent):
|
|
236
|
+
"""
|
|
237
|
+
An event to remove a jumper from the network.
|
|
238
|
+
|
|
239
|
+
Attributes:
|
|
240
|
+
event_id: An identifier of this event. This must be unique across requests to allow detection of
|
|
241
|
+
duplicates when requesting events via dates vs those streamed via live updates.
|
|
242
|
+
timestamp: The timestamp when the event occurred. This is always handled as UTC (Coordinated Universal Time).
|
|
243
|
+
mrid: The mRID of the jumper to remove. This should match a previously added jumper.
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
def __init__(self, event_id: str, timestamp: datetime, mrid: str):
|
|
247
|
+
super().__init__(event_id, timestamp)
|
|
248
|
+
self.mrid = mrid
|
|
249
|
+
|
|
250
|
+
@staticmethod
|
|
251
|
+
def from_pb(event: PBCurrentStateEvent) -> 'RemoveJumperEvent':
|
|
252
|
+
"""
|
|
253
|
+
Creates a `RemoveJumperEvent` object from protobuf `PBCurrentStateEvent`
|
|
254
|
+
"""
|
|
255
|
+
return RemoveJumperEvent(
|
|
256
|
+
event.eventId,
|
|
257
|
+
event.timestamp.ToDatetime(),
|
|
258
|
+
event.removeJumper.mRID
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
def to_pb(self) -> PBCurrentStateEvent:
|
|
262
|
+
"""
|
|
263
|
+
Creates a protobuf `PBCurrentStateEvent` object with `removeJumper` from this `RemoveJumperEvent`
|
|
264
|
+
"""
|
|
265
|
+
return PBCurrentStateEvent(
|
|
266
|
+
eventId=self.event_id,
|
|
267
|
+
timestamp=datetime_to_timestamp(self.timestamp),
|
|
268
|
+
removeJumper=PBRemoveJumperEvent(mRID=self.mrid)
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class SwitchAction(Enum):
|
|
273
|
+
"""
|
|
274
|
+
Enum representing possible actions for a switch.
|
|
275
|
+
"""
|
|
276
|
+
UNKNOWN = 0 # The specified action was unknown, or was not set.
|
|
277
|
+
OPEN = 1 # A request to open a switch.
|
|
278
|
+
CLOSE = 2 # A request to close a switch.
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def short_name(self):
|
|
282
|
+
return str(self)[13:]
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
_map_switch_action = EnumMapper(SwitchAction, PBSwitchAction)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class JumperConnection:
|
|
289
|
+
"""
|
|
290
|
+
Information about how a jumper is connected to the network.
|
|
291
|
+
|
|
292
|
+
Attributes:
|
|
293
|
+
connected_mrid: The mRID of the conducting equipment (or terminal) connected to this end of the jumper.
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
def __init__(self, connected_mrid: str):
|
|
297
|
+
self.connected_mrid = connected_mrid
|
|
298
|
+
|
|
299
|
+
@staticmethod
|
|
300
|
+
def from_pb(connection: PBJumperConnection) -> 'JumperConnection':
|
|
301
|
+
"""
|
|
302
|
+
Creates a `JumperConnection` object from protobuf `PBJumperConnection`
|
|
303
|
+
"""
|
|
304
|
+
return JumperConnection(
|
|
305
|
+
connection.connectedMRID,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def to_pb(self) -> PBJumperConnection:
|
|
309
|
+
"""
|
|
310
|
+
Creates a protobuf `PBJumperConnection` object from this `JumperConnection`
|
|
311
|
+
"""
|
|
312
|
+
return PBJumperConnection(
|
|
313
|
+
connectedMRID=self.connected_mrid
|
|
314
|
+
)
|
|
@@ -0,0 +1,25 @@
|
|
|
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__ = ["CurrentStateEventBatch"]
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Iterable
|
|
10
|
+
|
|
11
|
+
from zepben.ewb.streaming.data.current_state_event import CurrentStateEvent
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CurrentStateEventBatch:
|
|
16
|
+
"""
|
|
17
|
+
A collection of events that should be operated on as a batch.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
batch_id: A unique identifier for the batch of events being processed. This allows tracking or grouping multiple events under a single batch.
|
|
21
|
+
events: A list of `CurrentStateEvent` objects representing the state changes or events that are being submitted in the current batch.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
batch_id: int
|
|
25
|
+
events: Iterable[CurrentStateEvent]
|
|
@@ -0,0 +1,286 @@
|
|
|
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__ = ["SetCurrentStatesStatus", "BatchSuccessful", "BatchFailure", "BatchNotProcessed", "StateEventFailure", "StateEventInvalidMrid",
|
|
7
|
+
"StateEventUnknownMrid", "StateEventDuplicateMrid", "StateEventUnsupportedPhasing", "StateEventUnsupportedMrid"]
|
|
8
|
+
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import List, Optional, Tuple, Any
|
|
12
|
+
|
|
13
|
+
from zepben.protobuf.ns.data.change_status_pb2 import BatchSuccessful as PBBatchSuccessful, BatchFailure as PBBatchFailure, \
|
|
14
|
+
BatchNotProcessed as PBBatchNotProcessed, StateEventFailure as PBStateEventFailure, StateEventUnknownMrid as PBStateEventUnknownMrid, \
|
|
15
|
+
StateEventDuplicateMrid as PBStateEventDuplicateMrid, StateEventInvalidMrid as PBStateEventInvalidMrid, \
|
|
16
|
+
StateEventUnsupportedPhasing as PBStateEventUnsupportedPhasing, StateEventUnsupportedMrid as PBStateEventUnsupportedMrid
|
|
17
|
+
from zepben.protobuf.ns.network_state_responses_pb2 import SetCurrentStatesResponse as PBSetCurrentStatesResponse
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SetCurrentStatesStatus(ABC):
|
|
21
|
+
"""
|
|
22
|
+
The outcome of processing this batch of updates.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
batch_id: The unique identifier of the batch that was processed. This matches the
|
|
26
|
+
batch ID from the original request to allow correlation between request and response.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, batch_id: int):
|
|
30
|
+
self.batch_id = batch_id
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def from_pb(pb: PBSetCurrentStatesResponse) -> 'SetCurrentStatesStatus':
|
|
34
|
+
"""
|
|
35
|
+
Creates a BatchSuccessful object from a protobuf SetCurrentStatesResponse.
|
|
36
|
+
"""
|
|
37
|
+
status = pb.WhichOneof("status")
|
|
38
|
+
if status == "success":
|
|
39
|
+
return BatchSuccessful.from_pb(pb)
|
|
40
|
+
elif status == "failure":
|
|
41
|
+
return BatchFailure.from_pb(pb)
|
|
42
|
+
elif status == "notProcessed":
|
|
43
|
+
return BatchNotProcessed.from_pb(pb)
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def to_pb(self) -> PBSetCurrentStatesResponse:
|
|
47
|
+
"""
|
|
48
|
+
Creates a protobuf SetCurrentStatesResponse object with status.
|
|
49
|
+
"""
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class BatchSuccessful(SetCurrentStatesStatus):
|
|
55
|
+
"""
|
|
56
|
+
A response indicating all items in the batch were applied successfully.
|
|
57
|
+
|
|
58
|
+
Attributes:
|
|
59
|
+
batch_id: The unique identifier of the batch that was processed. This matches the
|
|
60
|
+
batch ID from the original request to allow correlation between request and response.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(self, batch_id: int):
|
|
64
|
+
super().__init__(batch_id)
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def from_pb(pb: PBSetCurrentStatesResponse) -> 'BatchSuccessful':
|
|
68
|
+
"""
|
|
69
|
+
Creates a BatchSuccessful object from a protobuf SetCurrentStatesResponse.
|
|
70
|
+
"""
|
|
71
|
+
return BatchSuccessful(batch_id=pb.messageId)
|
|
72
|
+
|
|
73
|
+
def to_pb(self) -> PBSetCurrentStatesResponse:
|
|
74
|
+
"""
|
|
75
|
+
Creates a protobuf SetCurrentStatesResponse object with success.
|
|
76
|
+
"""
|
|
77
|
+
return PBSetCurrentStatesResponse(messageId=self.batch_id, success=PBBatchSuccessful())
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass
|
|
81
|
+
class BatchFailure(SetCurrentStatesStatus):
|
|
82
|
+
"""
|
|
83
|
+
A response indicating one or more items in the batch couldn't be applied.
|
|
84
|
+
|
|
85
|
+
Attributes:
|
|
86
|
+
batch_id: The unique identifier of the batch that was processed. This matches the
|
|
87
|
+
batch ID from the original request to allow correlation between request and response.
|
|
88
|
+
partial_failure: Indicates if only some of the batch failed (True), or all entries in the batch failed (False).
|
|
89
|
+
failures: The status of each item processed in the batch that failed.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
def __init__(self, batch_id: int, partial_failure: bool, failures: Tuple['StateEventFailure', Any]):
|
|
93
|
+
super().__init__(batch_id)
|
|
94
|
+
self.partial_failure = partial_failure
|
|
95
|
+
self.failures = failures
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def from_pb(pb: PBSetCurrentStatesResponse) -> 'BatchFailure':
|
|
99
|
+
"""
|
|
100
|
+
Creates a BatchFailure object from a protobuf SetCurrentStatesResponse.
|
|
101
|
+
"""
|
|
102
|
+
failures: List['StateEventFailure'] = []
|
|
103
|
+
for fail in pb.failure.failed:
|
|
104
|
+
event_failure = StateEventFailure.from_pb(fail)
|
|
105
|
+
if event_failure is not None:
|
|
106
|
+
failures.append(event_failure)
|
|
107
|
+
|
|
108
|
+
return BatchFailure(batch_id=pb.messageId, partial_failure=pb.failure.partialFailure, failures=tuple(failures))
|
|
109
|
+
|
|
110
|
+
def to_pb(self) -> PBSetCurrentStatesResponse:
|
|
111
|
+
"""
|
|
112
|
+
Creates a protobuf SetCurrentStatesResponse object with failure.
|
|
113
|
+
"""
|
|
114
|
+
return PBSetCurrentStatesResponse(messageId=self.batch_id,
|
|
115
|
+
failure=PBBatchFailure(partialFailure=self.partial_failure, failed=[fail.to_pb() for fail in self.failures]))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass
|
|
119
|
+
class BatchNotProcessed(SetCurrentStatesStatus):
|
|
120
|
+
"""
|
|
121
|
+
A response indicating all items in the batch were ignored because the message ID of the batch was prior to the
|
|
122
|
+
last processed batch. This is expected when starting the service if the same item is sent to the current state
|
|
123
|
+
processing queue and is also included in the backlog processing response.
|
|
124
|
+
|
|
125
|
+
Attributes:
|
|
126
|
+
batch_id: The unique identifier of the batch that was processed. This matches the
|
|
127
|
+
batch ID from the original request to allow correlation between request and response.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
def __init__(self, batch_id: int):
|
|
131
|
+
super().__init__(batch_id)
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def from_pb(pb: PBSetCurrentStatesResponse) -> 'BatchNotProcessed':
|
|
135
|
+
"""
|
|
136
|
+
Creates a BatchNotProcessed object from a protobuf SetCurrentStatesResponse.
|
|
137
|
+
"""
|
|
138
|
+
return BatchNotProcessed(batch_id=pb.messageId)
|
|
139
|
+
|
|
140
|
+
def to_pb(self) -> PBSetCurrentStatesResponse:
|
|
141
|
+
"""
|
|
142
|
+
Creates a protobuf SetCurrentStatesResponse object with notProcessed.
|
|
143
|
+
"""
|
|
144
|
+
return PBSetCurrentStatesResponse(messageId=self.batch_id, notProcessed=PBBatchNotProcessed())
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class StateEventFailure(ABC):
|
|
148
|
+
"""
|
|
149
|
+
A wrapper class for allowing a one-of to be repeated.
|
|
150
|
+
|
|
151
|
+
Attributes:
|
|
152
|
+
event_id: The event ID of the state event that failed.
|
|
153
|
+
message: A message describing why the event failed.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
def __init__(self, event_id: str, message: str):
|
|
157
|
+
self.event_id = event_id
|
|
158
|
+
self.message = message
|
|
159
|
+
|
|
160
|
+
@staticmethod
|
|
161
|
+
def from_pb(pb: PBStateEventFailure) -> Optional['StateEventFailure']:
|
|
162
|
+
"""
|
|
163
|
+
Creates a StateEventFailure object from a protobuf StateEventFailure.
|
|
164
|
+
"""
|
|
165
|
+
reason_code = pb.WhichOneof('reason')
|
|
166
|
+
if reason_code == "unknownMrid":
|
|
167
|
+
return StateEventUnknownMrid.from_pb(pb)
|
|
168
|
+
elif reason_code == "duplicateMrid":
|
|
169
|
+
return StateEventDuplicateMrid.from_pb(pb)
|
|
170
|
+
elif reason_code == "invalidMrid":
|
|
171
|
+
return StateEventInvalidMrid.from_pb(pb)
|
|
172
|
+
elif reason_code == "unsupportedPhasing":
|
|
173
|
+
return StateEventUnsupportedPhasing.from_pb(pb)
|
|
174
|
+
elif reason_code == "unsupportedMrid":
|
|
175
|
+
return StateEventUnsupportedMrid.from_pb(pb)
|
|
176
|
+
else:
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
@abstractmethod
|
|
180
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
181
|
+
"""
|
|
182
|
+
Creates a protobuf StateEventFailure of the appropriate type.
|
|
183
|
+
"""
|
|
184
|
+
pass
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class StateEventUnknownMrid(StateEventFailure):
|
|
188
|
+
"""
|
|
189
|
+
The requested mRID was not found in the network.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
@staticmethod
|
|
193
|
+
def from_pb(pb: PBStateEventFailure) -> 'StateEventUnknownMrid':
|
|
194
|
+
"""
|
|
195
|
+
Creates a StateEventUnknownMrid object from a protobuf StateEventFailure.
|
|
196
|
+
"""
|
|
197
|
+
return StateEventUnknownMrid(pb.eventId, pb.message)
|
|
198
|
+
|
|
199
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
200
|
+
return PBStateEventFailure(
|
|
201
|
+
eventId=self.event_id,
|
|
202
|
+
message=self.message,
|
|
203
|
+
unknownMrid=PBStateEventUnknownMrid()
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class StateEventDuplicateMrid(StateEventFailure):
|
|
208
|
+
"""
|
|
209
|
+
The requested mRID already existed in the network and can't be used.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
@staticmethod
|
|
213
|
+
def from_pb(pb: PBStateEventFailure) -> 'StateEventDuplicateMrid':
|
|
214
|
+
"""
|
|
215
|
+
Creates a StateEventDuplicateMrid object from a protobuf StateEventFailure.
|
|
216
|
+
"""
|
|
217
|
+
return StateEventDuplicateMrid(pb.eventId, pb.message)
|
|
218
|
+
|
|
219
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
220
|
+
return PBStateEventFailure(
|
|
221
|
+
eventId=self.event_id,
|
|
222
|
+
message=self.message,
|
|
223
|
+
duplicateMrid=PBStateEventDuplicateMrid()
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class StateEventInvalidMrid(StateEventFailure):
|
|
228
|
+
"""
|
|
229
|
+
The requested mRID was found in the network model, but was of an invalid type.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
@staticmethod
|
|
233
|
+
def from_pb(pb: PBStateEventFailure) -> 'StateEventInvalidMrid':
|
|
234
|
+
"""
|
|
235
|
+
Creates a StateEventInvalidMrid object from a protobuf StateEventFailure.
|
|
236
|
+
"""
|
|
237
|
+
return StateEventInvalidMrid(pb.eventId, pb.message)
|
|
238
|
+
|
|
239
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
240
|
+
return PBStateEventFailure(
|
|
241
|
+
eventId=self.event_id,
|
|
242
|
+
message=self.message,
|
|
243
|
+
invalidMrid=PBStateEventInvalidMrid()
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class StateEventUnsupportedPhasing(StateEventFailure):
|
|
248
|
+
"""
|
|
249
|
+
The requested phasing was not available for the given operation. For example, an open state request was made with
|
|
250
|
+
unsupported phases.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
@staticmethod
|
|
254
|
+
def from_pb(pb: PBStateEventFailure) -> 'StateEventUnsupportedPhasing':
|
|
255
|
+
"""
|
|
256
|
+
Creates a StateEventUnsupportedPhasing object from a protobuf StateEventFailure.
|
|
257
|
+
"""
|
|
258
|
+
return StateEventUnsupportedPhasing(pb.eventId, pb.message)
|
|
259
|
+
|
|
260
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
261
|
+
return PBStateEventFailure(
|
|
262
|
+
eventId=self.event_id,
|
|
263
|
+
message=self.message,
|
|
264
|
+
unsupportedPhasing=PBStateEventUnsupportedPhasing()
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
class StateEventUnsupportedMrid(StateEventFailure):
|
|
269
|
+
"""
|
|
270
|
+
The mRID provided can't be used to perform the given action even though it is of the correct type. e.g. Trying to
|
|
271
|
+
open/close a switch in a voltage level that hasn't been implemented in the server.
|
|
272
|
+
"""
|
|
273
|
+
|
|
274
|
+
@staticmethod
|
|
275
|
+
def from_pb(pb: PBStateEventFailure) -> 'StateEventUnsupportedMrid':
|
|
276
|
+
"""
|
|
277
|
+
Creates a StateEventUnsupportedMrid object from a protobuf StateEventFailure.
|
|
278
|
+
"""
|
|
279
|
+
return StateEventUnsupportedMrid(pb.eventId, pb.message)
|
|
280
|
+
|
|
281
|
+
def to_pb(self) -> PBStateEventFailure:
|
|
282
|
+
return PBStateEventFailure(
|
|
283
|
+
eventId=self.event_id,
|
|
284
|
+
message=self.message,
|
|
285
|
+
unsupportedMrid=PBStateEventUnsupportedMrid()
|
|
286
|
+
)
|