Skip to content

Add ROC Connection - How To

You can add an Emerson Operations Controller (ROC) connection through the Kelvin UI, Kelvin SDK and Kelvin API.

Connections can be deployed to both x86_64 and ARM64 devices.

To start click on the Connections menu option from the left side bar menu.

click on the Create Connection button.

Step 1

Select Import Data and Control Setpoints and click Next.

Step 2

Select the ROC option, select a Version and click Next.

Step 3

Type in a memorable name in the Connection Display Name text input. You can use any letters, numbers and special characters.

The Connection Name text input will be automatically converted and filled in as you type in the Connection Display Name section. The conversion ensures the Connection Name only contains lowercase alphanumeric characters and ., _ or - characters.

Then select which Cluster to deploy the new Connector to.

It is important that the asset is reachable from the selected Cluster.

Step 4

Configure the ROC connection to the asset. There are a number of optional and mandatory parameters to fill in.

For the optional parameters, if you do not fill in any values, the default values will be used.

Parameter Options Description Default Mandatory
ROC Plus Protocol Boolean (True/False) Indicates whether the ROC Plus protocol is used for communication. False No
Host Unit Numeric value Identifies the unit number of the host in the ROC network. Yes
Host Group Numeric value Specifies the group number the host belongs to in the ROC network. Yes
Dead Poll Boolean (True/False) Enables or disables the detection of non-responsive polls, marking a poll as 'dead' if not answered. False Yes
Optimize Read Requests Boolean (True/False) Enables or disables optimization of read requests to reduce network traffic. False Yes
Optimize Write Requests Boolean (True/False) Enables or disables optimization of write requests to reduce network traffic. False Yes
Number of Socket Connections Numeric value Defines the number of socket connections to be maintained with the ROC device. 1 No
Socket Connections Timeout (In Seconds) Numeric value The maximum duration to wait for a response on a socket connection before timing out. 2 No
Connection Serial, Ethernet Specifies the type of connection used to communicate with the ROC device. Yes
IP String (IP address format) The IP address used for Ethernet communication with the ROC device. Yes
Port Numeric value (port number) The network port number used for Ethernet communication with the ROC device. Yes
Device String value Identifies the specific ROC device for Serial Connections. Yes
Baud Rate Numeric value (in baud) The communication speed for Serial connections, measured in baud (e.g., 9600, 19200). 9600 Yes

Step 5

Select an Asset, Data Stream and fill in the connection and other optional values.

Full descriptions of each column is giving below.

Success

If you have many connection IO to fill in, you can save time with the download/upload csv file option in the top right hand corner of the popup.

Use Microsoft Excel or Google Sheets to fill in all the Connection IO details.

You can only upload one file. Multiple file uploads is not allowed and only the latest selected file will be used.

Option Descriptions

Header Description Example Mandatory
Asset The Kelvin Asset name (must be lowercase alphanumeric with no spaces) well-01 Yes
DataStream The Kelvin Data Stream name (must be lowercase alphanumeric with no spaces) water-flow Yes
Storage Location of the storage; "none", "node", "node-and-cloud" node-and-cloud No
Polling Rate (in seconds) How often to pull the data from the asset 30 Yes
TLP A three-component address system used to identify specific data points (Type, Logical, Parameters) in the ROC800’s database Yes
Protocol Type Supports various protocols including ROC Plus protocol and Modbus master and slave protocol Yes
Device Series Specific series or version of the ROC800 controller Yes
ROC Unit Identifier for the specific ROC800 unit in use Yes
ROC Group Defines the group setting or configuration within the ROC network Yes
Operator ID User identifier for system access and operations Yes
Password Security feature for accessing and operating the ROC800 system Yes
Access Level Defines the level of access or permissions granted to a user or operator ID Yes
Writable Read/Write (RW) or Read Only (RO) RO Yes

Complete the Connection

When everything is validated, then you can click on Connect button to deploy the Connection to the Cluster. It will start automatically, connect to the asset and start collecting data.

API cURL Example
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
curl -X "POST" \
  'https://<url.kelvin.ai>/api/v4/apps/workloads/create?stopped=false' \
  -H "Authorization: Bearer <Your Current Token>" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "docs-roc-connection",
  "title": "Docs ROC Connection",
  "app_name": "kelvin-bridge-roc-client",
  "app_version": "3.0.2",
  "cluster_name": "sales-01-cluster",
  "runtime": {
    "datastreams": [
      {
        "name": "casing_pressure",
        "title": "Casing Pressure",
        "data_type_name": "number",
        "unit_name": "pound_per_square_inch"
      }
    ],
    "resources": [
      {
        "resource": "krn:asset:doc-motor-01",
        "datastreams": {
          "casing_pressure": {
            "way": "output",
            "storage": "node-and-cloud",
            "remote": false,
            "configuration": {
              "access_level": 5,
              "device_series": "floboss407",
              "polling_rate": 30,
              "protocol_type": "FLOAT",
              "tlp": "0"
            }
          }
        },
        "properties": {
          "casing_depth": 14076,
          "county": "Reeves",
          "field": "Permian",
          "latitude": 31.984,
          "longitude": -102.744,
          "motor_configuration": "7:9",
          "plc_manufacturer": "Schneider",
          "vsd_type": "GE",
          "well_depth": 14927,
          "well_run": 3
        }
      }
    ],
    "configuration": {
      "connection": {
        "ethernet": {
          "ip": "10.5.0.1",
          "port": 5122
        },
        "type": "ethernet"
      },
      "dead_poll_enabled": false,
      "host_group": 24,
      "host_unit": 32,
      "optimize_read_requests": false,
      "optimize_write_requests": false,
      "roc_plus_protocol": false,
      "socket_poll": 1,
      "socket_timeout": 2
    }
  },
  "system": {
    "privileged": false,
    "environment_vars": [
      {
        "name": "KELVIN_ACP_NAME",
        "value": "sales-01-cluster"
      },
      {
        "name": "KELVIN_CLUSTER_NAME",
        "value": "sales-01-cluster"
      },
      {
        "name": "KELVIN_WORKLOAD_NAME",
        "value": "docs-roc-connection"
      }
    ]
  }
}'

The response will look something like this;

json title="API cURL Example Response" linenums="1" { "name": "docs-roc-connection", "title": "Docs ROC Connection", "app_name": "kelvin-bridge-roc-client", "app_version": "3.0.2", "app_type": "importer", "cluster_name": "sales-01-cluster", "runtime": { "datastreams": [ { "name": "casing_pressure", "title": "Casing Pressure", "data_type_name": "number", "unit_name": "pound_per_square_inch" } ], "resources": [ { "resource": "krn:asset:doc-motor-01", "datastreams": { "casing_pressure": { "way": "output", "storage": "node-and-cloud", "remote": false, "configuration": { "access_level": 5, "device_series": "floboss407", "polling_rate": 30, "protocol_type": "FLOAT", "tlp": "0" } } }, "properties": { "casing_depth": 14076, "county": "Reeves", "field": "Permian", "latitude": 31.984, "longitude": -102.744, "motor_configuration": "7:9", "plc_manufacturer": "Schneider", "vsd_type": "GE", "well_depth": 14927, "well_run": 3 } } ], "configuration": { "connection": { "ethernet": { "ip": "10.5.0.1", "port": 5122 }, "type": "ethernet" }, "dead_poll_enabled": false, "host_group": 32, "host_unit": 1, "optimize_read_requests": false, "optimize_write_requests": false, "roc_plus_protocol": false, "socket_poll": 1, "socket_timeout": 2 } }, "system": { "privileged": false, "environment_vars": [ { "name": "KELVIN_ACP_NAME", "value": "sales-01-cluster" }, { "name": "KELVIN_CLUSTER_NAME", "value": "sales-01-cluster" }, { "name": "KELVIN_WORKLOAD_NAME", "value": "docs-roc-connection" } ] }, "node_name": null, "status": { "state": "pending_deploy", "message": "Pending for deploy", "last_seen": "2025-04-04T12:19:09.181059286Z", "warnings": null }, "download_status": "pending", "download_error": null, "staged": null, "created_at": "2025-04-04T12:19:09.181059Z", "created_by": "krn:user:demo@kelvin.ai", "updated_at": "2025-04-04T12:19:09.181059Z", "updated_by": "krn:user:demo@kelvin.ai" }

Then in Kelvin UI under Connections you will see your Connection deployed and running.

If you have any issues in the deployment and the /bridges/deploy fails to run, then you can check its logs.

API Client (Python) Example
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from kelvin.api.client import Client

# Login
client = Client(config={"url": "https://<url.kelvin.ai>", "username": "<your_username>"})
client.login(password="<your_password>")

# Create Connection
client.app_workloads.create_workload(data={
    "name": "docs-roc-connection",
    "title": "Docs ROC Connection",
    "app_name": "kelvin-bridge-roc-client",
    "app_version": "3.0.2",
    "cluster_name": "sales-01-cluster",
    "runtime": {
      "datastreams": [
        {
          "name": "casing_pressure",
          "title": "Casing Pressure",
          "data_type_name": "number",
          "unit_name": "pound_per_square_inch"
        }
      ],
      "resources": [
        {
          "resource": "krn:asset:doc-motor-01",
          "datastreams": {
            "casing_pressure": {
              "way": "output",
              "storage": "node-and-cloud",
              "remote": false,
              "configuration": {
                "access_level": 5,
                "device_series": "floboss407",
                "polling_rate": 30,
                "protocol_type": "FLOAT",
                "tlp": "0"
              }
            }
          },
          "properties": {
            "casing_depth": 14076,
            "county": "Reeves",
            "field": "Permian",
            "latitude": 31.984,
            "longitude": -102.744,
            "motor_configuration": "7:9",
            "plc_manufacturer": "Schneider",
            "vsd_type": "GE",
            "well_depth": 14927,
            "well_run": 3
          }
        }
      ],
      "configuration": {
        "connection": {
          "ethernet": {
            "ip": "10.5.0.1",
            "port": 5122
          },
          "type": "ethernet"
        },
        "dead_poll_enabled": false,
        "host_group": 24,
        "host_unit": 32,
        "optimize_read_requests": false,
        "optimize_write_requests": false,
        "roc_plus_protocol": false,
        "socket_poll": 1,
        "socket_timeout": 2
      }
    },
    "system": {
      "privileged": false,
      "environment_vars": [
        {
          "name": "KELVIN_ACP_NAME",
          "value": "sales-01-cluster"
        },
        {
          "name": "KELVIN_CLUSTER_NAME",
          "value": "sales-01-cluster"
        },
        {
          "name": "KELVIN_WORKLOAD_NAME",
          "value": "docs-roc-connection"
        }
      ]
    }
  }
)