From 65d98d3001591602397243d63e46682ee2d02809 Mon Sep 17 00:00:00 2001 From: guga kakhadze Date: Tue, 20 Jan 2026 08:36:21 +0400 Subject: [PATCH] initial version of the tags switching --- tags-switching/switch_tag_value_source.py | 139 ++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 tags-switching/switch_tag_value_source.py diff --git a/tags-switching/switch_tag_value_source.py b/tags-switching/switch_tag_value_source.py new file mode 100644 index 0000000..cdd0b63 --- /dev/null +++ b/tags-switching/switch_tag_value_source.py @@ -0,0 +1,139 @@ +import json +import os +import shutil +from datetime import datetime + +# ========================================================= +# FIND INPUT JSON IN CURRENT DIRECTORY +# ========================================================= + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +json_files = [ + f for f in os.listdir(SCRIPT_DIR) + if f.lower().endswith(".json") +] + +if len(json_files) == 0: + raise RuntimeError("No JSON file found in script directory.") + +if len(json_files) > 1: + raise RuntimeError( + "Multiple JSON files found. Keep only ONE JSON file in the folder:\n" + + "\n".join(json_files) + ) + +INPUT_JSON = os.path.join(SCRIPT_DIR, json_files[0]) + +# Output and backup paths (same folder) +timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + +BACKUP_JSON = os.path.join( + SCRIPT_DIR, + "tag_export_backup_%s.json" % timestamp +) + +OUTPUT_JSON = os.path.join( + SCRIPT_DIR, + "tag_export_modified_%s.json" % timestamp +) + +# ========================================================= +# USER SELECTION +# ========================================================= + +print("") +print("Select target tag source:") +print(" 1 = OPC") +print(" 2 = MEMORY") +print("") + +choice = raw_input("Enter choice (1 or 2): ").strip() + +if choice == "1": + TARGET_MODE = "OPC" +elif choice == "2": + TARGET_MODE = "MEMORY" +else: + raise ValueError("Invalid selection. Must be 1 or 2.") + +print("Target mode:", TARGET_MODE) + +# ========================================================= +# BACKUP ORIGINAL FILE +# ========================================================= + +shutil.copy2(INPUT_JSON, BACKUP_JSON) + +print("Backup created:") +print(" ", BACKUP_JSON) + +# ========================================================= +# JSON MODIFICATION LOGIC +# ========================================================= + +modified_count = 0 + +def process_node(node): + global modified_count + + if not isinstance(node, dict): + return + + tag_type = node.get("tagType") + value_source = node.get("valueSource") + + # Modify ONLY atomic tags + if tag_type == "AtomicTag": + if TARGET_MODE == "MEMORY": + if value_source != "memory": + node["valueSource"] = "memory" + node["opcItemPath"] = "" + modified_count += 1 + + elif TARGET_MODE == "OPC": + if value_source != "opc": + node["valueSource"] = "opc" + # opcItemPath preserved if it exists + modified_count += 1 + + # Recurse into child tags + for key in ("tags", "children"): + children = node.get(key) + if isinstance(children, list): + for child in children: + process_node(child) + +# ========================================================= +# LOAD → PROCESS → WRITE +# ========================================================= + +with open(INPUT_JSON, "r") as f: + data = json.load(f) + +if isinstance(data, list): + for root in data: + process_node(root) +else: + process_node(data) + +with open(OUTPUT_JSON, "w") as f: + json.dump(data, f, indent=2) + +# ========================================================= +# SUMMARY +# ========================================================= + +print("") +print("======================================") +print(" Tag Source Update Complete") +print("======================================") +print(" Input File :", INPUT_JSON) +print(" Backup File :", BACKUP_JSON) +print(" Output File :", OUTPUT_JSON) +print(" Target Mode :", TARGET_MODE) +print(" Tags Modified :", modified_count) +print("======================================") + +if modified_count == 0: + print("⚠ WARNING: No tags were modified.")