From a338167830afd935c20fdedc8f2d6dff95abc17e Mon Sep 17 00:00:00 2001 From: CodeShepherd Date: Mon, 23 Jan 2023 11:48:58 +0100 Subject: [PATCH] sync examples and examples.md --- doc/EXAMPLES.md | 124 ++++++++++-------- doc/images/datalayer_request_examples.png | Bin 32655 -> 0 bytes doc/images/examples_get_token.png | Bin 0 -> 15114 bytes ....png => examples_read_CPU_utilisation.png} | Bin ...xamples_set_request_properties_via_msg.png | Bin 0 -> 12437 bytes ...=> examples_subscribe_CPU_utilisation.png} | Bin examples/Data Layer - Read.json | 1 - examples/Data Layer - Subscribe.json | 1 - ...iagnosis - Confirm all pending errors.json | 1 + examples/General - Error handling.json | 1 - ...eb token from authentification server.json | 1 + ...Monitor CPU utilisation in line chart.json | 1 + .../General - Monitor CPU utilisation.json | 1 - ...he current CPU utilisation on request.json | 1 + .../General - Set properties via code.json | 1 - ...eral - Set request properties via msg.json | 1 + ...scribe to the current CPU utilisation.json | 1 + ...l - Use a catch node to handle errors.json | 1 + examples/PLC - Read variable.json | 1 + examples/PLC - Write variable.json | 1 + 20 files changed, 81 insertions(+), 57 deletions(-) delete mode 100644 doc/images/datalayer_request_examples.png create mode 100644 doc/images/examples_get_token.png rename doc/images/{usage_overview_request.png => examples_read_CPU_utilisation.png} (100%) create mode 100644 doc/images/examples_set_request_properties_via_msg.png rename doc/images/{usage_overview_subscribe.png => examples_subscribe_CPU_utilisation.png} (100%) delete mode 100644 examples/Data Layer - Read.json delete mode 100644 examples/Data Layer - Subscribe.json create mode 100644 examples/Diagnosis - Confirm all pending errors.json delete mode 100644 examples/General - Error handling.json create mode 100644 examples/General - Get web token from authentification server.json create mode 100644 examples/General - Monitor CPU utilisation in line chart.json delete mode 100644 examples/General - Monitor CPU utilisation.json create mode 100644 examples/General - Read the current CPU utilisation on request.json delete mode 100644 examples/General - Set properties via code.json create mode 100644 examples/General - Set request properties via msg.json create mode 100644 examples/General - Subscribe to the current CPU utilisation.json create mode 100644 examples/General - Use a catch node to handle errors.json create mode 100644 examples/PLC - Read variable.json create mode 100644 examples/PLC - Write variable.json diff --git a/doc/EXAMPLES.md b/doc/EXAMPLES.md index 4a90fe7..09819a1 100644 --- a/doc/EXAMPLES.md +++ b/doc/EXAMPLES.md @@ -8,10 +8,12 @@ This page contains various examples for different use cases. Looking through the [General examples](#general-examples) +- [Set request properties via msg](#set-request-properties-via-msg) +- [Get web token from authentication server](#get-web-token-from-authentication-server) - [Read the current CPU utilisation on request](#read-the-current-cpu-utilisation-on-request) - [Subscribe to the current CPU utilisation](#subscribe-to-the-current-cpu-utilisation) -- [Example: Monitor CPU utilisation in line chart](#example-monitor-cpu-utilisation-in-line-chart) -- [Catch an error in case a node is missing or the node path is invalid](#catch-an-error-in-case-a-node-is-missing-or-the-node-path-is-invalid) +- [Monitor CPU utilisation in line chart](#monitor-cpu-utilisation-in-line-chart) +- [Use a catch node to handle errors](#use-a-catch-node-to-handle-errors) [Diagnosis Logbook examples](#diagnosis-logbook-examples) @@ -22,31 +24,31 @@ This page contains various examples for different use cases. Looking through the - [Read a PLC variable](#read-a-plc-variable) - [Write a PLC variable (boolean)](#write-a-plc-variable-boolean) -[Dashboard examples for ctrlX PLC App](#dashboard-examples-for-ctrlx-plc) +[Dashboard examples for ctrlX CORE - PLC App](#dashboard-examples-for-ctrlx-core---plc-app) -- [Example: Monitor and handle a boolean PLC variable "bBoolean"](#example-monitor-and-handle-a-boolean-plc-variable-bboolean) -- [Example: Monitor and handle an integer PLC variable "iInteger"](#example-monitor-and-handle-an-integer-plc-variable-iinteger) -- [Example: Monitor and handle a real PLC variable "rReal"](#example-monitor-and-handle-a-real-plc-variable-rreal) -- [Example: Monitor and handle a string PLC variable "sString"](#example-monitor-and-handle-a-string-plc-variable-sstring) +- [Monitor and handle a boolean PLC variable "bBoolean"]( #monitor-and-handle-a-boolean-plc-variable-bboolean) +- [Monitor and handle an integer PLC variable "iInteger"]( #monitor-and-handle-an-integer-plc-variable-iinteger) +- [Monitor and handle a real PLC variable "rReal"]( #monitor-and-handle-a-real-plc-variable-rreal) +- [Monitor and handle a string PLC variable "sString"]( #monitor-and-handle-a-string-plc-variable-sstring) -[Dashboard examples for ctrlX MOTION App](#dashboard-examples-for-ctrlx-motion-app) +[Dashboard examples for ctrlX CORE - MOTION App](#dashboard-examples-for-ctrlx-core---motion-app) -- [Example: Monitor and switch motion state](#example-monitor-and-switch-motion-state) -- [Example: Browse and show all available axes](#example-browse-and-show-all-available-axes) -- [Example: Create an axis "AxisX"](#example-create-an-axis-axisx) -- [Example: Switch and monitor power of an axis "AxisX"](#example-switch-and-monitor-power-of-an-axis-axisx) -- [Example: Monitor position of an axis "AxisX"](#example-monitor-position-of-an-axis-axisx) -- [Example: Move an axis "AxisX"](#example-move-an-axis-axisx) -- [Example: Abort an axis movement of "AxisX"](#example-abort-an-axis-movement-of-axisx) +- [Monitor and switch motion state]( #monitor-and-switch-motion-state) +- [Browse and show all available axes]( #browse-and-show-all-available-axes) +- [Create an axis "AxisX"]( #create-an-axis-axisx) +- [Switch and monitor power of an axis "AxisX"]( #switch-and-monitor-power-of-an-axis-axisx) +- [Monitor position of an axis "AxisX"]( #monitor-position-of-an-axis-axisx) +- [Move an axis "AxisX"]( #move-an-axis-axisx) +- [Abort an axis movement of "AxisX"]( #abort-an-axis-movement-of-axisx) [Dashboard examples for script interpreter and ctrlX CORE - Python Runtime App](#dashboard-examples-for-script-interpreter-and-ctrlx-core---python-runtime-app) -- [Example: Create an interpreter instance "MyInstance" for python](#example-create-an-interpreter-instance-myinstance-for-python) -- [Example: Browse and show all available interpreter instances](#example-browse-and-show-all-available-interpreter-instances) -- [Example: Monitor state of an interpreter instance "MyInstance"](#example-monitor-state-of-an-interpreter-instance-myinstance) -- [Example: Reset interpreter instance "MyInstance"](#example-reset-interpreter-instance-myinstance) -- [Example: Execute a python command in an interpreter instance "MyInstance"](#example-execute-a-python-command-in-an-interpreter-instance-myinstance) -- [Example: Execute a python file "test.py" in an interpreter instance "MyInstance"](#example-execute-a-python-file-testpy-in-an-interpreter-instance-myinstance) +- [Create an interpreter instance "MyInstance" for python]( #create-an-interpreter-instance-myinstance-for-python) +- [Browse and show all available interpreter instances]( #browse-and-show-all-available-interpreter-instances) +- [Monitor state of an interpreter instance "MyInstance"]( #monitor-state-of-an-interpreter-instance-myinstance) +- [Reset interpreter instance "MyInstance"]( #reset-interpreter-instance-myinstance) +- [Execute a python command in an interpreter instance "MyInstance"]( #execute-a-python-command-in-an-interpreter-instance-myinstance) +- [Execute a python file "test.py" in an interpreter instance "MyInstance"]( #execute-a-python-file-testpy-in-an-interpreter-instance-myinstance) ## How to import examples @@ -60,23 +62,41 @@ When importing several examples after each other a message `Some of the nodes yo ## General examples +### Set request properties via msg + +![examples_set_request_properties_via_msg.png](./images/examples_set_request_properties_via_msg.png) + +```JSON +[{"id":"7d8c9ee.2e8246","type":"comment","z":"b7f42922c8391768","name":"Example: Use the msg object to set the properties programmatically via function node","info":"","x":570,"y":100,"wires":[]},{"id":"c558ee94.94a69","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1000,"y":160,"wires":[]},{"id":"b21cb94.37f9648","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"msg","path":"","name":"","x":760,"y":160,"wires":[["c558ee94.94a69"]]},{"id":"6a8a874a.7d0058","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":370,"y":160,"wires":[["19b7a2d1.6a030d"]]},{"id":"19b7a2d1.6a030d","type":"function","z":"b7f42922c8391768","name":"set properties","func":"msg.method = 'READ';\nmsg.path = 'framework/metrics/system/cpu-utilisation-percent';\n\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":160,"wires":[["b21cb94.37f9648"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] +``` + +### Get web token from authentication server + +The following example shows how to get a web token from ctrlX COREs authentication server. The username and password has to be adapted in the `make header` function. + +![examples_get_token.png](./images/examples_get_token.png) + +```JSON +[{"id":"af22af4db424ebc6","type":"function","z":"b7f42922c8391768","name":"make header","func":"var newMsg = {};\nnewMsg.header = {};\nnewMsg.header[\"Content-Type\"] = \"application/json\"\nnewMsg.payload =\n { name: \"boschrexroth\", password: \"boschrexroth\" }\nnewMsg.url = \"https://localhost/identity-manager/api/v2/auth/token\";\nreturn newMsg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":140,"wires":[["0a76057a199ca617"]]},{"id":"0a76057a199ca617","type":"http request","z":"b7f42922c8391768","name":"Get token","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":500,"y":140,"wires":[["ee4def3e07376b8d"]]},{"id":"ee4def3e07376b8d","type":"debug","z":"b7f42922c8391768","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":660,"y":140,"wires":[]},{"id":"c485adb93723e929","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":140,"wires":[["af22af4db424ebc6"]]},{"id":"056e75fc0e45614d","type":"comment","z":"b7f42922c8391768","name":"Get web token from authentication server","info":"","x":240,"y":80,"wires":[]}] +``` + ### Read the current CPU utilisation on request -![usage_overview_request.png](./images/usage_overview_request.png) +![examples_read_CPU_utilisation.png](./images/examples_read_CPU_utilisation.png) ```JSON -[{"id":"765680d3.1c7788","type":"ctrlx-datalayer-request","z":"8a1df649.999ee","device":"9bdd1ac6.4db1c8","method":"READ","path":"framework/metrics/system/cpu-utilisation-percent","payloadFormat":"value","name":"","x":430,"y":140,"wires":[["9195cd7c.d74f3"]]},{"id":"a1661333.e8b348","type":"inject","z":"8a1df649.999ee","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":140,"wires":[["765680d3.1c7788"]]},{"id":"9195cd7c.d74f3","type":"debug","z":"8a1df649.999ee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":750,"y":140,"wires":[]},{"id":"84d1b245.874028","type":"comment","z":"8a1df649.999ee","name":"Example: Read the current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":330,"y":80,"wires":[]},{"id":"9bdd1ac6.4db1c8","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"765680d3.1c7788","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"framework/metrics/system/cpu-utilisation-percent","payloadFormat":"value","name":"","x":690,"y":280,"wires":[["9195cd7c.d74f3"]]},{"id":"a1661333.e8b348","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":280,"wires":[["765680d3.1c7788"]]},{"id":"9195cd7c.d74f3","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1010,"y":280,"wires":[]},{"id":"84d1b245.874028","type":"comment","z":"b7f42922c8391768","name":"Example: Read the current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":590,"y":220,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` ### Subscribe to the current CPU utilisation -![usage_overview_subscribe.png](./images/usage_overview_subscribe.png) +![examples_subscribe_CPU_utilisation.png](./images/examples_subscribe_CPU_utilisation.png) ```JSON -[{"id":"872cd634.800108","type":"comment","z":"8a1df649.999ee","name":"Example: Subscribe to current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":340,"y":240,"wires":[]},{"id":"d921bdd6.1d0b9","type":"ctrlx-datalayer-subscribe","z":"8a1df649.999ee","subscription":"6979a099.efcb18","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":220,"y":300,"wires":[["ffa838b8.e6db98"]]},{"id":"ffa838b8.e6db98","type":"debug","z":"8a1df649.999ee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":530,"y":300,"wires":[]},{"id":"6979a099.efcb18","type":"ctrlx-config-subscription","device":"9bdd1ac6.4db1c8","name":"sub1","publishIntervalMs":""},{"id":"9bdd1ac6.4db1c8","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"872cd634.800108","type":"comment","z":"b7f42922c8391768","name":"Example: Subscribe to current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":580,"y":340,"wires":[]},{"id":"d921bdd6.1d0b9","type":"ctrlx-datalayer-subscribe","z":"b7f42922c8391768","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":460,"y":400,"wires":[["ffa838b8.e6db98"]]},{"id":"ffa838b8.e6db98","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":400,"wires":[]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` -### Example: Monitor CPU utilisation in line chart +### Monitor CPU utilisation in line chart The following example shows how to subscribe to the current CPU utilisation and monitor the last 10 values in a line chart. @@ -84,17 +104,17 @@ The following example shows how to subscribe to the current CPU utilisation and ![example-monitor-cpu-utilisation-linechart-dashboard.png](./images/example-monitor-cpu-utilisation-linechart-dashboard.png) ```JSON -[{"id":"beb3ea051cd65ac2","type":"ctrlx-datalayer-subscribe","z":"5480b2f5a22f3525","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":300,"y":560,"wires":[["be8fc64ed0c8ea73"]]},{"id":"dc3e7b2.6ab9388","type":"comment","z":"5480b2f5a22f3525","name":"Example: Monitor CPU utilisation in line chart","info":"","x":290,"y":520,"wires":[]},{"id":"be8fc64ed0c8ea73","type":"ui_chart","z":"5480b2f5a22f3525","name":"","group":"a4ba432c81cdab8a","order":0,"width":"0","height":"0","label":"CPU utilisation","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"10","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#3eb31e","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":620,"y":560,"wires":[[]]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"a4ba432c81cdab8a","type":"ui_group","name":"General","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] +[{"id":"beb3ea051cd65ac2","type":"ctrlx-datalayer-subscribe","z":"b7f42922c8391768","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":440,"y":480,"wires":[["be8fc64ed0c8ea73"]]},{"id":"dc3e7b2.6ab9388","type":"comment","z":"b7f42922c8391768","name":"Example: Monitor CPU utilisation in line chart","info":"","x":430,"y":440,"wires":[]},{"id":"be8fc64ed0c8ea73","type":"ui_chart","z":"b7f42922c8391768","name":"","group":"a4ba432c81cdab8a","order":0,"width":"0","height":"0","label":"CPU utilisation","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"10","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#3eb31e","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":760,"y":480,"wires":[[]]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"a4ba432c81cdab8a","type":"ui_group","name":"General","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Catch an error in case a node is missing or the node path is invalid +### Use a catch node to handle errors -Errors in the nodes can be catched with the Node-RED internal `catch` node. +Errors in the nodes e.g. node is missing or node path is invalid can be catched with the Node-RED internal `catch` node. ![examples_catch_error.png](./images/examples_catch_error.png) ```JSON -[{"id":"3984d15c.b6a4be","type":"comment","z":"8a1df649.999ee","name":"Example: Use a catch node to handle errors.","info":"","x":230,"y":420,"wires":[]},{"id":"adcdeb72.352b88","type":"debug","z":"8a1df649.999ee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":690,"y":480,"wires":[]},{"id":"bf808c7e.2b56a","type":"ctrlx-datalayer-request","z":"8a1df649.999ee","device":"9bdd1ac6.4db1c8","method":"READ","path":"invalid/path/value/to/force/error","name":"","x":410,"y":480,"wires":[["adcdeb72.352b88"]]},{"id":"eda269ff.f06d88","type":"inject","z":"8a1df649.999ee","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":480,"wires":[["bf808c7e.2b56a"]]},{"id":"b55ac3d1.719b1","type":"catch","z":"8a1df649.999ee","name":"","scope":["bf808c7e.2b56a"],"uncaught":false,"x":220,"y":560,"wires":[["e91439fb.0fa298"]]},{"id":"e91439fb.0fa298","type":"debug","z":"8a1df649.999ee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":450,"y":560,"wires":[]},{"id":"9bdd1ac6.4db1c8","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"3984d15c.b6a4be","type":"comment","z":"b7f42922c8391768","name":"Example: Use a catch node to handle errors.","info":"","x":430,"y":540,"wires":[]},{"id":"adcdeb72.352b88","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":890,"y":600,"wires":[]},{"id":"bf808c7e.2b56a","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"invalid/path/value/to/force/error","name":"","x":610,"y":600,"wires":[["adcdeb72.352b88"]]},{"id":"eda269ff.f06d88","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":600,"wires":[["bf808c7e.2b56a"]]},{"id":"b55ac3d1.719b1","type":"catch","z":"b7f42922c8391768","name":"","scope":["bf808c7e.2b56a"],"uncaught":false,"x":420,"y":680,"wires":[["e91439fb.0fa298"]]},{"id":"e91439fb.0fa298","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":650,"y":680,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` ## Diagnosis Logbook examples @@ -106,7 +126,7 @@ To confirm all errors in the diagnosis logbook you need to send an empty `WRITE` ![examples_diagnosis_confirm_error.png](./images/examples_diagnosis_confirm_error.png) ```JSON -[{"id":"b5effce.db9fd","type":"comment","z":"8a1df649.999ee","name":"Example: Confirm all diagnosis in the logbook","info":"","x":230,"y":640,"wires":[]},{"id":"477443cd.9b7bd4","type":"debug","z":"8a1df649.999ee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":730,"y":700,"wires":[]},{"id":"64d6212b.ba6cd","type":"ctrlx-datalayer-request","z":"8a1df649.999ee","device":"9bdd1ac6.4db1c8","method":"WRITE","path":"diagnosis/confirm/error","payloadFormat":"value_type","name":"","x":510,"y":700,"wires":[["477443cd.9b7bd4"]]},{"id":"226bf82.26e5e88","type":"inject","z":"8a1df649.999ee","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":700,"wires":[["d4a0a352.ae8488"]]},{"id":"d4a0a352.ae8488","type":"function","z":"8a1df649.999ee","name":"","func":"msg.payload = null;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":300,"y":700,"wires":[["64d6212b.ba6cd"]]},{"id":"9bdd1ac6.4db1c8","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"b5effce.db9fd","type":"comment","z":"b7f42922c8391768","name":"Example: Confirm all diagnosis in the logbook","info":"","x":430,"y":720,"wires":[]},{"id":"477443cd.9b7bd4","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":930,"y":780,"wires":[]},{"id":"64d6212b.ba6cd","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"WRITE","path":"diagnosis/confirm/error","payloadFormat":"value_type","name":"","x":710,"y":780,"wires":[["477443cd.9b7bd4"]]},{"id":"226bf82.26e5e88","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":780,"wires":[["d4a0a352.ae8488"]]},{"id":"d4a0a352.ae8488","type":"function","z":"b7f42922c8391768","name":"","func":"msg.payload = null;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":500,"y":780,"wires":[["64d6212b.ba6cd"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` ## PLC examples @@ -127,7 +147,7 @@ The following example shows how to read a PLC variable `i` of type `INT` of a pr ![examples-plc-read-value.png](./images/examples-plc-read-value.png) ```JSON -[{"id":"7467c58b.9bd5ac","type":"ctrlx-datalayer-request","z":"a87ae0cb.f9008","device":"f1d2bfcc.083bf","method":"READ","path":"plc/app/Application/sym/PLC_PRG/i","payloadFormat":"value_type","name":"","x":470,"y":200,"wires":[["8090a7bb.b361"]]},{"id":"8090a7bb.b361","type":"debug","z":"a87ae0cb.f9008","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":750,"y":200,"wires":[]},{"id":"f830ae36.91e878","type":"inject","z":"a87ae0cb.f9008","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":200,"wires":[["7467c58b.9bd5ac"]]},{"id":"76611ca.4da74e4","type":"comment","z":"a87ae0cb.f9008","name":"Example: Read a PLC variable","info":"","x":190,"y":120,"wires":[]},{"id":"f1d2bfcc.083bf","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"7467c58b.9bd5ac","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"plc/app/Application/sym/PLC_PRG/i","payloadFormat":"value_type","name":"","x":670,"y":920,"wires":[["8090a7bb.b361"]]},{"id":"8090a7bb.b361","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":950,"y":920,"wires":[]},{"id":"f830ae36.91e878","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":400,"y":920,"wires":[["7467c58b.9bd5ac"]]},{"id":"76611ca.4da74e4","type":"comment","z":"b7f42922c8391768","name":"Example: Read a PLC variable","info":"","x":390,"y":840,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` The request returns in `msg.payload`: @@ -153,7 +173,7 @@ END_VAR ![examples-plc-write-value-bool.png](./images/examples-plc-write-value-bool.png) ```JSON -[{"id":"501f80f3.0e5068","type":"ctrlx-datalayer-request","z":"a87ae0cb.f9008","device":"f1d2bfcc.083bf","method":"WRITE","path":"plc/app/Application/sym/PLC_PRG/b","payloadFormat":"value_type","name":"","x":470,"y":400,"wires":[["37817780.db70c"]]},{"id":"37817780.db70c","type":"debug","z":"a87ae0cb.f9008","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":750,"y":400,"wires":[]},{"id":"5d059ae1.63156c","type":"inject","z":"a87ae0cb.f9008","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"type\":\"bool8\",\"value\":true}","payloadType":"json","x":190,"y":400,"wires":[["501f80f3.0e5068"]]},{"id":"6466502e.8f8c","type":"comment","z":"a87ae0cb.f9008","name":"Example: Write a PLC variable (BOOL)","info":"","x":210,"y":320,"wires":[]},{"id":"f1d2bfcc.083bf","type":"ctrlx-config","name":"","hostname":"localhost","debug":false}] +[{"id":"501f80f3.0e5068","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/PLC_PRG/b","payloadFormat":"value_type","name":"","x":670,"y":1060,"wires":[["37817780.db70c"]]},{"id":"37817780.db70c","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":950,"y":1060,"wires":[]},{"id":"5d059ae1.63156c","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"type\":\"bool8\",\"value\":true}","payloadType":"json","x":390,"y":1060,"wires":[["501f80f3.0e5068"]]},{"id":"6466502e.8f8c","type":"comment","z":"b7f42922c8391768","name":"Example: Write a PLC variable (BOOL)","info":"","x":410,"y":980,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] ``` The request returns in `msg.payload` the written value: @@ -165,11 +185,11 @@ The request returns in `msg.payload` the written value: } ``` -## Dashboard examples for ctrlX PLC +## Dashboard examples for ctrlX CORE - PLC App Please note that for these examples the installation of the ctrlX PLC app is expected. See [our store](https://developer.community.boschrexroth.com/t5/Store-and-How-to/ctrlX-CORE-PLC-App/ba-p/13298) and the corresponding [documentation of the ctrlX PLC app](https://docs.automation.boschrexroth.com/document/version/1.0/PLC-App_-Application-Manual/documentRoot/7239751866761051~en/). -### Example: Monitor and handle a boolean PLC variable "bBoolean" +### Monitor and handle a boolean PLC variable "bBoolean" The following example shows how to read, write and monitor a PLC variable `bBoolean` of type `BOOL` via the dashboard. A symbol configuration has to be present in the PLC project and the variable has to be configured for write access via a pragma or directly in the symbolic variable configuration. Also the variable has to be used in a program or via pragma. Note: A digital IO can be treated the same way. @@ -197,7 +217,7 @@ bBoolean; [{"id":"c1cc8f5b.e11858","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/GVL/bBoolean","payloadFormat":"value_type","name":"Write \"bBoolean\" value","x":790,"y":160,"wires":[[]]},{"id":"ec4257d3.ae58b","type":"ui_switch","z":"4ff80d56.dd60fc","name":"","label":"bBoolean ","tooltip":"","group":"938bb9af.bc8108","order":1,"width":"0","height":"0","passthru":false,"decouple":"true","topic":"","topicType":"str","style":"","onvalue":"{\"value\":true,\"type\":\"bool8\"}","onvalueType":"json","onicon":"","oncolor":"","offvalue":"{\"value\":false,\"type\":\"bool8\"}","offvalueType":"json","officon":"","offcolor":"","animate":false,"x":580,"y":160,"wires":[["c1cc8f5b.e11858"]]},{"id":"d2ca5a5e.a1144","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor and handle a boolean PLC variable \"bBoolean\"","info":"","x":300,"y":120,"wires":[]},{"id":"430d03bd.4a9864","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"plc/app/Application/sym/GVL/bBoolean","name":"Read \"bBoolean\" value","x":200,"y":160,"wires":[["d399bf94.d6f75"]]},{"id":"d399bf94.d6f75","type":"function","z":"4ff80d56.dd60fc","name":"make value","func":"var newMsg = {}\nnewMsg.payload = {\"type\":\"bool8\",\"value\":msg.payload}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":160,"wires":[["ec4257d3.ae58b"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"938bb9af.bc8108","type":"ui_group","name":"PLC Variable handling","tab":"9cba2148.8c9148","order":1,"disp":true,"width":"4","collapse":false},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Monitor and handle an integer PLC variable "iInteger" +### Monitor and handle an integer PLC variable "iInteger" The following example shows how to read, write and monitor a PLC variable `iInteger` of type `INT` via the dashboard. A symbol configuration has to be present in the PLC project and the variable has to be configured for write access via a pragma or directly in the symbolic variable configuration. Also the variable has to be used in a program or via pragma. @@ -224,7 +244,7 @@ iInteger; [{"id":"6afd3c5c.85174c","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/GVL/iInteger","payloadFormat":"value_type","name":"Write \"iInteger\" value","x":780,"y":300,"wires":[[]]},{"id":"699499c0.a19078","type":"ui_text_input","z":"4ff80d56.dd60fc","name":"","label":"iInteger","tooltip":"","group":"938bb9af.bc8108","order":1,"width":0,"height":0,"passthru":false,"mode":"number","delay":"0","topic":"topic","topicType":"msg","x":400,"y":300,"wires":[["dad913ff.7d0c6"]]},{"id":"dad913ff.7d0c6","type":"function","z":"4ff80d56.dd60fc","name":"make value","func":"var newMsg = {}\nnewMsg.payload = {\"type\":\"int16\",\"value\":msg.payload}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":300,"wires":[["6afd3c5c.85174c"]]},{"id":"f24564a9.ceb668","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"plc/app/Application/sym/GVL/iInteger","name":"Read \"iInteger\" value","x":200,"y":300,"wires":[["699499c0.a19078"]]},{"id":"1da5cb6a.45e5cd","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor and handle an integer PLC variable \"iInteger\"","info":"","x":300,"y":260,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"938bb9af.bc8108","type":"ui_group","name":"PLC Variable handling","tab":"9cba2148.8c9148","order":1,"disp":true,"width":"4","collapse":false},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Monitor and handle a real PLC variable "rReal" +### Monitor and handle a real PLC variable "rReal" The following example shows how to read, write and monitor a PLC variable `rReal` of type `REAL` via the dashboard. A symbol configuration has to be present in the PLC project and the variable has to be configured for write access via a pragma or directly in the symbolic variable configuration. Also the variable has to be used in a program or via pragma. @@ -251,7 +271,7 @@ rReal; [{"id":"2c89b6ef.36830a","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/GVL/rReal","payloadFormat":"value_type","name":"Write \"rReal\" value","x":970,"y":440,"wires":[[]]},{"id":"370f99d.1a78366","type":"ui_text_input","z":"4ff80d56.dd60fc","name":"","label":"rReal","tooltip":"","group":"938bb9af.bc8108","order":1,"width":0,"height":0,"passthru":false,"mode":"number","delay":"0","topic":"topic","topicType":"msg","x":610,"y":440,"wires":[["4f0d75c5.219fc4"]]},{"id":"4f0d75c5.219fc4","type":"function","z":"4ff80d56.dd60fc","name":"make value","func":"var newMsg = {}\nif (msg.payload.value != null){\n //newMsg.payload = {\"type\":\"float\",\"value\":Number(msg.payload.value)}\n newMsg.payload = {\"type\":\"float\",\"value\":msg.payload.value}\n}\nelse {\n //newMsg.payload = {\"type\":\"float\",\"value\":Number(msg.payload)}\n newMsg.payload = {\"type\":\"float\",\"value\":msg.payload}\n}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":770,"y":440,"wires":[["2c89b6ef.36830a"]]},{"id":"5bd100f5.b21dd8","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"plc/app/Application/sym/GVL/rReal","name":"Read \"rReal\" value","x":190,"y":440,"wires":[["17614aa4.d713dd"]]},{"id":"f479d2d0.e553c","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor and handle a real PLC variable \"rReal\"","info":"","x":290,"y":400,"wires":[]},{"id":"17614aa4.d713dd","type":"function","z":"4ff80d56.dd60fc","name":"make value fixed(5)","func":"//msg.test = msg.payload.toFixed(5);\nmsg.payload = Number(msg.payload.toFixed(5));\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","x":420,"y":440,"wires":[["370f99d.1a78366"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"938bb9af.bc8108","type":"ui_group","name":"PLC Variable handling","tab":"9cba2148.8c9148","order":1,"disp":true,"width":"4","collapse":false},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Monitor and handle a string PLC variable "sString" +### Monitor and handle a string PLC variable "sString" The following example shows how to read, write and monitor a PLC variable `sString` of type `STRING` via the dashboard. A symbol configuration has to be present in the PLC project and the variable has to be configured for write access via a pragma or directly in the symbolic variable configuration. Also the variable has to be used in a program or via pragma. @@ -278,11 +298,11 @@ sString; [{"id":"52f3b28.7154acc","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/GVL/sString","payloadFormat":"value_type","name":"Write \"sString\" value","x":780,"y":580,"wires":[[]]},{"id":"a84a6218.d8fa38","type":"ui_text_input","z":"4ff80d56.dd60fc","name":"","label":"sString","tooltip":"","group":"938bb9af.bc8108","order":1,"width":0,"height":0,"passthru":false,"mode":"text","delay":"0","topic":"topic","topicType":"msg","x":400,"y":580,"wires":[["b77fcdb1.bb59e"]]},{"id":"b77fcdb1.bb59e","type":"function","z":"4ff80d56.dd60fc","name":"make value","func":"var newMsg = {}\nnewMsg.payload = {\"type\":\"string\",\"value\":msg.payload}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":580,"wires":[["52f3b28.7154acc"]]},{"id":"7fd8a2ba.130acc","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"plc/app/Application/sym/GVL/sString","name":"Read \"sString\" value","x":200,"y":580,"wires":[["a84a6218.d8fa38"]]},{"id":"efa71414.90e038","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor and handle a string PLC variable \"sString\"","info":"","x":310,"y":540,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"938bb9af.bc8108","type":"ui_group","name":"PLC Variable handling","tab":"9cba2148.8c9148","order":1,"disp":true,"width":"4","collapse":false},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -## Dashboard examples for ctrlX MOTION app +## Dashboard examples for ctrlX CORE - MOTION App Please note that for these examples the installation of the ctrlX MOTION app is expected. See [our store](https://developer.community.boschrexroth.com/t5/Store-and-How-to/ctrlX-CORE-Motion-App/ba-p/13294) and the corresponding [documentation of the ctrlX MOTION app](https://docs.automation.boschrexroth.com/document/version/1.0/R911403791_01_Motion_App_-1_-en_US/documentRoot/7249282556584996~en/). -### Example: Monitor and switch motion state +### Monitor and switch motion state The following example shows how to switch and monitor the state of the ctrlX MOTION. @@ -293,7 +313,7 @@ The following example shows how to switch and monitor the state of the ctrlX MOT [{"id":"ffc99584.58bbd","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor and switch motion state","info":"","x":240,"y":780,"wires":[]},{"id":"cac2d7f4.22c55","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"motion/cmd/opstate","payloadFormat":"value_type","name":"Switch motion state","x":850,"y":820,"wires":[[]]},{"id":"60511613.ec7a08","type":"ui_switch","z":"4ff80d56.dd60fc","name":"","label":"Motion state","tooltip":"","group":"372098c9.3029b8","order":1,"width":"3","height":"1","passthru":false,"decouple":"true","topic":"","topicType":"str","style":"","onvalue":"{\"value\":\"Booting\",\"type\":\"string\"}","onvalueType":"json","onicon":"","oncolor":"","offvalue":"{\"value\":\"Configuration\",\"type\":\"string\"}","offvalueType":"json","officon":"","offcolor":"","animate":false,"x":650,"y":820,"wires":[["cac2d7f4.22c55"]]},{"id":"3f74d73d.b1514","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"motion/state/opstate","name":"Read motion state","x":190,"y":820,"wires":[["9c708078.0c74f","ecb0f768.8af99"]]},{"id":"9c708078.0c74f","type":"ui_text","z":"4ff80d56.dd60fc","group":"372098c9.3029b8","order":2,"width":"3","height":"1","name":"","label":"Motion state","format":"{{msg.payload}}","layout":"col-center","x":410,"y":860,"wires":[]},{"id":"ecb0f768.8af99","type":"function","z":"4ff80d56.dd60fc","name":"make switch status","func":"var newMsg = {};\nif(msg.payload == \"Running\"){\n newMsg.payload = {\"value\":\"Booting\",\"type\":\"string\"}\n}\nelse {\n newMsg.payload = {\"value\":\"Configuration\",\"type\":\"string\"} \n}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":820,"wires":[["60511613.ec7a08"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"372098c9.3029b8","type":"ui_group","name":"Motion handling","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Browse and show all available axes +### Browse and show all available axes The following example shows how to browse and show all available axes of the ctrlX MOTION. @@ -304,7 +324,7 @@ The following example shows how to browse and show all available axes of the ctr [{"id":"a264954e.592108","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"BROWSE","path":"motion/axs","payloadFormat":"value_type","name":"Browse axes","x":390,"y":980,"wires":[["1500c19c.aef4ce"]]},{"id":"c426d34b.1596e8","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"372098c9.3029b8","order":3,"width":"3","height":"1","passthru":false,"label":"Browse axes","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":1020,"wires":[["a264954e.592108"]]},{"id":"916c8ea.af493f","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":980,"wires":[["a264954e.592108"]]},{"id":"1500c19c.aef4ce","type":"function","z":"4ff80d56.dd60fc","name":"make string","func":"var newMsg = {};\nnewMsg.payload = \"\";\nif (msg.payload.value == null){\n newMsg.payload = \"could not read\";\n}\nelse if(msg.payload.value.length > 0){\n for (var i = 0; i < msg.payload.value.length; i++) {\n if(i==0){\n newMsg.payload += msg.payload.value[i];\n }\n else{\n newMsg.payload += \", \" + msg.payload.value[i];\n }\n }\n}\nelse{\n newMsg.payload = \"no axes found\"\n}\nreturn newMsg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":980,"wires":[["737187dc.883be8"]]},{"id":"737187dc.883be8","type":"ui_text","z":"4ff80d56.dd60fc","group":"372098c9.3029b8","order":5,"width":"0","height":"0","name":"","label":"Axes","format":"{{msg.payload}}","layout":"col-center","x":730,"y":980,"wires":[]},{"id":"3c4502dc.7928ce","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Browse and show all available axes","info":"","x":250,"y":940,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"372098c9.3029b8","type":"ui_group","name":"Motion handling","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Create an axis "AxisX" +### Create an axis "AxisX" The following example shows how to create a motion object of the type axis with the name `AxisX` in the ctrlX MOTION. The state of the ctrlX MOTION has to be `Configuration`. @@ -315,7 +335,7 @@ The following example shows how to create a motion object of the type axis with [{"id":"359e6180.4b2b4e","type":"function","z":"4ff80d56.dd60fc","name":"make create command","func":"var newMsg = {};\nnewMsg.payload = {\"type\":\"string\",\"value\":\"AxisX\"}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":450,"y":1140,"wires":[["166a0be8.1525fc"]]},{"id":"166a0be8.1525fc","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"motion/axs","payloadFormat":"value_type","name":"Create \"AxisX\"","x":680,"y":1140,"wires":[[]]},{"id":"2228f62a.ade41a","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Create an axis \"AxisX\"","info":"","x":210,"y":1100,"wires":[]},{"id":"586a2197.7b6c98","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"372098c9.3029b8","order":4,"width":"3","height":"1","passthru":false,"label":"Create \"AxisX\"","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":220,"y":1180,"wires":[["359e6180.4b2b4e"]]},{"id":"34651a40.a492fe","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":1140,"wires":[["359e6180.4b2b4e"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"372098c9.3029b8","type":"ui_group","name":"Motion handling","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Switch and monitor power of an axis "AxisX" +### Switch and monitor power of an axis "AxisX" The following example shows how to switch and monitor the power state of a motion axis `AxisX` in the ctrlX MOTION. The corresponding motion object has to be present and the state of the ctrlX MOTION has to be `Running`. @@ -326,7 +346,7 @@ The following example shows how to switch and monitor the power state of a motio [{"id":"7598c8e9.423f28","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Switch and monitor power of an axis \"AxisX\"","info":"","x":280,"y":1380,"wires":[]},{"id":"f3001db9.f1ac5","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"motion/axs/AxisX/cmd/power","payloadFormat":"value_type","name":"Write \"AxisX\" Power","x":1080,"y":1420,"wires":[["ec10e282.671738"]]},{"id":"f790e337.3bfc98","type":"ui_switch","z":"4ff80d56.dd60fc","name":"","label":"Power \"AxisX\"","tooltip":"","group":"eb7620ae.6f5d","order":1,"width":"4","height":"1","passthru":false,"decouple":"true","topic":"","topicType":"str","style":"","onvalue":"{\"value\":true,\"type\":\"bool8\"}","onvalueType":"json","onicon":"","oncolor":"","offvalue":"{\"value\":false,\"type\":\"bool8\"}","offvalueType":"json","officon":"","offcolor":"","animate":false,"x":880,"y":1420,"wires":[["f3001db9.f1ac5"]]},{"id":"ec10e282.671738","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"READ","path":"motion/axs/AxisX/state/opstate/plcopen","payloadFormat":"value_type","name":"Read \"AxisX\" Power","x":440,"y":1420,"wires":[["be2d941e.9651c8"]]},{"id":"be2d941e.9651c8","type":"function","z":"4ff80d56.dd60fc","name":"make switch status","func":"var newMsg = {};\nif(msg.payload.value == \"OUTDATED\"){\n newMsg.payload = {\"type\":\"bool8\",\"value\":false} \n}\nelse if(msg.payload.value == \"DISABLED\") {\n newMsg.payload = {\"type\":\"bool8\",\"value\":false}\n} \nelse if(msg.payload.value == \"COORDINATED_MOTION_DISABLED\") {\n newMsg.payload = {\"type\":\"bool8\",\"value\":false} \n}\nelse if(msg.payload.value == \"ERRORSTOP\") {\n newMsg.payload = {\"type\":\"bool8\",\"value\":false} \n}\nelse {\n newMsg.payload = {\"type\":\"bool8\",\"value\":true} \n}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":670,"y":1420,"wires":[["f790e337.3bfc98"]]},{"id":"bb714120.4807d","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":1420,"wires":[["ec10e282.671738"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"eb7620ae.6f5d","type":"ui_group","name":"Axes handling","tab":"9cba2148.8c9148","order":3,"disp":true,"width":"5","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Monitor position of an axis "AxisX" +### Monitor position of an axis "AxisX" The following example shows how to monitor the interpolated position of a motion axis `AxisX` in the ctrlX MOTION. The corresponding motion object has to be present and the state of the ctrlX MOTION has to be `Running`. @@ -337,7 +357,7 @@ The following example shows how to monitor the interpolated position of a motion [{"id":"657f7c1a.cf6cec","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"motion/axs/AxisX/state/values/ipo/pos/mm","name":"Read \"AxisX\" pos","x":160,"y":1560,"wires":[["1cfdc1d6.d4e5de"]]},{"id":"85fa0533.8ab3d8","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor position of an axis \"AxisX\"","info":"","x":240,"y":1520,"wires":[]},{"id":"122d92a4.f6a56d","type":"ui_text","z":"4ff80d56.dd60fc","group":"eb7620ae.6f5d","order":2,"width":"3","height":"1","name":"","label":"Position \"AxisX\"","format":"{{msg.payload}}","layout":"col-center","x":620,"y":1560,"wires":[]},{"id":"1cfdc1d6.d4e5de","type":"function","z":"4ff80d56.dd60fc","name":"make value fixed(2)","func":"var newMsg = {};\nnewMsg.payload = msg.payload.toFixed(2);\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":1560,"wires":[["122d92a4.f6a56d"]]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"eb7620ae.6f5d","type":"ui_group","name":"Axes handling","tab":"9cba2148.8c9148","order":3,"disp":true,"width":"5","collapse":false},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Move an axis "AxisX" +### Move an axis "AxisX" The following example shows how to move a motion axis `AxisX` in the ctrlX MOTION to position = 10 with velocity, acceleration, deceleration = 10 and jerk = 0. The state of the ctrlX MOTION has to be `Running`. The corresponding motion object has to be present and its state has to be `STANDSTILL` (powered on, [see state machine documentation](https://docs.automation.boschrexroth.com/document/version/1.0/R911403791_01_Motion_App_-1_-en_US/chapter/metadata.boschrexroth.de~iiDC~Topic-ad91cfe627c8cf7c0a347e880bebcac6-3-en-US~en/?sel=IwelHYQFhAGNogEwC5YBpQUfUNXBRA%3D%3D)). @@ -348,7 +368,7 @@ The following example shows how to move a motion axis `AxisX` in the ctrlX MOTIO [{"id":"ef2f6f42.26f6b8","type":"function","z":"4ff80d56.dd60fc","name":"make pos command","func":"var newMsg = {};\nnewMsg.payload = {\n \"type\":\"object\",\n \"value\":{\n\t \"axsPos\":\"10\",\"buffered\":false,\"lim\":{\"vel\":\"10\",\"acc\":\"10\",\"dec\":\"10\",\"jrkAcc\":\"0\",\"jrkDec\":\"0\"}\n\t }\n }\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":440,"y":1680,"wires":[["c27d8d3a.aba638"]]},{"id":"c27d8d3a.aba638","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"motion/axs/AxisX/cmd/pos-abs","payloadFormat":"value_type","name":"\"AxisX\" pos abs","x":670,"y":1680,"wires":[[]]},{"id":"569584de.0946e4","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Move an axis \"AxisX\"","info":"","x":200,"y":1640,"wires":[]},{"id":"fcc3bed0.080f48","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"eb7620ae.6f5d","order":3,"width":"2","height":"1","passthru":false,"label":"Move \"AxisX\"","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":220,"y":1720,"wires":[["ef2f6f42.26f6b8"]]},{"id":"14a61d63.0cf1ab","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":1680,"wires":[["ef2f6f42.26f6b8"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"eb7620ae.6f5d","type":"ui_group","name":"Axes handling","tab":"9cba2148.8c9148","order":3,"disp":true,"width":"5","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Abort an axis movement of "AxisX" +### Abort an axis movement of "AxisX" The following example shows how to abort an movement of a motion axis `AxisX` in the ctrlX MOTION with deceleration = 10 and jerk = 0. The state of the ctrlX MOTION has to be `Running`. The corresponding motion object has to be present and its state has to be `DISCRETE_MOTION`. @@ -363,7 +383,7 @@ The following example shows how to abort an movement of a motion axis `AxisX` in Please note that for these examples the installation of the `ctrlX CORE - Python Runtime App` is expected. See [our store](https://developer.community.boschrexroth.com/t5/Store-and-How-to/ctrlX-CORE-Python-Runtime-App/ba-p/15901) and the corresponding [documentation of the "Script parser/interpreter (Python)"](https://docs.automation.boschrexroth.com/document/version/1.0/R911403767_ctrlX-CORE_-Base_-1_-en_US/chapter/metadata.boschrexroth.de~iiDC~Topic-0e3a24c48bafe9140a347e880b4e0362-2-en-US~en/?sel=IwegDCAs49BMAuMAaUFoXSRBmSQ%3D). -### Example: Create an interpreter instance "MyInstance" for python +### Create an interpreter instance "MyInstance" for python The following example shows how to create an interpreter instance `MyInstance` for executing python code/scripts. @@ -374,7 +394,7 @@ The following example shows how to create an interpreter instance `MyInstance` f [{"id":"41a67c09.9532e4","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Create an interpreter instance \"MyInstance\" for python","info":"","x":310,"y":1960,"wires":[]},{"id":"32d49076.f8923","type":"function","z":"4ff80d56.dd60fc","name":"make create command","func":"var newMsg = {};\nnewMsg.payload = {\n \"type\":\"object\",\n \"value\":{\n\t \"name\":\"MyInstance\",\"language\":\"python\"\n }\n }\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":2000,"wires":[["b3d753e.4376c3"]]},{"id":"b3d753e.4376c3","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"script/instances","payloadFormat":"value_type","name":"Create Instance \"MyInstance\"","x":690,"y":2000,"wires":[[]]},{"id":"3cf2344c.df7184","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":2040,"wires":[["32d49076.f8923"]]},{"id":"18c49496.2cf273","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"f675e9d2.c9935","order":1,"width":"3","height":"1","passthru":false,"label":"Create Instance","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":180,"y":2000,"wires":[["32d49076.f8923"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"f675e9d2.c9935","type":"ui_group","name":"Interpreter handling","tab":"9cba2148.8c9148","order":4,"disp":true,"width":"4","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Browse and show all available interpreter instances +### Browse and show all available interpreter instances The following example shows how to browse and show all available instances of the ctrlX script manager. @@ -385,7 +405,7 @@ The following example shows how to browse and show all available instances of th [{"id":"54d27d.03212584","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"BROWSE","path":"script/instances","payloadFormat":"value_type","name":"Browse instances","x":430,"y":2160,"wires":[["474a1b6.70f72e4"]]},{"id":"5346646a.c4a73c","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"f675e9d2.c9935","order":2,"width":"3","height":"1","passthru":false,"label":"Browse instances","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":200,"y":2200,"wires":[["54d27d.03212584"]]},{"id":"90a22cfc.a01b18","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":2160,"wires":[["54d27d.03212584"]]},{"id":"474a1b6.70f72e4","type":"function","z":"4ff80d56.dd60fc","name":"make string","func":"var newMsg = {};\nnewMsg.payload = \"\";\nif (msg.payload.value == null){\n newMsg.payload = \"could not read\";\n}\nelse if(msg.payload.value.length > 0){\n for (var i = 0; i < msg.payload.value.length; i++) {\n if(i==0){\n newMsg.payload += msg.payload.value[i];\n }\n else{\n newMsg.payload += \", \" + msg.payload.value[i];\n }\n }\n}\nelse{\n newMsg.payload = \"no instances found\"\n}\nreturn newMsg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":2160,"wires":[["f1db1731.1867c"]]},{"id":"f1db1731.1867c","type":"ui_text","z":"4ff80d56.dd60fc","group":"f675e9d2.c9935","order":3,"width":"0","height":"0","name":"","label":"Instances","format":"{{msg.payload}}","layout":"col-center","x":800,"y":2160,"wires":[]},{"id":"4881365b.cb4c1","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Browse and show all available interpreter instances","info":"","x":250,"y":2120,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"f675e9d2.c9935","type":"ui_group","name":"Interpreter handling","tab":"9cba2148.8c9148","order":4,"disp":true,"width":"4","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Monitor state of an interpreter instance "MyInstance" +### Monitor state of an interpreter instance "MyInstance" The following example shows how to monitor the state of an instances `MyInstance` of the ctrlX script manager ([see state machine](https://docs.automation.boschrexroth.com/document/version/1.0/R911403767_ctrlX-CORE_-Base_-1_-en_US/chapter/metadata.boschrexroth.de~iiDC~Topic-0e3a24c48bafe9140a347e880b4e0362-2-en-US~en/?sel=AwegjCAs6tqyATALmAGlBaYHyk5RAdiA)). @@ -396,7 +416,7 @@ The following example shows how to monitor the state of an instances `MyInstance [{"id":"9b9e6fbd.7416e8","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Monitor state of an interpreter instance \"MyInstance\"","info":"","x":250,"y":2280,"wires":[]},{"id":"59b3f37.f33bf0c","type":"ctrlx-datalayer-subscribe","z":"4ff80d56.dd60fc","subscription":"632bcc2.eddf134","path":"script/instances/MyInstance/state/opstate","name":"Read instance state","x":170,"y":2320,"wires":[["4d250434.d9cf1c"]]},{"id":"4d250434.d9cf1c","type":"ui_text","z":"4ff80d56.dd60fc","group":"f675e9d2.c9935","order":4,"width":"4","height":"1","name":"","label":"\"MyInstance\" state","format":"{{msg.payload}}","layout":"col-center","x":410,"y":2320,"wires":[]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"f675e9d2.c9935","type":"ui_group","name":"Interpreter handling","tab":"9cba2148.8c9148","order":4,"disp":true,"width":"4","collapse":false},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Reset interpreter instance "MyInstance" +### Reset interpreter instance "MyInstance" The following example shows how to reset a script interpreter instance `MyInstance`. The corresponding instance has to be present and in state `ERROR`. @@ -407,7 +427,7 @@ The following example shows how to reset a script interpreter instance `MyInstan [{"id":"79e751dd.c8402","type":"function","z":"5480b2f5a22f3525","name":"make reset command","func":"var newMsg = {};\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":220,"wires":[["7cb11da0.1916bc"]]},{"id":"7cb11da0.1916bc","type":"ctrlx-datalayer-request","z":"5480b2f5a22f3525","device":"7b877229.678964","method":"CREATE","path":"script/instances/MyInstance/cmd/reset","payloadFormat":"value_type","name":"Reset \"MyInstance\"","x":900,"y":220,"wires":[[]]},{"id":"a11e7b1a.b3a8d","type":"ui_button","z":"5480b2f5a22f3525","name":"","group":"f675e9d2.c9935","order":3,"width":"3","height":"1","passthru":false,"label":"Reset instance","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":420,"y":220,"wires":[["79e751dd.c8402"]]},{"id":"690b0e68.ffc46","type":"inject","z":"5480b2f5a22f3525","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":420,"y":260,"wires":[["79e751dd.c8402"]]},{"id":"dc3e7b2.6ab9388","type":"comment","z":"5480b2f5a22f3525","name":"Example: Reset interpreter instance \"MyInstance\"","info":"","x":500,"y":180,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"f675e9d2.c9935","type":"ui_group","name":"Interpreter handling","tab":"9cba2148.8c9148","order":4,"disp":true,"width":"4","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Execute a python command in an interpreter instance "MyInstance" +### Execute a python command in an interpreter instance "MyInstance" The following example shows how to execute a python command script in n script interpreter instance `MyInstance`. The corresponding instance has to be present and in state `INIT` or `READY` ([see state machine](https://docs.automation.boschrexroth.com/document/version/1.0/R911403767_ctrlX-CORE_-Base_-1_-en_US/chapter/metadata.boschrexroth.de~iiDC~Topic-0e3a24c48bafe9140a347e880b4e0362-2-en-US~en/?sel=AwegjCAs6tqyATALmAGlBaYHyk5RAdiA)). @@ -418,7 +438,7 @@ The following example shows how to execute a python command script in n script i [{"id":"e414e92c.da574","type":"function","z":"4ff80d56.dd60fc","name":"make execute command","func":"var newMsg = {};\nnewMsg.payload = {\n \"type\":\"object\",\n \"value\":{\n \"name\": \"import time; time.sleep(25)\",\n \"param\": []\n }\n}\nreturn newMsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":450,"y":2160,"wires":[["e0470a61.af156"]]},{"id":"1ca4bac8.ef2ea5","type":"inject","z":"4ff80d56.dd60fc","name":"Manual Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":2200,"wires":[["e414e92c.da574"]]},{"id":"e0470a61.af156","type":"ctrlx-datalayer-request","z":"4ff80d56.dd60fc","device":"7b877229.678964","method":"CREATE","path":"script/instances/MyInstance/cmd/string","payloadFormat":"value_type","name":"Execute Command","x":690,"y":2160,"wires":[[]]},{"id":"4f058c35.13bd84","type":"comment","z":"4ff80d56.dd60fc","name":"Example: Execute a python command in an interpreter instance \"MyInstance\"","info":"","x":320,"y":2120,"wires":[]},{"id":"a4823a8f.8706a8","type":"ui_button","z":"4ff80d56.dd60fc","name":"","group":"f675e9d2.c9935","order":1,"width":"3","height":"1","passthru":false,"label":"Execute command","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":190,"y":2160,"wires":[["e414e92c.da574"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"f675e9d2.c9935","type":"ui_group","name":"Interpreter handling","tab":"9cba2148.8c9148","order":4,"disp":true,"width":"4","collapse":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] ``` -### Example: Execute a python file "test.py" in an interpreter instance "MyInstance" +### Execute a python file "test.py" in an interpreter instance "MyInstance" The following example shows how to execute a python script file in a script interpreter instance `MyInstance`. The corresponding instance has to be present and in state `INIT` or `READY`. The file `test.py` has to be present in the root folder of the active configuration. diff --git a/doc/images/datalayer_request_examples.png b/doc/images/datalayer_request_examples.png deleted file mode 100644 index 84de1a971bddc901b191379e597422979dd82635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32655 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

1zUmn$Il7K5K8OKsn<~htRa= zwtiWXY4N_ECAPM#3ddiXaUa8K_VsL|NIo~M*5OS5di+r>S9LeryBAc*N#kyi!=*H8 zB|2hI;Yt+>17m;fbSa`uPQ>-5?DWN)i~*fa?yM2+8&`a=WH-NLqFiq}01XdDskqm! zW{MUgVqSDPx-m<%p3@t^X`WfiXe#KN`=YXtn$a+{GqNL-zsaq7%Pr$^vGFa-iP<|j zNxcZ*m>(bU@WF60gn2lbILEIXDN){ESOE=dp*4Cs+g0pbp7-DRf?L{y03px3yW25< zgKafuvWQEN`ffvg`}M$F#O^V7;D4;-|91$in2ZaaAHq!d&f&jMU2hJG510P3!~Ov+ zvE(S5!Oah@G0c_=`FB5imf7sYwJu(N$`qi;F3tpsGQ2!#eFMn>1@T-_aADdrH2&cEGk=|n|A8WK`KP^ zR=;ZO3?wSiwlb#PbOZpM4j}z;Wptt6EPiG`P>oDkCLu5Xv!pJ&Y-=x9woG@X(RNq+ zumEU<27S+*u9P_4DAnZUTmDWr@Y?%4%rAdAu>AX;MhsdA4mL&{)-*l)@$%Sqw&HRZ z?rqrYT(|v}q&lM$h4}Bs3#H~M44ZjdopzF|8e+@`0fJ-+K~W&ex${hW46gU*T#jS` z4J}^e50y2(*=kLu2}Ceiy+5USo|MXLxozWaFvc19>pz2i$$Tq4MiJkV<^IuYpDB!{0mdMi9-TYA5Qa>6{lCD5 zx7tqs*@M%fm>(Uj`v~83oaph)om;+iu$oMub8?i5ndFGbj@hP@NwYng@^*ZW*QqRZ zR2JsZzvoPcll?`brL1$$ef(a`5Z|LLZ#WJ%{MfDmYEu7y2rSigocaX+;+6QLzQ3*z zlHRWxJ1%pWro6O~K4z(73WF>v5){3lh~v9;Ey7_>w;KqBsH>hvcwXY;dkjOP33>vl z$;>PkW+ZpjPGuJ5r7s`82k*f*vgCB+_#`11)dIVxW&K-w+ooguiQL66g-#zAh zV~=AUt5}*4?&=>+`-*5L%mUHF?e_5~L^)o~6ov}_A?R_SFpscd$aHec4{!pu+cF}Dp)<}X8_^HgF%`0 zkAB|W8q(+oam$fP`{t324ey#J-h2e}$!Yr!u>sGa@cF8Mvj2UAKn5G{?sWlGQXzGZ zHu}USgJJ6#2##j-kGd8oAx{~kdy>p2)R{K~q6xaEus8eYLGR2-u}aul(NxApN<;wX zaSTScWIkCpC~QrMIgZs@b=TdvF8uDFp4zfB(n+gNB9K*nfE@ zG|osBl*xm-fYR2Z*;}JMm?#1xmG1ul3|vjJG0(cd7+DO4OM!TJ_a8`zH*=!Yn9=No zMRO$~*BA!1&-~k-tQ z(YoX1XIN$f9P1pnt7e)m8%q78h+Lzf;xcNsL!#jG>UR^ws^!j1Czo z!JwbhUsC6%4j(eA`L|^#s`%MbsxEb;Y|4Nd&g1eQM(j|?I+1&KVw^&GUh|bO?8hMH zMffL!|8PGWCszYWIewPTjo^-Wiro;ys0lHw!*NG>imHkILlz*qXrI0idrEFKyH%D= z-eix04GjIx46ykn3a{$fJ~wX8pr(>Arx2*ke>IuoRs4KrTT0Q-a5n|yDU2oNk?_K> z=4Gp*seK-K>G~T93@FKD3s|%@f@?b2#uYq%FoPofVI^5m#16sxGeng?In8wH(kNpf z5S!v03?K|*UFZ617^Dc2#B?jgRq{ZC;{w)O zjZJtW8a*%8a>=}K;SE0$mRC!*Zyb@O_`gBDJ%Tyr14%oRPpm3I^g8=( zVc#c4`Y9INTFxHY&mG|lH4_9)ebzbTUnqO*%$y|`BVd*vJ>1U)>Zx-~&yuA`jE##% z<<6Y<_1UcP-%$z<>9fr(_wnjRW#p(NV&*^1hPwHCK5VUq#AML~6)6e7-*#h-0_hSJ zD5Cbq93L7U_s<<5DEhl5Gcl9M%{eSH?QuO#SHEc%`0==VF=TTOca&CoLg*$8_!&;Y z93DpwqU>6eEyv+YbWALL?0Ctu@v+W4&ToObzm7b9^1a;JHkrz(1P)G6?r-P0ig@^2 z=G*Golc#F^{B8Jlzk|0W7E)!)wOt3~dzXL3^e!wJI06qM-j7$LdhY>wGUSWx(pQDjXtB>ZdLZG(*?w=w(_jJWiC271aPHk0%TZ24~Mk(K{fQbuR(Mti)7>+Z1p})d2;Delv6xH!JyqPb(+XNmYd@H6(JLBD{)!e1L-#k zEhby-Twq7Rv2A_G8##x#c$ln1yOL+hYNp;WM{{H${lV_?l=xwGHA6KFd%@n28-UBk zsx8uiqz4fx%e|%Ml0Hsf?A-0XEzSG&PCc|M<{Hk>4XNy+rj?tl)Du{d>ZM{CRo)IZ zDQc;gRV*e5%YJMUlJfqu@328yI+cDrPRDiB`q{)ShvH>5=^n>mb93+qSy8Lv!syw! zr`_Bhmvw#lge8~mm{$(Z2VWf{az`BWHA^n+iSw)4N#ZzSbOWdU*5aY*h=AIz_CbU=o52}j;8kMtp`QahH9g=c5d|;qh`@@@o>tO*ZCC2qQ3AtKxW5=FU=)k2 z?fMwP+-tm&82gjnVrS#<_{sDt!UW4NTP_FMG%#odzN_Plub0wqzDv&?nFwp|c_>^h z;Ix#XsED+MwQ-Dk?0zRoyoHxz6+(7HQj3nBWKbfk^Od64d}rsl$lVAj%f3ona-SPp zxr;Ylx?w>-Qx?`_ZxLT-2dRLE))4|2MQAIBO1UD5=7g9U$l^*_2{dTEyZ7B_nw^bT zvXj=T)zk7UtaRO%k&e*fDzudQBCn-)YHjo6aj+}IX<>clDrf2rJNgE8Aa2(sfj_D; zAz~1(uZFFQvs-ZBZjSNSVQ|27>_J%w?1T8DzH7|rM3tx8OMR^amzjamJIcz^we&uC zh*VA|DGJbwpUYCE+q{T_g_R{^&@^%+`N#Jx6@+cbwt%@+l33Nm#^ie2P3IQbM%OAU z7oDyI1OtG)eT0Cx*Sbz!wT~|#Uu)w?@9g1kswOQ6GoBxTVZ``iFAw=EBs8*m-XPwa zHjhe&94pBnJpd2l1I9QSB8p7ygO7eCxsP&rI;W4P4TH{WqD8K-aj5=zpYsi8j8jQMnQ4Q|&c*L!juT-PtXqMxI& z71w0MO#{$8Lmw%`e6TZ2N6K9fWr4JgcL$LKhIVf^hgEgTZGGJmi1Lj$alO0H*t_1C z;L_gCjXA-7G`E!Vp_AMUNd?>Qx_mp3!JB zY!vG2)6;Y}di<8#{8Cq_Xk&?8!Q50GR`%f-wArM{?)k<`dffgBA)vjd10jY0Dnb$Z zvoG)lSZOP}5!J2Lac3k=lGe@+ag9&dXr2wW*-g!Eo5OMaS{(|pp_@uxOIFHwhjhB{ zN^`-r*skrrj&j=WMPB_TWqSoDdGKfib<`&drs zK(D5w7wsv#O+5pg_7ZK)`Ahfj{2u`q8_R*W*GE46``>mrB1+ysXZ;|nWpD5=w$j6F zV=(=aY?Bp1H?L0af42(={desGOYF+KyoR>RT;9JOek?a_OghzL zl7z)X?Nd(S=m?c3gq@RO6kyDX<;j~Y|B`=?g{6K=z-e{M&&~==HG zH+}a?WzA`bq)$5~Pzk# zd0YFx2r0tSRM$gjJ-6DOG-uhRC43TMs6~ib%uwB3145c8b{q{v~E)mzyJ4o z)A#$__|cNhDHBqk&VIa91t@{3&;%nGO+l75B%O(S zu)Zzgt&&zouMf0!OP*+b&w=5%Fupcms@^Lt6Am}Buym@MnPdIWX0g?SugH7871rfr ziD353-K1rwO>IUn<<#nRjeI6ED_+e$rBfLF9sP!VNuV!5mNQ2yA%r2~(P?j+t|dA& zPf#85Ns6gQqw`=6w>83Oz|{IMIyMO#O$Fmp@>%|-O{mrD1I-0w;3eUNRLqGvoMCPILVy280GsVWGkmBV8z%raJh$v>A}s$)%iSpOZV6y?60+y**#UECDn$KGf;9VeYGd9>`6#u|GBCD*`B9WC=+wYe z@ZRYB86@^j@k>i)a4tpE?{c{%Btjhq`adyS*)tC;SD7{}i{nn#X9O3g~soQ44Vj?7Ifp4Vi zL;2{YS7-1ou@UAJ%QW2YM31Xd%Y>P-wX`F99Ku3z^jf*`>4CRS36ghMe+EG@`h5R@ znsSu#P*O~x@)4hck7@aV+>`S9cRsb42B*HXBHYWL(8=SUhcxddev}&QhzUu4sNfj* zojdD9Oey-XX{uGF>70__33RDT&p%DQvsS3-PrZXRnpuo``9kEU1pP;mAsSu2SUpEo zX(N6CpuVj12F-)bqdCh&(#9}n5^>FKE+Fee;YH|=`qtu(b@+xdM$T-@HvKf3b|RJk~d z7*;pafWedPr~1QX7-03F%zta|JmZ?m+O^M&3gZZ3rwNECI4VRyKnM^ODN0iikgf#j z0qHeFMM0&DN(~?&MVj|pud%ySzcUJb= zS$nPPzOMgWZtlHUxyZ&v@#P~fRY%kzE~iC5s>V)|U$!>nuOaeDqdYmIE{0LfOVdUi z48upK&hGzyT{|Fzlm7ZL)1hxH-J??k_h8vAIMw(KcZENM8AeAwEdw$i5V=YIz)2HQ zMO2Vn>F2Oj_pe%;r}`h_-6I$1%mu<%{?n60u?ajIS`?ypjI& z{#^6;@{5BEM+ztsLFrP?{!gUvC)OE zCv#&kjK3#(dGgC?2gL&HWS^6Vm6-ZyswmjI06pH5;Yd>Pt2=KogP=}PGtWqa?{w7> zxQJeaTdhpVZ>+{wr%aGMJ(hsf&*aVXzpd3nF8vYzmDt(H!hL?s?YY(-YIEjQSZq%~ z#9=pUcfH-8n^;C*a3AoA*;=^XBeSnVxN;Va@M3JNXelmNqT`8)=>1X9?2 z(>}zHx^t6ikW2{_%|*p^0Yf)Jhm4zfO&#xj)`8jnDErB~_(zu4lI>Nv*bzA0b}?_R zJ_M3+d;)dv$iFXXyMe{Zjo5)MnWa&8niqazx~j|g(23$$?+plQf9$IJul|JCgP8SL zoRnBZ8~3q41?Z<)*_u4QDKN5po+)ZVa#sMiIc+$=BV~U(T@!uF@-Rr(Lpdq?CP84< z_G_%-(ZKi4@C1op1mQif3Q_CFS-B2BWaCU1Vn=2khE{?2>vC^-6kJ6DT;;}6 zG}s>qDDri;dl1@xdjnxuUxD&l)@l$O93mHcRQ$89{*M<|hM-F5-VpCBTnQqs!gIx3 zJOw;B_iD!=r-U`*Z&#Z7$yhfbO=d{I{?q=4apVCTH$Z-dfZQD6eP|~}!c|cWynLa$9C;Y*< zqk7%&5(WZB_hl@~zc$Zt8Dfe_sws1?VVG@SvC=w9JwDPR6pBBtzozlsh|vq9X|VML zd>`?K2FO`TDkvoU^`d6SPXG9-yBBk8`;X;R@GA-8VWs`ton1>GNKv`j9F3Cq{oBIjBT8TyAzmahO>gGk#HI7mk3@GU-=>mki1t=qk&>LVfe<4n(~cI1&onU3!$x#c{u0dl z%K+nMZrJaB|32x>{BqhBM31>!+(wYZ<*d_CeRUJP4YzouUFe`*E=C=@Ep4`@E zzaiQO_)L5KH7Kj!E)e3eH+WpaE!k+pEc|EA!Y!b0AgS(LzWVtu*|{mFk0$usXskSB zeZxe2Q*pk3pGH=W+noduCKJ7Rlb{GU&thmX;1gX~P$sn{Qk0llv-MuBKGNcE+fh};xkL;8C^(?=|r<#Hse-@~FZwi zZebp}9=hU~SnK$VAu;~tDk$J0yV=Y+bP&w!TgZ^*4z-eUHf-itz2OaJRJ@Aot-i{z znaj4zh`&tHfG^N7_3-7b*9aMT>REgRGeLTBU1H0D8w(z?&*pplF^@0XEh`ZTzB(o| z^F0hkV5XQqzZws@sgqM?8Y)IMjEKP!io;6U_g!DzXDF;W%S+k(IXQQT^t#q@QZhzu z3!D{SbynmxFRWKC$Cdl%^%Rg}{KTZ&IY@LG$q!co{ac*kkMAE7R-2d?E4Fz~X9yfK zr#!}ZCVy6GIK8Q;|JIA8X1J?V^vKVDoEyPugo%j^UJj?)xhZy)?wQa#T!M_Ryx$*& zGSQ^bcb8E0dmn+odI>H7FSMQfkQ8Bjx7%aA&}z9*-_CpMBI6_j5EgU)QXc6WDzsua zqL2T66X;%4Z*6hq62&c$T__dBk0~a!a8gt;ehuEP=^Z0JcT$+m{F-bZ5#v7m`nK@6 z_$I?+XlIw@kGRm?nsNaUGwui<1oM-`4W7zFth8}ZB#S@KMX~J5_%Zha{t(>Ox@I4& zJ6*5OR2wp&_s*6)L+HJYP&KLY?0V@WFPqkcj{vL`Cx0-*mo|gcI4RCx9oTpg8sS^( zMSnuI#g2}AkoEp<{fRQ$limkB?U7vjm>$>v3Z6?Dz>36`+v;|P2f7j`n^P@?M{zrSGsT;VoIA?)Y=zFVb4>VpUCgf!!AN0agWhp$ZF{4c-g z4yuWm(T!Nz`~2{0iGSlm4DAI2VP!@=;mYgltwe39b-pRp0WUb$O%N8D=Oiz0l*%ZD5CVZr7&r|6R-f-?R-L2C$0!Gf(oN z>(=|NeSM920ZN0h2X{Kj)ad}cKz&*IeVv`*u`w}sq#cHD18D603x<3H+(F^J3^=du zG}!aaO@zVvmFeKe-fYTbE&Ojh$-utE2U1(Qj@4wnf_+SjXa4R<1~#c!z@JszVFGN} zYyPOY-ruOetMD(#Cb^G-3454uYMo<=SDda_(`h?D_RHWH^G;}7`UX>{>8>&V(DAv8)K z5zsPZJ2=K~^x>U|(TU!V@S6$GujAHlWwB%&we2gg>iZsIA)&NhS{UYHyZv@{2GdNy z{L)vhS}vB8Kz%+Nr($5}AMg24_cG6emTsJ8Z+;7!as5D<zd@Sms!vQ*EyjH@mZseXqFuQ) zThnpFVYBOcohv~m|>FJoy1hA)4o8$b`2k-0d3r?C6o(WvPBhd)K$D?%mAIH|KQ zb=51rWxek@ZX5SxIU>@$>)zWB#puD*XOPXRBF)gopT~0_SVNSgxu*k>_HrvNKNEsy zm-ms(4Wh)^t6h!%0}Sl7Onvr*#Vby;k&0uJIz_0OD=Zs)m61K?(U%WB6ecYt47RdH z$MrX_+*6I0WL^BwE`6*(a&V7F5!AQJ=;VCC0(0$`$Gdz{9$zm?+K^d7WF^J95q2z3 z%-@WdbcV%YJ~fps>Y?j6Vof#7?e)!ro6h$`d(J2u>z9a}5l+w1){1|}+f;otO5s}U z>eBw4g}q7mLszy2cMj~l4?z!^$!QwECfrr4tV$C;ZO1w0HJkaGzo|%Z>UKFqe7n6^ zV!7yqw`nYzH*`~PC~C4O6Qg+DBj3^^`A#=!v~JY%2i}f_YAI1)d}>g)z{VXFto~fM zvs4U?diQ-Rx{sfDy^FUoS@I}KIW0%hoUGDte$GYC!^!8@9n%vk=i(zRM9#p;^wg5Z&+gIACrBE@%B=ev0m?J->Z7v#%C1*f}&{L$+S46JCD{WoH+ z&+e~9huMs;J;G|9sMwVv8^Yzg!DQ1Ke{PZ~i#>k(@mt=E@3rj;;jK@^hoo2(paID6 zR?QnXsk61xqaEF^_t-jrQr9xAJ*xj=kTrEmJDX~noo(i1G#q)e>j_R{ZRY~ef6$g8 zMzS>u(|aE@2#ImpjDAmDXl!ceM5oko4!OL0{q|*k=>(={vqLt#hKWp(%|*(b8M?sdisubx`r&y$iN4 z;@#VxZZBZm)U84bq^#!q_|i4p2XP&>mmjA49aWz432xkXEEN&qn8}lOI7sueliO=!hC6XH@@VYH=v4w* z{KWg3G%s|`em#12QGv|)lcm;Y7N7y5?y;0bEZoT;6D!pu_Jp(F_gF~CSnAaDr63;e z#^f5}x{=dJ(Q1t}pUS7{4l}cU!a7O6};?Cy)nGcdFc5xzognr@!8yUqxk1UdarIQCNg?}tX z|JcipynS9s;YvA6_U5THt%Z{BKb1~eWagK+2)|jlI>TqZ$L%=!ko_6Ina_N~iM=U} zf(|M*9n04Y!{9h}3}(o4#`j6|`$*eQFR3RXFpU=C|ha zXiS03>!PRSzZQwrYaW<7z;%s9BCy}^Kyg zHBt4y(T6wZ)$-7vxuxvR3p=*U+F={{B}N=jZ1rV}s;b+rqTy-$q%JBua%pw3BlI^t z)5aUh_wckU$5998`=Z))PV|hBl8A$0QHjuWVD4w>f3Bq0z{>*5HS#!vGTm#nuu86& z&z3*W5v$T5;W>lBcnbw;~bUE=T(KRaQ+fP;9O1&^L!>8c9u!QJS)ajNIbj7|N;@HXO z4Pw0mn`h4Mq_%6uN?IBi4xQYxF+e_?_?CJcecQz)&QV2HVV|8q+6q8SD2~s$2Q=jW z^3o=+vJCAMf3DrZ%7!ps_uE3`k0 z5-T5#rebMUm(gGM+EsR8AB=2gdpSdHQ9KI*ezt4oHsT7q(ry=)*+>ctEYh9+N+E=o zT#ycXvVNwFS~9H&-+*jGISP{$?5e)Zi}&(nUKkZdw1k*El8d$0dA5|baDg+i4DFuC zaboul;>KEyoF*NrsM4?@rR)$0wVz_aMAGzaMfbPx$NfsoBz=4t*A6@*}Oinnsb4*H1v9S9o+DbmB*Uf(bc%<-Hyw{&Cxk}uZ(K>Ngoz&IF1+oNT(Se76I}Fq_}0oH=boldr2CLv=k@KF5}kfq zL(v$k!kqaw!@1t5o#3Iy=;eyuiMWQs`GQ8_22tYeQVqS6&GRQA1x22|>d?h?E4+jJ z$WQ-SIIQ!fpo4PPaVd%0}%Zv3*N+^;y36T)ftFH*?I?l`i=and-C=P<+9q>g1* zzByAOVQPBO$~0%9GDuR7+lO^QO650Ng?j@7B-^?k=dNnBwq`L`(Av8bY}sq4v$FC9 z;kd*mTfvqVk7Rv?k6*tw4qY2y?5EKWOqtCrmRefTzRi%ZC11))<6MsxtS@Y$3B8kC zxn9EUb;IgfGdeyga#GVW=L@Bshj70m%DsN}9Ivr(P%_=*!(iK&Zg2|S#rv)*0goDS zb*hz7@ZEOwD%3pZC^+ZkPa=psDLFmeSnbj~eH6APt%Z~12&!uW%aB4L2`}V-5h}vhpgKz&{1RWkN70x zsM6FbQ|AIU>HE2T#YQ3{BmZ(1fx0hrg31u%q;eom+Ogj(l`V!*B>3cY7?e|zF zqwB^WaZmofa;FL9&iGPAhVu6K!`Bp*Fp$Wcn3&jB5&tQPdW@TKP?S=(jO-_Z>m8rleLvg1%5a|z$V3%xLsu0NijKfiHOQN!AP z;IO1zzT%Gz?}a3fvfW_LjE;m(Rv&qfT_1W#8k(H9UY)jt>`bR&R}L4wAdh{0;O0t9 z0vOqfg!(sO2to<~K4iK3I^Ue1P%G`NFZW>-?b+so&d~uZD^1K^gLf+s=QdY>Lw%FF zZcB*C>+P*EKz#REap|&a;{0Fa&<<8P-9=U{hWzL))7Nd~!_sSHBpj*R3(e*yq)IKt zG;^&UC|&yKL#Jr+c!+J6Z&wQ=zpgzqt-250M?6^KWqa9_#+Yd(iib zl6?X$)igJUHCD4%9*Al@)ZfLreew&wXBE7^2C)6`blAq1@KBID>zN=>{gIKUX4KI{ zWIdMR=Xf~xGeQ=$$uCvv3IIDA;t=1tM!2AABxDQNtD`UY(D*#s)|86jh63(T8~j;q zUIINv& zz=2iD6ZlcoyK={)PsAVM{qGt$`o685^AKG0vtDE64&epy%5oJ@^#id<@}MyVAEK* z3#yEr6NCe*MwaQZC^?m-exAA+oe;rHNvfj;*FdpR}6-mY|)$qrxw$u9)`Zn^Du?jotC@zmbmFTMB8-!{f z4@Pza3|?IPwOuDr*2zYC0n!MauSVTebr%*Kq7 z{x5_}9`XE>aEZPyD{X=&adwsNeThSzeZRk%{6C}RTGxQ$s36?Gmc;fy56t~|9>6er z53B+ZfGR*nH==eD=REJDwB|WMQC60V|3XNF&0VW#DMQNvJz7ye& ztWrj7HH(u6tgF7xR_CyLgl6zYrr4e~lfnOqx=xTyW zx((5DN~%EB8^JpymRxef&SE8-_?zS|MK`Ldmg6g>P^?(~O@9zjO|cooZr=kbB0H8K z+eNVJ-HF#!ZhRx%4{?elOfX{(U!SsnusokJ!c0hQCA?oPnd73=90y^A3{tm63`~CCUE4W-5e+d$k+9`yNY0~1GqbjHF1P{<9+SjtZE(>+95R`4==%wEM z=Y1%pH!ntz^M2OG7Ut1O*=(a2&MQ+3?)Efn#&FPfF16qxOdBKSWZxL%_x^Tr_W8_HVkVfAXDf|TQcAY^1=FwdPgWLq%%tBliUN0;`F;r5`8Hh z*E=V<%BUX~JC&5=RISLq`rZa{aT+foW%4Vm$!EoXh)N9YPSk_ZP2MEbIRzJi4@xy@ zO`$s3LkXl0RlOu0-^!7i750XMsq$;CKxOaDtpS*~UGlLdTg`9`$5H;*UK-QI<;dzn_?qRp+UelHSVOyLwM^=CP$(&6Ws^*2#9$1Z%*OQB{C-dVwWApp$=Dl3ul&|`xBk6@sk~H<^eq3ch6cagy6bz&xnL90{kp%)t~rT zEm3CIN>`|QEMeLLUp{t7B)BUISn=$zdeShC>NGG@t7V!XKqLxpOVq>k<5x!Jd*g)z z4B8xQKjt_$?42*_?er0|=MqGW&miD+AL1XjxET)TeyQN~CyjayJdF2y4i9X7h!&pZ7C+h;eJm8CL5&mHzy37X8u$^?l4G=gkJBM75Y8@J} zM?obp`77k5S1hfY0fg7^8KtcP<X}B_ ztVdB_ge(95XVbqC=7ft3w$Z2&yD*Y;c{GOi-b~zoP zx*ZqkIJ4-Kzu}>xE4~?psmW8Q^3+KeDXNWH92}1I(rUBm$l!>Zh@Ts-b<8v|O}K3K zzSaXGRTtk#u6K*ugwYIud&oh5Gda}-yy3GVur?sHXdhRJ&;R1l(c=qj8Wxt@>~jOy z=BJ|ZYmX!+Bo{+@DAN$ctpor#MR>Z%@-X35lPpik4QNF0?Zh>wb+sU(w2h~ z^$AZKhHtqny_%Ob@40B>-gf&W)iY$FaH*)##wqTMy8*Q#K2nHTUSiRJXP6rLYh!&& z&sh!878O@18^xMO*fD9#RD{jic}uSvk7dMEupbZZxOHRI(%8;4Vbq~z3=*6#%{_4# ztu47KgBTE$1*I<|^ENnqAqwF95A6OKzF$lb4k4#4+I&CgXRuJ23QM$_hK9bM5XNtLA4u5P(5NUyOKjR0eqNS73~I#AfrzY+JZhnzSVDrfD^rbBU57qMU!YW650@FB?i( zwBz7ig`On0)Z-1xDfa?2UsNm&c^ojtucs%m=JhSzQ>VxC;@~NZ>3xu>DG5vYj)~IRP!c))k#WU^ z-3*MydcSwVEpS1+$8t!yWWkbc9CSIE*qF`f6w`@bcP`E}(fl)0GMx)rxi&>!F^F5_ zjJQdNkS06%VM4Zo!k)hY%-N{WwQA*RY^I-vWh?26Wja z#>DWKACcT(_2W5{Rwjb|$g;E!dC*+B90X!19Q`g7Mg56wa`ZIsX7UmbMf03gMSI+K zN2?gQZ-Cxd#%e8Lj1gcV)Po;+BA8X(ksO|X5*>1(7z^6S(|3^G-0 zu$M-rR(1o6$} zZ@3KZzaN0etbVGi)}hyymIGIxG5kV7U1P0yCqCcT)dEB__GwoGFaJ<LYfd9?#i;?j2M<${N~_-OneL6dZ?g4(pZhAT6o{-cSl_y}w+m*pQ~rR7C)ExYg^*uI6Tv|Zs zf=FLyov5T-g(>fq<%FXt$Nf>WxJA&`<=wklQt*kCTKWctZ@$X>I|=y)`55R5{B35b zxrAC3UIr{6*(l;YY<)@uUE;~tbuH)`FjZODd-sn)#K2Jgi)`Tk|Y)DWNqi{35y!mRlq8YsWSMz?|_4Zhawxu1b9g)s<>) z-)Fk+Z}p^WWdR;3qpu6d^Js739WlK2_b$jfPrfjOii7T2N=Lu}c`K{7NSuL2Sgt$h z26Pz<-HUSF?_x6hK#LnSzD6-hq9aKfxnatXSVEUhE&z$8gaMb;2N-W_F>70by%ti` zn~f_@-wwsL+Xbj+j9%{ed_7wLg8vA*@1&9Dq;DC4zFm$4g<=nqDOGF#d*%+6Rly_3 zJ%SANb!yuOoT6Gaabee)kc(YBt4orZ(^^ zz|O9aixW(+pj`rJmbR#ZO$(sRfbLlb#7Lz)QO3tkZjA@P7eX#=Hue7{%d@MOoyk*u zqv8hOGuJzPlfmAVnf|<%@G)vzFGCV(SESG8HMlj$aOT_ECV)0S?yLVu8eZ+^?~Sh; z#L#O67~mp{2JZufeg`{F-i8bM+kT?Ahh|F2Jw8!hH^{H>-4B~b+)eo$ZVhYwBjw{< zrKEbMfwtRe%%v-+>0WycEGxv1ejjFd>W^H)JOtY!W)Rx`cY-a`)qOG&9!ls6r{=D7 zY0TXXKG-d15XjI4wG5`aFLb0KnRN1og_K>GR4a{er&o>&k_j32a^au2*Og!)`4Y@RE)q)RX5b z*Y5a1m5<iY}kE{bLg+iFi#;EGJ6t|9g*{Id(cHP5?!L5=(4^oI8NhYV&!ecEb zXb-rxz;wiv@rwvZ)Epz*LX{k2Zu!kS1o*i&m zGT+V$ocm~k@x3~P>UvC-?9$T3fabW~`Y8LK?q`CQtxOq*Rt5D06dmUwB(1aMKQSe} z+MUM$xgZFsJc_u$%ZqBPbO9A7-CgwJf6D*)_F5*LpFT0Q_vUcvXGS6Erjq83-0SzB F{vW)!U_}4` diff --git a/doc/images/examples_get_token.png b/doc/images/examples_get_token.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa6d1a29d23a6afc1a0031e9915cecaf39729a6 GIT binary patch literal 15114 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 literal 0 HcmV?d00001 diff --git a/doc/images/usage_overview_subscribe.png b/doc/images/examples_subscribe_CPU_utilisation.png similarity index 100% rename from doc/images/usage_overview_subscribe.png rename to doc/images/examples_subscribe_CPU_utilisation.png diff --git a/examples/Data Layer - Read.json b/examples/Data Layer - Read.json deleted file mode 100644 index f4f7f2a..0000000 --- a/examples/Data Layer - Read.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"7556aaba.093884","type":"comment","z":"a038e8.15d92718","name":"Example: Read the current CPU utilisation from the Data Layer and print to debug log.","info":"","x":350,"y":80,"wires":[]},{"id":"13ec33b6.ccb24c","type":"debug","z":"a038e8.15d92718","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":770,"y":140,"wires":[]},{"id":"bdef71b6.edc85","type":"ctrlx-datalayer-request","z":"a038e8.15d92718","device":"ec1807ac.c7c0e8","method":"READ","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":450,"y":140,"wires":[["13ec33b6.ccb24c"]]},{"id":"eebf3e17.8e4e9","type":"inject","z":"a038e8.15d92718","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":140,"wires":[["bdef71b6.edc85"]]},{"id":"ec1807ac.c7c0e8","type":"ctrlx-config","z":"","name":"[fe80::260:34ff:fe08:322]","hostname":"[fe80::260:34ff:fe08:322]","debug":true}] diff --git a/examples/Data Layer - Subscribe.json b/examples/Data Layer - Subscribe.json deleted file mode 100644 index e9dc04b..0000000 --- a/examples/Data Layer - Subscribe.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"7556aaba.093884","type":"comment","z":"56e20b5d.c407ec","name":"Example: Subscribe to value changes of CPU utilisation from the Data Layer and print to debug log.","info":"","x":380,"y":140,"wires":[]},{"id":"13ec33b6.ccb24c","type":"debug","z":"56e20b5d.c407ec","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":200,"wires":[]},{"id":"98fb7d3a.35add8","type":"ctrlx-datalayer-subscribe","z":"56e20b5d.c407ec","subscription":"1cea561a.e83812","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":300,"y":200,"wires":[["13ec33b6.ccb24c"]]},{"id":"1cea561a.e83812","type":"ctrlx-config-subscription","device":"73d682cf.7acb8c","name":"subscription1","publishIntervalMs":""},{"id":"73d682cf.7acb8c","type":"ctrlx-config","name":"","hostname":"[fe80::260:34ff:fe08:db2]","debug":true}] \ No newline at end of file diff --git a/examples/Diagnosis - Confirm all pending errors.json b/examples/Diagnosis - Confirm all pending errors.json new file mode 100644 index 0000000..c9e8160 --- /dev/null +++ b/examples/Diagnosis - Confirm all pending errors.json @@ -0,0 +1 @@ +[{"id":"b5effce.db9fd","type":"comment","z":"b7f42922c8391768","name":"Example: Confirm all diagnosis in the logbook","info":"","x":430,"y":720,"wires":[]},{"id":"477443cd.9b7bd4","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":930,"y":780,"wires":[]},{"id":"64d6212b.ba6cd","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"WRITE","path":"diagnosis/confirm/error","payloadFormat":"value_type","name":"","x":710,"y":780,"wires":[["477443cd.9b7bd4"]]},{"id":"226bf82.26e5e88","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":780,"wires":[["d4a0a352.ae8488"]]},{"id":"d4a0a352.ae8488","type":"function","z":"b7f42922c8391768","name":"","func":"msg.payload = null;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":500,"y":780,"wires":[["64d6212b.ba6cd"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/General - Error handling.json b/examples/General - Error handling.json deleted file mode 100644 index 44e7839..0000000 --- a/examples/General - Error handling.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"3984d15c.b6a4be","type":"comment","z":"a038e8.15d92718","name":"Example: Use a catch node to handle errors.","info":"","x":210,"y":260,"wires":[]},{"id":"adcdeb72.352b88","type":"debug","z":"a038e8.15d92718","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":670,"y":320,"wires":[]},{"id":"bf808c7e.2b56a","type":"ctrlx-datalayer-request","z":"a038e8.15d92718","device":"ec1807ac.c7c0e8","method":"READ","path":"invalid/path/value/to/force/error","name":"","x":390,"y":320,"wires":[["adcdeb72.352b88"]]},{"id":"eda269ff.f06d88","type":"inject","z":"a038e8.15d92718","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":320,"wires":[["bf808c7e.2b56a"]]},{"id":"b55ac3d1.719b1","type":"catch","z":"a038e8.15d92718","name":"","scope":["bf808c7e.2b56a"],"uncaught":false,"x":200,"y":400,"wires":[["e91439fb.0fa298"]]},{"id":"e91439fb.0fa298","type":"debug","z":"a038e8.15d92718","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":430,"y":400,"wires":[]},{"id":"ec1807ac.c7c0e8","type":"ctrlx-config","z":"","name":"[fe80::260:34ff:fe08:322]","hostname":"[fe80::260:34ff:fe08:322]","debug":true}] diff --git a/examples/General - Get web token from authentification server.json b/examples/General - Get web token from authentification server.json new file mode 100644 index 0000000..8fe1b7a --- /dev/null +++ b/examples/General - Get web token from authentification server.json @@ -0,0 +1 @@ +[{"id":"af22af4db424ebc6","type":"function","z":"b7f42922c8391768","name":"make header","func":"var newMsg = {};\nnewMsg.header = {};\nnewMsg.header[\"Content-Type\"] = \"application/json\"\nnewMsg.payload =\n { name: \"boschrexroth\", password: \"boschrexroth\" }\nnewMsg.url = \"https://localhost/identity-manager/api/v2/auth/token\";\nreturn newMsg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":330,"y":140,"wires":[["0a76057a199ca617"]]},{"id":"0a76057a199ca617","type":"http request","z":"b7f42922c8391768","name":"Get token","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":500,"y":140,"wires":[["ee4def3e07376b8d"]]},{"id":"ee4def3e07376b8d","type":"debug","z":"b7f42922c8391768","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":660,"y":140,"wires":[]},{"id":"c485adb93723e929","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":160,"y":140,"wires":[["af22af4db424ebc6"]]},{"id":"056e75fc0e45614d","type":"comment","z":"b7f42922c8391768","name":"Get web token from authentication server","info":"","x":240,"y":80,"wires":[]}] \ No newline at end of file diff --git a/examples/General - Monitor CPU utilisation in line chart.json b/examples/General - Monitor CPU utilisation in line chart.json new file mode 100644 index 0000000..684d6c3 --- /dev/null +++ b/examples/General - Monitor CPU utilisation in line chart.json @@ -0,0 +1 @@ +[{"id":"beb3ea051cd65ac2","type":"ctrlx-datalayer-subscribe","z":"b7f42922c8391768","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":440,"y":480,"wires":[["be8fc64ed0c8ea73"]]},{"id":"dc3e7b2.6ab9388","type":"comment","z":"b7f42922c8391768","name":"Example: Monitor CPU utilisation in line chart","info":"","x":430,"y":440,"wires":[]},{"id":"be8fc64ed0c8ea73","type":"ui_chart","z":"b7f42922c8391768","name":"","group":"a4ba432c81cdab8a","order":0,"width":"0","height":"0","label":"CPU utilisation","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"10","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#3eb31e","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":760,"y":480,"wires":[[]]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"a4ba432c81cdab8a","type":"ui_group","name":"General","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false}] \ No newline at end of file diff --git a/examples/General - Monitor CPU utilisation.json b/examples/General - Monitor CPU utilisation.json deleted file mode 100644 index daf1515..0000000 --- a/examples/General - Monitor CPU utilisation.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"fc358c7bab410d9d","type":"ui_chart","z":"5480b2f5a22f3525","name":"","group":"a4ba432c81cdab8a","order":0,"width":"0","height":"0","label":"CPU utilisation","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#3eb31e","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":760,"y":560,"wires":[[]]},{"id":"beb3ea051cd65ac2","type":"ctrlx-datalayer-subscribe","z":"5480b2f5a22f3525","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":300,"y":560,"wires":[["f283f038cc73dafc"]]},{"id":"f283f038cc73dafc","type":"function","z":"5480b2f5a22f3525","name":"","func":"let value10 = context.get(\"value10\")\nlet value9 = context.get(\"value9\")\nlet value8 = context.get(\"value8\")\nlet value7 = context.get(\"value7\")\nlet value6 = context.get(\"value6\")\nlet value5 = context.get(\"value5\")\nlet value4 = context.get(\"value4\")\nlet value3 = context.get(\"value3\")\nlet value2 = context.get(\"value2\")\nlet value1 = context.get(\"value1\")\n\ncontext.set(\"value1\", value2)\ncontext.set(\"value2\", value3)\ncontext.set(\"value3\", value4)\ncontext.set(\"value4\", value5)\ncontext.set(\"value5\", value6)\ncontext.set(\"value6\", value7)\ncontext.set(\"value7\", value8)\ncontext.set(\"value8\", value9)\ncontext.set(\"value9\", value10)\ncontext.set(\"value10\", msg.payload)\n\nlet time10 = context.get(\"time10\")\nlet time9 = context.get(\"time9\")\nlet time8 = context.get(\"time8\")\nlet time7 = context.get(\"time7\")\nlet time6 = context.get(\"time6\")\nlet time5 = context.get(\"time5\")\nlet time4 = context.get(\"time4\")\nlet time3 = context.get(\"time3\")\nlet time2 = context.get(\"time2\")\nlet time1 = context.get(\"time1\")\n\ncontext.set(\"time1\", time2)\ncontext.set(\"time2\", time3)\ncontext.set(\"time3\", time4)\ncontext.set(\"time4\", time5)\ncontext.set(\"time5\", time6)\ncontext.set(\"time6\", time7)\ncontext.set(\"time7\", time8)\ncontext.set(\"time8\", time9)\ncontext.set(\"time9\", time10)\ncontext.set(\"time10\", msg.timestamp)\n\nvar chart = [{\n \"series\": [\"CPU\"],\n \"data\": [[{ \"x\": time1, \"y\": value1 },\n { \"x\": time2, \"y\": value2 },\n { \"x\": time3, \"y\": value3 },\n { \"x\": time4, \"y\": value4 },\n { \"x\": time5, \"y\": value5 },\n { \"x\": time6, \"y\": value6 },\n { \"x\": time7, \"y\": value7 },\n { \"x\": time8, \"y\": value8 },\n { \"x\": time9, \"y\": value9 },\n { \"x\": msg.timestamp, \"y\": msg.payload}]],\n \"labels\": [\"mylabeltest\"]\n}];\nmsg.payload = chart;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":560,"wires":[["fc358c7bab410d9d"]]},{"id":"dc3e7b2.6ab9388","type":"comment","z":"5480b2f5a22f3525","name":"Example: Monitor CPU utilisation in line chart","info":"","x":290,"y":500,"wires":[]},{"id":"a4ba432c81cdab8a","type":"ui_group","name":"General","tab":"9cba2148.8c9148","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"9cba2148.8c9148","type":"ui_tab","name":"Examples","icon":"dashboard","order":7,"disabled":false,"hidden":false},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/General - Read the current CPU utilisation on request.json b/examples/General - Read the current CPU utilisation on request.json new file mode 100644 index 0000000..e98bb4b --- /dev/null +++ b/examples/General - Read the current CPU utilisation on request.json @@ -0,0 +1 @@ +[{"id":"765680d3.1c7788","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"framework/metrics/system/cpu-utilisation-percent","payloadFormat":"value","name":"","x":690,"y":280,"wires":[["9195cd7c.d74f3"]]},{"id":"a1661333.e8b348","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":280,"wires":[["765680d3.1c7788"]]},{"id":"9195cd7c.d74f3","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1010,"y":280,"wires":[]},{"id":"84d1b245.874028","type":"comment","z":"b7f42922c8391768","name":"Example: Read the current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":590,"y":220,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/General - Set properties via code.json b/examples/General - Set properties via code.json deleted file mode 100644 index bf6a0e3..0000000 --- a/examples/General - Set properties via code.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"7d8c9ee.2e8246","type":"comment","z":"a038e8.15d92718","name":"Example: Use the msg object to set the properties programmatically via function node..","info":"","x":340,"y":480,"wires":[]},{"id":"c558ee94.94a69","type":"debug","z":"a038e8.15d92718","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":770,"y":540,"wires":[]},{"id":"b21cb94.37f9648","type":"ctrlx-datalayer-request","z":"a038e8.15d92718","device":"ec1807ac.c7c0e8","method":"msg","path":"","name":"","x":530,"y":540,"wires":[["c558ee94.94a69"]]},{"id":"6a8a874a.7d0058","type":"inject","z":"a038e8.15d92718","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":140,"y":540,"wires":[["19b7a2d1.6a030d"]]},{"id":"19b7a2d1.6a030d","type":"function","z":"a038e8.15d92718","name":"set properties","func":"msg.method = 'READ';\nmsg.path = 'framework/metrics/system/cpu-utilisation-percent';\n\nreturn msg;","outputs":1,"noerr":0,"x":320,"y":540,"wires":[["b21cb94.37f9648"]]},{"id":"ec1807ac.c7c0e8","type":"ctrlx-config","z":"","name":"[fe80::260:34ff:fe08:322]","hostname":"[fe80::260:34ff:fe08:322]","debug":true}] diff --git a/examples/General - Set request properties via msg.json b/examples/General - Set request properties via msg.json new file mode 100644 index 0000000..ffba3a8 --- /dev/null +++ b/examples/General - Set request properties via msg.json @@ -0,0 +1 @@ +[{"id":"7d8c9ee.2e8246","type":"comment","z":"b7f42922c8391768","name":"Example: Use the msg object to set the properties programmatically via function node","info":"","x":570,"y":100,"wires":[]},{"id":"c558ee94.94a69","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1000,"y":160,"wires":[]},{"id":"b21cb94.37f9648","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"msg","path":"","name":"","x":760,"y":160,"wires":[["c558ee94.94a69"]]},{"id":"6a8a874a.7d0058","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":370,"y":160,"wires":[["19b7a2d1.6a030d"]]},{"id":"19b7a2d1.6a030d","type":"function","z":"b7f42922c8391768","name":"set properties","func":"msg.method = 'READ';\nmsg.path = 'framework/metrics/system/cpu-utilisation-percent';\n\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":160,"wires":[["b21cb94.37f9648"]]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/General - Subscribe to the current CPU utilisation.json b/examples/General - Subscribe to the current CPU utilisation.json new file mode 100644 index 0000000..b191792 --- /dev/null +++ b/examples/General - Subscribe to the current CPU utilisation.json @@ -0,0 +1 @@ +[{"id":"872cd634.800108","type":"comment","z":"b7f42922c8391768","name":"Example: Subscribe to current CPU utilisation from the ctrX Data Layer and print to debug log","info":"","x":580,"y":340,"wires":[]},{"id":"d921bdd6.1d0b9","type":"ctrlx-datalayer-subscribe","z":"b7f42922c8391768","subscription":"632bcc2.eddf134","path":"framework/metrics/system/cpu-utilisation-percent","name":"","x":460,"y":400,"wires":[["ffa838b8.e6db98"]]},{"id":"ffa838b8.e6db98","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":400,"wires":[]},{"id":"632bcc2.eddf134","type":"ctrlx-config-subscription","device":"7b877229.678964","name":"Sub_Default","publishIntervalMs":""},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/General - Use a catch node to handle errors.json b/examples/General - Use a catch node to handle errors.json new file mode 100644 index 0000000..b5ff746 --- /dev/null +++ b/examples/General - Use a catch node to handle errors.json @@ -0,0 +1 @@ +[{"id":"3984d15c.b6a4be","type":"comment","z":"b7f42922c8391768","name":"Example: Use a catch node to handle errors.","info":"","x":430,"y":540,"wires":[]},{"id":"adcdeb72.352b88","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":890,"y":600,"wires":[]},{"id":"bf808c7e.2b56a","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"invalid/path/value/to/force/error","name":"","x":610,"y":600,"wires":[["adcdeb72.352b88"]]},{"id":"eda269ff.f06d88","type":"inject","z":"b7f42922c8391768","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":600,"wires":[["bf808c7e.2b56a"]]},{"id":"b55ac3d1.719b1","type":"catch","z":"b7f42922c8391768","name":"","scope":["bf808c7e.2b56a"],"uncaught":false,"x":420,"y":680,"wires":[["e91439fb.0fa298"]]},{"id":"e91439fb.0fa298","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":650,"y":680,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/PLC - Read variable.json b/examples/PLC - Read variable.json new file mode 100644 index 0000000..bfe5b69 --- /dev/null +++ b/examples/PLC - Read variable.json @@ -0,0 +1 @@ +[{"id":"7467c58b.9bd5ac","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"READ","path":"plc/app/Application/sym/PLC_PRG/i","payloadFormat":"value_type","name":"","x":670,"y":920,"wires":[["8090a7bb.b361"]]},{"id":"8090a7bb.b361","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":950,"y":920,"wires":[]},{"id":"f830ae36.91e878","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":400,"y":920,"wires":[["7467c58b.9bd5ac"]]},{"id":"76611ca.4da74e4","type":"comment","z":"b7f42922c8391768","name":"Example: Read a PLC variable","info":"","x":390,"y":840,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file diff --git a/examples/PLC - Write variable.json b/examples/PLC - Write variable.json new file mode 100644 index 0000000..49c8845 --- /dev/null +++ b/examples/PLC - Write variable.json @@ -0,0 +1 @@ +[{"id":"501f80f3.0e5068","type":"ctrlx-datalayer-request","z":"b7f42922c8391768","device":"7b877229.678964","method":"WRITE","path":"plc/app/Application/sym/PLC_PRG/b","payloadFormat":"value_type","name":"","x":670,"y":1060,"wires":[["37817780.db70c"]]},{"id":"37817780.db70c","type":"debug","z":"b7f42922c8391768","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":950,"y":1060,"wires":[]},{"id":"5d059ae1.63156c","type":"inject","z":"b7f42922c8391768","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"type\":\"bool8\",\"value\":true}","payloadType":"json","x":390,"y":1060,"wires":[["501f80f3.0e5068"]]},{"id":"6466502e.8f8c","type":"comment","z":"b7f42922c8391768","name":"Example: Write a PLC variable (BOOL)","info":"","x":410,"y":980,"wires":[]},{"id":"7b877229.678964","type":"ctrlx-config","name":"localhost","hostname":"localhost","debug":false}] \ No newline at end of file