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
- Open your workspace.
- Drag a Connection node from the Node Bank onto the canvas.
- 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.
- 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.
- 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
| Source | How it reaches OpenX |
|---|---|
| SCADA / PLC | Through an edge gateway (OPC UA to MQTT, for example) to the connection's device |
| Historian | Forwarded over MQTT, AMQP or HTTP to the connection's device |
| MES, quality system | An 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
| Surface | Fed by | Purpose |
|---|---|---|
Line-2-Production | Line 2 data | Line 2 monitoring |
Quality-Control | Inspection results | Quality visibility |
Downtime-Tracking | Stop events | Availability 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
- Open APIs -> API Manager and its Warm Queries tab.
- Under Configured Queries, each saved warm query has its own card, with ready-to-copy cURL, TypeScript and Python.
- 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'
| Integration | Use |
|---|---|
| Andon board | OEE display |
| Shift handoff | Production summary |
| MES | The same metrics in your MES |
| Alerting | Notify 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 openxand 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
| Component | Status |
|---|---|
| Historian connection | Built on Deploy, sending data |
| Production surfaces | Organized by line |
| OEE queries | Three saved warm queries |
| API endpoints | One per warm query |
| MCP | Any client reading the same queries |
Before and after
| Before | After |
|---|---|
| "Everyone calculates OEE differently" | One query, one definition |
| Spreadsheet shift reports | Reports that call the saved queries |
| Manual downtime analysis | One saved Pareto query |
Next steps
| If you want to... | Go to... |
|---|---|
| Try the full track | Full track |
| See query patterns | Query Patterns |
| Connect more AI clients | Bring Any AI |
| Explore energy | Energy Monitoring |
On this page
- Hybrid Track: Add OpenX Without Disrupting Production