From 1f4224671bc2cecb3650a24d7961c2141773512a Mon Sep 17 00:00:00 2001 From: LKuemmel <76958050+LKuemmel@users.noreply.github.com> Date: Thu, 13 Jun 2024 12:44:05 +0200 Subject: [PATCH] fix hierarchy validation (#1629) * fix hierarchy validation * reuse text --- packages/control/counter_all.py | 42 ++++++++++++++++--------- packages/control/hierarchy_test.py | 18 ++++++++++- packages/helpermodules/command.py | 20 +++--------- packages/helpermodules/update_config.py | 1 - 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/packages/control/counter_all.py b/packages/control/counter_all.py index 3c737f563d..4cb4c27e5b 100644 --- a/packages/control/counter_all.py +++ b/packages/control/counter_all.py @@ -59,8 +59,7 @@ class CounterAllData: class CounterAll: - """ - """ + MISSING_EVU_COUNTER = "Bitte erst einen EVU-Zähler konfigurieren." def __init__(self): self.data = CounterAllData() @@ -332,6 +331,22 @@ def _remove_item(self, child: Dict, current_entry: Dict, id: str, keep_children: else: return False + def hierarchy_add_item_below_evu(self, new_id: int, new_type: ComponentType) -> None: + try: + self.hierarchy_add_item_below(new_id, new_type, self.get_id_evu_counter()) + except (TypeError, IndexError): + if new_type == ComponentType.COUNTER: + # es gibt noch keinen EVU-Zähler + hierarchy = [{ + "id": new_id, + "type": ComponentType.COUNTER.value, + "children": self.data.get.hierarchy + }] + Pub().pub("openWB/set/counter/get/hierarchy", hierarchy) + self.data.get.hierarchy = hierarchy + else: + raise ValueError(self.MISSING_EVU_COUNTER) + def hierarchy_add_item_below(self, new_id: int, new_type: ComponentType, id_to_find: int) -> None: """ruft die rekursive Funktion zum Hinzufügen eines Elements als Kind des angegebenen Elements. """ @@ -419,24 +434,21 @@ def check_and_add(type_name: ComponentType, data_structure): break else: try: - self.hierarchy_add_item_below(entry_num, type_name, self.get_evu_counter().num) - except (TypeError, IndexError): - # es gibt noch keinen EVU-Zähler - hierarchy = [{ - "id": entry_num, - "type": ComponentType.COUNTER.value, - "children": data.data.counter_all_data.data.get.hierarchy - }] - Pub().pub("openWB/set/counter/get/hierarchy", hierarchy) - data.data.counter_all_data.data.get.hierarchy = hierarchy + self.hierarchy_add_item_below_evu(entry_num, type_name) + except ValueError: + pub_system_message({}, "Die Struktur des Lastmanagements ist nicht plausibel. Bitte prüfe die " + "Konfiguration und Anordnung der Komponenten in der Hierarchie.", + MessageType.WARNING) pub_system_message({}, f"{component_type_to_readable_text(type_name)} mit ID {element['id']} wurde" - " in der Hierarchie hinzugefügt, da kein Eintrag in der Hierarchie gefunden " - "wurde. Bitte prüfe die Anordnung der Komponenten in der Hierarchie.", + " in der Struktur des Lastmanagements hinzugefügt, da kein Eintrag in der " + "Struktur gefunden wurde. Bitte prüfe die Anordnung der Komponenten in der " + "Struktur.", MessageType.WARNING) - check_and_add(ComponentType.BAT, data.data.bat_data) + # Falls EVU-Zähler fehlt, zuerst hinzufügen. check_and_add(ComponentType.COUNTER, data.data.counter_data) + check_and_add(ComponentType.BAT, data.data.bat_data) check_and_add(ComponentType.CHARGEPOINT, data.data.cp_data) check_and_add(ComponentType.INVERTER, data.data.pv_data) diff --git a/packages/control/hierarchy_test.py b/packages/control/hierarchy_test.py index 2e142e7ec5..297a9d7a3b 100644 --- a/packages/control/hierarchy_test.py +++ b/packages/control/hierarchy_test.py @@ -367,7 +367,23 @@ def test_delete_obsolete_entries(hierarchy, data_): {"id": 5, "type": "cp", "children": []}]}, {"id": 2, "type": "bat", "children": []}, {"id": 1, "type": "inverter", "children": []} - ]}], id="add inverter 1") + ]}], id="add inverter 1"), + pytest.param([{"id": 3, "type": "cp", "children": []}, + {"id": 6, "type": "counter", + "children": [ + {"id": 4, "type": "cp", "children": []}, + {"id": 5, "type": "cp", "children": []}]}, + {"id": 2, "type": "bat", "children": []}], + [{"id": 0, "type": "counter", + "children": [ + {"id": 3, "type": "cp", "children": []}, + {"id": 6, "type": "counter", + "children": [ + {"id": 4, "type": "cp", "children": []}, + {"id": 5, "type": "cp", "children": []}]}, + {"id": 2, "type": "bat", "children": []}, + {"id": 1, "type": "inverter", "children": []} + ]}], id="add evu counter 0") ] ) def test_add_missing_entries(hierarchy, expected_hierarchy, data_, monkeypatch): diff --git a/packages/helpermodules/command.py b/packages/helpermodules/command.py index 14016588c1..98f864de64 100644 --- a/packages/helpermodules/command.py +++ b/packages/helpermodules/command.py @@ -434,22 +434,10 @@ def set_default(topic: str, defaults: dict): component_default["id"] = new_id general_type = special_to_general_type_mapping(payload["data"]["type"]) try: - data.data.counter_all_data.hierarchy_add_item_below( - new_id, general_type, data.data.counter_all_data.get_id_evu_counter()) - except (TypeError, IndexError): - if general_type == ComponentType.COUNTER: - # es gibt noch keinen EVU-Zähler - hierarchy = [{ - "id": new_id, - "type": ComponentType.COUNTER.value, - "children": data.data.counter_all_data.data.get.hierarchy - }] - Pub().pub("openWB/set/counter/get/hierarchy", hierarchy) - data.data.counter_all_data.data.get.hierarchy = hierarchy - else: - pub_user_message(payload, connection_id, - "Bitte erst einen EVU-Zähler konfigurieren!", MessageType.ERROR) - return + data.data.counter_all_data.hierarchy_add_item_below_evu(new_id, general_type) + except ValueError: + pub_user_message(payload, connection_id, counter_all.CounterAll.MISSING_EVU_COUNTER, MessageType.ERROR) + return # Bei Zählern müssen noch Standardwerte veröffentlicht werden. if general_type == ComponentType.BAT: topic = f"openWB/set/bat/{new_id}" diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 89a65b76f4..41bbeade7f 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -393,7 +393,6 @@ class UpdateConfig: "^openWB/system/device/module_update_completed$", "^openWB/system/ip_address$", "^openWB/system/lastlivevaluesJson$", - "^openWB/system/messages/[0-9]+$", "^openWB/system/mqtt/bridge/[0-9]+$", "^openWB/system/mqtt/valid_partner_ids$", "^openWB/system/release_train$",