diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json new file mode 100644 index 0000000..22849a7 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:17Z" + }, + "lastModificationSignature": "c4aa68a4f62571cf6d849a47e59b28d57bd61ae5a604537c041dddf156ae7caf" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json new file mode 100644 index 0000000..bbd0dd7 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(88, 158, 249, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(88, 158, 249, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(88, 158, 249, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json new file mode 100644 index 0000000..f3ef911 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:24Z" + }, + "lastModificationSignature": "9249bad3cbdc85047473a1dde64734fa94bfdd65db0f489fd951f0418fca8784" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json new file mode 100644 index 0000000..1ca57f6 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(245, 95, 89, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(245, 95, 89, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(245, 95, 89, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json new file mode 100644 index 0000000..2d6a3d3 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:29Z" + }, + "lastModificationSignature": "1e87ebc5c34bb669001223707c04ff8f9bed1fdb1af60f1183e3b61922cec1fc" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json new file mode 100644 index 0000000..825d919 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json new file mode 100644 index 0000000..b8211ac --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:59:34Z" + }, + "lastModificationSignature": "acb0a55e90b90b5eec32cd4df512cb08aedbf6cf7b758579f9c6865c2346976b" + } +} \ No newline at end of file diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json new file mode 100644 index 0000000..022d5f3 --- /dev/null +++ b/MTN6_SCADA/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(247, 160, 96, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(247, 160, 96, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(247, 160, 96, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/MTN6_SCADA/ignition/script-python/utils/code.py b/MTN6_SCADA/ignition/script-python/utils/code.py index a8f08cb..546a465 100644 --- a/MTN6_SCADA/ignition/script-python/utils/code.py +++ b/MTN6_SCADA/ignition/script-python/utils/code.py @@ -1,10 +1,14 @@ def handleTagHighlight(view, currentValue): - tag = currentValue.value + tag_priority = currentValue.value - if tag == "": + if tag_priority == None: return - splitedTag = str(tag).split("/") + parts = str(tag_priority).split("||") + tag = parts[0] + + splitedTag = tag.split("/") + deviceName = splitedTag[-1] Docked_East_Map = { @@ -21,7 +25,12 @@ def handleTagHighlight(view, currentValue): Docked_East_View = Docked_East_Map["MCM"] components = view.rootContainer.getChildren() - + + priority = parts[1] + + foundMatch = False + +# clear all highlights and apply new one when found for child in components: params = child.props.get("params", {}) tagProps = params.get("tagProps", {}) @@ -30,11 +39,13 @@ def handleTagHighlight(view, currentValue): if len(tagsList) == 0: continue - tagPath = tagsList[0] + child.props.style.classes = "" + tagPath = tagsList[0] + if tag == tagPath: - child.props.style["classes"] = "Highlight/Pulse" + child.props.style["classes"] = "Highlight/Pulse-" + priority system.perspective.openDock(Docked_East_View, params={'tagProps': tagProps}) - return True + foundMatch = True - return False \ No newline at end of file + return foundMatch \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json new file mode 100644 index 0000000..f62f84b --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:56:25Z" + }, + "lastModificationSignature": "18bf39c86653c9dd5c4664422b3c1d40aa96d3931f0cd93cb0b7295c21817949" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json new file mode 100644 index 0000000..bbd0dd7 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Diagnostic/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(88, 158, 249, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(88, 158, 249, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(88, 158, 249, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json new file mode 100644 index 0000000..1f2a952 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:58:30Z" + }, + "lastModificationSignature": "f1be0638b51c37c24199bd33a7e875748cfa79940cb30b1b5ccf32e9e47936a7" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json new file mode 100644 index 0000000..1ca57f6 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-High/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(245, 95, 89, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(245, 95, 89, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(245, 95, 89, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json new file mode 100644 index 0000000..08a7064 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:52:14Z" + }, + "lastModificationSignature": "a27450cbd46150b09478dea57dc320cbb8435e455ebb5cc12d4e190540d59b9c" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json new file mode 100644 index 0000000..825d919 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Low/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(255, 255, 0, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(255, 255, 0, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(255, 255, 0, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json new file mode 100644 index 0000000..4277552 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T15:57:29Z" + }, + "lastModificationSignature": "91e91a98d401979733d172ccf64ea9605a06ec782fb929a21dbb582441acb784" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json new file mode 100644 index 0000000..022d5f3 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/style-classes/Highlight/Pulse-Medium/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "animation": { + "duration": "2.5s", + "keyframes": { + "0%": { + "boxShadow": "0 0 12px 5px rgba(247, 160, 96, 0.8)" + }, + "50%": { + "boxShadow": "0 0 20px 8px rgba(247, 160, 96, 1)" + }, + "100%": { + "boxShadow": "0 0 5px 2px rgba(247, 160, 96, 0.3)" + } + } + } + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json index 8649208..21e0b1a 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json @@ -687,9 +687,9 @@ { "events": { "component": { - "onRowClick": { + "onRowDoubleClick": { "config": { - "script": "\tdata \u003d self.props.selection.data\n\tif not data or len(data) !\u003d 1:\n\t return\n\t\n\trow \u003d data[0]\n\tclickedTagPath \u003d row.get(\"FullTag\", \"\")\n\tMCM \u003d row.get(\"Location\", \"\")\n\t\n\tMCM_Pages_Map \u003d {\n\t\t\"MCM01\": \"Detailed-Views/MCM01 Fluid Inbound Merges 1-4\",\n\t\t\"MCM02\": \"Detailed-Views/MCM02 Fluid Inbound Merges 5-7\",\n\t\t\"MCM03\": \"Detailed-Views/MCM03 Non Con\",\n\t\t\"MCM04\": \"Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM05\": \"Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve\",\n\t\t\"MCM06\": \"Detailed-Views/MCM06 Non Con\",\n\t\t\"MCM07\": \"Detailed-Views/MCM07 Bypass\",\n\t}\n\t\n\n\tpage \u003d MCM_Pages_Map.get(MCM)\n\t\n\tif not page:\n\t return\n\t\t\n\tdevice \u003d row.get(\"Device\", \"\")\n\t\n\tif not device or not clickedTagPath:\n\t\treturn\n\n\tpathToDevice \u003d \"\"\n\n#\tcheck for the mcm\n\tif \"MCM\" in device:\n\t\tparts \u003d clickedTagPath.split(\"/\")\n\t\tpathToDevice \u003d \"/\".join(parts[:3])\n\n\telse:\n\t\tindex \u003d clickedTagPath.find(device)\n\t\tif index \u003d\u003d -1:\n\t\t\treturn\n\t\tpathToDevice \u003d clickedTagPath[:index + len(device)]\n\n\t\t\n\t# Navigate to target view, passing the tag to highlight\n\tsystem.perspective.navigate(view \u003d page, params \u003d {\u0027highlightTagPath\u0027:pathToDevice})\n\t\n\t\n" + "script": "\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)\n\t\n\t" }, "scope": "G", "type": "script" @@ -1591,70 +1591,69 @@ { "Description": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01 - Hello world" + "value": "FL2078_2_VFD1 - Voltage" }, "Device": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01" + "value": "FL2078_2_VFD1" }, "Duration": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "01:05:19" + "value": "07:05:16" }, "FullTag": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "System/MCM01/MCM01/Beacon_Light" + "value": "System/MCM01/Conveyor/FL2078_2_VFD1/Voltage" }, "ID": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": 12 + "value": 8 }, "Location": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, "value": "MCM01" }, "Priority": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "High" + "value": "Diagnostic" }, "StartTimestamp": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, "value": { "$": [ "ts", 0, - 1750942947091 + 1750962272012 ], - "$ts": 1750939070000 + "$ts": 1750936755000 } }, "Tag": { "style": { - "classes": "Alarms-Styles/High" + "classes": "Alarms-Styles/Diagnostic" }, - "value": "MCM01.HMI.Beacon_Light" + "value": "FL2078_2_VFD1.HMI.Voltage" } } ], - "mode": "multiple interval", - "selectedColumn": "Location", - "selectedRow": 0 + "selectedColumn": "Duration", + "selectedRow": 2 } }, "type": "ia.display.table" @@ -1749,6 +1748,17 @@ { "children": [ { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "AlarmsTable" }, @@ -2523,6 +2533,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -2541,10 +2737,6 @@ }, "pager": { "activeOption": 5 - }, - "selection": { - "enableRowSelection": false, - "mode": "multiple interval" } }, "type": "ia.display.table" @@ -3171,6 +3363,17 @@ "$ts": 1750436956149 } }, + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t\n\tmyData \u003d self.props.selection.data\n\n\talarms.alarm_click.handleClick(myData)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "Table" }, @@ -3732,7 +3935,7 @@ "style": { "classes": "" }, - "title": "Severity" + "title": "" }, "justify": "center", "nullFormat": { @@ -3968,6 +4171,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -3989,7 +4378,22 @@ "bottom": false }, "selection": { - "enableRowSelection": false + "data": [ + { + "Description": "MCM01 - Hello world", + "Device": "MCM01", + "Duration": "06:30:56", + "EndTimestamp": null, + "FullTag": "System/MCM01/MCM01/Beacon_Light", + "ID": 12, + "Location": "MCM01", + "Priority": "High", + "StartTimestamp": "Thu Jun 26 2025 15:57:50 GMT+0400 (Georgia Standard Time)", + "Tag": "MCM01.HMI.Beacon_Light" + } + ], + "selectedColumn": "EndTimestamp", + "selectedRow": 0 }, "style": { "margin": 20 @@ -4381,6 +4785,7 @@ "contentStyle": { "classes": "Background-Styles/Grey-Background" }, + "currentTabIndex": 1, "menuType": "modern", "style": { "classes": "Background-Styles/Grey-Background" diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json index 56ca101..dd7a864 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Header/Header/view.json @@ -819,11 +819,12 @@ "enabled": true, "rate": "3" }, - "queryPath": "GetActiveAlarmsByLocationAndPriority" + "queryPath": "GetActiveAlarmsByLocationAndPriority", + "returnFormat": "json" }, "transforms": [ { - "code": "\tif value is None or not hasattr(system.dataset, \"toPyDataSet\"):\n\t\treturn \n\t\t\n\trows \u003d system.dataset.toPyDataSet(value)\n\t\n\ttotal \u003d sum(row[\"Count\"] for row in rows)\n\t\n\treturn total", + "code": "\ttotal \u003d sum(row[\"Count\"] for row in value if \"Count\" in row and row[\"Count\"] is not None)\n\treturn total", "type": "script" } ], diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json index e9e1ae1..f0787b1 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json @@ -1,18 +1,32 @@ { "custom": { - "MCM": "", - "currentTable": "HISTORY" + "MCM": 1, + "currentTable": "ACTIVE", + "page": "", + "view": "" }, "params": {}, "propConfig": { "custom.MCM": { + "binding": { + "config": { + "expression": "if({view.custom.view} !\u003d \"\", {view.custom.view}, {view.custom.page})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.currentTable": { + "persistent": true + }, + "custom.page": { "binding": { "config": { "path": "page.props.path" }, "transforms": [ { - "code": "\tpath \u003d value\n\ttry:\n\t\tif \"MCM\" in path:\n\t\t\tindex \u003d path.find(\"MCM\")\n\t\t\treturn path[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"\n\t", + "code": "\ttry:\n\t\tif \"MCM\" in value:\n\t\t\tindex \u003d value.find(\"MCM\")\n\t\t\treturn value[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"", "type": "script" } ], @@ -20,7 +34,19 @@ }, "persistent": true }, - "custom.currentTable": { + "custom.view": { + "binding": { + "config": { + "path": "page.props.primaryView" + }, + "transforms": [ + { + "code": "\ttry:\n\t\tif \"MCM\" in value:\n\t\t\tindex \u003d value.find(\"MCM\")\n\t\t\treturn value[index:index+5] # MCM + 2 digits\n\texcept:\n\t\t\tpass\n\treturn \"\"", + "type": "script" + } + ], + "type": "property" + }, "persistent": true } }, @@ -65,6 +91,17 @@ { "children": [ { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "active-table" }, @@ -755,6 +792,192 @@ "viewPath": "", "visible": true, "width": 80 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -772,14 +995,22 @@ }, "pager": { "bottom": false - }, - "selection": { - "mode": "multiple interval" } }, "type": "ia.display.table" }, { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "hitList-table" }, @@ -1569,6 +1800,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -1587,15 +2004,22 @@ "pager": { "activeOption": 5, "bottom": false - }, - "selection": { - "enableRowSelection": false, - "mode": "multiple interval" } }, "type": "ia.display.table" }, { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tdata \u003d self.props.selection.data\n\t\n\talarms.alarm_click.handleClick(data)" + }, + "scope": "G", + "type": "script" + } + } + }, "meta": { "name": "historical-table" }, @@ -2391,6 +2815,192 @@ "viewPath": "", "visible": true, "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "FullTag", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "display": "none" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" } ], "emptyMessage": { @@ -2409,9 +3019,6 @@ }, "pager": { "bottom": false - }, - "selection": { - "enableRowSelection": false } }, "scripts": { diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql index 3f3a3e2..b029688 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarms/query.sql @@ -1,69 +1,71 @@ -WITH Active AS ( - SELECT - ae.id, - ae.eventtime, - ae.eventid, - ae.source, - ae.priority, - ae.displaypath, - TIMESTAMPDIFF(SECOND, ae.eventtime, COALESCE(ae_clear.eventtime, NOW())) AS duration_seconds - FROM alarm_events ae - LEFT JOIN alarm_events ae_clear - ON ae.eventid = ae_clear.eventid AND ae_clear.eventtype = 1 - WHERE ae.eventtype = 0 - AND ae.displaypath NOT LIKE '%System Startup%' - AND ae.source NOT LIKE '%System Startup%' - GROUP BY ae.id -- Ensure one row per alarm -), -SingleMyTag AS ( - SELECT aed.id, aed.strValue - FROM alarm_event_data aed - WHERE aed.propname = 'myTag' - GROUP BY aed.id -- Collapse duplicates by id -), -SingleClear AS ( - SELECT eventid, MIN(eventtime) AS eventtime - FROM alarm_events - WHERE eventtype = 1 - GROUP BY eventid -) - -SELECT - Active.id AS ID, - Active.eventtime AS StartTimestamp, - Clear.eventtime AS EndTimestamp, - - CONCAT( - LPAD(FLOOR(Active.duration_seconds / 3600), 2, '0'), ':', - LPAD(FLOOR((Active.duration_seconds % 3600) / 60), 2, '0'), ':', - LPAD(Active.duration_seconds % 60, 2, '0') - ) AS Duration, - - CONCAT(Active.displaypath, ' - ', SUBSTRING_INDEX(Active.source, ':/alm:', -1)) AS Description, - - CASE Active.priority - WHEN 0 THEN 'Diagnostic' - WHEN 1 THEN 'Low' - WHEN 2 THEN 'Medium' - WHEN 3 THEN 'High' - WHEN 4 THEN 'Critical' - ELSE 'Unknown' - END AS Priority, - - CONCAT( - Active.displaypath, - '.HMI.', - SUBSTRING_INDEX(aed.strValue, '/', -1) - ) AS Tag, - - SUBSTRING_INDEX(SUBSTRING_INDEX(aed.strValue, '/', 2), '/', -1) AS Location - -FROM Active - -LEFT JOIN SingleClear Clear - ON Active.eventid = Clear.eventid - -LEFT JOIN SingleMyTag aed - ON aed.id = Active.id - -ORDER BY Active.eventtime DESC; +WITH Active AS ( + SELECT + ae.id, + ae.eventtime, + ae.eventid, + ae.source, + ae.priority, + ae.displaypath, + TIMESTAMPDIFF(SECOND, ae.eventtime, COALESCE(ae_clear.eventtime, NOW())) AS duration_seconds + FROM alarm_events ae + LEFT JOIN alarm_events ae_clear + ON ae.eventid = ae_clear.eventid AND ae_clear.eventtype = 1 + WHERE ae.eventtype = 0 + AND ae.displaypath NOT LIKE '%System Startup%' + AND ae.source NOT LIKE '%System Startup%' + GROUP BY ae.id -- Ensure one row per alarm +), +SingleMyTag AS ( + SELECT aed.id, aed.strValue + FROM alarm_event_data aed + WHERE aed.propname = 'myTag' + GROUP BY aed.id -- Collapse duplicates by id +), +SingleClear AS ( + SELECT eventid, MIN(eventtime) AS eventtime + FROM alarm_events + WHERE eventtype = 1 + GROUP BY eventid +) + +SELECT + Active.id AS ID, + Active.eventtime AS StartTimestamp, + Clear.eventtime AS EndTimestamp, + + CONCAT( + LPAD(FLOOR(Active.duration_seconds / 3600), 2, '0'), ':', + LPAD(FLOOR((Active.duration_seconds % 3600) / 60), 2, '0'), ':', + LPAD(Active.duration_seconds % 60, 2, '0') + ) AS Duration, + + CONCAT(Active.displaypath, ' - ', SUBSTRING_INDEX(Active.source, ':/alm:', -1)) AS Description, + + CASE Active.priority + WHEN 0 THEN 'Diagnostic' + WHEN 1 THEN 'Low' + WHEN 2 THEN 'Medium' + WHEN 3 THEN 'High' + WHEN 4 THEN 'Critical' + ELSE 'Unknown' + END AS Priority, + + CONCAT( + Active.displaypath, + '.HMI.', + SUBSTRING_INDEX(aed.strValue, '/', -1) + ) AS Tag, + + SUBSTRING_INDEX(SUBSTRING_INDEX(aed.strValue, '/', 2), '/', -1) AS Location , + aed.strValue AS FullTag, + Active.displaypath as Device + +FROM Active + +LEFT JOIN SingleClear Clear + ON Active.eventid = Clear.eventid + +LEFT JOIN SingleMyTag aed + ON aed.id = Active.id + +ORDER BY Active.eventtime DESC; diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql index fc32678..0cd98a1 100644 --- a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/named-query/GetAlarmsWithCount/query.sql @@ -9,7 +9,7 @@ SELECT '.HMI.', SUBSTRING_INDEX(aed.strValue, '/', -1) ) AS Tag, - + CASE Active.priority WHEN 0 THEN 'Diagnostic' WHEN 1 THEN 'Low' @@ -31,7 +31,11 @@ SELECT ) AS Duration, -- Total number of activations - COUNT(*) AS Count + COUNT(*) AS Count, + + -- Newly added columns + aed.strValue AS FullTag, + Active.displaypath AS Device FROM ( SELECT diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py new file mode 100644 index 0000000..d2c79c8 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/code.py @@ -0,0 +1,49 @@ +def handleClick(data): + if not data or len(data) != 1: + return + + row = data[0] + clickedTagPath = row.get("FullTag", "") + MCM = row.get("Location", "") + + MCM_Pages_Map = { + "MCM01": "Detailed-Views/MCM01 Fluid Inbound Merges 1-4", + "MCM02": "Detailed-Views/MCM02 Fluid Inbound Merges 5-7", + "MCM03": "Detailed-Views/MCM03 Non Con", + "MCM04": "Detailed-Views/MCM04 North Bulk Inbound, Fluid Outbound and Problem Solve", + "MCM05": "Detailed-Views/MCM05 South Bulk Inbound, Fluid Outbound and Problem Solve", + "MCM06": "Detailed-Views/MCM06 Non Con", + "MCM07": "Detailed-Views/MCM07 Bypass", + } + + + page = MCM_Pages_Map.get(MCM) + + if not page: + return + + device = row.get("Device", "") + + if not device or not clickedTagPath: + return + + pathToDevice = "" + + # check for the mcm + if "MCM" in device: + parts = clickedTagPath.split("/") + pathToDevice = "/".join(parts[:3]) + + else: + index = clickedTagPath.find(device) + if index == -1: + return + pathToDevice = clickedTagPath[:index + len(device)] + + priority = row.get("Priority", "") + + #combining with priority + combined = pathToDevice + "||" + priority + + # Navigate to target view, passing the tag to highlight + system.perspective.navigate(view = page, params = {'highlightTagPath': str(combined)}) \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json new file mode 100644 index 0000000..4fb4fbb --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/alarms/alarm_click/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-06-26T18:22:20Z" + }, + "hintScope": 2, + "lastModificationSignature": "b6ff9fb1f8b372d391f1e8e33122b287026821ab30ed938414fca2bd68f451a9" + } +} \ No newline at end of file