[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"agmd-flowfuse-worked-example":3,"application-guide-nav":222},{"id":4,"title":5,"blurb":6,"body":7,"description":199,"extension":211,"guide":212,"meta":213,"navOrder":214,"navTitle":5,"navigation":215,"parent":216,"path":217,"seo":218,"slug":219,"stem":220,"__hash__":221},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example.md","OEE, end to end","One use case — OEE across three lines — broken into two apps and two shared services, then drawn out end to end.",{"type":8,"value":9,"toc":198},"minimark",[10,14,19,27,33,44,48,53,59,106,110,115,151,155,169,173,180],[11,12,5],"h1",{"id":13},"oee-end-to-end",[15,16,18],"h2",{"id":17},"the-use-case","The use case",[20,21,22,26],"p",{},[23,24,25],"strong",{},"Track OEE across three production lines."," OEE (Overall Equipment Effectiveness) tells you how much good product a line makes versus its full potential — one live number per line, plus history for trends.",[20,28,29,32],{},[23,30,31],{},"What \"good\" looks like"," — every line shows a live OEE figure the team trusts, and any line's OEE can be charted back over weeks to spot drift.",[20,34,35,36,39,40,43],{},"It's not one app. OEE takes ",[23,37,38],{},"two apps"," — one at the edge, one in the cloud — joined by ",[23,41,42],{},"two shared services"," (a broker and a history store).",[15,45,47],{"id":46},"the-apps","The apps",[49,50,52],"h3",{"id":51},"_1-oee-edge-aggregator","1 · OEE - Edge Aggregator",[20,54,55,58],{},[23,56,57],{},"What it does"," — Reads the machine signals on a line and publishes the line's state.",[60,61,62,75,85,91,97],"ul",{},[63,64,65,68,69,74],"li",{},[23,66,67],{},"Delivery method"," — ",[70,71,73],"a",{"href":72},"\u002Fapplication-guide\u002Fflowfuse\u002Fapp-delivery-methods\u002F","whole app",": promoted as a snapshot through a pipeline to a Remote Instance on every line.",[63,76,77,68,80,84],{},[23,78,79],{},"App pattern",[70,81,83],{"href":82},"\u002Fapplication-guide\u002Fflowfuse\u002Fhardware-apps\u002F","hardware app · Configurable App",": the same build everywhere, with each line's PLC tag names loaded as per-site config.",[63,86,87,90],{},[23,88,89],{},"Runs on"," — a Remote Instance, one per line.",[63,92,93,96],{},[23,94,95],{},"Why this shape"," — the same flows run on every line, right next to the equipment, and keep working if the link drops — but each line's PLC tags differ, so the values are configured per install. Build it once; roll the same version to the whole fleet and point each at its own tags.",[63,98,99,68,102],{},[23,100,101],{},"See the flow",[70,103,105],{"href":104},"\u002Fapplication-guide\u002Fnode-red\u002Foee-edge-aggregator\u002F","how OEE - Edge Aggregator is built in Node-RED →",[49,107,109],{"id":108},"_2-oee-central-dashboard","2 · OEE - Central Dashboard",[20,111,112,114],{},[23,113,57],{}," — Subscribes to the line states, computes availability, performance and quality, and presents the live OEE dashboard.",[60,116,117,124,133,138,143],{},[63,118,119,68,121,123],{},[23,120,67],{},[70,122,73],{"href":72},": promoted dev → staging → prod as one versioned build.",[63,125,126,68,128,132],{},[23,127,79],{},[70,129,131],{"href":130},"\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps\u002F","software app · Data-Driven App",".",[63,134,135,137],{},[23,136,89],{}," — a Hosted Instance in the cloud.",[63,139,140,142],{},[23,141,95],{}," — it's a user-facing app driven by live data, with no hardware of its own; one instance serves the whole plant.",[63,144,145,68,147],{},[23,146,101],{},[70,148,150],{"href":149},"\u002Fapplication-guide\u002Fnode-red\u002Foee-central-dashboard\u002F","how OEE - Central Dashboard is built in Node-RED →",[49,152,154],{"id":153},"shared-services","Shared services",[60,156,157,163],{},[63,158,159,162],{},[23,160,161],{},"Team Broker (MQTT · UNS)"," — carries line state from edge to cloud. The edge publishes to a topic; the dashboard subscribes. Neither references the other.",[63,164,165,168],{},[23,166,167],{},"External time-series DB (Timescale \u002F QuestDB)"," — FlowFuse has no built-in time-series store, so history goes to an external DB over the Postgres wire protocol — a second egress, because the data is a timestamped stream.",[15,170,172],{"id":171},"the-full-architecture","The full architecture",[174,175],"arch-diagram",{":edges":176,":groups":177,":legend":178,":nodes":179},"[{\"from\":\"lineA\",\"to\":\"broker\",\"dashed\":true,\"accent\":\"teal\"},{\"from\":\"lineB\",\"to\":\"broker\",\"label\":\"publish state\",\"dashed\":true,\"accent\":\"teal\"},{\"from\":\"lineC\",\"to\":\"broker\",\"dashed\":true,\"accent\":\"teal\"},{\"from\":\"broker\",\"to\":\"hosted\",\"label\":\"subscribe\",\"dashed\":true,\"accent\":\"teal\"},{\"from\":\"hosted\",\"to\":\"tsdb\",\"label\":\"writes history · Postgres wire\",\"accent\":\"slate\"}]","[{\"id\":\"cloud\",\"label\":\"Cloud · platform — the app + history\",\"accent\":\"blue\",\"nodes\":[\"hosted\",\"tsdb\"]},{\"id\":\"edge\",\"label\":\"OT · edge — one Remote Instance per line, all the same Edge Aggregator\",\"accent\":\"red\",\"nodes\":[\"lineA\",\"lineB\",\"lineC\"]}]","[{\"swatch\":\"red\",\"label\":\"OT edge\"},{\"swatch\":\"blue\",\"label\":\"Cloud\"},{\"line\":\"teal\",\"dashed\":true,\"label\":\"MQTT \u002F UNS\"},{\"line\":\"slate\",\"label\":\"Postgres wire\"}]","[{\"id\":\"hosted\",\"label\":\"Hosted Instance\",\"sub\":\"OEE · Central Dashboard\",\"accent\":\"indigo\",\"col\":2,\"row\":1},{\"id\":\"tsdb\",\"label\":\"Time-series DB\",\"sub\":\"external · history\",\"accent\":\"slate\",\"col\":3,\"row\":1},{\"id\":\"broker\",\"label\":\"Team Broker\",\"sub\":\"MQTT · UNS\",\"accent\":\"teal\",\"col\":2,\"row\":2},{\"id\":\"lineA\",\"label\":\"Remote Instance\",\"sub\":\"Line A · Edge Aggregator\",\"accent\":\"slate\",\"col\":1,\"row\":3},{\"id\":\"lineB\",\"label\":\"Remote Instance\",\"sub\":\"Line B · Edge Aggregator\",\"accent\":\"slate\",\"col\":2,\"row\":3},{\"id\":\"lineC\",\"label\":\"Remote Instance\",\"sub\":\"Line C · Edge Aggregator\",\"accent\":\"slate\",\"col\":3,\"row\":3}]",[181,182,184],"callout",{"icon":183},"i-lucide-quote",[20,185,186,189,190,193,194,197],{},[23,187,188],{},"The architecture, in one sentence"," — OEE is the ",[23,191,192],{},"Edge Aggregator"," (a hardware Configurable App, on a Remote Instance per line) publishing machine state over the Team Broker to the ",[23,195,196],{},"Central Dashboard"," (a software Data-Driven App, on a Hosted Instance), which computes and displays OEE and writes history to an external time-series DB.",{"title":199,"searchDepth":200,"depth":200,"links":201},"",4,[202,204,210],{"id":17,"depth":203,"text":18},2,{"id":46,"depth":203,"text":47,"children":205},[206,208,209],{"id":51,"depth":207,"text":52},3,{"id":108,"depth":207,"text":109},{"id":153,"depth":207,"text":154},{"id":171,"depth":203,"text":172},"md","flowfuse",{},6.1,true,"worked-examples","\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example",{"title":5,"description":199},"worked-example","application-guide\u002Fflowfuse\u002Fworked-example","n3Y7j3EdZtJMGrtKrDGh6letPk3_Yn55OgpveECwrCI",[223,230,234,239,242,246,251,256,261,266,271,277,282,286,291,296,302,307,312,317,321],{"guide":212,"slug":224,"title":225,"navOrder":226,"parent":227,"blurb":228,"path":229},"overview","Overview",1,null,"The map of the FlowFuse guide — apps, architectures, and a worked example.","\u002Fapplication-guide\u002Fflowfuse\u002Foverview\u002F",{"guide":231,"slug":224,"title":225,"navOrder":226,"parent":227,"blurb":232,"path":233},"node-red","The map of the Node-RED guide — the pattern families that turn an app into a clean flow.","\u002Fapplication-guide\u002Fnode-red\u002Foverview\u002F",{"guide":212,"slug":235,"title":236,"navOrder":203,"parent":227,"blurb":237,"path":238},"foundations","Foundations","The foundation to build on: what FlowFuse is, its core pieces, and how code is shared across teams.","\u002Fapplication-guide\u002Fflowfuse\u002Ffoundations\u002F",{"guide":231,"slug":235,"title":236,"navOrder":203,"parent":227,"blurb":240,"path":241},"The handful of concepts you need to build with Node-RED, and how they fit together.","\u002Fapplication-guide\u002Fnode-red\u002Ffoundations\u002F",{"guide":212,"slug":243,"title":244,"navOrder":207,"parent":227,"blurb":245,"path":72},"app-delivery-methods","App delivery methods","Two different units of code, delivered two ways. Ship the whole app — a complete, versioned project promoted through environments — or publish one reusable piece — a package the whole team installs and upgrades in one place. Pick by what you're shipping: the app, or a part of it.",{"guide":231,"slug":247,"title":248,"navOrder":207,"parent":227,"blurb":249,"path":250},"patterns","Patterns","The moves that turn an architecture into a clean, reusable flow — find the seams and reuse well, then handle data on the right paths.","\u002Fapplication-guide\u002Fnode-red\u002Fpatterns\u002F",{"guide":212,"slug":252,"title":253,"navOrder":254,"parent":243,"blurb":255,"path":82},"hardware-apps","Hardware apps",3.1,"The three shapes a FlowFuse app takes when it runs on a device. Pick by how much varies per site: nothing (Packaged App), a few settings (Configurable App), or you assemble it yourself (Edge Building Block).",{"guide":231,"slug":257,"title":258,"navOrder":254,"parent":247,"blurb":259,"path":260},"design-patterns","Design patterns","The structural choices you select for a flow: find the seams it breaks into, then reuse each piece at the lightest level that solves it — link in\u002Fout, link call, subflow, or packaged node.","\u002Fapplication-guide\u002Fnode-red\u002Fdesign-patterns\u002F",{"guide":212,"slug":262,"title":263,"navOrder":264,"parent":243,"blurb":265,"path":130},"software-apps","Software apps",3.2,"The three shapes a FlowFuse app takes when it runs on the platform. Pick by what it needs: a headless job (Packaged App), a user-facing app driven by data (Data-Driven App), or a reusable piece other apps embed (Shared Building Block).",{"guide":231,"slug":267,"title":268,"navOrder":264,"parent":247,"blurb":269,"path":270},"handling-data","Handling data","Classify each signal by shape, purpose and direction, then pick the methods it needs — separate the paths, pace the flow, hold state in context, and manage config. The methods you select to move a flow's data.","\u002Fapplication-guide\u002Fnode-red\u002Fhandling-data\u002F",{"guide":231,"slug":272,"title":273,"navOrder":274,"parent":247,"blurb":275,"path":276},"good-form","Good form",3.3,"A clean flow isn't luck — it's a handful of habits. Wire for reading, lay it out on a grid, decouple UI from logic, catch errors where you can see them, and keep data on a stable contract. Follow these and a flow stays readable, reusable, and out of spaghetti.","\u002Fapplication-guide\u002Fnode-red\u002Fgood-form\u002F",{"guide":212,"slug":278,"title":279,"navOrder":200,"parent":227,"blurb":280,"path":281},"data-plane","Data plane","Before you pick where things run, decide how data is handled. Two stores come built into every FlowFuse server install — the Team Broker and relational Tables — exposed to every instance with nothing extra to stand up. Everything else you bring your own: run it (a time-series DB, an existing database, a model) and expose it to the fleet over Project Link, no inbound ports. This is the data plane the architectures on the next pages all sit on.","\u002Fapplication-guide\u002Fflowfuse\u002Fdata-plane\u002F",{"guide":231,"slug":216,"title":283,"navOrder":200,"parent":227,"blurb":284,"path":285},"Worked examples","Turn an app concept into a Node-RED flow — or a few — leaning on the design patterns and data handling. The method, then the OEE apps end to end.","\u002Fapplication-guide\u002Fnode-red\u002Fworked-examples\u002F",{"guide":231,"slug":287,"title":288,"navOrder":289,"parent":216,"blurb":290,"path":104},"oee-edge-aggregator","OEE - Edge Aggregator",4.1,"The edge app from the OEE use case as a Node-RED flow — a straight-line flow packaged as a subflow and configured per line (its PLC tags, via a config UI and a get-config node), with the data treated as a stream and its counts held in context.",{"guide":231,"slug":292,"title":293,"navOrder":294,"parent":216,"blurb":295,"path":149},"oee-central-dashboard","OEE - Central Dashboard",4.2,"The cloud app from the OEE use case as a Node-RED flow — one link out fanning to two link ins on separate tabs (dashboard and batched history), so the live and history paths stay separate and easy to read.",{"guide":212,"slug":297,"title":298,"navOrder":299,"parent":227,"blurb":300,"path":301},"architectures","Architectures",5,"Every FlowFuse deployment is the same building blocks arranged for where it runs — pick the world you're designing for.","\u002Fapplication-guide\u002Fflowfuse\u002Farchitectures\u002F",{"guide":212,"slug":303,"title":304,"navOrder":305,"parent":297,"blurb":227,"path":306},"it-architectures","IT architectures",5.1,"\u002Fapplication-guide\u002Fflowfuse\u002Fit-architectures\u002F",{"guide":212,"slug":308,"title":309,"navOrder":310,"parent":297,"blurb":227,"path":311},"ot-architectures","OT architectures",5.2,"\u002Fapplication-guide\u002Fflowfuse\u002Fot-architectures\u002F",{"guide":212,"slug":313,"title":314,"navOrder":315,"parent":297,"blurb":227,"path":316},"iiot-architectures","IIoT architectures",5.3,"\u002Fapplication-guide\u002Fflowfuse\u002Fiiot-architectures\u002F",{"guide":212,"slug":216,"title":283,"navOrder":318,"parent":227,"blurb":319,"path":320},6,"Start from a use case, break it into apps, and draw the architecture that ties them together — the same method a FlowFuse Proof of Value runs.","\u002Fapplication-guide\u002Fflowfuse\u002Fworked-examples\u002F",{"guide":212,"slug":219,"title":5,"navOrder":214,"parent":216,"blurb":6,"path":322},"\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example\u002F",1787843652436]