[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"application-guide-nav":3,"agmd-flowfuse-worked-example":118},[4,12,16,22,25,31,36,42,47,53,58,64,70,75,81,87,93,98,103,108,112],{"guide":5,"slug":6,"title":7,"navOrder":8,"parent":9,"blurb":10,"path":11},"flowfuse","overview","Overview",1,null,"The map of the FlowFuse guide — apps, architectures, and a worked example.","\u002Fapplication-guide\u002Fflowfuse\u002Foverview\u002F",{"guide":13,"slug":6,"title":7,"navOrder":8,"parent":9,"blurb":14,"path":15},"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":5,"slug":17,"title":18,"navOrder":19,"parent":9,"blurb":20,"path":21},"foundations","Foundations",2,"The foundation to build on: what FlowFuse is, its core pieces, and how code is shared across teams.","\u002Fapplication-guide\u002Fflowfuse\u002Ffoundations\u002F",{"guide":13,"slug":17,"title":18,"navOrder":19,"parent":9,"blurb":23,"path":24},"The handful of concepts you need to build with Node-RED, and how they fit together.","\u002Fapplication-guide\u002Fnode-red\u002Ffoundations\u002F",{"guide":5,"slug":26,"title":27,"navOrder":28,"parent":9,"blurb":29,"path":30},"app-delivery-methods","App delivery methods",3,"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.","\u002Fapplication-guide\u002Fflowfuse\u002Fapp-delivery-methods\u002F",{"guide":13,"slug":32,"title":33,"navOrder":28,"parent":9,"blurb":34,"path":35},"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":5,"slug":37,"title":38,"navOrder":39,"parent":26,"blurb":40,"path":41},"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).","\u002Fapplication-guide\u002Fflowfuse\u002Fhardware-apps\u002F",{"guide":13,"slug":43,"title":44,"navOrder":39,"parent":32,"blurb":45,"path":46},"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":5,"slug":48,"title":49,"navOrder":50,"parent":26,"blurb":51,"path":52},"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).","\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps\u002F",{"guide":13,"slug":54,"title":55,"navOrder":50,"parent":32,"blurb":56,"path":57},"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":13,"slug":59,"title":60,"navOrder":61,"parent":32,"blurb":62,"path":63},"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":5,"slug":65,"title":66,"navOrder":67,"parent":9,"blurb":68,"path":69},"data-plane","Data plane",4,"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":13,"slug":71,"title":72,"navOrder":67,"parent":9,"blurb":73,"path":74},"worked-examples","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":13,"slug":76,"title":77,"navOrder":78,"parent":71,"blurb":79,"path":80},"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.","\u002Fapplication-guide\u002Fnode-red\u002Foee-edge-aggregator\u002F",{"guide":13,"slug":82,"title":83,"navOrder":84,"parent":71,"blurb":85,"path":86},"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.","\u002Fapplication-guide\u002Fnode-red\u002Foee-central-dashboard\u002F",{"guide":5,"slug":88,"title":89,"navOrder":90,"parent":9,"blurb":91,"path":92},"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":5,"slug":94,"title":95,"navOrder":96,"parent":88,"blurb":9,"path":97},"it-architectures","IT architectures",5.1,"\u002Fapplication-guide\u002Fflowfuse\u002Fit-architectures\u002F",{"guide":5,"slug":99,"title":100,"navOrder":101,"parent":88,"blurb":9,"path":102},"ot-architectures","OT architectures",5.2,"\u002Fapplication-guide\u002Fflowfuse\u002Fot-architectures\u002F",{"guide":5,"slug":104,"title":105,"navOrder":106,"parent":88,"blurb":9,"path":107},"iiot-architectures","IIoT architectures",5.3,"\u002Fapplication-guide\u002Fflowfuse\u002Fiiot-architectures\u002F",{"guide":5,"slug":71,"title":72,"navOrder":109,"parent":9,"blurb":110,"path":111},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":5,"slug":113,"title":114,"navOrder":115,"parent":71,"blurb":116,"path":117},"worked-example","OEE, end to end",6.1,"One use case — OEE across three lines — broken into two apps and two shared services, then drawn out end to end.","\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example\u002F",{"id":119,"title":114,"blurb":116,"body":120,"description":307,"extension":316,"guide":5,"meta":317,"navOrder":115,"navTitle":114,"navigation":318,"parent":71,"path":319,"seo":320,"slug":113,"stem":321,"__hash__":322},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example.md",{"type":121,"value":122,"toc":306},"minimark",[123,127,132,140,146,157,161,166,172,216,220,225,259,263,277,281,288],[124,125,114],"h1",{"id":126},"oee-end-to-end",[128,129,131],"h2",{"id":130},"the-use-case","The use case",[133,134,135,139],"p",{},[136,137,138],"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.",[133,141,142,145],{},[136,143,144],{},"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.",[133,147,148,149,152,153,156],{},"It's not one app. OEE takes ",[136,150,151],{},"two apps"," — one at the edge, one in the cloud — joined by ",[136,154,155],{},"two shared services"," (a broker and a history store).",[128,158,160],{"id":159},"the-apps","The apps",[162,163,165],"h3",{"id":164},"_1-oee-edge-aggregator","1 · OEE - Edge Aggregator",[133,167,168,171],{},[136,169,170],{},"What it does"," — Reads the machine signals on a line and publishes the line's state.",[173,174,175,187,196,202,208],"ul",{},[176,177,178,181,182,186],"li",{},[136,179,180],{},"Delivery method"," — ",[183,184,185],"a",{"href":30},"whole app",": promoted as a snapshot through a pipeline to a Remote Instance on every line.",[176,188,189,181,192,195],{},[136,190,191],{},"App pattern",[183,193,194],{"href":41},"hardware app · Configurable App",": the same build everywhere, with each line's PLC tag names loaded as per-site config.",[176,197,198,201],{},[136,199,200],{},"Runs on"," — a Remote Instance, one per line.",[176,203,204,207],{},[136,205,206],{},"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.",[176,209,210,181,213],{},[136,211,212],{},"See the flow",[183,214,215],{"href":80},"how OEE - Edge Aggregator is built in Node-RED →",[162,217,219],{"id":218},"_2-oee-central-dashboard","2 · OEE - Central Dashboard",[133,221,222,224],{},[136,223,170],{}," — Subscribes to the line states, computes availability, performance and quality, and presents the live OEE dashboard.",[173,226,227,234,242,247,252],{},[176,228,229,181,231,233],{},[136,230,180],{},[183,232,185],{"href":30},": promoted dev → staging → prod as one versioned build.",[176,235,236,181,238,241],{},[136,237,191],{},[183,239,240],{"href":52},"software app · Data-Driven App",".",[176,243,244,246],{},[136,245,200],{}," — a Hosted Instance in the cloud.",[176,248,249,251],{},[136,250,206],{}," — it's a user-facing app driven by live data, with no hardware of its own; one instance serves the whole plant.",[176,253,254,181,256],{},[136,255,212],{},[183,257,258],{"href":86},"how OEE - Central Dashboard is built in Node-RED →",[162,260,262],{"id":261},"shared-services","Shared services",[173,264,265,271],{},[176,266,267,270],{},[136,268,269],{},"Team Broker (MQTT · UNS)"," — carries line state from edge to cloud. The edge publishes to a topic; the dashboard subscribes. Neither references the other.",[176,272,273,276],{},[136,274,275],{},"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.",[128,278,280],{"id":279},"the-full-architecture","The full architecture",[282,283],"arch-diagram",{":edges":284,":groups":285,":legend":286,":nodes":287},"[{\"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}]",[289,290,292],"callout",{"icon":291},"i-lucide-quote",[133,293,294,297,298,301,302,305],{},[136,295,296],{},"The architecture, in one sentence"," — OEE is the ",[136,299,300],{},"Edge Aggregator"," (a hardware Configurable App, on a Remote Instance per line) publishing machine state over the Team Broker to the ",[136,303,304],{},"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":307,"searchDepth":67,"depth":67,"links":308},"",[309,310,315],{"id":130,"depth":19,"text":131},{"id":159,"depth":19,"text":160,"children":311},[312,313,314],{"id":164,"depth":28,"text":165},{"id":218,"depth":28,"text":219},{"id":261,"depth":28,"text":262},{"id":279,"depth":19,"text":280},"md",{},true,"\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example",{"title":114,"description":307},"application-guide\u002Fflowfuse\u002Fworked-example","n3Y7j3EdZtJMGrtKrDGh6letPk3_Yn55OgpveECwrCI",1787068105989]