One simple question.
Five systems. Four hours. Still not sure.

Every manufacturing operation faces the same problem. Someone asks a straightforward question about the shop floor — and answering it requires pulling data from multiple disconnected systems, exporting to spreadsheets, and hoping the timestamps align. By the time you have an answer, it's already stale.

"What was the utilisation of CNC-01 last shift?"

Five systems. Five handoffs. No confidence.

To answer one question about machine utilisation, you traverse five systems, perform three manual exports, and spend hours in a spreadsheet. Here's the actual journey. Watch it to the end, it'll annoy you.

STEP 1 STEP 2 STEP 3 STEP 4 STEP 5 SCADA Wonderware Live view only 2 min Can see cnc-01 is ACTIVE right now No history Dead end → next system Historian OSIsoft PI Tag-based archive 45 min Find correct tag Export 8hr CSV Raw state changes No shift context ERP SAP / Oracle Shift schedules 15 min Look up shift times 06:00 – 14:00 Copy start/end times Manual transcription Spreadsheet Excel / Sheets Manual calculation 2 hrs Paste CSV data Filter by shift window SUMIF(state="ACTIVE") ÷ total shift hours Hope formula is right Answer Maybe correct Already stale 4+ hrs ~68% Utilisation (estimated) But was the tag right? Shift boundary exact? Formula correct? 4 hours 12 minutes · 5 systems · 3 manual exports · 1 spreadsheet · 0 confidence And tomorrow someone will ask the same question about a different machine 0 min 2 min 47 min 62 min 3 hrs 4 hrs 12 min SCADA Historian export ERP Spreadsheet calculation Review "What was the utilisation of CNC-01 last shift?" Asked at 14:15 · Answered at 18:27 · Confidence: low · Repeatable: no

Point-to-point architecture scales quadratically.

Every system stores its own data in its own format. Connecting any two systems requires a custom integration. The number of possible connections grows with the square of the number of systems — and every one is a bridge that breaks when either end changes.

5
10 connections
Small factory
10
45 connections
Mid-size operation
20
190 connections
Enterprise

Each connection is custom-built, manually maintained, and breaks when either system updates. The cost isn't just the initial build — it's the ongoing maintenance, the data inconsistencies, and the questions that never get asked because everyone knows the answer would take too long.

What if every machine published its data to one shared layer — and any system could read it?

That's the Unified Namespace. Instead of connecting every system to every other system, every system connects to one MQTT broker. Machines publish their state. Applications subscribe to what they need. The broker handles delivery. Adding a new system means one new connection — not N.

The same question — "what was the utilisation of CNC-01 last shift?" — becomes a single API call that returns in under a second. Not because the question got simpler, but because the architecture stopped making it hard.

Same question. One call. 0.3 seconds.

The machine publishes its state every 3 seconds. Functions process the data automatically. The answer is always ready — computed from real-time data, not assembled from stale exports.

DATA PIPELINE — CONTINUOUS MACHINE BROKER CACHE FUNCTIONS DATABASE cnc-01 ACTIVE · OP-7842 · T12 Publishing every 3s v1.0/acme/site1/area1/cnc-01/status MQTT Broker · Pub/Sub Valkey uns:data:* · uns:prev:* uns-state uns-stoppage uns-productivity PostgreSQL states · stoppages · runs ▼ API REQUEST ▼ HTTP REQUEST GET /uns-kpi?hours=8&machine=cnc-01 → queries PostgreSQL → computes utilisation, availability, MTBF, MTTR, throughput → returns JSON in 0.3 seconds uns-kpi Go · HTTP Compute on demand 72.4% Utilisation cnc-01 · last shift · 06:00–14:00 94% Availability 48/hr Throughput 142m MTBF 8.3m MTTR 0.3 seconds · 1 API call · 0 manual steps · 0 spreadsheets · real-time data · 100% repeatable Same call works for any machine, any time range, any shift — instantly 0.3s vs 4 hours 12 minutes with point-to-point 840× faster

Three ideas make this possible.

The UNS combines an international standard for data addressing, a lightweight messaging protocol, and small independent functions that process data as it flows.

ISA-95 Topic Hierarchy

Every data point gets a canonical address following the ISA-95 international standard. The path is self-describing — any consumer can parse it to understand where data comes from without mapping tables.

v1.0 / acme / site1 / area1 / cnc-01 / status
└─ version
└─ enterprise
└─ site
└─ area
└─ machine
└─ data point

MQTT Pub/Sub

Machines publish. Applications subscribe. The broker handles delivery. Producers don't need to know who's listening. Consumers don't need to know who's publishing. Adding a new system means one new connection to the broker — not N connections to every other system.

Serverless Functions

Each piece of processing logic is a small, independent function — Go or Node.js. State tracking, stoppage classification, production logging, KPI computation. They read from a shared cache, write to PostgreSQL, and compose through infrastructure rather than through each other. Deploy with git push.

See the full architecture on fn-uns → Read the UNS Framework standard →

Every role asks different questions. The UNS answers all of them.

Utilisation was just the start. The same architecture — machines publishing to MQTT, functions processing data, APIs serving results — answers every question your factory asks.

Operations Manager

"Which machines are running right now, and what's the overall shop floor utilisation?"

Every machine publishes its state every 3 seconds. The UNS cache holds the current value for every topic. A single API call returns live status for every machine — ACTIVE, IDLE, ALARM, OFF — with utilisation computed from state duration history. No SCADA screen required. No manual aggregation. Real-time, always.

GET /uns-kpi?area=machining
Maintenance Lead

"Which machine has the worst reliability, and what are the top stoppage reasons?"

Every state transition is logged with precise timestamps. The stoppage function auto-classifies downtime reasons. MTBF and MTTR are computed per machine. Stoppage pareto charts rank reasons by total duration. Maintenance can see exactly where to focus — not from gut feeling, but from data that updates continuously.

GET /uns-kpi?machine=cnc-04&hours=168
Production Planner

"Are we on target for today's production schedule? Where are the bottlenecks?"

The productivity function tracks parts completed per program, throughput per hour, and target attainment. Compare actual output against planned schedules in real time — not at the end of the shift when it's too late to adjust. Identify which machines are falling behind before they impact delivery.

GET /uns-kpi?hours=8&area=machining
Quality Engineer

"Where is the scrap coming from? Which machine-operator-program combination has the highest reject rate?"

Operator input captures scrap counts linked to specific machines, programs, and operators. Quality data flows through the same UNS pipeline as production data — so you can correlate rejects with machine state, tool life, and program parameters. Traceability from raw material to finished part, all in one query.

GET /uns-kpi?machine=cnc-01&include=quality
Continuous Improvement

"What's actually improved since we made that change last month?"

Every state change, every stoppage, every production run is recorded with timestamps and durations in PostgreSQL. Compare any time period against any other. See whether utilisation improved, whether MTBF increased, whether the top stoppage reason changed. Evidence-based kaizen — not anecdotes in a meeting room.

GET /uns-kpi?from=2024-01-01&to=2024-01-31&compare=2024-02-01,2024-02-28

Stop asking questions you can't answer.

Read the open standard, explore the reference implementation with real serverless functions, or dive into the documentation. Everything is open source, self-hosted, and ready to deploy.