Skip to content

Demo: the Dallas bottling line

The Dallas demo is a complete EdgeCommons plant you can stand up on one machine: a fictional beverage bottler running two production lines, simulated from the field signals up, with OEE derived on the edge and rendered live in the edge-console and on purpose-built line boards — including a native Android TV dashboard mounted over the filling line.

It exists to show the whole platform composing into something real: field protocols in, a Unified Namespace in the middle, and operator-ready dashboards out — with every layer being a standard EdgeCommons component you could deploy the same way in production.

flowchart TB
  subgraph site["Site node — dallas"]
    CON["edge-console<br/>operator UI + hosted app boards"]
  end
  subgraph fill["Filling line · gw-fill-01"]
    FSIM["dallas-filling-sim<br/>OPC UA + Modbus"]
    FAD["opcua + modbus adapters"]
    FTP["telemetry-processor<br/>transform + OEE"]
    FR["file-replicator"]
    FBR["uns-bridge"]
    FSIM --> FAD --> FTP
    FTP --> FBR
    FTP --> FR
  end
  subgraph pack["Packaging line · gw-pack-01"]
    PSRC["KepWare (OPC UA) +<br/>host Modbus sim"]
    PAD["opcua + modbus adapters"]
    PTP["telemetry-processor<br/>transform + OEE"]
    PBR["uns-bridge"]
    PSRC --> PAD --> PTP --> PBR
  end
  FBR -->|relay| CON
  PBR -->|relay| CON
  CON -->|"/apps/…/ws"| TV1["Android TV<br/>Line 01 filling board"]
  CON -->|"/apps/…/ws"| TV2["Tizen<br/>Line 02 packaging board"]

Every box is a standard component. Each line device runs its protocol adapters, a telemetry-processor, and a uns-bridge that relays its device-local bus up to the site broker; the site node runs the edge-console. Nothing above the field ever parses a topic string — every message is self-identifying through its UNS identity.

The filling line is the one to watch first — it is self-contained (no external dependencies) and it drives the native TV board. Its simulator emits both the scalar Modbus counters (GoodBottleCount, RejectCount, the reject breakdown, bowl level, conveyor/infeed/e-stop health) and an OPC UA OeeShiftSnapshot, from a single shared scenario so the two always agree.

The pipeline is the same on both lines:

  1. Adapters — the OPC UA and Modbus adapters read the field sources and publish each signal onto the device’s UNS data class.
  2. Transform — the line’s telemetry-processor runs a per-signal Lua transform (engineering-unit scaling, rate, alarm banding) and tees a rolling Parquet sink that the file-replicator ships off the device.
  3. OEE — the same telemetry-processor runs an OEE route that derives Availability × Performance × Quality = OEE and republishes them to the bus. On the filling line these come from the simulator’s OeeShiftSnapshot = [plannedMs, runMs, good+rejects, good, idealMsPerBottle]; the route rejects any snapshot where runMs > plannedMs.
  4. Relay — each line’s uns-bridge relays the device-local bus (signals and the derived OEE) up to the site broker.
  5. Console — the edge-console subscribes the site broker’s class wildcards, builds its in-memory fleet model, and serves it to browsers and hosted apps.

Two surfaces render the same fleet model:

  • The edge-console operator UI — fleet health, the components tree, site topology, events & alarms, metrics, and a Signals browser over the data class. This is the general-purpose console; see the edge-console docs.
  • Purpose-built line boards, hosted by the console. Besides its own UI, the console hosts additional applications: a native Android TV board mounted over the filling line (Line 01) and a packaged Samsung Tizen board over the packaging line (Line 02). Each is served at /apps/{id}/, connects over a rate-limited application WebSocket, and is scoped to what it may see by its own origins, roles, and data capabilities — a wall display that renders the line without being able to command it.

The native filling board shows the OEE band, an INFEED ▸ FILLER ▸ CAPPER flow strip, a fill-quality panel (tank level plus pressure / volume / temperature / CO₂ against their spec bands), a rate-vs-target gauge, and a reject breakdown — all driven live from the signals above, with colour used only where it means something (amber caution, red fault).

The demo is stood up by the org’s docker compose system-test harness — one container per edge device, every component running as a supervised process against a per-device broker, exactly matching the topology above. Bringing the whole plant up is a single docker compose up; the filling line needs no external dependencies, while the packaging line expects LAN reachability to its OPC UA server and host Modbus source. From there, open the edge-console in a browser to watch both lines, and install the TV board on an Android TV / Tizen panel pointed at the console’s application WebSocket.