This guide shows how to push Roboflow Workflow detections to an OPC UA server, making them available as live tags to dashboards, PLCs, and SCADA platforms alongside any other plant sensor.
Prerequisites
- Roboflow Enterprise plan — the OPC UA Writer Sink is enterprise-only
- Docker Desktop
- An existing OPC UA server — Ignition, Kepware, or any standards-compliant server. (No server yet? Roboflow’s edge devices ship with a built-in OPC UA server you can use for testing — covered in Step 2.)
- A Roboflow API key — from app.roboflow.com → Settings → API
Step 1: Start the inference server with enterprise blocks enabled
Enterprise blocks (including the OPC UA Writer Sink) aren’t loaded by default. Without this step, the block shows “Server Configuration Required” in the workflow editor and never runs.
# 1. Create and activate new virtual environment
python -m venv venv
source venv/bin/activate
# 2. Upgrade pip
pip install --upgrade pip
# 3. Install inference package (includes enterprise blocks)
pip install inference
pip install --upgrade inference
# 4. Install additional required packages
pip install uvicorn
pip install opencv-python
# 5. Create .env file for enterprise blocks
echo "LOAD_ENTERPRISE_BLOCKS=True" > .env
# 6. Launch inference server with enterprise blocks
#USE_INFERENCE_MODELS=True inference server start --dev
inference server start -e .env
# Verify enterprise blocks are available
python -c "
from inference.enterprise.workflows.enterprise_blocks.loader import load_enterprise_blocks
blocks = load_enterprise_blocks()
print(f'✅ {len(blocks)} enterprise blocks loaded')
for block in blocks:
print(f' - {block.__name__}')
"You should see a list that includes OPCWriterSinkBlockV1. If the list is empty or that block is missing, the environment variable isn’t being picked up — stop the server, double-check .env, and restart.
If your workflow uses a Roboflow-hosted model, also add ROBOFLOW_API_KEY=your_key_here to the .env file.
Step 2: Configure folders and tags on your OPC UA server
Before the workflow can write anything, the destination tags need to exist on your OPC UA server. Use the server’s native interface to create them:
- Ignition — open Designer, navigate to your tag provider, right-click → New Tag. Default port: 62541.
- Kepware — use the Configuration tool to add tags under a channel/device
- Other servers — follow your vendor’s documentation
Collect three pieces of info you’ll need in Step 4:
- The endpoint URL (e.g., opc.tcp://<server-host>:62541)
- The namespace — URI string or numeric index
- The NodeId format the server uses — string-based NodeIds (Ignition-style) require Node Lookup Mode: direct in the workflow block
The data type on each tag must match the Value Type field on the workflow block.
Alternative: use Roboflow’s built-in OPC UA server
If you don’t have an OPC UA server already, Roboflow’s edge devices ship with one you can add as a managed service. This path requires the Roboflow Deployment Manager, which is an Enterprise feature. On a Roboflow-managed edge device:
- From the device dashboard, click Add Service → select OPC UA Server → submit
- On the OPC UA Server card that appears, click Configure
- Note the Namespace URI (defaults to http://opcua.roboflow.run)
- + Add Folder, then + Add Tag inside it (set the data type to match what the workflow will write)
- Click Save Configuration
The endpoint URL on the card (opc.tcp://<device-ip>:4840/opcua/server) is what your workflow will connect to.
Step 3: Build the workflow
Image input → Model → (Optional Filter) → Property Definition → OPC UA Writer Sink

The Property Definition block reduces predictions to a single value — a count, a boolean, a score — that OPC UA can store. Each value you want to surface needs its own OPC UA Writer Sink block: one block, one tag.
Tag names must match exactly. Folder, tag name, casing, and separators all matter. A mismatch (e.g., person_present vs Person_present, or / when the server expects .) returns BadNoMatch and silently drops the write.
Step 4: Configure the OPC UA Writer Sink block
Only a handful of fields really matter:
| Field | Description |
|---|---|
| URL | URL of the OPC UA server to which data will be written. |
| Namespace | The OPC UA namespace URI or index used to locate objects and variables. |
| Object Name | The name of the target object in the namespace to search for. |
| Variable Name | The name of the variable within the target object to be updated. |
| Value | The value to be written to the target variable on the OPC UA server. |
| Value Type | The type of the value to be written to the target variable on the OPC UA server. Supported types: Boolean, Double, Float, Int16, Int32, Int64, Integer (Int64 alias), SByte, String, UInt16, UInt32, UInt64. |
| Node Lookup Mode | Method to locate the OPC UA node: hierarchical uses path navigation, direct uses NodeId strings (for Ignition-style string-based tags). |
| Cooldown Seconds | The minimum number of seconds to wait between consecutive updates to the OPC UA server. |
Leave Fire And Forget off (False) while you’re getting the integration working — it surfaces real errors in the error_status output. Flip it back on for production once everything works.
Step 5: Deploy and verify
In the workflow editor, click Deploy → Local Server, enter http://localhost:9001 (or your inference server's address), and click Connect. Run an image through the deployed workflow — or, if you're on a Roboflow edge device, point a camera stream at it from the device dashboard.
Run the workflow against a test image. If everything is wired correctly:
- The OPC UA Writer Sink block’s error_status output is False
- Its message output says the write succeeded
- The tag value updates on your OPC UA server — visible in Ignition Designer, any OPC UA client, or the Roboflow device dashboard (if using the built-in server)
Testing constraints -
- The OPC UA Writer Sink only runs on a local (self-hosted) inference server. Roboflow’s serverless API cannot execute this block — it has no direct route to your OPC UA server.
- The inference server must have network access to your OPC UA server. If they’re on different networks, bridge them via SSH tunneling or Tailscale before testing.
- For testing, the easiest setup is running inference on the same machine (or LAN) as your OPC UA server — no networking workarounds needed.
Pull data from the inference server
The OPC UA Writer Sink pushes — every workflow iteration writes (subject to cooldown). If your OPC UA server can’t keep up with the rate of incoming writes, flip the architecture: have a service on the OPC UA side pull predictions from the local inference server’s REST API on its own schedule and write them to OPC UA itself.
This is the right pattern when your SCADA layer needs to control timing, when writes need to fan out to multiple destinations, or when the push model overwhelms your OPC UA server.
Once detections flow through OPC UA, your SCADA platform treats them like any other sensor.
Cite this Post
Use the following entry to cite this post in your research:
Kevin Seyedan. (May 21, 2026). Integrate Roboflow with OPC UA. Roboflow Blog: https://blog.roboflow.com/roboflow-opc-ua-integration/