From 4c9274ce1f221061df65eb7ad4aa172ad822a5dc Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Tue, 14 Oct 2025 16:59:48 +1100 Subject: [PATCH 1/2] no mo access private vars Signed-off-by: Max Chesterfield --- .../sqlite/network/network_cim_reader.py | 17 ++++++++++++----- .../sqlite/network/network_cim_writer.py | 8 +++----- .../cim/extensions/iec61970/base/feeder/loop.py | 9 ++++++--- .../network/network_service_comparator.py | 2 +- .../tracing/networktrace/network_trace.py | 6 ++---- .../network/tracing/traversal/traversal.py | 4 ++-- .../network/translator/network_cim2proto.py | 2 +- .../network/test_network_service_comparator.py | 2 +- 8 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py index 4cb9ba3b..8f14e54a 100644 --- a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py +++ b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py @@ -8,6 +8,7 @@ import sys from typing import Callable, Optional +from zepben.ewb import ControlledAppliance from zepben.ewb.database.sqlite.tables.associations.table_battery_units_battery_controls import TableBatteryUnitsBatteryControls from zepben.ewb.database.sqlite.tables.associations.table_end_devices_end_device_functions import TableEndDevicesEndDeviceFunctions from zepben.ewb.database.sqlite.tables.associations.table_synchronous_machines_reactive_capability_curves import \ @@ -401,10 +402,16 @@ def load_pan_demand_response_function(self, table: TablePanDemandResponseFunctio :return: True if the :class:`PanDemandResponseFunction` was successfully read from the database and added to the service. :raises SqlException: For any errors encountered reading from the database. """ - pan_demand_response_function = PanDemandResponseFunction(mrid=set_identifier(result_set.get_string(table.mrid.query_index))) + pan_demand_response_function = PanDemandResponseFunction( + mrid=set_identifier(result_set.get_string(table.mrid.query_index)), + appliances=( + ControlledAppliance(appliances=appliance_bitmask) + if (appliance_bitmask := result_set.get_int(table.appliance.query_index, on_none=None)) is not None + else None + ), + kind=EndDeviceFunctionKind[result_set.get_string(table.kind.query_index)] + ) - pan_demand_response_function.kind = EndDeviceFunctionKind[result_set.get_string(table.kind.query_index)] - pan_demand_response_function._appliance_bitmask = result_set.get_int(table.appliance.query_index, on_none=None) return self._load_end_device_functions(pan_demand_response_function, table, result_set) and self._add_or_throw(pan_demand_response_function) @@ -2590,8 +2597,8 @@ def _load_switch(self, switch: Switch, table: TableSwitches, result_set: ResultS SwitchInfo ) switch.rated_current = result_set.get_float(table.rated_current.query_index, on_none=None) - switch._normally_open = result_set.get_int(table.normal_open.query_index) - switch._open = result_set.get_int(table.open.query_index) + switch.set_normally_open(bool(result_set.get_int(table.normal_open.query_index))) + switch.set_open(bool(result_set.get_int(table.open.query_index))) return self._load_conducting_equipment(switch, table, result_set) diff --git a/src/zepben/ewb/database/sqlite/network/network_cim_writer.py b/src/zepben/ewb/database/sqlite/network/network_cim_writer.py index 46f86883..5dfbafee 100644 --- a/src/zepben/ewb/database/sqlite/network/network_cim_writer.py +++ b/src/zepben/ewb/database/sqlite/network/network_cim_writer.py @@ -354,7 +354,7 @@ def save_pan_demand_response_function(self, pan_demand_response_function: PanDem insert = self._database_tables.get_insert(TablePanDemandResponseFunctions) insert.add_value(table.kind.query_index, pan_demand_response_function.kind.short_name) - insert.add_value(table.appliance.query_index, pan_demand_response_function._appliance_bitmask) + insert.add_value(table.appliance.query_index, appliance.bitmask if (appliance := pan_demand_response_function.appliance) else None) return self._save_end_device_function(table, insert, pan_demand_response_function, "pan demand response function") @@ -2259,10 +2259,8 @@ def save_static_var_compensator(self, static_var_compensator: StaticVarCompensat return self._save_regulating_cond_eq(table, insert, static_var_compensator, "static var compensator") def _save_switch(self, table: TableSwitches, insert: PreparedStatement, switch: Switch, description: str) -> bool: - # noinspection PyProtectedMember - insert.add_value(table.normal_open.query_index, switch._normally_open) - # noinspection PyProtectedMember - insert.add_value(table.open.query_index, switch._open) + insert.add_value(table.normal_open.query_index, int(switch.is_normally_open())) + insert.add_value(table.open.query_index, int(switch.is_open())) insert.add_value(table.rated_current.query_index, switch.rated_current) insert.add_value(table.switch_info_mrid.query_index, self._mrid_or_none(switch.switch_info)) diff --git a/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py b/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py index 3bbcad2e..7ac688f3 100644 --- a/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py +++ b/src/zepben/ewb/model/cim/extensions/iec61970/base/feeder/loop.py @@ -89,7 +89,8 @@ def add_circuit(self, circuit: Circuit) -> Loop: """ if self._validate_reference(circuit, self.get_circuit, "An Circuit"): return self - self._circuits = list() if self._circuits is None else self._circuits + if self._circuits is None: + self._circuits = [] self._circuits.append(circuit) return self @@ -136,7 +137,8 @@ def add_substation(self, substation: Substation) -> Loop: """ if self._validate_reference(substation, self.get_substation, "An Substation"): return self - self._substations = list() if self._substations is None else self._substations + if self._substations is None: + self._substations = [] self._substations.append(substation) return self @@ -183,7 +185,8 @@ def add_energizing_substation(self, substation: Substation) -> Loop: """ if self._validate_reference(substation, self.get_energizing_substation, "An Substation"): return self - self._energizing_substations = list() if self._energizing_substations is None else self._energizing_substations + if self._energizing_substations is None: + self._energizing_substations = [] self._energizing_substations.append(substation) return self diff --git a/src/zepben/ewb/services/network/network_service_comparator.py b/src/zepben/ewb/services/network/network_service_comparator.py index af89f9cc..3c14466c 100644 --- a/src/zepben/ewb/services/network/network_service_comparator.py +++ b/src/zepben/ewb/services/network/network_service_comparator.py @@ -167,7 +167,7 @@ def _compare_pan_demand_response_function(self, source: PanDemandResponseFunctio diff = ObjectDifference(source, target) # noinspection PyProtectedMember - self._compare_values(diff, PanDemandResponseFunction.kind, PanDemandResponseFunction._appliance_bitmask) + self._compare_values(diff, PanDemandResponseFunction.kind, PanDemandResponseFunction.appliance) return self._compare_end_device_function(diff) diff --git a/src/zepben/ewb/services/network/tracing/networktrace/network_trace.py b/src/zepben/ewb/services/network/tracing/networktrace/network_trace.py index c5c88818..78598f64 100644 --- a/src/zepben/ewb/services/network/tracing/networktrace/network_trace.py +++ b/src/zepben/ewb/services/network/tracing/networktrace/network_trace.py @@ -400,11 +400,9 @@ def start_nominal_phase_path(phases: PhaseCode) -> Set[NominalPhasePath]: return {NominalPhasePath(it, it) for it in phases.single_phases} if phases and phases.single_phases else set() def has_visited(self, terminal: Terminal, phases: FrozenSet[SinglePhaseKind]) -> bool: - parent = self.parent - while parent is not None: - if parent._tracker.has_visited(terminal, phases): + if parent := self.parent: + if parent.has_visited(terminal, phases): return True - parent = parent.parent return self._tracker.has_visited(terminal, phases) def visit(self, terminal: Terminal, phases: FrozenSet[SinglePhaseKind]) -> bool: diff --git a/src/zepben/ewb/services/network/tracing/traversal/traversal.py b/src/zepben/ewb/services/network/tracing/traversal/traversal.py index 4f6a12fb..870d69da 100644 --- a/src/zepben/ewb/services/network/tracing/traversal/traversal.py +++ b/src/zepben/ewb/services/network/tracing/traversal/traversal.py @@ -354,7 +354,7 @@ def _(self, action: StepActionFunc) -> D: @if_not_stopping.register def _(self, action: StepAction) -> D: - action.apply = lambda it, context: action._func(it, context) if not context.is_stopping else None + action.apply = lambda it, context: StepAction.apply(action, it, context) if not context.is_stopping else None return self.add_step_action(action) @singledispatchmethod @@ -373,7 +373,7 @@ def _(self, action: StepActionFunc) -> D: @if_stopping.register def _(self, action: StepAction) -> D: - action.apply = lambda it, context: action._func(it, context) if context.is_stopping else None + action.apply = lambda it, context: StepAction.apply(action, it, context) if context.is_stopping else None return self.add_step_action(action) def copy_step_actions(self, other: Traversal[T, D]) -> D: diff --git a/src/zepben/ewb/services/network/translator/network_cim2proto.py b/src/zepben/ewb/services/network/translator/network_cim2proto.py index 78fefab1..8bd316bf 100644 --- a/src/zepben/ewb/services/network/translator/network_cim2proto.py +++ b/src/zepben/ewb/services/network/translator/network_cim2proto.py @@ -352,7 +352,7 @@ def pan_demand_response_function_to_pb(cim: PanDemandResponseFunction) -> PBPanD edf=end_device_function_to_pb(cim), kind=_map_end_device_function_kind.to_pb(cim.kind), **set_or_null( - appliance=cim._appliance_bitmask + appliance=appliance.bitmask if (appliance := cim.appliance) is not None else None ) ) diff --git a/test/services/network/test_network_service_comparator.py b/test/services/network/test_network_service_comparator.py index fa0629c1..20c5282e 100644 --- a/test/services/network/test_network_service_comparator.py +++ b/test/services/network/test_network_service_comparator.py @@ -97,7 +97,7 @@ def test_compare_pan_demand_response_function(self): lambda _: EndDeviceFunctionKind.demandResponse, lambda _: EndDeviceFunctionKind.onRequestRead ) - self.validator.validate_property(PanDemandResponseFunction._appliance_bitmask, PanDemandResponseFunction, lambda _: 1, lambda _: 2) + self.validator.validate_property(PanDemandResponseFunction.appliance, PanDemandResponseFunction, lambda _: 1, lambda _: 2) ################################# # Extensions IEC61970 Base Core # From 5645d50cdf624ee442af0ace20ab0abbe50413a9 Mon Sep 17 00:00:00 2001 From: Max Chesterfield Date: Thu, 16 Oct 2025 13:41:39 +1100 Subject: [PATCH 2/2] import right Signed-off-by: Max Chesterfield --- src/zepben/ewb/database/sqlite/network/network_cim_reader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py index 8f14e54a..4aecf885 100644 --- a/src/zepben/ewb/database/sqlite/network/network_cim_reader.py +++ b/src/zepben/ewb/database/sqlite/network/network_cim_reader.py @@ -8,7 +8,6 @@ import sys from typing import Callable, Optional -from zepben.ewb import ControlledAppliance from zepben.ewb.database.sqlite.tables.associations.table_battery_units_battery_controls import TableBatteryUnitsBatteryControls from zepben.ewb.database.sqlite.tables.associations.table_end_devices_end_device_functions import TableEndDevicesEndDeviceFunctions from zepben.ewb.database.sqlite.tables.associations.table_synchronous_machines_reactive_capability_curves import \ @@ -32,6 +31,7 @@ from zepben.ewb.model.cim.extensions.iec61970.base.wires.battery_control import BatteryControl from zepben.ewb.model.cim.extensions.iec61970.base.wires.battery_control_mode import BatteryControlMode from zepben.ewb.model.cim.iec61968.assets.asset_function import AssetFunction +from zepben.ewb.model.cim.iec61968.metering.controlled_appliance import ControlledAppliance from zepben.ewb.model.cim.iec61968.metering.end_device_function_kind import EndDeviceFunctionKind from zepben.ewb.model.cim.iec61970.base.core.curve import Curve from zepben.ewb.model.cim.iec61970.base.wires.earth_fault_compensator import EarthFaultCompensator