From 88bdae9da47eb8cafc8e2b30e961c90f827174c9 Mon Sep 17 00:00:00 2001 From: Salijoghli <107577102+Salijoghli@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:39:28 +0400 Subject: [PATCH] Changed history export to csv file. --- .../views/Alarm-Views/RealTime/view.json | 94 +++++++++++-------- 1 file changed, 56 insertions(+), 38 deletions(-) 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 b9b0634..3f2dc32 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 @@ -692,22 +692,7 @@ "children": [ { "custom": { - "rawData": [ - { - "style": { - "backgroundColor": "#ffeb3b" - }, - "value": { - "Description": "MCM01 Hello world", - "Duration": "01:42:53", - "EventTimestamp": "2025-06-20 15:07:03", - "Location": "MCM01", - "NumberID": 35, - "Priority": "Low", - "Tag": "MCM01.HMI.Beacon_Light" - } - } - ] + "rawData": [] }, "meta": { "name": "Table" @@ -1404,7 +1389,10 @@ } }, "filter": { - "enabled": true + "enabled": true, + "results": { + "enabled": true + } }, "selection": { "mode": "multiple interval" @@ -2434,17 +2422,17 @@ "$": [ "ts", 192, - 1750417660924 + 1750428991104 ], - "$ts": 1750417660924 + "$ts": 1750428991104 }, "startDate": { "$": [ "ts", 192, - 1750417660924 + 1750428991104 ], - "$ts": 1750414060924 + "$ts": 1750414591104 } }, "meta": { @@ -2617,7 +2605,7 @@ } }, "props": { - "formattedValue": "Jun 20, 2025 2:07 PM", + "formattedValue": "Jun 20, 2025 2:16 PM", "style": { "margin": 15 } @@ -2702,7 +2690,7 @@ } }, "props": { - "formattedValue": "Jun 20, 2025 3:07 PM", + "formattedValue": "Jun 20, 2025 6:16 PM", "maxDate": { "$": [ "ts", @@ -2718,9 +2706,9 @@ "$": [ "ts", 192, - 1750417660924 + 1750428991104 ], - "$ts": 1750417660924 + "$ts": 1750428991104 } }, "scripts": { @@ -2910,17 +2898,17 @@ "$": [ "ts", 192, - 1750417660924 + 1750428991105 ], - "$ts": 1750414060924 + "$ts": 1750414591104 }, "time_to_filter": { "$": [ "ts", 192, - 1750417660924 + 1750428991105 ], - "$ts": 1750417660924 + "$ts": 1750428991104 } }, "meta": { @@ -3721,6 +3709,36 @@ "enabled": true, "results": { "data": [ + { + "Description": "MCM01 - Hello world", + "Duration": "00:00:32", + "EndTimestamp": 1750427866000, + "ID": 39, + "Location": "MCM01", + "Priority": "Low", + "StartTimestamp": 1750427834000, + "Tag": "MCM01.HMI.Beacon_Light" + }, + { + "Description": "MCM01 - Hello world", + "Duration": "02:49:21", + "EndTimestamp": 1750427784000, + "ID": 35, + "Location": "MCM01", + "Priority": "Low", + "StartTimestamp": 1750417623000, + "Tag": "MCM01.HMI.Beacon_Light" + }, + { + "Description": "MCM01 - Hello world", + "Duration": "02:49:21", + "EndTimestamp": 1750427784000, + "ID": 36, + "Location": "MCM01", + "Priority": "Low", + "StartTimestamp": 1750417623000, + "Tag": "MCM01.HMI.Beacon_Light" + }, { "Description": "MCM01 - Hello world", "Duration": "00:00:06", @@ -4212,12 +4230,12 @@ "data": [ { "Description": "MCM01 - Hello world", - "Duration": "01:42:53", - "EndTimestamp": null, - "ID": 35, + "Duration": "00:00:32", + "EndTimestamp": 1750427866000, + "ID": 39, "Location": "MCM01", "Priority": "Low", - "StartTimestamp": 1750417623000, + "StartTimestamp": 1750427834000, "Tag": "MCM01.HMI.Beacon_Light" } ], @@ -4346,17 +4364,17 @@ "$": [ "ts", 192, - 1750417660924 + 1750428991105 ], - "$ts": 1750414060924 + "$ts": 1750414591104 }, "time_to_filter": { "$": [ "ts", 192, - 1750417660924 + 1750428991105 ], - "$ts": 1750417660924 + "$ts": 1750428991104 }, "type_filters": null }, @@ -4364,7 +4382,7 @@ "component": { "onActionPerformed": { "config": { - "script": " try:\n # Get filtered data from table (array of dicts)\n filtered_results \u003d self.parent.parent.getChild(\"Table\").getChild(\"Table\").props.filter.results\n filtered_data \u003d filtered_results.data\n \n # Ensure data is valid\n if not filtered_data:\n return\n \n # Get columns from first record\n columns \u003d filtered_data[0].keys()\n \n # Create a list of rows\n rows \u003d []\n for i in range(len(filtered_data)):\n row_dict \u003d filtered_data[i]\n row \u003d [row_dict.get(col) for col in columns]\n rows.append(row)\n \n # Convert to dataset and export\n dataset \u003d system.dataset.toDataSet(columns, rows)\n html_data \u003d system.dataset.dataSetToHTML(1, dataset, \"Filtered Results\")\n system.perspective.download(\"filtered_alarms_history.html\", html_data)\n \n print \"Export completed successfully! Exported\", len(rows), \"records.\"\n \n except Exception as e:\n print \"Export failed:\", str(e)\n\n\t" + "script": "\n from datetime import datetime\n def format_date(value):\n\t\tif isinstance(value, (int, long)) and value \u003e 10000000:\n\t\t\ttimestamp \u003d system.date.fromMillis(value)\n\t\t\treturn system.date.format(timestamp, \"yyyy-MM-dd HH:mm:ss\")\n\t\t\t\n\t\t# If value is not a valid timestamp, return as-is\n\t\treturn str(value)\n \n try:\n\n # Get filtered data\n table \u003d self.parent.parent.getChild(\"Table\").getChild(\"Table\")\n filtered_data \u003d table.props.filter.results.data\n\n if not filtered_data or len(filtered_data) \u003d\u003d 0:\n system.perspective.print(\"No filtered data to export.\")\n return\n\n # Get correct column order from the table\u0027s column config\n column_order \u003d [col[\"field\"] for col in table.props.columns if \"field\" in col]\n\n csv_content \u003d \",\".join(column_order) + \"\\n\"\n\n # Build rows\n for row_dict in filtered_data:\n row \u003d []\n for col in column_order:\n raw_val \u003d row_dict.get(col, \"\")\n value \u003d format_date(raw_val)\n value \u003d value.replace(\",\", \";\") # CSV safety\n row.append(value)\n csv_content +\u003d \",\".join(row) + \"\\n\"\n\n # Export CSV\n csv_bytes \u003d csv_content.encode(\"utf-8\")\n system.perspective.download(\"filtered_alarms_history.csv\", csv_bytes)\n\n system.perspective.print(\"CSV export completed successfully. Exported %d records.\" % len(filtered_data))\n\n except Exception as e:\n system.perspective.print(\"Export failed: \" + str(e))" }, "scope": "G", "type": "script"