forced added

This commit is contained in:
nodo kakabadze 2025-08-29 17:43:31 +04:00
parent aed13ae2d5
commit 776f450be1
20 changed files with 19687 additions and 0 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

View File

@ -0,0 +1,50 @@
{
"custom": {
"key": "value",
"key_1": "value",
"string": "value"
},
"params": {
"key": "value"
},
"propConfig": {
"custom.key": {
"persistent": true
},
"custom.key_1": {
"persistent": true
},
"custom.string": {
"persistent": true
},
"params.key": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 8,
"width": 240
}
},
"root": {
"meta": {
"name": "root"
},
"position": {
"x": 0,
"y": 0
},
"props": {
"mode": "percent",
"style": {
"backgroundColor": "white",
"borderStyle": "solid",
"borderWidth": "1px",
"overflow": "hidden"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,72 @@
{
"custom": {},
"params": {
"key": "value"
},
"propConfig": {
"params.key": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 271,
"width": 316
}
},
"root": {
"children": [
{
"meta": {
"name": "Conveyor_Right90"
},
"position": {
"height": 0.9446,
"width": 0.9494
},
"props": {
"elements": [
{
"id": "defs1",
"name": "defs1",
"type": "defs"
},
{
"elements": [
{
"d": "m 0.48408946,0.63336539 c 5.03604004,0.02588 7.95928004,-0.266973 12.23377954,1.98944001 1.65503,0.9666 2.74197,2.07523 3.73794,3.20659 1.85537,2.84128 3.14745,5.8598596 3.05039,10.7798096 l -8.06562,0.031 c -0.0803,-1.92185 0.0446,-3.79913 -1.5474595,-5.77497 -2.38574,-2.6865496 -6.13811,-2.3322296 -9.40355004,-2.4430596 z",
"fill": {
"opacity": "1",
"paint": "#ffffff"
},
"id": "path27086",
"name": "path27086",
"stroke": {
"dasharray": "none",
"opacity": "1",
"paint": "#000000",
"width": "0.25"
},
"type": "path"
}
],
"id": "layer1",
"name": "layer1",
"type": "group"
}
],
"viewBox": "0 0 20 17"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"props": {
"mode": "percent"
},
"type": "ia.container.coord"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,235 @@
{
"custom": {
"string": "OK"
},
"params": {
"tagProps": [
"value"
]
},
"propConfig": {
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 1,
"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"
},
{
"fallback": 0,
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": 1
},
{
"input": 2,
"output": 2
},
{
"input": 3,
"output": 3
},
{
"input": 4,
"output": 4
},
{
"input": 5,
"output": 5
},
{
"input": 6,
"output": 6
},
{
"input": 7,
"output": 7
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
}
},
"custom.string": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "Unknown",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "OK"
},
{
"input": 1,
"output": "Fault"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 20,
"width": 20
}
},
"root": {
"children": [
{
"meta": {
"name": "EncoderIcon"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#47FF47",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"elements": [
{
"cx": 12,
"cy": "12",
"fill": {},
"name": "statusCircle",
"rx": "10",
"ry": "10",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "ellipse"
},
{
"d": "M 4.6516854,13.685393 H 9.8292135",
"fill": {},
"name": "segLeft",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 9.6000004,13.469662 V 8.2112357",
"fill": {},
"name": "segUpLeft",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 19.829214,13.685393 H 14.651685",
"fill": {},
"name": "segRight",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "M 14.880899,13.469662 V 8.211236",
"fill": {},
"name": "segUpRight",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
},
{
"d": "m 9.8154019,8.4404597 4.8815551,0.013462",
"fill": {},
"name": "segTop",
"stroke": {
"paint": "#000000",
"width": 1
},
"type": "path"
}
],
"viewBox": "0 0 24 24"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "Encoder",
"tooltip": {
"enabled": true
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "\"Source Id: \" + {view.params.tagProps[0]} + \", Status: \" + {view.custom.string}\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_encoders"
},
"type": "property"
}
}
},
"props": {
"mode": "percent"
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,225 @@
{
"custom": {
"alarmHighlight": "",
"alarm_filter": {
"show_VFD": true,
"show_beacons": true,
"show_buttons": true,
"show_camera_jams": true,
"show_dpm_mcm": true,
"show_encoders": true,
"show_epc": true,
"show_fio_safety": true,
"show_map": true,
"show_photoeyes": true,
"show_px": true,
"show_solenoids": true
},
"areaHover": [],
"colours": {
"Fallback": "#00FF00",
"colour_impaired": false,
"state0": "#8C8C8C",
"state1": "#FF0000",
"state2": "#FF8000",
"state3": "#FFFF00",
"state4": "#007EFC",
"state5": "#00CC00",
"state6": "#CCCCFF"
},
"covert": true,
"currentGraphic": "Windows/Graphics/Overview",
"demoHighlight": "",
"dexmanager": {
"config": {
"font": "bold 12px Arial",
"highlight": "#ff0"
},
"show": {
"Beacons": false,
"ConveyorLabels": true,
"ConveyorPatterns": true,
"Conveyors": true,
"DivertPaddles": true,
"EIPs": false,
"Encoders": false,
"Estops": false,
"Gaylords": true,
"LimitSwitches": false,
"MCPs": false,
"PhotoEyes": false,
"PushButtons": false,
"Scanners": false,
"VFDs": false
}
},
"dpm_view_path": "autStand/Custom_Views/Enternet-Windows/DPMS/DPM Devices/MCM01/PS3_1_DPM1",
"fc": "BNA8",
"heatmapSettings": {
"alarms": [],
"alarmsText": "",
"data": {
"$": [
"ds",
192,
1755608623601
],
"$columns": [
{
"data": [],
"name": "firsttime",
"type": "Date"
},
{
"data": [],
"name": "lasttime",
"type": "Date"
},
{
"data": [],
"name": "duration",
"type": "String"
},
{
"data": [],
"name": "count",
"type": "Long"
},
{
"data": [],
"name": "device",
"type": "String"
},
{
"data": [],
"name": "description",
"type": "String"
}
]
},
"devices": [],
"devicesText": "",
"enabled": false,
"shifts": [],
"shiftsText": "",
"time": {
"end": "2020-07-30 00:00:00",
"start": "2020-07-29 00:00:00"
}
},
"rotation": "0deg",
"show_dpm_device_view": true,
"show_dpm_view": true,
"timewidget": {
"endDate": {
"$": [
"ts",
192,
1604092861010
],
"$ts": 1604116800000
},
"mode": "currentDay",
"startDate": {
"$": [
"ts",
192,
1604092861010
],
"$ts": 1604030400000
},
"update": {
"$": [
"ts",
192,
1604092861010
],
"$ts": 1604092861010
}
}
},
"propConfig": {
"custom.dexmanager.highlight": {
"binding": {
"config": {
"struct": {
"alarm": "{this.custom.alarmHighlight}",
"demo": "{this.custom.demoHighlight}",
"toggle": "{[default]Gateway/ToggleTag}"
},
"waitOnAll": true
},
"transforms": [
{
"code": "\thighlights \u003d []\n\t# Add alarm highlight:\n\tif len(value.alarm) \u003e 0:\n\t\thighlights.append({\n\t\t\t\"color\": \"#F00\" if value.toggle else \"#FF0\",\n\t\t\t\"keys\": [value.alarm]\n\t\t})\n\t\tif \".\" in value.alarm:\n\t\t\thighlights.append({\n\t\t\t\t\"color\": \"#F00\" if value.toggle else \"#FF0\",\n\t\t\t\t\"keys\": [value.alarm.split(\".\")[0], \"conveyor\"]\n\t\t\t})\n\t# Add demo highlight:\n\tif False and len(value.demo) \u003e 0:\n\t\thighlights.append({\n\t\t\t\"color\": \"#F00\" if value.toggle else \"#FF0\",\n\t\t\t\"keys\": [\"conveyor\", value.demo]\n\t\t})\n\treturn highlights",
"type": "script"
}
],
"type": "expr-struct"
}
},
"custom.isMobile": {
"binding": {
"config": {
"expression": "indexOf(lower({session.props.device.userAgent}), \"mobile\")\u003e\u003d0"
},
"type": "expr"
}
},
"props.auth": {
"access": "PRIVATE",
"persistent": false
},
"props.device.accelerometer": {
"access": "SYSTEM",
"persistent": false
},
"props.device.identifier": {
"access": "SYSTEM",
"persistent": false
},
"props.device.timezone": {
"access": "SYSTEM",
"persistent": false
},
"props.device.type": {
"access": "SYSTEM",
"persistent": false
},
"props.device.userAgent": {
"access": "SYSTEM",
"persistent": false
},
"props.gateway": {
"access": "SYSTEM",
"persistent": false
},
"props.geolocation.data": {
"access": "SYSTEM",
"persistent": false
},
"props.geolocation.permissionGranted": {
"access": "SYSTEM",
"persistent": false
},
"props.host": {
"access": "SYSTEM",
"persistent": false
},
"props.id": {
"access": "SYSTEM",
"persistent": false
},
"props.lastActivity": {
"access": "SYSTEM",
"persistent": false
}
},
"props": {
"address": "[0:0:0:0:0:0:0:1]",
"device": {},
"geolocation": {},
"locale": "en-US",
"timeZoneId": "Asia/Tbilisi"
}
}

View File

@ -0,0 +1,241 @@
{
"custom": {
"state": 0,
"string": "Starting"
},
"params": {
"name": "amber",
"tagProps": [
"/system/mcm01/test",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"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"
},
{
"fallback": null,
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": 1
},
{
"input": 0,
"output": 0
},
{
"input": 2,
"output": 2
},
{
"input": 3,
"output": 3
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.string": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "Starting",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "Running"
},
{
"input": 2,
"output": "EStop or Faulted"
},
{
"input": 3,
"output": "Gridlock Prevention"
},
{
"input": 4,
"output": "Full"
},
{
"input": 5,
"output": "Jammed"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
},
"params.name": {
"paramDirection": "input",
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 20,
"width": 20
}
},
"root": {
"children": [
{
"meta": {
"name": "Label"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.text": {
"binding": {
"config": {
"expression": "substring({view.params.name}, 0, 1)"
},
"type": "expr"
}
}
},
"props": {
"textStyle": {
"fontSize": "20px",
"textAlign": "center",
"textTransform": "uppercase"
}
},
"type": "ia.display.label"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tsystem.perspective.openDock(\u0027Docked-East-JR\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})"
},
"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
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "\"Source Id: \" + {view.params.tagProps[0]} + \", Status: \" + {view.custom.string}\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_beacons"
},
"type": "property"
}
},
"props.style.backgroundColor": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#808080",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "#00FF00"
},
{
"input": 2,
"output": "#FF0000"
},
{
"input": 3,
"output": "#FF00FF"
},
{
"input": 4,
"output": "#0000D9"
},
{
"input": 5,
"output": "#FF8C00"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"borderStyle": "solid",
"cursor": "pointer",
"overflow": "hidden"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,75 @@
{
"custom": {},
"params": {
"key": "value"
},
"propConfig": {
"params.key": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 69,
"width": 49
}
},
"root": {
"children": [
{
"meta": {
"name": "Conveyor45"
},
"position": {
"height": 0.9855,
"width": 0.9796
},
"props": {
"elements": [
{
"id": "defs1",
"name": "defs1",
"type": "defs"
},
{
"elements": [
{
"d": "m 0.61872656,19.047242 0.185181,-7.76481 C 2.3211966,6.4490419 5.3844746,3.4831579 9.6680236,0.93748089 L 13.582549,7.8726519 c -2.984985,1.33473 -4.2291194,3.3482401 -4.9990764,6.5174301 l -0.08744,4.67802 z",
"fill": {
"opacity": "1",
"paint": "#ffffff"
},
"id": "path26615",
"name": "path26615",
"stroke": {
"dasharray": "none",
"opacity": "1",
"paint": "#000000",
"width": "0.25"
},
"type": "path"
}
],
"id": "layer1",
"name": "layer1",
"type": "group"
}
],
"viewBox": "0 0 14 19"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"props": {
"mode": "percent",
"style": {
"overflow": "hidden"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,78 @@
{
"custom": {},
"params": {
"key": "value"
},
"propConfig": {
"params.key": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 272,
"width": 215
}
},
"root": {
"children": [
{
"meta": {
"name": "Conveyor_Left90"
},
"position": {
"height": 1.3652,
"width": 1,
"x": 0.0069,
"y": -0.1685
},
"props": {
"elements": [
{
"id": "defs1",
"name": "defs1",
"type": "defs"
},
{
"elements": [
{
"d": "M 16.890047,19.897888 C 4.1781605,20.036878 -0.11241603,13.922713 0.16340637,0.16060852 L 8.2822031,0.16091303 C 8.3924473,8.3148192 8.5268195,11.434975 16.856526,11.653146 Z",
"fill": {
"opacity": "1",
"paint": "#ffffff"
},
"id": "path27089",
"name": "path27089",
"stroke": {
"dasharray": "none",
"opacity": "1",
"paint": "#000000",
"width": "0.260407"
},
"type": "path"
}
],
"id": "layer1",
"name": "layer1",
"type": "group"
}
],
"viewBox": "0 0 17 20"
},
"type": "ia.shapes.svg"
}
],
"meta": {
"name": "root"
},
"props": {
"mode": "percent",
"style": {
"overflow": "hidden",
"overflowX": "hidden"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,296 @@
{
"custom": {
"state": 0,
"string": "Clear"
},
"params": {
"tagProps": [
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 1,
"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"
},
{
"fallback": 0,
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": 1
},
{
"input": 2,
"output": 2
},
{
"input": 3,
"output": 3
},
{
"input": 4,
"output": 4
},
{
"input": 5,
"output": 5
},
{
"input": 6,
"output": 6
},
{
"input": 7,
"output": 7
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.string": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "Clear",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "Clear"
},
{
"input": 2,
"output": "Blocked"
},
{
"input": 3,
"output": "Disabled"
},
{
"input": 4,
"output": "Jammed"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 40,
"width": 200
}
},
"root": {
"children": [
{
"meta": {
"name": "Photoeye"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
},
"props.elements[2].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "m 28.763932,20 -20,10 V 10 Z",
"fill": {},
"name": "path",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "path"
},
{
"stroke": {
"paint": "#000000",
"width": "2"
},
"stroke-dasharray": "4,4",
"type": "line",
"x1": "30",
"x2": "95%",
"y1": "20",
"y2": "20"
},
{
"fill": {},
"height": "20",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "rect",
"width": "6",
"x": "95%",
"y": "10"
}
],
"viewBox": "0 0 300 40"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tsystem.perspective.openDock(\u0027Docked-East-Photoeye\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"script": "\tfrom time import sleep\n\n\talarm \u003d []\n\tmessage \u003d None\n\n\tsleep(0.5)\n\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
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "\"Source Id: \" + {view.params.tagProps[0]} + \", Status: \" + {view.custom.string}\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_photoeyes"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer"
}
},
"type": "ia.container.coord"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1,296 @@
{
"custom": {
"state": 0,
"string": "Clear"
},
"params": {
"tagProps": [
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 1,
"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"
},
{
"fallback": 0,
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": 1
},
{
"input": 2,
"output": 2
},
{
"input": 3,
"output": 3
},
{
"input": 4,
"output": 4
},
{
"input": 5,
"output": 5
},
{
"input": 6,
"output": 6
},
{
"input": 7,
"output": 7
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "tag"
},
"persistent": true
},
"custom.string": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "Clear",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "Clear"
},
{
"input": 2,
"output": "Blocked"
},
{
"input": 3,
"output": "Disabled"
},
{
"input": 4,
"output": "Jammed"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 40,
"width": 110
}
},
"root": {
"children": [
{
"meta": {
"name": "Photoeye"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
},
"props.elements[2].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "m 28.763932,20 -20,10 V 10 Z",
"fill": {},
"name": "path",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "path"
},
{
"stroke": {
"paint": "#000000",
"width": "2"
},
"stroke-dasharray": "4,4",
"type": "line",
"x1": "30",
"x2": "90%",
"y1": "20",
"y2": "20"
},
{
"fill": {},
"height": "20",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "rect",
"width": "6",
"x": "90%",
"y": "10"
}
],
"viewBox": "0 0 110 40"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tsystem.perspective.openDock(\u0027Docked-East-Photoeye\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"script": "\tfrom time import sleep\n\n\talarm \u003d []\n\tmessage \u003d None\n\n\tsleep(0.5)\n\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
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "\"Source Id: \" + {view.params.tagProps[0]} + \", Status: \" + {view.custom.string}\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_photoeyes"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer"
}
},
"type": "ia.container.coord"
}
}

View File

@ -0,0 +1,45 @@
{
"custom": {
"key": "value",
"string": "value"
},
"params": {
"key": "value"
},
"propConfig": {
"custom.key": {
"persistent": true
},
"custom.string": {
"persistent": true
},
"params.key": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 8,
"width": 240
}
},
"root": {
"meta": {
"name": "root"
},
"position": {
"x": 0,
"y": 0
},
"props": {
"mode": "percent",
"style": {
"backgroundColor": "white",
"borderStyle": "solid",
"borderWidth": "1px"
}
},
"type": "ia.container.coord"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,98 @@
import os, json, sys
global_project_page_ids = {}
def get_project_config():
"""
Scan each view.json under Detailed_Views (no recursion),
go one level deeper (coordinateContainer), extract tagProps[0]
from children, and store as {source_id: view_folder_name}.
"""
global global_project_page_ids
global_project_page_ids.clear()
try:
project_name = system.util.getProjectName()
base_path = (
os.getcwd().replace("\\", "/")
+ "/data/projects/"
+ project_name
+ "/com.inductiveautomation.perspective/Views/autStand/Detailed_Views"
)
if not os.path.exists(base_path):
system.perspective.print("Path not found: " + base_path)
return {}
for view_folder in os.listdir(base_path):
json_file = os.path.join(base_path, view_folder, "view.json")
if not os.path.isfile(json_file):
continue
with open(json_file, "r") as fh:
view_json = json.load(fh)
# go one level deeper: root -> children[0] (coordinateContainer) -> its children
root_children = (view_json.get("root") or {}).get("children") or []
if not root_children:
continue
# assume first child is the coordinateContainer
container = root_children[0]
children = container.get("children") or []
# now loop through these children to get tagProps
for child in children:
props = child.get("props") or {}
params = props.get("params") or {}
tag_props = params.get("tagProps")
if isinstance(tag_props, list) and len(tag_props) > 0:
source_id = str(tag_props[0])
global_project_page_ids[source_id] = view_folder
except:
whid = system.tag.readBlocking("Configuration/FC")[0].value
logger = system.util.getLogger("%s-get_project_config" % whid)
exc_type, exc_obj, tb = sys.exc_info()
logger.error("Error at line %s: %s" % (tb.tb_lineno, exc_obj))
return global_project_page_ids
def navigate_to_url(self, source_id, page_id):
url_to_navigate = "autStand/Detailed_Views/%s" % (page_id)
system.perspective.navigate(view=url_to_navigate, params={"highlightTagPath": source_id + "||Diagnostic"})
def source_id_lookup(self, source_id):
"""
Finds page_id from global_project_page_ids by source_id or by hierarchy,
then navigates.
"""
if not source_id:
return
page_id = global_project_page_ids.get(source_id)
found = False
if page_id:
found = True
navigate_to_url(self, source_id, page_id)
else:
# Walk hierarchy upwards until we find a match
items = source_id.split("/")
while len(items) > 1:
items.pop()
source_id = "/".join(items)
page_id = global_project_page_ids.get(source_id)
if page_id:
found = True
navigate_to_url(self, source_id, page_id)
break
if not found:
open_pop_up("No page id found")

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -0,0 +1,264 @@
{
"custom": {
"state": 0,
"string": "Clear"
},
"params": {
"tagProps": [
3,
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value",
"value"
]
},
"propConfig": {
"custom.state": {
"binding": {
"config": {
"fallbackDelay": 1,
"mode": "indirect",
"references": {
"0": "{view.params.tagProps[0]}",
"fc": "{session.custom.fc}"
},
"tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/State"
},
"transforms": [
{
"expression": "coalesce({value},0)",
"type": "expression"
}
],
"type": "tag"
},
"persistent": true
},
"custom.string": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "Clear",
"inputType": "scalar",
"mappings": [
{
"input": 1,
"output": "Clear"
},
{
"input": 2,
"output": "Blocked"
},
{
"input": 3,
"output": "Disabled"
},
{
"input": 4,
"output": "Jammed"
}
],
"outputType": "scalar",
"type": "map"
}
],
"type": "property"
},
"persistent": true
},
"params.tagProps": {
"paramDirection": "input",
"persistent": true
}
},
"props": {
"defaultSize": {
"height": 42,
"width": 98
}
},
"root": {
"children": [
{
"meta": {
"name": "Photoeye"
},
"position": {
"height": 1,
"width": 1
},
"propConfig": {
"props.elements[0].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
},
"props.elements[2].fill.paint": {
"binding": {
"config": {
"path": "view.custom.state"
},
"transforms": [
{
"fallback": "#00FF00",
"inputType": "scalar",
"mappings": [
{
"input": 0,
"output": "#00FF00"
},
{
"input": 2,
"output": "#000000"
},
{
"input": 3,
"output": "#800080"
},
{
"input": 4,
"output": "#FF0000"
}
],
"outputType": "color",
"type": "map"
}
],
"type": "property"
}
}
},
"props": {
"elements": [
{
"d": "m 28.763932,20 -20,10 V 10 Z",
"fill": {},
"name": "path",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "path"
},
{
"stroke": {
"paint": "#000000",
"width": "2"
},
"stroke-dasharray": "4,4",
"type": "line",
"x1": "30",
"x2": "60",
"y1": "20",
"y2": "20"
},
{
"fill": {},
"height": "20",
"stroke": {
"paint": "#000000",
"width": "2"
},
"type": "rect",
"width": "6",
"x": "60",
"y": "10"
}
],
"preserveAspectRatio": "none",
"style": {
"boxShadow": "value"
},
"viewBox": "0 0 80 40"
},
"type": "ia.shapes.svg"
}
],
"events": {
"dom": {
"onClick": {
"config": {
"script": "\tsystem.perspective.openDock(\u0027Docked-East-Photoeye\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})"
},
"scope": "G",
"type": "script"
},
"onMouseEnter": {
"config": {
"script": "\tfrom time import sleep\n\n\talarm \u003d []\n\tmessage \u003d None\n\n\tsleep(0.5)\n\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
}
},
"propConfig": {
"meta.tooltip.text": {
"binding": {
"config": {
"expression": "\"Source Id: \" + {view.params.tagProps[0]} + \", Status: \" + {view.custom.string}\n"
},
"type": "expr"
}
},
"meta.visible": {
"binding": {
"config": {
"path": "session.custom.alarm_filter.show_photoeyes"
},
"type": "property"
}
}
},
"props": {
"mode": "percent",
"style": {
"cursor": "pointer"
}
},
"type": "ia.container.coord"
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB