Docs menu

MANUFACTURING - HYBRID

Hybrid Track: Add OpenX Without Disrupting Production

Your SCADA, MES and historians keep running. OpenX sits beside them.

You are not replacing anything. You are adding a workspace where production data lands, is organized on surfaces, and is read through saved queries that define each metric once.

What you will have

  • One production view across SCADA, MES and historians
  • Standard OEE that everyone calculates the same way
  • API endpoints for your dashboards
  • Any AI over MCP, reading the same queries

All without touching your control systems.

Phase 1: Connect your data

Step 1.1: Add a connection

On the canvas

  1. Open your workspace.
  2. Drag a Connection node from the Node Bank onto the canvas.
  3. In its inspector's Settings tab, set the Connection ID (tick Is IoT Edge Device if an IoT Edge gateway sends for it). There is no connection string to enter: the connection sets up its own device identity.
  4. Save, then Deploy. Deploy registers the connection as a device on Fathym's shared IoT hub, or your own once your workspace has its IoT fabric.
  5. Open the inspector's Connection Info tab. It shows the credentials your historian or edge gateway uses to send data (device, MQTT, AMQP and HTTP details).

Or ask Azi

AZI

Tell me: "Create a connection for our production historian." I propose it; accept it, then Deploy builds it.

Step 1.2: How your sources reach OpenX

SourceHow it reaches OpenX
SCADA / PLCThrough an edge gateway (OPC UA to MQTT, for example) to the connection's device
HistorianForwarded over MQTT, AMQP or HTTP to the connection's device
MES, quality systemAn API Source polling an HTTP endpoint

There is no direct connector to an external database today; see Database. When data arrives, it shows in the Live Stream panel.

TIP

Start with your historian - it usually has the most complete production data.

Phase 2: Create production surfaces

Step 2.1: A line surface

Ask Azi in the main panel:

"Create a surface for Line 1 production monitoring, fed by the historian connection."

She proposes a Line-1-Production surface wired to the connection. Accept it; a surface is live as soon as it is accepted.

Step 2.2: More surfaces

SurfaceFed byPurpose
Line-2-ProductionLine 2 dataLine 2 monitoring
Quality-ControlInspection resultsQuality visibility
Downtime-TrackingStop eventsAvailability analysis

Phase 3: Build production queries with Azi

Where your data is

Your workspace's device data lands in one table, Data (Devices in workspaces whose IoT fabric was set up earlier). Each message's payload is JSON in its RawData column, so a query unpacks it with todynamic(RawData). The field names below (line, status, duration, units, quality, cause) are examples; use the ones your systems send. Ask Azi to sample with Data | take 5 first. The queries below are examples to adapt, not tested against your data.

In the main Azi panel, Azi proposes each warm query together with the surface it sits on; accept it and it is live. Inside the Warm Query Manager, she drafts the query instead and you save it with the canvas Save icon.

Step 3.1: OEE

"Create a warm query for OEE (availability x performance x quality) on Line 1 over the last shift."

Data
| where EnqueuedTime > ago(8h)
| extend Payload = todynamic(RawData)
| where tostring(Payload.line) == "Line1"
| summarize RunSeconds = sumif(todouble(Payload.duration), tostring(Payload.status) == "Running"),
            PlannedSeconds = sum(todouble(Payload.duration)),
            Units = sum(toint(Payload.units)),
            GoodUnits = sumif(toint(Payload.units), tostring(Payload.quality) == "Pass")
| extend IdealCycleSeconds = 60.0
| extend Availability = RunSeconds / PlannedSeconds,
         Performance = (Units * IdealCycleSeconds) / RunSeconds,
         Quality = todouble(GoodUnits) / Units
| extend OEE = Availability * Performance * Quality * 100

Step 3.2: Downtime Pareto

"Build a query for the top 10 downtime causes by duration this week."

Data
| where EnqueuedTime > ago(7d)
| extend Payload = todynamic(RawData)
| where tostring(Payload.eventType) == "Downtime"
| summarize TotalMinutes = sum(todouble(Payload.durationMinutes)), Stops = count() by Cause = tostring(Payload.cause)
| top 10 by TotalMinutes desc

Step 3.3: First-pass yield

"Create a query for first-pass yield by day over the last 30 days."

Data
| where EnqueuedTime > ago(30d)
| extend Payload = todynamic(RawData)
| where isnotempty(Payload.quality)
| summarize GoodUnits = countif(tostring(Payload.quality) == "Pass"), TotalUnits = count() by Day = bin(EnqueuedTime, 1d)
| extend FirstPassYield = GoodUnits * 100.0 / TotalUnits
| order by Day asc

AZI

Now everyone calculates OEE the same way. When production asks "What's our OEE?", there is one saved query to answer it.

Phase 4: Call your queries over REST

  1. Open APIs -> API Manager and its Warm Queries tab.
  2. Under Configured Queries, each saved warm query has its own card, with ready-to-copy cURL, TypeScript and Python.
  3. Get a key from APIs -> API Keys.
curl -X GET 'https://openx.fathym.com/ox-api/warm-queries/line1-oee' \
  -H 'Authorization: Bearer YOUR_TOKEN'
IntegrationUse
Andon boardOEE display
Shift handoffProduction summary
MESThe same metrics in your MES
AlertingNotify when OEE drops below target

Phase 5: Connect any AI over MCP

The OpenX MCP Server is at https://openx.fathym.com/ox-api/mcp. Sign in through the browser:

  • Claude.ai or ChatGPT: add a custom connector, paste the URL, sign in with OpenX, pick the workspace and tick the rights to share.
  • Coding agents: run fai mcp install https://openx.fathym.com/ox-api/mcp --name openx and sign in when the browser opens.

Setup for each client is in Bring Any AI. Then ask:

"What's causing the OEE drop on Line 1 this week compared to last week?"

The AI reads your saved queries with call_api. If it wants to build something new, it proposes it with manage_proposals, and a person accepts.

What you built

ComponentStatus
Historian connectionBuilt on Deploy, sending data
Production surfacesOrganized by line
OEE queriesThree saved warm queries
API endpointsOne per warm query
MCPAny client reading the same queries

Before and after

BeforeAfter
"Everyone calculates OEE differently"One query, one definition
Spreadsheet shift reportsReports that call the saved queries
Manual downtime analysisOne saved Pareto query

Next steps

If you want to...Go to...
Try the full trackFull track
See query patternsQuery Patterns
Connect more AI clientsBring Any AI
Explore energyEnergy Monitoring
On this page