[{"data":1,"prerenderedAt":8771},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fopcua\u002F":3,"featureCatalog":7325,"docs-nav":7728},{"id":4,"title":5,"body":6,"description":16,"editUrl":7314,"extension":7315,"layout":7316,"meta":7317,"metaTitle":5,"navGroup":7316,"navGroupOrder":7316,"navOrder":7318,"navTitle":7319,"navigation":2112,"originalPath":7316,"path":7320,"redirect":7316,"seo":7321,"stem":7322,"updated":7323,"version":7316,"__hash__":7324},"docs\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fopcua.md","OPC UA for FlowFuse - FlowFuse Certified Node",{"type":7,"value":8,"toc":7222},"minimark",[9,13,17,31,36,148,152,155,158,163,193,197,200,205,221,225,231,294,298,310,314,353,356,365,383,399,403,406,504,516,528,532,535,619,626,633,639,646,660,664,667,764,768,806,818,822,829,896,908,912,974,978,1033,1051,1055,1068,1088,1098,1105,1112,1116,1119,1128,1135,1139,1159,1185,1189,1238,1242,1348,1351,1395,1398,1441,1451,1458,1461,1526,1530,1533,1536,1549,1553,1703,1709,1712,1756,1759,1876,1879,1996,1999,2252,2256,2279,2283,2345,2357,2361,2364,2370,2376,2454,2457,2461,2464,2468,2488,2513,2600,2603,2704,2708,2800,2804,2807,2814,2818,2844,2860,2863,2875,2879,2918,2926,2930,2998,3002,3018,3021,3076,3079,3082,3085,3113,3116,3119,3139,3151,3155,3161,3199,3211,3215,3218,3222,3254,3260,3264,3286,3324,3353,3357,3401,3411,3414,3420,3439,3443,3450,3454,3499,3506,3533,3539,3668,3674,3678,3681,3685,3699,3702,3706,3709,3810,3814,3856,3875,3884,4019,4023,4026,4032,4044,4048,4051,4055,4078,4082,4146,4157,4161,4217,4220,4260,4286,4408,4412,4469,4484,4488,4501,4504,4559,4563,4624,4646,4650,4672,4720,4724,4747,4751,4802,4824,4828,4839,4851,4873,4888,4892,4895,4901,4926,5353,5448,5487,5495,5666,5712,5716,5731,5923,5927,5937,6043,6047,6068,6073,6224,6241,6244,6248,6255,6392,6396,6405,6519,6523,6532,6638,6641,6645,6675,6706,6710,6726,6736,6756,6760,6783,6824,6828,6831,6891,6894,6898,7212,7218],[10,11,5],"h1",{"id":12},"opc-ua-for-flowfuse-flowfuse-certified-node",[14,15,16],"p",{},"Connect a FlowFuse instance to industrial OPC UA servers. Read and write values, monitor changes in real time, call methods, browse the address space, read history, work with files, or host your own OPC UA server, all from within your flows.",[14,18,19,20,24,25,30],{},"This is a ",[21,22,23],"strong",{},"FlowFuse Certified Node",". Unlike community nodes, which vary in quality and can go unmaintained without warning, FlowFuse vets Certified Nodes for quality, security, and support, and maintains them on an ongoing basis. ",[26,27,29],"a",{"href":28},"\u002Fblog\u002F2025\u002F07\u002Fcertified-nodes-v2\u002F","Read more about Certified Nodes",".",[32,33,35],"h2",{"id":34},"table-of-contents","Table of contents",[37,38,39,46,52,58,64,70,76,82,88,94,100,106,112,118,124,130,136,142],"ol",{},[40,41,42],"li",{},[26,43,45],{"href":44},"#_1-overview","Overview",[40,47,48],{},[26,49,51],{"href":50},"#_2-get-the-certified-node-in-flowfuse","Get the certified node in FlowFuse",[40,53,54],{},[26,55,57],{"href":56},"#_3-the-node-set","The node set",[40,59,60],{},[26,61,63],{"href":62},"#_4-nodeids-and-how-to-address-data","NodeIds and how to address data",[40,65,66],{},[26,67,69],{"href":68},"#_5-configure-a-connection","Configure a connection",[40,71,72],{},[26,73,75],{"href":74},"#_6-read","Read",[40,77,78],{},[26,79,81],{"href":80},"#_7-write","Write",[40,83,84],{},[26,85,87],{"href":86},"#_8-extension-object","Extension Object",[40,89,90],{},[26,91,93],{"href":92},"#_9-call","Call",[40,95,96],{},[26,97,99],{"href":98},"#_10-monitor","Monitor",[40,101,102],{},[26,103,105],{"href":104},"#_11-monitor-event","Monitor Event",[40,107,108],{},[26,109,111],{"href":110},"#_12-browse","Browse",[40,113,114],{},[26,115,117],{"href":116},"#_13-explore","Explore",[40,119,120],{},[26,121,123],{"href":122},"#_14-history-read","History Read",[40,125,126],{},[26,127,129],{"href":128},"#_15-file-operation","File Operation",[40,131,132],{},[26,133,135],{"href":134},"#_16-hosting-an-opc-ua-server","Hosting an OPC UA server",[40,137,138],{},[26,139,141],{"href":140},"#_17-network-requirements","Network requirements",[40,143,144],{},[26,145,147],{"href":146},"#_18-troubleshooting","Troubleshooting",[32,149,151],{"id":150},"_1-overview","1. Overview",[14,153,154],{},"OPC UA (Unified Architecture) is the leading standard for industrial communication, supported by thousands of devices and systems. This certified node lets a FlowFuse instance act as an OPC UA client and, on self-hosted FlowFuse, as an OPC UA server.",[14,156,157],{},"Everything runs inside your FlowFuse instance. Connections, certificates, and credentials live alongside the rest of your flow configuration. Define a connection once and every OPC UA node in the instance shares it. Client and server nodes share a single certificate store, so a trust decision you make for one applies to the other.",[159,160,162],"h3",{"id":161},"capabilities","Capabilities",[164,165,166,169,172,175,178,181,184,187,190],"ul",{},[40,167,168],{},"Connect to one or many OPC UA servers, with optional security and authentication.",[40,170,171],{},"Read single values, all attributes, arrays, or values mapped into a structured object.",[40,173,174],{},"Write single values, batches, arrays, matrices, and complex extension-object structures.",[40,176,177],{},"Monitor in real time through subscriptions, with deadband filtering and event\u002Falarm monitoring.",[40,179,180],{},"Call methods to drive device operations.",[40,182,183],{},"Discover the address space through Browse (one level) and Explore (recursive).",[40,185,186],{},"Access historical data, raw, modified, and aggregated.",[40,188,189],{},"Read, write, and append files on servers that implement the OPC UA FileType interface.",[40,191,192],{},"Host an OPC UA server from within a self-hosted FlowFuse instance using Function nodes.",[159,194,196],{"id":195},"use-case","Use case",[14,198,199],{},"Most industrial equipment already speaks OPC UA, but the data usually stays inside the machine's own server: readable by the vendor's tools, invisible to dashboards, brokers, and databases. This certified node closes that gap. A FlowFuse instance connects to the equipment as an OPC UA client, so the values, alarms, and history locked inside each machine become ordinary flow data you can route, transform, and act on. On self-hosted FlowFuse it also works in the other direction, exposing flow data as an OPC UA server for SCADA systems and historians to consume.",[201,202,204],"h4",{"id":203},"example-connecting-a-filling-machine-to-the-plant","Example: connecting a filling machine to the plant",[14,206,207,208,212,213,216,217,220],{},"A filling machine exposes ",[209,210,211],"code",{},"FillLevel",", ",[209,214,215],{},"LineSpeed",", and an alarm hierarchy through its embedded OPC UA server. Today that data lives on the machine's own panel. With one shared connection, a Monitor node streams the process values into the plant's Unified Namespace over MQTT, with a deadband filter suppressing sensor jitter before it ever reaches the network. A Monitor Event node subscribed with ",[209,218,219],{},"Severity >= 600"," routes machine alarms to the maintenance team's chat channel. And when the recipe changes, a Write node, gated behind an operator confirmation on a dashboard, pushes the new fill setpoint back to the machine. One connection replaces a per-machine SCADA tag mapping exercise, and the same flow pattern repeats for every OPC UA machine on the floor.",[201,222,224],{"id":223},"where-this-shows-up-in-practice","Where this shows up in practice",[14,226,227,228,230],{},"Real deployments usually combine several of the nodes on a single shared connection (see ",[26,229,57],{"href":56}," for what each one does):",[164,232,233,242,257,266,275,284],{},[40,234,235,238,239,241],{},[21,236,237],{},"Unified Namespace and broker integration",": subscribe to the variables that matter with ",[26,240,99],{"href":98}," and publish changes to MQTT, so every system in the plant consumes the same live equipment data instead of integrating with each machine separately.",[40,243,244,247,248,250,251,253,254,256],{},[21,245,246],{},"Supervisory control",": fetch current values on demand with ",[26,249,75],{"href":74},", push setpoints and recipe parameters back with ",[26,252,81],{"href":80},", and invoke machine operations such as starting a batch or acknowledging an alarm with ",[26,255,93],{"href":92},". Writes change real-world state, so gate them behind validation or an operator confirmation step.",[40,258,259,262,263,265],{},[21,260,261],{},"Alarm-driven maintenance",": subscribe to a server's alarms and events with ",[26,264,105],{"href":104},", filter by type and severity on the server side, and route what remains to notifications, dashboards, or logs, so the maintenance team hears about a fault from the machine, not from the operator.",[40,267,268,271,272,274],{},[21,269,270],{},"Shift reports, trends, and audits",": pull raw or server-aggregated values over a time range with ",[26,273,123],{"href":122}," to build end-of-shift reports, quality trends, and incident timelines from data the equipment already recorded.",[40,276,277,280,281,283],{},[21,278,279],{},"Fast commissioning",": map a machine's entire address space with ",[26,282,117],{"href":116}," and feed the result straight into a Monitor node, turning hours of manual tag mapping into a single deploy.",[40,285,286,289,290,293],{},[21,287,288],{},"Exposing flow data to SCADA and historians",": on self-hosted FlowFuse, ",[26,291,292],{"href":134},"host an OPC UA server"," so external OPC UA clients, including another FlowFuse instance, can read the data your flows produce. This is not available on FlowFuse Cloud.",[32,295,297],{"id":296},"_2-get-the-certified-node-in-flowfuse","2. Get the Certified Node in FlowFuse",[14,299,300,301,304,305,309],{},"FlowFuse delivers Certified Nodes to your instances as a managed catalogue. The OPC UA package is part of the FlowFuse Edge Certified Nodes catalogue, which is part of the ",[21,302,303],{},"FlowFuse Edge"," offering. ",[26,306,308],{"href":307},"\u002Fcontact-us\u002F","contact us"," to enable it for your team",[159,311,313],{"id":312},"installation-steps","Installation steps",[37,315,316,319,322,328,335,342,348],{},[40,317,318],{},"Open your instance in the FlowFuse editor.",[40,320,321],{},"Click the menu icon (☰) in the top-right corner.",[40,323,324,325,30],{},"Select ",[21,326,327],{},"Manage palette",[40,329,330,331,334],{},"Go to the ",[21,332,333],{},"Install"," tab.",[40,336,337,338,341],{},"Switch to the ",[21,339,340],{},"FlowFuse Edge Certified Nodes"," category.",[40,343,344,345,30],{},"Search for ",[209,346,347],{},"@flowfuse-certified-nodes\u002Fopcua",[40,349,350,351,30],{},"Click ",[21,352,333],{},[14,354,355],{},"The OPC UA nodes then appear in your palette, ready to drag onto the canvas.",[14,357,358],{},[359,360],"img",{"alt":361,"dataZoomable":362,"src":363,"title":364},"\"The OPC UA nodes in the Node-RED palette\"","","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fnode-palette.png","The OPC UA nodes in the Node-RED palette",[366,367,371,376],"div",{"className":368},[369,370],"ff-callout","ff-callout--note",[14,372,375],{"className":373},[374],"ff-callout__title","Note",[366,377,380],{"className":378},[379],"ff-callout__content",[14,381,382],{},"Newly installed nodes are picked up automatically, no restart needed. Restart is only required when you update a node that's already installed: restart any remote instance or hosted instance running the previous version.",[366,384,386,389],{"className":385},[369,370],[14,387,375],{"className":388},[374],[366,390,392],{"className":391},[379],[14,393,394,395,398],{},"Keep endpoint URLs, usernames, and passwords in FlowFuse Environment Variables (your instance's ",[21,396,397],{},"Settings → Environment",") rather than hard-coding them in nodes. This keeps credentials out of your flow JSON and lets you promote the same flow across instances.",[32,400,402],{"id":401},"_3-the-node-set","3. The Node Set",[14,404,405],{},"Each node performs one OPC UA operation and reuses the shared connection you configure once.",[407,408,409,422],"table",{},[410,411,412],"thead",{},[413,414,415,419],"tr",{},[416,417,418],"th",{},"Node",[416,420,421],{},"Purpose",[423,424,425,434,441,448,455,462,469,476,483,490,497],"tbody",{},[413,426,427,431],{},[428,429,430],"td",{},"OPC UA Client (config)",[428,432,433],{},"Defines the server endpoint, security, authentication, subscription parameters, and namespace aliases. Every other node references it.",[413,435,436,438],{},[428,437,75],{},[428,439,440],{},"Fetch a value, all attributes, an array of values, or a structured object, on demand, triggered by an input message.",[413,442,443,445],{},[428,444,81],{},[428,446,447],{},"Send single values, batches, arrays, matrices, or extension objects to writable variables.",[413,449,450,452],{},[428,451,87],{},[428,453,454],{},"Builds a correctly encoded ExtensionObject from a plain JavaScript object before a Write.",[413,456,457,459],{},[428,458,93],{},[428,460,461],{},"Invoke a server method with input arguments and receive its output arguments.",[413,463,464,466],{},[428,465,99],{},[428,467,468],{},"Subscribe to variable value changes and emit a message on each change, with optional deadband filtering.",[413,470,471,473],{},[428,472,105],{},[428,474,475],{},"Subscribe to events and alarms, with server-side Where\u002FSelect filtering.",[413,477,478,480],{},[428,479,111],{},[428,481,482],{},"List the references (children) of a single node, one level.",[413,484,485,487],{},[428,486,117],{},[428,488,489],{},"Recursively traverse a subtree and return its structure as JSON.",[413,491,492,494],{},[428,493,123],{},[428,495,496],{},"Retrieve raw, modified, or aggregated historical data over a time range.",[413,498,499,501],{},[428,500,129],{},[428,502,503],{},"Read, write, append, or size files on servers implementing the FileType interface.",[366,505,507,510],{"className":506},[369,370],[14,508,375],{"className":509},[374],[366,511,513],{"className":512},[379],[14,514,515],{},"Properties of the input message take precedence over a node's own configuration. Configure a node statically, or drive it dynamically from upstream messages.",[366,517,519,522],{"className":518},[369,370],[14,520,375],{"className":521},[374],[366,523,525],{"className":524},[379],[14,526,527],{},"Each node reports its state in the editor with a coloured status dot, grey (not connected), blue (operation in progress), green (success), red (failure), and on some nodes (such as History Read) yellow (partial success or quality issues). Watch it alongside the debug sidebar when wiring up a flow.",[32,529,531],{"id":530},"_4-nodeids-and-how-to-address-data","4. NodeIds and How to Address Data",[14,533,534],{},"A NodeId is the unique identifier of a node in a server's address space. It has a namespace index, an identifier type, and an identifier value. The certified node accepts several formats:",[407,536,537,547],{},[410,538,539],{},[413,540,541,544],{},[416,542,543],{},"Format",[416,545,546],{},"Example",[423,548,549,559,569,579,589,599,609],{},[413,550,551,554],{},[428,552,553],{},"Numeric",[428,555,556],{},[209,557,558],{},"ns=2;i=1001",[413,560,561,564],{},[428,562,563],{},"String",[428,565,566],{},[209,567,568],{},"ns=2;s=TemperatureSetpoint",[413,570,571,574],{},[428,572,573],{},"GUID",[428,575,576],{},[209,577,578],{},"ns=2;g=12345678-1234-1234-1234-123456789abc",[413,580,581,584],{},[428,582,583],{},"Unified (namespace URI)",[428,585,586],{},[209,587,588],{},"nsu=http:\u002F\u002Fopcfoundation.org\u002FUA\u002FADI;i=1234",[413,590,591,594],{},[428,592,593],{},"Browse path",[428,595,596],{},[209,597,598],{},"\u002FObjects\u002F2:DeviceSet\u002F3:MyDevice\u002F3:Temperature",[413,600,601,604],{},[428,602,603],{},"Aliased browse path",[428,605,606],{},[209,607,608],{},"\u002FObjects\u002Fdi:DeviceSet\u002Fns3:MyDevice\u002Fns3:Temperature",[413,610,611,614],{},[428,612,613],{},"Verified browse path",[428,615,616],{},[209,617,618],{},"[\u002F2:MyDevice\u002F3:Temperature](ns=1;s=Temperature)",[14,620,621,622,625],{},"When you give a browse path, the node resolves it against the server's address space and caches the result, so there is only a small one-time cost on the first read or after a reconnect. The cache clears when the connection is re-established, in case the server's address space has changed. Use the flask button to verify a NodeId or browse path; use the ",[209,623,624],{},"..."," button to browse the live server. These buttons work only once the endpoint is configured and the flow is deployed.",[14,627,628],{},[359,629],{"alt":630,"dataZoomable":362,"src":631,"title":632},"\"A verified browse path in the NodeId field, with the browse and verify buttons\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fnodeid-as-browse-path.png","A verified browse path in the NodeId field, with the browse and verify buttons",[14,634,635,636,638],{},"Clicking the browse (",[209,637,624],{},") button opens the live address space, so you can pick a node visually instead of typing its NodeId:",[14,640,641],{},[359,642],{"alt":643,"dataZoomable":362,"src":644,"title":645},"\"Browsing the live server address space to select a NodeId\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fuse-node-browser-to-select-node-id.png","Browsing the live server address space to select a NodeId",[366,647,650,654],{"className":648},[369,649],"ff-callout--warning",[14,651,653],{"className":652},[374],"Warning",[366,655,657],{"className":656},[379],[14,658,659],{},"Namespace indexes are not guaranteed stable across servers. If you move a flow between servers, prefer browse paths or the namespace alias table over hard-coded numeric namespace indexes.",[159,661,663],{"id":662},"browse-path-syntax","Browse path syntax",[14,665,666],{},"Every browse path starts with a reference-type separator and then a sequence of browse names. The certified node follows the OPC Foundation Part 4 specification.",[164,668,669,683,695,706,718,734,743],{},[40,670,671,674,675,678,679,682],{},[21,672,673],{},"Namespace qualification",", every browse name needs a namespace-index prefix (",[209,676,677],{},"2:DeviceSet",") ",[21,680,681],{},"except"," names in the standard namespace 0, where the prefix is optional. Omitting a required prefix is the most common cause of a path that won't resolve.",[40,684,685,692,693,30],{},[21,686,687,688,691],{},"Hierarchical references (",[209,689,690],{},"\u002F",")",", follow any hierarchical reference: ",[209,694,598],{},[40,696,697,702,703,30],{},[21,698,699,700,691],{},"Aggregates references (",[209,701,30],{},", follow an Aggregates (component\u002Fproperty) reference: ",[209,704,705],{},"\u002FObjects\u002FServer.NamespaceArray",[40,707,708,714,715,30],{},[21,709,710,711,691],{},"Specific reference types (",[209,712,713],{},"\u003CRefType>",", follow one named reference type: ",[209,716,717],{},"\u003CHasComponent>2:Boiler\u002F\u003CHasProperty>2:Temperature",[40,719,720,212,723,726,727,730,731,30],{},[21,721,722],{},"Reference-type modifiers",[209,724,725],{},"\u003C#HasComponent>"," follows only that exact type, not its subtypes; ",[209,728,729],{},"\u003C!HasChild>2:Parent"," follows the reference in the inverse direction; a namespace-qualified reference type uses ",[209,732,733],{},"\u003C0:HasProperty>",[40,735,736,739,740,30],{},[21,737,738],{},"Wildcards",", omit the final browse name to match all targets of the last step: ",[209,741,742],{},"\u002FObjects\u002F2:Server\u002F",[40,744,745,748,749,752,753,756,757,760,761,30],{},[21,746,747],{},"Escaping special characters",", escape ",[209,750,751],{},"\u002F . : & \u003C > # !"," inside a browse name with a leading ",[209,754,755],{},"&",". A node literally named ",[209,758,759],{},"Device.Name"," becomes ",[209,762,763],{},"Device&.Name",[159,765,767],{"id":766},"browse-path-errors","Browse path errors",[407,769,770,780],{},[410,771,772],{},[413,773,774,777],{},[416,775,776],{},"Status code",[416,778,779],{},"Likely cause",[423,781,782,790,798],{},[413,783,784,787],{},[428,785,786],{},"BadBrowseNameInvalid",[428,788,789],{},"A missing required namespace prefix, an unescaped special character, or a case mismatch in a browse name.",[413,791,792,795],{},[428,793,794],{},"BadNoMatch",[428,796,797],{},"The full path does not exist on the server, or a namespace index is wrong.",[413,799,800,803],{},[428,801,802],{},"BadReferenceTypeIdInvalid",[428,804,805],{},"A reference type name in the path is unknown or not namespace-qualified.",[366,807,809,812],{"className":808},[369,370],[14,810,375],{"className":811},[374],[366,813,815],{"className":814},[379],[14,816,817],{},"Browse paths are convenient and portable, but resolution has a cost. For variables you read or write frequently, resolve the path once and use the returned NodeId, or use the verified-browse-path format that caches the NodeId alongside the path.",[32,819,821],{"id":820},"_5-configure-a-connection","5. Configure a Connection",[14,823,824,825,828],{},"Every OPC UA node depends on a connection defined by the ",[21,826,827],{},"OPC UA Client"," configuration node. Create it once and reference it through the endpoint field on any node.",[37,830,831,846,863,881,890],{},[40,832,833,834,837,838,841],{},"Drag any OPC UA node (e.g. Read) onto the canvas and double-click to edit it. Every node carries an ",[21,835,836],{},"Endpoint"," field.",[839,840],"br",{},[359,842],{"alt":843,"dataZoomable":362,"src":844,"title":845},"\"The Endpoint field on a Read node\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fread-showing-endpoint-field.png","The Endpoint field on a Read node",[40,847,848,849,852,853,30,856,858],{},"Open the endpoint dropdown and choose ",[21,850,851],{},"add new opcua endpoint",", or click ",[209,854,855],{},"[+]",[839,857],{},[359,859],{"alt":860,"dataZoomable":362,"src":861,"title":862},"\"Adding a new OPC UA endpoint from the dropdown\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fendpoint-add-new.png","Adding a new OPC UA endpoint from the dropdown",[40,864,865,866,869,870,873,874,690,877,880],{},"Enter the endpoint URL, for example ",[209,867,868],{},"opc.tcp:\u002F\u002F192.168.1.10:4840",", and the security and authentication settings. Only the ",[209,871,872],{},"opc.tcp:\u002F\u002F"," protocol is supported; ",[209,875,876],{},"http",[209,878,879],{},"https"," endpoint URLs are not.",[40,882,350,883,886,887,30],{},[21,884,885],{},"Save",", then ",[21,888,889],{},"Done",[40,891,350,892,895],{},[21,893,894],{},"Deploy",", then open the debug sidebar to confirm data flows.",[366,897,899,902],{"className":898},[369,370],[14,900,375],{"className":901},[374],[366,903,905],{"className":904},[379],[14,906,907],{},"The connection is shared. Changing its parameters affects every node that uses it, and you must redeploy the flow for connection changes to take effect.",[159,909,911],{"id":910},"connection-editor-areas","Connection editor areas",[164,913,914,927,933,939,964],{},[40,915,916,919,920,922],{},[21,917,918],{},"Check the connection",", confirm the endpoint is reachable before building on it. A successful test reports the connection as established:",[839,921],{},[359,923],{"alt":924,"dataZoomable":362,"src":925,"title":926},"\"The Check Connection button reporting a successful connection\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fendpoint-verification.png","The Check Connection button reporting a successful connection",[40,928,929,932],{},[21,930,931],{},"Secure connection",", choose a security policy and message security mode, then an authentication method.",[40,934,935,938],{},[21,936,937],{},"Custom certificate",", supply your own certificate and private key when the server requires mutual trust.",[40,940,941,944,945,948,949,952,953,956,957,959],{},[21,942,943],{},"Subscription parameters",", set publishing interval, lifetime, keep-alive, max notifications per publish, and priority once; every Monitor and Monitor Event node inherits them. The connection ships with three subscriptions, ",[21,946,947],{},"Default"," (1000 ms publishing interval), ",[21,950,951],{},"Fast"," (500 ms), and ",[21,954,955],{},"Slow"," (5000 ms), and you can add more for items that need a different publishing rate. The default subscription cannot be deleted, as it also drives keep-alive.",[839,958],{},[359,960],{"alt":961,"dataZoomable":362,"src":962,"title":963},"\"The Subscriptions tab of the connection editor\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fendpoint-subscriptions.png","The Subscriptions tab of the connection editor",[40,965,966,969,970,973],{},[21,967,968],{},"Namespace alias table",", map a stable short alias to a namespace URI so your NodeIds survive server reassignments. The ",[21,971,972],{},"Extract"," button reads the server's namespace array and fills the table for you; you can press it again after a server change without losing aliases you already set.",[159,975,977],{"id":976},"security-policy-and-message-mode","Security policy and message mode",[164,979,980,1000,1016],{},[40,981,982,985,986,212,989,992,993,996,997,999],{},[21,983,984],{},"Security policy",", the cipher suite used to protect the channel. Common values are ",[209,987,988],{},"None",[209,990,991],{},"Basic256",", and ",[209,994,995],{},"Basic256Sha256"," (the modern SHA-256 choice; prefer it over the older SHA-1-based ",[209,998,991],{},").",[40,1001,1002,212,1005,1007,1008,1011,1012,1015],{},[21,1003,1004],{},"Message security mode",[209,1006,988],{}," sends messages in cleartext; ",[209,1009,1010],{},"Sign"," adds integrity (messages are signed but not encrypted); ",[209,1013,1014],{},"SignAndEncrypt"," adds both integrity and confidentiality. Match the policy and mode the server advertises.",[40,1017,1018,1021,1022,1025,1026,1028],{},[21,1019,1020],{},"Authentication",", connect anonymously, with a username and password, or with an X.509 certificate. If credentials are wrong or the account lacks rights, the check reports ",[209,1023,1024],{},"BadUserAccessDenied",":",[839,1027],{},[359,1029],{"alt":1030,"dataZoomable":362,"src":1031,"title":1032},"\"A connection rejected with BadUserAccessDenied\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fendpoint-verification-user-access-denied.png","A connection rejected with BadUserAccessDenied",[366,1034,1036,1039],{"className":1035},[369,649],[14,1037,653],{"className":1038},[374],[366,1040,1042],{"className":1041},[379],[14,1043,1044,1045,1047,1048,1050],{},"A username and password sent over message security mode ",[209,1046,988],{}," travel in cleartext. Combine credentials with at least ",[209,1049,1010],{}," mode.",[159,1052,1054],{"id":1053},"certificate-trust","Certificate trust",[14,1056,1057,1058,1061,1062,1064,1065,1067],{},"Secure connections rely on mutual certificate trust. By default the client side automatically accepts the server's certificate, so the step that usually needs action is the reverse: ",[21,1059,1060],{},"the server must trust the client's certificate",". For a ",[209,1063,1010],{}," or ",[209,1066,1014],{}," connection, download the client certificate from the connection editor (in PEM or DER format) and add it to your OPC UA server's trusted list, otherwise the server refuses the connection.",[366,1069,1071,1074],{"className":1070},[369,370],[14,1072,375],{"className":1073},[374],[366,1075,1077],{"className":1076},[379],[14,1078,1079,1080,1083,1084,1087],{},"Auto-accepting the server certificate is convenient but means the client does not verify the server's identity. To enforce server-certificate validation, set ",[209,1081,1082],{},"rejectUnauthorized"," to ",[209,1085,1086],{},"true"," in the connection node's global settings. The client then refuses any server whose certificate is not already in its trusted store, so you must add the server's certificate to the client side first.",[14,1089,1090,1091,1094,1095,1097],{},"Client and server nodes in your instance share one PKI store. On FlowFuse it lives under ",[209,1092,1093],{},"\u003Cinstance working directory>\u002Fopcua-for-flow-fuse\u002FPKI",". For trust decisions to survive restarts and redeploys, that directory must be on persistent storage, see ",[26,1096,135],{"href":134}," for the storage details, which apply to client connections too.",[14,1099,1100,1101,1104],{},"If the client certificate is not yet trusted by the server, ",[21,1102,1103],{},"Check Connection"," reports the handshake failure and reminds you to add the client certificate to the server's trusted list:",[14,1106,1107],{},[359,1108],{"alt":1109,"dataZoomable":362,"src":1110,"title":1111},"\"A secure connection failing because the certificate is not yet trusted\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fendpoint-verification-secure-error.png","A secure connection failing because the certificate is not yet trusted",[32,1113,1115],{"id":1114},"_6-read","6. Read",[14,1117,1118],{},"The Read node fetches data on demand, it acts only when it receives an input message.",[1120,1121,1126],"pre",{"className":1122,"code":1124,"language":1125},[1123],"language-text","[Inject]  →  [Read]  →  [Debug]\n","text",[209,1127,1124],{"__ignoreMap":362},[14,1129,1130],{},[359,1131],{"alt":1132,"dataZoomable":362,"src":1133,"title":1134},"\"The Read node configuration with endpoint, AttributeId, and NodeId fields\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fopcu-client2-read.png","The Read node configuration",[159,1136,1138],{"id":1137},"nodeid-source-priority-order","NodeId source (priority order)",[37,1140,1141,1146,1151,1156],{},[40,1142,1143],{},[209,1144,1145],{},"msg.nodeId",[40,1147,1148],{},[209,1149,1150],{},"msg.topic",[40,1152,1153],{},[209,1154,1155],{},"msg.payload",[40,1157,1158],{},"The node's configured NodeId",[366,1160,1162,1165],{"className":1161},[369,649],[14,1163,653],{"className":1164},[374],[366,1166,1168],{"className":1167},[379],[14,1169,1170,1171,1173,1174,1177,1178,212,1180,1182,1183,30],{},"A default Inject node sets ",[209,1172,1155],{}," to a timestamp, which silently overrides the node's configured NodeId (priority rule 3). To use the node's own configuration, ensure the Inject node does ",[21,1175,1176],{},"not"," set ",[209,1179,1145],{},[209,1181,1150],{},", or ",[209,1184,1155],{},[159,1186,1188],{"id":1187},"message-properties","Message properties",[164,1190,1191,1213],{},[40,1192,1193,1196,1197,1200,1201,212,1204,212,1207,1182,1210,30],{},[209,1194,1195],{},"msg.attributeId",", which attribute to read: ",[209,1198,1199],{},"Value"," (default), ",[209,1202,1203],{},"DataType",[209,1205,1206],{},"BrowseName",[209,1208,1209],{},"DisplayName",[209,1211,1212],{},"All",[40,1214,1215,212,1218,1220,1221,1223,1224,1227,1228,212,1231,212,1234,1237],{},[209,1216,1217],{},"msg.outputType",[209,1219,1199],{}," returns the bare value on ",[209,1222,1155],{},"; ",[209,1225,1226],{},"DataValue"," returns the full DataValue (value plus ",[209,1229,1230],{},"statusCode",[209,1232,1233],{},"sourceTimestamp",[209,1235,1236],{},"serverTimestamp",", and picoseconds).",[159,1239,1241],{"id":1240},"read-modes","Read modes",[164,1243,1244,1252,1323,1339],{},[40,1245,1246,1249,1250,30],{},[21,1247,1248],{},"Single value",", one NodeId; the value comes back on ",[209,1251,1155],{},[40,1253,1254,1257,1258,1083,1260,1262,1263,212,1266,212,1268,212,1271,212,1274,212,1277,212,1280,690,1283,212,1286,690,1289,212,1292,1295,1296,690,1299,212,1302,212,1305,212,1308,690,1311,212,1314,690,1317,992,1320,30],{},[21,1255,1256],{},"All attributes",", set ",[209,1259,1195],{},[209,1261,1212],{}," to get every attribute of one node. Reads a single NodeId only, use multiple Read nodes for multiple nodes. The payload then contains ",[209,1264,1265],{},"nodeId",[209,1267,1230],{},[209,1269,1270],{},"nodeClass",[209,1272,1273],{},"browseName",[209,1275,1276],{},"displayName",[209,1278,1279],{},"description",[209,1281,1282],{},"writeMask",[209,1284,1285],{},"writeMaskAsString",[209,1287,1288],{},"userWriteMask",[209,1290,1291],{},"userWriteMaskAsString",[209,1293,1294],{},"value"," (with timestamps), ",[209,1297,1298],{},"dataType",[209,1300,1301],{},"dataTypeName",[209,1303,1304],{},"valueRank",[209,1306,1307],{},"arrayDimensions",[209,1309,1310],{},"accessLevel",[209,1312,1313],{},"accessLevelAsString",[209,1315,1316],{},"userAccessLevel",[209,1318,1319],{},"userAccessLevelAsString",[209,1321,1322],{},"minimumSamplingInterval",[40,1324,1325,1328,1329,1223,1332,1334,1335,1338],{},[21,1326,1327],{},"Multiple values as an array",", inject an array of NodeIds via ",[209,1330,1331],{},"msg.topics",[209,1333,1155],{}," comes back as a parallel value array, with a parallel ",[209,1336,1337],{},"msg.dataType"," array. Array reads are only available by injecting a message (the node's own config holds a single NodeId).",[40,1340,1341,1344,1345,1347],{},[21,1342,1343],{},"Multiple values as a structure",", inject a JSON object in ",[209,1346,1150],{}," whose leaves are NodeIds; the node returns the same shape with values substituted. The Explore node can generate this structure.",[14,1349,1350],{},"Example, read a single value by injecting the NodeId:",[1120,1352,1356],{"className":1353,"code":1354,"language":1355,"meta":362,"style":362},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","msg.topic = \"ns=2;s=TemperatureSetpoint\";\n\u002F\u002F msg.payload comes back as the current value\n","js",[209,1357,1358,1388],{"__ignoreMap":362},[1359,1360,1363,1367,1370,1373,1376,1379,1382,1385],"span",{"class":1361,"line":1362},"line",1,[1359,1364,1366],{"class":1365},"sTEyZ","msg",[1359,1368,30],{"class":1369},"sMK4o",[1359,1371,1372],{"class":1365},"topic ",[1359,1374,1375],{"class":1369},"=",[1359,1377,1378],{"class":1369}," \"",[1359,1380,568],{"class":1381},"sfazB",[1359,1383,1384],{"class":1369},"\"",[1359,1386,1387],{"class":1369},";\n",[1359,1389,1391],{"class":1361,"line":1390},2,[1359,1392,1394],{"class":1393},"sHwdD","\u002F\u002F msg.payload comes back as the current value\n",[14,1396,1397],{},"Example, read every attribute of one node:",[1120,1399,1401],{"className":1353,"code":1400,"language":1355,"meta":362,"style":362},"msg.nodeId = \"ns=2;s=TemperatureSetpoint\";\nmsg.attributeId = \"All\";\n",[209,1402,1403,1422],{"__ignoreMap":362},[1359,1404,1405,1407,1409,1412,1414,1416,1418,1420],{"class":1361,"line":1362},[1359,1406,1366],{"class":1365},[1359,1408,30],{"class":1369},[1359,1410,1411],{"class":1365},"nodeId ",[1359,1413,1375],{"class":1369},[1359,1415,1378],{"class":1369},[1359,1417,568],{"class":1381},[1359,1419,1384],{"class":1369},[1359,1421,1387],{"class":1369},[1359,1423,1424,1426,1428,1431,1433,1435,1437,1439],{"class":1361,"line":1390},[1359,1425,1366],{"class":1365},[1359,1427,30],{"class":1369},[1359,1429,1430],{"class":1365},"attributeId ",[1359,1432,1375],{"class":1369},[1359,1434,1378],{"class":1369},[1359,1436,1212],{"class":1381},[1359,1438,1384],{"class":1369},[1359,1440,1387],{"class":1369},[14,1442,1443,1444,1446,1447,1450],{},"Reading ",[209,1445,1212],{}," on a structured DataType node returns its full definition, for example the fields of an ",[209,1448,1449],{},"RfidScanResult"," extension object:",[14,1452,1453],{},[359,1454],{"alt":1455,"dataZoomable":362,"src":1456,"title":1457},"\"Debug output of an All-attributes read showing a DataType definition\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fexample-all-attributes-on-rfid-scan-result.png","Debug output of an All-attributes read",[14,1459,1460],{},"Example, read several values as an array:",[1120,1462,1464],{"className":1353,"code":1463,"language":1355,"meta":362,"style":362},"msg.topics = [\"ns=1;s=Temperature\", \"ns=0;s=Pressure\"];\nmsg.attributeId = \"Value\";\n\u002F\u002F msg.payload → [23.4, 1.2] ; msg.dataType → [\"Double\", \"Double\"]\n",[209,1465,1466,1502,1520],{"__ignoreMap":362},[1359,1467,1468,1470,1472,1475,1477,1480,1482,1485,1487,1490,1492,1495,1497,1500],{"class":1361,"line":1362},[1359,1469,1366],{"class":1365},[1359,1471,30],{"class":1369},[1359,1473,1474],{"class":1365},"topics ",[1359,1476,1375],{"class":1369},[1359,1478,1479],{"class":1365}," [",[1359,1481,1384],{"class":1369},[1359,1483,1484],{"class":1381},"ns=1;s=Temperature",[1359,1486,1384],{"class":1369},[1359,1488,1489],{"class":1369},",",[1359,1491,1378],{"class":1369},[1359,1493,1494],{"class":1381},"ns=0;s=Pressure",[1359,1496,1384],{"class":1369},[1359,1498,1499],{"class":1365},"]",[1359,1501,1387],{"class":1369},[1359,1503,1504,1506,1508,1510,1512,1514,1516,1518],{"class":1361,"line":1390},[1359,1505,1366],{"class":1365},[1359,1507,30],{"class":1369},[1359,1509,1430],{"class":1365},[1359,1511,1375],{"class":1369},[1359,1513,1378],{"class":1369},[1359,1515,1199],{"class":1381},[1359,1517,1384],{"class":1369},[1359,1519,1387],{"class":1369},[1359,1521,1523],{"class":1361,"line":1522},3,[1359,1524,1525],{"class":1393},"\u002F\u002F msg.payload → [23.4, 1.2] ; msg.dataType → [\"Double\", \"Double\"]\n",[32,1527,1529],{"id":1528},"_7-write","7. Write",[14,1531,1532],{},"The Write node sends values to writable variables. It determines the target type automatically from the server in most cases.",[159,1534,1138],{"id":1535},"nodeid-source-priority-order-1",[37,1537,1538,1542,1546],{},[40,1539,1540],{},[209,1541,1145],{},[40,1543,1544],{},[209,1545,1150],{},[40,1547,1548],{},"Node configuration",[159,1550,1552],{"id":1551},"write-modes","Write modes",[164,1554,1555,1572,1630,1651,1666,1682],{},[40,1556,1557,1559,1560,1562,1563,1565,1566,1568,1569,30],{},[21,1558,1248],{},", inject the value as ",[209,1561,1155],{}," and the target as ",[209,1564,1150],{}," (or ",[209,1567,1145],{},"). A successful write reports ",[209,1570,1571],{},"statusCode: \"Good\"",[40,1573,1574,1257,1577,1579,1580,212,1583,212,1586,212,1589,212,1592,212,1595,212,1598,212,1601,212,1604,212,1607,212,1610,212,1613,212,1615,212,1618,212,1621,212,1624,992,1627,30],{},[21,1575,1576],{},"Explicit data type",[209,1578,1337],{}," when automatic conversion is insufficient. Valid values: ",[209,1581,1582],{},"Boolean",[209,1584,1585],{},"SByte",[209,1587,1588],{},"Byte",[209,1590,1591],{},"Int16",[209,1593,1594],{},"UInt16",[209,1596,1597],{},"Int32",[209,1599,1600],{},"UInt32",[209,1602,1603],{},"Int64",[209,1605,1606],{},"UInt64",[209,1608,1609],{},"Float",[209,1611,1612],{},"Double",[209,1614,563],{},[209,1616,1617],{},"DateTime",[209,1619,1620],{},"ByteString",[209,1622,1623],{},"Guid",[209,1625,1626],{},"LocalizedText",[209,1628,1629],{},"ExtensionObject",[40,1631,1632,1635,1636,1639,1640,1643,1644,1646,1647,1650],{},[21,1633,1634],{},"Variant",", send ",[209,1637,1638],{},"{ dataType, value, arrayType }"," for finer control, including arrays. Use ",[209,1641,1642],{},"dimensions"," for a matrix layout. ",[209,1645,1298],{}," and ",[209,1648,1649],{},"arrayType"," are optional, the node can infer them from the server.",[40,1652,1653,1655,1656,212,1658,690,1660,1662,1663,1665],{},[21,1654,1226],{},", send a full DataValue (",[209,1657,1230],{},[209,1659,1233],{},[209,1661,1236],{},", picoseconds, and a nested ",[209,1664,1294],{},") when you need to set timestamps or quality alongside the value.",[40,1667,1668,1671,1672,1674,1675,1678,1679,1681],{},[21,1669,1670],{},"Batch write",", send an array of write requests in ",[209,1673,1155],{},". Returns ",[209,1676,1677],{},"msg.results"," with one status per write. Keep batches under 50–100 items and always inspect individual ",[209,1680,1230],{}," values.",[40,1683,1684,1687,1688,1691,1692,1695,1696,1691,1699,1702],{},[21,1685,1686],{},"Extension objects",", use OPC UA JSON encoding. Both the 1.05 encoding (",[209,1689,1690],{},"UaTypeId"," \u002F ",[209,1693,1694],{},"UaBody",") and legacy 1.04 (",[209,1697,1698],{},"TypeId",[209,1700,1701],{},"Body",") are supported.",[14,1704,1705,1706,1708],{},"Automatic conversion maps JavaScript values to OPC UA types: integers → Int32\u002FUInt32, decimals → Float\u002FDouble, text → String, booleans → Boolean, and arrays → OPC UA arrays. Override it with ",[209,1707,1337],{}," only when needed.",[14,1710,1711],{},"Example, write a single value:",[1120,1713,1715],{"className":1353,"code":1714,"language":1355,"meta":362,"style":362},"msg.topic = \"ns=2;s=TemperatureSetpoint\";\nmsg.payload = 25.5;   \u002F\u002F dataType inferred from the server\n",[209,1716,1717,1735],{"__ignoreMap":362},[1359,1718,1719,1721,1723,1725,1727,1729,1731,1733],{"class":1361,"line":1362},[1359,1720,1366],{"class":1365},[1359,1722,30],{"class":1369},[1359,1724,1372],{"class":1365},[1359,1726,1375],{"class":1369},[1359,1728,1378],{"class":1369},[1359,1730,568],{"class":1381},[1359,1732,1384],{"class":1369},[1359,1734,1387],{"class":1369},[1359,1736,1737,1739,1741,1744,1746,1750,1753],{"class":1361,"line":1390},[1359,1738,1366],{"class":1365},[1359,1740,30],{"class":1369},[1359,1742,1743],{"class":1365},"payload ",[1359,1745,1375],{"class":1369},[1359,1747,1749],{"class":1748},"sbssI"," 25.5",[1359,1751,1752],{"class":1369},";",[1359,1754,1755],{"class":1393},"   \u002F\u002F dataType inferred from the server\n",[14,1757,1758],{},"Example, batch write several variables in one message:",[1120,1760,1762],{"className":1353,"code":1761,"language":1355,"meta":362,"style":362},"msg.payload = [\n    { nodeId: \"ns=2;s=TemperatureSetpoint\", value: 25.5 },\n    { nodeId: \"ns=2;s=PressureSetpoint\",    value: 1013 },\n    { nodeId: \"ns=2;s=EnableFlag\",          value: true }\n];\n\u002F\u002F inspect msg.results, one statusCode per write\n",[209,1763,1764,1777,1806,1833,1863,1870],{"__ignoreMap":362},[1359,1765,1766,1768,1770,1772,1774],{"class":1361,"line":1362},[1359,1767,1366],{"class":1365},[1359,1769,30],{"class":1369},[1359,1771,1743],{"class":1365},[1359,1773,1375],{"class":1369},[1359,1775,1776],{"class":1365}," [\n",[1359,1778,1779,1782,1786,1788,1790,1792,1794,1796,1799,1801,1803],{"class":1361,"line":1390},[1359,1780,1781],{"class":1369},"    {",[1359,1783,1785],{"class":1784},"swJcz"," nodeId",[1359,1787,1025],{"class":1369},[1359,1789,1378],{"class":1369},[1359,1791,568],{"class":1381},[1359,1793,1384],{"class":1369},[1359,1795,1489],{"class":1369},[1359,1797,1798],{"class":1784}," value",[1359,1800,1025],{"class":1369},[1359,1802,1749],{"class":1748},[1359,1804,1805],{"class":1369}," },\n",[1359,1807,1808,1810,1812,1814,1816,1819,1821,1823,1826,1828,1831],{"class":1361,"line":1522},[1359,1809,1781],{"class":1369},[1359,1811,1785],{"class":1784},[1359,1813,1025],{"class":1369},[1359,1815,1378],{"class":1369},[1359,1817,1818],{"class":1381},"ns=2;s=PressureSetpoint",[1359,1820,1384],{"class":1369},[1359,1822,1489],{"class":1369},[1359,1824,1825],{"class":1784},"    value",[1359,1827,1025],{"class":1369},[1359,1829,1830],{"class":1748}," 1013",[1359,1832,1805],{"class":1369},[1359,1834,1836,1838,1840,1842,1844,1847,1849,1851,1854,1856,1860],{"class":1361,"line":1835},4,[1359,1837,1781],{"class":1369},[1359,1839,1785],{"class":1784},[1359,1841,1025],{"class":1369},[1359,1843,1378],{"class":1369},[1359,1845,1846],{"class":1381},"ns=2;s=EnableFlag",[1359,1848,1384],{"class":1369},[1359,1850,1489],{"class":1369},[1359,1852,1853],{"class":1784},"          value",[1359,1855,1025],{"class":1369},[1359,1857,1859],{"class":1858},"sfNiH"," true",[1359,1861,1862],{"class":1369}," }\n",[1359,1864,1866,1868],{"class":1361,"line":1865},5,[1359,1867,1499],{"class":1365},[1359,1869,1387],{"class":1369},[1359,1871,1873],{"class":1361,"line":1872},6,[1359,1874,1875],{"class":1393},"\u002F\u002F inspect msg.results, one statusCode per write\n",[14,1877,1878],{},"Example, write a 2×3 matrix using explicit dimensions:",[1120,1880,1882],{"className":1353,"code":1881,"language":1355,"meta":362,"style":362},"msg.payload = {\n    dataType: \"Double\",\n    value: [1, 2, 3, 4, 5, 6],\n    arrayType: \"Matrix\",\n    dimensions: [2, 3]   \u002F\u002F 2 rows, 3 columns\n};\n",[209,1883,1884,1897,1913,1953,1969,1991],{"__ignoreMap":362},[1359,1885,1886,1888,1890,1892,1894],{"class":1361,"line":1362},[1359,1887,1366],{"class":1365},[1359,1889,30],{"class":1369},[1359,1891,1743],{"class":1365},[1359,1893,1375],{"class":1369},[1359,1895,1896],{"class":1369}," {\n",[1359,1898,1899,1902,1904,1906,1908,1910],{"class":1361,"line":1390},[1359,1900,1901],{"class":1784},"    dataType",[1359,1903,1025],{"class":1369},[1359,1905,1378],{"class":1369},[1359,1907,1612],{"class":1381},[1359,1909,1384],{"class":1369},[1359,1911,1912],{"class":1369},",\n",[1359,1914,1915,1917,1919,1921,1924,1926,1929,1931,1934,1936,1939,1941,1944,1946,1949,1951],{"class":1361,"line":1522},[1359,1916,1825],{"class":1784},[1359,1918,1025],{"class":1369},[1359,1920,1479],{"class":1365},[1359,1922,1923],{"class":1748},"1",[1359,1925,1489],{"class":1369},[1359,1927,1928],{"class":1748}," 2",[1359,1930,1489],{"class":1369},[1359,1932,1933],{"class":1748}," 3",[1359,1935,1489],{"class":1369},[1359,1937,1938],{"class":1748}," 4",[1359,1940,1489],{"class":1369},[1359,1942,1943],{"class":1748}," 5",[1359,1945,1489],{"class":1369},[1359,1947,1948],{"class":1748}," 6",[1359,1950,1499],{"class":1365},[1359,1952,1912],{"class":1369},[1359,1954,1955,1958,1960,1962,1965,1967],{"class":1361,"line":1835},[1359,1956,1957],{"class":1784},"    arrayType",[1359,1959,1025],{"class":1369},[1359,1961,1378],{"class":1369},[1359,1963,1964],{"class":1381},"Matrix",[1359,1966,1384],{"class":1369},[1359,1968,1912],{"class":1369},[1359,1970,1971,1974,1976,1978,1981,1983,1985,1988],{"class":1361,"line":1865},[1359,1972,1973],{"class":1784},"    dimensions",[1359,1975,1025],{"class":1369},[1359,1977,1479],{"class":1365},[1359,1979,1980],{"class":1748},"2",[1359,1982,1489],{"class":1369},[1359,1984,1933],{"class":1748},[1359,1986,1987],{"class":1365},"]   ",[1359,1989,1990],{"class":1393},"\u002F\u002F 2 rows, 3 columns\n",[1359,1992,1993],{"class":1361,"line":1872},[1359,1994,1995],{"class":1369},"};\n",[14,1997,1998],{},"Example, write an extension object using OPC UA JSON encoding, in both the 1.05 and legacy 1.04 forms:",[1120,2000,2002],{"className":1353,"code":2001,"language":1355,"meta":362,"style":362},"\u002F\u002F 1.05, UaTypeId is a NodeId string, UaBody holds the fields\nmsg.payload = {\n    UaTypeId: \"nsu=http:\u002F\u002Fopcfoundation.org\u002FUA\u002FAutoID\u002F;i=3007\",\n    UaBody: { CodeType: \"Ean13\", ScanData: { Epc: { PC: 12, UId: \"XBASE64d=\" } } }\n};\n\n\u002F\u002F 1.04 (legacy), TypeId is an object (IdType\u002FNamespace\u002FId); binary fields use a Buffer\nmsg.payload = {\n    TypeId: { IdType: 0, Namespace: 3, Id: 3007 },\n    Body:   { CodeType: \"Ean13\", ScanData: { Epc: { PC: 12, UId: Buffer.from(\"Hello\") } } }\n};\n",[209,2003,2004,2009,2021,2037,2104,2108,2114,2120,2133,2172,2247],{"__ignoreMap":362},[1359,2005,2006],{"class":1361,"line":1362},[1359,2007,2008],{"class":1393},"\u002F\u002F 1.05, UaTypeId is a NodeId string, UaBody holds the fields\n",[1359,2010,2011,2013,2015,2017,2019],{"class":1361,"line":1390},[1359,2012,1366],{"class":1365},[1359,2014,30],{"class":1369},[1359,2016,1743],{"class":1365},[1359,2018,1375],{"class":1369},[1359,2020,1896],{"class":1369},[1359,2022,2023,2026,2028,2030,2033,2035],{"class":1361,"line":1522},[1359,2024,2025],{"class":1784},"    UaTypeId",[1359,2027,1025],{"class":1369},[1359,2029,1378],{"class":1369},[1359,2031,2032],{"class":1381},"nsu=http:\u002F\u002Fopcfoundation.org\u002FUA\u002FAutoID\u002F;i=3007",[1359,2034,1384],{"class":1369},[1359,2036,1912],{"class":1369},[1359,2038,2039,2042,2044,2047,2050,2052,2054,2057,2059,2061,2064,2066,2068,2071,2073,2075,2078,2080,2083,2085,2088,2090,2092,2095,2097,2100,2102],{"class":1361,"line":1835},[1359,2040,2041],{"class":1784},"    UaBody",[1359,2043,1025],{"class":1369},[1359,2045,2046],{"class":1369}," {",[1359,2048,2049],{"class":1784}," CodeType",[1359,2051,1025],{"class":1369},[1359,2053,1378],{"class":1369},[1359,2055,2056],{"class":1381},"Ean13",[1359,2058,1384],{"class":1369},[1359,2060,1489],{"class":1369},[1359,2062,2063],{"class":1784}," ScanData",[1359,2065,1025],{"class":1369},[1359,2067,2046],{"class":1369},[1359,2069,2070],{"class":1784}," Epc",[1359,2072,1025],{"class":1369},[1359,2074,2046],{"class":1369},[1359,2076,2077],{"class":1784}," PC",[1359,2079,1025],{"class":1369},[1359,2081,2082],{"class":1748}," 12",[1359,2084,1489],{"class":1369},[1359,2086,2087],{"class":1784}," UId",[1359,2089,1025],{"class":1369},[1359,2091,1378],{"class":1369},[1359,2093,2094],{"class":1381},"XBASE64d=",[1359,2096,1384],{"class":1369},[1359,2098,2099],{"class":1369}," }",[1359,2101,2099],{"class":1369},[1359,2103,1862],{"class":1369},[1359,2105,2106],{"class":1361,"line":1865},[1359,2107,1995],{"class":1369},[1359,2109,2110],{"class":1361,"line":1872},[1359,2111,2113],{"emptyLinePlaceholder":2112},true,"\n",[1359,2115,2117],{"class":1361,"line":2116},7,[1359,2118,2119],{"class":1393},"\u002F\u002F 1.04 (legacy), TypeId is an object (IdType\u002FNamespace\u002FId); binary fields use a Buffer\n",[1359,2121,2123,2125,2127,2129,2131],{"class":1361,"line":2122},8,[1359,2124,1366],{"class":1365},[1359,2126,30],{"class":1369},[1359,2128,1743],{"class":1365},[1359,2130,1375],{"class":1369},[1359,2132,1896],{"class":1369},[1359,2134,2136,2139,2141,2143,2146,2148,2151,2153,2156,2158,2160,2162,2165,2167,2170],{"class":1361,"line":2135},9,[1359,2137,2138],{"class":1784},"    TypeId",[1359,2140,1025],{"class":1369},[1359,2142,2046],{"class":1369},[1359,2144,2145],{"class":1784}," IdType",[1359,2147,1025],{"class":1369},[1359,2149,2150],{"class":1748}," 0",[1359,2152,1489],{"class":1369},[1359,2154,2155],{"class":1784}," Namespace",[1359,2157,1025],{"class":1369},[1359,2159,1933],{"class":1748},[1359,2161,1489],{"class":1369},[1359,2163,2164],{"class":1784}," Id",[1359,2166,1025],{"class":1369},[1359,2168,2169],{"class":1748}," 3007",[1359,2171,1805],{"class":1369},[1359,2173,2175,2178,2180,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2222,2224,2228,2231,2233,2236,2238,2240,2243,2245],{"class":1361,"line":2174},10,[1359,2176,2177],{"class":1784},"    Body",[1359,2179,1025],{"class":1369},[1359,2181,2182],{"class":1369},"   {",[1359,2184,2049],{"class":1784},[1359,2186,1025],{"class":1369},[1359,2188,1378],{"class":1369},[1359,2190,2056],{"class":1381},[1359,2192,1384],{"class":1369},[1359,2194,1489],{"class":1369},[1359,2196,2063],{"class":1784},[1359,2198,1025],{"class":1369},[1359,2200,2046],{"class":1369},[1359,2202,2070],{"class":1784},[1359,2204,1025],{"class":1369},[1359,2206,2046],{"class":1369},[1359,2208,2077],{"class":1784},[1359,2210,1025],{"class":1369},[1359,2212,2082],{"class":1748},[1359,2214,1489],{"class":1369},[1359,2216,2087],{"class":1784},[1359,2218,1025],{"class":1369},[1359,2220,2221],{"class":1365}," Buffer",[1359,2223,30],{"class":1369},[1359,2225,2227],{"class":2226},"s2Zo4","from",[1359,2229,2230],{"class":1365},"(",[1359,2232,1384],{"class":1369},[1359,2234,2235],{"class":1381},"Hello",[1359,2237,1384],{"class":1369},[1359,2239,678],{"class":1365},[1359,2241,2242],{"class":1369},"}",[1359,2244,2099],{"class":1369},[1359,2246,1862],{"class":1369},[1359,2248,2250],{"class":1361,"line":2249},11,[1359,2251,1995],{"class":1369},[159,2253,2255],{"id":2254},"output-message","Output message",[14,2257,2258,2259,1646,2262,2264,2265,2267,2268,2270,2271,2274,2275,2278],{},"A Write returns the original ",[209,2260,2261],{},"payload",[209,2263,1265],{}," plus the result: ",[209,2266,1230],{},", the ",[209,2269,1298],{}," actually written, the ",[209,2272,2273],{},"attributeId",", and a ",[209,2276,2277],{},"message"," field carrying an error description when the write fails.",[159,2280,2282],{"id":2281},"common-write-status-codes","Common write status codes",[407,2284,2285,2294],{},[410,2286,2287],{},[413,2288,2289,2291],{},[416,2290,776],{},[416,2292,2293],{},"Meaning",[423,2295,2296,2304,2312,2322,2329,2337],{},[413,2297,2298,2301],{},[428,2299,2300],{},"Good",[428,2302,2303],{},"Write succeeded.",[413,2305,2306,2309],{},[428,2307,2308],{},"BadNodeIdUnknown",[428,2310,2311],{},"Variable not found.",[413,2313,2314,2317],{},[428,2315,2316],{},"BadTypeMismatch",[428,2318,2319,2320,30],{},"Conversion failed, set the correct ",[209,2321,1298],{},[413,2323,2324,2326],{},[428,2325,1024],{},[428,2327,2328],{},"Account lacks write permission.",[413,2330,2331,2334],{},[428,2332,2333],{},"BadNotWritable",[428,2335,2336],{},"Variable is read-only.",[413,2338,2339,2342],{},[428,2340,2341],{},"BadConnectionClosed",[428,2343,2344],{},"Connection was lost during the write.",[366,2346,2348,2351],{"className":2347},[369,649],[14,2349,653],{"className":2350},[374],[366,2352,2354],{"className":2353},[379],[14,2355,2356],{},"Writes to production equipment change real-world state. Gate write nodes behind validation or an operator confirmation step before deploying to a live instance.",[32,2358,2360],{"id":2359},"_8-extension-object","8. Extension Object",[14,2362,2363],{},"The Extension Object node builds a correctly encoded ExtensionObject from a plain JavaScript object, so you do not have to hand-encode it for a Write. It queries the server for the target node's DataType definition, constructs the encoded value, and passes it to Write.",[1120,2365,2368],{"className":2366,"code":2367,"language":1125},[1123],"[Inject payload]  →  [Extension Object]  →  [Write]  →  [Debug]\n",[209,2369,2367],{"__ignoreMap":362},[14,2371,2372,2373,2375],{},"Inject a plain JavaScript object as ",[209,2374,1155],{},"; the node encodes it for the server's DataType and emits the ExtensionObject ready for the Write node.",[1120,2377,2379],{"className":1353,"code":2378,"language":1355,"meta":362,"style":362},"msg.nodeId = \"ns=2;s=DeviceConfiguration\";\nmsg.payload = {\n    setpoint: 72.0,\n    mode: \"Auto\",\n    enabled: true\n};\n",[209,2380,2381,2400,2412,2424,2440,2450],{"__ignoreMap":362},[1359,2382,2383,2385,2387,2389,2391,2393,2396,2398],{"class":1361,"line":1362},[1359,2384,1366],{"class":1365},[1359,2386,30],{"class":1369},[1359,2388,1411],{"class":1365},[1359,2390,1375],{"class":1369},[1359,2392,1378],{"class":1369},[1359,2394,2395],{"class":1381},"ns=2;s=DeviceConfiguration",[1359,2397,1384],{"class":1369},[1359,2399,1387],{"class":1369},[1359,2401,2402,2404,2406,2408,2410],{"class":1361,"line":1390},[1359,2403,1366],{"class":1365},[1359,2405,30],{"class":1369},[1359,2407,1743],{"class":1365},[1359,2409,1375],{"class":1369},[1359,2411,1896],{"class":1369},[1359,2413,2414,2417,2419,2422],{"class":1361,"line":1522},[1359,2415,2416],{"class":1784},"    setpoint",[1359,2418,1025],{"class":1369},[1359,2420,2421],{"class":1748}," 72.0",[1359,2423,1912],{"class":1369},[1359,2425,2426,2429,2431,2433,2436,2438],{"class":1361,"line":1835},[1359,2427,2428],{"class":1784},"    mode",[1359,2430,1025],{"class":1369},[1359,2432,1378],{"class":1369},[1359,2434,2435],{"class":1381},"Auto",[1359,2437,1384],{"class":1369},[1359,2439,1912],{"class":1369},[1359,2441,2442,2445,2447],{"class":1361,"line":1865},[1359,2443,2444],{"class":1784},"    enabled",[1359,2446,1025],{"class":1369},[1359,2448,2449],{"class":1858}," true\n",[1359,2451,2452],{"class":1361,"line":1872},[1359,2453,1995],{"class":1369},[14,2455,2456],{},"The node also accepts an array of objects and encodes it as an array of ExtensionObjects, detecting the array type from the server's definition.",[32,2458,2460],{"id":2459},"_9-call","9. Call",[14,2462,2463],{},"The Call node invokes a server method, a server-side function such as start a batch, reset a counter, or acknowledge an alarm, that takes input arguments and returns output arguments.",[159,2465,2467],{"id":2466},"configuration","Configuration",[164,2469,2470,2476,2482],{},[40,2471,2472,2475],{},[21,2473,2474],{},"ObjectId",", the NodeId of the object that owns the method.",[40,2477,2478,2481],{},[21,2479,2480],{},"MethodId",", the NodeId of the method itself.",[40,2483,2484,2487],{},[21,2485,2486],{},"Check button",", validates the method and loads its input\u002Foutput argument definitions. Use the Browse node first if you need to discover an object's methods.",[14,2489,2490,2491,2493,2494,1646,2497,2500,2501,2503,2504,2506,2507,1646,2510,30],{},"Pass the method's arguments as a named-property object in ",[209,2492,1155],{},". Override the object and method dynamically with ",[209,2495,2496],{},"msg.objectId",[209,2498,2499],{},"msg.methodId"," (these take precedence over the node configuration). Arguments may themselves be arrays or ExtensionObjects. The result carries output arguments on ",[209,2502,1155],{},", plus a ",[209,2505,1230],{}," and the echoed ",[209,2508,2509],{},"objectId",[209,2511,2512],{},"methodId",[1120,2514,2516],{"className":1353,"code":2515,"language":1355,"meta":362,"style":362},"msg.objectId = \"ns=2;s=ProcessController\";\nmsg.methodId = \"ns=2;s=StartProcess\";\nmsg.payload = {\n    processId: \"PROC_001\",\n    targetTemperature: 150.0\n};\n",[209,2517,2518,2538,2558,2570,2586,2596],{"__ignoreMap":362},[1359,2519,2520,2522,2524,2527,2529,2531,2534,2536],{"class":1361,"line":1362},[1359,2521,1366],{"class":1365},[1359,2523,30],{"class":1369},[1359,2525,2526],{"class":1365},"objectId ",[1359,2528,1375],{"class":1369},[1359,2530,1378],{"class":1369},[1359,2532,2533],{"class":1381},"ns=2;s=ProcessController",[1359,2535,1384],{"class":1369},[1359,2537,1387],{"class":1369},[1359,2539,2540,2542,2544,2547,2549,2551,2554,2556],{"class":1361,"line":1390},[1359,2541,1366],{"class":1365},[1359,2543,30],{"class":1369},[1359,2545,2546],{"class":1365},"methodId ",[1359,2548,1375],{"class":1369},[1359,2550,1378],{"class":1369},[1359,2552,2553],{"class":1381},"ns=2;s=StartProcess",[1359,2555,1384],{"class":1369},[1359,2557,1387],{"class":1369},[1359,2559,2560,2562,2564,2566,2568],{"class":1361,"line":1522},[1359,2561,1366],{"class":1365},[1359,2563,30],{"class":1369},[1359,2565,1743],{"class":1365},[1359,2567,1375],{"class":1369},[1359,2569,1896],{"class":1369},[1359,2571,2572,2575,2577,2579,2582,2584],{"class":1361,"line":1835},[1359,2573,2574],{"class":1784},"    processId",[1359,2576,1025],{"class":1369},[1359,2578,1378],{"class":1369},[1359,2580,2581],{"class":1381},"PROC_001",[1359,2583,1384],{"class":1369},[1359,2585,1912],{"class":1369},[1359,2587,2588,2591,2593],{"class":1361,"line":1865},[1359,2589,2590],{"class":1784},"    targetTemperature",[1359,2592,1025],{"class":1369},[1359,2594,2595],{"class":1748}," 150.0\n",[1359,2597,2598],{"class":1361,"line":1872},[1359,2599,1995],{"class":1369},[14,2601,2602],{},"Example, pass an array argument and an ExtensionObject argument:",[1120,2604,2606],{"className":1353,"code":2605,"language":1355,"meta":362,"style":362},"msg.payload = {\n    setpoints: [25.0, 30.0, 35.0],\n    config: { UaTypeId: \"ns=2;i=1001\", UaBody: { mode: \"Auto\", limit: 80 } }\n};\n",[209,2607,2608,2620,2646,2700],{"__ignoreMap":362},[1359,2609,2610,2612,2614,2616,2618],{"class":1361,"line":1362},[1359,2611,1366],{"class":1365},[1359,2613,30],{"class":1369},[1359,2615,1743],{"class":1365},[1359,2617,1375],{"class":1369},[1359,2619,1896],{"class":1369},[1359,2621,2622,2625,2627,2629,2632,2634,2637,2639,2642,2644],{"class":1361,"line":1390},[1359,2623,2624],{"class":1784},"    setpoints",[1359,2626,1025],{"class":1369},[1359,2628,1479],{"class":1365},[1359,2630,2631],{"class":1748},"25.0",[1359,2633,1489],{"class":1369},[1359,2635,2636],{"class":1748}," 30.0",[1359,2638,1489],{"class":1369},[1359,2640,2641],{"class":1748}," 35.0",[1359,2643,1499],{"class":1365},[1359,2645,1912],{"class":1369},[1359,2647,2648,2651,2653,2655,2658,2660,2662,2664,2666,2668,2671,2673,2675,2678,2680,2682,2684,2686,2688,2691,2693,2696,2698],{"class":1361,"line":1522},[1359,2649,2650],{"class":1784},"    config",[1359,2652,1025],{"class":1369},[1359,2654,2046],{"class":1369},[1359,2656,2657],{"class":1784}," UaTypeId",[1359,2659,1025],{"class":1369},[1359,2661,1378],{"class":1369},[1359,2663,558],{"class":1381},[1359,2665,1384],{"class":1369},[1359,2667,1489],{"class":1369},[1359,2669,2670],{"class":1784}," UaBody",[1359,2672,1025],{"class":1369},[1359,2674,2046],{"class":1369},[1359,2676,2677],{"class":1784}," mode",[1359,2679,1025],{"class":1369},[1359,2681,1378],{"class":1369},[1359,2683,2435],{"class":1381},[1359,2685,1384],{"class":1369},[1359,2687,1489],{"class":1369},[1359,2689,2690],{"class":1784}," limit",[1359,2692,1025],{"class":1369},[1359,2694,2695],{"class":1748}," 80",[1359,2697,2099],{"class":1369},[1359,2699,1862],{"class":1369},[1359,2701,2702],{"class":1361,"line":1835},[1359,2703,1995],{"class":1369},[159,2705,2707],{"id":2706},"method-status-code-categories","Method status code categories",[407,2709,2710,2723],{},[410,2711,2712],{},[413,2713,2714,2717,2720],{},[416,2715,2716],{},"Category",[416,2718,2719],{},"Examples",[416,2721,2722],{},"Retryable?",[423,2724,2725,2734,2745,2756,2767,2778,2789],{},[413,2726,2727,2730,2732],{},[428,2728,2729],{},"Success",[428,2731,2300],{},[428,2733],{},[413,2735,2736,2739,2742],{},[428,2737,2738],{},"Parameter",[428,2740,2741],{},"BadInvalidArgument, BadArgumentsMissing, BadTypeMismatch, BadOutOfRange",[428,2743,2744],{},"No, fix inputs",[413,2746,2747,2750,2753],{},[428,2748,2749],{},"Method availability",[428,2751,2752],{},"BadMethodInvalid, BadMethodNotCallable, BadNotExecutable",[428,2754,2755],{},"No",[413,2757,2758,2761,2764],{},[428,2759,2760],{},"Security",[428,2762,2763],{},"BadUserAccessDenied, BadNoValidCertificate",[428,2765,2766],{},"No, fix access\u002Fcerts",[413,2768,2769,2772,2775],{},[428,2770,2771],{},"Communication",[428,2773,2774],{},"BadCommunicationError, BadTimeout, BadServerNotConnected",[428,2776,2777],{},"Yes, retry\u002Fback off",[413,2779,2780,2783,2786],{},[428,2781,2782],{},"Server state",[428,2784,2785],{},"BadStateNotActive, BadShutdown",[428,2787,2788],{},"Sometimes",[413,2790,2791,2794,2797],{},[428,2792,2793],{},"Resource",[428,2795,2796],{},"BadOutOfMemory, BadResourceUnavailable, BadTooManyOps",[428,2798,2799],{},"Yes, wait and retry",[32,2801,2803],{"id":2802},"_10-monitor","10. Monitor",[14,2805,2806],{},"The Monitor node subscribes to variables and emits a message whenever a value changes, no polling. Use Monitor for live data; use Read for occasional on-demand checks.",[14,2808,2809],{},[359,2810],{"alt":2811,"dataZoomable":362,"src":2812,"title":2813},"\"The Monitor node configuration with subscription, NodeId, sampling interval, deadband, and queue size\"","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fimages\u002Fopcua\u002Fopcua-client2-monitor.png","The Monitor node configuration",[159,2815,2817],{"id":2816},"concepts","Concepts",[164,2819,2820,2826,2832,2838],{},[40,2821,2822,2825],{},[21,2823,2824],{},"Subscription",", configured on the connection (publishing interval, lifetime, priority). One subscription efficiently carries many monitored items.",[40,2827,2828,2831],{},[21,2829,2830],{},"Monitored item",", each tracked variable, with its own sampling interval, queue size, and optional filter.",[40,2833,2834,2837],{},[21,2835,2836],{},"Notification behaviour",", a monitored item notifies only when the value actually changes (per the OPC UA spec), and once at monitoring start: the initial value is always reported.",[40,2839,2840,2843],{},[21,2841,2842],{},"Resilience",", the Monitor node reconnects automatically after a connection loss and re-establishes its subscription and monitored items, resuming without manual intervention.",[366,2845,2847,2850],{"className":2846},[369,370],[14,2848,375],{"className":2849},[374],[366,2851,2853],{"className":2852},[379],[14,2854,2855,2856,2859],{},"Each notification carries ",[209,2857,2858],{},"msg.sequenceNumber",". Watch it for gaps to detect dropped notifications, for example when a server-side queue overflows under a heavy change rate.",[159,2861,1138],{"id":2862},"nodeid-source-priority-order-2",[37,2864,2865,2869,2873],{},[40,2866,2867],{},[209,2868,1145],{},[40,2870,2871],{},[209,2872,1150],{},[40,2874,1158],{},[159,2876,2878],{"id":2877},"modes","Modes",[164,2880,2881,2893,2902,2908],{},[40,2882,2883,2886,2887,2889,2890,30],{},[21,2884,2885],{},"Single variable",", configure a static NodeId, or inject one via ",[209,2888,1145],{}," at runtime to change which variable is monitored without redeploying. To inject, clear the NodeId field and turn off ",[21,2891,2892],{},"Start Immediately",[40,2894,2895,2898,2899,2901],{},[21,2896,2897],{},"Multiple variables (array)",", inject an array of NodeIds; the output ",[209,2900,1155],{}," is the full array of current values in the same order, re-sent whenever any one of them changes. All items share the subscription's sampling interval.",[40,2903,2904,2907],{},[21,2905,2906],{},"Named JSON structure",", inject a JSON object whose leaf values are NodeIds (the shape Explore produces); notifications arrive in the same shape with current readings.",[40,2909,2910,2913,2914,2917],{},[21,2911,2912],{},"Entire subtree",", use Explore once (output type ",[209,2915,2916],{},"NodeId",") to discover all variables under a branch, then feed that structure into Monitor to watch them all live.",[14,2919,2920,2921,2925],{},"In the array and named-structure modes, the set you inject replaces the previous one. See ",[26,2922,2924],{"href":2923},"#changing-or-stopping-what-is-monitored","Changing or stopping what is monitored"," to add, remove, or stop monitored items at runtime.",[159,2927,2929],{"id":2928},"message-properties-override-node-config-per-message","Message properties (override node config per message)",[164,2931,2932,2940,2950,2963,2969,2975],{},[40,2933,2934,212,2936,1064,2938,30],{},[209,2935,1217],{},[209,2937,1199],{},[209,2939,1226],{},[40,2941,2942,2945,2946,2949],{},[209,2943,2944],{},"msg.samplingInterval",", milliseconds, or ",[209,2947,2948],{},"0"," to use the variable's minimum sampling interval.",[40,2951,2952,212,2955,212,2957,1182,2960,30],{},[209,2953,2954],{},"msg.deadbandType",[209,2956,988],{},[209,2958,2959],{},"Absolute",[209,2961,2962],{},"Percent",[40,2964,2965,2968],{},[209,2966,2967],{},"msg.deadbandValue",", the deadband threshold.",[40,2970,2971,2974],{},[209,2972,2973],{},"msg.queueSize",", server-side queue depth (default 1000).",[40,2976,2977,2980,2981,2983,2984,2987,2988,2990,2991,2994,2995,2997],{},[209,2978,2979],{},"msg.discardOldest",", when the queue is full, drop the oldest (",[209,2982,1086],{},") or the newest (",[209,2985,2986],{},"false","). Note the message property defaults to ",[209,2989,2986],{},", the opposite of the node's ",[21,2992,2993],{},"Discard Oldest"," field (which defaults to ",[209,2996,1086],{},"): set it explicitly when injecting to avoid silently discarding the newest values.",[159,2999,3001],{"id":3000},"quick-start","Quick start",[37,3003,3004,3007,3012],{},[40,3005,3006],{},"Add a Monitor node and select the endpoint and a subscription.",[40,3008,3009,3010,999],{},"Enter the NodeId (e.g. ",[209,3011,1484],{},[40,3013,3014,3015,3017],{},"Enable ",[21,3016,2892],{}," and deploy. The node emits a message on each value change.",[14,3019,3020],{},"Example, monitor several variables by injecting an array of NodeIds:",[1120,3022,3024],{"className":1353,"code":3023,"language":1355,"meta":362,"style":362},"msg.payload = [\n    \"ns=1;s=Temperature\",\n    \"ns=1;s=Pressure\",\n    \"ns=1;s=FlowRate\"\n];\n",[209,3025,3026,3038,3049,3060,3070],{"__ignoreMap":362},[1359,3027,3028,3030,3032,3034,3036],{"class":1361,"line":1362},[1359,3029,1366],{"class":1365},[1359,3031,30],{"class":1369},[1359,3033,1743],{"class":1365},[1359,3035,1375],{"class":1369},[1359,3037,1776],{"class":1365},[1359,3039,3040,3043,3045,3047],{"class":1361,"line":1390},[1359,3041,3042],{"class":1369},"    \"",[1359,3044,1484],{"class":1381},[1359,3046,1384],{"class":1369},[1359,3048,1912],{"class":1369},[1359,3050,3051,3053,3056,3058],{"class":1361,"line":1522},[1359,3052,3042],{"class":1369},[1359,3054,3055],{"class":1381},"ns=1;s=Pressure",[1359,3057,1384],{"class":1369},[1359,3059,1912],{"class":1369},[1359,3061,3062,3064,3067],{"class":1361,"line":1835},[1359,3063,3042],{"class":1369},[1359,3065,3066],{"class":1381},"ns=1;s=FlowRate",[1359,3068,3069],{"class":1369},"\"\n",[1359,3071,3072,3074],{"class":1361,"line":1865},[1359,3073,1499],{"class":1365},[1359,3075,1387],{"class":1369},[14,3077,3078],{},"All items in the array share one subscription, sampling interval, and queue, more efficient than one Monitor node per variable. As a rough guide: under 10 items is trivial, 10–100 is the efficient sweet spot, 100–1000 may need tuned subscription parameters, and beyond 1000 split the work across multiple Monitor nodes.",[159,3080,2924],{"id":3081},"changing-or-stopping-what-is-monitored",[14,3083,3084],{},"The injected NodeId set is declarative: whatever you inject becomes the complete set of monitored items, replacing whatever was monitored before. The node has no separate stop or unsubscribe command because you do not need one, you change the set instead.",[164,3086,3087,3093,3107],{},[40,3088,3089,3092],{},[21,3090,3091],{},"Reduce the set",", inject a shorter array. The dropped NodeIds are released as monitored items on the server, not merely filtered out of the node's output.",[40,3094,3095,3098,3099,3102,3103,3106],{},[21,3096,3097],{},"Stop monitoring",", inject an empty array (",[209,3100,3101],{},"[]","), or an empty object (",[209,3104,3105],{},"{}",") if you are injecting the named JSON structure. Every monitored item is released and the node stops emitting.",[40,3108,3109,3112],{},[21,3110,3111],{},"Restart monitoring",", inject the NodeId array again. The subscription itself persists while empty, which costs almost nothing and makes restarting immediate.",[14,3114,3115],{},"This is how you start and stop monitoring programmatically, from an Inject node or a dashboard control, without editing and redeploying the flow.",[14,3117,3118],{},"Example, stop monitoring:",[1120,3120,3122],{"className":1353,"code":3121,"language":1355,"meta":362,"style":362},"msg.payload = [];\n",[209,3123,3124],{"__ignoreMap":362},[1359,3125,3126,3128,3130,3132,3134,3137],{"class":1361,"line":1362},[1359,3127,1366],{"class":1365},[1359,3129,30],{"class":1369},[1359,3131,1743],{"class":1365},[1359,3133,1375],{"class":1369},[1359,3135,3136],{"class":1365}," []",[1359,3138,1387],{"class":1369},[366,3140,3142,3145],{"className":3141},[369,370],[14,3143,375],{"className":3144},[374],[366,3146,3148],{"className":3147},[379],[14,3149,3150],{},"Injecting an empty array releases the monitored items but leaves the now-empty subscription in place on the connection, so it is the right way to pause and resume a stream. To tear the session down completely, disconnect the connection instead.",[159,3152,3154],{"id":3153},"deadband-filtering","Deadband filtering",[14,3156,3157,3160],{},[26,3158,3154],{"href":3159},"\u002Fblog\u002F2026\u002F04\u002Fstop-noisy-sensor-data-deadband-filter-flowfuse\u002F#what-is-a-deadband-filter"," suppresses insignificant changes, essential for analog values that jitter. The server applies it, so it also reduces network traffic.",[407,3162,3163,3173],{},[410,3164,3165],{},[413,3166,3167,3170],{},[416,3168,3169],{},"Type",[416,3171,3172],{},"Behaviour",[423,3174,3175,3182,3192],{},[413,3176,3177,3179],{},[428,3178,988],{},[428,3180,3181],{},"All changes reported (default).",[413,3183,3184,3186],{},[428,3185,2959],{},[428,3187,3188,3189,30],{},"Report only when ",[209,3190,3191],{},"abs(new − lastReported) > value",[413,3193,3194,3196],{},[428,3195,2962],{},[428,3197,3198],{},"Report only when the change exceeds a percentage of the variable's EURange. Requires the variable to expose an EURange property.",[366,3200,3202,3205],{"className":3201},[369,370],[14,3203,375],{"className":3204},[374],[366,3206,3208],{"className":3207},[379],[14,3209,3210],{},"Deadband compares against the last reported value, not the last sampled value. The initial value is always reported. Use Absolute when a variable has no EURange, Percent silently does nothing without one.",[32,3212,3214],{"id":3213},"_11-monitor-event","11. Monitor Event",[14,3216,3217],{},"The Monitor Event node subscribes to events and alarms rather than value changes, alarm activations, state transitions, audit\u002Fsecurity events, and system notifications.",[159,3219,3221],{"id":3220},"filtering","Filtering",[164,3223,3224,3230],{},[40,3225,3226,3229],{},[21,3227,3228],{},"Where Clause",", a server-side filter selecting which events to receive. Far more efficient than post-filtering in a Function node.",[40,3231,3232,3235,3236,3239,3240,3242,3243,3246,3247,3250,3251,30],{},[21,3233,3234],{},"Select Clause",": comma-separated fields to retrieve (e.g. ",[209,3237,3238],{},"EventId, Time, Message, Severity","). The ",[209,3241,624],{}," button opens a graphical selector that browses the event type hierarchy. Request only the fields you use: smaller messages, less processing. Common sets: basic ",[209,3244,3245],{},"EventId,Time,Message,Severity","; alarms add ",[209,3248,3249],{},"SourceName,ActiveState,AckedState","; audits add ",[209,3252,3253],{},"ActionTimeStamp,ClientUserId",[14,3255,3256,3257,3259],{},"Match the subscription to the event rate: a slower publishing interval suits alarms and audits, a faster one suits high-frequency process events. For mixed workloads, use separate Monitor Event nodes on different subscriptions (see ",[26,3258,69],{"href":68},") so critical alarms don't queue behind noisy low-priority events.",[159,3261,3263],{"id":3262},"where-clause-syntax","Where Clause syntax",[14,3265,3266,3267,212,3270,212,3273,212,3276,212,3279,212,3282,3285],{},"Filter on the standard event fields (",[209,3268,3269],{},"EventId",[209,3271,3272],{},"EventType",[209,3274,3275],{},"SourceName",[209,3277,3278],{},"Time",[209,3280,3281],{},"Message",[209,3283,3284],{},"Severity","):",[164,3287,3288,3294,3300,3306,3312],{},[40,3289,3290,3291],{},"Type filtering, ",[209,3292,3293],{},"ofType('AlarmConditionType')",[40,3295,3296,3297],{},"Numeric comparison, ",[209,3298,3299],{},"Severity >= 700",[40,3301,3302,3303],{},"String equality, ",[209,3304,3305],{},"SourceName = \"Reactor1\"",[40,3307,3308,3309],{},"Boolean fields, ",[209,3310,3311],{},"ActiveState = true",[40,3313,3314,3315,1691,3318,212,3321],{},"Combine with ",[209,3316,3317],{},"AND",[209,3319,3320],{},"OR",[209,3322,3323],{},"ofType('AlarmConditionType') AND Severity >= 700",[14,3325,3326,3327,3329,3330,3333,3334,3337,3338,3341,3342,690,3344,3329,3346,690,3349,3352],{},"Common syntax mistakes: quote type names (",[209,3328,3293],{},", not ",[209,3331,3332],{},"ofType(AlarmConditionType)","); use ",[209,3335,3336],{},">="," not ",[209,3339,3340],{},"=>","; and use ",[209,3343,3317],{},[209,3345,3320],{},[209,3347,3348],{},"&&",[209,3350,3351],{},"||",". Restrict the Where Clause to standard fields, type-specific fields belong in the Select Clause, not the filter.",[159,3354,3356],{"id":3355},"event-type-hierarchy-and-severity","Event type hierarchy and severity",[14,3358,3359,3360,3363,3364,212,3367,992,3370,3373,3374,1646,3377,3380,3381,212,3384,212,3387,992,3390,3393,3394,212,3397,3400],{},"Events derive from ",[209,3361,3362],{},"BaseEventType",", with ",[209,3365,3366],{},"SystemEventType",[209,3368,3369],{},"AuditEventType",[209,3371,3372],{},"AlarmConditionType"," (and alarm subtypes such as ",[209,3375,3376],{},"LimitAlarmType",[209,3378,3379],{},"DiscreteAlarmType",") beneath it. The Select Clause fields available depend on the event type, alarms expose ",[209,3382,3383],{},"ActiveState",[209,3385,3386],{},"AckedState",[209,3388,3389],{},"ConfirmedState",[209,3391,3392],{},"Retain","; audit events expose ",[209,3395,3396],{},"ActionTimeStamp",[209,3398,3399],{},"Status",", and related fields.",[14,3402,3403,3404,3406,3407,3410],{},"Severity runs from 1 (informational) to 1000 (critical). A rough scale: 1–200 low\u002Finformational, 201–400 minor, 401–600 noteworthy, 601–800 important warnings, 801–1000 critical. A common production filter is ",[209,3405,219],{},". To capture all server events, monitor the Server object at ",[209,3408,3409],{},"i=2253"," with an empty Where Clause.",[14,3412,3413],{},"Example, monitor all server events:",[1120,3415,3418],{"className":3416,"code":3417,"language":1125},[1123],"NodeId:        i=2253\nWhere Clause:  (empty)\nSelect Clause: EventId,EventType,SourceName,Time,Message,Severity\n",[209,3419,3417],{"__ignoreMap":362},[366,3421,3423,3426],{"className":3422},[369,370],[14,3424,375],{"className":3425},[374],[366,3427,3429],{"className":3428},[379],[14,3430,3431,3432,3435,3436,3438],{},"If no events arrive, verify the server supports events (read the object's ",[209,3433,3434],{},"EventNotifier"," attribute, a non-zero value means it emits events), point the NodeId at an event-generating object (try ",[209,3437,3409],{},"), and clear the Where Clause. If too many arrive, tighten the Where Clause by type and severity, or point at specific equipment instead of the Server object.",[32,3440,3442],{"id":3441},"_12-browse","12. Browse",[14,3444,3445,3446,1064,3448,30],{},"The Browse node lists the references of one node, one level of the address space. Specify the node with ",[209,3447,1145],{},[209,3449,1150],{},[159,3451,3453],{"id":3452},"configuration-options","Configuration options",[164,3455,3456,3461,3470,3481,3487,3493],{},[40,3457,3458,3460],{},[21,3459,2916],{},", the node whose references to list.",[40,3462,3463,3466,3467,999],{},[21,3464,3465],{},"ReferenceTypeId",", which reference type to follow, chosen from the reference-type hierarchy (e.g. ",[209,3468,3469],{},"HasComponent",[40,3471,3472,3475,3476,3478,3479,999],{},[21,3473,3474],{},"IncludeSubType",", follow only the exact type (",[209,3477,2986],{},") or also its subtypes (",[209,3480,1086],{},[40,3482,3483,3486],{},[21,3484,3485],{},"BrowseDirection",", forward, inverse, or both.",[40,3488,3489,3492],{},[21,3490,3491],{},"Node Class Mask",", return only targets of selected node classes: Object, Variable, Method, ObjectType, VariableType, ReferenceType, DataType, View.",[40,3494,3495,3498],{},[21,3496,3497],{},"Result Mask",", which fields to return: ReferenceType, IsForward, NodeClass, BrowseName, DisplayName, TypeDefinition. The NodeId is always included regardless of the mask.",[14,3500,3501,3502,3505],{},"Any of these can be overridden per message (for example ",[209,3503,3504],{},"msg.referenceTypeId","), so a single Browse node can serve different queries driven from upstream.",[1120,3507,3509],{"className":1353,"code":3508,"language":1355,"meta":362,"style":362},"msg.nodeId = \"ns=0;i=85\";   \u002F\u002F the Objects folder\n",[209,3510,3511],{"__ignoreMap":362},[1359,3512,3513,3515,3517,3519,3521,3523,3526,3528,3530],{"class":1361,"line":1362},[1359,3514,1366],{"class":1365},[1359,3516,30],{"class":1369},[1359,3518,1411],{"class":1365},[1359,3520,1375],{"class":1369},[1359,3522,1378],{"class":1369},[1359,3524,3525],{"class":1381},"ns=0;i=85",[1359,3527,1384],{"class":1369},[1359,3529,1752],{"class":1369},[1359,3531,3532],{"class":1393},"   \u002F\u002F the Objects folder\n",[14,3534,3535,3536,3538],{},"The node returns the node's direct children on ",[209,3537,1155],{},", each entry carries the fields selected in the Result Mask, for example:",[1120,3540,3544],{"className":3541,"code":3542,"language":3543,"meta":362,"style":362},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\n    { \"nodeId\": \"ns=2;s=DeviceSet\",  \"browseName\": \"DeviceSet\",  \"nodeClass\": \"Object\" },\n    { \"nodeId\": \"ns=2;s=Boiler\",     \"browseName\": \"Boiler\",     \"nodeClass\": \"Object\" }\n]\n","json",[209,3545,3546,3551,3608,3663],{"__ignoreMap":362},[1359,3547,3548],{"class":1361,"line":1362},[1359,3549,3550],{"class":1369},"[\n",[1359,3552,3553,3555,3557,3560,3562,3564,3566,3569,3571,3573,3576,3578,3580,3582,3584,3587,3589,3591,3593,3595,3597,3599,3601,3604,3606],{"class":1361,"line":1390},[1359,3554,1781],{"class":1369},[1359,3556,1378],{"class":1369},[1359,3558,1265],{"class":3559},"spNyl",[1359,3561,1384],{"class":1369},[1359,3563,1025],{"class":1369},[1359,3565,1378],{"class":1369},[1359,3567,3568],{"class":1381},"ns=2;s=DeviceSet",[1359,3570,1384],{"class":1369},[1359,3572,1489],{"class":1369},[1359,3574,3575],{"class":1369},"  \"",[1359,3577,1273],{"class":3559},[1359,3579,1384],{"class":1369},[1359,3581,1025],{"class":1369},[1359,3583,1378],{"class":1369},[1359,3585,3586],{"class":1381},"DeviceSet",[1359,3588,1384],{"class":1369},[1359,3590,1489],{"class":1369},[1359,3592,3575],{"class":1369},[1359,3594,1270],{"class":3559},[1359,3596,1384],{"class":1369},[1359,3598,1025],{"class":1369},[1359,3600,1378],{"class":1369},[1359,3602,3603],{"class":1381},"Object",[1359,3605,1384],{"class":1369},[1359,3607,1805],{"class":1369},[1359,3609,3610,3612,3614,3616,3618,3620,3622,3625,3627,3629,3632,3634,3636,3638,3640,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661],{"class":1361,"line":1522},[1359,3611,1781],{"class":1369},[1359,3613,1378],{"class":1369},[1359,3615,1265],{"class":3559},[1359,3617,1384],{"class":1369},[1359,3619,1025],{"class":1369},[1359,3621,1378],{"class":1369},[1359,3623,3624],{"class":1381},"ns=2;s=Boiler",[1359,3626,1384],{"class":1369},[1359,3628,1489],{"class":1369},[1359,3630,3631],{"class":1369},"     \"",[1359,3633,1273],{"class":3559},[1359,3635,1384],{"class":1369},[1359,3637,1025],{"class":1369},[1359,3639,1378],{"class":1369},[1359,3641,3642],{"class":1381},"Boiler",[1359,3644,1384],{"class":1369},[1359,3646,1489],{"class":1369},[1359,3648,3631],{"class":1369},[1359,3650,1270],{"class":3559},[1359,3652,1384],{"class":1369},[1359,3654,1025],{"class":1369},[1359,3656,1378],{"class":1369},[1359,3658,3603],{"class":1381},[1359,3660,1384],{"class":1369},[1359,3662,1862],{"class":1369},[1359,3664,3665],{"class":1361,"line":1835},[1359,3666,3667],{"class":1369},"]\n",[14,3669,3670,3671,3673],{},"Browse is also how you discover a method's owning object and arguments before configuring a Call node: browse the object for ",[209,3672,3469],{}," references of node class Method.",[32,3675,3677],{"id":3676},"_13-explore","13. Explore",[14,3679,3680],{},"The Explore node recursively traverses a subtree and returns the whole structure as a JSON object, unlike Browse, which shows a single level.",[159,3682,3684],{"id":3683},"features","Features",[164,3686,3687,3690,3693,3696],{},[40,3688,3689],{},"Recursive traversal of an entire subtree in one operation.",[40,3691,3692],{},"Multiple output types for leaf variables (see below).",[40,3694,3695],{},"Depth control, exclusion of empty nodes, and selection of which references to follow.",[40,3697,3698],{},"Output that feeds directly into the Monitor node and the Read-as-structure mode.",[14,3700,3701],{},"Traversal stops at variable nodes: the explorer reads each variable (returning the selected output type) and does not recurse into a variable's own children. To inspect a variable's children, start an Explore directly on that variable node.",[159,3703,3705],{"id":3704},"output-types","Output types",[14,3707,3708],{},"The output type sets what each leaf variable returns:",[407,3710,3711,3724],{},[410,3712,3713],{},[413,3714,3715,3718,3721],{},[416,3716,3717],{},"Output type",[416,3719,3720],{},"Returns",[416,3722,3723],{},"Typical use",[423,3725,3726,3736,3746,3756,3766,3777,3788,3799],{},[413,3727,3728,3730,3733],{},[428,3729,1199],{},[428,3731,3732],{},"Current values",[428,3734,3735],{},"Display, analysis, dashboards",[413,3737,3738,3740,3743],{},[428,3739,2916],{},[428,3741,3742],{},"Node identifiers",[428,3744,3745],{},"Wiring into Monitor \u002F Read \u002F Write",[413,3747,3748,3750,3753],{},[428,3749,1226],{},[428,3751,3752],{},"Values with quality and timestamps",[428,3754,3755],{},"Quality checks, freshness validation",[413,3757,3758,3760,3763],{},[428,3759,1634],{},[428,3761,3762],{},"Value with its data-type information",[428,3764,3765],{},"Typed values without full quality\u002Ftimestamp metadata",[413,3767,3768,3771,3774],{},[428,3769,3770],{},"StatusCode",[428,3772,3773],{},"Quality only (Good\u002FBad\u002FUncertain)",[428,3775,3776],{},"Health checks, finding bad sensors",[413,3778,3779,3782,3785],{},[428,3780,3781],{},"BrowsePath",[428,3783,3784],{},"Full browse paths with namespace indices",[428,3786,3787],{},"Documentation, technical reference",[413,3789,3790,3793,3796],{},[428,3791,3792],{},"AliasedBrowsePath",[428,3794,3795],{},"Simplified dotted paths",[428,3797,3798],{},"Human-readable references, config files",[413,3800,3801,3804,3807],{},[428,3802,3803],{},"NSUNodeId",[428,3805,3806],{},"NodeIds with namespace URIs",[428,3808,3809],{},"Cross-server \u002F portable configurations",[159,3811,3813],{"id":3812},"scope-controls","Scope controls",[164,3815,3816,3841,3850],{},[40,3817,3818,212,3821,3823,3824,212,3827,992,3830,3832,3833,3835,3836,690,3838,3840],{},[21,3819,3820],{},"followOrganizes",[209,3822,1086],{}," follows ",[209,3825,3826],{},"Organizes",[209,3828,3829],{},"HasProperty",[209,3831,3469],{}," (complete equipment discovery); ",[209,3834,2986],{}," follows only ",[209,3837,3829],{},[209,3839,3469],{}," (direct properties).",[40,3842,3843,1257,3846,3849],{},[21,3844,3845],{},"excludeEmpty",[209,3847,3848],{},"msg.excludeEmpty = true"," to drop branches that contain no variables, for cleaner output.",[40,3851,3852,3855],{},[21,3853,3854],{},"Depth",", Explore follows the full hierarchy under the start node (default maximum depth 10). Rather than a depth setting, control scope by choosing a more specific start NodeId: roughly 2–3 levels for one piece of equipment, 4–6 for a production line, 7–10 for a whole plant.",[366,3857,3859,3862],{"className":3858},[369,649],[14,3860,653],{"className":3861},[374],[366,3863,3865],{"className":3864},[379],[14,3866,3867,3868,3870,3871,3874],{},"Starting Explore at the Objects folder (",[209,3869,3525],{},") or another root node traverses the entire server and can return a very large structure. Start from a specific NodeId (or ",[209,3872,3873],{},"\u002FServer\u002FServerStatus"," if you are just getting your bearings) and expand scope deliberately.",[14,3876,3877,3878,3880,3881,3883],{},"Example, exploring ",[209,3879,3873],{}," with output type ",[209,3882,2916],{}," returns a nested object whose leaves are the NodeIds of each variable:",[1120,3885,3887],{"className":3541,"code":3886,"language":3543,"meta":362,"style":362},"{\n    \"StartTime\":   \"ns=0;i=2257\",\n    \"CurrentTime\": \"ns=0;i=2258\",\n    \"State\":       \"ns=0;i=2259\",\n    \"BuildInfo\": {\n        \"ProductName\":     \"ns=0;i=2263\",\n        \"SoftwareVersion\": \"ns=0;i=2264\"\n    }\n}\n",[209,3888,3889,3894,3915,3935,3956,3969,3991,4009,4014],{"__ignoreMap":362},[1359,3890,3891],{"class":1361,"line":1362},[1359,3892,3893],{"class":1369},"{\n",[1359,3895,3896,3898,3901,3903,3905,3908,3911,3913],{"class":1361,"line":1390},[1359,3897,3042],{"class":1369},[1359,3899,3900],{"class":3559},"StartTime",[1359,3902,1384],{"class":1369},[1359,3904,1025],{"class":1369},[1359,3906,3907],{"class":1369},"   \"",[1359,3909,3910],{"class":1381},"ns=0;i=2257",[1359,3912,1384],{"class":1369},[1359,3914,1912],{"class":1369},[1359,3916,3917,3919,3922,3924,3926,3928,3931,3933],{"class":1361,"line":1522},[1359,3918,3042],{"class":1369},[1359,3920,3921],{"class":3559},"CurrentTime",[1359,3923,1384],{"class":1369},[1359,3925,1025],{"class":1369},[1359,3927,1378],{"class":1369},[1359,3929,3930],{"class":1381},"ns=0;i=2258",[1359,3932,1384],{"class":1369},[1359,3934,1912],{"class":1369},[1359,3936,3937,3939,3942,3944,3946,3949,3952,3954],{"class":1361,"line":1835},[1359,3938,3042],{"class":1369},[1359,3940,3941],{"class":3559},"State",[1359,3943,1384],{"class":1369},[1359,3945,1025],{"class":1369},[1359,3947,3948],{"class":1369},"       \"",[1359,3950,3951],{"class":1381},"ns=0;i=2259",[1359,3953,1384],{"class":1369},[1359,3955,1912],{"class":1369},[1359,3957,3958,3960,3963,3965,3967],{"class":1361,"line":1865},[1359,3959,3042],{"class":1369},[1359,3961,3962],{"class":3559},"BuildInfo",[1359,3964,1384],{"class":1369},[1359,3966,1025],{"class":1369},[1359,3968,1896],{"class":1369},[1359,3970,3971,3974,3978,3980,3982,3984,3987,3989],{"class":1361,"line":1872},[1359,3972,3973],{"class":1369},"        \"",[1359,3975,3977],{"class":3976},"sBMFI","ProductName",[1359,3979,1384],{"class":1369},[1359,3981,1025],{"class":1369},[1359,3983,3631],{"class":1369},[1359,3985,3986],{"class":1381},"ns=0;i=2263",[1359,3988,1384],{"class":1369},[1359,3990,1912],{"class":1369},[1359,3992,3993,3995,3998,4000,4002,4004,4007],{"class":1361,"line":2116},[1359,3994,3973],{"class":1369},[1359,3996,3997],{"class":3976},"SoftwareVersion",[1359,3999,1384],{"class":1369},[1359,4001,1025],{"class":1369},[1359,4003,1378],{"class":1369},[1359,4005,4006],{"class":1381},"ns=0;i=2264",[1359,4008,3069],{"class":1369},[1359,4010,4011],{"class":1361,"line":2122},[1359,4012,4013],{"class":1369},"    }\n",[1359,4015,4016],{"class":1361,"line":2135},[1359,4017,4018],{"class":1369},"}\n",[159,4020,4022],{"id":4021},"common-pattern-explore-to-monitor","Common pattern, explore to monitor",[14,4024,4025],{},"Explore a subtree once to discover all its variables, then feed that structure straight into a Monitor node, Monitor returns the same shape with each leaf replaced by its live value.",[1120,4027,4030],{"className":4028,"code":4029,"language":1125},[1123],"[Inject]  →  [Explore]  →  [Monitor]  →  [Debug]\n",[209,4031,4029],{"__ignoreMap":362},[366,4033,4035,4038],{"className":4034},[369,370],[14,4036,375],{"className":4037},[374],[366,4039,4041],{"className":4040},[379],[14,4042,4043],{},"Address spaces rarely change, so cache the Explore result (with a timestamp) and reuse it rather than re-exploring on every deploy. Re-explore periodically only if your server adds or removes variables at runtime.",[32,4045,4047],{"id":4046},"_14-history-read","14. History Read",[14,4049,4050],{},"The History Read node retrieves historical data from servers that store it, the basis for trends, shift reports, audits, and incident investigation.",[159,4052,4054],{"id":4053},"history-types","History types",[164,4056,4057,4063,4069],{},[40,4058,4059,4062],{},[21,4060,4061],{},"Raw",", the raw historical values stored on the server.",[40,4064,4065,4068],{},[21,4066,4067],{},"Raw Modified",", raw values that have since been edited or corrected, with modification tracking.",[40,4070,4071,4074,4075,999],{},[21,4072,4073],{},"Processed Details",", server-side aggregates over a processing interval (set the ",[21,4076,4077],{},"Aggregate Type",[159,4079,4081],{"id":4080},"key-options","Key options",[164,4083,4084,4106,4127,4137],{},[40,4085,4086,4089,4090,4093,4094,212,4097,212,4100,212,4103,999],{},[21,4087,4088],{},"Start Time \u002F End Time",", absolute (ISO 8601, e.g. ",[209,4091,4092],{},"2024-11-20T08:00:00Z",", with optional timezone offset) or relative (",[209,4095,4096],{},"now",[209,4098,4099],{},"1 hour ago",[209,4101,4102],{},"30 minutes ago",[209,4104,4105],{},"7 days ago",[40,4107,4108,4111,4112,212,4115,212,4118,212,4121,212,4124,30],{},[21,4109,4110],{},"Processing Interval",", the aggregation bucket for Processed Details: ",[209,4113,4114],{},"30 seconds",[209,4116,4117],{},"5 minutes",[209,4119,4120],{},"1 hour",[209,4122,4123],{},"1 day",[209,4125,4126],{},"1 week",[40,4128,4129,4132,4133,4136],{},[21,4130,4131],{},"numValuesPerNode"," (",[209,4134,4135],{},"msg.numValuesPerNode","), cap on values returned per node (default 100).",[40,4138,4139,4132,4142,4145],{},[21,4140,4141],{},"returnBounds",[209,4143,4144],{},"msg.returnBounds","), include the bounding values just outside the time range, for continuous trends.",[14,4147,4148,4149,4151,4152,4151,4154,4156],{},"The NodeId follows the usual priority (",[209,4150,1145],{}," → ",[209,4153,1150],{},[209,4155,1155],{}," → node config). Multiple variables can be read by injecting an array of NodeIds.",[159,4158,4160],{"id":4159},"aggregate-types-processed-details","Aggregate types (Processed Details)",[14,4162,4163,212,4166,212,4169,212,4172,212,4175,212,4178,212,4181,212,4184,212,4187,212,4190,212,4193,212,4196,212,4199,212,4202,212,4205,212,4208,212,4211,212,4214,30],{},[209,4164,4165],{},"Average",[209,4167,4168],{},"Count",[209,4170,4171],{},"Delta",[209,4173,4174],{},"DeltaBounds",[209,4176,4177],{},"DurationBad",[209,4179,4180],{},"DurationGood",[209,4182,4183],{},"Interpolative",[209,4185,4186],{},"Maximum",[209,4188,4189],{},"Minimum",[209,4191,4192],{},"PercentBad",[209,4194,4195],{},"PercentGood",[209,4197,4198],{},"Range",[209,4200,4201],{},"StandardDeviationPopulation",[209,4203,4204],{},"StandardDeviationSample",[209,4206,4207],{},"Total",[209,4209,4210],{},"VariancePopulation",[209,4212,4213],{},"VarianceSample",[209,4215,4216],{},"WorstQuality",[159,4218,3705],{"id":4219},"output-types-1",[164,4221,4222,4231,4240,4249,4254],{},[40,4223,4224,212,4227,4230],{},[21,4225,4226],{},"Time+Value",[209,4228,4229],{},"{ value, sourceTimestamp }"," per point.",[40,4232,4233,4236,4237,999],{},[21,4234,4235],{},"Time+Variant",", adds the full Variant (",[209,4238,4239],{},"value: { dataType, value }",[40,4241,4242,4244,4245,1646,4247,30],{},[21,4243,1226],{},", adds ",[209,4246,1230],{},[209,4248,1236],{},[40,4250,4251,4253],{},[21,4252,3770],{},", quality only.",[40,4255,4256,4259],{},[21,4257,4258],{},"DataValueReversible",", DataValue with reversible encoding.",[14,4261,4262,4264,4265,212,4267,212,4270,4273,4274,4276,4277,4279,4280,4282,4283,4285],{},[209,4263,1155],{}," is an array of points, and the node echoes the request (",[209,4266,1265],{},[209,4268,4269],{},"startTime",[209,4271,4272],{},"endTime",") alongside it. Always check each point's ",[209,4275,1230],{}," and filter out bad-quality points before charting or reporting. On failure the payload is an empty array carrying a top-level ",[209,4278,1230],{}," and a ",[209,4281,2277],{},"; an empty array with a ",[209,4284,2300],{}," status simply means no data exists in the requested range, distinguish the two before treating it as an error.",[1120,4287,4289],{"className":1353,"code":4288,"language":1355,"meta":362,"style":362},"msg.startTime = \"1 hour ago\";   msg.endTime = \"now\";                          \u002F\u002F last hour, raw\nmsg.startTime = \"7 days ago\";   msg.processingInterval = \"1 day\";             \u002F\u002F daily averages (Processed Details + Average)\nmsg.startTime = \"2024-11-20T08:00:00Z\";  msg.endTime = \"2024-11-20T17:00:00Z\"; \u002F\u002F explicit range\n",[209,4290,4291,4331,4369],{"__ignoreMap":362},[1359,4292,4293,4295,4297,4300,4302,4304,4306,4308,4310,4313,4315,4318,4320,4322,4324,4326,4328],{"class":1361,"line":1362},[1359,4294,1366],{"class":1365},[1359,4296,30],{"class":1369},[1359,4298,4299],{"class":1365},"startTime ",[1359,4301,1375],{"class":1369},[1359,4303,1378],{"class":1369},[1359,4305,4099],{"class":1381},[1359,4307,1384],{"class":1369},[1359,4309,1752],{"class":1369},[1359,4311,4312],{"class":1365},"   msg",[1359,4314,30],{"class":1369},[1359,4316,4317],{"class":1365},"endTime ",[1359,4319,1375],{"class":1369},[1359,4321,1378],{"class":1369},[1359,4323,4096],{"class":1381},[1359,4325,1384],{"class":1369},[1359,4327,1752],{"class":1369},[1359,4329,4330],{"class":1393},"                          \u002F\u002F last hour, raw\n",[1359,4332,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4356,4358,4360,4362,4364,4366],{"class":1361,"line":1390},[1359,4334,1366],{"class":1365},[1359,4336,30],{"class":1369},[1359,4338,4299],{"class":1365},[1359,4340,1375],{"class":1369},[1359,4342,1378],{"class":1369},[1359,4344,4105],{"class":1381},[1359,4346,1384],{"class":1369},[1359,4348,1752],{"class":1369},[1359,4350,4312],{"class":1365},[1359,4352,30],{"class":1369},[1359,4354,4355],{"class":1365},"processingInterval ",[1359,4357,1375],{"class":1369},[1359,4359,1378],{"class":1369},[1359,4361,4123],{"class":1381},[1359,4363,1384],{"class":1369},[1359,4365,1752],{"class":1369},[1359,4367,4368],{"class":1393},"             \u002F\u002F daily averages (Processed Details + Average)\n",[1359,4370,4371,4373,4375,4377,4379,4381,4383,4385,4387,4390,4392,4394,4396,4398,4401,4403,4405],{"class":1361,"line":1522},[1359,4372,1366],{"class":1365},[1359,4374,30],{"class":1369},[1359,4376,4299],{"class":1365},[1359,4378,1375],{"class":1369},[1359,4380,1378],{"class":1369},[1359,4382,4092],{"class":1381},[1359,4384,1384],{"class":1369},[1359,4386,1752],{"class":1369},[1359,4388,4389],{"class":1365},"  msg",[1359,4391,30],{"class":1369},[1359,4393,4317],{"class":1365},[1359,4395,1375],{"class":1369},[1359,4397,1378],{"class":1369},[1359,4399,4400],{"class":1381},"2024-11-20T17:00:00Z",[1359,4402,1384],{"class":1369},[1359,4404,1752],{"class":1369},[1359,4406,4407],{"class":1393}," \u002F\u002F explicit range\n",[159,4409,4411],{"id":4410},"status-codes","Status codes",[407,4413,4414,4422],{},[410,4415,4416],{},[413,4417,4418,4420],{},[416,4419,776],{},[416,4421,2293],{},[423,4423,4424,4431,4439,4445,4453,4461],{},[413,4425,4426,4428],{},[428,4427,2300],{},[428,4429,4430],{},"Data retrieved.",[413,4432,4433,4436],{},[428,4434,4435],{},"BadHistoryOperationUnsupported",[428,4437,4438],{},"The server does not store history.",[413,4440,4441,4443],{},[428,4442,2308],{},[428,4444,2311],{},[413,4446,4447,4450],{},[428,4448,4449],{},"BadHistoryOperationInvalid",[428,4451,4452],{},"Invalid history parameters.",[413,4454,4455,4458],{},[428,4456,4457],{},"BadTimestampsToReturnInvalid",[428,4459,4460],{},"Invalid timestamp specification.",[413,4462,4463,4466],{},[428,4464,4465],{},"BadMaxAgeInvalid",[428,4467,4468],{},"Invalid time range specified.",[366,4470,4472,4475],{"className":4471},[369,370],[14,4473,375],{"className":4474},[374],[366,4476,4478],{"className":4477},[379],[14,4479,4480,4481,4483],{},"Keep time ranges and ",[209,4482,4131],{}," bounded, prefer aggregation to thin large ranges for charts, and verify the server supports history before relying on it. For very long ranges, chunk the request into smaller windows.",[32,4485,4487],{"id":4486},"_15-file-operation","15. File Operation",[14,4489,4490,4491,4494,4495,4498,4499,30],{},"The File Operation node reads and writes files on servers implementing the OPC UA FileType interface (",[209,4492,4493],{},"ns=0;i=11575","), useful for recipes, configurations, and logs. The NodeId may be a standard NodeId or a browse path (e.g. ",[209,4496,4497],{},"\u002Fns1:Logs\u002Fns1:system.log","), set in the node or via ",[209,4500,1145],{},[159,4502,2878],{"id":4503},"modes-1",[407,4505,4506,4516],{},[410,4507,4508],{},[413,4509,4510,4513],{},[416,4511,4512],{},"Mode",[416,4514,4515],{},"Use",[423,4517,4518,4525,4535,4543],{},[413,4519,4520,4522],{},[428,4521,75],{},[428,4523,4524],{},"Read file contents.",[413,4526,4527,4530],{},[428,4528,4529],{},"ReadSize",[428,4531,4532,4533,30],{},"Return the file size in bytes on ",[209,4534,1155],{},[413,4536,4537,4540],{},[428,4538,4539],{},"Write (a.k.a. WriteEraseExisting)",[428,4541,4542],{},"Create or overwrite a file. An object\u002Farray payload is auto-converted to JSON; booleans\u002Fnumbers become strings.",[413,4544,4545,4548],{},[428,4546,4547],{},"WriteAppend",[428,4549,4550,4551,4554,4555,4558],{},"Append data to an ",[21,4552,4553],{},"existing"," file. End the payload string with ",[209,4556,4557],{},"\\n"," for log lines.",[159,4560,4562],{"id":4561},"encoding-and-format","Encoding and format",[164,4564,4565,4608],{},[40,4566,4567,4570,4571,4574,4575,4578,4579,4582,4583,212,4586,212,4589,212,4592,212,4595,212,4598,212,4601,212,4604,4607],{},[21,4568,4569],{},"Encoding"," (read\u002Fwrite), ",[209,4572,4573],{},"none"," (raw binary, default), ",[209,4576,4577],{},"setbymsg"," (use ",[209,4580,4581],{},"msg.encoding"," at runtime), ",[209,4584,4585],{},"utf8",[209,4587,4588],{},"ascii",[209,4590,4591],{},"utf-16le",[209,4593,4594],{},"Shift_JIS",[209,4596,4597],{},"EUC-JP",[209,4599,4600],{},"GB2312",[209,4602,4603],{},"GBK",[209,4605,4606],{},"Big5",", plus many regional Windows \u002F ISO \u002F IBM \u002F Mac \u002F KOI8 encodings.",[40,4609,4610,4612,4613,4616,4617,4619,4620,4623],{},[21,4611,543],{}," (read only), ",[209,4614,4615],{},"buffer"," (raw Buffer, default), ",[209,4618,4585],{}," (decoded string), or ",[209,4621,4622],{},"lines"," (array split on newlines, ideal for CSV).",[14,4625,4626,4627,4630,4631,4634,4635,4630,4638,4641,4642,4645],{},"For text, pair ",[209,4628,4629],{},"encoding: utf8"," with ",[209,4632,4633],{},"format: utf8","; for binary files (images, PDFs, executables) use ",[209,4636,4637],{},"encoding: none",[209,4639,4640],{},"format: buffer",". The node chunks large files automatically based on the server's ",[209,4643,4644],{},"MaxByteStringLength"," and transport limits, so there is no practical size cap beyond the server's own.",[159,4647,4649],{"id":4648},"output-and-status","Output and status",[14,4651,4652,4653,4655,4656,4659,4660,4663,4664,4667,4668,4671],{},"Read returns content on ",[209,4654,1155],{}," (Buffer, string, or string array per the Format). A write returns the byte count on ",[209,4657,4658],{},"msg.size",". The node status shows ",[209,4661,4662],{},"Operating"," during transfer, ",[209,4665,4666],{},"size = X"," on success, and ",[209,4669,4670],{},"failed"," on error (details in the debug panel).",[1120,4673,4675],{"className":1353,"code":4674,"language":1355,"meta":362,"style":362},"msg.nodeId = \"ns=2;s=RecipeFile\";\nmsg.payload = \"appended log line\\n\";   \u002F\u002F WriteAppend mode\n",[209,4676,4677,4696],{"__ignoreMap":362},[1359,4678,4679,4681,4683,4685,4687,4689,4692,4694],{"class":1361,"line":1362},[1359,4680,1366],{"class":1365},[1359,4682,30],{"class":1369},[1359,4684,1411],{"class":1365},[1359,4686,1375],{"class":1369},[1359,4688,1378],{"class":1369},[1359,4690,4691],{"class":1381},"ns=2;s=RecipeFile",[1359,4693,1384],{"class":1369},[1359,4695,1387],{"class":1369},[1359,4697,4698,4700,4702,4704,4706,4708,4711,4713,4715,4717],{"class":1361,"line":1390},[1359,4699,1366],{"class":1365},[1359,4701,30],{"class":1369},[1359,4703,1743],{"class":1365},[1359,4705,1375],{"class":1369},[1359,4707,1378],{"class":1369},[1359,4709,4710],{"class":1381},"appended log line",[1359,4712,4557],{"class":1365},[1359,4714,1384],{"class":1369},[1359,4716,1752],{"class":1369},[1359,4718,4719],{"class":1393},"   \u002F\u002F WriteAppend mode\n",[159,4721,4723],{"id":4722},"safe-write-patterns","Safe write patterns",[164,4725,4726,4741],{},[40,4727,4728,4731,4732,4734,4735,4737,4738,4740],{},[21,4729,4730],{},"Create-or-update",", run a ",[209,4733,4529],{}," first, then branch on the result: route to ",[209,4736,81],{}," when the file is missing and to ",[209,4739,4547],{}," when it already exists.",[40,4742,4743,4746],{},[21,4744,4745],{},"Atomic write",", write to a temporary file, then rename it over the target once the write succeeds, so a failure mid-write cannot corrupt the original.",[159,4748,4750],{"id":4749},"file-operation-errors","File operation errors",[407,4752,4753,4763],{},[410,4754,4755],{},[413,4756,4757,4760],{},[416,4758,4759],{},"Error",[416,4761,4762],{},"Cause",[423,4764,4765,4777,4787,4794],{},[413,4766,4767,4772],{},[428,4768,4769],{},[209,4770,4771],{},"nothing to write",[428,4773,4774,4776],{},[209,4775,1155],{}," is empty or undefined.",[413,4778,4779,4784],{},[428,4780,4781],{},[209,4782,4783],{},"expecting a nodeIdString",[428,4785,4786],{},"Invalid NodeId format.",[413,4788,4789,4791],{},[428,4790,2308],{},[428,4792,4793],{},"File not found, for WriteAppend, create it first with Write.",[413,4795,4796,4799],{},[428,4797,4798],{},"BadNotWritable \u002F BadUserAccessDenied",[428,4800,4801],{},"File is read-only or your account lacks permission.",[366,4803,4805,4808],{"className":4804},[369,370],[14,4806,375],{"className":4807},[374],[366,4809,4811],{"className":4810},[379],[14,4812,4813,4814,212,4817,992,4820,4823],{},"Use the Browse node to discover available File objects, and the Read node to inspect file metadata such as ",[209,4815,4816],{},"Size",[209,4818,4819],{},"OpenCount",[209,4821,4822],{},"UserWritable",". Garbled text usually means the wrong encoding, try a different one.",[32,4825,4827],{"id":4826},"_16-hosting-an-opc-ua-server","16. Hosting an OPC UA Server",[14,4829,4830,4831,4834,4835,4838],{},"On ",[21,4832,4833],{},"self-hosted FlowFuse",", the certified node can run an OPC UA server inside your instance using only Function nodes, no ",[209,4836,4837],{},"settings.js"," edit, no external module declaration, no extra npm install.",[366,4840,4843,4847],{"className":4841},[369,4842],"ff-callout--caution",[14,4844,4846],{"className":4845},[374],"Caution",[366,4848,4850],{"className":4849},[379],"\nServer hosting is **not supported on FlowFuse Cloud**, Cloud exposes HTTP\u002FHTTPS only and cannot expose the arbitrary TCP port (`opc.tcp:\u002F\u002F`) a server needs. Use a self-hosted FlowFuse instance and ensure the chosen port is reachable through your container and network configuration.\n",[14,4852,4853,4854,4857,4858,4861,4862,4865,4866,4869,4870,30],{},"When the palette loads, it publishes a bootstrap helper in the Node-RED global context. Retrieve it and destructure ",[209,4855,4856],{},"{ bootstrap, opcua }",": ",[209,4859,4860],{},"bootstrap"," carries the server helpers and ",[209,4863,4864],{},"opcua"," re-exports the full ",[209,4867,4868],{},"node-opcua"," namespace. This works even with ",[209,4871,4872],{},"functionExternalModules: false",[366,4874,4876,4879],{"className":4875},[369,370],[14,4877,375],{"className":4878},[374],[366,4880,4882],{"className":4881},[379],[14,4883,4884,4887],{},[209,4885,4886],{},"global.get(\"sterfive\")"," below is the literal runtime key the certified node exposes. Keep it exactly as written in your Function nodes, or the code will not find the helper.",[159,4889,4891],{"id":4890},"basic-pattern","Basic pattern",[14,4893,4894],{},"Two Function nodes share live variables through flow context: one boots the server once on deploy, the other updates a variable's value at any time without restarting.",[1120,4896,4899],{"className":4897,"code":4898,"language":1125},[1123],"[Inject once after deploy]  →  [Boot Server]   →  [Debug]\n[Inject value]              →  [Update Value]\n",[209,4900,4898],{"__ignoreMap":362},[14,4902,4903,4904,4907,4908,4911,4912,690,4915,690,4918,4921,4922,4925],{},"Boot Server calls ",[209,4905,4906],{},"bootstrapServer({...})",". The helper is idempotent, the same config reuses the running handle; a changed config tears down and rebuilds. It runs ",[209,4909,4910],{},"onPopulate"," exactly once on first build and registers ",[209,4913,4914],{},"SIGINT",[209,4916,4917],{},"SIGTERM",[209,4919,4920],{},"exit"," handlers for clean shutdown, so you do not add your own. Update Value writes new values with ",[209,4923,4924],{},"setValueFromSource()",", which does no I\u002FO and is safe to call thousands of times per second.",[1120,4927,4929],{"className":1353,"code":4928,"language":1355,"meta":362,"style":362},"\u002F\u002F Boot Server\nconst { bootstrap, opcua } = global.get(\"sterfive\");\nconst { bootstrapServer } = bootstrap;\n\nconst handle = await bootstrapServer({\n    port: 4840,\n    endpoint: \"node-red-server\",\n    nodesets: [\"standard\"],\n    onPopulate: (addressSpace, exposed) => {\n        const ns = addressSpace.getOwnNamespace();\n        const device = ns.addObject({ organizedBy: \"ObjectsFolder\", browseName: \"Device001\" });\n        exposed.temperature = ns.addVariable({\n            componentOf: device,\n            browseName: \"Temperature\",\n            nodeId: \"s=Temperature\",\n            dataType: \"Double\",\n        });\n        exposed.temperature.setValueFromSource({ dataType: opcua.DataType.Double, value: 20.0 });\n    }\n});\nflow.set(\"$opcuaHandle\", handle);\n",[209,4930,4931,4936,4977,4994,4998,5018,5030,5046,5066,5091,5114,5167,5191,5203,5220,5237,5253,5263,5312,5317,5326],{"__ignoreMap":362},[1359,4932,4933],{"class":1361,"line":1362},[1359,4934,4935],{"class":1393},"\u002F\u002F Boot Server\n",[1359,4937,4938,4941,4943,4946,4948,4951,4953,4956,4959,4961,4964,4966,4968,4971,4973,4975],{"class":1361,"line":1390},[1359,4939,4940],{"class":3559},"const",[1359,4942,2046],{"class":1369},[1359,4944,4945],{"class":1365}," bootstrap",[1359,4947,1489],{"class":1369},[1359,4949,4950],{"class":1365}," opcua ",[1359,4952,2242],{"class":1369},[1359,4954,4955],{"class":1369}," =",[1359,4957,4958],{"class":1365}," global",[1359,4960,30],{"class":1369},[1359,4962,4963],{"class":2226},"get",[1359,4965,2230],{"class":1365},[1359,4967,1384],{"class":1369},[1359,4969,4970],{"class":1381},"sterfive",[1359,4972,1384],{"class":1369},[1359,4974,691],{"class":1365},[1359,4976,1387],{"class":1369},[1359,4978,4979,4981,4983,4986,4988,4990,4992],{"class":1361,"line":1522},[1359,4980,4940],{"class":3559},[1359,4982,2046],{"class":1369},[1359,4984,4985],{"class":1365}," bootstrapServer ",[1359,4987,2242],{"class":1369},[1359,4989,4955],{"class":1369},[1359,4991,4945],{"class":1365},[1359,4993,1387],{"class":1369},[1359,4995,4996],{"class":1361,"line":1835},[1359,4997,2113],{"emptyLinePlaceholder":2112},[1359,4999,5000,5002,5005,5007,5011,5014,5016],{"class":1361,"line":1865},[1359,5001,4940],{"class":3559},[1359,5003,5004],{"class":1365}," handle ",[1359,5006,1375],{"class":1369},[1359,5008,5010],{"class":5009},"s7zQu"," await",[1359,5012,5013],{"class":2226}," bootstrapServer",[1359,5015,2230],{"class":1365},[1359,5017,3893],{"class":1369},[1359,5019,5020,5023,5025,5028],{"class":1361,"line":1872},[1359,5021,5022],{"class":1784},"    port",[1359,5024,1025],{"class":1369},[1359,5026,5027],{"class":1748}," 4840",[1359,5029,1912],{"class":1369},[1359,5031,5032,5035,5037,5039,5042,5044],{"class":1361,"line":2116},[1359,5033,5034],{"class":1784},"    endpoint",[1359,5036,1025],{"class":1369},[1359,5038,1378],{"class":1369},[1359,5040,5041],{"class":1381},"node-red-server",[1359,5043,1384],{"class":1369},[1359,5045,1912],{"class":1369},[1359,5047,5048,5051,5053,5055,5057,5060,5062,5064],{"class":1361,"line":2122},[1359,5049,5050],{"class":1784},"    nodesets",[1359,5052,1025],{"class":1369},[1359,5054,1479],{"class":1365},[1359,5056,1384],{"class":1369},[1359,5058,5059],{"class":1381},"standard",[1359,5061,1384],{"class":1369},[1359,5063,1499],{"class":1365},[1359,5065,1912],{"class":1369},[1359,5067,5068,5071,5073,5075,5079,5081,5084,5086,5089],{"class":1361,"line":2135},[1359,5069,5070],{"class":2226},"    onPopulate",[1359,5072,1025],{"class":1369},[1359,5074,4132],{"class":1369},[1359,5076,5078],{"class":5077},"sHdIc","addressSpace",[1359,5080,1489],{"class":1369},[1359,5082,5083],{"class":5077}," exposed",[1359,5085,691],{"class":1369},[1359,5087,5088],{"class":3559}," =>",[1359,5090,1896],{"class":1369},[1359,5092,5093,5096,5099,5101,5104,5106,5109,5112],{"class":1361,"line":2174},[1359,5094,5095],{"class":3559},"        const",[1359,5097,5098],{"class":1365}," ns",[1359,5100,4955],{"class":1369},[1359,5102,5103],{"class":1365}," addressSpace",[1359,5105,30],{"class":1369},[1359,5107,5108],{"class":2226},"getOwnNamespace",[1359,5110,5111],{"class":1784},"()",[1359,5113,1387],{"class":1369},[1359,5115,5116,5118,5121,5123,5125,5127,5130,5132,5135,5138,5140,5142,5145,5147,5149,5152,5154,5156,5159,5161,5163,5165],{"class":1361,"line":2249},[1359,5117,5095],{"class":3559},[1359,5119,5120],{"class":1365}," device",[1359,5122,4955],{"class":1369},[1359,5124,5098],{"class":1365},[1359,5126,30],{"class":1369},[1359,5128,5129],{"class":2226},"addObject",[1359,5131,2230],{"class":1784},[1359,5133,5134],{"class":1369},"{",[1359,5136,5137],{"class":1784}," organizedBy",[1359,5139,1025],{"class":1369},[1359,5141,1378],{"class":1369},[1359,5143,5144],{"class":1381},"ObjectsFolder",[1359,5146,1384],{"class":1369},[1359,5148,1489],{"class":1369},[1359,5150,5151],{"class":1784}," browseName",[1359,5153,1025],{"class":1369},[1359,5155,1378],{"class":1369},[1359,5157,5158],{"class":1381},"Device001",[1359,5160,1384],{"class":1369},[1359,5162,2099],{"class":1369},[1359,5164,691],{"class":1784},[1359,5166,1387],{"class":1369},[1359,5168,5170,5173,5175,5178,5180,5182,5184,5187,5189],{"class":1361,"line":5169},12,[1359,5171,5172],{"class":1365},"        exposed",[1359,5174,30],{"class":1369},[1359,5176,5177],{"class":1365},"temperature",[1359,5179,4955],{"class":1369},[1359,5181,5098],{"class":1365},[1359,5183,30],{"class":1369},[1359,5185,5186],{"class":2226},"addVariable",[1359,5188,2230],{"class":1784},[1359,5190,3893],{"class":1369},[1359,5192,5194,5197,5199,5201],{"class":1361,"line":5193},13,[1359,5195,5196],{"class":1784},"            componentOf",[1359,5198,1025],{"class":1369},[1359,5200,5120],{"class":1365},[1359,5202,1912],{"class":1369},[1359,5204,5206,5209,5211,5213,5216,5218],{"class":1361,"line":5205},14,[1359,5207,5208],{"class":1784},"            browseName",[1359,5210,1025],{"class":1369},[1359,5212,1378],{"class":1369},[1359,5214,5215],{"class":1381},"Temperature",[1359,5217,1384],{"class":1369},[1359,5219,1912],{"class":1369},[1359,5221,5223,5226,5228,5230,5233,5235],{"class":1361,"line":5222},15,[1359,5224,5225],{"class":1784},"            nodeId",[1359,5227,1025],{"class":1369},[1359,5229,1378],{"class":1369},[1359,5231,5232],{"class":1381},"s=Temperature",[1359,5234,1384],{"class":1369},[1359,5236,1912],{"class":1369},[1359,5238,5240,5243,5245,5247,5249,5251],{"class":1361,"line":5239},16,[1359,5241,5242],{"class":1784},"            dataType",[1359,5244,1025],{"class":1369},[1359,5246,1378],{"class":1369},[1359,5248,1612],{"class":1381},[1359,5250,1384],{"class":1369},[1359,5252,1912],{"class":1369},[1359,5254,5256,5259,5261],{"class":1361,"line":5255},17,[1359,5257,5258],{"class":1369},"        }",[1359,5260,691],{"class":1784},[1359,5262,1387],{"class":1369},[1359,5264,5266,5268,5270,5272,5274,5277,5279,5281,5284,5286,5289,5291,5293,5295,5297,5299,5301,5303,5306,5308,5310],{"class":1361,"line":5265},18,[1359,5267,5172],{"class":1365},[1359,5269,30],{"class":1369},[1359,5271,5177],{"class":1365},[1359,5273,30],{"class":1369},[1359,5275,5276],{"class":2226},"setValueFromSource",[1359,5278,2230],{"class":1784},[1359,5280,5134],{"class":1369},[1359,5282,5283],{"class":1784}," dataType",[1359,5285,1025],{"class":1369},[1359,5287,5288],{"class":1365}," opcua",[1359,5290,30],{"class":1369},[1359,5292,1203],{"class":1365},[1359,5294,30],{"class":1369},[1359,5296,1612],{"class":1365},[1359,5298,1489],{"class":1369},[1359,5300,1798],{"class":1784},[1359,5302,1025],{"class":1369},[1359,5304,5305],{"class":1748}," 20.0",[1359,5307,2099],{"class":1369},[1359,5309,691],{"class":1784},[1359,5311,1387],{"class":1369},[1359,5313,5315],{"class":1361,"line":5314},19,[1359,5316,4013],{"class":1369},[1359,5318,5320,5322,5324],{"class":1361,"line":5319},20,[1359,5321,2242],{"class":1369},[1359,5323,691],{"class":1365},[1359,5325,1387],{"class":1369},[1359,5327,5329,5332,5334,5337,5339,5341,5344,5346,5348,5351],{"class":1361,"line":5328},21,[1359,5330,5331],{"class":1365},"flow",[1359,5333,30],{"class":1369},[1359,5335,5336],{"class":2226},"set",[1359,5338,2230],{"class":1365},[1359,5340,1384],{"class":1369},[1359,5342,5343],{"class":1381},"$opcuaHandle",[1359,5345,1384],{"class":1369},[1359,5347,1489],{"class":1369},[1359,5349,5350],{"class":1365}," handle)",[1359,5352,1387],{"class":1369},[1120,5354,5356],{"className":1353,"code":5355,"language":1355,"meta":362,"style":362},"\u002F\u002F Update Value\nconst handle = flow.get(\"$opcuaHandle\");\nhandle.exposed.temperature.setValueFromSource({\n    dataType: \"Double\",\n    value: msg.payload\n});\n",[209,5357,5358,5363,5390,5412,5426,5440],{"__ignoreMap":362},[1359,5359,5360],{"class":1361,"line":1362},[1359,5361,5362],{"class":1393},"\u002F\u002F Update Value\n",[1359,5364,5365,5367,5369,5371,5374,5376,5378,5380,5382,5384,5386,5388],{"class":1361,"line":1390},[1359,5366,4940],{"class":3559},[1359,5368,5004],{"class":1365},[1359,5370,1375],{"class":1369},[1359,5372,5373],{"class":1365}," flow",[1359,5375,30],{"class":1369},[1359,5377,4963],{"class":2226},[1359,5379,2230],{"class":1365},[1359,5381,1384],{"class":1369},[1359,5383,5343],{"class":1381},[1359,5385,1384],{"class":1369},[1359,5387,691],{"class":1365},[1359,5389,1387],{"class":1369},[1359,5391,5392,5395,5397,5400,5402,5404,5406,5408,5410],{"class":1361,"line":1522},[1359,5393,5394],{"class":1365},"handle",[1359,5396,30],{"class":1369},[1359,5398,5399],{"class":1365},"exposed",[1359,5401,30],{"class":1369},[1359,5403,5177],{"class":1365},[1359,5405,30],{"class":1369},[1359,5407,5276],{"class":2226},[1359,5409,2230],{"class":1365},[1359,5411,3893],{"class":1369},[1359,5413,5414,5416,5418,5420,5422,5424],{"class":1361,"line":1835},[1359,5415,1901],{"class":1784},[1359,5417,1025],{"class":1369},[1359,5419,1378],{"class":1369},[1359,5421,1612],{"class":1381},[1359,5423,1384],{"class":1369},[1359,5425,1912],{"class":1369},[1359,5427,5428,5430,5432,5435,5437],{"class":1361,"line":1865},[1359,5429,1825],{"class":1784},[1359,5431,1025],{"class":1369},[1359,5433,5434],{"class":1365}," msg",[1359,5436,30],{"class":1369},[1359,5438,5439],{"class":1365},"payload\n",[1359,5441,5442,5444,5446],{"class":1361,"line":1872},[1359,5443,2242],{"class":1369},[1359,5445,691],{"class":1365},[1359,5447,1387],{"class":1369},[366,5449,5451,5454],{"className":5450},[369,370],[14,5452,375],{"className":5453},[374],[366,5455,5457],{"className":5456},[379],[14,5458,5459,5460,690,5462,5465,5466,5469,5470,5472,5473,5475,5476,212,5479,5482,5483,5486],{},"Keep the handle in flow context, never in a local ",[209,5461,4940],{},[209,5463,5464],{},"let",", a Function node's body re-runs on every message. Prefix context keys with ",[209,5467,5468],{},"$"," (e.g. ",[209,5471,5343],{},") and avoid the bare key ",[209,5474,4864],{}," (it collides with other vendors), dotted keys (Node-RED reads them as nested paths), and colon-separated keys. Put construction-time options (",[209,5477,5478],{},"port",[209,5480,5481],{},"nodesets",", security, ",[209,5484,5485],{},"users",") only in the Boot node, never in the Update node.",[159,5488,5490,5491,5494],{"id":5489},"key-bootstrapserver-options","Key ",[209,5492,5493],{},"bootstrapServer"," options",[407,5496,5497,5507],{},[410,5498,5499],{},[413,5500,5501,5504],{},[416,5502,5503],{},"Option",[416,5505,5506],{},"Description",[423,5508,5509,5518,5528,5541,5570,5580,5590,5602,5615,5625,5634,5644,5653],{},[413,5510,5511,5515],{},[428,5512,5513],{},[209,5514,5478],{},[428,5516,5517],{},"TCP port to listen on (default 4840).",[413,5519,5520,5525],{},[428,5521,5522],{},[209,5523,5524],{},"endpoint",[428,5526,5527],{},"Endpoint name string.",[413,5529,5530,5538],{},[428,5531,5532,1691,5535],{},[209,5533,5534],{},"applicationName",[209,5536,5537],{},"productUri",[428,5539,5540],{},"Identity strings the server advertises.",[413,5542,5543,5547],{},[428,5544,5545],{},[209,5546,5481],{},[428,5548,5549,5550,212,5553,212,5556,212,5559,212,5562,5565,5566,5569],{},"Built-in names (",[209,5551,5552],{},"\"standard\"",[209,5554,5555],{},"\"di\"",[209,5557,5558],{},"\"autoId\"",[209,5560,5561],{},"\"machinery\"",[209,5563,5564],{},"\"ia\"",") or absolute paths to ",[209,5567,5568],{},".NodeSet2.xml"," files.",[413,5571,5572,5577],{},[428,5573,5574],{},[209,5575,5576],{},"securityPolicies",[428,5578,5579],{},"Array of SecurityPolicy values (e.g. None, Basic256Sha256).",[413,5581,5582,5587],{},[428,5583,5584],{},[209,5585,5586],{},"securityModes",[428,5588,5589],{},"Array of MessageSecurityMode values (None, Sign, SignAndEncrypt).",[413,5591,5592,5597],{},[428,5593,5594],{},[209,5595,5596],{},"allowAnonymous",[428,5598,5599,5600,999],{},"Allow anonymous sessions (default ",[209,5601,1086],{},[413,5603,5604,5608],{},[428,5605,5606],{},[209,5607,5485],{},[428,5609,5610,5611,5614],{},"Array of ",[209,5612,5613],{},"{ username, password, roles }"," objects.",[413,5616,5617,5622],{},[428,5618,5619],{},[209,5620,5621],{},"discoveryServerEndpointUrl",[428,5623,5624],{},"Discovery-server (LDS) registration setting, advanced.",[413,5626,5627,5632],{},[428,5628,5629],{},[209,5630,5631],{},"registerServerMethod",[428,5633,5624],{},[413,5635,5636,5641],{},[428,5637,5638],{},[209,5639,5640],{},"shutdownTimeoutMs",[428,5642,5643],{},"Grace period for clean shutdown.",[413,5645,5646,5650],{},[428,5647,5648],{},[209,5649,4910],{},[428,5651,5652],{},"Callback run once when a new server is built, add your variables, objects, and methods here.",[413,5654,5655,5660],{},[428,5656,5657],{},[209,5658,5659],{},"forceRebuild",[428,5661,5662,5663,5665],{},"Set ",[209,5664,1086],{}," to rebuild without a config change (e.g. after editing the trust store).",[366,5667,5669,5672],{"className":5668},[369,370],[14,5670,375],{"className":5671},[374],[366,5673,5675],{"className":5674},[379],[14,5676,5677,5678,212,5680,212,5682,212,5684,212,5686,212,5688,212,5690,212,5692,992,5694,5696,5697,5699,5700,1646,5702,5704,5705,5707,5708,5711],{},"The server's identity is a config hash of ",[209,5679,5478],{},[209,5681,5524],{},[209,5683,5534],{},[209,5685,5537],{},[209,5687,5481],{},[209,5689,5576],{},[209,5691,5586],{},[209,5693,5596],{},[209,5695,5485],{},". Change any of these and the next deploy rebuilds the server (re-running ",[209,5698,4910],{},"). ",[209,5701,4910],{},[209,5703,5659],{}," are excluded from the hash, so editing ",[209,5706,4910],{}," alone does not trigger a rebuild, use ",[209,5709,5710],{},"forceRebuild: true"," if you need one.",[159,5713,5715],{"id":5714},"adding-methods","Adding methods",[14,5717,5718,5719,5721,5722,1064,5724,5727,5728,5730],{},"All address-space construction must happen inside ",[209,5720,4910],{},", it runs exactly once on a fresh build, never on a same-config redeploy. Do not put ",[209,5723,5129],{},[209,5725,5726],{},"addMethod"," calls in nodes that handle every message; they throw on a duplicate ",[209,5729,1273],{}," and pile up across redeploys.",[1120,5732,5734],{"className":1353,"code":5733,"language":1355,"meta":362,"style":362},"const resetMethod = ns.addMethod(device, {\n    browseName: \"Reset\",\n    inputArguments: [],\n    outputArguments: [],\n});\nresetMethod.bindMethod(async (_inputArguments, _context) => {\n    exposed.temperature.setValueFromSource({ dataType: opcua.DataType.Double, value: 20.0 });\n    return { statusCode: opcua.StatusCodes.Good, outputArguments: [] };\n});\n",[209,5735,5736,5758,5774,5785,5796,5804,5835,5880,5915],{"__ignoreMap":362},[1359,5737,5738,5740,5743,5745,5747,5749,5751,5754,5756],{"class":1361,"line":1362},[1359,5739,4940],{"class":3559},[1359,5741,5742],{"class":1365}," resetMethod ",[1359,5744,1375],{"class":1369},[1359,5746,5098],{"class":1365},[1359,5748,30],{"class":1369},[1359,5750,5726],{"class":2226},[1359,5752,5753],{"class":1365},"(device",[1359,5755,1489],{"class":1369},[1359,5757,1896],{"class":1369},[1359,5759,5760,5763,5765,5767,5770,5772],{"class":1361,"line":1390},[1359,5761,5762],{"class":1784},"    browseName",[1359,5764,1025],{"class":1369},[1359,5766,1378],{"class":1369},[1359,5768,5769],{"class":1381},"Reset",[1359,5771,1384],{"class":1369},[1359,5773,1912],{"class":1369},[1359,5775,5776,5779,5781,5783],{"class":1361,"line":1522},[1359,5777,5778],{"class":1784},"    inputArguments",[1359,5780,1025],{"class":1369},[1359,5782,3136],{"class":1365},[1359,5784,1912],{"class":1369},[1359,5786,5787,5790,5792,5794],{"class":1361,"line":1835},[1359,5788,5789],{"class":1784},"    outputArguments",[1359,5791,1025],{"class":1369},[1359,5793,3136],{"class":1365},[1359,5795,1912],{"class":1369},[1359,5797,5798,5800,5802],{"class":1361,"line":1865},[1359,5799,2242],{"class":1369},[1359,5801,691],{"class":1365},[1359,5803,1387],{"class":1369},[1359,5805,5806,5809,5811,5814,5816,5819,5821,5824,5826,5829,5831,5833],{"class":1361,"line":1872},[1359,5807,5808],{"class":1365},"resetMethod",[1359,5810,30],{"class":1369},[1359,5812,5813],{"class":2226},"bindMethod",[1359,5815,2230],{"class":1365},[1359,5817,5818],{"class":3559},"async",[1359,5820,4132],{"class":1369},[1359,5822,5823],{"class":5077},"_inputArguments",[1359,5825,1489],{"class":1369},[1359,5827,5828],{"class":5077}," _context",[1359,5830,691],{"class":1369},[1359,5832,5088],{"class":3559},[1359,5834,1896],{"class":1369},[1359,5836,5837,5840,5842,5844,5846,5848,5850,5852,5854,5856,5858,5860,5862,5864,5866,5868,5870,5872,5874,5876,5878],{"class":1361,"line":2116},[1359,5838,5839],{"class":1365},"    exposed",[1359,5841,30],{"class":1369},[1359,5843,5177],{"class":1365},[1359,5845,30],{"class":1369},[1359,5847,5276],{"class":2226},[1359,5849,2230],{"class":1784},[1359,5851,5134],{"class":1369},[1359,5853,5283],{"class":1784},[1359,5855,1025],{"class":1369},[1359,5857,5288],{"class":1365},[1359,5859,30],{"class":1369},[1359,5861,1203],{"class":1365},[1359,5863,30],{"class":1369},[1359,5865,1612],{"class":1365},[1359,5867,1489],{"class":1369},[1359,5869,1798],{"class":1784},[1359,5871,1025],{"class":1369},[1359,5873,5305],{"class":1748},[1359,5875,2099],{"class":1369},[1359,5877,691],{"class":1784},[1359,5879,1387],{"class":1369},[1359,5881,5882,5885,5887,5890,5892,5894,5896,5899,5901,5903,5905,5908,5910,5913],{"class":1361,"line":2122},[1359,5883,5884],{"class":5009},"    return",[1359,5886,2046],{"class":1369},[1359,5888,5889],{"class":1784}," statusCode",[1359,5891,1025],{"class":1369},[1359,5893,5288],{"class":1365},[1359,5895,30],{"class":1369},[1359,5897,5898],{"class":1365},"StatusCodes",[1359,5900,30],{"class":1369},[1359,5902,2300],{"class":1365},[1359,5904,1489],{"class":1369},[1359,5906,5907],{"class":1784}," outputArguments",[1359,5909,1025],{"class":1369},[1359,5911,5912],{"class":1784}," [] ",[1359,5914,1995],{"class":1369},[1359,5916,5917,5919,5921],{"class":1361,"line":2135},[1359,5918,2242],{"class":1369},[1359,5920,691],{"class":1365},[1359,5922,1387],{"class":1369},[159,5924,5926],{"id":5925},"cleaning-up-timers","Cleaning up timers",[14,5928,5929,5930,5932,5933,5936],{},"If ",[209,5931,4910],{}," starts intervals or timeouts, register them with the address space so they stop automatically on shutdown. Otherwise they fire against a disposed address space and cause ",[209,5934,5935],{},"'AddressSpace has been disposed'"," on the next deploy.",[1120,5938,5940],{"className":1353,"code":5939,"language":1355,"meta":362,"style":362},"const timerId = setInterval(() => {\n    sensor.setValueFromSource({ dataType: \"Double\", value: Math.random() });\n}, 250);\naddressSpace.registerShutdownTask(() => clearInterval(timerId));\n",[209,5941,5942,5962,6008,6020],{"__ignoreMap":362},[1359,5943,5944,5946,5949,5951,5954,5956,5958,5960],{"class":1361,"line":1362},[1359,5945,4940],{"class":3559},[1359,5947,5948],{"class":1365}," timerId ",[1359,5950,1375],{"class":1369},[1359,5952,5953],{"class":2226}," setInterval",[1359,5955,2230],{"class":1365},[1359,5957,5111],{"class":1369},[1359,5959,5088],{"class":3559},[1359,5961,1896],{"class":1369},[1359,5963,5964,5967,5969,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989,5991,5994,5996,5999,6002,6004,6006],{"class":1361,"line":1390},[1359,5965,5966],{"class":1365},"    sensor",[1359,5968,30],{"class":1369},[1359,5970,5276],{"class":2226},[1359,5972,2230],{"class":1784},[1359,5974,5134],{"class":1369},[1359,5976,5283],{"class":1784},[1359,5978,1025],{"class":1369},[1359,5980,1378],{"class":1369},[1359,5982,1612],{"class":1381},[1359,5984,1384],{"class":1369},[1359,5986,1489],{"class":1369},[1359,5988,1798],{"class":1784},[1359,5990,1025],{"class":1369},[1359,5992,5993],{"class":1365}," Math",[1359,5995,30],{"class":1369},[1359,5997,5998],{"class":2226},"random",[1359,6000,6001],{"class":1784},"() ",[1359,6003,2242],{"class":1369},[1359,6005,691],{"class":1784},[1359,6007,1387],{"class":1369},[1359,6009,6010,6013,6016,6018],{"class":1361,"line":1522},[1359,6011,6012],{"class":1369},"},",[1359,6014,6015],{"class":1748}," 250",[1359,6017,691],{"class":1365},[1359,6019,1387],{"class":1369},[1359,6021,6022,6024,6026,6029,6031,6033,6035,6038,6041],{"class":1361,"line":1835},[1359,6023,5078],{"class":1365},[1359,6025,30],{"class":1369},[1359,6027,6028],{"class":2226},"registerShutdownTask",[1359,6030,2230],{"class":1365},[1359,6032,5111],{"class":1369},[1359,6034,5088],{"class":3559},[1359,6036,6037],{"class":2226}," clearInterval",[1359,6039,6040],{"class":1365},"(timerId))",[1359,6042,1387],{"class":1369},[159,6044,6046],{"id":6045},"structured-namespaces-and-companion-specifications","Structured namespaces and companion specifications",[14,6048,6049,6050,212,6053,6056,6057,6060,6061,6063,6064,6067],{},"Organise large address spaces with folders and objects (",[209,6051,6052],{},"addressSpace.getOwnNamespace().addFolder(...)",[209,6054,6055],{},"addObject(...)","), and prefer string NodeIds (",[209,6058,6059],{},"nodeId: \"s=DeviceA.Speed\"",") so subscribers stay stable. For a scalable Update node, key your variables by ",[209,6062,1150],{}," and look them up with ",[209,6065,6066],{},"handle.addressSpace.findNode(\"ns=1;s=...\")"," rather than adding a Function node per variable.",[14,6069,6070,6071,1025],{},"To expose standard companion-spec types (DI, Machinery, AutoID\u002FRFID, IA), load the nodesets, then instantiate their object types inside ",[209,6072,4910],{},[1120,6074,6076],{"className":1353,"code":6075,"language":1355,"meta":362,"style":362},"const nsDI = addressSpace.getNamespaceIndex(\"http:\u002F\u002Fopcfoundation.org\u002FUA\u002FDI\u002F\");\nconst deviceType = addressSpace.findObjectType(\"DeviceType\", nsDI);\nconst device = deviceType.instantiate({\n    organizedBy: addressSpace.rootFolder.objects,\n    browseName: \"MyDevice\",\n    optionals: [\"SerialNumber\"],\n});\n",[209,6077,6078,6107,6139,6160,6181,6196,6216],{"__ignoreMap":362},[1359,6079,6080,6082,6085,6087,6089,6091,6094,6096,6098,6101,6103,6105],{"class":1361,"line":1362},[1359,6081,4940],{"class":3559},[1359,6083,6084],{"class":1365}," nsDI ",[1359,6086,1375],{"class":1369},[1359,6088,5103],{"class":1365},[1359,6090,30],{"class":1369},[1359,6092,6093],{"class":2226},"getNamespaceIndex",[1359,6095,2230],{"class":1365},[1359,6097,1384],{"class":1369},[1359,6099,6100],{"class":1381},"http:\u002F\u002Fopcfoundation.org\u002FUA\u002FDI\u002F",[1359,6102,1384],{"class":1369},[1359,6104,691],{"class":1365},[1359,6106,1387],{"class":1369},[1359,6108,6109,6111,6114,6116,6118,6120,6123,6125,6127,6130,6132,6134,6137],{"class":1361,"line":1390},[1359,6110,4940],{"class":3559},[1359,6112,6113],{"class":1365}," deviceType ",[1359,6115,1375],{"class":1369},[1359,6117,5103],{"class":1365},[1359,6119,30],{"class":1369},[1359,6121,6122],{"class":2226},"findObjectType",[1359,6124,2230],{"class":1365},[1359,6126,1384],{"class":1369},[1359,6128,6129],{"class":1381},"DeviceType",[1359,6131,1384],{"class":1369},[1359,6133,1489],{"class":1369},[1359,6135,6136],{"class":1365}," nsDI)",[1359,6138,1387],{"class":1369},[1359,6140,6141,6143,6146,6148,6151,6153,6156,6158],{"class":1361,"line":1522},[1359,6142,4940],{"class":3559},[1359,6144,6145],{"class":1365}," device ",[1359,6147,1375],{"class":1369},[1359,6149,6150],{"class":1365}," deviceType",[1359,6152,30],{"class":1369},[1359,6154,6155],{"class":2226},"instantiate",[1359,6157,2230],{"class":1365},[1359,6159,3893],{"class":1369},[1359,6161,6162,6165,6167,6169,6171,6174,6176,6179],{"class":1361,"line":1835},[1359,6163,6164],{"class":1784},"    organizedBy",[1359,6166,1025],{"class":1369},[1359,6168,5103],{"class":1365},[1359,6170,30],{"class":1369},[1359,6172,6173],{"class":1365},"rootFolder",[1359,6175,30],{"class":1369},[1359,6177,6178],{"class":1365},"objects",[1359,6180,1912],{"class":1369},[1359,6182,6183,6185,6187,6189,6192,6194],{"class":1361,"line":1865},[1359,6184,5762],{"class":1784},[1359,6186,1025],{"class":1369},[1359,6188,1378],{"class":1369},[1359,6190,6191],{"class":1381},"MyDevice",[1359,6193,1384],{"class":1369},[1359,6195,1912],{"class":1369},[1359,6197,6198,6201,6203,6205,6207,6210,6212,6214],{"class":1361,"line":1872},[1359,6199,6200],{"class":1784},"    optionals",[1359,6202,1025],{"class":1369},[1359,6204,1479],{"class":1365},[1359,6206,1384],{"class":1369},[1359,6208,6209],{"class":1381},"SerialNumber",[1359,6211,1384],{"class":1369},[1359,6213,1499],{"class":1365},[1359,6215,1912],{"class":1369},[1359,6217,6218,6220,6222],{"class":1361,"line":2116},[1359,6219,2242],{"class":1369},[1359,6221,691],{"class":1365},[1359,6223,1387],{"class":1369},[14,6225,6226,6227,6230,6231,6233,6234,6237,6238,30],{},"Access a component of an instantiated type with ",[209,6228,6229],{},"device.getComponentByName(name, namespaceIndex)",", pass the namespace index, since the same browse name can exist in several namespaces. For composite extension-object values (for example an ",[209,6232,1449],{},"), build the value with ",[209,6235,6236],{},"addressSpace.constructExtensionObject(dataTypeNode, fields)",", then write it with ",[209,6239,6240],{},"setValueFromSource({ dataType: opcua.DataType.ExtensionObject, value: extObj })",[14,6242,6243],{},"Load companion nodesets in dependency order (AutoID needs DI, MachineTool needs Machinery, and so on); the helper reports a clear validation error if a dependency is missing.",[159,6245,6247],{"id":6246},"large-variable-sets","Large variable sets",[14,6249,6250,6251,6254],{},"When populating thousands of variables, enable ",[209,6252,6253],{},"addressSpace.isFrugal = true"," during construction to skip reverse-reference materialisation and cut memory overhead. Re-enable normal mode before adding nodes that need full bidirectional references (type instances, browsable methods).",[1120,6256,6258],{"className":1353,"code":6257,"language":1355,"meta":362,"style":362},"addressSpace.isFrugal = true;\nfor (let i = 0; i \u003C 5000; i++) {\n    ns.addVariable({ componentOf: dataset, browseName: `Var${i}`, dataType: \"Double\" });\n}\naddressSpace.isFrugal = false;\n",[209,6259,6260,6275,6313,6373,6377],{"__ignoreMap":362},[1359,6261,6262,6264,6266,6269,6271,6273],{"class":1361,"line":1362},[1359,6263,5078],{"class":1365},[1359,6265,30],{"class":1369},[1359,6267,6268],{"class":1365},"isFrugal ",[1359,6270,1375],{"class":1369},[1359,6272,1859],{"class":1858},[1359,6274,1387],{"class":1369},[1359,6276,6277,6280,6282,6284,6287,6289,6291,6293,6295,6298,6301,6303,6306,6309,6311],{"class":1361,"line":1390},[1359,6278,6279],{"class":5009},"for",[1359,6281,4132],{"class":1365},[1359,6283,5464],{"class":3559},[1359,6285,6286],{"class":1365}," i ",[1359,6288,1375],{"class":1369},[1359,6290,2150],{"class":1748},[1359,6292,1752],{"class":1369},[1359,6294,6286],{"class":1365},[1359,6296,6297],{"class":1369},"\u003C",[1359,6299,6300],{"class":1748}," 5000",[1359,6302,1752],{"class":1369},[1359,6304,6305],{"class":1365}," i",[1359,6307,6308],{"class":1369},"++",[1359,6310,678],{"class":1365},[1359,6312,3893],{"class":1369},[1359,6314,6315,6318,6320,6322,6324,6326,6329,6331,6334,6336,6338,6340,6343,6346,6349,6352,6355,6357,6359,6361,6363,6365,6367,6369,6371],{"class":1361,"line":1522},[1359,6316,6317],{"class":1365},"    ns",[1359,6319,30],{"class":1369},[1359,6321,5186],{"class":2226},[1359,6323,2230],{"class":1784},[1359,6325,5134],{"class":1369},[1359,6327,6328],{"class":1784}," componentOf",[1359,6330,1025],{"class":1369},[1359,6332,6333],{"class":1365}," dataset",[1359,6335,1489],{"class":1369},[1359,6337,5151],{"class":1784},[1359,6339,1025],{"class":1369},[1359,6341,6342],{"class":1369}," `",[1359,6344,6345],{"class":1381},"Var",[1359,6347,6348],{"class":1369},"${",[1359,6350,6351],{"class":1365},"i",[1359,6353,6354],{"class":1369},"}`",[1359,6356,1489],{"class":1369},[1359,6358,5283],{"class":1784},[1359,6360,1025],{"class":1369},[1359,6362,1378],{"class":1369},[1359,6364,1612],{"class":1381},[1359,6366,1384],{"class":1369},[1359,6368,2099],{"class":1369},[1359,6370,691],{"class":1784},[1359,6372,1387],{"class":1369},[1359,6374,6375],{"class":1361,"line":1835},[1359,6376,4018],{"class":1369},[1359,6378,6379,6381,6383,6385,6387,6390],{"class":1361,"line":1865},[1359,6380,5078],{"class":1365},[1359,6382,30],{"class":1369},[1359,6384,6268],{"class":1365},[1359,6386,1375],{"class":1369},[1359,6388,6389],{"class":1858}," false",[1359,6391,1387],{"class":1369},[159,6393,6395],{"id":6394},"high-frequency-variables","High-frequency variables",[14,6397,6398,6399,6401,6402,6404],{},"For variables that change faster than clients need to sample, set ",[209,6400,1322],{}," (ms) to hint the server's fastest meaningful sample rate and stop clients requesting sub-millisecond rates. For values that update sub-millisecond in your code, batch externally, call ",[209,6403,5276],{}," once per tick (e.g. every 50 ms) rather than from a tight loop.",[1120,6406,6408],{"className":1353,"code":6407,"language":1355,"meta":362,"style":362},"ns.addVariable({\n    browseName: \"FastSensor\",\n    nodeId: \"s=FastSensor\",\n    dataType: \"Double\",\n    minimumSamplingInterval: 50,   \u002F\u002F 50 ms = 20 Hz maximum\n    value: { dataType: \"Double\", value: 0 },\n});\n",[209,6409,6410,6423,6438,6454,6468,6483,6511],{"__ignoreMap":362},[1359,6411,6412,6415,6417,6419,6421],{"class":1361,"line":1362},[1359,6413,6414],{"class":1365},"ns",[1359,6416,30],{"class":1369},[1359,6418,5186],{"class":2226},[1359,6420,2230],{"class":1365},[1359,6422,3893],{"class":1369},[1359,6424,6425,6427,6429,6431,6434,6436],{"class":1361,"line":1390},[1359,6426,5762],{"class":1784},[1359,6428,1025],{"class":1369},[1359,6430,1378],{"class":1369},[1359,6432,6433],{"class":1381},"FastSensor",[1359,6435,1384],{"class":1369},[1359,6437,1912],{"class":1369},[1359,6439,6440,6443,6445,6447,6450,6452],{"class":1361,"line":1522},[1359,6441,6442],{"class":1784},"    nodeId",[1359,6444,1025],{"class":1369},[1359,6446,1378],{"class":1369},[1359,6448,6449],{"class":1381},"s=FastSensor",[1359,6451,1384],{"class":1369},[1359,6453,1912],{"class":1369},[1359,6455,6456,6458,6460,6462,6464,6466],{"class":1361,"line":1835},[1359,6457,1901],{"class":1784},[1359,6459,1025],{"class":1369},[1359,6461,1378],{"class":1369},[1359,6463,1612],{"class":1381},[1359,6465,1384],{"class":1369},[1359,6467,1912],{"class":1369},[1359,6469,6470,6473,6475,6478,6480],{"class":1361,"line":1865},[1359,6471,6472],{"class":1784},"    minimumSamplingInterval",[1359,6474,1025],{"class":1369},[1359,6476,6477],{"class":1748}," 50",[1359,6479,1489],{"class":1369},[1359,6481,6482],{"class":1393},"   \u002F\u002F 50 ms = 20 Hz maximum\n",[1359,6484,6485,6487,6489,6491,6493,6495,6497,6499,6501,6503,6505,6507,6509],{"class":1361,"line":1872},[1359,6486,1825],{"class":1784},[1359,6488,1025],{"class":1369},[1359,6490,2046],{"class":1369},[1359,6492,5283],{"class":1784},[1359,6494,1025],{"class":1369},[1359,6496,1378],{"class":1369},[1359,6498,1612],{"class":1381},[1359,6500,1384],{"class":1369},[1359,6502,1489],{"class":1369},[1359,6504,1798],{"class":1784},[1359,6506,1025],{"class":1369},[1359,6508,2150],{"class":1748},[1359,6510,1805],{"class":1369},[1359,6512,6513,6515,6517],{"class":1361,"line":2116},[1359,6514,2242],{"class":1369},[1359,6516,691],{"class":1365},[1359,6518,1387],{"class":1369},[159,6520,6522],{"id":6521},"multiple-servers-in-one-instance","Multiple servers in one instance",[14,6524,6525,6527,6528,6531],{},[209,6526,5493],{}," accepts an optional second ",[209,6529,6530],{},"ownerKey"," argument. Without distinct keys, a second call tears down the first server. Each server must bind a different port and use a different flow-context key.",[1120,6533,6535],{"className":1353,"code":6534,"language":1355,"meta":362,"style":362},"const handleAlpha = await bootstrapServer({ port: 4840, endpoint: \"alpha\" }, \"alpha\");\nconst handleBeta  = await bootstrapServer({ port: 4841, endpoint: \"beta\"  }, \"beta\");\n",[209,6536,6537,6588],{"__ignoreMap":362},[1359,6538,6539,6541,6544,6546,6548,6550,6552,6554,6557,6559,6561,6563,6566,6568,6570,6573,6575,6578,6580,6582,6584,6586],{"class":1361,"line":1362},[1359,6540,4940],{"class":3559},[1359,6542,6543],{"class":1365}," handleAlpha ",[1359,6545,1375],{"class":1369},[1359,6547,5010],{"class":5009},[1359,6549,5013],{"class":2226},[1359,6551,2230],{"class":1365},[1359,6553,5134],{"class":1369},[1359,6555,6556],{"class":1784}," port",[1359,6558,1025],{"class":1369},[1359,6560,5027],{"class":1748},[1359,6562,1489],{"class":1369},[1359,6564,6565],{"class":1784}," endpoint",[1359,6567,1025],{"class":1369},[1359,6569,1378],{"class":1369},[1359,6571,6572],{"class":1381},"alpha",[1359,6574,1384],{"class":1369},[1359,6576,6577],{"class":1369}," },",[1359,6579,1378],{"class":1369},[1359,6581,6572],{"class":1381},[1359,6583,1384],{"class":1369},[1359,6585,691],{"class":1365},[1359,6587,1387],{"class":1369},[1359,6589,6590,6592,6595,6597,6599,6601,6603,6605,6607,6609,6612,6614,6616,6618,6620,6623,6625,6628,6630,6632,6634,6636],{"class":1361,"line":1390},[1359,6591,4940],{"class":3559},[1359,6593,6594],{"class":1365}," handleBeta  ",[1359,6596,1375],{"class":1369},[1359,6598,5010],{"class":5009},[1359,6600,5013],{"class":2226},[1359,6602,2230],{"class":1365},[1359,6604,5134],{"class":1369},[1359,6606,6556],{"class":1784},[1359,6608,1025],{"class":1369},[1359,6610,6611],{"class":1748}," 4841",[1359,6613,1489],{"class":1369},[1359,6615,6565],{"class":1784},[1359,6617,1025],{"class":1369},[1359,6619,1378],{"class":1369},[1359,6621,6622],{"class":1381},"beta",[1359,6624,1384],{"class":1369},[1359,6626,6627],{"class":1369},"  },",[1359,6629,1378],{"class":1369},[1359,6631,6622],{"class":1381},[1359,6633,1384],{"class":1369},[1359,6635,691],{"class":1365},[1359,6637,1387],{"class":1369},[14,6639,6640],{},"Beyond roughly five servers per instance, prefer separate processes; the event loop becomes the bottleneck before the OPC UA stack does.",[159,6642,6644],{"id":6643},"user-authentication","User authentication",[14,6646,6647,6648,6650,6651,690,6654,690,6657,6660,6661,6663,6664,6667,6668,1646,6671,6674],{},"Authentication is declarative through the ",[209,6649,5485],{}," array. Each entry has a username, a password, and roles. The helper bcrypt-hashes clear-text passwords at boot and maps role names to their NodeIds; a value already in bcrypt form (",[209,6652,6653],{},"$2a$",[209,6655,6656],{},"$2b$",[209,6658,6659],{},"$2y$"," prefix) is passed through verbatim. The ",[209,6662,5485],{}," array controls only session activation, per-node authorization comes from each variable's access-level attributes combined with role mapping. Set ",[209,6665,6666],{},"allowAnonymous: false"," to refuse anonymous sessions. The helpers ",[209,6669,6670],{},"bootstrap.ensureBcryptHash(plain)",[209,6672,6673],{},"bootstrap.isBcryptHash(hash)"," are available for tooling.",[366,6676,6678,6681],{"className":6677},[369,649],[14,6679,653],{"className":6680},[374],[366,6682,6684],{"className":6683},[379],[14,6685,6686,6687,6689,6690,212,6693,212,6696,212,6699,6702,6703,6705],{},"If you omit ",[209,6688,5485],{},", the helper installs a default test set (",[209,6691,6692],{},"root\u002Fsecret",[209,6694,6695],{},"gdsadmin\u002Fadmingds",[209,6697,6698],{},"user1\u002Fpassword1",[209,6700,6701],{},"user2\u002Fpassword2",") intended only for development. Always set your own ",[209,6704,5485],{}," for any instance reachable beyond your development machine.",[159,6707,6709],{"id":6708},"security-certificates-and-pki-storage","Security, certificates, and PKI storage",[14,6711,6712,6713,1646,6715,6717,6718,6721,6722,6725],{},"Enable secure endpoints with ",[209,6714,5576],{},[209,6716,5586],{},"; the server advertises the cartesian product of allowed (policy, mode) pairs as separate endpoints. A self-signed server certificate is generated on first boot, or you can provision a CA-issued one. A client connecting over a secure mode for the first time lands its certificate in the ",[209,6719,6720],{},"rejected"," folder, move it to ",[209,6723,6724],{},"trusted"," and subsequent connections succeed. Every server also installs the push-certificate-management service for over-the-wire certificate rotation.",[14,6727,6728,6729,6731,6732,6735],{},"On FlowFuse, the node stores its PKI (its own certificate, the trusted list, and the rejected list) under ",[209,6730,1093],{},". For this to survive restarts and redeploys, that directory must be on persistent storage: on container-based FlowFuse (Cloud, Kubernetes, Docker) this is the persistent volume mounted at ",[209,6733,6734],{},"\u002Fdata\u002Fstorage","; on the FlowFuse Device Agent the working directory is on the device's local filesystem. If you re-trust a server's certificate after every deploy, your PKI directory is not landing on persistent storage.",[366,6737,6739,6742],{"className":6738},[369,370],[14,6740,375],{"className":6741},[374],[366,6743,6745],{"className":6744},[379],[14,6746,6747,6748,6751,6752,6755],{},"Username\u002Fpassword over ",[209,6749,6750],{},"MessageSecurityMode.None"," travels in cleartext. Combine credentials with at least Sign mode. Disabling ",[209,6753,6754],{},"SecurityPolicy.None"," entirely can break naive clients that probe without security first.",[159,6757,6759],{"id":6758},"lifecycle-diagnostics-and-stopping","Lifecycle, diagnostics, and stopping",[14,6761,6762,6763,6766,6767,6770,6771,6774,6775,6778,6779,6782],{},"Process exit and config-change redeploys are handled automatically, do not add your own ",[209,6764,6765],{},"process.on(\"SIGINT\")"," handler or ",[209,6768,6769],{},"node.on(\"close\", ...)"," for basic flows. For an explicit stop, call ",[209,6772,6773],{},"handle.shutdown(timeoutMs)"," (idempotent and concurrency-safe, a second call while a shutdown is in flight returns the same promise) and clear the flow-context references afterwards, so a stale handle isn't reused against a disposed address space. Use ",[209,6776,6777],{},"handle.isRunning()"," as the single source of truth for server state. ",[209,6780,6781],{},"bootstrap.shutdownAllServers(timeoutMs)"," stops every registered server at once.",[14,6784,6785,6786,6789,6790,6793,6794,212,6797,212,6800,992,6803,6805,6806,6809,6810,690,6813,6816,6817,1646,6820,6823],{},"For live diagnostics, ",[209,6787,6788],{},"bootstrap.getServerInfo(handle.server)"," returns a snapshot of ",[209,6791,6792],{},"traffic"," (bytes read\u002Fwritten, channel and session counts, subscription counts, rejection counts), ",[209,6795,6796],{},"sessions",[209,6798,6799],{},"channels",[209,6801,6802],{},"certificates",[209,6804,161],{},". ",[209,6807,6808],{},"bootstrap.displayServerInfoOn(info, { log: (m) => node.log(m), warn: (m) => node.warn(m) })"," pretty-prints it to the Node-RED log (the second argument is a logger object with ",[209,6811,6812],{},"log",[209,6814,6815],{},"warn"," methods). A growing gap between ",[209,6818,6819],{},"cumulatedSessionCount",[209,6821,6822],{},"currentSessionCount"," is a useful signal that clients are reconnecting in a loop.",[32,6825,6827],{"id":6826},"_17-network-requirements","17. Network Requirements",[14,6829,6830],{},"When the certified node runs inside a corporate or industrial network, allow the following outbound connections through your firewall or URL-filtering proxy. All traffic originates from the host running your FlowFuse instance; the certified node never accepts inbound connections to these endpoints. Share this section with your IT or security team.",[407,6832,6833,6851],{},[410,6834,6835],{},[413,6836,6837,6840,6843,6846,6848],{},[416,6838,6839],{},"Hostname",[416,6841,6842],{},"Port",[416,6844,6845],{},"Protocol",[416,6847,421],{},[416,6849,6850],{},"Required?",[423,6852,6853,6872],{},[413,6854,6855,6858,6861,6866,6869],{},[428,6856,6857],{},"Your OPC UA server(s)",[428,6859,6860],{},"typically 4840",[428,6862,6863,6864,691],{},"TCP (",[209,6865,872],{},[428,6867,6868],{},"OPC UA data plane, read, write, subscribe, browse",[428,6870,6871],{},"Yes",[413,6873,6874,6879,6882,6885,6888],{},[428,6875,6876],{},[209,6877,6878],{},"registry.npmjs.org",[428,6880,6881],{},"443",[428,6883,6884],{},"HTTPS",[428,6886,6887],{},"Package installation (one-time, via the palette)",[428,6889,6890],{},"Standard Node-RED requirement",[14,6892,6893],{},"The OPC UA port (default 4840) is configurable per server; update the rule if your server uses a different port. The certified node does not make any external licence-check or activation calls, licensing is managed through FlowFuse, so no outbound connection to a third-party licence service is required.",[32,6895,6897],{"id":6896},"_18-troubleshooting","18. Troubleshooting",[407,6899,6900,6910],{},[410,6901,6902],{},[413,6903,6904,6907],{},[416,6905,6906],{},"Symptom",[416,6908,6909],{},"What to check",[423,6911,6912,6924,6932,6948,6963,6971,6982,6989,6997,7015,7023,7031,7045,7066,7074,7082,7100,7108,7127,7145,7159,7173,7186,7194],{},[413,6913,6914,6917],{},[428,6915,6916],{},"Connection never goes green",[428,6918,6919,6920,6923],{},"Verify the endpoint URL and that the server is reachable. Use ",[21,6921,6922],{},"check the connection"," in the connection editor.",[413,6925,6926,6929],{},[428,6927,6928],{},"Changes to connection settings have no effect",[428,6930,6931],{},"The connection is shared and cached, redeploy the flow after editing connection parameters.",[413,6933,6934,6937],{},[428,6935,6936],{},"Security handshake fails",[428,6938,6939,6940,6943,6944,6947],{},"Confirm the security policy and message mode match the server, and that the ",[21,6941,6942],{},"client"," certificate has been added to the ",[21,6945,6946],{},"server's"," trusted list, the client auto-accepts the server certificate by default, so the missing trust is usually on the server side.",[413,6949,6950,6953],{},[428,6951,6952],{},"Browse path won't resolve (BadBrowseNameInvalid \u002F BadNoMatch)",[428,6954,6955,6956,6959,6960,6962],{},"Add the required namespace prefix (",[209,6957,6958],{},"2:Name","), escape special characters with ",[209,6961,755],{},", and match the server's case exactly.",[413,6964,6965,6968],{},[428,6966,6967],{},"Write rejected, BadNotWritable \u002F BadUserAccessDenied",[428,6969,6970],{},"The variable is read-only, or your user lacks write permission.",[413,6972,6973,6976],{},[428,6974,6975],{},"Write rejected, BadTypeMismatch",[428,6977,6978,6979,6981],{},"Set the correct ",[209,6980,1298],{},", or let the node infer it by sending a plain value.",[413,6983,6984,6986],{},[428,6985,2308],{},[428,6987,6988],{},"Use Browse or Explore to confirm the exact namespace index and identifier, these differ between servers.",[413,6990,6991,6994],{},[428,6992,6993],{},"Browse \u002F verify button does nothing",[428,6995,6996],{},"The endpoint must be configured and the flow deployed first.",[413,6998,6999,7002],{},[428,7000,7001],{},"Read returns wrong value, node config NodeId ignored",[428,7003,7004,7005,7007,7008,212,7010,992,7012,7014],{},"A default Inject sets ",[209,7006,1155],{}," to a timestamp, which overrides the configured NodeId. Clear ",[209,7009,1155],{},[209,7011,1150],{},[209,7013,1145],{}," from the Inject node.",[413,7016,7017,7020],{},[428,7018,7019],{},"Monitor sends nothing",[428,7021,7022],{},"Check the NodeId, lower or remove the deadband, and confirm the value is changing. Percent deadband requires EURange, use Absolute otherwise.",[413,7024,7025,7028],{},[428,7026,7027],{},"Monitor floods the flow",[428,7029,7030],{},"Add or increase a deadband, or raise the sampling interval.",[413,7032,7033,7036],{},[428,7034,7035],{},"No events received (Monitor Event)",[428,7037,7038,7039,7041,7042,7044],{},"Verify the server supports events (read the ",[209,7040,3434],{}," attribute), point the NodeId at an event-generating object (try ",[209,7043,3409],{},"), and clear the Where Clause.",[413,7046,7047,7050],{},[428,7048,7049],{},"Where Clause has no effect or errors",[428,7051,7052,7053,7055,7056,3337,7058,7060,7061,690,7063,7065],{},"Quote type names (",[209,7054,3293],{},"), use ",[209,7057,3336],{},[209,7059,3340],{},", use ",[209,7062,3317],{},[209,7064,3320],{},", and filter only on standard event fields.",[413,7067,7068,7071],{},[428,7069,7070],{},"Method call keeps failing",[428,7072,7073],{},"Check the status-code category, parameter\u002Fsecurity errors need fixing, communication\u002Fresource errors are retryable.",[413,7075,7076,7079],{},[428,7077,7078],{},"History Read returns nothing, BadHistoryOperationUnsupported",[428,7080,7081],{},"The server does not store history for that variable. Confirm history is enabled server-side.",[413,7083,7084,7087],{},[428,7085,7086],{},"File read returns garbled text",[428,7088,7089,7090,212,7092,7094,7095,7097,7098,30],{},"Wrong encoding, try a different one (",[209,7091,4585],{},[209,7093,4594],{},", …); for binary use ",[209,7096,4637],{}," + ",[209,7099,4640],{},[413,7101,7102,7105],{},[428,7103,7104],{},"File append fails, BadNodeIdUnknown",[428,7106,7107],{},"The file must exist before WriteAppend; create it first with Write.",[413,7109,7110,7113],{},[428,7111,7112],{},"Explore returns far too much data",[428,7114,7115,7116,7119,7120,7123,7124,30],{},"You started at a root node (e.g. ",[209,7117,7118],{},"i=85","). Start from a specific NodeId, set ",[209,7121,7122],{},"excludeEmpty: true",", or use ",[209,7125,7126],{},"followOrganizes: false",[413,7128,7129,7132],{},[428,7130,7131],{},"Hosted server: 'AddressSpace has been disposed'",[428,7133,7134,7135,7138,7139,7141,7142,30],{},"A timer or cached handle outlived a shutdown, register timers with ",[209,7136,7137],{},"addressSpace.registerShutdownTask"," inside ",[209,7140,4910],{}," and clear flow-context keys after ",[209,7143,7144],{},"shutdown()",[413,7146,7147,7150],{},[428,7148,7149],{},"Hosted server shipped with default users",[428,7151,7152,7153,7155,7156,7158],{},"Set your own ",[209,7154,5485],{}," array, the built-in ",[209,7157,6692],{}," set is for development only.",[413,7160,7161,7167],{},[428,7162,7163,7164,7166],{},"Second ",[209,7165,5493],{}," call tears down the first",[428,7168,7169,7170,7172],{},"Pass a distinct ",[209,7171,6530],{}," to each call, and give each server a different port.",[413,7174,7175,7178],{},[428,7176,7177],{},"Memory grows with large address spaces",[428,7179,3014,7180,7182,7183,7185],{},[209,7181,6253],{}," in ",[209,7184,4910],{}," before adding thousands of variables.",[413,7187,7188,7191],{},[428,7189,7190],{},"Cannot host a server on FlowFuse Cloud",[428,7192,7193],{},"Server hosting requires a self-hosted FlowFuse instance with the OPC UA TCP port exposed. Cloud exposes HTTP\u002FHTTPS only.",[413,7195,7196,7199],{},[428,7197,7198],{},"Re-trusting the server certificate after every deploy",[428,7200,7201,7202,7204,7205,7207,7208,3329,7210,30],{},"The PKI directory (",[209,7203,1093],{},") is not on persistent storage. On container-based FlowFuse it must sit under the ",[209,7206,6734],{}," persistent volume. Also confirm the certificate is in ",[209,7209,6724],{},[209,7211,6720],{},[14,7213,7214,7215,30],{},"For help enabling the OPC UA Certified Node, licensing, or anything else, ",[26,7216,7217],{"href":307},"contact FlowFuse",[7219,7220,7221],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":362,"searchDepth":1835,"depth":1835,"links":7223},[7224,7225,7232,7235,7236,7240,7245,7250,7256,7257,7261,7270,7275,7278,7284,7291,7298,7312,7313],{"id":34,"depth":1390,"text":35},{"id":150,"depth":1390,"text":151,"children":7226},[7227,7228],{"id":161,"depth":1522,"text":162},{"id":195,"depth":1522,"text":196,"children":7229},[7230,7231],{"id":203,"depth":1835,"text":204},{"id":223,"depth":1835,"text":224},{"id":296,"depth":1390,"text":297,"children":7233},[7234],{"id":312,"depth":1522,"text":313},{"id":401,"depth":1390,"text":402},{"id":530,"depth":1390,"text":531,"children":7237},[7238,7239],{"id":662,"depth":1522,"text":663},{"id":766,"depth":1522,"text":767},{"id":820,"depth":1390,"text":821,"children":7241},[7242,7243,7244],{"id":910,"depth":1522,"text":911},{"id":976,"depth":1522,"text":977},{"id":1053,"depth":1522,"text":1054},{"id":1114,"depth":1390,"text":1115,"children":7246},[7247,7248,7249],{"id":1137,"depth":1522,"text":1138},{"id":1187,"depth":1522,"text":1188},{"id":1240,"depth":1522,"text":1241},{"id":1528,"depth":1390,"text":1529,"children":7251},[7252,7253,7254,7255],{"id":1535,"depth":1522,"text":1138},{"id":1551,"depth":1522,"text":1552},{"id":2254,"depth":1522,"text":2255},{"id":2281,"depth":1522,"text":2282},{"id":2359,"depth":1390,"text":2360},{"id":2459,"depth":1390,"text":2460,"children":7258},[7259,7260],{"id":2466,"depth":1522,"text":2467},{"id":2706,"depth":1522,"text":2707},{"id":2802,"depth":1390,"text":2803,"children":7262},[7263,7264,7265,7266,7267,7268,7269],{"id":2816,"depth":1522,"text":2817},{"id":2862,"depth":1522,"text":1138},{"id":2877,"depth":1522,"text":2878},{"id":2928,"depth":1522,"text":2929},{"id":3000,"depth":1522,"text":3001},{"id":3081,"depth":1522,"text":2924},{"id":3153,"depth":1522,"text":3154},{"id":3213,"depth":1390,"text":3214,"children":7271},[7272,7273,7274],{"id":3220,"depth":1522,"text":3221},{"id":3262,"depth":1522,"text":3263},{"id":3355,"depth":1522,"text":3356},{"id":3441,"depth":1390,"text":3442,"children":7276},[7277],{"id":3452,"depth":1522,"text":3453},{"id":3676,"depth":1390,"text":3677,"children":7279},[7280,7281,7282,7283],{"id":3683,"depth":1522,"text":3684},{"id":3704,"depth":1522,"text":3705},{"id":3812,"depth":1522,"text":3813},{"id":4021,"depth":1522,"text":4022},{"id":4046,"depth":1390,"text":4047,"children":7285},[7286,7287,7288,7289,7290],{"id":4053,"depth":1522,"text":4054},{"id":4080,"depth":1522,"text":4081},{"id":4159,"depth":1522,"text":4160},{"id":4219,"depth":1522,"text":3705},{"id":4410,"depth":1522,"text":4411},{"id":4486,"depth":1390,"text":4487,"children":7292},[7293,7294,7295,7296,7297],{"id":4503,"depth":1522,"text":2878},{"id":4561,"depth":1522,"text":4562},{"id":4648,"depth":1522,"text":4649},{"id":4722,"depth":1522,"text":4723},{"id":4749,"depth":1522,"text":4750},{"id":4826,"depth":1390,"text":4827,"children":7299},[7300,7301,7303,7304,7305,7306,7307,7308,7309,7310,7311],{"id":4890,"depth":1522,"text":4891},{"id":5489,"depth":1522,"text":7302},"Key bootstrapServer options",{"id":5714,"depth":1522,"text":5715},{"id":5925,"depth":1522,"text":5926},{"id":6045,"depth":1522,"text":6046},{"id":6246,"depth":1522,"text":6247},{"id":6394,"depth":1522,"text":6395},{"id":6521,"depth":1522,"text":6522},{"id":6643,"depth":1522,"text":6644},{"id":6708,"depth":1522,"text":6709},{"id":6758,"depth":1522,"text":6759},{"id":6826,"depth":1390,"text":6827},{"id":6896,"depth":1390,"text":6897},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fedit\u002Fmain\u002Fnuxt\u002Fcontent-guides\u002Fflowfuse-nodes\u002Fedge\u002Fopcua.md","md",null,{},50,"OPC UA","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fopcua",{"title":5,"description":16},"docs\u002Fflowfuse-nodes\u002Fedge\u002Fopcua","2026-09-08 11:02:51 +0200","nsoIoEvzwcm9RdPbL52druhuzpOHrKpHYqhDn4m9lJ0",{"id":7326,"extension":7327,"meta":7328,"sections":7329,"stem":7726,"__hash__":7727},"featureCatalog\u002Ffeature-catalog.yml","yml",{},[7330,7391,7492,7553,7630,7708],{"id":7331,"title":7332,"features":7333},"ai-automation","AI & Automation",[7334,7344,7354,7364,7370,7380,7386],{"id":7335,"title":7336,"description":7337,"docsLink":7338,"changelog":7339,"tiers":7343},"flowfuse-expert-ai","FlowFuse Expert AI","Build industrial apps with agents, and query the state of the factory with an agent. Adapt your current hardware and machines so agentic work can be done against them, without ripping and replacing what's already on the plant floor.","\u002Fdocs\u002Fuser\u002Fexpert\u002F",[7340],{"url":7341,"release":7342},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-update-banner\u002F","2.28",{"edge":2112,"hub":2112,"fleet":2112},{"id":7345,"title":7346,"description":7347,"docsLink":7348,"changelog":7349,"subfeature":2112,"showOnPricing":7352,"tiers":7353},"flowfuse-expert-support-mode","Support Mode","Chat-based assistance for FlowFuse and Node-RED, including Node-RED instance management through natural language.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#support-mode",[7350],{"url":7351,"release":7342},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-debug-log-context\u002F",false,{"edge":2112,"hub":2112,"fleet":2112},{"id":7355,"title":7356,"description":7357,"docsLink":7358,"changelog":7359,"subfeature":2112,"showOnPricing":7352,"tiers":7363},"flowfuse-expert-application-building","Application Building","Describe what you want to build and FlowFuse Expert assembles it on your workspace, adding tabs, wiring nodes, and configuring properties.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F",[7360],{"url":7361,"release":7362},"\u002Fchangelog\u002F2026\u002F05\u002Fexpert-application-building\u002F","2.30",{"edge":2112,"hub":2112,"fleet":2112},{"id":7365,"title":7366,"description":7367,"docsLink":7368,"subfeature":2112,"beta":2112,"showOnPricing":7352,"tiers":7369},"flowfuse-expert-insights-mode","Insights Mode","Connects FlowFuse Expert to MCP servers in your Node-RED instances, enabling real-time data queries and actions through a single chat interface.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#insights-mode",{"edge":2112,"hub":2112,"fleet":2112},{"id":7371,"title":7372,"description":7373,"docsLink":7374,"changelog":7375,"tiers":7379},"third-party-agents","Connect Your Own AI Agent","Point the AI agent your company already uses at FlowFuse, so it can query your teams and instances and build Node-RED applications, with you deciding which teams it reaches and whether it can make changes.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fthird-party-agents\u002F",[7376],{"url":7377,"release":7378},"\u002Fchangelog\u002F2026\u002F08\u002Fconnect-your-own-ai-agent\u002F","3.0",{"edge":2112,"hub":2112,"fleet":2112},{"id":7381,"title":7382,"description":7383,"docsLink":7384,"tiers":7385},"mcp-servers","Agentic Operations","Expose your Node-RED flows as tools an AI agent can call directly, so agents can query the state of the factory or trigger actions without custom integration work.","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7387,"title":7388,"description":7389,"tiers":7390},"onnx-integration","ONNX Integration","Run trained machine learning models directly in your flows, including on edge hardware, without sending data out to an external inference service.",{"edge":2112,"hub":2112,"fleet":2112},{"id":7392,"title":7393,"features":7394},"build","Build",[7395,7401,7407,7417,7423,7429,7433,7439,7445,7453,7459,7463,7467,7476,7484],{"id":7396,"title":7397,"description":7398,"docsLink":7399,"tiers":7400},"edge-development","Edge Development","Develop and test Node-RED flows directly on edge devices with a remote editor proxy.","\u002Fdocs\u002Fdevice-agent\u002Fquickstart\u002F",{"edge":2112,"hub":7352,"fleet":2112},{"id":7402,"title":7403,"description":7404,"docsLink":7405,"tiers":7406},"private-npm-registry","Custom Node-RED Nodes","Create and manage your own private npm registry for Node-RED nodes, so you can share custom nodes across your team and devices without publishing them publicly.","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7408,"title":7409,"description":7410,"docsLink":7411,"changelog":7412,"tiers":7416},"flowfuse-tables","FlowFuse Tables","A managed PostgreSQL database for every application, so you can store and query structured data without standing up and maintaining your own database.","\u002Fdocs\u002Fuser\u002Fff-tables\u002F",[7413],{"url":7414,"release":7415},"\u002Fchangelog\u002F2026\u002F07\u002Fexpert-tables-automation\u002F","2.33",{"edge":2112,"hub":2112,"fleet":2112},{"id":7418,"title":7419,"description":7420,"docsLink":7421,"tiers":7422},"persistent-files","File Storage","Store and retrieve files from your Node-RED flows, with automatic replication and backup across your devices and hosted instances.","\u002Fdocs\u002Finstall\u002Ffile-storage\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7424,"title":7425,"description":7426,"docsLink":7427,"showOnPricing":7352,"tiers":7428},"persistent-context","Persistent Context","In-memory values defined in a Node-RED flow persist across project restarts and upgrades.","\u002Fdocs\u002Fuser\u002Fpersistent-context\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7430,"title":7431,"showOnPricing":7352,"tiers":7432},"static-assets","Static Assets",{"edge":2112,"hub":2112,"fleet":2112},{"id":7434,"title":7435,"description":7436,"docsLink":7437,"tiers":7438},"team-library","Team Library","Set up standard nodes and flows that can be shared with all team members across your organisation.","\u002Fdocs\u002Fuser\u002Fshared-library\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7440,"title":7441,"description":7442,"docsLink":7443,"tiers":7444},"personalised-multi-user-dashboards","Personalised Multi-User Dashboards","Build applications that provide unique data to each logged-in user using personalised multi-user dashboards.","https:\u002F\u002Fdashboard.flowfuse.com\u002Fuser\u002Fmulti-tenancy.html",{"edge":2112,"hub":2112,"fleet":2112},{"id":7446,"title":7447,"description":7448,"changelog":7449,"subfeature":2112,"showOnPricing":7352,"tiers":7452},"dashboards-view","Dashboards View","Browse and open every dashboard across your team from a dedicated Dashboards view, at both team and application level, without leaving FlowFuse.",[7450],{"url":7451,"release":7415},"\u002Fchangelog\u002F2026\u002F07\u002Fteam-and-application-dashboards\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7454,"title":7455,"description":7456,"docsLink":7457,"tiers":7458},"blueprints-converge","Blueprints","Ready-made starting points for your apps, from cross-team Converge templates to OT and IT specific blueprints.","\u002Fdocs\u002Fuser\u002Fconcepts\u002F#blueprint",{"edge":2112,"hub":2112,"fleet":2112},{"id":7460,"title":7461,"subfeature":2112,"showOnPricing":7352,"tiers":7462},"blueprints-ot-apps","Blueprints - OT APPS",{"edge":2112,"hub":7352,"fleet":2112},{"id":7464,"title":7465,"subfeature":2112,"showOnPricing":7352,"tiers":7466},"blueprints-it-apps","Blueprints - IT APPS",{"edge":7352,"hub":2112,"fleet":7352},{"id":7468,"title":7469,"description":7470,"changelog":7471,"showOnPricing":7352,"tiers":7475},"immersive-editor-snapshots","Snapshot Details in Immersive Editor","View and manage snapshot details directly inside the immersive editor without leaving your editing session.",[7472],{"url":7473,"release":7474},"\u002Fchangelog\u002F2026\u002F03\u002Fsnapshot-detail-modal-immersive-editor\u002F","2.29",{"edge":2112,"hub":2112,"fleet":2112},{"id":7477,"title":7478,"description":7479,"changelog":7480,"showOnPricing":7352,"tiers":7483},"immersive-editor-drawer","Customisable Immersive Editor Drawer","Pin, move, resize, or full-screen the immersive editor drawer. Your preferences are remembered between sessions.",[7481],{"url":7482,"release":7362},"\u002Fchangelog\u002F2026\u002F04\u002Fimmersive-editor-drawer\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7485,"title":7486,"description":7487,"changelog":7488,"showOnPricing":7352,"tiers":7491},"embedded-editor-tab-title","Embedded Editor Browser Tab Title","The browser tab title updates to reflect the active Node-RED canvas tab when working in the embedded editor.",[7489],{"url":7490,"release":7474},"\u002Fchangelog\u002F2026\u002F03\u002Fembedded-editor-tab-title\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7493,"title":894,"features":7494},"deploy",[7495,7501,7510,7516,7522,7528,7534,7540,7545],{"id":7496,"title":7497,"description":7498,"docsLink":7499,"tiers":7500},"hosted-instances","Cloud Instances","Run Node-RED instances managed and hosted by FlowFuse.","\u002Fdocs\u002Fuser\u002Fintroduction\u002F#creating-a-node-red-instance",{"edge":2112,"hub":2112,"fleet":2112},{"id":7502,"title":7503,"description":7504,"docsLink":7505,"changelog":7506,"tiers":7509},"edge-devices","Edge Instances","Deploy and mange your Node-RED instances on edge PLCs and gateways, with full visibility and control from the cloud.","\u002Fdocs\u002Fdevice-agent\u002Fintroduction\u002F",[7507],{"url":7508,"release":7342},"\u002Fchangelog\u002F2026\u002F02\u002Fdevice-agent-nodejs-options\u002F",{"edge":2112,"hub":7352,"fleet":2112},{"id":7511,"title":7512,"description":7513,"docsLink":7514,"tiers":7515},"custom-hostnames","Custom Hostnames","Access your Node-RED application via your own domain name.","\u002Fdocs\u002Fuser\u002Fcustom-hostnames\u002F",{"edge":7352,"hub":2112,"fleet":7352},{"id":7517,"title":7518,"description":7519,"docsLink":7520,"tiers":7521},"mqtt-broker","MQTT Broker","Manage and create MQTT clients to transport data for efficient messaging and communication within your applications.","\u002Fdocs\u002Fuser\u002Fteambroker\u002F",{"edge":2112,"hub":7352,"fleet":2112},{"id":7523,"title":7524,"description":7525,"docsLink":7526,"showOnPricing":7352,"tiers":7527},"project-nodes","Project Nodes aka seamless project comms","FlowFuse Project Nodes enable the passing of data and messages between your Node-RED projects.","\u002Fdocs\u002Fuser\u002Fprojectnodes\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7529,"title":7530,"description":7531,"docsLink":7532,"tiers":7533},"devops-pipelines","DevOps Pipelines","Set up different environments for development, testing, and production Node-RED instances to support a full software delivery lifecycle.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7535,"title":7536,"description":7537,"docsLink":7538,"tiers":7539},"git-integration","Git Integration","Back up your flows to a remote Git repository through a DevOps Pipeline. Supports GitHub and Azure DevOps repositories.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F#git-repository-stage",{"edge":7352,"hub":2112,"fleet":7352},{"id":7541,"title":7542,"description":7543,"docsLink":7538,"subfeature":2112,"showOnPricing":7352,"tiers":7544},"git-integration-github","GitHub","Push and pull snapshots to GitHub repositories through DevOps Pipeline Git Stages.",{"edge":7352,"hub":2112,"fleet":7352},{"id":7546,"title":7547,"description":7548,"docsLink":7538,"changelog":7549,"subfeature":2112,"showOnPricing":7352,"tiers":7552},"git-integration-azure","Azure DevOps","Push and pull snapshots to Azure DevOps repositories through DevOps Pipeline Git Stages.",[7550],{"url":7551,"release":7474},"\u002Fchangelog\u002F2026\u002F03\u002Fazure-dev-ops-gitops\u002F",{"edge":7352,"hub":2112,"fleet":7352},{"id":7554,"title":7555,"features":7556},"operate-maintain","Operate & Maintain",[7557,7563,7569,7574,7582,7586,7590,7595,7601,7607,7612,7618,7622,7626],{"id":7558,"title":7559,"description":7560,"docsLink":7561,"tiers":7562},"snapshots","Snapshots & Version History","Automatic snapshots on remote devices and hosted instances, plus a full version history timeline so you can roll back to any prior state.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7564,"title":7565,"description":7566,"docsLink":7567,"subfeature":2112,"showOnPricing":7352,"tiers":7568},"auto-snapshot-remote","Auto Snapshot (Remote)","Automatically capture a snapshot every time a remote instance is deployed, so you always have a recoverable history of what was running on each device.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F#auto-snapshots",{"edge":2112,"hub":2112,"fleet":2112},{"id":7570,"title":7571,"description":7572,"docsLink":7567,"subfeature":2112,"showOnPricing":7352,"tiers":7573},"auto-snapshot-hosted","Auto Snapshot (Hosted)","Automatically capture a snapshot every time a hosted instance is deployed, so you always have a recoverable history of what was running.",{"edge":2112,"hub":2112,"fleet":2112},{"id":7575,"title":7576,"description":7577,"changelog":7578,"subfeature":2112,"showOnPricing":7352,"tiers":7581},"snapshot-comparison","Snapshot Comparison","Compare two snapshots side-by-side with a navigable diff view. Step through every changed, added, or deleted node and see property and code diffs.",[7579],{"url":7580,"release":7474},"\u002Fchangelog\u002F2026\u002F04\u002Fsnapshot-diff-viewer\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7583,"title":7584,"subfeature":2112,"showOnPricing":7352,"tiers":7585},"version-history-timeline","Version History Timeline",{"edge":2112,"hub":2112,"fleet":2112},{"id":7587,"title":7588,"tiers":7589},"unlimited-workflow-executions","Unlimited Workflow Executions",{"edge":2112,"hub":2112,"fleet":2112},{"id":7591,"title":7592,"description":7593,"tiers":7594},"device-fleet-updates","Device Fleet Updates","Connect to edge devices to quickly assess and update logic. Debug one device and roll out improvements to your fleet in minutes, securely without requiring full device access for your whole organisation.",{"edge":2112,"hub":7352,"fleet":2112},{"id":7596,"title":7597,"description":7598,"docsLink":7599,"tiers":7600},"device-group-management","Device Group Management","Logically group devices assigned to an application and integrate device groups into your DevOps Pipeline for coordinated fleet updates.","\u002Fdocs\u002Fuser\u002Fdevice-groups\u002F",{"edge":2112,"hub":7352,"fleet":2112},{"id":7602,"title":7603,"description":7604,"docsLink":7605,"tiers":7606},"high-availability","High Availability","Leverage horizontal scaling for reliable and scalable processing of your data through Node-RED.","\u002Fdocs\u002Fuser\u002Fhigh-availability\u002F",{"edge":7352,"hub":2112,"fleet":7352},{"id":7608,"title":7609,"description":7610,"tiers":7611},"performance-monitoring","Performance Monitoring & Alerts","Track CPU, memory, and event loop performance across your instances and devices, with email alerts when something needs your attention.",{"edge":2112,"hub":2112,"fleet":2112},{"id":7613,"title":7614,"description":7615,"docsLink":7616,"subfeature":2112,"showOnPricing":7352,"tiers":7617},"instance-monitoring","Instance Monitoring","Enable alerts to be sent via email when your Node-RED instances encounter issues.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#alerts",{"edge":2112,"hub":2112,"fleet":2112},{"id":7619,"title":7620,"subfeature":2112,"showOnPricing":7352,"tiers":7621},"email-alerts","Email Alerts",{"edge":2112,"hub":2112,"fleet":2112},{"id":7623,"title":7624,"showOnPricing":7352,"tiers":7625},"api-debug-length-limit","API\u002FDebug Length Limit",{"edge":2112,"hub":2112,"fleet":2112},{"id":7627,"title":7628,"tiers":7629},"protected-instances","Protected Instances",{"edge":7352,"hub":2112,"fleet":7352},{"id":7631,"title":7632,"features":7633},"govern-secure","Govern and Secure",[7634,7643,7649,7654,7659,7665,7671,7677,7685,7691,7697,7703],{"id":7635,"title":7636,"description":7637,"docsLink":7638,"changelog":7639,"tiers":7642},"single-sign-on","Single Sign-On (SSO)","Configure FlowFuse to work with your own SSO provider, allowing users to access FlowFuse with a single set of login credentials.","\u002Fdocs\u002Fadmin\u002Fsso\u002F",[7640],{"url":7641,"release":7415},"\u002Fchangelog\u002F2026\u002F07\u002Fapplication-sso-groups\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7644,"title":7645,"description":7646,"docsLink":7647,"tiers":7648},"two-factor-authentication","Two-Factor Authentication","Two-factor authentication adds an extra layer of security to your FlowFuse account.","\u002Fdocs\u002Fuser\u002Fuser-settings\u002F#two-factor-authentication",{"edge":2112,"hub":2112,"fleet":2112},{"id":7650,"title":7651,"description":7652,"docsLink":28,"tiers":7653},"certified-nodes-it","Certified Nodes - IT","IT certified node bundle includes: Redis, MQTT, HTTP Request, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server",{"edge":7352,"hub":2112,"fleet":2112},{"id":7655,"title":7656,"description":7657,"tiers":7658},"certified-nodes-ot","Certified OT Connections - OPC-UA, Modbus, etc.","OT certified node bundle includes: OPC-UA, Modbus TCP & RTU, RTSP, EtherNet\u002FIP, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server",{"edge":2112,"hub":7352,"fleet":7352},{"id":7660,"title":7661,"description":7662,"docsLink":7663,"tiers":7664},"audit-log","Audit Log","Keep track of everything going on in your Node-RED instances and FlowFuse. Audit Logs provide details on what actions have taken place, when they happened, and who did them.","\u002Fdocs\u002Fuser\u002Flogs\u002F#audit-log",{"edge":2112,"hub":2112,"fleet":2112},{"id":7666,"title":7667,"description":7668,"docsLink":7669,"tiers":7670},"role-based-access-control","Role-Based Access Control","Control who can do what at both the team and application level, from viewers to admins.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7672,"title":7673,"description":7674,"docsLink":7675,"subfeature":2112,"showOnPricing":7352,"tiers":7676},"application-level-rbac","Application-Level RBAC","Fine-grained access control per application, allowing team members to have different permission levels across different applications without requiring separate teams.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F#application-level-rbac",{"edge":2112,"hub":2112,"fleet":2112},{"id":7678,"title":7679,"description":7680,"changelog":7681,"subfeature":2112,"showOnPricing":7352,"tiers":7684},"scoped-personal-access-tokens","Scoped Personal Access Tokens","Restrict a Personal Access Token to specific teams, limit it to read-only operations, or control whether it carries admin privileges.",[7682],{"url":7683,"release":7415},"\u002Fchangelog\u002F2026\u002F07\u002Fscoped-pats\u002F",{"edge":2112,"hub":2112,"fleet":2112},{"id":7686,"title":7687,"description":7688,"docsLink":7689,"showOnPricing":7352,"tiers":7690},"team-members","Team Members","Invite multiple team members to collaborate on the same Node-RED flows.","\u002Fdocs\u002Fuser\u002Fteam\u002F#teams",{"edge":2112,"hub":2112,"fleet":2112},{"id":7692,"title":7693,"description":7694,"docsLink":7695,"showOnPricing":7352,"tiers":7696},"endpoint-security","Endpoint Security","Secure HTTP endpoints for hosted Node-RED instances using FlowFuse credentials.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#security",{"edge":2112,"hub":2112,"fleet":2112},{"id":7698,"title":7699,"description":7700,"docsLink":7701,"tiers":7702},"baa-for-hipaa","BAA for HIPAA","FlowFuse can sign a Business Associate Agreement to ensure proper safeguarding of protected health information handled on your behalf.","\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.6\u002F",{"edge":7352,"hub":2112,"fleet":7352},{"id":7704,"title":7705,"description":7706,"tiers":7707},"sbom","Software Bill of Materials","A complete list of all software components used in your Node-RED instances and hosted applications, including version numbers and license information.",{"edge":7352,"hub":2112,"fleet":7352},{"id":7709,"title":7710,"features":7711},"support","Support",[7712,7717,7721],{"id":7713,"title":7714,"docsLink":7715,"tiers":7716},"installation-support","Installation Support","\u002Fdocs\u002Finstall\u002Fintroduction\u002F#do-you-need-help-installation-service",{"edge":2112,"hub":2112,"fleet":2112},{"id":7718,"title":7719,"showOnPricing":7352,"tiers":7720},"live-chat-support","Live Chat Support",{"edge":2112,"hub":2112,"fleet":2112},{"id":7722,"title":7723,"docsLink":7724,"tiers":7725},"enterprise-support","Enterprise Support","\u002Fdocs\u002Fpremium-support\u002F",{"edge":2112,"hub":2112,"fleet":2112},"feature-catalog","v5NjPsqOkQexQ0Fk82nqY6ZEXj128lclDvrIkmsKbpM",[7729,7815,8050,8119,8132,8272,8282,8363],{"name":7730,"order":7731,"children":7732},"Application Guide",0,[7733,7781],{"title":7734,"path":7735,"group":7730,"groupOrder":7731,"order":1362,"children":7736},"Building FlowFuse applications","\u002Fdocs\u002Fapplication-guide",[7737,7741,7753,7757,7773],{"title":7738,"path":7739,"order":1362,"children":7740},"Foundations","\u002Fdocs\u002Fapplication-guide\u002Ffoundations",[],{"title":7742,"path":7743,"order":1390,"children":7744},"App delivery methods","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods",[7745,7749],{"title":7746,"path":7747,"order":1362,"children":7748},"Hardware apps","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods\u002Fhardware-apps",[],{"title":7750,"path":7751,"order":1390,"children":7752},"Software apps","\u002Fdocs\u002Fapplication-guide\u002Fapp-delivery-methods\u002Fsoftware-apps",[],{"title":7754,"path":7755,"order":1522,"children":7756},"Data plane","\u002Fdocs\u002Fapplication-guide\u002Fdata-plane",[],{"title":7758,"path":7759,"order":1835,"children":7760},"Architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures",[7761,7765,7769],{"title":7762,"path":7763,"order":1362,"children":7764},"IT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fit",[],{"title":7766,"path":7767,"order":1390,"children":7768},"OT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fot",[],{"title":7770,"path":7771,"order":1522,"children":7772},"IIoT architectures","\u002Fdocs\u002Fapplication-guide\u002Farchitectures\u002Fiiot",[],{"title":7774,"path":7775,"order":1865,"children":7776},"Worked examples","\u002Fdocs\u002Fapplication-guide\u002Fworked-examples",[7777],{"title":7778,"path":7779,"order":1362,"children":7780},"OEE, end to end","\u002Fdocs\u002Fapplication-guide\u002Fworked-examples\u002Foee",[],{"title":7782,"path":7783,"group":7730,"groupOrder":7731,"order":1390,"children":7784},"Designing Node-RED flows","\u002Fdocs\u002Fnode-red-guide",[7785,7788,7804],{"title":7738,"path":7786,"order":1362,"children":7787},"\u002Fdocs\u002Fnode-red-guide\u002Ffoundations",[],{"title":7789,"path":7790,"order":1390,"children":7791},"Patterns","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns",[7792,7796,7800],{"title":7793,"path":7794,"order":1362,"children":7795},"Design patterns","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fdesign-patterns",[],{"title":7797,"path":7798,"order":1390,"children":7799},"Handling data","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fhandling-data",[],{"title":7801,"path":7802,"order":1522,"children":7803},"Good form","\u002Fdocs\u002Fnode-red-guide\u002Fpatterns\u002Fgood-form",[],{"title":7774,"path":7805,"order":1522,"children":7806},"\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples",[7807,7811],{"title":7808,"path":7809,"order":1362,"children":7810},"OEE - Edge Aggregator","\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples\u002Foee-edge-aggregator",[],{"title":7812,"path":7813,"order":1390,"children":7814},"OEE - Central Dashboard","\u002Fdocs\u002Fnode-red-guide\u002Fworked-examples\u002Foee-central-dashboard",[],{"name":7816,"order":1362,"children":7817},"FlowFuse User Manuals",[7818,7942,7946,7958],{"title":7819,"path":7820,"group":7816,"groupOrder":1362,"order":1362,"children":7821,"link":7352},"Using FlowFuse","\u002Fdocs\u002Fuser",[7822,7826,7830,7834,7838,7842,7846,7849,7853,7857,7860,7864,7880,7884,7888,7892,7896,7899,7903,7907,7911,7915,7919,7922,7926,7930,7934,7938],{"title":7823,"path":7824,"order":1362,"children":7825},"Getting Started","\u002Fdocs\u002Fuser\u002Fintroduction",[],{"title":7827,"path":7828,"order":1362,"children":7829},"Static asset service","\u002Fdocs\u002Fuser\u002Fstatic-asset-service",[],{"title":7831,"path":7832,"order":1390,"children":7833},"Bill of Materials","\u002Fdocs\u002Fuser\u002Fbill-of-materials",[],{"title":7835,"path":7836,"order":1390,"children":7837},"FlowFuse Concepts","\u002Fdocs\u002Fuser\u002Fconcepts",[],{"title":7839,"path":7840,"order":2174,"children":7841},"Instance States","\u002Fdocs\u002Fuser\u002Finstance-states",[],{"title":7843,"path":7844,"order":7316,"children":7845},"Changing the Stack","\u002Fdocs\u002Fuser\u002Fchangestack",[],{"title":7512,"path":7847,"order":7316,"children":7848},"\u002Fdocs\u002Fuser\u002Fcustom-hostnames",[],{"title":7850,"path":7851,"order":7316,"children":7852},"Custom Node Packages","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages",[],{"title":7854,"path":7855,"order":7316,"children":7856},"Dashboards","\u002Fdocs\u002Fuser\u002Fdashboards",[],{"title":7530,"path":7858,"order":7316,"children":7859},"\u002Fdocs\u002Fuser\u002Fdevops-pipelines",[],{"title":7861,"path":7862,"order":7316,"children":7863},"Environment Variables","\u002Fdocs\u002Fuser\u002Fenvvar",[],{"title":7865,"path":7866,"order":7316,"children":7867},"FlowFuse Expert","\u002Fdocs\u002Fuser\u002Fexpert",[7868,7872,7876],{"title":7869,"path":7870,"order":7316,"children":7871},"AI in Node-RED","\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai",[],{"title":7873,"path":7874,"order":7316,"children":7875},"Chat Interface","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat",[],{"title":7877,"path":7878,"order":7316,"children":7879},"Connect Your Own Agent","\u002Fdocs\u002Fuser\u002Fexpert\u002Fthird-party-agents",[],{"title":7881,"path":7882,"order":7316,"children":7883},"FlowFuse File Nodes","\u002Fdocs\u002Fuser\u002Ffilenodes",[],{"title":7885,"path":7886,"order":7316,"children":7887},"FlowFuse MQTT Nodes","\u002Fdocs\u002Fuser\u002Fmqtt-nodes",[],{"title":7889,"path":7890,"order":7316,"children":7891},"FlowFuse Persistent Context","\u002Fdocs\u002Fuser\u002Fpersistent-context",[],{"title":7893,"path":7894,"order":7316,"children":7895},"FlowFuse Project Nodes","\u002Fdocs\u002Fuser\u002Fprojectnodes",[],{"title":7409,"path":7897,"order":7316,"children":7898},"\u002Fdocs\u002Fuser\u002Fff-tables",[],{"title":7900,"path":7901,"order":7316,"children":7902},"Groups","\u002Fdocs\u002Fuser\u002Fdevice-groups",[],{"title":7904,"path":7905,"order":7316,"children":7906},"High Availability mode","\u002Fdocs\u002Fuser\u002Fhigh-availability",[],{"title":7908,"path":7909,"order":7316,"children":7910},"HTTP Access Tokens","\u002Fdocs\u002Fuser\u002Fhttp-access-tokens",[],{"title":7912,"path":7913,"order":7316,"children":7914},"Instance Settings","\u002Fdocs\u002Fuser\u002Finstance-settings",[],{"title":7916,"path":7917,"order":7316,"children":7918},"Logging","\u002Fdocs\u002Fuser\u002Flogs",[],{"title":7667,"path":7920,"order":7316,"children":7921},"\u002Fdocs\u002Fuser\u002Frole-based-access-control",[],{"title":7923,"path":7924,"order":7316,"children":7925},"Shared Team Library","\u002Fdocs\u002Fuser\u002Fshared-library",[],{"title":7927,"path":7928,"order":7316,"children":7929},"Snapshots","\u002Fdocs\u002Fuser\u002Fsnapshots",[],{"title":7931,"path":7932,"order":7316,"children":7933},"Team Broker","\u002Fdocs\u002Fuser\u002Fteambroker",[],{"title":7935,"path":7936,"order":7316,"children":7937},"Teams","\u002Fdocs\u002Fuser\u002Fteam",[],{"title":7939,"path":7940,"order":7316,"children":7941},"User Settings","\u002Fdocs\u002Fuser\u002Fuser-settings",[],{"title":7943,"path":7944,"group":7816,"groupOrder":1362,"order":1390,"children":7945},"FlowFuse API","\u002Fdocs\u002Fapi",[],{"title":7947,"path":7948,"group":7816,"groupOrder":1362,"order":1522,"children":7949,"link":7352},"Migrating a Node-RED project to FlowFuse","\u002Fdocs\u002Fmigration",[7950,7954],{"title":7951,"path":7952,"order":1362,"children":7953},"Introduction","\u002Fdocs\u002Fmigration\u002Fintroduction",[],{"title":7955,"path":7956,"order":7316,"children":7957},"Node-RED Tools plugin","\u002Fdocs\u002Fmigration\u002Fnode-red-tools",[],{"title":7959,"path":7960,"group":7816,"groupOrder":1362,"order":1835,"children":7961},"FlowFuse Node-RED nodes","\u002Fdocs\u002Fflowfuse-nodes",[7962,7986,8006,8013,8031,8042],{"title":7963,"path":7964,"order":1362,"children":7965},"AI","\u002Fdocs\u002Fflowfuse-nodes\u002Fai",[7966,7970,7974,7978,7982],{"title":7967,"path":7968,"order":1865,"children":7969},"LLM Nodes","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fllm-nodes",[],{"title":7971,"path":7972,"order":7318,"children":7973},"Depth Estimation","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fdepth-estimation",[],{"title":7975,"path":7976,"order":7318,"children":7977},"Image Classification","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fimage-classification",[],{"title":7979,"path":7980,"order":7318,"children":7981},"Object Detection","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fobject-detection",[],{"title":7983,"path":7984,"order":7318,"children":7985},"ONXX","\u002Fdocs\u002Fflowfuse-nodes\u002Fai\u002Fonxx",[],{"title":7987,"path":7988,"order":1390,"children":7989},"MCP","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp",[7990,7994,7998,8002],{"title":7991,"path":7992,"order":7318,"children":7993},"MCP Prompt","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-prompt",[],{"title":7995,"path":7996,"order":7318,"children":7997},"MCP Resource","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-resource",[],{"title":7999,"path":8000,"order":7318,"children":8001},"MCP Responses","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-response",[],{"title":8003,"path":8004,"order":7318,"children":8005},"MCP Tool","\u002Fdocs\u002Fflowfuse-nodes\u002Fmcp\u002Fmcp-tool",[],{"title":7409,"path":8007,"order":1522,"children":8008},"\u002Fdocs\u002Fflowfuse-nodes\u002Fflowfuse-tables",[8009],{"title":8010,"path":8011,"order":7318,"children":8012},"Query","\u002Fdocs\u002Fflowfuse-nodes\u002Fflowfuse-tables\u002Fquery",[],{"title":8014,"path":8015,"order":1835,"children":8016},"Edge","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge",[8017,8021,8025,8029],{"title":8018,"path":8019,"order":1362,"children":8020},"RTSP Video Feed","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Frtsp",[],{"title":8022,"path":8023,"order":1390,"children":8024},"CIP Suite, EtherNet\u002FIP Nodes","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fcip-suite",[],{"title":8026,"path":8027,"order":1522,"children":8028},"Modbus","\u002Fdocs\u002Fflowfuse-nodes\u002Fedge\u002Fmodbus",[],{"title":7319,"path":7320,"order":7318,"children":8030},[],{"title":7885,"path":8032,"order":1865,"children":8033},"\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt",[8034,8038],{"title":8035,"path":8036,"order":7318,"children":8037},"MQTT In","\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt\u002Fmqtt-in",[],{"title":8039,"path":8040,"order":7318,"children":8041},"MQTT Out","\u002Fdocs\u002Fflowfuse-nodes\u002Fmqtt\u002Fmqtt-out",[],{"title":8043,"path":8044,"order":1865,"children":8045},"Hub","\u002Fdocs\u002Fflowfuse-nodes\u002Fhub",[8046],{"title":8047,"path":8048,"order":1362,"children":8049},"Redis","\u002Fdocs\u002Fflowfuse-nodes\u002Fhub\u002Fredis",[],{"name":8051,"order":1390,"children":8052},"Device Agent",[8053,8100],{"title":8051,"path":8054,"group":8051,"groupOrder":1390,"order":1362,"children":8055,"link":7352},"\u002Fdocs\u002Fdevice-agent",[8056,8060,8064,8088,8092,8096],{"title":8057,"path":8058,"order":1362,"children":8059},"FlowFuse Device Agent Introduction","\u002Fdocs\u002Fdevice-agent\u002Fintroduction",[],{"title":8061,"path":8062,"order":1390,"children":8063},"Quick Start","\u002Fdocs\u002Fdevice-agent\u002Fquickstart",[],{"title":8065,"path":8066,"group":8067,"order":1522,"children":8068,"link":7352},"Installation","\u002Fdocs\u002Fdevice-agent\u002Finstall","DeviceAgentInstallation",[8069,8072,8076,8080,8084],{"title":45,"path":8070,"group":8067,"order":1362,"children":8071},"\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Foverview",[],{"title":8073,"path":8074,"group":8067,"order":1390,"children":8075},"Device Agent Installer","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdevice-agent-installer",[],{"title":8077,"path":8078,"group":8067,"order":1522,"children":8079},"Docker Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fdocker",[],{"title":8081,"path":8082,"group":8067,"order":1835,"children":8083},"Kubernetes Install","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fkubernetes",[],{"title":8085,"path":8086,"group":8067,"order":1865,"children":8087},"Manual Install with NPM","\u002Fdocs\u002Fdevice-agent\u002Finstall\u002Fmanual",[],{"title":8089,"path":8090,"order":1835,"children":8091},"Register your Remote Instance","\u002Fdocs\u002Fdevice-agent\u002Fregister",[],{"title":8093,"path":8094,"order":1865,"children":8095},"Running the Agent","\u002Fdocs\u002Fdevice-agent\u002Frunning",[],{"title":8097,"path":8098,"order":1872,"children":8099},"Deploying your Flows","\u002Fdocs\u002Fdevice-agent\u002Fdeploy",[],{"title":8101,"path":8102,"group":8051,"groupOrder":1390,"order":1390,"children":8103,"link":7352},"Hardware Guides","\u002Fdocs\u002Fhardware",[8104,8107,8111,8115],{"title":45,"path":8105,"order":1362,"children":8106},"\u002Fdocs\u002Fhardware\u002Fintroduction",[],{"title":8108,"path":8109,"order":1390,"children":8110},"ctrlX - Node-RED","\u002Fdocs\u002Fhardware\u002Fctrlx-node-red",[],{"title":8112,"path":8113,"order":1522,"children":8114},"ctrlX - Device Agent","\u002Fdocs\u002Fhardware\u002Fctrlx-device-agent",[],{"title":8116,"path":8117,"order":1522,"children":8118},"Raspberry Pi with Raspbian","\u002Fdocs\u002Fhardware\u002Fraspbian",[],{"name":8120,"order":1522,"children":8121},"FlowFuse Cloud",[8122],{"title":8120,"path":8123,"group":8120,"groupOrder":1522,"order":1522,"children":8124,"link":7352},"\u002Fdocs\u002Fcloud",[8125,8128],{"title":7951,"path":8126,"order":1362,"children":8127},"\u002Fdocs\u002Fcloud\u002Fintroduction",[],{"title":8129,"path":8130,"order":7316,"children":8131},"FlowFuse Cloud Billing","\u002Fdocs\u002Fcloud\u002Fbilling",[],{"name":8133,"order":1835,"children":8134},"FlowFuse Self-Hosted",[8135,8138,8213,8225],{"title":8061,"path":8136,"group":8133,"groupOrder":1835,"order":1362,"children":8137},"\u002Fdocs\u002Fquick-start",[],{"title":8139,"path":8140,"group":8133,"groupOrder":1835,"order":1390,"children":8141,"link":7352},"Installing FlowFuse","\u002Fdocs\u002Finstall",[8142,8145,8149,8153,8173,8177,8181,8185],{"title":45,"path":8143,"order":1362,"children":8144},"\u002Fdocs\u002Finstall\u002Fintroduction",[],{"title":8146,"path":8147,"order":7316,"children":8148},"Configuring FlowFuse","\u002Fdocs\u002Finstall\u002Fconfiguration",[],{"title":8150,"path":8151,"order":7316,"children":8152},"DNS Setup","\u002Fdocs\u002Finstall\u002Fdns-setup",[],{"title":8154,"path":8155,"order":7316,"children":8156},"Docker install","\u002Fdocs\u002Finstall\u002Fdocker",[8157,8161,8165,8169],{"title":8158,"path":8159,"order":7316,"children":8160},"Add Project Stacks on Docker","\u002Fdocs\u002Finstall\u002Fdocker\u002Fstacks",[],{"title":8162,"path":8163,"order":7316,"children":8164},"Docker Engine on Windows","\u002Fdocs\u002Finstall\u002Fdocker\u002Fwindows-docker-ce",[],{"title":8166,"path":8167,"order":7316,"children":8168},"Docker from AWS Market Place","\u002Fdocs\u002Finstall\u002Fdocker\u002Faws-marketplace",[],{"title":8170,"path":8171,"order":7316,"children":8172},"Docker on Digital Ocean","\u002Fdocs\u002Finstall\u002Fdocker\u002Fdigital-ocean",[],{"title":8174,"path":8175,"order":7316,"children":8176},"Email configuration","\u002Fdocs\u002Finstall\u002Femail-providers",[],{"title":8178,"path":8179,"order":7316,"children":8180},"First Run Setup","\u002Fdocs\u002Finstall\u002Ffirst-run",[],{"title":8182,"path":8183,"order":7316,"children":8184},"FlowFuse File Storage","\u002Fdocs\u002Finstall\u002Ffile-storage",[],{"title":8186,"path":8187,"order":7316,"children":8188},"Install FlowFuse on Kubernetes","\u002Fdocs\u002Finstall\u002Fkubernetes",[8189,8193,8197,8201,8205,8209],{"title":8190,"path":8191,"order":7316,"children":8192},"AWS EKS Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws",[],{"title":8194,"path":8195,"order":7316,"children":8196},"AWS EKS Installation with Terraform and Helm","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Faws-terraform",[],{"title":8198,"path":8199,"order":7316,"children":8200},"Digital Ocean Kubernetes Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fdigital-ocean",[],{"title":8202,"path":8203,"order":7316,"children":8204},"Ingress Controller Migration","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fingress-controller-migration",[],{"title":8206,"path":8207,"order":7316,"children":8208},"Kubernetes Project Stacks","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fstacks",[],{"title":8210,"path":8211,"order":7316,"children":8212},"OpenShift Installation","\u002Fdocs\u002Finstall\u002Fkubernetes\u002Fopenshift",[],{"title":8214,"path":8215,"group":8133,"groupOrder":1835,"order":1522,"children":8216},"Upgrading FlowFuse","\u002Fdocs\u002Fupgrade",[8217,8221],{"title":8218,"path":8219,"order":7316,"children":8220},"Installing a license","\u002Fdocs\u002Fupgrade\u002Fopen-source-to-premium",[],{"title":8222,"path":8223,"order":7316,"children":8224},"Upgrading the Node-RED version","\u002Fdocs\u002Fupgrade\u002Fnodered-version",[],{"title":8226,"path":8227,"group":8133,"groupOrder":1835,"order":1835,"children":8228,"link":7352},"Administering FlowFuse","\u002Fdocs\u002Fadmin",[8229,8232,8244,8252,8256,8260,8264,8268],{"title":8226,"path":8230,"order":1362,"children":8231},"\u002Fdocs\u002Fadmin\u002Fintroduction",[],{"title":8233,"path":8234,"order":7316,"children":8235},"Configuring Single Sign-On (SSO)","\u002Fdocs\u002Fadmin\u002Fsso",[8236,8240],{"title":8237,"path":8238,"order":7316,"children":8239},"LDAP SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fldap",[],{"title":8241,"path":8242,"order":7316,"children":8243},"SAML SSO","\u002Fdocs\u002Fadmin\u002Fsso\u002Fsaml",[],{"title":8245,"path":8246,"order":7316,"children":8247,"link":7352},"Hardening","\u002Fdocs\u002Fadmin\u002Fhardening",[8248],{"title":8249,"path":8250,"order":7316,"children":8251},"Kubernetes Hardening","\u002Fdocs\u002Fadmin\u002Fhardening\u002Fkubernetes",[],{"title":8253,"path":8254,"order":7316,"children":8255},"Monitoring","\u002Fdocs\u002Fadmin\u002Fmonitoring",[],{"title":8257,"path":8258,"order":7316,"children":8259},"Observability","\u002Fdocs\u002Fadmin\u002Fobservability",[],{"title":8261,"path":8262,"order":7316,"children":8263},"Soft Launch Enablement","\u002Fdocs\u002Fadmin\u002Ffeature-flags",[],{"title":8265,"path":8266,"order":7316,"children":8267},"Telemetry","\u002Fdocs\u002Fadmin\u002Ftelemetry",[],{"title":8269,"path":8270,"order":7316,"children":8271},"User Management","\u002Fdocs\u002Fadmin\u002Fuser-management",[],{"name":7710,"order":1865,"children":8273},[8274,8278],{"title":8275,"path":8276,"group":7710,"groupOrder":1865,"order":1522,"children":8277},"Premium Support","\u002Fdocs\u002Fpremium-support",[],{"title":8279,"path":8280,"group":7710,"groupOrder":1865,"order":7316,"children":8281},"Debugging Node-RED issues","\u002Fdocs\u002Fdebugging",[],{"name":8283,"order":1872,"children":8284},"Contributing",[8285],{"title":8286,"path":8287,"group":8283,"groupOrder":1872,"order":7316,"children":8288,"link":7352},"Contributing to FlowFuse","\u002Fdocs\u002Fcontribute",[8289,8292,8296,8300,8304,8308,8312,8320,8356,8359],{"title":7951,"path":8290,"order":1362,"children":8291},"\u002Fdocs\u002Fcontribute\u002Fintroduction",[],{"title":8293,"path":8294,"order":7316,"children":8295},"Adding Template Settings","\u002Fdocs\u002Fcontribute\u002Fadding-template-settings",[],{"title":8297,"path":8298,"order":7316,"children":8299},"API Design","\u002Fdocs\u002Fcontribute\u002Fapi-design",[],{"title":8301,"path":8302,"order":7316,"children":8303},"Creating debug stack containers","\u002Fdocs\u002Fcontribute\u002Fcreating-debug-stack-containers",[],{"title":8305,"path":8306,"order":7316,"children":8307},"Database migrations","\u002Fdocs\u002Fcontribute\u002Fdb-migrations",[],{"title":8309,"path":8310,"order":7316,"children":8311},"FlowFuse Architecture","\u002Fdocs\u002Fcontribute\u002Farchitecture",[],{"title":8313,"path":8314,"order":7316,"children":8315},"Local Install","\u002Fdocs\u002Fcontribute\u002Flocal",[8316],{"title":8317,"path":8318,"order":7316,"children":8319},"Local Stacks","\u002Fdocs\u002Fcontribute\u002Flocal\u002Fstacks",[],{"title":8321,"path":8322,"order":7316,"children":8323},"State Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows",[8324,8328,8332,8336,8340,8344,8348,8352],{"title":8325,"path":8326,"order":7316,"children":8327},"Device Editor","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fdevice-editor",[],{"title":8329,"path":8330,"order":7316,"children":8331},"Instance states","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-states",[],{"title":8333,"path":8334,"order":7316,"children":8335},"Invite External Users","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Finvite-external-user",[],{"title":8337,"path":8338,"order":7316,"children":8339},"Project Creation","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fproject-create",[],{"title":8341,"path":8342,"order":7316,"children":8343},"Reset Password Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fpassword-reset",[],{"title":8345,"path":8346,"order":7316,"children":8347},"Team creation Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fteam-create",[],{"title":8349,"path":8350,"order":7316,"children":8351},"User Login Flows","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Flogin",[],{"title":8353,"path":8354,"order":7316,"children":8355},"User Sign up Flow","\u002Fdocs\u002Fcontribute\u002Fworkflows\u002Fsignup",[],{"title":7931,"path":8357,"order":7316,"children":8358},"\u002Fdocs\u002Fcontribute\u002Fteam-broker",[],{"title":8360,"path":8361,"order":7316,"children":8362},"Working with Feature Flags","\u002Fdocs\u002Fcontribute\u002Ffeature-flags",[],{"name":8364,"order":2116,"children":8365},"Node-RED",[8366],{"title":8367,"path":8368,"group":8364,"groupOrder":2116,"order":1362,"children":8369},"Using Node-RED","\u002Fdocs\u002Fnode-red",[8370,8441,8617,8644,8683,8699,8715,8743,8763,8767],{"title":8371,"path":8372,"order":1390,"children":8373},"Getting started","\u002Fdocs\u002Fnode-red\u002Fgetting-started",[8374,8394,8398,8402,8406,8410,8414,8417,8421],{"title":8375,"path":8376,"order":1362,"children":8377},"Editor","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor",[8378,8382,8386,8390],{"title":8379,"path":8380,"order":7318,"children":8381},"Header","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fheader",[],{"title":8383,"path":8384,"order":7318,"children":8385},"Palette","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fpalette",[],{"title":8387,"path":8388,"order":7318,"children":8389},"Sidebar","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fsidebar",[],{"title":8391,"path":8392,"order":7318,"children":8393},"Workspace","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Feditor\u002Fworkspace",[],{"title":8395,"path":8396,"order":1390,"children":8397},"Port Configuration","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-port",[],{"title":8399,"path":8400,"order":1522,"children":8401},"Node-RED Library","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Flibrary",[],{"title":8403,"path":8404,"order":1522,"children":8405},"Update Node-RED","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fupdate-node-red",[],{"title":8407,"path":8408,"order":1835,"children":8409},"Node-RED On Android","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-android",[],{"title":8411,"path":8412,"order":1865,"children":8413},"Working with Messages","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fnode-red-messages",[],{"title":563,"path":8415,"order":1872,"children":8416},"\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fstring",[],{"title":8418,"path":8419,"order":2116,"children":8420},"Date & Time","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fdate-and-time",[],{"title":8422,"path":8423,"order":2122,"children":8424},"Programming","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming",[8425,8429,8433,8437],{"title":8426,"path":8427,"order":7318,"children":8428},"Data Tranformation","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fdata-tranformation",[],{"title":8430,"path":8431,"order":7318,"children":8432},"Debugging","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fdebugging-flows",[],{"title":8434,"path":8435,"order":7318,"children":8436},"If-Else","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Fif-else",[],{"title":8438,"path":8439,"order":7318,"children":8440},"Loop","\u002Fdocs\u002Fnode-red\u002Fgetting-started\u002Fprogramming\u002Floop",[],{"title":8442,"path":8443,"order":1522,"children":8444},"Core nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes",[8445,8480,8519,8561,8581,8605],{"title":8446,"path":8447,"order":1362,"children":8448},"Common nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon",[8449,8453,8457,8461,8465,8468,8472,8476],{"title":8450,"path":8451,"order":1362,"children":8452},"Inject","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Finject",[],{"title":8454,"path":8455,"order":1390,"children":8456},"Debug","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fdebug",[],{"title":8458,"path":8459,"order":1522,"children":8460},"Complete","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcomplete",[],{"title":8462,"path":8463,"order":1835,"children":8464},"Catch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcatch",[],{"title":3399,"path":8466,"order":1865,"children":8467},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fstatus",[],{"title":8469,"path":8470,"order":1872,"children":8471},"Link","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Flink",[],{"title":8473,"path":8474,"order":2116,"children":8475},"Comment","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Fcomment",[],{"title":8477,"path":8478,"order":2122,"children":8479},"Unknown","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fcommon\u002Funknown",[],{"title":8481,"path":8482,"order":1390,"children":8483},"Function nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction",[8484,8488,8492,8496,8499,8503,8507,8511,8515],{"title":8485,"path":8486,"order":1362,"children":8487},"Function","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ffunction",[],{"title":8489,"path":8490,"order":1390,"children":8491},"Switch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fswitch",[],{"title":8493,"path":8494,"order":1522,"children":8495},"Change","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fchange",[],{"title":4198,"path":8497,"order":1835,"children":8498},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Frange",[],{"title":8500,"path":8501,"order":1865,"children":8502},"Template","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ftemplate",[],{"title":8504,"path":8505,"order":1872,"children":8506},"Delay","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fdelay",[],{"title":8508,"path":8509,"order":2116,"children":8510},"Trigger","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ftrigger",[],{"title":8512,"path":8513,"order":2122,"children":8514},"Exec","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Fexec",[],{"title":8516,"path":8517,"order":2135,"children":8518},"Filter","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Ffunction\u002Ffilter",[],{"title":8520,"path":8521,"order":1522,"children":8522},"Network nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork",[8523,8527,8531,8534,8537,8541,8545,8549,8553,8557],{"title":8524,"path":8525,"order":1362,"children":8526},"TLS","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Ftls",[],{"title":8528,"path":8529,"order":1390,"children":8530},"HTTP Proxy","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-proxy",[],{"title":8035,"path":8532,"order":1522,"children":8533},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fmqtt-in",[],{"title":8039,"path":8535,"order":1835,"children":8536},"\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fmqtt-out",[],{"title":8538,"path":8539,"order":1865,"children":8540},"HTTP in","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-in",[],{"title":8542,"path":8543,"order":1872,"children":8544},"HTTP request","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fhttp-request",[],{"title":8546,"path":8547,"order":2116,"children":8548},"WebSocket","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fwebsocket",[],{"title":8550,"path":8551,"order":2122,"children":8552},"TCP in","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Ftcp-in",[],{"title":8554,"path":8555,"order":2135,"children":8556},"UDP In","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fudp-in",[],{"title":8558,"path":8559,"order":2174,"children":8560},"UDP Out","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fnetwork\u002Fudp-out",[],{"title":8562,"path":8563,"order":1835,"children":8564},"Sequence nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence",[8565,8569,8573,8577],{"title":8566,"path":8567,"order":1362,"children":8568},"Split","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fsplit",[],{"title":8570,"path":8571,"order":1390,"children":8572},"Sort","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fsort",[],{"title":8574,"path":8575,"order":1522,"children":8576},"Batch","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fbatch",[],{"title":8578,"path":8579,"order":1835,"children":8580},"Join","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fsequence\u002Fjoin",[],{"title":8582,"path":8583,"order":1865,"children":8584},"Parser nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers",[8585,8589,8593,8597,8601],{"title":8586,"path":8587,"order":1362,"children":8588},"CSV","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fcsv",[],{"title":8590,"path":8591,"order":1390,"children":8592},"HTML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fhtml",[],{"title":8594,"path":8595,"order":1522,"children":8596},"JSON","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fjson",[],{"title":8598,"path":8599,"order":1835,"children":8600},"XML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fxml",[],{"title":8602,"path":8603,"order":1865,"children":8604},"YAML","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fparsers\u002Fyaml",[],{"title":8606,"path":8607,"order":1872,"children":8608},"Storage nodes","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage",[8609,8613],{"title":8610,"path":8611,"order":1362,"children":8612},"Write File","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage\u002Fwrite-file",[],{"title":8614,"path":8615,"order":1390,"children":8616},"Read File","\u002Fdocs\u002Fnode-red\u002Fcore-nodes\u002Fstorage\u002Fread-file",[],{"title":8618,"path":8619,"order":1835,"children":8620},"Communication protocols","\u002Fdocs\u002Fnode-red\u002Fprotocol",[8621,8625,8629,8632,8636,8640],{"title":8622,"path":8623,"order":7318,"children":8624},"AMQP","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Famqp",[],{"title":8626,"path":8627,"order":7318,"children":8628},"LwM2M","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Flwm2m",[],{"title":8026,"path":8630,"order":7318,"children":8631},"\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fmodbus",[],{"title":8633,"path":8634,"order":7318,"children":8635},"MQTT","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fmqtt",[],{"title":8637,"path":8638,"order":7318,"children":8639},"OPC-UA","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fopc-ua",[],{"title":8641,"path":8642,"order":7318,"children":8643},"Websocket","\u002Fdocs\u002Fnode-red\u002Fprotocol\u002Fwebsocket",[],{"title":8645,"path":8646,"order":1865,"children":8647},"Databases","\u002Fdocs\u002Fnode-red\u002Fdatabase",[8648,8652,8656,8660,8664,8668,8672,8675,8679],{"title":8649,"path":8650,"order":7318,"children":8651},"DynamoDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fdynamodb",[],{"title":8653,"path":8654,"order":7318,"children":8655},"Firebase","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Ffirebase",[],{"title":8657,"path":8658,"order":7318,"children":8659},"InfluxDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Finfluxdb",[],{"title":8661,"path":8662,"order":7318,"children":8663},"MongoDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fmongodb",[],{"title":8665,"path":8666,"order":7318,"children":8667},"MySQL","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fmysql",[],{"title":8669,"path":8670,"order":7318,"children":8671},"PostgreSQL","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fpostgresql",[],{"title":8047,"path":8673,"order":7318,"children":8674},"\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fredis",[],{"title":8676,"path":8677,"order":7318,"children":8678},"SQLite","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Fsqlite",[],{"title":8680,"path":8681,"order":7318,"children":8682},"TimescaleDB","\u002Fdocs\u002Fnode-red\u002Fdatabase\u002Ftimescaledb",[],{"title":8684,"path":8685,"order":1872,"children":8686},"Integration technologies","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies",[8687,8691,8695],{"title":8688,"path":8689,"order":7318,"children":8690},"GraphQL API","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Fgraphql",[],{"title":8692,"path":8693,"order":7318,"children":8694},"REST API","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Frest",[],{"title":8696,"path":8697,"order":7318,"children":8698},"Webhook","\u002Fdocs\u002Fnode-red\u002Fintegration-technologies\u002Fwebhook",[],{"title":8700,"path":8701,"order":2116,"children":8702},"Notification services","\u002Fdocs\u002Fnode-red\u002Fnotification",[8703,8707,8711],{"title":8704,"path":8705,"order":7318,"children":8706},"Discord","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Fdiscord",[],{"title":8708,"path":8709,"order":7318,"children":8710},"Email","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Femail",[],{"title":8712,"path":8713,"order":7318,"children":8714},"Telegram","\u002Fdocs\u002Fnode-red\u002Fnotification\u002Ftelegram",[],{"title":8716,"path":8717,"order":2122,"children":8718},"Hardware","\u002Fdocs\u002Fnode-red\u002Fhardware",[8719,8723,8727,8731,8735,8739],{"title":8720,"path":8721,"order":7318,"children":8722},"BLIIOT ARMxy BL340","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Farmxy-bl340",[],{"title":8724,"path":8725,"order":7318,"children":8726},"Opto-22 Groov Epic","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fopto-22-groove-rio-7-mm2001-10",[],{"title":8728,"path":8729,"order":7318,"children":8730},"Raspberry Pi 4","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fraspberry-pi-4",[],{"title":8732,"path":8733,"order":7318,"children":8734},"Raspberry Pi 5","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fraspberry-pi-5",[],{"title":8736,"path":8737,"order":7318,"children":8738},"Robustel EG5120","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Frobustel-eg5120",[],{"title":8740,"path":8741,"order":7318,"children":8742},"Siemens IoT2050","\u002Fdocs\u002Fnode-red\u002Fhardware\u002Fsiemens-iot-2050",[],{"title":8744,"path":8745,"order":2135,"children":8746},"Peripheral devices","\u002Fdocs\u002Fnode-red\u002Fperipheral",[8747,8751,8755,8759],{"title":8748,"path":8749,"order":7318,"children":8750},"Arduino","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fardiuno",[],{"title":8752,"path":8753,"order":7318,"children":8754},"Barcode Scanner","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fbarcodescanner",[],{"title":8756,"path":8757,"order":7318,"children":8758},"ESP32","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fesp32",[],{"title":8760,"path":8761,"order":7318,"children":8762},"Webcam","\u002Fdocs\u002Fnode-red\u002Fperipheral\u002Fwebcam",[],{"title":8764,"path":8765,"order":2174,"children":8766},"Terminology","\u002Fdocs\u002Fnode-red\u002Fterminology",[],{"title":8768,"path":8769,"order":2249,"children":8770},"Keyboard shortcuts","\u002Fdocs\u002Fnode-red\u002Fkeyboard",[],1788888652345]