The Test Run sandbox and Monaco analysis modelled a script API that had drifted from the site runtime's ScriptGlobals, so real scripts failed to compile in Test Run. Realign both to the runtime surface (Instance/Scripts/ExternalSystem/Attributes/Children/Parent) and drop the duplicate ScriptHost stub so the two cannot diverge again. - Script calls (Scripts.CallShared, Instance.CallScript, Route.To().Call) accept an anonymous object instead of a hand-built dictionary, via a shared ScriptArgs normalizer; existing dictionary calls still compile. - Test Run can optionally bind to a deployed instance, so Instance/ Attributes/CallScript route to it cross-site; adds site-side RouteToGetAttributes/RouteToSetAttributes handlers. - Adds Test Run panels to the API method and template script editors. - Fixes the TestDatabaseQuery seed script, which queried a table that never existed. Also commits unrelated in-progress work already in the tree: the health monitoring report loop, site streaming changes, and the Admin/Design data-connection and SMTP page reorganization.
328 lines
9.2 KiB
JSON
328 lines
9.2 KiB
JSON
{
|
|
"Folder": "ScadaLink",
|
|
"NodeList": [],
|
|
"FolderList": [
|
|
{
|
|
"Folder": "Motor",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Motor.Speed",
|
|
"Name": "Speed",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Motor speed in RPM"
|
|
},
|
|
{
|
|
"NodeId": "Motor.Temperature",
|
|
"Name": "Temperature",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Motor bearing temperature in Celsius"
|
|
},
|
|
{
|
|
"NodeId": "Motor.Current",
|
|
"Name": "Current",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Motor current draw in Amps"
|
|
},
|
|
{
|
|
"NodeId": "Motor.Running",
|
|
"Name": "Running",
|
|
"DataType": "Boolean",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Motor running status"
|
|
},
|
|
{
|
|
"NodeId": "Motor.FaultCode",
|
|
"Name": "FaultCode",
|
|
"DataType": "UInt32",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Active fault code (0 = no fault)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "Pump",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Pump.FlowRate",
|
|
"Name": "FlowRate",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Flow rate in liters per minute"
|
|
},
|
|
{
|
|
"NodeId": "Pump.Pressure",
|
|
"Name": "Pressure",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Discharge pressure in bar"
|
|
},
|
|
{
|
|
"NodeId": "Pump.Running",
|
|
"Name": "Running",
|
|
"DataType": "Boolean",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Pump running status"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "Tank",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Tank.Level",
|
|
"Name": "Level",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Tank level in percent"
|
|
},
|
|
{
|
|
"NodeId": "Tank.Temperature",
|
|
"Name": "Temperature",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Tank contents temperature in Celsius"
|
|
},
|
|
{
|
|
"NodeId": "Tank.HighLevel",
|
|
"Name": "HighLevel",
|
|
"DataType": "Boolean",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentRead",
|
|
"Description": "High level alarm switch"
|
|
},
|
|
{
|
|
"NodeId": "Tank.LowLevel",
|
|
"Name": "LowLevel",
|
|
"DataType": "Boolean",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentRead",
|
|
"Description": "Low level alarm switch"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "Valve",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Valve.Position",
|
|
"Name": "Position",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Valve position in percent open"
|
|
},
|
|
{
|
|
"NodeId": "Valve.Command",
|
|
"Name": "Command",
|
|
"DataType": "UInt32",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Valve command (0=Close, 1=Open, 2=Stop)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "JoeAppEngine",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "JoeAppEngine.BTCS",
|
|
"Name": "BTCS",
|
|
"DataType": "String",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "BTCS string value"
|
|
},
|
|
{
|
|
"NodeId": "JoeAppEngine.AlarmCntsBySeverity",
|
|
"Name": "AlarmCntsBySeverity",
|
|
"DataType": "Int32",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [13],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "13-element alarm counts by severity level"
|
|
}
|
|
],
|
|
"FolderList": [
|
|
{
|
|
"Folder": "Scheduler",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "JoeAppEngine.Scheduler.ScanTime",
|
|
"Name": "ScanTime",
|
|
"DataType": "DateTime",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Current scan time (updates every second)"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "DevAppEngine",
|
|
"NodeList": [],
|
|
"FolderList": [
|
|
{
|
|
"Folder": "Scheduler",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "DevAppEngine.Scheduler.ScanTime",
|
|
"Name": "ScanTime",
|
|
"DataType": "DateTime",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Current scan time for DevAppEngine"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "Sensor",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Sensor.Reading",
|
|
"Name": "Reading",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Generic sensor reading"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "Misc",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "Temperature",
|
|
"Name": "Temperature",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Standalone Temperature tag (Base Device default)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"Folder": "TestChildObject",
|
|
"NodeList": [
|
|
{
|
|
"NodeId": "TestChildObject.TestBool",
|
|
"Name": "TestBool",
|
|
"DataType": "Boolean",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar Boolean"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestBoolArray",
|
|
"Name": "TestBoolArray",
|
|
"DataType": "Boolean",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test Boolean array"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestDateTime",
|
|
"Name": "TestDateTime",
|
|
"DataType": "DateTime",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar DateTime"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestDateTimeArray",
|
|
"Name": "TestDateTimeArray",
|
|
"DataType": "DateTime",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test DateTime array"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestDouble",
|
|
"Name": "TestDouble",
|
|
"DataType": "Double",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar Double"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestDoubleArray",
|
|
"Name": "TestDoubleArray",
|
|
"DataType": "Double",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test Double array"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestFloat",
|
|
"Name": "TestFloat",
|
|
"DataType": "Float",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar Float"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestFloatArray",
|
|
"Name": "TestFloatArray",
|
|
"DataType": "Float",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test Float array"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestInt",
|
|
"Name": "TestInt",
|
|
"DataType": "Int32",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar Int32"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestIntArray",
|
|
"Name": "TestIntArray",
|
|
"DataType": "Int32",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test Int32 array"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestString",
|
|
"Name": "TestString",
|
|
"DataType": "String",
|
|
"ValueRank": -1,
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test scalar String"
|
|
},
|
|
{
|
|
"NodeId": "TestChildObject.TestStringArray",
|
|
"Name": "TestStringArray",
|
|
"DataType": "String",
|
|
"ValueRank": 1,
|
|
"ArrayDimensions": [4],
|
|
"AccessLevel": "CurrentReadOrWrite",
|
|
"Description": "Test String array"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|