diff --git a/otopcua-uns-loader/otopcua_uns.py b/otopcua-uns-loader/otopcua_uns.py index 7cac5b1..b97c5d9 100644 --- a/otopcua-uns-loader/otopcua_uns.py +++ b/otopcua-uns-loader/otopcua_uns.py @@ -253,11 +253,13 @@ def cmd_populate_equipment(args): # Drop any prior overlay (child rows first), then recreate. VirtualTag/Script go # before Equipment (VirtualTag.EquipmentId logical-FKs Equipment); the stub driver - # keeps no Tags so the Tag delete is just defensive for older overlays. + # keeps no Tags so the Tag delete is just defensive for older overlays. Equipment is + # scoped by its overlay UnsLine ('nw-line-%') — NOT by the EquipmentId, which is now the + # canonical 'EQ-'+uuid form (see DraftValidator) and no longer carries an 'nw-' prefix. cur.execute("DELETE FROM dbo.VirtualTag WHERE VirtualTagId LIKE %s", (EQ_ID_PREFIX + "%",)) cur.execute("DELETE FROM dbo.Script WHERE ScriptId LIKE %s", (EQ_ID_PREFIX + "%",)) cur.execute("DELETE FROM dbo.Tag WHERE DriverInstanceId=%s", (EQ_DRIVER,)) - cur.execute("DELETE FROM dbo.Equipment WHERE DriverInstanceId=%s", (EQ_DRIVER,)) + cur.execute("DELETE FROM dbo.Equipment WHERE UnsLineId LIKE 'nw-line-%'") cur.execute("DELETE FROM dbo.UnsLine WHERE UnsLineId LIKE 'nw-line-%'") cur.execute("DELETE FROM dbo.UnsArea WHERE UnsAreaId LIKE 'nw-area-%'") cur.execute("DELETE FROM dbo.DriverInstance WHERE DriverInstanceId=%s", (EQ_DRIVER,)) @@ -284,8 +286,12 @@ def cmd_populate_equipment(args): eq_n = vt_n = 0 for e in u["equipment"]: - eq_id = "nw-" + e["equipmentId"] - eq_uuid = str(uuid.uuid5(uuid.NAMESPACE_URL, "otopcua-nw-eq/" + e["equipmentId"])) + eq_uuid = uuid.uuid5(uuid.NAMESPACE_URL, "otopcua-nw-eq/" + e["equipmentId"]) + # Canonical EquipmentId: matches OtOpcUa DraftValidator.DeriveEquipmentId + # ("EQ-" + EquipmentUuid.ToString("N")[..12].ToLowerInvariant()). uuid.UUID.hex is + # already lowercase, 32 hex chars, no dashes — .hex[:12] is the first 12. + eq_id = "EQ-" + eq_uuid.hex[:12].lower() + eq_uuid = str(eq_uuid) cur.execute( "INSERT INTO dbo.Equipment (EquipmentRowId, EquipmentId, EquipmentUuid, DriverInstanceId, UnsLineId, " "Name, MachineCode, Manufacturer, Model, Enabled) VALUES (NEWID(), %s, %s, %s, %s, %s, %s, %s, %s, 1)", @@ -331,10 +337,12 @@ def cmd_clean(args): n = cur.rowcount # Also drop the company-shape Equipment overlay (child rows first): VirtualTag and # Script (both nweq-*) before Equipment, then any stub-driver Tag, then the rest. + # Equipment is scoped by its overlay UnsLine ('nw-line-%') — NOT by the EquipmentId, + # which is now the canonical 'EQ-'+uuid form (see DraftValidator) with no 'nw-' prefix. cur.execute("DELETE FROM dbo.VirtualTag WHERE VirtualTagId LIKE %s", (EQ_ID_PREFIX + "%",)) cur.execute("DELETE FROM dbo.Script WHERE ScriptId LIKE %s", (EQ_ID_PREFIX + "%",)) cur.execute("DELETE FROM dbo.Tag WHERE DriverInstanceId=%s", (EQ_DRIVER,)) - cur.execute("DELETE FROM dbo.Equipment WHERE DriverInstanceId=%s", (EQ_DRIVER,)) + cur.execute("DELETE FROM dbo.Equipment WHERE UnsLineId LIKE 'nw-line-%'") cur.execute("DELETE FROM dbo.UnsLine WHERE UnsLineId LIKE 'nw-line-%'") cur.execute("DELETE FROM dbo.UnsArea WHERE UnsAreaId LIKE 'nw-area-%'") cur.execute("DELETE FROM dbo.DriverInstance WHERE DriverInstanceId=%s", (EQ_DRIVER,))