From 5d73ee34e7b9a0707232defecb18773441b9cdd5 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 1 Oct 2026 11:39:35 +0200 Subject: [PATCH 1/3] Auswertungen: Namens-Dict erweitern nicht ersetzen --- packages/helpermodules/measurement_logging/write_log.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/helpermodules/measurement_logging/write_log.py b/packages/helpermodules/measurement_logging/write_log.py index 77e35c50a6..afe57cca2c 100644 --- a/packages/helpermodules/measurement_logging/write_log.py +++ b/packages/helpermodules/measurement_logging/write_log.py @@ -164,7 +164,12 @@ def save_log(): entries = content["entries"] entries.append(new_entry) - content["names"] = get_names(content["entries"][-1], sh_log_data.sh_names) + existing_names = content.get("names") + if not isinstance(existing_names, dict): + existing_names = {} + new_names = get_names(content["entries"][-1], sh_log_data.sh_names) + existing_names.update(new_names) + content["names"] = existing_names content["colors"] = get_colors(content["entries"][-1]) write_and_check(filepath, content) return content["entries"] @@ -384,7 +389,7 @@ def get_names(elements: Dict, sh_names: Dict, valid_names: Optional[Dict] = None Dictionary mit allen gültigen Namen, die in der Konfiguration hinterlegt sind. Ist None, wenn die Namen aus data ermittelt werden sollen. """ - names = sh_names + names = dict(sh_names) if isinstance(sh_names, dict) else {} for group in elements.items(): if group[0] not in ("bat", "consumer", "counter", "cp", "pv", "ev", "sh"): continue From e972b20e76c8655a73a8e0560695957a39113336 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 1 Oct 2026 12:11:52 +0200 Subject: [PATCH 2/3] add colors --- packages/helpermodules/measurement_logging/write_log.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/helpermodules/measurement_logging/write_log.py b/packages/helpermodules/measurement_logging/write_log.py index afe57cca2c..59f3002eed 100644 --- a/packages/helpermodules/measurement_logging/write_log.py +++ b/packages/helpermodules/measurement_logging/write_log.py @@ -170,7 +170,12 @@ def save_log(): new_names = get_names(content["entries"][-1], sh_log_data.sh_names) existing_names.update(new_names) content["names"] = existing_names - content["colors"] = get_colors(content["entries"][-1]) + existing_colors = content.get("colors") + if not isinstance(existing_colors, dict): + existing_colors = {} + new_colors = get_colors(content["entries"][-1]) + existing_colors.update(new_colors) + content["colors"] = existing_colors write_and_check(filepath, content) return content["entries"] except Exception: From 33f724369da1bb68baa0cebff4bccfb8e466e229 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 2 Oct 2026 12:32:19 +0200 Subject: [PATCH 3/3] add pytest --- .../measurement_logging/write_log_test.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/helpermodules/measurement_logging/write_log_test.py b/packages/helpermodules/measurement_logging/write_log_test.py index 11421bc76b..1ff6302b4f 100644 --- a/packages/helpermodules/measurement_logging/write_log_test.py +++ b/packages/helpermodules/measurement_logging/write_log_test.py @@ -1,4 +1,5 @@ from unittest.mock import Mock +import json from helpermodules.measurement_logging import write_log from helpermodules.measurement_logging.write_log import get_names @@ -121,3 +122,42 @@ def test_fix_values_missing_components(): 'pv': {'all': {'exported': 3269}, 'pv1': {'exported': 0}}, 'sh': {}, 'timestamp': 1709109001} + + +def test_save_log_keeps_existing_names_and_colors_when_writing_new_entry(monkeypatch): + # setup + existing_content = { + "entries": [{"timestamp": 1, "cp": {"cp1": {"imported": 1, "exported": 0}}}], + "names": {"cp1": "Bestehender Ladepunkt"}, + "colors": {"cp1": "#111111"}, + } + mocked_file = Mock() + mocked_file.__enter__ = Mock(return_value=mocked_file) + mocked_file.__exit__ = Mock(return_value=None) + mocked_file.read = Mock(return_value=json.dumps(existing_content)) + monkeypatch.setattr("builtins.open", Mock(return_value=mocked_file)) + monkeypatch.setattr(write_log.timecheck, "create_timestamp_YYYYMMDD", Mock(return_value="20261002")) + monkeypatch.setattr(write_log, "get_previous_entry", Mock(return_value=existing_content["entries"][-1])) + monkeypatch.setattr(write_log, "LegacySmartHomeLogData", Mock(return_value=Mock(sh_names={}, sh_dict={}))) + + new_entry = {"timestamp": 2, "cp": {"cp2": {"imported": 2, "exported": 0}}} + monkeypatch.setattr(write_log, "create_entry", Mock(return_value=new_entry)) + monkeypatch.setattr(write_log, "get_names", Mock( + return_value={"cp1": "Bestehender Ladepunkt", "cp2": "Neuer Ladepunkt"})) + monkeypatch.setattr(write_log, "get_colors", Mock(return_value={"cp1": "#111111", "cp2": "#222222"})) + write_and_check_mock = Mock() + monkeypatch.setattr(write_log, "write_and_check", write_and_check_mock) + + # execution + write_log.save_log() + + # evaluation + written_content = write_and_check_mock.call_args.args[1] + assert written_content["names"] == { + "cp1": "Bestehender Ladepunkt", + "cp2": "Neuer Ladepunkt", + } + assert written_content["colors"] == { + "cp1": "#111111", + "cp2": "#222222", + }