{ "custom": { "disconnected": false, "openDiverter": false, "plc": "System", "priority": 0, "priority_string": "No active alarms", "searchId": "value", "state": 0, "state_string": "Closed" }, "params": { "forceFaultStatus": null, "forceRunningStatus": null, "mirror": true, "tagProps": [ "System/MCM01/Station/EPC/UL1_3_EPC1", "value", "value", "value", "value", "value", "value", "value", "value", "value" ] }, "propConfig": { "custom.disconnected": { "binding": { "config": { "fallbackDelay": 2.5, "mode": "indirect", "references": { "0": "{view.params.tagProps[0]}", "fc": "{session.custom.fc}" }, "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" }, "transforms": [ { "expression": "!isGood({value})", "type": "expression" } ], "type": "tag" }, "persistent": true }, "custom.openDiverter": { "binding": { "config": { "path": "view.custom.state" }, "transforms": [ { "fallback": false, "inputType": "scalar", "mappings": [ { "input": 1, "output": true }, { "input": 0, "output": false } ], "outputType": "scalar", "type": "map" } ], "type": "property" }, "persistent": true }, "custom.plc": { "binding": { "config": { "path": "view.params.tagProps[0]" }, "transforms": [ { "expression": "split({value}, \"/\")[0]", "type": "expression" } ], "type": "property" }, "persistent": true }, "custom.priority": { "binding": { "config": { "path": "view.custom.state" }, "transforms": [ { "fallback": 0, "inputType": "scalar", "mappings": [ { "input": 1, "output": 1 } ], "outputType": "scalar", "type": "map" } ], "type": "property" }, "persistent": true }, "custom.priority_string": { "binding": { "config": { "expression": "case({view.custom.state},\r\n1, \"Low\",\r\n0, \"No active alarms\",\r\n\"Unknown\")" }, "type": "expr" }, "persistent": true }, "custom.searchId": { "binding": { "config": { "path": "session.custom.searchId" }, "type": "property" }, "persistent": true }, "custom.state": { "binding": { "config": { "fallbackDelay": 2.5, "mode": "indirect", "references": { "0": "{view.params.tagProps[0]}", "fc": "{session.custom.fc}" }, "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" }, "transforms": [ { "expression": "coalesce({value},{view.params.forceFaultStatus},0)", "type": "expression" } ], "type": "tag" }, "persistent": true }, "custom.state_string": { "binding": { "config": { "expression": "case({view.custom.state},\r\n0, \"Closed\",\r\n1, \"Open\",\r\n\"Unknown\")" }, "type": "expr" }, "persistent": true }, "params.forceFaultStatus": { "paramDirection": "input", "persistent": true }, "params.forceRunningStatus": { "paramDirection": "input", "persistent": true }, "params.mirror": { "paramDirection": "input", "persistent": true }, "params.tagProps": { "paramDirection": "input", "persistent": true } }, "props": { "defaultSize": { "height": 16, "width": 15 } }, "root": { "children": [ { "meta": { "name": "OpenDiverterArm" }, "position": { "grow": 1 }, "propConfig": { "position.display": { "binding": { "config": { "expression": "{view.custom.openDiverter} \u0026\u0026 {view.params.mirror}" }, "type": "expr" } }, "position.rotate.angle": { "binding": { "config": { "path": "view.params.directionLeft" }, "transforms": [ { "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", "type": "expression" } ], "type": "property" } }, "props.elements[0].fill.paint": { "binding": { "config": { "expression": "if(\r\n {view.custom.disconnected},\r\n \"#000000\",\r\n switch(\r\n toInt({view.custom.state}),\r\n 0, 1, \r\n \"#808080\", \"#FF0000\", \"#FFF000\"\r\n )\r\n)\r\n" }, "type": "expr" } } }, "props": { "elements": [ { "d": "M 0,40 32.820217,3.3897904 c 2.588185,-2.76545766 5.724342,-0.1926117 3.552046,2.114172 L 8,40 Z", "fill": {}, "name": "path", "stroke": { "paint": "#4c4c4c", "width": 1 }, "type": "path" } ], "preserveAspectRatio": "xMidYMax", "style": { "overflow": "hidden" }, "viewBox": "0 1.3 38 46" }, "type": "ia.shapes.svg" }, { "meta": { "name": "ClosedDiverterArm" }, "position": { "grow": 1 }, "propConfig": { "position.display": { "binding": { "config": { "expression": "!{view.custom.openDiverter} \u0026\u0026 {view.params.mirror}" }, "type": "expr" } }, "position.rotate.angle": { "binding": { "config": { "path": "view.params.directionLeft" }, "transforms": [ { "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", "type": "expression" } ], "type": "property" } }, "props.elements[0].fill.paint": { "binding": { "config": { "expression": "if(\r\n {view.custom.disconnected},\r\n \"#000000\",\r\n switch(\r\n toInt({view.custom.state}),\r\n 0, 1, \r\n \"#808080\", \"#FF0000\", \"#FFF000\"\r\n )\r\n)\r\n" }, "type": "expr" } } }, "props": { "elements": [ { "d": "M 0 0 L 96 0 L 96 16 L 0 16 Z", "fill": {}, "name": "path", "stroke": { "paint": "#4c4c4c", "width": 2 }, "type": "path" } ], "preserveAspectRatio": "xMidYMax", "style": { "overflow": "hidden" }, "viewBox": "-1 0 98 17" }, "type": "ia.shapes.svg" }, { "meta": { "name": "OpenDiverterArmLeft" }, "position": { "grow": 1 }, "propConfig": { "position.display": { "binding": { "config": { "expression": "{view.custom.openDiverter} \u0026\u0026 !{view.params.mirror}" }, "type": "expr" } }, "position.rotate.angle": { "binding": { "config": { "path": "view.params.directionLeft" }, "transforms": [ { "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", "type": "expression" } ], "type": "property" } }, "props.elements[0].fill.paint": { "binding": { "config": { "expression": "if(\r\n {view.custom.disconnected},\r\n \"#000000\",\r\n switch(\r\n toInt({view.custom.state}),\r\n 0, 1, \r\n \"#808080\", \"#FF0000\", \"#FFF000\"\r\n )\r\n)\r\n" }, "type": "expr" } } }, "props": { "elements": [ { "d": "M 0,40 32.820217,3.3897904 c 2.588185,-2.76545766 5.724342,-0.1926117 3.552046,2.114172 L 8,40 Z", "fill": {}, "name": "path", "stroke": { "paint": "#4c4c4c", "width": 1 }, "type": "path" } ], "preserveAspectRatio": "xMidYMax", "style": { "overflow": "hidden", "transform": "scaleX(-1)" }, "viewBox": "0 1.3 38 46" }, "type": "ia.shapes.svg" }, { "meta": { "name": "ClosedDiverterArmLeft" }, "position": { "grow": 1 }, "propConfig": { "position.display": { "binding": { "config": { "expression": "!{view.custom.openDiverter} \u0026\u0026 !{view.params.mirror}" }, "type": "expr" } }, "position.rotate.angle": { "binding": { "config": { "path": "view.params.directionLeft" }, "transforms": [ { "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", "type": "expression" } ], "type": "property" } }, "props.elements[0].fill.paint": { "binding": { "config": { "expression": "if(\r\n {view.custom.disconnected},\r\n \"#000000\",\r\n switch(\r\n toInt({view.custom.state}),\r\n 0, 1, \r\n \"#808080\", \"#FF0000\", \"#FFF000\"\r\n )\r\n)\r\n" }, "type": "expr" } } }, "props": { "elements": [ { "d": "M 0 0 L 96 0 L 96 16 L 0 16 Z", "fill": {}, "name": "path", "stroke": { "paint": "#4c4c4c", "width": 2 }, "type": "path" } ], "preserveAspectRatio": "xMidYMax", "style": { "overflow": "hidden", "transform": "scaleX(-1)" }, "viewBox": "-1 0 98 17" }, "type": "ia.shapes.svg" } ], "events": { "dom": { "onClick": { "config": { "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" }, "scope": "G", "type": "script" }, "onDoubleClick": { "config": { "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" }, "enabled": false, "scope": "G", "type": "script" }, "onMouseEnter": { "config": { "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" }, "scope": "G", "type": "script" } } }, "meta": { "name": "root", "tooltip": { "enabled": true, "location": "top-left", "style": {} } }, "propConfig": { "meta.tooltip.style.classes": { "binding": { "config": { "expression": "{view.custom.priority}" }, "transforms": [ { "fallback": "Alarms-Styles/NoAlarm", "inputType": "scalar", "mappings": [ { "input": 1, "output": "Alarms-Styles/Low" } ], "outputType": "style-list", "type": "map" } ], "type": "expr" } }, "meta.tooltip.text": { "binding": { "config": { "expression": "if(\n {view.custom.disconnected} \u003d false,\n \"Source Id: \" + {view.params.tagProps[0]} + \", Priority: \" + {view.custom.priority_string} + \", State: \" + {view.custom.state_string},\n \"Device Disconnected\"\n)\n" }, "type": "expr" } }, "props.style.borderStyle": { "binding": { "config": { "path": "view.custom.disconnected" }, "enabled": false, "transforms": [ { "fallback": "", "inputType": "scalar", "mappings": [ { "input": true, "output": "solid" }, { "input": false, "output": "none" } ], "outputType": "scalar", "type": "map" } ], "type": "property" } } }, "props": { "direction": "column", "justify": "center", "style": { "borderColor": "#FF0000", "borderStyle": "none", "borderWidth": "2px", "cursor": "pointer" } }, "type": "ia.container.flex" } }