[{"data":1,"prerenderedAt":353},["ShallowReactive",2],{"application-guide-nav":3,"agmd-flowfuse-hardware-apps":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":38,"blurb":40,"body":120,"description":132,"extension":346,"guide":5,"meta":347,"navOrder":39,"navTitle":38,"navigation":348,"parent":26,"path":349,"seo":350,"slug":37,"stem":351,"__hash__":352},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fhardware-apps.md",{"type":121,"value":122,"toc":343},"minimark",[123,126,133,135],[124,125,38],"h1",{"id":37},[127,128,129],"p",{},[130,131,132],"strong",{},"Hardware apps — start here",[127,134,40],{},[136,137,138,214,279],"guide-tabs",{},[139,140,142,147,150,156,162,167,195,200],"guide-tab",{"label":141},"Packaged App",[143,144],"flow-diagram",{":edges":145,":nodes":146},"[{\"from\":\"snap\",\"to\":\"inst\",\"label\":\"deploy · sealed\",\"accent\":\"slate\"}]","[{\"id\":\"snap\",\"label\":\"Pipeline snapshot\",\"sub\":\"sealed · built once\",\"accent\":\"indigo\"},{\"id\":\"inst\",\"label\":\"Remote Instance\",\"sub\":\"identical\",\"accent\":\"indigo\",\"many\":true}]",[127,148,149],{},"A sealed product that ships on a piece of hardware and is identical everywhere — buy it, it runs on its device, nothing to configure.",[127,151,152,155],{},[130,153,154],{},"Use it when"," — The app ships with a known partner device and the data it reads is fixed by that hardware.",[127,157,158,161],{},[130,159,160],{},"How it works"," — Built and promoted through a pipeline (dev → staging → prod), then deployed to a Remote Instance as a snapshot. Everything is baked in; only fixed env vars vary at deploy.",[127,163,164],{},[130,165,166],{},"Major components",[168,169,170,177,183,189],"ul",{},[171,172,173,176],"li",{},[130,174,175],{},"Pipeline snapshot"," — the app built once, promoted to the device",[171,178,179,182],{},[130,180,181],{},"Remote Instance (edge device)"," — FlowFuse-managed Node-RED running the sealed app",[171,184,185,188],{},[130,186,187],{},"Team Broker (MQTT)"," — carries the app's events to subscribers",[171,190,191,194],{},[130,192,193],{},"FlowFuse Tables"," — stores the rows the app writes",[127,196,197],{},[130,198,199],{},"Where config & data live",[168,201,202,208],{},[171,203,204,207],{},[130,205,206],{},"Config"," — baked into the snapshot; only fixed env vars at deploy, nothing per-site.",[171,209,210,213],{},[130,211,212],{},"Data"," — events to the Team Broker, records to FlowFuse Tables.",[139,215,217,222,225,230,235,239,263,267],{"label":216},"Configurable App",[143,218],{":edges":219,":nodes":220,":legend":221},"[{\"from\":\"snap\",\"to\":\"inst\",\"label\":\"same build\",\"accent\":\"slate\"},{\"from\":\"cfg\",\"to\":\"inst\",\"label\":\"loads its own config\",\"accent\":\"red\",\"dashed\":true}]","[{\"id\":\"snap\",\"label\":\"Pipeline snapshot\",\"sub\":\"same build\",\"accent\":\"indigo\",\"col\":1,\"row\":1},{\"id\":\"cfg\",\"label\":\"Per-site config\",\"sub\":\"tags · broker · site\",\"accent\":\"slate\",\"col\":1,\"row\":2},{\"id\":\"inst\",\"label\":\"Remote Instance\",\"sub\":\"per site\",\"accent\":\"indigo\",\"many\":true,\"col\":2,\"row\":1}]","[{\"line\":\"slate\",\"label\":\"same build\"},{\"line\":\"red\",\"dashed\":true,\"label\":\"loads its own config\"}]",[127,223,224],{},"The same shelf product, plus a few knobs — tag names, broker address, site name — that differ per site and live on the Remote Instance.",[127,226,227,229],{},[130,228,154],{}," — The flows are the same everywhere but the values they use differ per install and may change over time.",[127,231,232,234],{},[130,233,160],{}," — Same pipeline delivery to a Remote Instance; the runtime loads a per-site config from a file on the device. Back that file up to the database, so a device swap restores the config — the device is the source of truth, the DB is the safety net.",[127,236,237],{},[130,238,166],{},[168,240,241,246,251,257],{},[171,242,243,245],{},[130,244,175],{}," — the same build promoted to every device",[171,247,248,250],{},[130,249,181],{}," — runs the app and loads its own per-site config",[171,252,253,256],{},[130,254,255],{},"Per-site config (tags · broker · site)"," — a file on the device, backed up to the DB",[171,258,259,262],{},[130,260,261],{},"Team Broker \u002F FlowFuse Tables"," — event egress + records",[127,264,265],{},[130,266,199],{},[168,268,269,274],{},[171,270,271,273],{},[130,272,206],{}," — a per-site file on the device (tags, broker address, site name), backed up to FlowFuse Tables so a swap restores it.",[171,275,276,278],{},[130,277,212],{}," — Team Broker + FlowFuse Tables.",[139,280,282,286,289,294,299,303,327,331],{"label":281},"Edge Building Block",[143,283],{":edges":284,":nodes":285},"[{\"from\":\"eq\",\"to\":\"inst\",\"label\":\"reads\"},{\"from\":\"inst\",\"to\":\"broker\",\"label\":\"publishes\",\"accent\":\"slate\"}]","[{\"id\":\"eq\",\"label\":\"Equipment\",\"sub\":\"signals \u002F PLC\",\"accent\":\"slate\"},{\"id\":\"inst\",\"label\":\"Remote Instance\",\"sub\":\"edge building block\",\"accent\":\"indigo\"},{\"id\":\"broker\",\"label\":\"Team Broker\",\"sub\":\"MQTT\",\"accent\":\"indigo\"}]",[127,287,288],{},"Not a finished app — one hardware-facing block plus example flows, running on a Remote Instance. You assemble everything upstream of it yourself.",[127,290,291,293],{},[130,292,154],{}," — The hardware-facing piece is reusable, but everything before it differs so much per site that no finished app would fit.",[127,295,296,298],{},[130,297,160],{}," — Blocks are published as subflows to the Team Library with an example flow. Consumers drop them onto a Remote Instance and wire them up.",[127,300,301],{},[130,302,166],{},[168,304,305,311,316,321],{},[171,306,307,310],{},[130,308,309],{},"Equipment (signals \u002F PLC)"," — the source hardware the block reads",[171,312,313,315],{},[130,314,181],{}," — runs the edge building block at the line",[171,317,318,320],{},[130,319,187],{}," — publishes the normalized data upstream",[171,322,323,326],{},[130,324,325],{},"Team Library"," — where the block is published as an installable subflow",[127,328,329],{},[130,330,199],{},[168,332,333,338],{},[171,334,335,337],{},[130,336,206],{}," — lives in the consuming flow you build around the block (env \u002F context).",[171,339,340,342],{},[130,341,212],{}," — Team Broker (normalized, upstream).",{"title":344,"searchDepth":67,"depth":67,"links":345},"",[],"md",{},true,"\u002Fapplication-guide\u002Fflowfuse\u002Fhardware-apps",{"title":38,"description":132},"application-guide\u002Fflowfuse\u002Fhardware-apps","FFkzfpAW4Jgn6CD1bZb4-90kNzSetNbm4UtDnLivoFg",1787068105605]