diff --git a/packages/helpermodules/measurement_logging/write_log.py b/packages/helpermodules/measurement_logging/write_log.py index 77e35c50a6..59f3002eed 100644 --- a/packages/helpermodules/measurement_logging/write_log.py +++ b/packages/helpermodules/measurement_logging/write_log.py @@ -164,8 +164,18 @@ def save_log(): entries = content["entries"] entries.append(new_entry) - content["names"] = get_names(content["entries"][-1], sh_log_data.sh_names) - content["colors"] = get_colors(content["entries"][-1]) + 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 + 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: @@ -384,7 +394,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 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", + }