diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/stylesheet/stylesheet.css b/MTN6_SCADA/com.inductiveautomation.perspective/stylesheet/stylesheet.css index 72ca2a6..412f1a5 100644 --- a/MTN6_SCADA/com.inductiveautomation.perspective/stylesheet/stylesheet.css +++ b/MTN6_SCADA/com.inductiveautomation.perspective/stylesheet/stylesheet.css @@ -83,4 +83,20 @@ div[data-component="ia.input.fileupload"] .ia_button--primary { .psc-rotate { animation: rotation 2s infinite linear; -} \ No newline at end of file +} + +#popup-errorPopup .ia_popup__header { + color: red; + font-weight: bold; + font-size: 16px; +} + +#popup-errorPopup .ia_popup__header:before { + color: red; + content: "⛔ "; + font-weight: bold; + font-size: 16px; + padding-right: 4px; +} + + diff --git a/MTN6_SCADA/com.inductiveautomation.perspective/views/Windows/Statistics/view.json b/MTN6_SCADA/com.inductiveautomation.perspective/views/Windows/Statistics/view.json index a854688..849d607 100644 --- a/MTN6_SCADA/com.inductiveautomation.perspective/views/Windows/Statistics/view.json +++ b/MTN6_SCADA/com.inductiveautomation.perspective/views/Windows/Statistics/view.json @@ -1,7 +1,7 @@ { "custom": {}, "params": { - "Tab_ID": 11, + "Tab_ID": 9, "Table": "Statistics" }, "propConfig": { @@ -55,7 +55,7 @@ }, "onChange": { "enabled": null, - "script": "\t\t\t\n\t\t\t\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Scanner Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No Code (#)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Scanner Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Scanner Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (pph): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027GoodRead\u0027] \u003d row[\u0027GoodRead\u0027]\n\t\tdict[\u0027NoRead\u0027] \u003d row[\u0027NoRead\u0027]\n\t\tdict[\u0027MultiRead\u0027] \u003d row[\u0027MultiRead\u0027]\n\t\tdict[\u0027NoCode\u0027] \u003d row[\u0027NoCode\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Scanner\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if(system.tag.readBlocking([db_tag_path])[0].value):\n path \u003d \"\"\n headers \u003d []\n graph \u003d []\n \n # Mode selection (unchanged)\n if self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n path \u003d \"Statistics/Hourly Scanner Count\"\n headers \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No Code (#)\"]\n self.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (#): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (#): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (#): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (#): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n elif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n path \u003d \"Statistics/Hourly Scanner Percent\"\n headers \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n self.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (%): [bold]{valueY}[/]%\"\n self.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (%): [bold]{valueY}[/]%\"\n self.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (%): [bold]{valueY}[/]%\"\n self.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (%): [bold]{valueY}[/]%\"\n self.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d 100\n else:\n path \u003d \"Statistics/Hourly Scanner Rate\"\n headers \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n self.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (pph): [bold]{valueY}[/] pph\"\n self.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (pph): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (pph): [bold]{valueY}[/] pph\"\n self.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (pph): [bold]{valueY}[/] pph\"\n self.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n \n params \u003d {\n \"starttime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\n \"endtime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate\n }\n \n # Execute query with error handling\n data \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path, params))\n \n # Process data (unchanged)\n graph \u003d []\n for row in data: \n dict \u003d {\n \u0027Hour\u0027: row[\u0027Hour\u0027],\n \u0027GoodRead\u0027: row[\u0027GoodRead\u0027],\n \u0027NoRead\u0027: row[\u0027NoRead\u0027],\n \u0027MultiRead\u0027: row[\u0027MultiRead\u0027],\n \u0027NoCode\u0027: row[\u0027NoCode\u0027]\n }\n graph.append(dict)\n \n # Update components\n self.getSibling(\"Hourly Scanner\").props.dataSources.example \u003d graph\n self.props.data \u003d system.dataset.toDataSet(headers, data)\n " } }, "custom.time": { @@ -618,57 +618,43 @@ "$": [ "ds", 192, - 1747222130171 + 1747664567746 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Total (#)", - "type": "Long" + "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Good Read (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "No Read (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Multi Read (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "No Code (#)", - "type": "Double" + "type": "String" } ] }, @@ -697,15 +683,7 @@ }, "props": { "dataSources": { - "example": [ - { - "GoodRead": 4, - "Hour": "H1", - "MultiRead": 0, - "NoCode": 0, - "NoRead": 0 - } - ] + "example": [] }, "series": [ { @@ -1961,7 +1939,7 @@ }, "onChange": { "enabled": null, - "script": " path \u003d \"\"\n headers \u003d []\n rows \u003d []\n\n # Define the appropriate path based on the selected aggregation mode\n if self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n path \u003d \"Statistics/Hourly Induct Count\"\n headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\"]\n self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (#): [bold]{valueY}[/]\"\n self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n elif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n path \u003d \"Statistics/Hourly Induct Percent\"\n headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (%)\"]\n self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (%): [bold]{valueY}[/]%\"\n self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d 100\n else:\n path \u003d \"Statistics/Hourly Induct Rate\"\n headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (pph)\"]\n self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (pph): [bold]{valueY}[/] pph\"\n self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n\n # Fetch the data from the database\n params \u003d {\"starttime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate, \n \"endtime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n data \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path, params))\n\n # Prepare the rows for the dataset without \u0027SingleCarrier\u0027 and \u0027DoubleCarrier\u0027\n for row in data:\n row_data \u003d []\n row_data.append(row[\u0027StartTimestamp\u0027])\n row_data.append(row[\u0027Hour\u0027])\n \n # Add the total count or percentage\n if self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n row_data.append(row[\u0027Total_count\u0027]) # For \"Count\" mode, add \u0027Total_count\u0027\n elif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n row_data.append(row[\u0027Total_percentage\u0027]) # Replace with correct column name for percentage\n else:\n row_data.append(row[\u0027Total_pph\u0027]) # Replace with correct column name for rate (pph)\n\n # Only add SingleCarrier and DoubleCarrier if they exist and need to be shown\n if \u0027SingleCarrier\u0027 in row and row[\u0027SingleCarrier\u0027] is not None:\n row_data.append(row[\u0027SingleCarrier\u0027])\n headers.append(\"Single Carrier (#)\") # Only add header if the column exists and is required\n if \u0027DoubleCarrier\u0027 in row and row[\u0027DoubleCarrier\u0027] is not None:\n row_data.append(row[\u0027DoubleCarrier\u0027])\n headers.append(\"Double Carrier (#)\") # Only add header if the column exists and is required\n\n rows.append(row_data)\n\n # Remove the \"Single Carrier\" and \"Double Carrier\" columns from the dataset\n # If they are present in the headers and rows, you can filter them out before final conversion\n\n # Remove unwanted columns from headers\n filtered_headers \u003d [header for header in headers if \"Single Carrier\" not in header and \"Double Carrier\" not in header]\n\n # Filter the rows by removing the corresponding columns (Single Carrier and Double Carrier)\n filtered_rows \u003d []\n for row in rows:\n filtered_row \u003d [value for index, value in enumerate(row) if headers[index] not in [\"Single Carrier (#)\", \"Double Carrier (#)\"]]\n filtered_rows.append(filtered_row)\n\n # Create the dataset without \"Single Carrier\" and \"Double Carrier\" columns\n dataset \u003d system.dataset.toDataSet(filtered_headers, filtered_rows)\n \n # Update the dataset and chart data\n self.props.data \u003d dataset\n self.getSibling(\"Hourly Induct\").props.dataSources.example \u003d dataset" + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if(system.tag.readBlocking([db_tag_path])[0].value):\n\t path \u003d \"\"\n\t headers \u003d []\n\t rows \u003d []\n\t\n\t # Define the appropriate path based on the selected aggregation mode\n\t mode \u003d self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value\n\t if mode \u003d\u003d \"Count\":\n\t path \u003d \"Statistics/Hourly Induct Count\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\"]\n\t self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n\t elif mode \u003d\u003d \"Percentage\":\n\t path \u003d \"Statistics/Hourly Induct Percent\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (%)\"]\n\t self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d 100\n\t else:\n\t path \u003d \"Statistics/Hourly Induct Rate\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Total (pph)\"]\n\t self.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Total (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n\t\n\t # Fetch the data from the database\n\t params \u003d {\n\t \"starttime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate, \n\t \"endtime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate\n\t }\n\t data \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path, params))\n\t\n\t # Prepare the rows for the dataset without \u0027SingleCarrier\u0027 and \u0027DoubleCarrier\u0027\n\t for row in data:\n\t row_data \u003d [row[\u0027StartTimestamp\u0027], row[\u0027Hour\u0027]]\n\t \n\t if mode \u003d\u003d \"Count\":\n\t row_data.append(row[\u0027Total_count\u0027])\n\t elif mode \u003d\u003d \"Percentage\":\n\t row_data.append(row[\u0027Total_percentage\u0027])\n\t else:\n\t row_data.append(row[\u0027Total_pph\u0027])\n\t\n\t if \u0027SingleCarrier\u0027 in row and row[\u0027SingleCarrier\u0027] is not None:\n\t row_data.append(row[\u0027SingleCarrier\u0027])\n\t headers.append(\"Single Carrier (#)\")\n\t if \u0027DoubleCarrier\u0027 in row and row[\u0027DoubleCarrier\u0027] is not None:\n\t row_data.append(row[\u0027DoubleCarrier\u0027])\n\t headers.append(\"Double Carrier (#)\")\n\t\n\t rows.append(row_data)\n\t\n\t # Filter headers and rows to exclude unwanted columns\n\t filtered_headers \u003d [h for h in headers if h not in [\"Single Carrier (#)\", \"Double Carrier (#)\"]]\n\t filtered_rows \u003d [\n\t [val for idx, val in enumerate(r) if headers[idx] not in [\"Single Carrier (#)\", \"Double Carrier (#)\"]]\n\t for r in rows\n\t ]\n\t\n\t dataset \u003d system.dataset.toDataSet(filtered_headers, filtered_rows)\n\t\n\t # Update the dataset and chart data\n\t self.props.data \u003d dataset\n\t self.getSibling(\"Hourly Induct\").props.dataSources.example \u003d dataset\n\t" } }, "custom.time": { @@ -2184,29 +2162,23 @@ "$": [ "ds", 192, - 1747222130136 + 1747664567758 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Total (#)", - "type": "Long" + "type": "String" } ] }, @@ -2242,29 +2214,23 @@ "$": [ "ds", 192, - 1747222130137 + 1747664567758 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Total (#)", - "type": "Long" + "type": "String" } ] } @@ -3006,7 +2972,7 @@ }, "onChange": { "enabled": null, - "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Sorted\u0027] \u003d row[\u0027Sorted\u0027]\n\t\tdict[\u0027AwcsRecirc\u0027] \u003d row[\u0027AwcsRecirc\u0027]\n\t\tdict[\u0027OperationalRecirc\u0027] \u003d row[\u0027OperationalRecirc\u0027]\n\t\tdict[\u0027MachineRecirc\u0027] \u003d row[\u0027MachineRecirc\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Sorter Summary\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if(system.tag.readBlocking([db_tag_path])[0].value):\n\t path \u003d \"\"\n\t headers \u003d []\n\t graph \u003d []\n\t\n\t mode \u003d self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value\n\t\n\t if mode \u003d\u003d \"Count\":\n\t path \u003d \"Statistics/Hourly Sorter Summary Count\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Inducted (#)\", \"Sorted (#)\", \"Awcs Recirc (#)\", \"Operational Recirc (#)\", \"Machine Recirc (#)\"]\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\t elif mode \u003d\u003d \"Percentage\":\n\t path \u003d \"Statistics/Hourly Sorter Summary Percent\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Inducted (%)\", \"Sorted (%)\", \"Awcs Recirc (%)\", \"Operational Recirc (%)\", \"Machine Recirc (%)\"]\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d 100\n\t else:\n\t path \u003d \"Statistics/Hourly Sorter Summary Rate\"\n\t headers \u003d [\"Start Timestamp\", \"Hour\", \"Inducted (pph)\", \"Sorted (pph)\", \"Awcs Recirc (pph)\", \"Operational Recirc (pph)\", \"Machine Recirc (pph)\"]\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\t\n\t params \u003d {\n\t \"starttime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\n\t \"endtime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate\n\t }\n\t\n\t data \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path, params))\n\t\n\t for row in data:\n\t entry \u003d {\n\t \"Hour\": row[\"Hour\"],\n\t \"Sorted\": row[\"Sorted\"],\n\t \"AwcsRecirc\": row[\"AwcsRecirc\"],\n\t \"OperationalRecirc\": row[\"OperationalRecirc\"],\n\t \"MachineRecirc\": row[\"MachineRecirc\"]\n\t }\n\t graph.append(entry)\n\t\n\t self.getSibling(\"Hourly Sorter Summary\").props.dataSources.example \u003d graph\n\t self.props.data \u003d system.dataset.toDataSet(headers, data)\n" } }, "custom.time": { @@ -3569,57 +3535,43 @@ "$": [ "ds", 192, - 1747222130439 + 1747664567746 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Inducted (#)", - "type": "Long" + "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Sorted (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Awcs Recirc (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Operational Recirc (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Machine Recirc (#)", - "type": "Double" + "type": "String" } ] }, @@ -3647,15 +3599,7 @@ }, "props": { "dataSources": { - "example": [ - { - "AwcsRecirc": 0, - "Hour": "H1", - "MachineRecirc": 0, - "OperationalRecirc": 0, - "Sorted": 4 - } - ] + "example": [] }, "series": [ { @@ -4911,7 +4855,7 @@ }, "onChange": { "enabled": null, - "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\t\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Sorted\u0027] \u003d row[\u0027Sorted\u0027]\n\t\tdict[\u0027DestinationInvalid\u0027] \u003d row[\u0027DestinationInvalid\u0027]\n\t\tdict[\u0027DestinationNone\u0027] \u003d row[\u0027DestinationNone\u0027]\n\t\tdict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t\tdict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t\tdict[\u0027Unexpected\u0027] \u003d row[\u0027Unexpected\u0027]\n\t\tdict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t\tdict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t\tdict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t\tdict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t\tdict[\u0027TrackingError\u0027] \u003d row[\u0027TrackingError\u0027]\n\t\tdict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t\tdict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Sorter Details\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if(system.tag.readBlocking([db_tag_path])[0].value):\n\t path \u003d \"\"\n\t headers \u003d []\n\t graph \u003d []\n\t\n\t if self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t path \u003d \"Statistics/Hourly Sorter Details Count\"\n\t headers \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t self.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t self.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\t elif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t path \u003d \"Statistics/Hourly Sorter Details Percent\"\n\t headers \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t self.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t self.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d 100\n\t else:\n\t path \u003d \"Statistics/Hourly Sorter Details Rate\"\n\t headers \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t self.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (pph): [bold]{valueY}[/] pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/]pph\"\n\t self.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\t\n\t params \u003d {\n\t \"starttime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\n\t \"endtime\": self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate\n\t }\n\t\n\t data \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path, params))\n\t\n\t for row in data:\n\t dict \u003d {}\n\t dict[\u0027Hour\u0027] \u003d row[\u0027Hour\u0027]\n\t dict[\u0027Sorted\u0027] \u003d row[\u0027Sorted\u0027]\n\t dict[\u0027DestinationInvalid\u0027] \u003d row[\u0027DestinationInvalid\u0027]\n\t dict[\u0027DestinationNone\u0027] \u003d row[\u0027DestinationNone\u0027]\n\t dict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t dict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t dict[\u0027Unexpected\u0027] \u003d row[\u0027Unexpected\u0027]\n\t dict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t dict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t dict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t dict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t dict[\u0027TrackingError\u0027] \u003d row[\u0027TrackingError\u0027]\n\t dict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t dict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t graph.append(dict)\n\t\n\t self.getSibling(\"Hourly Sorter Details\").props.dataSources.example \u003d graph\n\t self.props.data \u003d system.dataset.toDataSet(headers, data)\n\t" } }, "custom.time": { @@ -4933,120 +4877,88 @@ "$": [ "ds", 192, - 1747222130163 + 1747664567761 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Inducted (#)", - "type": "Long" + "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Sorted (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Dest Inv (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Dest None (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Dest Dis (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Dest Full (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Unexpected (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Dest Fault (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Div Fail (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Gap Err (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Lost (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Track Err (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Unknown (#)", - "type": "Double" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "Unsafe (#)", - "type": "Double" + "type": "String" } ] }, @@ -5079,24 +4991,7 @@ }, "props": { "dataSources": { - "example": [ - { - "DestinationDisabled": 0, - "DestinationFault": 0, - "DestinationFull": 0, - "DestinationInvalid": 0, - "DestinationNone": 0, - "DivertFail": 0, - "GapError": 0, - "Hour": "H1", - "Lost": 0, - "Sorted": 4, - "TrackingError": 0, - "Unexpected": 0, - "Unknown": 0, - "Unsafe": 0 - } - ] + "example": [] }, "series": [ { @@ -8692,7 +8587,7 @@ }, "onChange": { "enabled": null, - "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Lane Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Err (#)\",\"Gap Err (#)\",\"Unknown (#)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\t\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Lane Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Err (%)\",\"Gap Err (%)\",\"Unknown (%)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\t\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Lane Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Err (pph)\",\"Gap Err (pph)\",\"Unknown (pph)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/] pph\"\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate,\"lane\":self.parent.parent.parent.getChild(\"Lane Drop Down\").getChild(\"Lane\").props.value}\t\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\t\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Diverted\u0027] \u003d row[\u0027Diverted\u0027]\n\t\tdict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t\tdict[\u0027DestinationJam\u0027] \u003d row[\u0027DestinationJam\u0027]\n\t\tdict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t\tdict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t\tdict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t\tdict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t\tdict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t\tdict[\u0027DimError\u0027] \u003d row[\u0027DimError\u0027]\n\t\tdict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t\tdict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t\tgraph.append(dict)\n\t\n\tself.getSibling(\"Hourly Lane\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if(system.tag.readBlocking([db_tag_path])[0].value):\n\t\tpath \u003d \"\"\n\t\theaders \u003d []\n\t\tgraph \u003d []\n\t\t\n\t\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\tpath \u003d \"Statistics/Hourly Lane Count\"\n\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Err (#)\",\"Gap Err (#)\",\"Unknown (#)\"]\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (#): [bold]{valueY}[/]\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\t\t\n\t\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\t\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\tpath \u003d \"Statistics/Hourly Lane Percent\"\n\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Err (%)\",\"Gap Err (%)\",\"Unknown (%)\"]\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (%): [bold]{valueY}[/]%\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\t\t\n\t\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d 100\n\t\telse:\n\t\t\tpath \u003d \"Statistics/Hourly Lane Rate\"\n\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Err (pph)\",\"Gap Err (pph)\",\"Unknown (pph)\"]\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (pph): [bold]{valueY}[/] pph\"\n\t\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/] pph\"\t\n\t\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\t\n\t\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate,\"lane\":self.parent.parent.parent.getChild(\"Lane Drop Down\").getChild(\"Lane\").props.value}\t\n\t\t\n\t\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\t\t\n\t\tfor row in data:\t\n\t\t\tdict \u003d {}\n\t\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\t\tdict[\u0027Diverted\u0027] \u003d row[\u0027Diverted\u0027]\n\t\t\tdict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t\t\tdict[\u0027DestinationJam\u0027] \u003d row[\u0027DestinationJam\u0027]\n\t\t\tdict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t\t\tdict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t\t\tdict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t\t\tdict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t\t\tdict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t\t\tdict[\u0027DimError\u0027] \u003d row[\u0027DimError\u0027]\n\t\t\tdict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t\t\tdict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t\t\tgraph.append(dict)\n\t\t\n\t\tself.getSibling(\"Hourly Lane\").props.dataSources.example \u003d graph\n\t\tself.props.data \u003d system.dataset.toDataSet(headers,data)\n" } }, "custom.time": { @@ -9731,7 +9626,7 @@ "$": [ "ds", 192, - 1747222130597 + 1747664567761 ], "$columns": [ { @@ -25064,29 +24959,23 @@ "$": [ "ds", 192, - 1747222089785 + 1747664538963 ], "$columns": [ { - "data": [ - "S011921" - ], + "data": [], "name": "Lane", "type": "String" }, { - "data": [ - 4 - ], + "data": [], "name": "Total (#)", - "type": "Long" + "type": "String" }, { - "data": [ - 0 - ], + "data": [], "name": "DestFull (#)", - "type": "Double" + "type": "String" } ] }, @@ -25118,13 +25007,7 @@ }, "props": { "dataSources": { - "example": [ - { - "DestFull_count": 0, - "Lane": "S011921", - "Total_count": 4 - } - ] + "example": [] }, "series": [ { @@ -27849,41 +27732,31 @@ "$": [ "ds", 192, - 1747222089785 + 1747664538963 ], "$columns": [ { - "data": [ - "2025-05-14 14:00" - ], + "data": [], "name": "Start Timestamp", "type": "String" }, { - "data": [ - "H1" - ], + "data": [], "name": "Hour", "type": "String" }, { - "data": [ - null - ], + "data": [], "name": "Cycles of ULGL1", "type": "String" }, { - "data": [ - null - ], + "data": [], "name": "Cycles of ULGL2", "type": "String" }, { - "data": [ - null - ], + "data": [], "name": "Cycles of ULGL3", "type": "String" } @@ -27919,14 +27792,7 @@ }, "props": { "dataSources": { - "example": [ - { - "Hour": "H1", - "ULGL1": null, - "ULGL2": null, - "ULGL3": null - } - ] + "example": [] }, "legend": { "enabled": false @@ -28921,7 +28787,7 @@ } }, "props": { - "currentTabIndex": 11, + "currentTabIndex": 9, "menuStyle": { "backgroundColor": "#FFFFFFBD" }, @@ -31430,7 +31296,7 @@ }, "props": { "dismissOnSelect": false, - "formattedValue": "May 14, 2025 2:28 PM", + "formattedValue": "May 19, 2025 5:22 PM", "formattedValues": { "date": "Mar 26, 2021", "datetime": "Mar 26, 2021 12:00 AM", @@ -31440,9 +31306,9 @@ "$": [ "ts", 192, - 1747222129890 + 1747664567742 ], - "$ts": 1747218529000 + "$ts": 1747660967000 } }, "type": "ia.input.date-time-input" @@ -31590,7 +31456,7 @@ }, "props": { "dismissOnSelect": false, - "formattedValue": "May 14, 2025 3:28 PM", + "formattedValue": "May 19, 2025 6:22 PM", "formattedValues": { "date": "Mar 29, 2021", "datetime": "Mar 29, 2021 1:37 PM", @@ -31600,9 +31466,9 @@ "$": [ "ts", 192, - 1747222129890 + 1747664567742 ], - "$ts": 1747222129000 + "$ts": 1747664567000 } }, "type": "ia.input.date-time-input" 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 7981c25..c559ea8 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 @@ -6,9 +6,9 @@ "$": [ "ts", 192, - 1745914528657 + 1747730947188 ], - "$ts": 1745914528656 + "$ts": 1747730947187 } } }, @@ -442,6 +442,81 @@ }, "type": "ia.container.flex" }, + { + "meta": { + "name": "Icon_1", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "{[System]Gateway/Database/MariaDB/Available}" + }, + "transforms": [ + { + "fallback": "Database Connection Status: LOST", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Database Connection Status: GOOD" + }, + { + "input": false, + "output": "Database Connection Status: LOST" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.color": { + "binding": { + "config": { + "expression": "{[System]Gateway/Database/MariaDB/Available}" + }, + "transforms": [ + { + "fallback": "#FF0000", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "#47FF47" + }, + { + "input": false, + "output": "#FF0000" + } + ], + "outputType": "color", + "type": "map" + } + ], + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": " db_tag_path \u003d \"[System]Gateway/Database/MariaDB/Available\"\n\t\n if not (system.tag.readBlocking([db_tag_path])[0].value):\n \tsystem.perspective.openPopup(\"errorPopup\",\u0027PopUp-Views/DatabaseError\u0027, title\u003d\"Database Error\")\n\t" + }, + "persistent": true + } + }, + "props": { + "color": "#FF0000", + "path": "material/table_chart" + }, + "type": "ia.display.icon" + }, { "meta": { "hasDelegate": true, diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/resource.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/resource.json new file mode 100644 index 0000000..b44b07b --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-05-20T09:49:07Z" + }, + "lastModificationSignature": "cb7026f671f17bc4ef7ebb50ab9735c971cb50752a412e2a4e14d784891500f5" + } +} \ No newline at end of file diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/thumbnail.png b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/thumbnail.png new file mode 100644 index 0000000..5344c87 Binary files /dev/null and b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/thumbnail.png differ diff --git a/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/view.json b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/view.json new file mode 100644 index 0000000..a75de09 --- /dev/null +++ b/SCADA_PERSPECTIVE_PARENT_PROJECT/com.inductiveautomation.perspective/views/PopUp-Views/DatabaseError/view.json @@ -0,0 +1,91 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 165, + "width": 400 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "An error occurred while connecting to the database." + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Network or database connection failed. Check your settings or contact IT support." + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "alignItems": "flex-start", + "direction": "column", + "justify": "space-around", + "style": { + "paddingLeft": 5, + "paddingRight": 5 + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.closePopup(\"\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "props": { + "primary": false, + "style": { + "marginTop": 3 + }, + "text": "Dismiss" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignContent": "flex-start", + "direction": "column", + "justify": "space-around" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file