[{"data":1,"prerenderedAt":610},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor\u002F":3,"docs-nav":157},{"id":4,"title":5,"body":6,"description":19,"extension":145,"layout":146,"meta":147,"navGroup":146,"navGroupOrder":146,"navOrder":146,"navTitle":148,"navigation":149,"originalPath":150,"path":151,"redirect":146,"seo":152,"stem":153,"updated":154,"version":155,"__hash__":156},"docs\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor.md","Enabling the device editor",{"type":7,"value":8,"toc":143},"minimark",[9,13,139],[10,11,5],"h1",{"id":12},"enabling-the-device-editor",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sequenceDiagram\n    User->>FrontEnd: Clicks 'open editor' against device\n    FrontEnd->>+Forge: PUT \u002Fapi\u002Fv1\u002Fdevices\u002F:id\u002Feditor { tunnel: 'enable' }\n    Forge->Forge: Generates \u003Ctoken>\n    Forge--)Device: Publishes command to establish connection with \u003Ctoken>\n    Device--)Forge: WS Connect \u002Fapi\u002Fv1\u002Fdevices\u002F:id\u002Feditor\u002Fcomms\u002F:token\n    \n    Forge->>-FrontEnd: Returns session identifier\n    FrontEnd->>FrontEnd: Opens \u002Fdevice\u002F\u003Cid>\u002Feditor\u002F\n    FrontEnd-->+Forge: Sends requests to \u002Fdevice\u002F\u003Cid>\u002Feditor\u002F**\n    Forge--)+Device: Request proxied over WebSocket\n    Device-->>Editor: Performs request on local Node-RED\n    Editor-->>Device: Returns response\n    Device-->>-Forge: Streams response back\n    Forge-->>-FrontEnd: Streams response back\n    User->>FrontEnd: User navigates away\n    FrontEnd-->Forge: Node-RED WebSocket closes\n    Note over Forge: if no active WebSockets for this device\n    Forge--)Device: Close WebSocket\n","mermaid","",[21,22,23,31,37,43,49,55,61,67,73,79,85,91,97,103,109,115,121,127,133],"code",{"__ignoreMap":19},[24,25,28],"span",{"class":26,"line":27},"line",1,[24,29,30],{},"sequenceDiagram\n",[24,32,34],{"class":26,"line":33},2,[24,35,36],{},"    User->>FrontEnd: Clicks 'open editor' against device\n",[24,38,40],{"class":26,"line":39},3,[24,41,42],{},"    FrontEnd->>+Forge: PUT \u002Fapi\u002Fv1\u002Fdevices\u002F:id\u002Feditor { tunnel: 'enable' }\n",[24,44,46],{"class":26,"line":45},4,[24,47,48],{},"    Forge->Forge: Generates \u003Ctoken>\n",[24,50,52],{"class":26,"line":51},5,[24,53,54],{},"    Forge--)Device: Publishes command to establish connection with \u003Ctoken>\n",[24,56,58],{"class":26,"line":57},6,[24,59,60],{},"    Device--)Forge: WS Connect \u002Fapi\u002Fv1\u002Fdevices\u002F:id\u002Feditor\u002Fcomms\u002F:token\n",[24,62,64],{"class":26,"line":63},7,[24,65,66],{},"    \n",[24,68,70],{"class":26,"line":69},8,[24,71,72],{},"    Forge->>-FrontEnd: Returns session identifier\n",[24,74,76],{"class":26,"line":75},9,[24,77,78],{},"    FrontEnd->>FrontEnd: Opens \u002Fdevice\u002F\u003Cid>\u002Feditor\u002F\n",[24,80,82],{"class":26,"line":81},10,[24,83,84],{},"    FrontEnd-->+Forge: Sends requests to \u002Fdevice\u002F\u003Cid>\u002Feditor\u002F**\n",[24,86,88],{"class":26,"line":87},11,[24,89,90],{},"    Forge--)+Device: Request proxied over WebSocket\n",[24,92,94],{"class":26,"line":93},12,[24,95,96],{},"    Device-->>Editor: Performs request on local Node-RED\n",[24,98,100],{"class":26,"line":99},13,[24,101,102],{},"    Editor-->>Device: Returns response\n",[24,104,106],{"class":26,"line":105},14,[24,107,108],{},"    Device-->>-Forge: Streams response back\n",[24,110,112],{"class":26,"line":111},15,[24,113,114],{},"    Forge-->>-FrontEnd: Streams response back\n",[24,116,118],{"class":26,"line":117},16,[24,119,120],{},"    User->>FrontEnd: User navigates away\n",[24,122,124],{"class":26,"line":123},17,[24,125,126],{},"    FrontEnd-->Forge: Node-RED WebSocket closes\n",[24,128,130],{"class":26,"line":129},18,[24,131,132],{},"    Note over Forge: if no active WebSockets for this device\n",[24,134,136],{"class":26,"line":135},19,[24,137,138],{},"    Forge--)Device: Close WebSocket\n",[140,141,142],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":19,"searchDepth":45,"depth":45,"links":144},[],"md",null,{},"Device Editor",true,"contribute\u002Fworkflows\u002Fdevice-editor.md","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",{"title":5,"description":19},"docs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor","2024-07-11 18:05:53 +0530","2.33.2","_mNeFOU3wzy3x4YI-J9GaBb7jb9kwqC38yJMxcXYp_8",[158,165,184,195],{"name":159,"order":27,"children":160},"FlowFuse User Manuals",[161],{"title":162,"path":163,"group":159,"groupOrder":27,"order":33,"children":164},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"name":166,"order":45,"children":167},"FlowFuse Self-Hosted",[168,172],{"title":169,"path":170,"group":166,"groupOrder":45,"order":27,"children":171},"Quick Start","\u002Fdocs\u002Fquick-start",[],{"title":173,"path":174,"group":166,"groupOrder":45,"order":39,"children":175},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[176,180],{"title":177,"path":178,"order":146,"children":179},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":181,"path":182,"order":146,"children":183},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"name":185,"order":51,"children":186},"Support",[187,191],{"title":188,"path":189,"group":185,"groupOrder":51,"order":39,"children":190},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":192,"path":193,"group":185,"groupOrder":51,"order":146,"children":194},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":196,"order":146,"children":197},"Other",[198,246,258,335,383,402,476,487],{"title":199,"path":200,"order":146,"children":201},"admin","\u002Fdocs\u002Fadmin",[202,206,218,226,230,234,238,242],{"title":203,"path":204,"order":27,"children":205},"Administering FlowFuse","\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":207,"path":208,"order":146,"children":209},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[210,214],{"title":211,"path":212,"order":146,"children":213},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":215,"path":216,"order":146,"children":217},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":219,"path":220,"order":146,"children":221},"hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[222],{"title":223,"path":224,"order":146,"children":225},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":227,"path":228,"order":146,"children":229},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":231,"path":232,"order":146,"children":233},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":235,"path":236,"order":146,"children":237},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":239,"path":240,"order":146,"children":241},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":243,"path":244,"order":146,"children":245},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"title":247,"path":248,"order":146,"children":249},"cloud","\u002Fdocs\u002Fcloud",[250,254],{"title":251,"path":252,"order":27,"children":253},"Introduction","\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":255,"path":256,"order":146,"children":257},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"title":259,"path":260,"order":146,"children":261},"contribute","\u002Fdocs\u002Fcontribute",[262,265,269,273,277,281,285,293,327,331],{"title":251,"path":263,"order":27,"children":264},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":266,"path":267,"order":146,"children":268},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":270,"path":271,"order":146,"children":272},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":274,"path":275,"order":146,"children":276},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":278,"path":279,"order":146,"children":280},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":282,"path":283,"order":146,"children":284},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":286,"path":287,"order":146,"children":288},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[289],{"title":290,"path":291,"order":146,"children":292},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":294,"path":295,"order":146,"children":296},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[297,299,303,307,311,315,319,323],{"title":148,"path":151,"order":146,"children":298},[],{"title":300,"path":301,"order":146,"children":302},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":304,"path":305,"order":146,"children":306},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":308,"path":309,"order":146,"children":310},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":312,"path":313,"order":146,"children":314},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":316,"path":317,"order":146,"children":318},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":320,"path":321,"order":146,"children":322},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":324,"path":325,"order":146,"children":326},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":328,"path":329,"order":146,"children":330},"Team Broker","\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":332,"path":333,"order":146,"children":334},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"title":336,"path":337,"order":146,"children":338},"device-agent","\u002Fdocs\u002Fdevice-agent",[339,343,346,350,354,358],{"title":340,"path":341,"order":27,"children":342},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":169,"path":344,"order":33,"children":345},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":347,"path":348,"order":45,"children":349},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":351,"path":352,"order":51,"children":353},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":355,"path":356,"order":57,"children":357},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":359,"path":360,"order":146,"children":361},"install","\u002Fdocs\u002Fdevice-agent\u002Finstall",[362,367,371,375,379],{"title":363,"path":364,"group":365,"order":27,"children":366},"Overview","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview","DeviceAgentInstallation",[],{"title":368,"path":369,"group":365,"order":33,"children":370},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":372,"path":373,"group":365,"order":39,"children":374},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":376,"path":377,"group":365,"order":45,"children":378},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":380,"path":381,"group":365,"order":51,"children":382},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":384,"path":385,"order":146,"children":386},"hardware","\u002Fdocs\u002Fhardware",[387,390,394,398],{"title":363,"path":388,"order":27,"children":389},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":391,"path":392,"order":33,"children":393},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":395,"path":396,"order":39,"children":397},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":399,"path":400,"order":39,"children":401},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"title":359,"path":403,"order":146,"children":404},"\u002Fdocs\u002Finstall",[405,408,412,416,436,440,444,448],{"title":363,"path":406,"order":27,"children":407},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":409,"path":410,"order":146,"children":411},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":413,"path":414,"order":146,"children":415},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":417,"path":418,"order":146,"children":419},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[420,424,428,432],{"title":421,"path":422,"order":146,"children":423},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":425,"path":426,"order":146,"children":427},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":429,"path":430,"order":146,"children":431},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":433,"path":434,"order":146,"children":435},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":437,"path":438,"order":146,"children":439},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":441,"path":442,"order":146,"children":443},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":445,"path":446,"order":146,"children":447},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":449,"path":450,"order":146,"children":451},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[452,456,460,464,468,472],{"title":453,"path":454,"order":146,"children":455},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":457,"path":458,"order":146,"children":459},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":461,"path":462,"order":146,"children":463},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":465,"path":466,"order":146,"children":467},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":469,"path":470,"order":146,"children":471},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":473,"path":474,"order":146,"children":475},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":477,"path":478,"order":146,"children":479},"migration","\u002Fdocs\u002Fmigration",[480,483],{"title":251,"path":481,"order":27,"children":482},"\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":484,"path":485,"order":146,"children":486},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":488,"path":489,"order":146,"children":490},"user","\u002Fdocs\u002Fuser",[491,495,499,503,507,511,515,519,523,527,531,535,547,551,555,559,563,567,571,575,579,583,587,591,595,599,602,606],{"title":492,"path":493,"order":27,"children":494},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":496,"path":497,"order":27,"children":498},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":500,"path":501,"order":33,"children":502},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":504,"path":505,"order":33,"children":506},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":508,"path":509,"order":81,"children":510},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":512,"path":513,"order":146,"children":514},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":516,"path":517,"order":146,"children":518},"Custom Hostnames","\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":520,"path":521,"order":146,"children":522},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":524,"path":525,"order":146,"children":526},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":528,"path":529,"order":146,"children":530},"DevOps Pipelines","\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":532,"path":533,"order":146,"children":534},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":536,"path":537,"order":146,"children":538},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[539,543],{"title":540,"path":541,"order":146,"children":542},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":544,"path":545,"order":146,"children":546},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":548,"path":549,"order":146,"children":550},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":552,"path":553,"order":146,"children":554},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":556,"path":557,"order":146,"children":558},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":560,"path":561,"order":146,"children":562},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":564,"path":565,"order":146,"children":566},"FlowFuse Tables","\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":568,"path":569,"order":146,"children":570},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":572,"path":573,"order":146,"children":574},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":576,"path":577,"order":146,"children":578},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":580,"path":581,"order":146,"children":582},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":584,"path":585,"order":146,"children":586},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":588,"path":589,"order":146,"children":590},"Role-Based Access Control","\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":592,"path":593,"order":146,"children":594},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":596,"path":597,"order":146,"children":598},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":328,"path":600,"order":146,"children":601},"\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":603,"path":604,"order":146,"children":605},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":607,"path":608,"order":146,"children":609},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],1786546037970]