zepben.ewb 1.0.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zepben/ewb/__init__.py +601 -0
- zepben/ewb/auth/__init__.py +10 -0
- zepben/ewb/auth/client/__init__.py +5 -0
- zepben/ewb/auth/client/zepben_token_fetcher.py +273 -0
- zepben/ewb/auth/common/__init__.py +5 -0
- zepben/ewb/auth/common/auth_exception.py +16 -0
- zepben/ewb/auth/common/auth_method.py +28 -0
- zepben/ewb/auth/common/auth_provider_config.py +96 -0
- zepben/ewb/database/__init__.py +4 -0
- zepben/ewb/database/paths/__init__.py +4 -0
- zepben/ewb/database/paths/database_type.py +34 -0
- zepben/ewb/database/paths/ewb_data_file_paths.py +237 -0
- zepben/ewb/database/sqlite/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/common/base_cim_reader.py +212 -0
- zepben/ewb/database/sqlite/common/base_cim_writer.py +159 -0
- zepben/ewb/database/sqlite/common/base_collection_reader.py +96 -0
- zepben/ewb/database/sqlite/common/base_collection_writer.py +73 -0
- zepben/ewb/database/sqlite/common/base_database_reader.py +127 -0
- zepben/ewb/database/sqlite/common/base_database_tables.py +137 -0
- zepben/ewb/database/sqlite/common/base_database_writer.py +195 -0
- zepben/ewb/database/sqlite/common/base_entry_writer.py +34 -0
- zepben/ewb/database/sqlite/common/base_service_reader.py +50 -0
- zepben/ewb/database/sqlite/common/base_service_writer.py +104 -0
- zepben/ewb/database/sqlite/common/metadata_collection_reader.py +39 -0
- zepben/ewb/database/sqlite/common/metadata_collection_writer.py +38 -0
- zepben/ewb/database/sqlite/common/metadata_entry_reader.py +45 -0
- zepben/ewb/database/sqlite/common/metadata_entry_writer.py +41 -0
- zepben/ewb/database/sqlite/common/reader_exceptions.py +30 -0
- zepben/ewb/database/sqlite/customer/__init__.py +4 -0
- zepben/ewb/database/sqlite/customer/customer_cim_reader.py +169 -0
- zepben/ewb/database/sqlite/customer/customer_cim_writer.py +137 -0
- zepben/ewb/database/sqlite/customer/customer_database_reader.py +44 -0
- zepben/ewb/database/sqlite/customer/customer_database_tables.py +37 -0
- zepben/ewb/database/sqlite/customer/customer_database_writer.py +45 -0
- zepben/ewb/database/sqlite/customer/customer_service_reader.py +57 -0
- zepben/ewb/database/sqlite/customer/customer_service_writer.py +47 -0
- zepben/ewb/database/sqlite/diagram/__init__.py +4 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_reader.py +105 -0
- zepben/ewb/database/sqlite/diagram/diagram_cim_writer.py +81 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_reader.py +45 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_tables.py +29 -0
- zepben/ewb/database/sqlite/diagram/diagram_database_writer.py +44 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_reader.py +49 -0
- zepben/ewb/database/sqlite/diagram/diagram_service_writer.py +41 -0
- zepben/ewb/database/sqlite/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/extensions/prepared_statement.py +112 -0
- zepben/ewb/database/sqlite/extensions/result_set.py +153 -0
- zepben/ewb/database/sqlite/network/__init__.py +4 -0
- zepben/ewb/database/sqlite/network/network_cim_reader.py +3167 -0
- zepben/ewb/database/sqlite/network/network_cim_writer.py +2561 -0
- zepben/ewb/database/sqlite/network/network_database_reader.py +173 -0
- zepben/ewb/database/sqlite/network/network_database_tables.py +242 -0
- zepben/ewb/database/sqlite/network/network_database_writer.py +43 -0
- zepben/ewb/database/sqlite/network/network_service_reader.py +265 -0
- zepben/ewb/database/sqlite/network/network_service_writer.py +209 -0
- zepben/ewb/database/sqlite/tables/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/associations/loop_substation_relationship.py +17 -0
- zepben/ewb/database/sqlite/tables/associations/table_asset_organisation_roles_assets.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_assets_power_system_resources.py +41 -0
- zepben/ewb/database/sqlite/tables/associations/table_battery_units_battery_controls.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_substations.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_circuits_terminals.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_customer_agreements_pricing_structures.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_end_devices_end_device_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_equipment_containers.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_operational_restrictions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_equipment_usage_points.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_loops_substations.py +43 -0
- zepben/ewb/database/sqlite/tables/associations/table_pricing_structures_tariffs.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_protected_switches.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_functions_sensors.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_protection_relay_schemes_protection_relay_functions.py +40 -0
- zepben/ewb/database/sqlite/tables/associations/table_synchronous_machines_reactive_capability_curves.py +39 -0
- zepben/ewb/database/sqlite/tables/associations/table_usage_points_end_devices.py +40 -0
- zepben/ewb/database/sqlite/tables/column.py +37 -0
- zepben/ewb/database/sqlite/tables/exceptions.py +10 -0
- zepben/ewb/database/sqlite/tables/extensions/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_reclose_delays.py +38 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/assetinfo/table_relay_info.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61968/metering/table_pan_demand_response_functions.py +21 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/core/table_sites.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_loops.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/feeder/table_lv_feeders.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/generation/production/table_ev_charging_units.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_distance_relays.py +28 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_thresholds.py +36 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_function_time_limits.py +34 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_functions.py +24 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_schemes.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_protection_relay_systems.py +20 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/protection/table_voltage_relays.py +15 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_battery_controls.py +23 -0
- zepben/ewb/database/sqlite/tables/extensions/iec61970/base/wires/table_power_transformer_end_ratings.py +34 -0
- zepben/ewb/database/sqlite/tables/iec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_cable_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_no_load_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_open_circuit_tests.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_overhead_wire_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_power_transformer_info.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_short_circuit_tests.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_shunt_compensator_info.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_switch_info.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_end_info.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_tank_info.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_transformer_test.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assetinfo/table_wire_info.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_functions.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_info.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_organisation_roles.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_asset_owners.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_assets.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_streetlights.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/assets/table_structures.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_agreements.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_documents.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_address_field.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_location_street_addresses.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_locations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisation_roles.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_organisations.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_position_points.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_street_addresses.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/common/table_town_details.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customer_agreements.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_customers.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_pricing_structures.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/customers/table_tariffs.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_current_transformer_info.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassetinfo/table_potential_transformer_info.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/infiec61968/infassets/table_poles.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_device_functions.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_end_devices.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_meters.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61968/metering/table_usage_points.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61968/operations/table_operational_restrictions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_auxiliary_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_current_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_fault_indicators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_potential_transformers.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/auxiliaryequipment/table_sensors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_ac_dc_terminals.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_base_voltages.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_conducting_equipment.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_node_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_connectivity_nodes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curve_data.py +46 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_curves.py +17 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_equipment_containers.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_feeders.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_geographical_regions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_identified_objects.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_name_types.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_names.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_power_system_resources.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_sub_geographical_regions.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_substations.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/core/table_terminals.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_object_points.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagram_objects.py +31 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/diagramlayout/table_diagrams.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_branches.py +35 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/equivalents/table_equivalent_equipment.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_battery_units.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_photo_voltaic_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_units.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/generation/production/table_power_electronics_wind_units.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_accumulators.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_analogs.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_discretes.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_io_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/meas/table_measurements.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/protection/table_current_relays.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_controls.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_points.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/scada/table_remote_sources.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ac_line_segments.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_breakers.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_busbar_sections.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_clamps.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_conductors.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_connectors.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_cuts.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_earth_fault_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_connections.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumer_phases.py +37 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_consumers.py +26 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_source_phases.py +33 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_energy_sources.py +44 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_fuses.py +20 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ground_disconnectors.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounding_impedances.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_grounds.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_jumpers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_junctions.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_linear_shunt_compensators.py +23 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_lines.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_load_break_switches.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_impedances.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_line_parameters.py +14 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_phase_impedances.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_per_length_sequence_impedances.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_petersen_coils.py +27 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_phase_impedance_data.py +52 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connection_phases.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_electronics_connections.py +50 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformer_ends.py +43 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_power_transformers.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_protected_switches.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_ratio_tap_changers.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reactive_capability_curves.py +18 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_reclosers.py +15 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_cond_eq.py +19 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_regulating_controls.py +29 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_rotating_machines.py +36 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_series_compensators.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_shunt_compensators.py +22 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_static_var_compensator.py +24 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_switches.py +21 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_synchronous_machines.py +95 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changer_controls.py +28 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_tap_changers.py +25 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_ends.py +30 -0
- zepben/ewb/database/sqlite/tables/iec61970/base/wires/table_transformer_star_impedances.py +32 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/database/sqlite/tables/iec61970/infiec61970/feeder/table_circuits.py +27 -0
- zepben/ewb/database/sqlite/tables/sqlite_table.py +142 -0
- zepben/ewb/database/sqlite/tables/table_metadata_data_sources.py +21 -0
- zepben/ewb/database/sqlite/tables/table_version.py +38 -0
- zepben/ewb/dataclassy/__init__.py +15 -0
- zepben/ewb/dataclassy/dataclass.py +192 -0
- zepben/ewb/dataclassy/decorator.py +35 -0
- zepben/ewb/dataclassy/functions.py +80 -0
- zepben/ewb/examples/__init__.py +6 -0
- zepben/ewb/examples/simple_test_network.py +158 -0
- zepben/ewb/exceptions.py +52 -0
- zepben/ewb/model/__init__.py +4 -0
- zepben/ewb/model/busbranch/__init__.py +4 -0
- zepben/ewb/model/busbranch/bus_branch.py +1051 -0
- zepben/ewb/model/cim/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/assetinfo/relay_info.py +128 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61968/metering/pan_demand_reponse_function.py +112 -0
- zepben/ewb/model/cim/extensions/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/core/site.py +37 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +207 -0
- zepben/ewb/model/cim/extensions/iec61970/base/feeder/lv_feeder.py +258 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/generation/production/ev_charging_unit.py +18 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/distance_relay.py +69 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/power_direction_kind.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_kind.py +113 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_function.py +448 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_scheme.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/protection_relay_system.py +97 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/relay_setting.py +35 -0
- zepben/ewb/model/cim/extensions/iec61970/base/protection/voltage_relay.py +20 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control.py +36 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/battery_control_mode.py +82 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_cooling_type.py +56 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/transformer_end_rated_s.py +26 -0
- zepben/ewb/model/cim/extensions/iec61970/base/wires/vector_group.py +292 -0
- zepben/ewb/model/cim/extensions/zbex.py +17 -0
- zepben/ewb/model/cim/iec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assetinfo/cable_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/no_load_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/open_circuit_test.py +42 -0
- zepben/ewb/model/cim/iec61968/assetinfo/overhead_wire_info.py +15 -0
- zepben/ewb/model/cim/iec61968/assetinfo/power_transformer_info.py +103 -0
- zepben/ewb/model/cim/iec61968/assetinfo/short_circuit_test.py +67 -0
- zepben/ewb/model/cim/iec61968/assetinfo/shunt_compensator_info.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/switch_info.py +17 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_end_info.py +137 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_tank_info.py +108 -0
- zepben/ewb/model/cim/iec61968/assetinfo/transformer_test.py +26 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_info.py +24 -0
- zepben/ewb/model/cim/iec61968/assetinfo/wire_material_kind.py +55 -0
- zepben/ewb/model/cim/iec61968/assets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/assets/asset.py +154 -0
- zepben/ewb/model/cim/iec61968/assets/asset_container.py +16 -0
- zepben/ewb/model/cim/iec61968/assets/asset_function.py +15 -0
- zepben/ewb/model/cim/iec61968/assets/asset_info.py +19 -0
- zepben/ewb/model/cim/iec61968/assets/asset_organisation_role.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/asset_owner.py +13 -0
- zepben/ewb/model/cim/iec61968/assets/streetlight.py +29 -0
- zepben/ewb/model/cim/iec61968/assets/structure.py +16 -0
- zepben/ewb/model/cim/iec61968/common/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/common/agreement.py +16 -0
- zepben/ewb/model/cim/iec61968/common/document.py +36 -0
- zepben/ewb/model/cim/iec61968/common/location.py +129 -0
- zepben/ewb/model/cim/iec61968/common/organisation.py +15 -0
- zepben/ewb/model/cim/iec61968/common/organisation_role.py +22 -0
- zepben/ewb/model/cim/iec61968/common/position_point.py +44 -0
- zepben/ewb/model/cim/iec61968/common/street_address.py +28 -0
- zepben/ewb/model/cim/iec61968/common/street_detail.py +45 -0
- zepben/ewb/model/cim/iec61968/common/town_detail.py +25 -0
- zepben/ewb/model/cim/iec61968/customers/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/customers/customer.py +93 -0
- zepben/ewb/model/cim/iec61968/customers/customer_agreement.py +107 -0
- zepben/ewb/model/cim/iec61968/customers/customer_kind.py +67 -0
- zepben/ewb/model/cim/iec61968/customers/pricing_structure.py +88 -0
- zepben/ewb/model/cim/iec61968/customers/tariff.py +18 -0
- zepben/ewb/model/cim/iec61968/infiec61968/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/current_transformer_info.py +51 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/potential_transformer_info.py +33 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_construction_kind.py +67 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassetinfo/transformer_function_kind.py +43 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/pole.py +87 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infassets/streetlight_lamp_kind.py +25 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/infiec61968/infcommon/ratio.py +34 -0
- zepben/ewb/model/cim/iec61968/metering/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/metering/controlled_appliance.py +150 -0
- zepben/ewb/model/cim/iec61968/metering/end_device.py +165 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function.py +17 -0
- zepben/ewb/model/cim/iec61968/metering/end_device_function_kind.py +46 -0
- zepben/ewb/model/cim/iec61968/metering/meter.py +26 -0
- zepben/ewb/model/cim/iec61968/metering/usage_point.py +186 -0
- zepben/ewb/model/cim/iec61968/operations/__init__.py +4 -0
- zepben/ewb/model/cim/iec61968/operations/operational_restriction.py +92 -0
- zepben/ewb/model/cim/iec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/auxiliary_equipment.py +24 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/current_transformer.py +37 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/fault_indicator.py +18 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer.py +38 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/potential_transformer_kind.py +28 -0
- zepben/ewb/model/cim/iec61970/base/auxiliaryequipment/sensor.py +92 -0
- zepben/ewb/model/cim/iec61970/base/core/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/core/ac_dc_terminal.py +16 -0
- zepben/ewb/model/cim/iec61970/base/core/base_voltage.py +17 -0
- zepben/ewb/model/cim/iec61970/base/core/conducting_equipment.py +198 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node.py +105 -0
- zepben/ewb/model/cim/iec61970/base/core/connectivity_node_container.py +15 -0
- zepben/ewb/model/cim/iec61970/base/core/curve.py +124 -0
- zepben/ewb/model/cim/iec61970/base/core/curve_data.py +29 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment.py +366 -0
- zepben/ewb/model/cim/iec61970/base/core/equipment_container.py +199 -0
- zepben/ewb/model/cim/iec61970/base/core/feeder.py +260 -0
- zepben/ewb/model/cim/iec61970/base/core/geographical_region.py +82 -0
- zepben/ewb/model/cim/iec61970/base/core/identified_object.py +234 -0
- zepben/ewb/model/cim/iec61970/base/core/name.py +36 -0
- zepben/ewb/model/cim/iec61970/base/core/name_type.py +203 -0
- zepben/ewb/model/cim/iec61970/base/core/phase_code.py +201 -0
- zepben/ewb/model/cim/iec61970/base/core/power_system_resource.py +106 -0
- zepben/ewb/model/cim/iec61970/base/core/sub_geographical_region.py +93 -0
- zepben/ewb/model/cim/iec61970/base/core/substation.py +277 -0
- zepben/ewb/model/cim/iec61970/base/core/terminal.py +171 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram.py +109 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object.py +160 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_object_point.py +25 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/diagram_style.py +26 -0
- zepben/ewb/model/cim/iec61970/base/diagramlayout/orientation_kind.py +27 -0
- zepben/ewb/model/cim/iec61970/base/domain/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/domain/unit_symbol.py +492 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_branch.py +113 -0
- zepben/ewb/model/cim/iec61970/base/equivalents/equivalent_equipment.py +15 -0
- zepben/ewb/model/cim/iec61970/base/generation/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_state_kind.py +37 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/battery_unit.py +108 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/photo_voltaic_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_unit.py +28 -0
- zepben/ewb/model/cim/iec61970/base/generation/production/power_electronics_wind_unit.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/accumulator_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/analog_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/control.py +26 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete.py +13 -0
- zepben/ewb/model/cim/iec61970/base/meas/discrete_value.py +20 -0
- zepben/ewb/model/cim/iec61970/base/meas/iopoint.py +16 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement.py +60 -0
- zepben/ewb/model/cim/iec61970/base/meas/measurement_value.py +21 -0
- zepben/ewb/model/cim/iec61970/base/protection/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/protection/current_relay.py +23 -0
- zepben/ewb/model/cim/iec61970/base/scada/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_control.py +22 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_point.py +16 -0
- zepben/ewb/model/cim/iec61970/base/scada/remote_source.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/base/wires/ac_line_segment.py +214 -0
- zepben/ewb/model/cim/iec61970/base/wires/breaker.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/busbar_section.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/clamp.py +32 -0
- zepben/ewb/model/cim/iec61970/base/wires/conductor.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/connector.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/cut.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/disconnector.py +17 -0
- zepben/ewb/model/cim/iec61970/base/wires/earth_fault_compensator.py +21 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_connection.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer.py +107 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_consumer_phase.py +56 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source.py +172 -0
- zepben/ewb/model/cim/iec61970/base/wires/energy_source_phase.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/fuse.py +23 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/ground_disconnector.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/grounding_impedance.py +19 -0
- zepben/ewb/model/cim/iec61970/base/wires/jumper.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/junction.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/line.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/linear_shunt_compensator.py +26 -0
- zepben/ewb/model/cim/iec61970/base/wires/load_break_switch.py +14 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_impedance.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_line_parameter.py +13 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_phase_impedance.py +99 -0
- zepben/ewb/model/cim/iec61970/base/wires/per_length_sequence_impedance.py +43 -0
- zepben/ewb/model/cim/iec61970/base/wires/petersen_coil.py +22 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_impedance_data.py +37 -0
- zepben/ewb/model/cim/iec61970/base/wires/phase_shunt_connection_kind.py +38 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection.py +524 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_electronics_connection_phase.py +34 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer.py +217 -0
- zepben/ewb/model/cim/iec61970/base/wires/power_transformer_end.py +208 -0
- zepben/ewb/model/cim/iec61970/base/wires/protected_switch.py +96 -0
- zepben/ewb/model/cim/iec61970/base/wires/ratio_tap_changer.py +30 -0
- zepben/ewb/model/cim/iec61970/base/wires/reactive_capability_curve.py +16 -0
- zepben/ewb/model/cim/iec61970/base/wires/recloser.py +15 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_cond_eq.py +45 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control.py +173 -0
- zepben/ewb/model/cim/iec61970/base/wires/regulating_control_mode_kind.py +46 -0
- zepben/ewb/model/cim/iec61970/base/wires/rotating_machine.py +36 -0
- zepben/ewb/model/cim/iec61970/base/wires/series_compensator.py +42 -0
- zepben/ewb/model/cim/iec61970/base/wires/shunt_compensator.py +59 -0
- zepben/ewb/model/cim/iec61970/base/wires/single_phase_kind.py +105 -0
- zepben/ewb/model/cim/iec61970/base/wires/static_var_compensator.py +40 -0
- zepben/ewb/model/cim/iec61970/base/wires/svc_control_mode.py +28 -0
- zepben/ewb/model/cim/iec61970/base/wires/switch.py +119 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine.py +168 -0
- zepben/ewb/model/cim/iec61970/base/wires/synchronous_machine_kind.py +44 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer.py +150 -0
- zepben/ewb/model/cim/iec61970/base/wires/tap_changer_control.py +49 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_end.py +73 -0
- zepben/ewb/model/cim/iec61970/base/wires/transformer_star_impedance.py +48 -0
- zepben/ewb/model/cim/iec61970/base/wires/winding_connection.py +43 -0
- zepben/ewb/model/cim/iec61970/infiec61970/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/__init__.py +4 -0
- zepben/ewb/model/cim/iec61970/infiec61970/feeder/circuit.py +144 -0
- zepben/ewb/model/phases.py +168 -0
- zepben/ewb/model/resistance_reactance.py +40 -0
- zepben/ewb/services/__init__.py +4 -0
- zepben/ewb/services/common/__init__.py +16 -0
- zepben/ewb/services/common/base_service.py +383 -0
- zepben/ewb/services/common/base_service_comparator.py +394 -0
- zepben/ewb/services/common/difference.py +47 -0
- zepben/ewb/services/common/enum_mapper.py +55 -0
- zepben/ewb/services/common/meta/__init__.py +4 -0
- zepben/ewb/services/common/meta/data_source.py +16 -0
- zepben/ewb/services/common/meta/metadata_collection.py +28 -0
- zepben/ewb/services/common/meta/metadata_translations.py +47 -0
- zepben/ewb/services/common/meta/service_info.py +22 -0
- zepben/ewb/services/common/reference_resolvers.py +374 -0
- zepben/ewb/services/common/resolver.py +597 -0
- zepben/ewb/services/common/translator/__init__.py +4 -0
- zepben/ewb/services/common/translator/base_cim2proto.py +92 -0
- zepben/ewb/services/common/translator/base_proto2cim.py +112 -0
- zepben/ewb/services/common/translator/service_differences.py +81 -0
- zepben/ewb/services/common/translator/util.py +78 -0
- zepben/ewb/services/customer/__init__.py +4 -0
- zepben/ewb/services/customer/customer_service_comparator.py +52 -0
- zepben/ewb/services/customer/customers.py +23 -0
- zepben/ewb/services/customer/translator/__init__.py +21 -0
- zepben/ewb/services/customer/translator/customer_cim2proto.py +71 -0
- zepben/ewb/services/customer/translator/customer_enum_mappers.py +18 -0
- zepben/ewb/services/customer/translator/customer_proto2cim.py +87 -0
- zepben/ewb/services/diagram/__init__.py +4 -0
- zepben/ewb/services/diagram/diagram_service_comparator.py +39 -0
- zepben/ewb/services/diagram/diagrams.py +107 -0
- zepben/ewb/services/diagram/translator/__init__.py +11 -0
- zepben/ewb/services/diagram/translator/diagram_cim2proto.py +51 -0
- zepben/ewb/services/diagram/translator/diagram_enum_mappers.py +21 -0
- zepben/ewb/services/diagram/translator/diagram_proto2cim.py +61 -0
- zepben/ewb/services/measurement/__init__.py +4 -0
- zepben/ewb/services/measurement/measurements.py +35 -0
- zepben/ewb/services/measurement/translator/__init__.py +6 -0
- zepben/ewb/services/measurement/translator/measurement_cim2proto.py +42 -0
- zepben/ewb/services/measurement/translator/measurement_proto2cim.py +52 -0
- zepben/ewb/services/network/__init__.py +4 -0
- zepben/ewb/services/network/network_extensions.py +119 -0
- zepben/ewb/services/network/network_service.py +302 -0
- zepben/ewb/services/network/network_service_comparator.py +1322 -0
- zepben/ewb/services/network/network_state.py +34 -0
- zepben/ewb/services/network/tracing/__init__.py +4 -0
- zepben/ewb/services/network/tracing/busbranch_trace.py +36 -0
- zepben/ewb/services/network/tracing/connectivity/__init__.py +4 -0
- zepben/ewb/services/network/tracing/connectivity/connectivity_result.py +105 -0
- zepben/ewb/services/network/tracing/connectivity/nominal_phase_path.py +23 -0
- zepben/ewb/services/network/tracing/connectivity/phase_paths.py +70 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_connected.py +226 -0
- zepben/ewb/services/network/tracing/connectivity/terminal_connectivity_internal.py +64 -0
- zepben/ewb/services/network/tracing/connectivity/transformer_phase_paths.py +202 -0
- zepben/ewb/services/network/tracing/connectivity/xy_candidate_phase_paths.py +235 -0
- zepben/ewb/services/network/tracing/connectivity/xy_phase_step.py +24 -0
- zepben/ewb/services/network/tracing/feeder/__init__.py +4 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/assign_to_lv_feeders.py +202 -0
- zepben/ewb/services/network/tracing/feeder/clear_direction.py +80 -0
- zepben/ewb/services/network/tracing/feeder/direction_status.py +133 -0
- zepben/ewb/services/network/tracing/feeder/feeder_direction.py +107 -0
- zepben/ewb/services/network/tracing/feeder/set_direction.py +143 -0
- zepben/ewb/services/network/tracing/find_swer_equipment.py +175 -0
- zepben/ewb/services/network/tracing/networktrace/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/actions/equipment_tree_builder.py +71 -0
- zepben/ewb/services/network/tracing/networktrace/actions/tree_node.py +37 -0
- zepben/ewb/services/network/tracing/networktrace/compute_data.py +60 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/__init__.py +4 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/conditions.py +73 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/direction_condition.py +63 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_step_limit_condition.py +26 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/equipment_type_step_limit_condition.py +44 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_queue_condition.py +67 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/network_trace_stop_condition.py +65 -0
- zepben/ewb/services/network/tracing/networktrace/conditions/open_condition.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace.py +450 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_action_type.py +42 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_queue_next.py +84 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step.py +125 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_step_path_provider.py +351 -0
- zepben/ewb/services/network/tracing/networktrace/network_trace_tracker.py +39 -0
- zepben/ewb/services/network/tracing/networktrace/operators/__init__.py +14 -0
- zepben/ewb/services/network/tracing/networktrace/operators/equipment_container_state_operators.py +264 -0
- zepben/ewb/services/network/tracing/networktrace/operators/feeder_direction_state_operations.py +181 -0
- zepben/ewb/services/network/tracing/networktrace/operators/in_service_state_operators.py +76 -0
- zepben/ewb/services/network/tracing/networktrace/operators/network_state_operators.py +120 -0
- zepben/ewb/services/network/tracing/networktrace/operators/open_state_operators.py +104 -0
- zepben/ewb/services/network/tracing/networktrace/operators/phase_state_operators.py +56 -0
- zepben/ewb/services/network/tracing/networktrace/tracing.py +132 -0
- zepben/ewb/services/network/tracing/phases/__init__.py +4 -0
- zepben/ewb/services/network/tracing/phases/phase_inferrer.py +205 -0
- zepben/ewb/services/network/tracing/phases/phase_status.py +101 -0
- zepben/ewb/services/network/tracing/phases/remove_phases.py +143 -0
- zepben/ewb/services/network/tracing/phases/set_phases.py +490 -0
- zepben/ewb/services/network/tracing/traversal/__init__.py +4 -0
- zepben/ewb/services/network/tracing/traversal/context_value_computer.py +63 -0
- zepben/ewb/services/network/tracing/traversal/debug_logging.py +124 -0
- zepben/ewb/services/network/tracing/traversal/queue.py +112 -0
- zepben/ewb/services/network/tracing/traversal/queue_condition.py +75 -0
- zepben/ewb/services/network/tracing/traversal/step_action.py +83 -0
- zepben/ewb/services/network/tracing/traversal/step_context.py +59 -0
- zepben/ewb/services/network/tracing/traversal/stop_condition.py +57 -0
- zepben/ewb/services/network/tracing/traversal/traversal.py +634 -0
- zepben/ewb/services/network/tracing/traversal/traversal_condition.py +22 -0
- zepben/ewb/services/network/tracing/traversal/weighted_priority_queue.py +85 -0
- zepben/ewb/services/network/tracing/util.py +93 -0
- zepben/ewb/services/network/translator/__init__.py +392 -0
- zepben/ewb/services/network/translator/network_cim2proto.py +1782 -0
- zepben/ewb/services/network/translator/network_enum_mappers.py +78 -0
- zepben/ewb/services/network/translator/network_proto2cim.py +2147 -0
- zepben/ewb/services/services.py +48 -0
- zepben/ewb/streaming/__init__.py +4 -0
- zepben/ewb/streaming/data/__init__.py +4 -0
- zepben/ewb/streaming/data/current_state_event.py +314 -0
- zepben/ewb/streaming/data/current_state_event_batch.py +25 -0
- zepben/ewb/streaming/data/set_current_states_status.py +286 -0
- zepben/ewb/streaming/exceptions.py +14 -0
- zepben/ewb/streaming/get/__init__.py +4 -0
- zepben/ewb/streaming/get/consumer.py +209 -0
- zepben/ewb/streaming/get/customer_consumer.py +111 -0
- zepben/ewb/streaming/get/diagram_consumer.py +107 -0
- zepben/ewb/streaming/get/hierarchy/__init__.py +4 -0
- zepben/ewb/streaming/get/hierarchy/data.py +27 -0
- zepben/ewb/streaming/get/included_energized_containers.py +34 -0
- zepben/ewb/streaming/get/included_energizing_containers.py +34 -0
- zepben/ewb/streaming/get/network_consumer.py +870 -0
- zepben/ewb/streaming/get/query_network_state_client.py +64 -0
- zepben/ewb/streaming/get/query_network_state_service.py +94 -0
- zepben/ewb/streaming/grpc/__init__.py +4 -0
- zepben/ewb/streaming/grpc/auth_token_plugin.py +24 -0
- zepben/ewb/streaming/grpc/connect.py +209 -0
- zepben/ewb/streaming/grpc/grpc.py +107 -0
- zepben/ewb/streaming/grpc/grpc_channel_builder.py +185 -0
- zepben/ewb/streaming/mutations/__init__.py +4 -0
- zepben/ewb/streaming/mutations/update_network_state_client.py +80 -0
- zepben/ewb/streaming/mutations/update_network_state_service.py +61 -0
- zepben/ewb/testing/__init__.py +4 -0
- zepben/ewb/testing/test_network_builder.py +816 -0
- zepben/ewb/types.py +17 -0
- zepben/ewb/util.py +189 -0
- zepben_ewb-1.0.0b1.dist-info/METADATA +102 -0
- zepben_ewb-1.0.0b1.dist-info/RECORD +639 -0
- zepben_ewb-1.0.0b1.dist-info/WHEEL +5 -0
- zepben_ewb-1.0.0b1.dist-info/licenses/LICENSE +374 -0
- zepben_ewb-1.0.0b1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["ProtectionRelayFunction"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, List, Generator, Iterable, Callable, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.power_direction_kind import PowerDirectionKind
|
|
13
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_kind import ProtectionKind
|
|
14
|
+
from zepben.ewb.model.cim.extensions.zbex import zbex
|
|
15
|
+
from zepben.ewb.model.cim.iec61970.base.core.power_system_resource import PowerSystemResource
|
|
16
|
+
from zepben.ewb.util import require, nlen, ngen, safe_remove, get_by_mrid
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from zepben.ewb.model.cim.extensions.iec61968.assetinfo.relay_info import RelayInfo
|
|
20
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_scheme import ProtectionRelayScheme
|
|
21
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.relay_setting import RelaySetting
|
|
22
|
+
from zepben.ewb.model.cim.iec61970.base.auxiliaryequipment.sensor import Sensor
|
|
23
|
+
from zepben.ewb.model.cim.iec61970.base.wires.protected_switch import ProtectedSwitch
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@zbex
|
|
27
|
+
class ProtectionRelayFunction(PowerSystemResource):
|
|
28
|
+
"""
|
|
29
|
+
[ZBEX]
|
|
30
|
+
A function that a relay implements to protect equipment.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
model: Optional[str] = None
|
|
34
|
+
"""[ZBEX] The protection equipment type name(manufacturer information)."""
|
|
35
|
+
|
|
36
|
+
reclosing: Optional[bool] = None
|
|
37
|
+
"""[ZBEX] True if the protection equipment is reclosing or False otherwise."""
|
|
38
|
+
|
|
39
|
+
relay_delay_time: Optional[float] = None
|
|
40
|
+
"""[ZBEX] The time delay from detection of abnormal conditions to relay operation in seconds."""
|
|
41
|
+
|
|
42
|
+
protection_kind: ProtectionKind = ProtectionKind.UNKNOWN
|
|
43
|
+
"""[ZBEX] The kind of protection being provided by this ProtectionRelayFunction."""
|
|
44
|
+
|
|
45
|
+
directable: Optional[bool] = None
|
|
46
|
+
"""[ZBEX] Whether this ProtectionRelayFunction responds to power flow in a given direction."""
|
|
47
|
+
|
|
48
|
+
power_direction: PowerDirectionKind = PowerDirectionKind.UNKNOWN
|
|
49
|
+
"""[ZBEX] The flow of the power direction used by this ProtectionRelayFunction."""
|
|
50
|
+
|
|
51
|
+
_sensors: Optional[List[Sensor]] = None
|
|
52
|
+
|
|
53
|
+
_protected_switches: Optional[List[ProtectedSwitch]] = None
|
|
54
|
+
|
|
55
|
+
_schemes: Optional[List[ProtectionRelayScheme]] = None
|
|
56
|
+
|
|
57
|
+
_time_limits: Optional[List[float]] = None
|
|
58
|
+
|
|
59
|
+
_thresholds: Optional[List[RelaySetting]] = None
|
|
60
|
+
|
|
61
|
+
def __init__(self,
|
|
62
|
+
sensors: Iterable[Sensor] = None,
|
|
63
|
+
protected_switches: Iterable[ProtectedSwitch] = None,
|
|
64
|
+
schemes: Iterable[ProtectionRelayScheme] = None,
|
|
65
|
+
time_limits: Iterable[float] = None,
|
|
66
|
+
thresholds: Iterable[RelaySetting] = None,
|
|
67
|
+
relay_info: RelayInfo = None, **kwargs):
|
|
68
|
+
super(ProtectionRelayFunction, self).__init__(**kwargs)
|
|
69
|
+
|
|
70
|
+
if sensors is not None:
|
|
71
|
+
for sensor in sensors:
|
|
72
|
+
self.add_sensor(sensor)
|
|
73
|
+
if protected_switches is not None:
|
|
74
|
+
for protected_switch in protected_switches:
|
|
75
|
+
self.add_protected_switch(protected_switch)
|
|
76
|
+
if schemes is not None:
|
|
77
|
+
for scheme in schemes:
|
|
78
|
+
self.add_scheme(scheme)
|
|
79
|
+
if time_limits is not None:
|
|
80
|
+
for time_limit in time_limits:
|
|
81
|
+
self.add_time_limit(time_limit)
|
|
82
|
+
if thresholds is not None:
|
|
83
|
+
for threshold in thresholds:
|
|
84
|
+
self.add_threshold(threshold)
|
|
85
|
+
if relay_info is not None:
|
|
86
|
+
self.relay_info = relay_info
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def relay_info(self):
|
|
90
|
+
"""Datasheet information for this CurrentRelay"""
|
|
91
|
+
return self.asset_info
|
|
92
|
+
|
|
93
|
+
@relay_info.setter
|
|
94
|
+
def relay_info(self, relay_info: Optional[RelayInfo]):
|
|
95
|
+
self.asset_info = relay_info
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def thresholds(self) -> Generator[RelaySetting, None, None]:
|
|
99
|
+
"""
|
|
100
|
+
[ZBEX] Yields all the thresholds[:class:`RelaySettings<RelaySetting>`] for this :class:`ProtectionRelayFunction`. The order of thresholds corresponds to the order of time limits.
|
|
101
|
+
|
|
102
|
+
:return: A generator that iterates over all thresholds[:class:`RelaySettings<RelaySetting>`] for this relay function.
|
|
103
|
+
"""
|
|
104
|
+
return ngen(self._thresholds)
|
|
105
|
+
|
|
106
|
+
def for_each_threshold(self, action: Callable[[int, RelaySetting], None]):
|
|
107
|
+
"""
|
|
108
|
+
Call the `action` on each :class:`RelaySetting` in the `thresholds` collection
|
|
109
|
+
|
|
110
|
+
:param action: An action to apply to each :class:`RelaySetting` in the `thresholds` collection, taking the index of the threshold, and the threshold itself.
|
|
111
|
+
"""
|
|
112
|
+
for index, point in enumerate(self.thresholds):
|
|
113
|
+
action(index, point)
|
|
114
|
+
|
|
115
|
+
def add_threshold(self, threshold: RelaySetting, sequence_number: int = None) -> ProtectionRelayFunction:
|
|
116
|
+
"""
|
|
117
|
+
Add a threshold[:class:`RelaySetting`] to this :class:`ProtectionRelayFunction`'s list of thresholds.
|
|
118
|
+
|
|
119
|
+
:param threshold: The threshold[:class:`RelaySetting`] to add to this :class:`ProtectionRelayFunction`.
|
|
120
|
+
:param sequence_number: The sequence number of the `threshold` being added.
|
|
121
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
122
|
+
"""
|
|
123
|
+
if sequence_number is None:
|
|
124
|
+
sequence_number = self.num_thresholds()
|
|
125
|
+
require(0 <= sequence_number <= self.num_thresholds(),
|
|
126
|
+
lambda: f"Unable to add RelaySetting to {str(self)}. Sequence number {sequence_number} "
|
|
127
|
+
f"is invalid. Expected a value between 0 and {self.num_thresholds()}. Make sure you are "
|
|
128
|
+
f"adding the items in order and there are no gaps in the numbering.")
|
|
129
|
+
self._thresholds = list() if self._thresholds is None else self._thresholds
|
|
130
|
+
self._thresholds.insert(sequence_number, threshold)
|
|
131
|
+
return self
|
|
132
|
+
|
|
133
|
+
def num_thresholds(self) -> int:
|
|
134
|
+
"""
|
|
135
|
+
Get the number of thresholds for this :class:`ProtectionRelayFunction`.
|
|
136
|
+
|
|
137
|
+
:return: The number of thresholds for this `ProtectionRelayFunction`.
|
|
138
|
+
"""
|
|
139
|
+
return nlen(self._thresholds)
|
|
140
|
+
|
|
141
|
+
def get_threshold(self, sequence_number: int) -> RelaySetting:
|
|
142
|
+
"""
|
|
143
|
+
Get the threshold[:class:`RelaySetting`] for this :class:`ProtectionRelayFunction` by its `sequence_number`.
|
|
144
|
+
|
|
145
|
+
:param sequence_number: The sequence_number of the threshold :class:`RelaySetting` for this :class:`ProtectionRelayFunction`.
|
|
146
|
+
:returns: The threshold[:class:`RelaySetting`] for this :class:`ProtectionRelayFunction` with sequence number `sequence_number`
|
|
147
|
+
:raises IndexError: if no :class:`RelaySetting` was found with sequence_number `sequence_number`.
|
|
148
|
+
"""
|
|
149
|
+
if self._thresholds is not None:
|
|
150
|
+
return self._thresholds[sequence_number]
|
|
151
|
+
else:
|
|
152
|
+
raise IndexError(sequence_number)
|
|
153
|
+
|
|
154
|
+
def remove_threshold(self, threshold: RelaySetting) -> ProtectionRelayFunction:
|
|
155
|
+
"""
|
|
156
|
+
Removes a threshold[:class:`RelaySetting`] from this :class:`ProtectionRelayFunction`.
|
|
157
|
+
|
|
158
|
+
:param threshold: The threshold[:class:`RelaySetting`] to disassociate from this :class:`ProtectionRelayFunction`.
|
|
159
|
+
:returns: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
160
|
+
"""
|
|
161
|
+
self._thresholds = safe_remove(self._thresholds, threshold)
|
|
162
|
+
return self
|
|
163
|
+
|
|
164
|
+
def remove_threshold_at(self, sequence_number: int) -> RelaySetting:
|
|
165
|
+
"""
|
|
166
|
+
Removes a threshold[:class:`RelaySetting`] from this :class:`ProtectionRelayFunction`.
|
|
167
|
+
|
|
168
|
+
:param sequence_number: The sequence_number of the threshold[:class:`RelaySetting`] to disassociate from this :class:`ProtectionRelayFunction`.
|
|
169
|
+
:returns: A reference to removed threshold[:class:`RelaySetting`].
|
|
170
|
+
:raises IndexError: If `sequence_number` is out of range.
|
|
171
|
+
"""
|
|
172
|
+
threshold = self.get_threshold(sequence_number)
|
|
173
|
+
self._thresholds = safe_remove(self._thresholds, threshold)
|
|
174
|
+
return threshold
|
|
175
|
+
|
|
176
|
+
def clear_thresholds(self) -> ProtectionRelayFunction:
|
|
177
|
+
"""
|
|
178
|
+
Removes all thresholds from this :class:`ProtectionRelayFunction`.
|
|
179
|
+
|
|
180
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
181
|
+
"""
|
|
182
|
+
self._thresholds = None
|
|
183
|
+
return self
|
|
184
|
+
|
|
185
|
+
@property
|
|
186
|
+
def time_limits(self) -> Generator[float, None, None]:
|
|
187
|
+
"""
|
|
188
|
+
[ZBEX] Yields all the time limits (in seconds) for this relay function. Order of entries corresponds to the order of entries in thresholds.
|
|
189
|
+
|
|
190
|
+
:return: A generator that iterates over all time limits for this relay function.
|
|
191
|
+
"""
|
|
192
|
+
return ngen(self._time_limits)
|
|
193
|
+
|
|
194
|
+
def for_each_time_limit(self, action: Callable[[int, float], None]):
|
|
195
|
+
"""
|
|
196
|
+
Call the `action` on each time limit in the `time_limits` collection
|
|
197
|
+
|
|
198
|
+
:param action: An action to apply to each time limit in the `time_limits` collection, taking the index of the limit, and the limit itself.
|
|
199
|
+
"""
|
|
200
|
+
for index, limit in enumerate(self.time_limits):
|
|
201
|
+
action(index, limit)
|
|
202
|
+
|
|
203
|
+
def add_time_limit(self, time_limit: float, index: int = None) -> ProtectionRelayFunction:
|
|
204
|
+
"""
|
|
205
|
+
Add a time limit.
|
|
206
|
+
|
|
207
|
+
:param time_limit: The time limit in seconds to add to this :class:`ProtectionRelayFunction`.
|
|
208
|
+
:param index: The index into the list to add the time limit at. Defaults to the end of the list.
|
|
209
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
210
|
+
"""
|
|
211
|
+
if index is None:
|
|
212
|
+
index = self.num_time_limits()
|
|
213
|
+
require(0 <= index <= self.num_time_limits(),
|
|
214
|
+
lambda: f"Unable to add float to {str(self)}. Sequence number {index} "
|
|
215
|
+
f"is invalid. Expected a value between 0 and {self.num_time_limits()}. Make sure you are "
|
|
216
|
+
f"adding the items in order and there are no gaps in the numbering.")
|
|
217
|
+
self._time_limits = list() if self._time_limits is None else self._time_limits
|
|
218
|
+
self._time_limits.insert(index, time_limit)
|
|
219
|
+
return self
|
|
220
|
+
|
|
221
|
+
def num_time_limits(self) -> int:
|
|
222
|
+
return nlen(self._time_limits)
|
|
223
|
+
|
|
224
|
+
def get_time_limit(self, index: int):
|
|
225
|
+
"""
|
|
226
|
+
Get the time limit for this :class:`ProtectionRelayFunction` by its `index`.
|
|
227
|
+
|
|
228
|
+
:param index: The index of the desired time limit.
|
|
229
|
+
:returns: The time limit with the specified `index` if it exists.
|
|
230
|
+
:raises IndexError: if no time limit was found with provided index.
|
|
231
|
+
"""
|
|
232
|
+
if self._time_limits is not None:
|
|
233
|
+
return self._time_limits[index]
|
|
234
|
+
else:
|
|
235
|
+
raise IndexError(index)
|
|
236
|
+
|
|
237
|
+
def remove_time_limit(self, time_limit: float) -> ProtectionRelayFunction:
|
|
238
|
+
"""
|
|
239
|
+
Remove a time limit from the list.
|
|
240
|
+
|
|
241
|
+
:param time_limit: The time limit to remove.
|
|
242
|
+
:returns: A reference to this `ProtectionRelayFunction` to allow fluent use.
|
|
243
|
+
"""
|
|
244
|
+
self._time_limits = safe_remove(self._time_limits, time_limit)
|
|
245
|
+
return self
|
|
246
|
+
|
|
247
|
+
def remove_time_limit_at(self, index: int) -> float:
|
|
248
|
+
"""
|
|
249
|
+
Remove a time limit from the list.
|
|
250
|
+
|
|
251
|
+
:param index: The time limit to remove.
|
|
252
|
+
:returns: The time limit that was removed, or `None` if no time limit was present at `index`.
|
|
253
|
+
:raises IndexError: If `sequence_number` is out of range.
|
|
254
|
+
"""
|
|
255
|
+
if self._time_limits:
|
|
256
|
+
limit = self._time_limits.pop(index)
|
|
257
|
+
self._time_limits = self._time_limits if self._time_limits else None
|
|
258
|
+
return limit
|
|
259
|
+
raise IndexError(index)
|
|
260
|
+
|
|
261
|
+
def clear_time_limits(self) -> ProtectionRelayFunction:
|
|
262
|
+
"""
|
|
263
|
+
Removes all time limits from this :class:`ProtectionRelayFunction`.
|
|
264
|
+
|
|
265
|
+
:returns: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
266
|
+
"""
|
|
267
|
+
self._time_limits = None
|
|
268
|
+
return self
|
|
269
|
+
|
|
270
|
+
@property
|
|
271
|
+
def sensors(self) -> Generator[Sensor, None, None]:
|
|
272
|
+
"""
|
|
273
|
+
[ZBEX] Yields all the :class:`Sensors<Sensor>` for this relay function.
|
|
274
|
+
|
|
275
|
+
:return: A generator that iterates over all :class:`Sensors<Sensor>` for this relay function.
|
|
276
|
+
"""
|
|
277
|
+
return ngen(self._sensors)
|
|
278
|
+
|
|
279
|
+
def get_sensor(self, mrid: str) -> Sensor:
|
|
280
|
+
"""
|
|
281
|
+
Get a sensor :class:`Sensor` for this :class:`ProtectionRelayFunction` by its mrid.
|
|
282
|
+
|
|
283
|
+
:param mrid: The mrid of the desired :class:`Sensor`.
|
|
284
|
+
:returns: The :class:`Sensor` with the specified mrid if it exists, otherwise None.
|
|
285
|
+
:raises KeyError: If `mrid` wasn't present.
|
|
286
|
+
"""
|
|
287
|
+
return get_by_mrid(self._sensors, mrid)
|
|
288
|
+
|
|
289
|
+
def add_sensor(self, sensor: Sensor) -> ProtectionRelayFunction:
|
|
290
|
+
"""
|
|
291
|
+
Associate this :class:`ProtectionRelayFunction` with a :class:`Sensor`.
|
|
292
|
+
|
|
293
|
+
:param sensor: The :class:`Sensor` to associate with this :class:`ProtectionRelayFunction`.
|
|
294
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
295
|
+
"""
|
|
296
|
+
if self._validate_reference(sensor, self.get_sensor, "A Sensor"):
|
|
297
|
+
return self
|
|
298
|
+
self._sensors = list() if self._sensors is None else self._sensors
|
|
299
|
+
self._sensors.append(sensor)
|
|
300
|
+
return self
|
|
301
|
+
|
|
302
|
+
def num_sensors(self) -> int:
|
|
303
|
+
"""
|
|
304
|
+
Get the number of :class:`Sensors<Sensor>` for this :class:`ProtectionRelayFunction`.
|
|
305
|
+
|
|
306
|
+
:return: The number of :class:`Sensors<Sensor>` for this :class:`ProtectionRelayFunction`.
|
|
307
|
+
"""
|
|
308
|
+
return nlen(self._sensors)
|
|
309
|
+
|
|
310
|
+
def remove_sensor(self, sensor: Optional[Sensor]) -> ProtectionRelayFunction:
|
|
311
|
+
"""
|
|
312
|
+
Disassociate this :class:`ProtectionRelayFunction` from a :class:`Sensor`.
|
|
313
|
+
|
|
314
|
+
:param sensor: The :class:`Sensor` to disassociate from this :class:`ProtectionRelayFunction`.
|
|
315
|
+
:raises ValueError: If sensor was not associated with this :class:`ProtectionRelayFunction`.
|
|
316
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
317
|
+
"""
|
|
318
|
+
self._sensors = safe_remove(self._sensors, sensor)
|
|
319
|
+
return self
|
|
320
|
+
|
|
321
|
+
def clear_sensors(self) -> ProtectionRelayFunction:
|
|
322
|
+
"""
|
|
323
|
+
Disassociate all :class:`Sensors<Sensor>` from this :class:`ProtectionRelayFunction`.
|
|
324
|
+
|
|
325
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
326
|
+
"""
|
|
327
|
+
self._sensors = None
|
|
328
|
+
return self
|
|
329
|
+
|
|
330
|
+
@property
|
|
331
|
+
def protected_switches(self) -> Generator[ProtectedSwitch, None, None]:
|
|
332
|
+
"""
|
|
333
|
+
[ZBEX] Yields the :class:`ProtectedSwitches<ProtectedSwitch>` operated by this :class:`ProtectionRelayFunction`.
|
|
334
|
+
|
|
335
|
+
:return: A generator that iterates over all :class:`ProtectedSwitches<ProtectedSwitch>` operated by this :class:`ProtectionRelayFunction`.
|
|
336
|
+
"""
|
|
337
|
+
return ngen(self._protected_switches)
|
|
338
|
+
|
|
339
|
+
def get_protected_switch(self, mrid: str) -> ProtectedSwitch:
|
|
340
|
+
"""
|
|
341
|
+
Get a :class:`ProtectedSwitch` operated by this :class:`ProtectionRelayFunction` by its mrid.
|
|
342
|
+
|
|
343
|
+
:param mrid: The mrid of the desired :class:`ProtectedSwitch`.
|
|
344
|
+
:returns: The :class:`ProtectedSwitch` with the specified mrid if it exists, otherwise None.
|
|
345
|
+
:raises KeyError: If `mrid` wasn't present.
|
|
346
|
+
"""
|
|
347
|
+
return get_by_mrid(self._protected_switches, mrid)
|
|
348
|
+
|
|
349
|
+
def add_protected_switch(self, protected_switch: ProtectedSwitch) -> ProtectionRelayFunction:
|
|
350
|
+
"""
|
|
351
|
+
Associate this :class:`ProtectionRelayFunction` with a :class:`ProtectedSwitch` it operates.
|
|
352
|
+
|
|
353
|
+
:param protected_switch: The :class:`ProtectedSwitch` to associate with this :class:`ProtectionRelayFunction`.
|
|
354
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
355
|
+
"""
|
|
356
|
+
if self._validate_reference(protected_switch, self.get_protected_switch, "A ProtectedSwitch"):
|
|
357
|
+
return self
|
|
358
|
+
self._protected_switches = list() if self._protected_switches is None else self._protected_switches
|
|
359
|
+
self._protected_switches.append(protected_switch)
|
|
360
|
+
return self
|
|
361
|
+
|
|
362
|
+
def num_protected_switches(self) -> int:
|
|
363
|
+
"""
|
|
364
|
+
Get the number of :class:`ProtectedSwitches<ProtectedSwitch>` operated by this :class:`ProtectionRelayFunction`.
|
|
365
|
+
|
|
366
|
+
:return: The number of :class:`ProtectedSwitches<ProtectedSwitch>` operated by this :class:`ProtectionRelayFunction`.
|
|
367
|
+
"""
|
|
368
|
+
return nlen(self._protected_switches)
|
|
369
|
+
|
|
370
|
+
def remove_protected_switch(self, protected_switch: Optional[ProtectedSwitch]) -> ProtectionRelayFunction:
|
|
371
|
+
"""
|
|
372
|
+
Disassociate this :class:`ProtectionRelayFunction` from a :class:`ProtectedSwitch`.
|
|
373
|
+
|
|
374
|
+
:param protected_switch: The :class:`ProtectedSwitch` to disassociate from this :class:`ProtectionRelayFunction`.
|
|
375
|
+
:raises ValueError: If protected_switch was not associated with this :class:`ProtectionRelayFunction`.
|
|
376
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
377
|
+
"""
|
|
378
|
+
self._sensors = safe_remove(self._protected_switches, protected_switch)
|
|
379
|
+
return self
|
|
380
|
+
|
|
381
|
+
def clear_protected_switches(self) -> ProtectionRelayFunction:
|
|
382
|
+
"""
|
|
383
|
+
Disassociate all :class:`ProtectedSwitches<ProtectedSwitch>` from this :class:`ProtectionRelayFunction`.
|
|
384
|
+
|
|
385
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
386
|
+
"""
|
|
387
|
+
self._protected_switches = None
|
|
388
|
+
return self
|
|
389
|
+
|
|
390
|
+
@property
|
|
391
|
+
def schemes(self) -> Generator[ProtectionRelayScheme, None, None]:
|
|
392
|
+
"""
|
|
393
|
+
[ZBEX] Yields the :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` this :class:`ProtectionRelayFunction` operates under.
|
|
394
|
+
|
|
395
|
+
:return: A generator that iterates over all :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` this :class:`ProtectionRelayFunction` operates under.
|
|
396
|
+
"""
|
|
397
|
+
return ngen(self._schemes)
|
|
398
|
+
|
|
399
|
+
def get_scheme(self, mrid: str) -> ProtectionRelayScheme:
|
|
400
|
+
"""
|
|
401
|
+
Get a :class:`ProtectionRelayScheme` this :class:`ProtectionRelayFunction` operates under by its mRID.
|
|
402
|
+
|
|
403
|
+
:param mrid: The mRID of the desired :class:`ProtectionRelayScheme`.
|
|
404
|
+
:returns: The :class:`ProtectionRelayScheme` with the specified mrid if it exists, otherwise None.
|
|
405
|
+
:raises KeyError: If `mrid` wasn't present.
|
|
406
|
+
"""
|
|
407
|
+
return get_by_mrid(self._schemes, mrid)
|
|
408
|
+
|
|
409
|
+
def add_scheme(self, scheme: ProtectionRelayScheme) -> ProtectionRelayFunction:
|
|
410
|
+
"""
|
|
411
|
+
Associate this :class:`ProtectionRelayFunction` with a :class:`ProtectionRelayScheme` it operates under.
|
|
412
|
+
|
|
413
|
+
:param scheme: The :class:`ProtectionRelayScheme` to associate with this :class:`ProtectionRelayFunction`.
|
|
414
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
415
|
+
"""
|
|
416
|
+
if self._validate_reference(scheme, self.get_scheme, "A ProtectionRelayScheme"):
|
|
417
|
+
return self
|
|
418
|
+
self._schemes = list() if self._schemes is None else self._schemes
|
|
419
|
+
self._schemes.append(scheme)
|
|
420
|
+
return self
|
|
421
|
+
|
|
422
|
+
def num_schemes(self) -> int:
|
|
423
|
+
"""
|
|
424
|
+
Get the number of :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` this :class:`ProtectionRelayFunction` operates under.
|
|
425
|
+
|
|
426
|
+
:return: The number of:class:`ProtectionRelaySchemes<ProtectionRelayScheme>` operated by this :class:`ProtectionRelayFunction`.
|
|
427
|
+
"""
|
|
428
|
+
return nlen(self._schemes)
|
|
429
|
+
|
|
430
|
+
def remove_scheme(self, scheme: Optional[ProtectionRelayScheme]) -> ProtectionRelayFunction:
|
|
431
|
+
"""
|
|
432
|
+
Disassociate this :class:`ProtectionRelayFunction` from a :class:`ProtectionRelayScheme`.
|
|
433
|
+
|
|
434
|
+
:param scheme: The :class:`ProtectionRelayScheme` to disassociate from this :class:`ProtectionRelayFunction`.
|
|
435
|
+
:raises ValueError: If scheme was not associated with this :class:`ProtectionRelayFunction`.
|
|
436
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
437
|
+
"""
|
|
438
|
+
self._schemes = safe_remove(self._schemes, scheme)
|
|
439
|
+
return self
|
|
440
|
+
|
|
441
|
+
def clear_schemes(self) -> ProtectionRelayFunction:
|
|
442
|
+
"""
|
|
443
|
+
Disassociate all :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` from this :class:`ProtectionRelayFunction`.
|
|
444
|
+
|
|
445
|
+
:return: A reference to this :class:`ProtectionRelayFunction` for fluent use.
|
|
446
|
+
"""
|
|
447
|
+
self._schemes = None
|
|
448
|
+
return self
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["ProtectionRelayScheme"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, List, Generator, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.extensions.zbex import zbex
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.core.identified_object import IdentifiedObject
|
|
14
|
+
from zepben.ewb.util import ngen, get_by_mrid, nlen, safe_remove
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_system import ProtectionRelaySystem
|
|
18
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_function import ProtectionRelayFunction
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@zbex
|
|
22
|
+
class ProtectionRelayScheme(IdentifiedObject):
|
|
23
|
+
"""
|
|
24
|
+
[ZBEX]
|
|
25
|
+
A scheme that a group of relay functions implement. For example, typically schemes are primary and secondary, or main and failsafe.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
system: Optional[ProtectionRelaySystem] = None
|
|
29
|
+
"""[ZBEX] The system this scheme belongs to."""
|
|
30
|
+
|
|
31
|
+
_functions: Optional[List[ProtectionRelayFunction]] = None
|
|
32
|
+
|
|
33
|
+
def __init__(self, functions: Optional[List[ProtectionRelayFunction]] = None, **kwargs):
|
|
34
|
+
super(ProtectionRelayScheme, self).__init__(**kwargs)
|
|
35
|
+
if functions is not None:
|
|
36
|
+
for function in functions:
|
|
37
|
+
self.add_function(function)
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def functions(self) -> Generator[ProtectionRelayFunction, None, None]:
|
|
41
|
+
"""
|
|
42
|
+
[ZBEX] 6Yields all the functions operated as part of this :class:`ProtectionRelayScheme`.
|
|
43
|
+
|
|
44
|
+
:return: A generator that iterates over all functions operated as part of this :class:`ProtectionRelayScheme`.
|
|
45
|
+
"""
|
|
46
|
+
return ngen(self._functions)
|
|
47
|
+
|
|
48
|
+
def get_function(self, mrid: str) -> ProtectionRelayFunction:
|
|
49
|
+
"""
|
|
50
|
+
Get a :class:`ProtectionRelayFunction` operated as part of this :class:`ProtectionRelayScheme`.
|
|
51
|
+
|
|
52
|
+
:param mrid: The mrid of the desired :class:`ProtectionRelayFunction`.
|
|
53
|
+
:returns: The :class:`ProtectionRelayFunction` with the specified mrid if it exists, otherwise None.
|
|
54
|
+
:raises KeyError: If `mrid` wasn't present.
|
|
55
|
+
"""
|
|
56
|
+
return get_by_mrid(self._functions, mrid)
|
|
57
|
+
|
|
58
|
+
def add_function(self, function: ProtectionRelayFunction) -> ProtectionRelayScheme:
|
|
59
|
+
"""
|
|
60
|
+
Associate a :class:`ProtectionRelayFunction` with this :class:`ProtectionRelayScheme`.
|
|
61
|
+
|
|
62
|
+
:param function: The :class:`ProtectionRelayFunction` to associate with this :class:`ProtectionRelayScheme`.
|
|
63
|
+
:return: A reference to this :class:`ProtectionRelayScheme` for fluent use.
|
|
64
|
+
"""
|
|
65
|
+
if self._validate_reference(function, self.get_function, "A ProtectionRelayFunction"):
|
|
66
|
+
return self
|
|
67
|
+
self._functions = list() if self._functions is None else self._functions
|
|
68
|
+
self._functions.append(function)
|
|
69
|
+
return self
|
|
70
|
+
|
|
71
|
+
def num_functions(self) -> int:
|
|
72
|
+
"""
|
|
73
|
+
Get the number of :class:`ProtectionRelayFunctions<ProtectionRelayFunction>` operated as part of this :class:`ProtectionRelayScheme`.
|
|
74
|
+
|
|
75
|
+
:return: The number of :class:`ProtectionRelayFunctions<ProtectionRelayFunction>` operated as part of this :class:`ProtectionRelayScheme`.
|
|
76
|
+
"""
|
|
77
|
+
return nlen(self._functions)
|
|
78
|
+
|
|
79
|
+
def remove_function(self, function: Optional[ProtectionRelayFunction]) -> ProtectionRelayScheme:
|
|
80
|
+
"""
|
|
81
|
+
Disassociate this :class:`ProtectionRelayScheme` from a :class:`ProtectionRelayFunction`.
|
|
82
|
+
|
|
83
|
+
:param function: The :class:`ProtectionRelayFunction` to disassociate from this :class:`ProtectionRelayScheme`.
|
|
84
|
+
:raises ValueError: If function was not associated with this :class:`ProtectionRelayScheme`.
|
|
85
|
+
:return: A reference to this :class:`ProtectionRelayScheme` for fluent use.
|
|
86
|
+
"""
|
|
87
|
+
self._functions = safe_remove(self._functions, function)
|
|
88
|
+
return self
|
|
89
|
+
|
|
90
|
+
def clear_function(self) -> ProtectionRelayScheme:
|
|
91
|
+
"""
|
|
92
|
+
Disassociate all :class:`ProtectionRelayFunctions<ProtectionRelayFunction>` from this :class:`ProtectionRelayScheme`.
|
|
93
|
+
|
|
94
|
+
:return: A reference to this :class:`ProtectionRelayScheme` for fluent use.
|
|
95
|
+
"""
|
|
96
|
+
self._functions = None
|
|
97
|
+
return self
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__all__ = ["ProtectionRelaySystem"]
|
|
9
|
+
|
|
10
|
+
from typing import Optional, List, Generator, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_kind import ProtectionKind
|
|
13
|
+
from zepben.ewb.model.cim.extensions.zbex import zbex
|
|
14
|
+
from zepben.ewb.model.cim.iec61970.base.core.equipment import Equipment
|
|
15
|
+
from zepben.ewb.util import ngen, get_by_mrid, nlen, safe_remove
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from zepben.ewb.model.cim.extensions.iec61970.base.protection.protection_relay_scheme import ProtectionRelayScheme
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@zbex
|
|
22
|
+
class ProtectionRelaySystem(Equipment):
|
|
23
|
+
"""
|
|
24
|
+
[ZBEX]
|
|
25
|
+
A relay system for controlling ProtectedSwitches.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
protection_kind: ProtectionKind = ProtectionKind.UNKNOWN
|
|
29
|
+
"""[ZBEX] The kind of protection being provided by this protection equipment."""
|
|
30
|
+
|
|
31
|
+
_schemes: Optional[List[ProtectionRelayScheme]] = None
|
|
32
|
+
|
|
33
|
+
def __init__(self, schemes: Optional[List[ProtectionRelayScheme]] = None, **kwargs):
|
|
34
|
+
super(ProtectionRelaySystem, self).__init__(**kwargs)
|
|
35
|
+
if schemes is not None:
|
|
36
|
+
for scheme in schemes:
|
|
37
|
+
self.add_scheme(scheme)
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def schemes(self) -> Generator[ProtectionRelayScheme, None, None]:
|
|
41
|
+
"""
|
|
42
|
+
[ZBEX] Yields all the schemes implemented by this :class:`ProtectionRelaySystem`.
|
|
43
|
+
|
|
44
|
+
:return: A generator that iterates over all the schemes implemented by this :class:`ProtectionRelaySystem`.
|
|
45
|
+
"""
|
|
46
|
+
return ngen(self._schemes)
|
|
47
|
+
|
|
48
|
+
def get_scheme(self, mrid: str) -> ProtectionRelayScheme:
|
|
49
|
+
"""
|
|
50
|
+
Get a :class:`ProtectionRelayScheme` for this :class:`ProtectionRelaySystem` by its mRID.
|
|
51
|
+
|
|
52
|
+
:param mrid: The mRID of the desired :class:`ProtectionRelayScheme`.
|
|
53
|
+
:returns: The :class:`ProtectionRelayScheme` with the specified mrid if it exists, otherwise None.
|
|
54
|
+
:raises KeyError: If `mrid` wasn't present.
|
|
55
|
+
"""
|
|
56
|
+
return get_by_mrid(self._schemes, mrid)
|
|
57
|
+
|
|
58
|
+
def add_scheme(self, scheme: ProtectionRelayScheme) -> ProtectionRelaySystem:
|
|
59
|
+
"""
|
|
60
|
+
Add a :class:`ProtectionRelayScheme` to this :class:`ProtectionRelaySystem`.
|
|
61
|
+
|
|
62
|
+
:param scheme: The :class:`ProtectionRelayScheme` to add.
|
|
63
|
+
:return: A reference to this :class:`ProtectionRelaySystem` for fluent use.
|
|
64
|
+
"""
|
|
65
|
+
if self._validate_reference(scheme, self.get_scheme, "A ProtectionRelayScheme"):
|
|
66
|
+
return self
|
|
67
|
+
self._schemes = list() if self._schemes is None else self._schemes
|
|
68
|
+
self._schemes.append(scheme)
|
|
69
|
+
return self
|
|
70
|
+
|
|
71
|
+
def num_schemes(self) -> int:
|
|
72
|
+
"""
|
|
73
|
+
Get the number of :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` for this :class:`ProtectionRelaySystem`.
|
|
74
|
+
|
|
75
|
+
:return: The number of :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` for this :class:`ProtectionRelaySystem`.
|
|
76
|
+
"""
|
|
77
|
+
return nlen(self._schemes)
|
|
78
|
+
|
|
79
|
+
def remove_scheme(self, scheme: Optional[ProtectionRelayScheme]) -> ProtectionRelaySystem:
|
|
80
|
+
"""
|
|
81
|
+
Remove a :class:`ProtectionRelayScheme` from this :class:`ProtectionRelaySystem`.
|
|
82
|
+
|
|
83
|
+
:param scheme: The :class:`ProtectionRelayScheme` to remove.
|
|
84
|
+
:raises ValueError: If scheme was not associated with this :class:`ProtectionRelaySystem`.
|
|
85
|
+
:return: A reference to this :class:`ProtectionRelaySystem` for fluent use.
|
|
86
|
+
"""
|
|
87
|
+
self._schemes = safe_remove(self._schemes, scheme)
|
|
88
|
+
return self
|
|
89
|
+
|
|
90
|
+
def clear_scheme(self) -> ProtectionRelaySystem:
|
|
91
|
+
"""
|
|
92
|
+
Remove all :class:`ProtectionRelaySchemes<ProtectionRelayScheme>` from this :class:`ProtectionRelaySystem`.
|
|
93
|
+
|
|
94
|
+
:return: A reference to this :class:`ProtectionRelaySystem` for fluent use.
|
|
95
|
+
"""
|
|
96
|
+
self._schemes = None
|
|
97
|
+
return self
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Copyright 2025 Zeppelin Bend Pty Ltd
|
|
2
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
__all__ = ["RelaySetting"]
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from zepben.ewb.model.cim.extensions.zbex import zbex
|
|
13
|
+
from zepben.ewb.model.cim.iec61970.base.domain.unit_symbol import UnitSymbol
|
|
14
|
+
from zepben.ewb.util import require
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@zbex
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class RelaySetting:
|
|
20
|
+
"""
|
|
21
|
+
[ZBEX]
|
|
22
|
+
The threshold settings for a given relay.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
unit_symbol: UnitSymbol
|
|
26
|
+
"""[ZBEX] The unit of the value."""
|
|
27
|
+
|
|
28
|
+
value: float
|
|
29
|
+
"""[ZBEX] The value of the setting, e.g voltage, current, etc."""
|
|
30
|
+
|
|
31
|
+
name: Optional[str] = None
|
|
32
|
+
"""[ZBEX] The name of the setting."""
|
|
33
|
+
|
|
34
|
+
def __post_init__(self):
|
|
35
|
+
require(self.value is not None and not math.isnan(self.value), lambda: f"RelaySetting.value must be a real number. Provided: {self.value}")
|