[{"data":1,"prerenderedAt":5472},["ShallowReactive",2],{"blog-\u002Fblog\u002F2026\u002F08\u002Fconnect-agvs-vda-5050-mqtt":3,"blog-all-for-related":5471},{"id":4,"title":5,"authors":6,"body":8,"cta":5449,"date":5453,"description":5454,"extension":5455,"image":5456,"lastUpdated":5457,"meta":5458,"navigation":2669,"path":5463,"seo":5464,"stem":5465,"subtitle":5466,"tags":5467,"tldr":5457,"video":5457,"__hash__":5470},"blog\u002Fblog\u002F2026\u002F08\u002Fconnect-agvs-vda-5050-mqtt.md","VDA 5050 Tutorial: Connect AGVs to Factory Systems over MQTT",[7],"sumit-shinde",{"type":9,"value":10,"toc":5426},"minimark",[11,15,24,27,33,38,41,44,47,52,55,58,66,69,73,85,88,92,105,108,112,226,235,243,255,259,269,275,284,298,313,320,324,327,471,487,490,494,1200,1209,1246,1266,1283,1300,1309,1313,1317,1342,1346,1395,1407,1411,1472,2513,2516,2520,2525,2532,2535,2538,2547,2820,2834,2838,2841,2854,2872,2878,2881,2900,2904,2916,2920,2924,2927,2945,2967,2986,2989,3031,3034,3940,3951,3957,3980,4005,5251,5254,5263,5267,5270,5374,5378,5381,5392,5405,5422],[12,13,14],"p",{},"If you run AGVs from more than one vendor, you already know the problem. Each vendor ships its own fleet manager. Those fleet managers don't talk to each other.",[12,16,17,18,23],{},"Two fleets under separate control can't share an intersection. So you either accept deadlocks, or you split the floor into separate lanes and waste space. Each fleet manager also needs its own link to your ERP, MES, or WMS. Adding a vehicle from a new vendor means ",[19,20,22],"a",{"href":21},"\u002Fblog\u002F2024\u002F11\u002Fwhy-point-to-point-connection-is-dead\u002F","another integration project",". And because no single system sees all the work, one vendor's AGVs sit idle while the other's are backed up.",[12,25,26],{},"VDA 5050 solves that. FlowFuse gives you somewhere to build the master control system that uses it.",[28,29],"cta-image",{"alt":30,"cta":31,"src":32},"Walk through your FlowFuse setup with our team - book a demo","demo","\u002Fimages\u002Fcta\u002Fbook-a-demo.png",[34,35,37],"h2",{"id":36},"why-vda-5050","Why VDA 5050?",[12,39,40],{},"VDA 5050 is an open communication standard. The VDA (the German automotive association) and the VDMA (the machinery association) publish it together. The Institute for Material Handling and Logistics (IFL) at KIT leads the technical work.",[12,42,43],{},"It first appeared in 2019. It sets out how a master control system sends transport orders to a vehicle, and how that vehicle reports back. Messages travel over MQTT as JSON.",[12,45,46],{},"Most AGVs and AMRs on factory floors today speak the 2.x version. Version 3.0 came out on 19 March 2026 and adds support for freely navigating robots.",[48,49,51],"h3",{"id":50},"one-interface-any-vehicle","One interface, any vehicle",[12,53,54],{},"A master control system that speaks VDA 5050 can drive vehicles from different makers. You don't write a new integration for each one.",[12,56,57],{},"The standard fixes the message contract, not the vehicle. How an AGV avoids obstacles or plans its path is still up to the manufacturer. What you get is a shared order format and a shared status format.",[12,59,60,61,65],{},"If you already run ",[19,62,64],{"href":63},"\u002Fblog\u002F2026\u002F06\u002Fmqtt-vs-sparkplug-b\u002F","Sparkplug B"," on the same broker, the two solve different problems. Sparkplug standardizes telemetry from any device. VDA 5050 standardizes a command-and-report contract for one class of device, so it says what an order looks like as well as what a status message looks like.",[12,67,68],{},"Safety stays out of scope. Emergency stops and person detection live on the vehicle and follow standards like ISO 3691-4. VDA 5050 reports safety state. It does not implement it.",[48,70,72],{"id":71},"real-detail-not-just-a-heartbeat","Real detail, not just a heartbeat",[12,74,75,76,80,81,84],{},"The messages carry operational data. A ",[77,78,79],"code",{},"state"," message includes position, battery charge, order progress, and any active errors. An ",[77,82,83],{},"order"," describes a route of nodes and edges with actions attached, such as pick, drop, wait, or charge.",[12,86,87],{},"That detail is what lets master control make dispatch decisions, instead of just knowing a vehicle is online.",[48,89,91],{"id":90},"built-on-mqtt","Built on MQTT",[12,93,94,95,99,100,104],{},"MQTT suits a fleet well. It is lightweight, it uses ",[19,96,98],{"href":97},"\u002Fblog\u002F2024\u002F06\u002Fhow-to-use-mqtt-in-node-red\u002F","publish and subscribe",", and it copes with devices that drop off the network. Vehicles report when something changes rather than waiting to be polled, which is ",[19,101,103],{"href":102},"\u002Fblog\u002F2026\u002F02\u002Fwhat-is-event-driven-architecture-in-manufacturing\u002F","event-driven architecture"," applied to a floor full of moving hardware.",[12,106,107],{},"Every VDA 5050 topic follows the same pattern. So one wildcard subscription hears from every vehicle on the floor, whoever built it.",[34,109,111],{"id":110},"the-six-topics","The six topics",[113,114,115,134],"table",{},[116,117,118],"thead",{},[119,120,121,125,128,131],"tr",{},[122,123,124],"th",{},"Topic",[122,126,127],{},"Sent by",[122,129,130],{},"Read by",[122,132,133],{},"What it carries",[135,136,137,153,167,180,197,212],"tbody",{},[119,138,139,144,147,150],{},[140,141,142],"td",{},[77,143,83],{},[140,145,146],{},"Master control",[140,148,149],{},"AGV",[140,151,152],{},"A route of nodes and edges, with actions",[119,154,155,160,162,164],{},[140,156,157],{},[77,158,159],{},"instantActions",[140,161,146],{},[140,163,149],{},[140,165,166],{},"Immediate commands: pause, resume, cancel, start charging",[119,168,169,173,175,177],{},[140,170,171],{},[77,172,79],{},[140,174,149],{},[140,176,146],{},[140,178,179],{},"Full status: position, battery, order progress, errors",[119,181,182,187,189,192],{},[140,183,184],{},[77,185,186],{},"visualization",[140,188,149],{},[140,190,191],{},"Map displays",[140,193,194,195],{},"Position and velocity only, sent more often than ",[77,196,79],{},[119,198,199,204,207,209],{},[140,200,201],{},[77,202,203],{},"connection",[140,205,206],{},"AGV, or the broker for it",[140,208,146],{},[140,210,211],{},"Online and offline at the MQTT level",[119,213,214,219,221,223],{},[140,215,216],{},[77,217,218],{},"factsheet",[140,220,149],{},[140,222,146],{},[140,224,225],{},"What the vehicle can do: size, load types, supported actions",[12,227,228,229,231,232,234],{},"Both ",[77,230,79],{}," and ",[77,233,186],{}," carry position. That is on purpose.",[12,236,237,239,240,242],{},[77,238,79],{}," is the full picture. A vehicle sends it when something changes, and at least once every 30 seconds. ",[77,241,186],{}," is a small message with just position and velocity, so it can go out far more often, typically once a second or faster.",[12,244,245,246,248,249,251,252,254],{},"Use ",[77,247,79],{}," for anything master control acts on. Use ",[77,250,186],{}," only to draw a smooth live map. Note that ",[77,253,186],{}," is optional in the standard, so some vehicles never send it. Version 3.0 widens its job: it now carries the planned path too, so traffic control can read it rather than just a map display.",[48,256,258],{"id":257},"how-topics-are-named","How topics are named",[260,261,266],"pre",{"className":262,"code":264,"language":265},[263],"language-text","\u003CinterfaceName>\u002F\u003CmajorVersion>\u002F\u003Cmanufacturer>\u002F\u003CserialNumber>\u002F\u003Ctopic>\n","text",[77,267,264],{"__ignoreMap":268},"",[12,270,271,272],{},"For example: ",[77,273,274],{},"uagv\u002Fv2\u002FAcmeRobotics\u002FAGV-042\u002Fstate",[12,276,277,280,281,283],{},[77,278,279],{},"uagv"," is the interface name the standard uses in its own examples, and most people read it as short for \"universal AGV\". The standard itself only calls it the name of the interface, and each site can set its own. But nearly every 2.x deployment uses ",[77,282,279],{},", including the vehicles you are likely to buy. Treat it as fixed unless the vehicle's manual says otherwise.",[12,285,286,287,289,290,292,293,297],{},"The same caveat applies to the levels around it. The standard mandates the topic names in the final segment, ",[77,288,83],{},", ",[77,291,79],{},", and so on. It calls the ",[19,294,296],{"href":295},"\u002Fblog\u002F2025\u002F01\u002Fdesigning-topic-hierarchy-for-your-uns\u002F","five-level structure"," a suggestion for a local broker, because cloud brokers impose their own topic rules. On-premise fleets follow it anyway, so build against it and adapt only if your broker forces you to.",[12,299,300,301,304,305,308,309,312],{},"The version segment is the major version only. So ",[77,302,303],{},"v2",", not ",[77,306,307],{},"v2.0.0",". The full version number goes in the ",[77,310,311],{},"version"," field inside the payload.",[12,314,315,316,319],{},"Because the maker and serial number sit in the topic, master control can subscribe once to ",[77,317,318],{},"uagv\u002Fv2\u002F+\u002F+\u002Fstate"," and hear from every vehicle. Restrict each vehicle to its own topic path, using an allowlist on your broker.",[48,321,323],{"id":322},"a-note-on-version-30","A note on version 3.0",[12,325,326],{},"This tutorial uses version 2.x names, because that is what most vehicles speak today. Version 3.0 renames a lot:",[328,329,330,337,346,361,369,382,397,407,416,428,434,447,459,468],"ul",{},[331,332,333,334],"li",{},"The example topic prefix moves to ",[77,335,336],{},"vda5050\u002Fv3\u002F...",[331,338,339,342,343],{},[77,340,341],{},"agvPosition"," becomes ",[77,344,345],{},"mobileRobotPosition",[331,347,348,342,351,354,355,342,358],{},[77,349,350],{},"batteryState",[77,352,353],{},"powerSupply",", and ",[77,356,357],{},"batteryCharge",[77,359,360],{},"stateOfCharge",[331,362,363,342,366],{},[77,364,365],{},"positionInitialized",[77,367,368],{},"localized",[331,370,371,342,374,377,378,381],{},[77,372,373],{},"safetyState.eStop",[77,375,376],{},"activeEmergencyStop",", and the ",[77,379,380],{},"AUTOACK"," value is gone",[331,383,384,387,388,289,390,354,393,396],{},[77,385,386],{},"actionStates"," splits into ",[77,389,386],{},[77,391,392],{},"instantActionStates",[77,394,395],{},"zoneActionStates",", each cleared by its own instant action",[331,398,399,400,231,403,406],{},"Edges drop ",[77,401,402],{},"startNodeId",[77,404,405],{},"endNodeId",". Position in the sequence alone now says which nodes an edge connects",[331,408,409,410,231,413],{},"Errors gain two levels, ",[77,411,412],{},"CRITICAL",[77,414,415],{},"URGENT",[331,417,418,419,289,422,354,425],{},"Every robot must support ",[77,420,421],{},"startPause",[77,423,424],{},"stopPause",[77,426,427],{},"cancelOrder",[331,429,430,433],{},[77,431,432],{},"timestamp"," moves from hundredths of a second to milliseconds",[331,435,436,437,231,440,443,444],{},"Version 3.0 adds two optional topics, ",[77,438,439],{},"zoneSet",[77,441,442],{},"responses",", and a fourth blocking type, ",[77,445,446],{},"SINGLE",[331,448,449,342,452,354,455,458],{},[77,450,451],{},"CONNECTIONBROKEN",[77,453,454],{},"CONNECTION_BROKEN",[77,456,457],{},"HIBERNATING"," is added",[331,460,461,462,231,465],{},"It also adds the operating modes ",[77,463,464],{},"STARTUP",[77,466,467],{},"INTERVENED",[331,469,470],{},"The wording changes from \"AGV\" to \"mobile robot\" throughout",[12,472,473,474,480,481,486],{},"Version 3.0 also strips abbreviations out of parameter names across the whole document, which is a breaking change. The ",[19,475,479],{"href":476,"rel":477},"https:\u002F\u002Fgithub.com\u002FVDA5050\u002FVDA5050\u002Freleases\u002Ftag\u002F3.0.0",[478],"nofollow","3.0.0 release notes"," link a ",[19,482,485],{"href":483,"rel":484},"https:\u002F\u002Fgithub.com\u002FVDA5050\u002FVDA5050\u002Fpull\u002F465",[478],"table of every rename",", so check that before you port a 2.x integration.",[12,488,489],{},"If your vehicle ships with 3.0 support, swap the names. The topic structure and the ideas below stay the same.",[48,491,493],{"id":492},"what-a-state-message-looks-like","What a state message looks like",[260,495,499],{"className":496,"code":497,"language":498,"meta":268,"style":268},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"headerId\": 42,\n  \"timestamp\": \"2026-08-10T09:15:00.000Z\",\n  \"version\": \"2.1.0\",\n  \"manufacturer\": \"AcmeRobotics\",\n  \"serialNumber\": \"AGV-042\",\n  \"orderId\": \"order-1001\",\n  \"orderUpdateId\": 0,\n  \"lastNodeId\": \"node7\",\n  \"lastNodeSequenceId\": 6,\n  \"nodeStates\": [\n    { \"nodeId\": \"node8\", \"sequenceId\": 8, \"released\": true }\n  ],\n  \"edgeStates\": [\n    { \"edgeId\": \"node7-8\", \"sequenceId\": 7, \"released\": true }\n  ],\n  \"agvPosition\": {\n    \"x\": 12.4,\n    \"y\": 3.1,\n    \"theta\": 0.0,\n    \"mapId\": \"floor1\",\n    \"positionInitialized\": true\n  },\n  \"velocity\": { \"vx\": 0.5, \"vy\": 0.0, \"omega\": 0.0 },\n  \"batteryState\": { \"batteryCharge\": 76.5, \"charging\": false },\n  \"driving\": true,\n  \"actionStates\": [\n    { \"actionId\": \"drop-42\", \"actionStatus\": \"WAITING\" }\n  ],\n  \"operatingMode\": \"AUTOMATIC\",\n  \"errors\": [],\n  \"safetyState\": { \"eStop\": \"NONE\", \"fieldViolation\": false }\n}\n","json",[77,500,501,510,533,555,575,596,617,638,655,676,693,708,763,769,783,831,836,850,868,885,902,923,937,943,999,1039,1054,1067,1108,1113,1134,1149,1194],{"__ignoreMap":268},[502,503,506],"span",{"class":504,"line":505},"line",1,[502,507,509],{"class":508},"sMK4o","{\n",[502,511,513,516,520,523,526,530],{"class":504,"line":512},2,[502,514,515],{"class":508},"  \"",[502,517,519],{"class":518},"spNyl","headerId",[502,521,522],{"class":508},"\"",[502,524,525],{"class":508},":",[502,527,529],{"class":528},"sbssI"," 42",[502,531,532],{"class":508},",\n",[502,534,536,538,540,542,544,547,551,553],{"class":504,"line":535},3,[502,537,515],{"class":508},[502,539,432],{"class":518},[502,541,522],{"class":508},[502,543,525],{"class":508},[502,545,546],{"class":508}," \"",[502,548,550],{"class":549},"sfazB","2026-08-10T09:15:00.000Z",[502,552,522],{"class":508},[502,554,532],{"class":508},[502,556,558,560,562,564,566,568,571,573],{"class":504,"line":557},4,[502,559,515],{"class":508},[502,561,311],{"class":518},[502,563,522],{"class":508},[502,565,525],{"class":508},[502,567,546],{"class":508},[502,569,570],{"class":549},"2.1.0",[502,572,522],{"class":508},[502,574,532],{"class":508},[502,576,578,580,583,585,587,589,592,594],{"class":504,"line":577},5,[502,579,515],{"class":508},[502,581,582],{"class":518},"manufacturer",[502,584,522],{"class":508},[502,586,525],{"class":508},[502,588,546],{"class":508},[502,590,591],{"class":549},"AcmeRobotics",[502,593,522],{"class":508},[502,595,532],{"class":508},[502,597,599,601,604,606,608,610,613,615],{"class":504,"line":598},6,[502,600,515],{"class":508},[502,602,603],{"class":518},"serialNumber",[502,605,522],{"class":508},[502,607,525],{"class":508},[502,609,546],{"class":508},[502,611,612],{"class":549},"AGV-042",[502,614,522],{"class":508},[502,616,532],{"class":508},[502,618,620,622,625,627,629,631,634,636],{"class":504,"line":619},7,[502,621,515],{"class":508},[502,623,624],{"class":518},"orderId",[502,626,522],{"class":508},[502,628,525],{"class":508},[502,630,546],{"class":508},[502,632,633],{"class":549},"order-1001",[502,635,522],{"class":508},[502,637,532],{"class":508},[502,639,641,643,646,648,650,653],{"class":504,"line":640},8,[502,642,515],{"class":508},[502,644,645],{"class":518},"orderUpdateId",[502,647,522],{"class":508},[502,649,525],{"class":508},[502,651,652],{"class":528}," 0",[502,654,532],{"class":508},[502,656,658,660,663,665,667,669,672,674],{"class":504,"line":657},9,[502,659,515],{"class":508},[502,661,662],{"class":518},"lastNodeId",[502,664,522],{"class":508},[502,666,525],{"class":508},[502,668,546],{"class":508},[502,670,671],{"class":549},"node7",[502,673,522],{"class":508},[502,675,532],{"class":508},[502,677,679,681,684,686,688,691],{"class":504,"line":678},10,[502,680,515],{"class":508},[502,682,683],{"class":518},"lastNodeSequenceId",[502,685,522],{"class":508},[502,687,525],{"class":508},[502,689,690],{"class":528}," 6",[502,692,532],{"class":508},[502,694,696,698,701,703,705],{"class":504,"line":695},11,[502,697,515],{"class":508},[502,699,700],{"class":518},"nodeStates",[502,702,522],{"class":508},[502,704,525],{"class":508},[502,706,707],{"class":508}," [\n",[502,709,711,714,716,720,722,724,726,729,731,734,736,739,741,743,746,748,750,753,755,757,760],{"class":504,"line":710},12,[502,712,713],{"class":508},"    {",[502,715,546],{"class":508},[502,717,719],{"class":718},"sBMFI","nodeId",[502,721,522],{"class":508},[502,723,525],{"class":508},[502,725,546],{"class":508},[502,727,728],{"class":549},"node8",[502,730,522],{"class":508},[502,732,733],{"class":508},",",[502,735,546],{"class":508},[502,737,738],{"class":718},"sequenceId",[502,740,522],{"class":508},[502,742,525],{"class":508},[502,744,745],{"class":528}," 8",[502,747,733],{"class":508},[502,749,546],{"class":508},[502,751,752],{"class":718},"released",[502,754,522],{"class":508},[502,756,525],{"class":508},[502,758,759],{"class":508}," true",[502,761,762],{"class":508}," }\n",[502,764,766],{"class":504,"line":765},13,[502,767,768],{"class":508},"  ],\n",[502,770,772,774,777,779,781],{"class":504,"line":771},14,[502,773,515],{"class":508},[502,775,776],{"class":518},"edgeStates",[502,778,522],{"class":508},[502,780,525],{"class":508},[502,782,707],{"class":508},[502,784,786,788,790,793,795,797,799,802,804,806,808,810,812,814,817,819,821,823,825,827,829],{"class":504,"line":785},15,[502,787,713],{"class":508},[502,789,546],{"class":508},[502,791,792],{"class":718},"edgeId",[502,794,522],{"class":508},[502,796,525],{"class":508},[502,798,546],{"class":508},[502,800,801],{"class":549},"node7-8",[502,803,522],{"class":508},[502,805,733],{"class":508},[502,807,546],{"class":508},[502,809,738],{"class":718},[502,811,522],{"class":508},[502,813,525],{"class":508},[502,815,816],{"class":528}," 7",[502,818,733],{"class":508},[502,820,546],{"class":508},[502,822,752],{"class":718},[502,824,522],{"class":508},[502,826,525],{"class":508},[502,828,759],{"class":508},[502,830,762],{"class":508},[502,832,834],{"class":504,"line":833},16,[502,835,768],{"class":508},[502,837,839,841,843,845,847],{"class":504,"line":838},17,[502,840,515],{"class":508},[502,842,341],{"class":518},[502,844,522],{"class":508},[502,846,525],{"class":508},[502,848,849],{"class":508}," {\n",[502,851,853,856,859,861,863,866],{"class":504,"line":852},18,[502,854,855],{"class":508},"    \"",[502,857,858],{"class":718},"x",[502,860,522],{"class":508},[502,862,525],{"class":508},[502,864,865],{"class":528}," 12.4",[502,867,532],{"class":508},[502,869,871,873,876,878,880,883],{"class":504,"line":870},19,[502,872,855],{"class":508},[502,874,875],{"class":718},"y",[502,877,522],{"class":508},[502,879,525],{"class":508},[502,881,882],{"class":528}," 3.1",[502,884,532],{"class":508},[502,886,888,890,893,895,897,900],{"class":504,"line":887},20,[502,889,855],{"class":508},[502,891,892],{"class":718},"theta",[502,894,522],{"class":508},[502,896,525],{"class":508},[502,898,899],{"class":528}," 0.0",[502,901,532],{"class":508},[502,903,905,907,910,912,914,916,919,921],{"class":504,"line":904},21,[502,906,855],{"class":508},[502,908,909],{"class":718},"mapId",[502,911,522],{"class":508},[502,913,525],{"class":508},[502,915,546],{"class":508},[502,917,918],{"class":549},"floor1",[502,920,522],{"class":508},[502,922,532],{"class":508},[502,924,926,928,930,932,934],{"class":504,"line":925},22,[502,927,855],{"class":508},[502,929,365],{"class":718},[502,931,522],{"class":508},[502,933,525],{"class":508},[502,935,936],{"class":508}," true\n",[502,938,940],{"class":504,"line":939},23,[502,941,942],{"class":508},"  },\n",[502,944,946,948,951,953,955,958,960,963,965,967,970,972,974,977,979,981,983,985,987,990,992,994,996],{"class":504,"line":945},24,[502,947,515],{"class":508},[502,949,950],{"class":518},"velocity",[502,952,522],{"class":508},[502,954,525],{"class":508},[502,956,957],{"class":508}," {",[502,959,546],{"class":508},[502,961,962],{"class":718},"vx",[502,964,522],{"class":508},[502,966,525],{"class":508},[502,968,969],{"class":528}," 0.5",[502,971,733],{"class":508},[502,973,546],{"class":508},[502,975,976],{"class":718},"vy",[502,978,522],{"class":508},[502,980,525],{"class":508},[502,982,899],{"class":528},[502,984,733],{"class":508},[502,986,546],{"class":508},[502,988,989],{"class":718},"omega",[502,991,522],{"class":508},[502,993,525],{"class":508},[502,995,899],{"class":528},[502,997,998],{"class":508}," },\n",[502,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1023,1025,1027,1030,1032,1034,1037],{"class":504,"line":1001},25,[502,1003,515],{"class":508},[502,1005,350],{"class":518},[502,1007,522],{"class":508},[502,1009,525],{"class":508},[502,1011,957],{"class":508},[502,1013,546],{"class":508},[502,1015,357],{"class":718},[502,1017,522],{"class":508},[502,1019,525],{"class":508},[502,1021,1022],{"class":528}," 76.5",[502,1024,733],{"class":508},[502,1026,546],{"class":508},[502,1028,1029],{"class":718},"charging",[502,1031,522],{"class":508},[502,1033,525],{"class":508},[502,1035,1036],{"class":508}," false",[502,1038,998],{"class":508},[502,1040,1042,1044,1047,1049,1051],{"class":504,"line":1041},26,[502,1043,515],{"class":508},[502,1045,1046],{"class":518},"driving",[502,1048,522],{"class":508},[502,1050,525],{"class":508},[502,1052,1053],{"class":508}," true,\n",[502,1055,1057,1059,1061,1063,1065],{"class":504,"line":1056},27,[502,1058,515],{"class":508},[502,1060,386],{"class":518},[502,1062,522],{"class":508},[502,1064,525],{"class":508},[502,1066,707],{"class":508},[502,1068,1070,1072,1074,1077,1079,1081,1083,1086,1088,1090,1092,1095,1097,1099,1101,1104,1106],{"class":504,"line":1069},28,[502,1071,713],{"class":508},[502,1073,546],{"class":508},[502,1075,1076],{"class":718},"actionId",[502,1078,522],{"class":508},[502,1080,525],{"class":508},[502,1082,546],{"class":508},[502,1084,1085],{"class":549},"drop-42",[502,1087,522],{"class":508},[502,1089,733],{"class":508},[502,1091,546],{"class":508},[502,1093,1094],{"class":718},"actionStatus",[502,1096,522],{"class":508},[502,1098,525],{"class":508},[502,1100,546],{"class":508},[502,1102,1103],{"class":549},"WAITING",[502,1105,522],{"class":508},[502,1107,762],{"class":508},[502,1109,1111],{"class":504,"line":1110},29,[502,1112,768],{"class":508},[502,1114,1116,1118,1121,1123,1125,1127,1130,1132],{"class":504,"line":1115},30,[502,1117,515],{"class":508},[502,1119,1120],{"class":518},"operatingMode",[502,1122,522],{"class":508},[502,1124,525],{"class":508},[502,1126,546],{"class":508},[502,1128,1129],{"class":549},"AUTOMATIC",[502,1131,522],{"class":508},[502,1133,532],{"class":508},[502,1135,1137,1139,1142,1144,1146],{"class":504,"line":1136},31,[502,1138,515],{"class":508},[502,1140,1141],{"class":518},"errors",[502,1143,522],{"class":508},[502,1145,525],{"class":508},[502,1147,1148],{"class":508}," [],\n",[502,1150,1152,1154,1157,1159,1161,1163,1165,1168,1170,1172,1174,1177,1179,1181,1183,1186,1188,1190,1192],{"class":504,"line":1151},32,[502,1153,515],{"class":508},[502,1155,1156],{"class":518},"safetyState",[502,1158,522],{"class":508},[502,1160,525],{"class":508},[502,1162,957],{"class":508},[502,1164,546],{"class":508},[502,1166,1167],{"class":718},"eStop",[502,1169,522],{"class":508},[502,1171,525],{"class":508},[502,1173,546],{"class":508},[502,1175,1176],{"class":549},"NONE",[502,1178,522],{"class":508},[502,1180,733],{"class":508},[502,1182,546],{"class":508},[502,1184,1185],{"class":718},"fieldViolation",[502,1187,522],{"class":508},[502,1189,525],{"class":508},[502,1191,1036],{"class":508},[502,1193,762],{"class":508},[502,1195,1197],{"class":504,"line":1196},33,[502,1198,1199],{"class":508},"}\n",[12,1201,1202,1203,1205,1206,1208],{},"That vehicle is driving from ",[77,1204,671],{}," to ",[77,1207,728],{},", with a drop waiting at the end of it. Three things to know before you write code against this.",[12,1210,1211,1215,1216,289,1218,289,1220,289,1222,289,1224,289,1226,289,1228,289,1230,289,1232,289,1234,289,1236,354,1238,1240,1241,231,1243,1245],{},[1212,1213,1214],"strong",{},"Some fields are always there."," ",[77,1217,624],{},[77,1219,645],{},[77,1221,662],{},[77,1223,683],{},[77,1225,700],{},[77,1227,776],{},[77,1229,1046],{},[77,1231,386],{},[77,1233,350],{},[77,1235,1120],{},[77,1237,1141],{},[77,1239,1156],{}," are required. An idle vehicle sends empty ",[77,1242,700],{},[77,1244,776],{}," arrays. It does not drop the fields.",[12,1247,1248,1215,1251,231,1253,1255,1256,1258,1259,1261,1262,1265],{},[1212,1249,1250],{},"Position is not, but read the exception carefully.",[77,1252,341],{},[77,1254,950],{}," are optional. The standard only lets a vehicle omit ",[77,1257,341],{}," if it cannot localize itself at all, such as a line-guided AGV. A vehicle that can localize but hasn't finished yet still sends the field, with ",[77,1260,365],{}," set to ",[77,1263,1264],{},"false",".",[12,1267,1268,1269,1271,1272,1274,1275,1278,1279,1282],{},"So master control needs two checks, not one. Confirm ",[77,1270,341],{}," is there, then confirm ",[77,1273,365],{}," is ",[77,1276,1277],{},"true"," before you trust the numbers. Code like ",[77,1280,1281],{},"msg.payload.agvPosition.x"," crashes on a line-guided vehicle. Code that skips the second check will route a truck using coordinates the truck itself doesn't stand behind.",[12,1284,1285,1292,1293,1295,1296,1299],{},[1212,1286,1287,1288,1291],{},"Watch the ",[19,1289,432],{"href":1290},"\u002Fblog\u002F2026\u002F07\u002Ftime-synchronization-edge-devices\u002F"," precision."," 2.x writes ",[77,1294,432],{}," with hundredths of a second, while JavaScript's ",[77,1297,1298],{},"toISOString()"," gives you milliseconds. Vehicles accept it in practice, and 3.0 moves to milliseconds officially, but a strict schema validator flags it.",[12,1301,1302,1303,1308],{},"The standard ships ",[19,1304,1307],{"href":1305,"rel":1306},"https:\u002F\u002Fgithub.com\u002FVDA5050\u002FVDA5050\u002Ftree\u002Fmain\u002Fjson_schemas",[478],"JSON schemas"," for all six topics. Point a validator at them and you can check a payload before you send it, rather than finding out from the vehicle.",[34,1310,1312],{"id":1311},"build-it","Build it",[48,1314,1316],{"id":1315},"what-you-need","What you need",[328,1318,1319,1326,1339],{},[331,1320,1321,1322,1265],{},"A running FlowFuse instance on your edge device. If you do not have an account, [sign up for a free trial]({% include \"sign-up-url.njk\" %}) and set up your instance following the instructions in this ",[19,1323,1325],{"href":1324},"\u002Fdocs\u002Fdevice-agent\u002Fquickstart\u002F","guide",[331,1327,1328,1329,1333,1334,1338],{},"An MQTT broker your AGVs (or an AGV simulator) already publish to, or FlowFuse's ",[19,1330,1332],{"href":1331},"\u002Fdocs\u002Fuser\u002Fteambroker\u002F","built-in team broker"," if you're prototyping. If you're still ",[19,1335,1337],{"href":1336},"\u002Fblog\u002F2024\u002F01\u002Funified-namespace-what-broker\u002F","choosing a broker",", any one with retained messages, last will, and per-client topic permissions will do.",[331,1340,1341],{},"At least one vehicle or simulator publishing VDA 5050 topics, so you have real messages to work with.",[48,1343,1345],{"id":1344},"step-1-connect-to-your-broker","Step 1: Connect to your broker",[1347,1348,1349,1356,1363,1378,1385,1392],"ol",{},[331,1350,1351,1352,1355],{},"Drag an ",[1212,1353,1354],{},"mqtt in"," node onto the canvas. Double-click it.",[331,1357,1358,1359,1362],{},"Click the pencil icon next to ",[1212,1360,1361],{},"Server"," to add a broker.",[331,1364,1365,1366,1373,1374,1377],{},"Enter your broker's host and port. ",[19,1367,1369,1370],{"href":1368},"\u002Fblog\u002F2024\u002F11\u002Fgetting-the-most-out-of-mqtt-for-industrial-iot\u002F","Use 8883 and tick ",[1212,1371,1372],{},"Use TLS"," on the ",[1212,1375,1376],{},"Connection"," tab. Only use plain port 1883 on an isolated test network.",[331,1379,1380,1381,1384],{},"On the same tab, set ",[1212,1382,1383],{},"Keep alive"," to 15 seconds. The standard suggests around that, because the keep alive decides how fast the broker notices a vehicle has vanished. Node-RED defaults to 60, which leaves a dead AGV looking alive for up to a minute and a half.",[331,1386,1387,1388,1391],{},"If your broker needs a login, open the ",[1212,1389,1390],{},"Security"," tab and enter the username and password.",[331,1393,1394],{},"Leave the topic empty for now. You'll fill it in next.",[12,1396,1397,1398,1402,1403,1406],{},"The ",[19,1399,1401],{"href":1400},"\u002Fdocs\u002Fuser\u002Fmqtt-nodes\u002F","FlowFuse MQTT nodes"," replace steps 2 to 5 if you're pointing at the ",[19,1404,1405],{"href":1331},"FlowFuse broker",". They create the client and fill in the credentials themselves.",[48,1408,1410],{"id":1409},"step-2-subscribe-to-fleet-state","Step 2: Subscribe to fleet state",[1347,1412,1413,1428,1449,1455,1466],{},[331,1414,1415,1416,1418,1419,1205,1421,1423,1424,1427],{},"In the ",[1212,1417,1354],{}," node, set ",[1212,1420,124],{},[77,1422,318],{},". Each ",[77,1425,1426],{},"+"," stands for one topic level. Here they cover manufacturer and serial number, so this one subscription picks up every vehicle.",[331,1429,1430,1431,1434,1435,289,1437,289,1439,289,1441,354,1443,1445,1446,1448],{},"Set ",[1212,1432,1433],{},"QoS"," to 0. VDA 5050 asks for QoS 0 on ",[77,1436,83],{},[77,1438,159],{},[77,1440,79],{},[77,1442,218],{},[77,1444,186],{},", and QoS 1 only on ",[77,1447,203],{},". Setting a higher QoS on your side doesn't help anyway. MQTT delivers at the lower of the two values.",[331,1450,1430,1451,1454],{},[1212,1452,1453],{},"Output"," to \"a parsed JSON object\". You then get a JavaScript object instead of raw bytes. If a vehicle sends broken JSON, the node logs an error and drops the message.",[331,1456,1457,1458,1461,1462,1465],{},"Add a ",[1212,1459,1460],{},"function"," node (the one from step 3 below) and a ",[1212,1463,1464],{},"debug"," node after it.",[331,1467,1468,1469,1471],{},"Deploy. Check that the ",[1212,1470,1354],{}," node says \"connected\", then watch messages arrive in the debug sidebar.",[260,1473,1475],{"className":496,"code":1474,"language":498,"meta":268,"style":268},"[{\"id\":\"vda-mqtt-in\",\"type\":\"mqtt in\",\"z\":\"vda-flow\",\"name\":\"Fleet state\",\"topic\":\"uagv\u002Fv2\u002F+\u002F+\u002Fstate\",\"qos\":\"0\",\"datatype\":\"json\",\"broker\":\"vda-broker\",\"nl\":false,\"rap\":true,\"rh\":0,\"inputs\":0,\"x\":210,\"y\":160,\"wires\":[[\"vda-parse\"]]},{\"id\":\"vda-parse\",\"type\":\"function\",\"z\":\"vda-flow\",\"name\":\"Identify vehicle\",\"func\":\"const parts = msg.topic.split('\u002F');\\nif (parts.length !== 5) {\\n    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);\\n    return null;\\n}\\n\\nmsg.manufacturer = parts[2];\\nmsg.serialNumber = parts[3];\\n\\nconst p = msg.payload;\\nif (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {\\n    node.warn('Topic and payload disagree on ' + msg.topic);\\n}\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":430,\"y\":160,\"wires\":[[\"vda-debug\"]]},{\"id\":\"vda-debug\",\"type\":\"debug\",\"z\":\"vda-flow\",\"name\":\"State debug\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"payload\",\"targetType\":\"msg\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":650,\"y\":160,\"wires\":[]},{\"id\":\"vda-broker\",\"type\":\"mqtt-broker\",\"name\":\"VDA 5050 broker\",\"broker\":\"your-broker.example.com\",\"port\":\"8883\",\"clientid\":\"\",\"autoConnect\":true,\"usetls\":true,\"verifyservercert\":true,\"protocolVersion\":\"4\",\"keepalive\":\"15\",\"cleansession\":true,\"autoUnsubscribe\":true,\"birthTopic\":\"\",\"birthQos\":\"0\",\"birthPayload\":\"\",\"birthMsg\":{},\"closeTopic\":\"\",\"closeQos\":\"0\",\"closePayload\":\"\",\"closeMsg\":{},\"willTopic\":\"\",\"willQos\":\"0\",\"willPayload\":\"\",\"willMsg\":{},\"sessionExpiry\":\"\"}]\n",[77,1476,1477],{"__ignoreMap":268},[502,1478,1479,1482,1484,1487,1489,1491,1493,1496,1498,1500,1502,1505,1507,1509,1511,1513,1515,1517,1519,1522,1524,1526,1528,1531,1533,1535,1537,1540,1542,1544,1546,1549,1551,1553,1555,1558,1560,1562,1564,1566,1568,1570,1572,1575,1577,1579,1581,1584,1586,1588,1590,1593,1595,1597,1599,1601,1603,1605,1607,1610,1612,1614,1616,1619,1621,1623,1625,1628,1630,1633,1635,1638,1640,1643,1645,1648,1650,1652,1654,1656,1658,1661,1663,1665,1667,1669,1671,1673,1675,1677,1680,1682,1684,1686,1688,1690,1693,1695,1697,1700,1702,1705,1707,1710,1712,1715,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1776,1778,1780,1782,1785,1787,1789,1791,1794,1798,1801,1803,1806,1808,1811,1813,1816,1819,1822,1824,1827,1829,1832,1834,1837,1839,1842,1844,1846,1848,1851,1853,1855,1857,1860,1862,1864,1867,1869,1871,1874,1876,1878,1880,1882,1884,1887,1889,1891,1894,1896,1898,1901,1903,1905,1907,1909,1911,1914,1916,1919,1921,1923,1925,1927,1930,1932,1934,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2022,2024,2026,2028,2031,2033,2035,2037,2040,2042,2044,2046,2049,2051,2053,2055,2058,2060,2062,2064,2067,2069,2071,2073,2076,2078,2080,2082,2085,2087,2089,2091,2094,2096,2098,2100,2103,2105,2107,2109,2111,2113,2116,2118,2120,2122,2125,2127,2129,2131,2133,2135,2137,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2192,2194,2196,2198,2200,2202,2204,2206,2209,2211,2213,2215,2217,2219,2221,2223,2226,2228,2230,2232,2235,2237,2239,2241,2244,2246,2248,2250,2253,2255,2257,2259,2261,2263,2266,2268,2270,2272,2275,2277,2279,2281,2284,2286,2288,2290,2293,2295,2297,2299,2302,2304,2306,2308,2311,2313,2315,2317,2320,2322,2324,2326,2329,2331,2333,2335,2338,2340,2342,2344,2347,2349,2351,2353,2355,2357,2360,2362,2364,2366,2368,2370,2372,2374,2377,2379,2381,2383,2385,2387,2390,2392,2395,2397,2400,2402,2404,2406,2408,2410,2413,2415,2417,2419,2421,2423,2425,2427,2430,2432,2434,2436,2438,2440,2443,2445,2447,2449,2452,2454,2456,2458,2460,2462,2465,2467,2469,2471,2473,2475,2477,2479,2482,2484,2486,2488,2490,2492,2495,2497,2499,2501,2504,2506,2508,2510],{"class":504,"line":505},[502,1480,1481],{"class":508},"[{",[502,1483,522],{"class":508},[502,1485,1486],{"class":518},"id",[502,1488,522],{"class":508},[502,1490,525],{"class":508},[502,1492,522],{"class":508},[502,1494,1495],{"class":549},"vda-mqtt-in",[502,1497,522],{"class":508},[502,1499,733],{"class":508},[502,1501,522],{"class":508},[502,1503,1504],{"class":518},"type",[502,1506,522],{"class":508},[502,1508,525],{"class":508},[502,1510,522],{"class":508},[502,1512,1354],{"class":549},[502,1514,522],{"class":508},[502,1516,733],{"class":508},[502,1518,522],{"class":508},[502,1520,1521],{"class":518},"z",[502,1523,522],{"class":508},[502,1525,525],{"class":508},[502,1527,522],{"class":508},[502,1529,1530],{"class":549},"vda-flow",[502,1532,522],{"class":508},[502,1534,733],{"class":508},[502,1536,522],{"class":508},[502,1538,1539],{"class":518},"name",[502,1541,522],{"class":508},[502,1543,525],{"class":508},[502,1545,522],{"class":508},[502,1547,1548],{"class":549},"Fleet state",[502,1550,522],{"class":508},[502,1552,733],{"class":508},[502,1554,522],{"class":508},[502,1556,1557],{"class":518},"topic",[502,1559,522],{"class":508},[502,1561,525],{"class":508},[502,1563,522],{"class":508},[502,1565,318],{"class":549},[502,1567,522],{"class":508},[502,1569,733],{"class":508},[502,1571,522],{"class":508},[502,1573,1574],{"class":518},"qos",[502,1576,522],{"class":508},[502,1578,525],{"class":508},[502,1580,522],{"class":508},[502,1582,1583],{"class":549},"0",[502,1585,522],{"class":508},[502,1587,733],{"class":508},[502,1589,522],{"class":508},[502,1591,1592],{"class":518},"datatype",[502,1594,522],{"class":508},[502,1596,525],{"class":508},[502,1598,522],{"class":508},[502,1600,498],{"class":549},[502,1602,522],{"class":508},[502,1604,733],{"class":508},[502,1606,522],{"class":508},[502,1608,1609],{"class":518},"broker",[502,1611,522],{"class":508},[502,1613,525],{"class":508},[502,1615,522],{"class":508},[502,1617,1618],{"class":549},"vda-broker",[502,1620,522],{"class":508},[502,1622,733],{"class":508},[502,1624,522],{"class":508},[502,1626,1627],{"class":518},"nl",[502,1629,522],{"class":508},[502,1631,1632],{"class":508},":false,",[502,1634,522],{"class":508},[502,1636,1637],{"class":518},"rap",[502,1639,522],{"class":508},[502,1641,1642],{"class":508},":true,",[502,1644,522],{"class":508},[502,1646,1647],{"class":518},"rh",[502,1649,522],{"class":508},[502,1651,525],{"class":508},[502,1653,1583],{"class":528},[502,1655,733],{"class":508},[502,1657,522],{"class":508},[502,1659,1660],{"class":518},"inputs",[502,1662,522],{"class":508},[502,1664,525],{"class":508},[502,1666,1583],{"class":528},[502,1668,733],{"class":508},[502,1670,522],{"class":508},[502,1672,858],{"class":518},[502,1674,522],{"class":508},[502,1676,525],{"class":508},[502,1678,1679],{"class":528},"210",[502,1681,733],{"class":508},[502,1683,522],{"class":508},[502,1685,875],{"class":518},[502,1687,522],{"class":508},[502,1689,525],{"class":508},[502,1691,1692],{"class":528},"160",[502,1694,733],{"class":508},[502,1696,522],{"class":508},[502,1698,1699],{"class":518},"wires",[502,1701,522],{"class":508},[502,1703,1704],{"class":508},":[[",[502,1706,522],{"class":508},[502,1708,1709],{"class":549},"vda-parse",[502,1711,522],{"class":508},[502,1713,1714],{"class":508},"]]},{",[502,1716,522],{"class":508},[502,1718,1486],{"class":518},[502,1720,522],{"class":508},[502,1722,525],{"class":508},[502,1724,522],{"class":508},[502,1726,1709],{"class":549},[502,1728,522],{"class":508},[502,1730,733],{"class":508},[502,1732,522],{"class":508},[502,1734,1504],{"class":518},[502,1736,522],{"class":508},[502,1738,525],{"class":508},[502,1740,522],{"class":508},[502,1742,1460],{"class":549},[502,1744,522],{"class":508},[502,1746,733],{"class":508},[502,1748,522],{"class":508},[502,1750,1521],{"class":518},[502,1752,522],{"class":508},[502,1754,525],{"class":508},[502,1756,522],{"class":508},[502,1758,1530],{"class":549},[502,1760,522],{"class":508},[502,1762,733],{"class":508},[502,1764,522],{"class":508},[502,1766,1539],{"class":518},[502,1768,522],{"class":508},[502,1770,525],{"class":508},[502,1772,522],{"class":508},[502,1774,1775],{"class":549},"Identify vehicle",[502,1777,522],{"class":508},[502,1779,733],{"class":508},[502,1781,522],{"class":508},[502,1783,1784],{"class":518},"func",[502,1786,522],{"class":508},[502,1788,525],{"class":508},[502,1790,522],{"class":508},[502,1792,1793],{"class":549},"const parts = msg.topic.split('\u002F');",[502,1795,1797],{"class":1796},"sTEyZ","\\n",[502,1799,1800],{"class":549},"if (parts.length !== 5) {",[502,1802,1797],{"class":1796},[502,1804,1805],{"class":549},"    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);",[502,1807,1797],{"class":1796},[502,1809,1810],{"class":549},"    return null;",[502,1812,1797],{"class":1796},[502,1814,1815],{"class":549},"}",[502,1817,1818],{"class":1796},"\\n\\n",[502,1820,1821],{"class":549},"msg.manufacturer = parts[2];",[502,1823,1797],{"class":1796},[502,1825,1826],{"class":549},"msg.serialNumber = parts[3];",[502,1828,1818],{"class":1796},[502,1830,1831],{"class":549},"const p = msg.payload;",[502,1833,1797],{"class":1796},[502,1835,1836],{"class":549},"if (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {",[502,1838,1797],{"class":1796},[502,1840,1841],{"class":549},"    node.warn('Topic and payload disagree on ' + msg.topic);",[502,1843,1797],{"class":1796},[502,1845,1815],{"class":549},[502,1847,1818],{"class":1796},[502,1849,1850],{"class":549},"return msg;",[502,1852,522],{"class":508},[502,1854,733],{"class":508},[502,1856,522],{"class":508},[502,1858,1859],{"class":518},"outputs",[502,1861,522],{"class":508},[502,1863,525],{"class":508},[502,1865,1866],{"class":528},"1",[502,1868,733],{"class":508},[502,1870,522],{"class":508},[502,1872,1873],{"class":518},"noerr",[502,1875,522],{"class":508},[502,1877,525],{"class":508},[502,1879,1583],{"class":528},[502,1881,733],{"class":508},[502,1883,522],{"class":508},[502,1885,1886],{"class":518},"initialize",[502,1888,522],{"class":508},[502,1890,525],{"class":508},[502,1892,1893],{"class":508},"\"\"",[502,1895,733],{"class":508},[502,1897,522],{"class":508},[502,1899,1900],{"class":518},"finalize",[502,1902,522],{"class":508},[502,1904,525],{"class":508},[502,1906,1893],{"class":508},[502,1908,733],{"class":508},[502,1910,522],{"class":508},[502,1912,1913],{"class":518},"libs",[502,1915,522],{"class":508},[502,1917,1918],{"class":508},":[],",[502,1920,522],{"class":508},[502,1922,858],{"class":518},[502,1924,522],{"class":508},[502,1926,525],{"class":508},[502,1928,1929],{"class":528},"430",[502,1931,733],{"class":508},[502,1933,522],{"class":508},[502,1935,875],{"class":518},[502,1937,522],{"class":508},[502,1939,525],{"class":508},[502,1941,1692],{"class":528},[502,1943,733],{"class":508},[502,1945,522],{"class":508},[502,1947,1699],{"class":518},[502,1949,522],{"class":508},[502,1951,1704],{"class":508},[502,1953,522],{"class":508},[502,1955,1956],{"class":549},"vda-debug",[502,1958,522],{"class":508},[502,1960,1714],{"class":508},[502,1962,522],{"class":508},[502,1964,1486],{"class":518},[502,1966,522],{"class":508},[502,1968,525],{"class":508},[502,1970,522],{"class":508},[502,1972,1956],{"class":549},[502,1974,522],{"class":508},[502,1976,733],{"class":508},[502,1978,522],{"class":508},[502,1980,1504],{"class":518},[502,1982,522],{"class":508},[502,1984,525],{"class":508},[502,1986,522],{"class":508},[502,1988,1464],{"class":549},[502,1990,522],{"class":508},[502,1992,733],{"class":508},[502,1994,522],{"class":508},[502,1996,1521],{"class":518},[502,1998,522],{"class":508},[502,2000,525],{"class":508},[502,2002,522],{"class":508},[502,2004,1530],{"class":549},[502,2006,522],{"class":508},[502,2008,733],{"class":508},[502,2010,522],{"class":508},[502,2012,1539],{"class":518},[502,2014,522],{"class":508},[502,2016,525],{"class":508},[502,2018,522],{"class":508},[502,2020,2021],{"class":549},"State debug",[502,2023,522],{"class":508},[502,2025,733],{"class":508},[502,2027,522],{"class":508},[502,2029,2030],{"class":518},"active",[502,2032,522],{"class":508},[502,2034,1642],{"class":508},[502,2036,522],{"class":508},[502,2038,2039],{"class":518},"tosidebar",[502,2041,522],{"class":508},[502,2043,1642],{"class":508},[502,2045,522],{"class":508},[502,2047,2048],{"class":518},"console",[502,2050,522],{"class":508},[502,2052,1632],{"class":508},[502,2054,522],{"class":508},[502,2056,2057],{"class":518},"tostatus",[502,2059,522],{"class":508},[502,2061,1632],{"class":508},[502,2063,522],{"class":508},[502,2065,2066],{"class":518},"complete",[502,2068,522],{"class":508},[502,2070,525],{"class":508},[502,2072,522],{"class":508},[502,2074,2075],{"class":549},"payload",[502,2077,522],{"class":508},[502,2079,733],{"class":508},[502,2081,522],{"class":508},[502,2083,2084],{"class":518},"targetType",[502,2086,522],{"class":508},[502,2088,525],{"class":508},[502,2090,522],{"class":508},[502,2092,2093],{"class":549},"msg",[502,2095,522],{"class":508},[502,2097,733],{"class":508},[502,2099,522],{"class":508},[502,2101,2102],{"class":518},"statusVal",[502,2104,522],{"class":508},[502,2106,525],{"class":508},[502,2108,1893],{"class":508},[502,2110,733],{"class":508},[502,2112,522],{"class":508},[502,2114,2115],{"class":518},"statusType",[502,2117,522],{"class":508},[502,2119,525],{"class":508},[502,2121,522],{"class":508},[502,2123,2124],{"class":549},"auto",[502,2126,522],{"class":508},[502,2128,733],{"class":508},[502,2130,522],{"class":508},[502,2132,858],{"class":518},[502,2134,522],{"class":508},[502,2136,525],{"class":508},[502,2138,2139],{"class":528},"650",[502,2141,733],{"class":508},[502,2143,522],{"class":508},[502,2145,875],{"class":518},[502,2147,522],{"class":508},[502,2149,525],{"class":508},[502,2151,1692],{"class":528},[502,2153,733],{"class":508},[502,2155,522],{"class":508},[502,2157,1699],{"class":518},[502,2159,522],{"class":508},[502,2161,2162],{"class":508},":[]},{",[502,2164,522],{"class":508},[502,2166,1486],{"class":518},[502,2168,522],{"class":508},[502,2170,525],{"class":508},[502,2172,522],{"class":508},[502,2174,1618],{"class":549},[502,2176,522],{"class":508},[502,2178,733],{"class":508},[502,2180,522],{"class":508},[502,2182,1504],{"class":518},[502,2184,522],{"class":508},[502,2186,525],{"class":508},[502,2188,522],{"class":508},[502,2190,2191],{"class":549},"mqtt-broker",[502,2193,522],{"class":508},[502,2195,733],{"class":508},[502,2197,522],{"class":508},[502,2199,1539],{"class":518},[502,2201,522],{"class":508},[502,2203,525],{"class":508},[502,2205,522],{"class":508},[502,2207,2208],{"class":549},"VDA 5050 broker",[502,2210,522],{"class":508},[502,2212,733],{"class":508},[502,2214,522],{"class":508},[502,2216,1609],{"class":518},[502,2218,522],{"class":508},[502,2220,525],{"class":508},[502,2222,522],{"class":508},[502,2224,2225],{"class":549},"your-broker.example.com",[502,2227,522],{"class":508},[502,2229,733],{"class":508},[502,2231,522],{"class":508},[502,2233,2234],{"class":518},"port",[502,2236,522],{"class":508},[502,2238,525],{"class":508},[502,2240,522],{"class":508},[502,2242,2243],{"class":549},"8883",[502,2245,522],{"class":508},[502,2247,733],{"class":508},[502,2249,522],{"class":508},[502,2251,2252],{"class":518},"clientid",[502,2254,522],{"class":508},[502,2256,525],{"class":508},[502,2258,1893],{"class":508},[502,2260,733],{"class":508},[502,2262,522],{"class":508},[502,2264,2265],{"class":518},"autoConnect",[502,2267,522],{"class":508},[502,2269,1642],{"class":508},[502,2271,522],{"class":508},[502,2273,2274],{"class":518},"usetls",[502,2276,522],{"class":508},[502,2278,1642],{"class":508},[502,2280,522],{"class":508},[502,2282,2283],{"class":518},"verifyservercert",[502,2285,522],{"class":508},[502,2287,1642],{"class":508},[502,2289,522],{"class":508},[502,2291,2292],{"class":518},"protocolVersion",[502,2294,522],{"class":508},[502,2296,525],{"class":508},[502,2298,522],{"class":508},[502,2300,2301],{"class":549},"4",[502,2303,522],{"class":508},[502,2305,733],{"class":508},[502,2307,522],{"class":508},[502,2309,2310],{"class":518},"keepalive",[502,2312,522],{"class":508},[502,2314,525],{"class":508},[502,2316,522],{"class":508},[502,2318,2319],{"class":549},"15",[502,2321,522],{"class":508},[502,2323,733],{"class":508},[502,2325,522],{"class":508},[502,2327,2328],{"class":518},"cleansession",[502,2330,522],{"class":508},[502,2332,1642],{"class":508},[502,2334,522],{"class":508},[502,2336,2337],{"class":518},"autoUnsubscribe",[502,2339,522],{"class":508},[502,2341,1642],{"class":508},[502,2343,522],{"class":508},[502,2345,2346],{"class":518},"birthTopic",[502,2348,522],{"class":508},[502,2350,525],{"class":508},[502,2352,1893],{"class":508},[502,2354,733],{"class":508},[502,2356,522],{"class":508},[502,2358,2359],{"class":518},"birthQos",[502,2361,522],{"class":508},[502,2363,525],{"class":508},[502,2365,522],{"class":508},[502,2367,1583],{"class":549},[502,2369,522],{"class":508},[502,2371,733],{"class":508},[502,2373,522],{"class":508},[502,2375,2376],{"class":518},"birthPayload",[502,2378,522],{"class":508},[502,2380,525],{"class":508},[502,2382,1893],{"class":508},[502,2384,733],{"class":508},[502,2386,522],{"class":508},[502,2388,2389],{"class":518},"birthMsg",[502,2391,522],{"class":508},[502,2393,2394],{"class":508},":{},",[502,2396,522],{"class":508},[502,2398,2399],{"class":518},"closeTopic",[502,2401,522],{"class":508},[502,2403,525],{"class":508},[502,2405,1893],{"class":508},[502,2407,733],{"class":508},[502,2409,522],{"class":508},[502,2411,2412],{"class":518},"closeQos",[502,2414,522],{"class":508},[502,2416,525],{"class":508},[502,2418,522],{"class":508},[502,2420,1583],{"class":549},[502,2422,522],{"class":508},[502,2424,733],{"class":508},[502,2426,522],{"class":508},[502,2428,2429],{"class":518},"closePayload",[502,2431,522],{"class":508},[502,2433,525],{"class":508},[502,2435,1893],{"class":508},[502,2437,733],{"class":508},[502,2439,522],{"class":508},[502,2441,2442],{"class":518},"closeMsg",[502,2444,522],{"class":508},[502,2446,2394],{"class":508},[502,2448,522],{"class":508},[502,2450,2451],{"class":518},"willTopic",[502,2453,522],{"class":508},[502,2455,525],{"class":508},[502,2457,1893],{"class":508},[502,2459,733],{"class":508},[502,2461,522],{"class":508},[502,2463,2464],{"class":518},"willQos",[502,2466,522],{"class":508},[502,2468,525],{"class":508},[502,2470,522],{"class":508},[502,2472,1583],{"class":549},[502,2474,522],{"class":508},[502,2476,733],{"class":508},[502,2478,522],{"class":508},[502,2480,2481],{"class":518},"willPayload",[502,2483,522],{"class":508},[502,2485,525],{"class":508},[502,2487,1893],{"class":508},[502,2489,733],{"class":508},[502,2491,522],{"class":508},[502,2493,2494],{"class":518},"willMsg",[502,2496,522],{"class":508},[502,2498,2394],{"class":508},[502,2500,522],{"class":508},[502,2502,2503],{"class":518},"sessionExpiry",[502,2505,522],{"class":508},[502,2507,525],{"class":508},[502,2509,1893],{"class":508},[502,2511,2512],{"class":508},"}]\n",[12,2514,2515],{},"Flow exports never include passwords. After importing, open the broker node and enter your own host and login.",[48,2517,2519],{"id":2518},"step-3-tell-the-vehicles-apart","Step 3: Tell the vehicles apart",[12,2521,1397,2522,2524],{},[77,2523,79],{}," message tells you what is happening. You also need to know who sent it.",[12,2526,2527,231,2529,2531],{},[77,2528,582],{},[77,2530,603],{}," appear twice: in the payload, and in the topic. Read them from the topic. Here's why.",[12,2533,2534],{},"The topic is the message's address. It is what your broker rules are written against, so it's the right value to route and store by.",[12,2536,2537],{},"Comparing the two is also a free sanity check. If a vehicle's payload disagrees with its topic, it is misconfigured. Better to see that in a log line than to find out when an order goes to the wrong truck.",[12,2539,2540,2541,2543,2544,2546],{},"Put a ",[1212,2542,1460],{}," node between the ",[1212,2545,1354],{}," node and whatever comes next:",[260,2548,2552],{"className":2549,"code":2550,"language":2551,"meta":268,"style":268},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const parts = msg.topic.split('\u002F');\nif (parts.length !== 5) {\n    node.warn('Unexpected VDA 5050 topic: ' + msg.topic);\n    return null;\n}\n\nmsg.manufacturer = parts[2];\nmsg.serialNumber = parts[3];\n\nconst p = msg.payload;\nif (p.manufacturer !== msg.manufacturer || p.serialNumber !== msg.serialNumber) {\n    node.warn('Topic and payload disagree on ' + msg.topic);\n}\n\nreturn msg;\n","javascript",[77,2553,2554,2595,2620,2653,2661,2665,2671,2693,2713,2717,2734,2774,2803,2807,2811],{"__ignoreMap":268},[502,2555,2556,2559,2562,2565,2568,2570,2572,2574,2578,2581,2584,2587,2589,2592],{"class":504,"line":505},[502,2557,2558],{"class":518},"const",[502,2560,2561],{"class":1796}," parts ",[502,2563,2564],{"class":508},"=",[502,2566,2567],{"class":1796}," msg",[502,2569,1265],{"class":508},[502,2571,1557],{"class":1796},[502,2573,1265],{"class":508},[502,2575,2577],{"class":2576},"s2Zo4","split",[502,2579,2580],{"class":1796},"(",[502,2582,2583],{"class":508},"'",[502,2585,2586],{"class":549},"\u002F",[502,2588,2583],{"class":508},[502,2590,2591],{"class":1796},")",[502,2593,2594],{"class":508},";\n",[502,2596,2597,2601,2604,2606,2609,2612,2615,2618],{"class":504,"line":512},[502,2598,2600],{"class":2599},"s7zQu","if",[502,2602,2603],{"class":1796}," (parts",[502,2605,1265],{"class":508},[502,2607,2608],{"class":1796},"length ",[502,2610,2611],{"class":508},"!==",[502,2613,2614],{"class":528}," 5",[502,2616,2617],{"class":1796},") ",[502,2619,509],{"class":508},[502,2621,2622,2625,2627,2630,2633,2635,2638,2640,2643,2645,2647,2649,2651],{"class":504,"line":535},[502,2623,2624],{"class":1796},"    node",[502,2626,1265],{"class":508},[502,2628,2629],{"class":2576},"warn",[502,2631,2580],{"class":2632},"swJcz",[502,2634,2583],{"class":508},[502,2636,2637],{"class":549},"Unexpected VDA 5050 topic: ",[502,2639,2583],{"class":508},[502,2641,2642],{"class":508}," +",[502,2644,2567],{"class":1796},[502,2646,1265],{"class":508},[502,2648,1557],{"class":1796},[502,2650,2591],{"class":2632},[502,2652,2594],{"class":508},[502,2654,2655,2658],{"class":504,"line":557},[502,2656,2657],{"class":2599},"    return",[502,2659,2660],{"class":508}," null;\n",[502,2662,2663],{"class":504,"line":577},[502,2664,1199],{"class":508},[502,2666,2667],{"class":504,"line":598},[502,2668,2670],{"emptyLinePlaceholder":2669},true,"\n",[502,2672,2673,2675,2677,2680,2682,2685,2688,2691],{"class":504,"line":619},[502,2674,2093],{"class":1796},[502,2676,1265],{"class":508},[502,2678,2679],{"class":1796},"manufacturer ",[502,2681,2564],{"class":508},[502,2683,2684],{"class":1796}," parts[",[502,2686,2687],{"class":528},"2",[502,2689,2690],{"class":1796},"]",[502,2692,2594],{"class":508},[502,2694,2695,2697,2699,2702,2704,2706,2709,2711],{"class":504,"line":640},[502,2696,2093],{"class":1796},[502,2698,1265],{"class":508},[502,2700,2701],{"class":1796},"serialNumber ",[502,2703,2564],{"class":508},[502,2705,2684],{"class":1796},[502,2707,2708],{"class":528},"3",[502,2710,2690],{"class":1796},[502,2712,2594],{"class":508},[502,2714,2715],{"class":504,"line":657},[502,2716,2670],{"emptyLinePlaceholder":2669},[502,2718,2719,2721,2724,2726,2728,2730,2732],{"class":504,"line":678},[502,2720,2558],{"class":518},[502,2722,2723],{"class":1796}," p ",[502,2725,2564],{"class":508},[502,2727,2567],{"class":1796},[502,2729,1265],{"class":508},[502,2731,2075],{"class":1796},[502,2733,2594],{"class":508},[502,2735,2736,2738,2741,2743,2745,2747,2749,2751,2753,2756,2759,2761,2763,2765,2767,2769,2772],{"class":504,"line":695},[502,2737,2600],{"class":2599},[502,2739,2740],{"class":1796}," (p",[502,2742,1265],{"class":508},[502,2744,2679],{"class":1796},[502,2746,2611],{"class":508},[502,2748,2567],{"class":1796},[502,2750,1265],{"class":508},[502,2752,2679],{"class":1796},[502,2754,2755],{"class":508},"||",[502,2757,2758],{"class":1796}," p",[502,2760,1265],{"class":508},[502,2762,2701],{"class":1796},[502,2764,2611],{"class":508},[502,2766,2567],{"class":1796},[502,2768,1265],{"class":508},[502,2770,2771],{"class":1796},"serialNumber) ",[502,2773,509],{"class":508},[502,2775,2776,2778,2780,2782,2784,2786,2789,2791,2793,2795,2797,2799,2801],{"class":504,"line":710},[502,2777,2624],{"class":1796},[502,2779,1265],{"class":508},[502,2781,2629],{"class":2576},[502,2783,2580],{"class":2632},[502,2785,2583],{"class":508},[502,2787,2788],{"class":549},"Topic and payload disagree on ",[502,2790,2583],{"class":508},[502,2792,2642],{"class":508},[502,2794,2567],{"class":1796},[502,2796,1265],{"class":508},[502,2798,1557],{"class":1796},[502,2800,2591],{"class":2632},[502,2802,2594],{"class":508},[502,2804,2805],{"class":504,"line":765},[502,2806,1199],{"class":508},[502,2808,2809],{"class":504,"line":771},[502,2810,2670],{"emptyLinePlaceholder":2669},[502,2812,2813,2816,2818],{"class":504,"line":785},[502,2814,2815],{"class":2599},"return",[502,2817,2567],{"class":1796},[502,2819,2594],{"class":508},[12,2821,2822,2823,2826,2827,231,2830,2833],{},"Now ",[77,2824,2825],{},"msg.payload"," holds the state object, and ",[77,2828,2829],{},"msg.manufacturer",[77,2831,2832],{},"msg.serialNumber"," tell you which AGV sent it.",[48,2835,2837],{"id":2836},"step-4-catch-vehicles-going-offline","Step 4: Catch vehicles going offline",[12,2839,2840],{},"Repeat the same pattern for one more topic, pointing it at the broker you already set up.",[12,2842,2843,2844,2849,2850,2853],{},"Subscribe to ",[1212,2845,2846],{},[77,2847,2848],{},"uagv\u002Fv2\u002F+\u002F+\u002Fconnection"," at QoS 1. This tells you when a vehicle drops off the broker. The payload has a ",[77,2851,2852],{},"connectionState"," field with one of three values in 2.x:",[328,2855,2856,2861,2867],{},[331,2857,2858],{},[77,2859,2860],{},"ONLINE",[331,2862,2863,2866],{},[77,2864,2865],{},"OFFLINE"," for a clean, deliberate disconnect",[331,2868,2869,2871],{},[77,2870,451],{}," for an unexpected drop",[12,2873,2874,2875,2877],{},"The vehicle registers that last value as its MQTT last will when it connects. So if it vanishes without saying goodbye, the broker publishes it for the vehicle. Vehicles publish every ",[77,2876,203],{}," message with the retained flag set, so a new subscriber picks up each vehicle's last known status straight away.",[12,2879,2880],{},"This is where the keep alive from step 1 earns its place. The broker only fires the last will once the heartbeat lapses, so a 60-second keep alive can hide a dead vehicle for well over a minute.",[12,2882,2883,2884,2886,2887,289,2889,354,2891,2893,2894,2896,2897,2899],{},"One warning. ",[77,2885,203],{}," is a network check, not a health check. Version 3.0 states that outright in its topic table, and 2.1 works the same way without saying it as plainly. It tells you the link dropped. It tells you nothing about a vehicle that is still connected but faulted, stuck, or lost. For that, watch ",[77,2888,1141],{},[77,2890,1120],{},[77,2892,1156],{}," in ",[77,2895,79],{},". Also treat any ",[77,2898,79],{}," message older than 30 seconds as stale, since that is the longest gap the standard allows.",[48,2901,2903],{"id":2902},"putting-it-on-a-screen","Putting it on a screen",[12,2905,2906,2907,289,2911,2915],{},"None of this is visible to anyone on the floor yet. You can build a screen from these same flows with ",[19,2908,2910],{"href":2909},"\u002Fdocs\u002Fuser\u002Fdashboards\u002F","FlowFuse Dashboard",[19,2912,2914],{"href":2913},"\u002Fblog\u002F2024\u002F03\u002Fdashboard-getting-started\u002F","without writing any HTML",": a table of vehicles with battery level and current order, an alert when a vehicle drops off the network, and a live map of where everything is.",[28,2917],{"alt":2918,"cta":31,"src":2919},"Wenco deploys new dashboard pages in days with FlowFuse - book a demo","\u002Fimages\u002Fcta\u002Fwenco-book-demo.png",[48,2921,2923],{"id":2922},"step-5-send-an-order","Step 5: Send an order",[12,2925,2926],{},"Three rules decide whether the vehicle accepts your order at all. Get these wrong and it refuses.",[12,2928,2929,2932,2933,2936,2937,2939,2940,231,2942,2944],{},[1212,2930,2931],{},"The first node must be where the vehicle already is."," The standard says the AGV has to be standing on the first node, or inside its deviation range. Send an order that starts anywhere else and the vehicle rejects it. A rejected order shows up as a ",[77,2934,2935],{},"validationError"," warning in the vehicle's ",[77,2938,79],{},", and the warning stays there until it accepts a valid order. Read ",[77,2941,662],{},[77,2943,341],{}," from the vehicle's current state, and build the order from there.",[12,2946,2947,2954,2955,2957,2958,2960,2961,2963,2964,2966],{},[1212,2948,2949,231,2951,2953],{},[77,2950,624],{},[77,2952,645],{}," together must be new."," Use a fresh ",[77,2956,624],{}," for each job. Start ",[77,2959,645],{}," at 0, and only raise it when you extend that same order. A 2.x vehicle checks the incoming ",[77,2962,645],{}," against the one it already holds, treating a lower one as deprecated and an equal one as already received. Version 3.0 draws the line more precisely: resending an identical message is fine, but reusing an ",[77,2965,645],{}," with different content is an error.",[12,2968,2969,1215,2972,231,2975,2978,2979,2981,2982,2985],{},[1212,2970,2971],{},"The vehicle must support the actions you send.",[77,2973,2974],{},"pick",[77,2976,2977],{},"drop"," are standard action types, but supporting them is optional. Ask for the vehicle's ",[77,2980,218],{}," first, using the ",[77,2983,2984],{},"factsheetRequest"," instant action, and check its list of supported actions.",[12,2987,2988],{},"Then wire it up:",[1347,2990,2991,3009,3020],{},[331,2992,2993,2994,2997,2998,3000,3001,3004,3005,3008],{},"Add an ",[1212,2995,2996],{},"mqtt out"," node pointing at your broker. Leave ",[1212,2999,124],{}," empty so the flow can set ",[77,3002,3003],{},"msg.topic"," per vehicle. Leave ",[1212,3006,3007],{},"Retain"," off. The broker re-delivers a retained order every time the vehicle reconnects, which is how you move a truck at 3am by accident.",[331,3010,3011,3012,3015,3016,3019],{},"Feed it a payload matching the order schema: a ",[77,3013,3014],{},"nodes"," array and an ",[77,3017,3018],{},"edges"," array.",[331,3021,3022,3023,3030],{},"Trigger it with a dashboard button for manual dispatch, or from an ",[19,3024,3026,3029],{"href":3025},"\u002Fblog\u002F2022\u002F12\u002Fcreate-http-trigger-with-authentication\u002F",[1212,3027,3028],{},"http in"," endpoint"," if orders come from your WMS.",[12,3032,3033],{},"Here is a real pick-and-drop order:",[260,3035,3037],{"className":2549,"code":3036,"language":2551,"meta":268,"style":268},"const manufacturer = 'AcmeRobotics';\nconst serialNumber = 'AGV-042';\n\nmsg.topic = `uagv\u002Fv2\u002F${manufacturer}\u002F${serialNumber}\u002Forder`;\n\n\u002F\u002F headerId counts per topic, so key the counter by topic and raise it\n\u002F\u002F by one for every message you send to that topic\nconst headerKey = `headerId:${msg.topic}`;\nconst headerId = (flow.get(headerKey) || 0) + 1;\nflow.set(headerKey, headerId);\n\nmsg.payload = {\n  headerId,\n  timestamp: new Date().toISOString(),\n  version: \"2.1.0\",\n  manufacturer,\n  serialNumber,\n  orderId: `order-${Date.now()}`,\n  orderUpdateId: 0,\n  nodes: [\n    {\n      \u002F\u002F The AGV must already be at this node, or within its deviation range\n      nodeId: \"station-1\",\n      sequenceId: 0,\n      released: true,\n      nodePosition: { x: 0, y: 0, mapId: \"floor1\" },\n      actions: [{\n        actionId: `pick-${headerId}`,\n        actionType: \"pick\",\n        blockingType: \"HARD\",\n        actionParameters: [\n          { key: \"stationType\", value: \"floor\" },\n          { key: \"loadType\", value: \"EPAL\" }\n        ]\n      }]\n    },\n    {\n      nodeId: \"station-2\",\n      sequenceId: 2,\n      released: true,\n      nodePosition: { x: 12, y: 4, mapId: \"floor1\" },\n      actions: [{\n        actionId: `drop-${headerId}`,\n        actionType: \"drop\",\n        blockingType: \"HARD\",\n        actionParameters: [\n          { key: \"stationType\", value: \"floor\" },\n          { key: \"loadType\", value: \"EPAL\" }\n        ]\n      }]\n    }\n  ],\n  edges: [{\n    edgeId: \"station-1-2\",\n    sequenceId: 1,\n    startNodeId: \"station-1\",\n    endNodeId: \"station-2\",\n    released: true,\n    actions: []\n  }]\n};\nreturn msg;\n",[77,3038,3039,3057,3074,3078,3118,3122,3128,3133,3160,3193,3213,3217,3230,3237,3262,3277,3284,3291,3319,3330,3339,3344,3349,3365,3376,3388,3428,3440,3460,3475,3491,3500,3533,3563,3569,3578,3584,3589,3605,3617,3628,3667,3678,3698,3713,3728,3737,3766,3795,3800,3807,3813,3821,3833,3850,3862,3878,3894,3906,3917,3925,3931],{"__ignoreMap":268},[502,3040,3041,3043,3046,3048,3051,3053,3055],{"class":504,"line":505},[502,3042,2558],{"class":518},[502,3044,3045],{"class":1796}," manufacturer ",[502,3047,2564],{"class":508},[502,3049,3050],{"class":508}," '",[502,3052,591],{"class":549},[502,3054,2583],{"class":508},[502,3056,2594],{"class":508},[502,3058,3059,3061,3064,3066,3068,3070,3072],{"class":504,"line":512},[502,3060,2558],{"class":518},[502,3062,3063],{"class":1796}," serialNumber ",[502,3065,2564],{"class":508},[502,3067,3050],{"class":508},[502,3069,612],{"class":549},[502,3071,2583],{"class":508},[502,3073,2594],{"class":508},[502,3075,3076],{"class":504,"line":535},[502,3077,2670],{"emptyLinePlaceholder":2669},[502,3079,3080,3082,3084,3087,3089,3092,3095,3098,3100,3102,3104,3106,3108,3110,3113,3116],{"class":504,"line":557},[502,3081,2093],{"class":1796},[502,3083,1265],{"class":508},[502,3085,3086],{"class":1796},"topic ",[502,3088,2564],{"class":508},[502,3090,3091],{"class":508}," `",[502,3093,3094],{"class":549},"uagv\u002Fv2\u002F",[502,3096,3097],{"class":508},"${",[502,3099,582],{"class":1796},[502,3101,1815],{"class":508},[502,3103,2586],{"class":549},[502,3105,3097],{"class":508},[502,3107,603],{"class":1796},[502,3109,1815],{"class":508},[502,3111,3112],{"class":549},"\u002Forder",[502,3114,3115],{"class":508},"`",[502,3117,2594],{"class":508},[502,3119,3120],{"class":504,"line":577},[502,3121,2670],{"emptyLinePlaceholder":2669},[502,3123,3124],{"class":504,"line":598},[502,3125,3127],{"class":3126},"sHwdD","\u002F\u002F headerId counts per topic, so key the counter by topic and raise it\n",[502,3129,3130],{"class":504,"line":619},[502,3131,3132],{"class":3126},"\u002F\u002F by one for every message you send to that topic\n",[502,3134,3135,3137,3140,3142,3144,3147,3149,3151,3153,3155,3158],{"class":504,"line":640},[502,3136,2558],{"class":518},[502,3138,3139],{"class":1796}," headerKey ",[502,3141,2564],{"class":508},[502,3143,3091],{"class":508},[502,3145,3146],{"class":549},"headerId:",[502,3148,3097],{"class":508},[502,3150,2093],{"class":1796},[502,3152,1265],{"class":508},[502,3154,1557],{"class":1796},[502,3156,3157],{"class":508},"}`",[502,3159,2594],{"class":508},[502,3161,3162,3164,3167,3169,3172,3174,3177,3180,3182,3184,3186,3188,3191],{"class":504,"line":657},[502,3163,2558],{"class":518},[502,3165,3166],{"class":1796}," headerId ",[502,3168,2564],{"class":508},[502,3170,3171],{"class":1796}," (flow",[502,3173,1265],{"class":508},[502,3175,3176],{"class":2576},"get",[502,3178,3179],{"class":1796},"(headerKey) ",[502,3181,2755],{"class":508},[502,3183,652],{"class":528},[502,3185,2617],{"class":1796},[502,3187,1426],{"class":508},[502,3189,3190],{"class":528}," 1",[502,3192,2594],{"class":508},[502,3194,3195,3198,3200,3203,3206,3208,3211],{"class":504,"line":678},[502,3196,3197],{"class":1796},"flow",[502,3199,1265],{"class":508},[502,3201,3202],{"class":2576},"set",[502,3204,3205],{"class":1796},"(headerKey",[502,3207,733],{"class":508},[502,3209,3210],{"class":1796}," headerId)",[502,3212,2594],{"class":508},[502,3214,3215],{"class":504,"line":695},[502,3216,2670],{"emptyLinePlaceholder":2669},[502,3218,3219,3221,3223,3226,3228],{"class":504,"line":710},[502,3220,2093],{"class":1796},[502,3222,1265],{"class":508},[502,3224,3225],{"class":1796},"payload ",[502,3227,2564],{"class":508},[502,3229,849],{"class":508},[502,3231,3232,3235],{"class":504,"line":765},[502,3233,3234],{"class":1796},"  headerId",[502,3236,532],{"class":508},[502,3238,3239,3242,3244,3247,3250,3253,3255,3258,3260],{"class":504,"line":771},[502,3240,3241],{"class":2632},"  timestamp",[502,3243,525],{"class":508},[502,3245,3246],{"class":508}," new",[502,3248,3249],{"class":2576}," Date",[502,3251,3252],{"class":1796},"()",[502,3254,1265],{"class":508},[502,3256,3257],{"class":2576},"toISOString",[502,3259,3252],{"class":1796},[502,3261,532],{"class":508},[502,3263,3264,3267,3269,3271,3273,3275],{"class":504,"line":785},[502,3265,3266],{"class":2632},"  version",[502,3268,525],{"class":508},[502,3270,546],{"class":508},[502,3272,570],{"class":549},[502,3274,522],{"class":508},[502,3276,532],{"class":508},[502,3278,3279,3282],{"class":504,"line":833},[502,3280,3281],{"class":1796},"  manufacturer",[502,3283,532],{"class":508},[502,3285,3286,3289],{"class":504,"line":838},[502,3287,3288],{"class":1796},"  serialNumber",[502,3290,532],{"class":508},[502,3292,3293,3296,3298,3300,3303,3305,3308,3310,3313,3315,3317],{"class":504,"line":852},[502,3294,3295],{"class":2632},"  orderId",[502,3297,525],{"class":508},[502,3299,3091],{"class":508},[502,3301,3302],{"class":549},"order-",[502,3304,3097],{"class":508},[502,3306,3307],{"class":1796},"Date",[502,3309,1265],{"class":508},[502,3311,3312],{"class":2576},"now",[502,3314,3252],{"class":1796},[502,3316,3157],{"class":508},[502,3318,532],{"class":508},[502,3320,3321,3324,3326,3328],{"class":504,"line":870},[502,3322,3323],{"class":2632},"  orderUpdateId",[502,3325,525],{"class":508},[502,3327,652],{"class":528},[502,3329,532],{"class":508},[502,3331,3332,3335,3337],{"class":504,"line":887},[502,3333,3334],{"class":2632},"  nodes",[502,3336,525],{"class":508},[502,3338,707],{"class":1796},[502,3340,3341],{"class":504,"line":904},[502,3342,3343],{"class":508},"    {\n",[502,3345,3346],{"class":504,"line":925},[502,3347,3348],{"class":3126},"      \u002F\u002F The AGV must already be at this node, or within its deviation range\n",[502,3350,3351,3354,3356,3358,3361,3363],{"class":504,"line":939},[502,3352,3353],{"class":2632},"      nodeId",[502,3355,525],{"class":508},[502,3357,546],{"class":508},[502,3359,3360],{"class":549},"station-1",[502,3362,522],{"class":508},[502,3364,532],{"class":508},[502,3366,3367,3370,3372,3374],{"class":504,"line":945},[502,3368,3369],{"class":2632},"      sequenceId",[502,3371,525],{"class":508},[502,3373,652],{"class":528},[502,3375,532],{"class":508},[502,3377,3378,3381,3383,3386],{"class":504,"line":1001},[502,3379,3380],{"class":2632},"      released",[502,3382,525],{"class":508},[502,3384,759],{"class":3385},"sfNiH",[502,3387,532],{"class":508},[502,3389,3390,3393,3395,3397,3400,3402,3404,3406,3409,3411,3413,3415,3418,3420,3422,3424,3426],{"class":504,"line":1041},[502,3391,3392],{"class":2632},"      nodePosition",[502,3394,525],{"class":508},[502,3396,957],{"class":508},[502,3398,3399],{"class":2632}," x",[502,3401,525],{"class":508},[502,3403,652],{"class":528},[502,3405,733],{"class":508},[502,3407,3408],{"class":2632}," y",[502,3410,525],{"class":508},[502,3412,652],{"class":528},[502,3414,733],{"class":508},[502,3416,3417],{"class":2632}," mapId",[502,3419,525],{"class":508},[502,3421,546],{"class":508},[502,3423,918],{"class":549},[502,3425,522],{"class":508},[502,3427,998],{"class":508},[502,3429,3430,3433,3435,3438],{"class":504,"line":1056},[502,3431,3432],{"class":2632},"      actions",[502,3434,525],{"class":508},[502,3436,3437],{"class":1796}," [",[502,3439,509],{"class":508},[502,3441,3442,3445,3447,3449,3452,3454,3456,3458],{"class":504,"line":1069},[502,3443,3444],{"class":2632},"        actionId",[502,3446,525],{"class":508},[502,3448,3091],{"class":508},[502,3450,3451],{"class":549},"pick-",[502,3453,3097],{"class":508},[502,3455,519],{"class":1796},[502,3457,3157],{"class":508},[502,3459,532],{"class":508},[502,3461,3462,3465,3467,3469,3471,3473],{"class":504,"line":1110},[502,3463,3464],{"class":2632},"        actionType",[502,3466,525],{"class":508},[502,3468,546],{"class":508},[502,3470,2974],{"class":549},[502,3472,522],{"class":508},[502,3474,532],{"class":508},[502,3476,3477,3480,3482,3484,3487,3489],{"class":504,"line":1115},[502,3478,3479],{"class":2632},"        blockingType",[502,3481,525],{"class":508},[502,3483,546],{"class":508},[502,3485,3486],{"class":549},"HARD",[502,3488,522],{"class":508},[502,3490,532],{"class":508},[502,3492,3493,3496,3498],{"class":504,"line":1136},[502,3494,3495],{"class":2632},"        actionParameters",[502,3497,525],{"class":508},[502,3499,707],{"class":1796},[502,3501,3502,3505,3508,3510,3512,3515,3517,3519,3522,3524,3526,3529,3531],{"class":504,"line":1151},[502,3503,3504],{"class":508},"          {",[502,3506,3507],{"class":2632}," key",[502,3509,525],{"class":508},[502,3511,546],{"class":508},[502,3513,3514],{"class":549},"stationType",[502,3516,522],{"class":508},[502,3518,733],{"class":508},[502,3520,3521],{"class":2632}," value",[502,3523,525],{"class":508},[502,3525,546],{"class":508},[502,3527,3528],{"class":549},"floor",[502,3530,522],{"class":508},[502,3532,998],{"class":508},[502,3534,3535,3537,3539,3541,3543,3546,3548,3550,3552,3554,3556,3559,3561],{"class":504,"line":1196},[502,3536,3504],{"class":508},[502,3538,3507],{"class":2632},[502,3540,525],{"class":508},[502,3542,546],{"class":508},[502,3544,3545],{"class":549},"loadType",[502,3547,522],{"class":508},[502,3549,733],{"class":508},[502,3551,3521],{"class":2632},[502,3553,525],{"class":508},[502,3555,546],{"class":508},[502,3557,3558],{"class":549},"EPAL",[502,3560,522],{"class":508},[502,3562,762],{"class":508},[502,3564,3566],{"class":504,"line":3565},34,[502,3567,3568],{"class":1796},"        ]\n",[502,3570,3572,3575],{"class":504,"line":3571},35,[502,3573,3574],{"class":508},"      }",[502,3576,3577],{"class":1796},"]\n",[502,3579,3581],{"class":504,"line":3580},36,[502,3582,3583],{"class":508},"    },\n",[502,3585,3587],{"class":504,"line":3586},37,[502,3588,3343],{"class":508},[502,3590,3592,3594,3596,3598,3601,3603],{"class":504,"line":3591},38,[502,3593,3353],{"class":2632},[502,3595,525],{"class":508},[502,3597,546],{"class":508},[502,3599,3600],{"class":549},"station-2",[502,3602,522],{"class":508},[502,3604,532],{"class":508},[502,3606,3608,3610,3612,3615],{"class":504,"line":3607},39,[502,3609,3369],{"class":2632},[502,3611,525],{"class":508},[502,3613,3614],{"class":528}," 2",[502,3616,532],{"class":508},[502,3618,3620,3622,3624,3626],{"class":504,"line":3619},40,[502,3621,3380],{"class":2632},[502,3623,525],{"class":508},[502,3625,759],{"class":3385},[502,3627,532],{"class":508},[502,3629,3631,3633,3635,3637,3639,3641,3644,3646,3648,3650,3653,3655,3657,3659,3661,3663,3665],{"class":504,"line":3630},41,[502,3632,3392],{"class":2632},[502,3634,525],{"class":508},[502,3636,957],{"class":508},[502,3638,3399],{"class":2632},[502,3640,525],{"class":508},[502,3642,3643],{"class":528}," 12",[502,3645,733],{"class":508},[502,3647,3408],{"class":2632},[502,3649,525],{"class":508},[502,3651,3652],{"class":528}," 4",[502,3654,733],{"class":508},[502,3656,3417],{"class":2632},[502,3658,525],{"class":508},[502,3660,546],{"class":508},[502,3662,918],{"class":549},[502,3664,522],{"class":508},[502,3666,998],{"class":508},[502,3668,3670,3672,3674,3676],{"class":504,"line":3669},42,[502,3671,3432],{"class":2632},[502,3673,525],{"class":508},[502,3675,3437],{"class":1796},[502,3677,509],{"class":508},[502,3679,3681,3683,3685,3687,3690,3692,3694,3696],{"class":504,"line":3680},43,[502,3682,3444],{"class":2632},[502,3684,525],{"class":508},[502,3686,3091],{"class":508},[502,3688,3689],{"class":549},"drop-",[502,3691,3097],{"class":508},[502,3693,519],{"class":1796},[502,3695,3157],{"class":508},[502,3697,532],{"class":508},[502,3699,3701,3703,3705,3707,3709,3711],{"class":504,"line":3700},44,[502,3702,3464],{"class":2632},[502,3704,525],{"class":508},[502,3706,546],{"class":508},[502,3708,2977],{"class":549},[502,3710,522],{"class":508},[502,3712,532],{"class":508},[502,3714,3716,3718,3720,3722,3724,3726],{"class":504,"line":3715},45,[502,3717,3479],{"class":2632},[502,3719,525],{"class":508},[502,3721,546],{"class":508},[502,3723,3486],{"class":549},[502,3725,522],{"class":508},[502,3727,532],{"class":508},[502,3729,3731,3733,3735],{"class":504,"line":3730},46,[502,3732,3495],{"class":2632},[502,3734,525],{"class":508},[502,3736,707],{"class":1796},[502,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":504,"line":3739},47,[502,3741,3504],{"class":508},[502,3743,3507],{"class":2632},[502,3745,525],{"class":508},[502,3747,546],{"class":508},[502,3749,3514],{"class":549},[502,3751,522],{"class":508},[502,3753,733],{"class":508},[502,3755,3521],{"class":2632},[502,3757,525],{"class":508},[502,3759,546],{"class":508},[502,3761,3528],{"class":549},[502,3763,522],{"class":508},[502,3765,998],{"class":508},[502,3767,3769,3771,3773,3775,3777,3779,3781,3783,3785,3787,3789,3791,3793],{"class":504,"line":3768},48,[502,3770,3504],{"class":508},[502,3772,3507],{"class":2632},[502,3774,525],{"class":508},[502,3776,546],{"class":508},[502,3778,3545],{"class":549},[502,3780,522],{"class":508},[502,3782,733],{"class":508},[502,3784,3521],{"class":2632},[502,3786,525],{"class":508},[502,3788,546],{"class":508},[502,3790,3558],{"class":549},[502,3792,522],{"class":508},[502,3794,762],{"class":508},[502,3796,3798],{"class":504,"line":3797},49,[502,3799,3568],{"class":1796},[502,3801,3803,3805],{"class":504,"line":3802},50,[502,3804,3574],{"class":508},[502,3806,3577],{"class":1796},[502,3808,3810],{"class":504,"line":3809},51,[502,3811,3812],{"class":508},"    }\n",[502,3814,3816,3819],{"class":504,"line":3815},52,[502,3817,3818],{"class":1796},"  ]",[502,3820,532],{"class":508},[502,3822,3824,3827,3829,3831],{"class":504,"line":3823},53,[502,3825,3826],{"class":2632},"  edges",[502,3828,525],{"class":508},[502,3830,3437],{"class":1796},[502,3832,509],{"class":508},[502,3834,3836,3839,3841,3843,3846,3848],{"class":504,"line":3835},54,[502,3837,3838],{"class":2632},"    edgeId",[502,3840,525],{"class":508},[502,3842,546],{"class":508},[502,3844,3845],{"class":549},"station-1-2",[502,3847,522],{"class":508},[502,3849,532],{"class":508},[502,3851,3853,3856,3858,3860],{"class":504,"line":3852},55,[502,3854,3855],{"class":2632},"    sequenceId",[502,3857,525],{"class":508},[502,3859,3190],{"class":528},[502,3861,532],{"class":508},[502,3863,3865,3868,3870,3872,3874,3876],{"class":504,"line":3864},56,[502,3866,3867],{"class":2632},"    startNodeId",[502,3869,525],{"class":508},[502,3871,546],{"class":508},[502,3873,3360],{"class":549},[502,3875,522],{"class":508},[502,3877,532],{"class":508},[502,3879,3881,3884,3886,3888,3890,3892],{"class":504,"line":3880},57,[502,3882,3883],{"class":2632},"    endNodeId",[502,3885,525],{"class":508},[502,3887,546],{"class":508},[502,3889,3600],{"class":549},[502,3891,522],{"class":508},[502,3893,532],{"class":508},[502,3895,3897,3900,3902,3904],{"class":504,"line":3896},58,[502,3898,3899],{"class":2632},"    released",[502,3901,525],{"class":508},[502,3903,759],{"class":3385},[502,3905,532],{"class":508},[502,3907,3909,3912,3914],{"class":504,"line":3908},59,[502,3910,3911],{"class":2632},"    actions",[502,3913,525],{"class":508},[502,3915,3916],{"class":1796}," []\n",[502,3918,3920,3923],{"class":504,"line":3919},60,[502,3921,3922],{"class":508},"  }",[502,3924,3577],{"class":1796},[502,3926,3928],{"class":504,"line":3927},61,[502,3929,3930],{"class":508},"};\n",[502,3932,3934,3936,3938],{"class":504,"line":3933},62,[502,3935,2815],{"class":2599},[502,3937,2567],{"class":1796},[502,3939,2594],{"class":508},[12,3941,1430,3942,3944,3945,3947,3948,3950],{},[77,3943,311],{}," to the version your vehicle actually runs. Its ",[77,3946,218],{}," and its own ",[77,3949,79],{}," messages both tell you.",[12,3952,3953,3954,3956],{},"Note the counter keyed by topic. ",[77,3955,519],{}," is defined per topic and rises by one per message, so a single shared counter across two vehicles leaves gaps in both their sequences.",[12,3958,3959,3960,3962,3963,3965,3966,231,3968,3970,3971,3974,3975,3977,3978,1265],{},"Four more details matter. ",[77,3961,738],{}," counts across nodes and edges together, which is why the edge is ",[77,3964,1866],{},", sitting between nodes ",[77,3967,1583],{},[77,3969,2687],{},". ",[77,3972,3973],{},"released: true"," marks the base, the part of the plan the vehicle should run now, as opposed to the horizon, which is work it knows about but hasn't been told to start. And ",[77,3976,1076],{}," has to be unique, because that is how the vehicle reports progress back to you in ",[77,3979,386],{},[12,3981,3982,3985,3986,3988,3989,3992,3993,3995,3996,3998,3999,4001,4002,4004],{},[77,3983,3984],{},"blockingType"," is the one worth reading twice. It decides whether the vehicle can drive, and whether other actions can run at the same time. ",[77,3987,3486],{}," means the action runs alone, with no driving and no other actions. ",[77,3990,3991],{},"SOFT"," allows other actions but still stops the vehicle. ",[77,3994,1176],{}," allows both. For a pick or drop you want ",[77,3997,3486],{},", and note that ",[77,4000,3991],{}," does not let the AGV keep driving, which is the one people get backwards. Version 3.0 adds a fourth, ",[77,4003,446],{},", which allows driving but no other actions.",[260,4006,4008],{"className":496,"code":4007,"language":498,"meta":268,"style":268},"[{\"id\":\"vda-order-trigger\",\"type\":\"inject\",\"z\":\"vda-flow\",\"name\":\"Dispatch order\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":210,\"y\":320,\"wires\":[[\"vda-order-build\"]]},{\"id\":\"vda-order-build\",\"type\":\"function\",\"z\":\"vda-flow\",\"name\":\"Build order payload\",\"func\":\"const manufacturer = 'AcmeRobotics';\\nconst serialNumber = 'AGV-042';\\n\\nmsg.topic = `uagv\u002Fv2\u002F${manufacturer}\u002F${serialNumber}\u002Forder`;\\n\\n\u002F\u002F headerId counts per topic, so key the counter by topic\\nconst headerKey = `headerId:${msg.topic}`;\\nconst headerId = (flow.get(headerKey) || 0) + 1;\\nflow.set(headerKey, headerId);\\n\\nmsg.payload = {\\n  headerId,\\n  timestamp: new Date().toISOString(),\\n  version: \\\"2.1.0\\\",\\n  manufacturer,\\n  serialNumber,\\n  orderId: `order-${Date.now()}`,\\n  orderUpdateId: 0,\\n  nodes: [\\n    { nodeId: \\\"station-1\\\", sequenceId: 0, released: true, nodePosition: { x: 0, y: 0, mapId: \\\"floor1\\\" }, actions: [{ actionId: `pick-${headerId}`, actionType: \\\"pick\\\", blockingType: \\\"HARD\\\", actionParameters: [{ key: \\\"stationType\\\", value: \\\"floor\\\" }, { key: \\\"loadType\\\", value: \\\"EPAL\\\" }] }] },\\n    { nodeId: \\\"station-2\\\", sequenceId: 2, released: true, nodePosition: { x: 12, y: 4, mapId: \\\"floor1\\\" }, actions: [{ actionId: `drop-${headerId}`, actionType: \\\"drop\\\", blockingType: \\\"HARD\\\", actionParameters: [{ key: \\\"stationType\\\", value: \\\"floor\\\" }, { key: \\\"loadType\\\", value: \\\"EPAL\\\" }] }] }\\n  ],\\n  edges: [\\n    { edgeId: \\\"station-1-2\\\", sequenceId: 1, startNodeId: \\\"station-1\\\", endNodeId: \\\"station-2\\\", released: true, actions: [] }\\n  ]\\n};\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":440,\"y\":320,\"wires\":[[\"vda-order-out\"]]},{\"id\":\"vda-order-out\",\"type\":\"mqtt out\",\"z\":\"vda-flow\",\"name\":\"Send order\",\"topic\":\"\",\"qos\":\"0\",\"retain\":\"false\",\"respTopic\":\"\",\"contentType\":\"\",\"userProps\":\"\",\"correl\":\"\",\"expiry\":\"\",\"broker\":\"vda-broker\",\"x\":680,\"y\":320,\"wires\":[]},{\"id\":\"vda-broker\",\"type\":\"mqtt-broker\",\"name\":\"VDA 5050 broker\",\"broker\":\"your-broker.example.com\",\"port\":\"8883\",\"clientid\":\"\",\"autoConnect\":true,\"usetls\":true,\"verifyservercert\":true,\"protocolVersion\":\"4\",\"keepalive\":\"15\",\"cleansession\":true,\"autoUnsubscribe\":true,\"birthTopic\":\"\",\"birthQos\":\"0\",\"birthPayload\":\"\",\"birthMsg\":{},\"closeTopic\":\"\",\"closeQos\":\"0\",\"closePayload\":\"\",\"closeMsg\":{},\"willTopic\":\"\",\"willQos\":\"0\",\"willPayload\":\"\",\"willMsg\":{},\"sessionExpiry\":\"\"}]\n",[77,4009,4010],{"__ignoreMap":268},[502,4011,4012,4014,4016,4018,4020,4022,4024,4027,4029,4031,4033,4035,4037,4039,4041,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064,4066,4068,4070,4072,4074,4077,4079,4081,4083,4086,4088,4091,4093,4095,4097,4099,4101,4103,4105,4108,4110,4113,4115,4117,4119,4121,4123,4126,4128,4130,4132,4134,4136,4139,4141,4143,4145,4148,4150,4152,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179,4181,4183,4186,4188,4190,4192,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4222,4224,4226,4228,4230,4232,4234,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261,4263,4265,4267,4269,4271,4273,4275,4277,4279,4281,4283,4285,4287,4289,4291,4293,4295,4297,4299,4302,4304,4306,4308,4310,4312,4314,4316,4319,4321,4324,4326,4329,4331,4334,4336,4339,4341,4344,4346,4349,4351,4354,4356,4359,4361,4364,4366,4369,4372,4374,4376,4378,4380,4383,4385,4388,4390,4393,4395,4398,4400,4403,4405,4408,4410,4412,4414,4417,4419,4421,4423,4426,4428,4430,4432,4435,4437,4439,4441,4444,4446,4448,4450,4453,4455,4457,4459,4462,4464,4466,4468,4470,4472,4474,4476,4479,4481,4483,4485,4487,4489,4492,4494,4496,4498,4501,4503,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4543,4545,4547,4550,4552,4555,4557,4560,4562,4565,4567,4569,4571,4574,4576,4578,4580,4583,4585,4587,4589,4592,4594,4596,4598,4601,4603,4605,4607,4609,4611,4613,4615,4617,4619,4621,4623,4625,4627,4629,4631,4633,4635,4637,4639,4641,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661,4663,4665,4667,4669,4671,4673,4676,4678,4680,4682,4684,4686,4688,4690,4692,4694,4696,4698,4700,4703,4705,4707,4709,4711,4713,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741,4743,4745,4747,4749,4751,4753,4755,4757,4759,4761,4763,4765,4768,4770,4772,4774,4776,4778,4780,4782,4784,4786,4788,4790,4792,4794,4796,4798,4800,4802,4805,4807,4809,4811,4813,4815,4817,4819,4822,4824,4826,4828,4830,4832,4835,4837,4839,4841,4843,4845,4848,4850,4852,4854,4856,4858,4861,4863,4865,4867,4869,4871,4874,4876,4878,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902,4904,4906,4909,4911,4913,4915,4917,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961,4963,4965,4967,4969,4971,4973,4975,4977,4979,4981,4983,4985,4987,4989,4991,4993,4995,4997,4999,5001,5003,5005,5007,5009,5011,5013,5015,5017,5019,5021,5023,5025,5027,5029,5031,5033,5035,5037,5039,5041,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081,5083,5085,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105,5107,5109,5111,5113,5115,5117,5119,5121,5123,5125,5127,5129,5131,5133,5135,5137,5139,5141,5143,5145,5147,5149,5151,5153,5155,5157,5159,5161,5163,5165,5167,5169,5171,5173,5175,5177,5179,5181,5183,5185,5187,5189,5191,5193,5195,5197,5199,5201,5203,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5229,5231,5233,5235,5237,5239,5241,5243,5245,5247,5249],{"class":504,"line":505},[502,4013,1481],{"class":508},[502,4015,522],{"class":508},[502,4017,1486],{"class":518},[502,4019,522],{"class":508},[502,4021,525],{"class":508},[502,4023,522],{"class":508},[502,4025,4026],{"class":549},"vda-order-trigger",[502,4028,522],{"class":508},[502,4030,733],{"class":508},[502,4032,522],{"class":508},[502,4034,1504],{"class":518},[502,4036,522],{"class":508},[502,4038,525],{"class":508},[502,4040,522],{"class":508},[502,4042,4043],{"class":549},"inject",[502,4045,522],{"class":508},[502,4047,733],{"class":508},[502,4049,522],{"class":508},[502,4051,1521],{"class":518},[502,4053,522],{"class":508},[502,4055,525],{"class":508},[502,4057,522],{"class":508},[502,4059,1530],{"class":549},[502,4061,522],{"class":508},[502,4063,733],{"class":508},[502,4065,522],{"class":508},[502,4067,1539],{"class":518},[502,4069,522],{"class":508},[502,4071,525],{"class":508},[502,4073,522],{"class":508},[502,4075,4076],{"class":549},"Dispatch order",[502,4078,522],{"class":508},[502,4080,733],{"class":508},[502,4082,522],{"class":508},[502,4084,4085],{"class":518},"props",[502,4087,522],{"class":508},[502,4089,4090],{"class":508},":[{",[502,4092,522],{"class":508},[502,4094,12],{"class":718},[502,4096,522],{"class":508},[502,4098,525],{"class":508},[502,4100,522],{"class":508},[502,4102,2075],{"class":549},[502,4104,522],{"class":508},[502,4106,4107],{"class":508},"}],",[502,4109,522],{"class":508},[502,4111,4112],{"class":518},"repeat",[502,4114,522],{"class":508},[502,4116,525],{"class":508},[502,4118,1893],{"class":508},[502,4120,733],{"class":508},[502,4122,522],{"class":508},[502,4124,4125],{"class":518},"crontab",[502,4127,522],{"class":508},[502,4129,525],{"class":508},[502,4131,1893],{"class":508},[502,4133,733],{"class":508},[502,4135,522],{"class":508},[502,4137,4138],{"class":518},"once",[502,4140,522],{"class":508},[502,4142,1632],{"class":508},[502,4144,522],{"class":508},[502,4146,4147],{"class":518},"onceDelay",[502,4149,522],{"class":508},[502,4151,525],{"class":508},[502,4153,4154],{"class":528},"0.1",[502,4156,733],{"class":508},[502,4158,522],{"class":508},[502,4160,1557],{"class":518},[502,4162,522],{"class":508},[502,4164,525],{"class":508},[502,4166,1893],{"class":508},[502,4168,733],{"class":508},[502,4170,522],{"class":508},[502,4172,2075],{"class":518},[502,4174,522],{"class":508},[502,4176,525],{"class":508},[502,4178,1893],{"class":508},[502,4180,733],{"class":508},[502,4182,522],{"class":508},[502,4184,4185],{"class":518},"payloadType",[502,4187,522],{"class":508},[502,4189,525],{"class":508},[502,4191,522],{"class":508},[502,4193,4194],{"class":549},"date",[502,4196,522],{"class":508},[502,4198,733],{"class":508},[502,4200,522],{"class":508},[502,4202,858],{"class":518},[502,4204,522],{"class":508},[502,4206,525],{"class":508},[502,4208,1679],{"class":528},[502,4210,733],{"class":508},[502,4212,522],{"class":508},[502,4214,875],{"class":518},[502,4216,522],{"class":508},[502,4218,525],{"class":508},[502,4220,4221],{"class":528},"320",[502,4223,733],{"class":508},[502,4225,522],{"class":508},[502,4227,1699],{"class":518},[502,4229,522],{"class":508},[502,4231,1704],{"class":508},[502,4233,522],{"class":508},[502,4235,4236],{"class":549},"vda-order-build",[502,4238,522],{"class":508},[502,4240,1714],{"class":508},[502,4242,522],{"class":508},[502,4244,1486],{"class":518},[502,4246,522],{"class":508},[502,4248,525],{"class":508},[502,4250,522],{"class":508},[502,4252,4236],{"class":549},[502,4254,522],{"class":508},[502,4256,733],{"class":508},[502,4258,522],{"class":508},[502,4260,1504],{"class":518},[502,4262,522],{"class":508},[502,4264,525],{"class":508},[502,4266,522],{"class":508},[502,4268,1460],{"class":549},[502,4270,522],{"class":508},[502,4272,733],{"class":508},[502,4274,522],{"class":508},[502,4276,1521],{"class":518},[502,4278,522],{"class":508},[502,4280,525],{"class":508},[502,4282,522],{"class":508},[502,4284,1530],{"class":549},[502,4286,522],{"class":508},[502,4288,733],{"class":508},[502,4290,522],{"class":508},[502,4292,1539],{"class":518},[502,4294,522],{"class":508},[502,4296,525],{"class":508},[502,4298,522],{"class":508},[502,4300,4301],{"class":549},"Build order payload",[502,4303,522],{"class":508},[502,4305,733],{"class":508},[502,4307,522],{"class":508},[502,4309,1784],{"class":518},[502,4311,522],{"class":508},[502,4313,525],{"class":508},[502,4315,522],{"class":508},[502,4317,4318],{"class":549},"const manufacturer = 'AcmeRobotics';",[502,4320,1797],{"class":1796},[502,4322,4323],{"class":549},"const serialNumber = 'AGV-042';",[502,4325,1818],{"class":1796},[502,4327,4328],{"class":549},"msg.topic = `uagv\u002Fv2\u002F${manufacturer}\u002F${serialNumber}\u002Forder`;",[502,4330,1818],{"class":1796},[502,4332,4333],{"class":549},"\u002F\u002F headerId counts per topic, so key the counter by topic",[502,4335,1797],{"class":1796},[502,4337,4338],{"class":549},"const headerKey = `headerId:${msg.topic}`;",[502,4340,1797],{"class":1796},[502,4342,4343],{"class":549},"const headerId = (flow.get(headerKey) || 0) + 1;",[502,4345,1797],{"class":1796},[502,4347,4348],{"class":549},"flow.set(headerKey, headerId);",[502,4350,1818],{"class":1796},[502,4352,4353],{"class":549},"msg.payload = {",[502,4355,1797],{"class":1796},[502,4357,4358],{"class":549},"  headerId,",[502,4360,1797],{"class":1796},[502,4362,4363],{"class":549},"  timestamp: new Date().toISOString(),",[502,4365,1797],{"class":1796},[502,4367,4368],{"class":549},"  version: ",[502,4370,4371],{"class":1796},"\\\"",[502,4373,570],{"class":549},[502,4375,4371],{"class":1796},[502,4377,733],{"class":549},[502,4379,1797],{"class":1796},[502,4381,4382],{"class":549},"  manufacturer,",[502,4384,1797],{"class":1796},[502,4386,4387],{"class":549},"  serialNumber,",[502,4389,1797],{"class":1796},[502,4391,4392],{"class":549},"  orderId: `order-${Date.now()}`,",[502,4394,1797],{"class":1796},[502,4396,4397],{"class":549},"  orderUpdateId: 0,",[502,4399,1797],{"class":1796},[502,4401,4402],{"class":549},"  nodes: [",[502,4404,1797],{"class":1796},[502,4406,4407],{"class":549},"    { nodeId: ",[502,4409,4371],{"class":1796},[502,4411,3360],{"class":549},[502,4413,4371],{"class":1796},[502,4415,4416],{"class":549},", sequenceId: 0, released: true, nodePosition: { x: 0, y: 0, mapId: ",[502,4418,4371],{"class":1796},[502,4420,918],{"class":549},[502,4422,4371],{"class":1796},[502,4424,4425],{"class":549}," }, actions: [{ actionId: `pick-${headerId}`, actionType: ",[502,4427,4371],{"class":1796},[502,4429,2974],{"class":549},[502,4431,4371],{"class":1796},[502,4433,4434],{"class":549},", blockingType: ",[502,4436,4371],{"class":1796},[502,4438,3486],{"class":549},[502,4440,4371],{"class":1796},[502,4442,4443],{"class":549},", actionParameters: [{ key: ",[502,4445,4371],{"class":1796},[502,4447,3514],{"class":549},[502,4449,4371],{"class":1796},[502,4451,4452],{"class":549},", value: ",[502,4454,4371],{"class":1796},[502,4456,3528],{"class":549},[502,4458,4371],{"class":1796},[502,4460,4461],{"class":549}," }, { key: ",[502,4463,4371],{"class":1796},[502,4465,3545],{"class":549},[502,4467,4371],{"class":1796},[502,4469,4452],{"class":549},[502,4471,4371],{"class":1796},[502,4473,3558],{"class":549},[502,4475,4371],{"class":1796},[502,4477,4478],{"class":549}," }] }] },",[502,4480,1797],{"class":1796},[502,4482,4407],{"class":549},[502,4484,4371],{"class":1796},[502,4486,3600],{"class":549},[502,4488,4371],{"class":1796},[502,4490,4491],{"class":549},", sequenceId: 2, released: true, nodePosition: { x: 12, y: 4, mapId: ",[502,4493,4371],{"class":1796},[502,4495,918],{"class":549},[502,4497,4371],{"class":1796},[502,4499,4500],{"class":549}," }, actions: [{ actionId: `drop-${headerId}`, actionType: ",[502,4502,4371],{"class":1796},[502,4504,2977],{"class":549},[502,4506,4371],{"class":1796},[502,4508,4434],{"class":549},[502,4510,4371],{"class":1796},[502,4512,3486],{"class":549},[502,4514,4371],{"class":1796},[502,4516,4443],{"class":549},[502,4518,4371],{"class":1796},[502,4520,3514],{"class":549},[502,4522,4371],{"class":1796},[502,4524,4452],{"class":549},[502,4526,4371],{"class":1796},[502,4528,3528],{"class":549},[502,4530,4371],{"class":1796},[502,4532,4461],{"class":549},[502,4534,4371],{"class":1796},[502,4536,3545],{"class":549},[502,4538,4371],{"class":1796},[502,4540,4452],{"class":549},[502,4542,4371],{"class":1796},[502,4544,3558],{"class":549},[502,4546,4371],{"class":1796},[502,4548,4549],{"class":549}," }] }] }",[502,4551,1797],{"class":1796},[502,4553,4554],{"class":549},"  ],",[502,4556,1797],{"class":1796},[502,4558,4559],{"class":549},"  edges: [",[502,4561,1797],{"class":1796},[502,4563,4564],{"class":549},"    { edgeId: ",[502,4566,4371],{"class":1796},[502,4568,3845],{"class":549},[502,4570,4371],{"class":1796},[502,4572,4573],{"class":549},", sequenceId: 1, startNodeId: ",[502,4575,4371],{"class":1796},[502,4577,3360],{"class":549},[502,4579,4371],{"class":1796},[502,4581,4582],{"class":549},", endNodeId: ",[502,4584,4371],{"class":1796},[502,4586,3600],{"class":549},[502,4588,4371],{"class":1796},[502,4590,4591],{"class":549},", released: true, actions: [] }",[502,4593,1797],{"class":1796},[502,4595,3818],{"class":549},[502,4597,1797],{"class":1796},[502,4599,4600],{"class":549},"};",[502,4602,1797],{"class":1796},[502,4604,1850],{"class":549},[502,4606,522],{"class":508},[502,4608,733],{"class":508},[502,4610,522],{"class":508},[502,4612,1859],{"class":518},[502,4614,522],{"class":508},[502,4616,525],{"class":508},[502,4618,1866],{"class":528},[502,4620,733],{"class":508},[502,4622,522],{"class":508},[502,4624,1873],{"class":518},[502,4626,522],{"class":508},[502,4628,525],{"class":508},[502,4630,1583],{"class":528},[502,4632,733],{"class":508},[502,4634,522],{"class":508},[502,4636,1886],{"class":518},[502,4638,522],{"class":508},[502,4640,525],{"class":508},[502,4642,1893],{"class":508},[502,4644,733],{"class":508},[502,4646,522],{"class":508},[502,4648,1900],{"class":518},[502,4650,522],{"class":508},[502,4652,525],{"class":508},[502,4654,1893],{"class":508},[502,4656,733],{"class":508},[502,4658,522],{"class":508},[502,4660,1913],{"class":518},[502,4662,522],{"class":508},[502,4664,1918],{"class":508},[502,4666,522],{"class":508},[502,4668,858],{"class":518},[502,4670,522],{"class":508},[502,4672,525],{"class":508},[502,4674,4675],{"class":528},"440",[502,4677,733],{"class":508},[502,4679,522],{"class":508},[502,4681,875],{"class":518},[502,4683,522],{"class":508},[502,4685,525],{"class":508},[502,4687,4221],{"class":528},[502,4689,733],{"class":508},[502,4691,522],{"class":508},[502,4693,1699],{"class":518},[502,4695,522],{"class":508},[502,4697,1704],{"class":508},[502,4699,522],{"class":508},[502,4701,4702],{"class":549},"vda-order-out",[502,4704,522],{"class":508},[502,4706,1714],{"class":508},[502,4708,522],{"class":508},[502,4710,1486],{"class":518},[502,4712,522],{"class":508},[502,4714,525],{"class":508},[502,4716,522],{"class":508},[502,4718,4702],{"class":549},[502,4720,522],{"class":508},[502,4722,733],{"class":508},[502,4724,522],{"class":508},[502,4726,1504],{"class":518},[502,4728,522],{"class":508},[502,4730,525],{"class":508},[502,4732,522],{"class":508},[502,4734,2996],{"class":549},[502,4736,522],{"class":508},[502,4738,733],{"class":508},[502,4740,522],{"class":508},[502,4742,1521],{"class":518},[502,4744,522],{"class":508},[502,4746,525],{"class":508},[502,4748,522],{"class":508},[502,4750,1530],{"class":549},[502,4752,522],{"class":508},[502,4754,733],{"class":508},[502,4756,522],{"class":508},[502,4758,1539],{"class":518},[502,4760,522],{"class":508},[502,4762,525],{"class":508},[502,4764,522],{"class":508},[502,4766,4767],{"class":549},"Send order",[502,4769,522],{"class":508},[502,4771,733],{"class":508},[502,4773,522],{"class":508},[502,4775,1557],{"class":518},[502,4777,522],{"class":508},[502,4779,525],{"class":508},[502,4781,1893],{"class":508},[502,4783,733],{"class":508},[502,4785,522],{"class":508},[502,4787,1574],{"class":518},[502,4789,522],{"class":508},[502,4791,525],{"class":508},[502,4793,522],{"class":508},[502,4795,1583],{"class":549},[502,4797,522],{"class":508},[502,4799,733],{"class":508},[502,4801,522],{"class":508},[502,4803,4804],{"class":518},"retain",[502,4806,522],{"class":508},[502,4808,525],{"class":508},[502,4810,522],{"class":508},[502,4812,1264],{"class":549},[502,4814,522],{"class":508},[502,4816,733],{"class":508},[502,4818,522],{"class":508},[502,4820,4821],{"class":518},"respTopic",[502,4823,522],{"class":508},[502,4825,525],{"class":508},[502,4827,1893],{"class":508},[502,4829,733],{"class":508},[502,4831,522],{"class":508},[502,4833,4834],{"class":518},"contentType",[502,4836,522],{"class":508},[502,4838,525],{"class":508},[502,4840,1893],{"class":508},[502,4842,733],{"class":508},[502,4844,522],{"class":508},[502,4846,4847],{"class":518},"userProps",[502,4849,522],{"class":508},[502,4851,525],{"class":508},[502,4853,1893],{"class":508},[502,4855,733],{"class":508},[502,4857,522],{"class":508},[502,4859,4860],{"class":518},"correl",[502,4862,522],{"class":508},[502,4864,525],{"class":508},[502,4866,1893],{"class":508},[502,4868,733],{"class":508},[502,4870,522],{"class":508},[502,4872,4873],{"class":518},"expiry",[502,4875,522],{"class":508},[502,4877,525],{"class":508},[502,4879,1893],{"class":508},[502,4881,733],{"class":508},[502,4883,522],{"class":508},[502,4885,1609],{"class":518},[502,4887,522],{"class":508},[502,4889,525],{"class":508},[502,4891,522],{"class":508},[502,4893,1618],{"class":549},[502,4895,522],{"class":508},[502,4897,733],{"class":508},[502,4899,522],{"class":508},[502,4901,858],{"class":518},[502,4903,522],{"class":508},[502,4905,525],{"class":508},[502,4907,4908],{"class":528},"680",[502,4910,733],{"class":508},[502,4912,522],{"class":508},[502,4914,875],{"class":518},[502,4916,522],{"class":508},[502,4918,525],{"class":508},[502,4920,4221],{"class":528},[502,4922,733],{"class":508},[502,4924,522],{"class":508},[502,4926,1699],{"class":518},[502,4928,522],{"class":508},[502,4930,2162],{"class":508},[502,4932,522],{"class":508},[502,4934,1486],{"class":518},[502,4936,522],{"class":508},[502,4938,525],{"class":508},[502,4940,522],{"class":508},[502,4942,1618],{"class":549},[502,4944,522],{"class":508},[502,4946,733],{"class":508},[502,4948,522],{"class":508},[502,4950,1504],{"class":518},[502,4952,522],{"class":508},[502,4954,525],{"class":508},[502,4956,522],{"class":508},[502,4958,2191],{"class":549},[502,4960,522],{"class":508},[502,4962,733],{"class":508},[502,4964,522],{"class":508},[502,4966,1539],{"class":518},[502,4968,522],{"class":508},[502,4970,525],{"class":508},[502,4972,522],{"class":508},[502,4974,2208],{"class":549},[502,4976,522],{"class":508},[502,4978,733],{"class":508},[502,4980,522],{"class":508},[502,4982,1609],{"class":518},[502,4984,522],{"class":508},[502,4986,525],{"class":508},[502,4988,522],{"class":508},[502,4990,2225],{"class":549},[502,4992,522],{"class":508},[502,4994,733],{"class":508},[502,4996,522],{"class":508},[502,4998,2234],{"class":518},[502,5000,522],{"class":508},[502,5002,525],{"class":508},[502,5004,522],{"class":508},[502,5006,2243],{"class":549},[502,5008,522],{"class":508},[502,5010,733],{"class":508},[502,5012,522],{"class":508},[502,5014,2252],{"class":518},[502,5016,522],{"class":508},[502,5018,525],{"class":508},[502,5020,1893],{"class":508},[502,5022,733],{"class":508},[502,5024,522],{"class":508},[502,5026,2265],{"class":518},[502,5028,522],{"class":508},[502,5030,1642],{"class":508},[502,5032,522],{"class":508},[502,5034,2274],{"class":518},[502,5036,522],{"class":508},[502,5038,1642],{"class":508},[502,5040,522],{"class":508},[502,5042,2283],{"class":518},[502,5044,522],{"class":508},[502,5046,1642],{"class":508},[502,5048,522],{"class":508},[502,5050,2292],{"class":518},[502,5052,522],{"class":508},[502,5054,525],{"class":508},[502,5056,522],{"class":508},[502,5058,2301],{"class":549},[502,5060,522],{"class":508},[502,5062,733],{"class":508},[502,5064,522],{"class":508},[502,5066,2310],{"class":518},[502,5068,522],{"class":508},[502,5070,525],{"class":508},[502,5072,522],{"class":508},[502,5074,2319],{"class":549},[502,5076,522],{"class":508},[502,5078,733],{"class":508},[502,5080,522],{"class":508},[502,5082,2328],{"class":518},[502,5084,522],{"class":508},[502,5086,1642],{"class":508},[502,5088,522],{"class":508},[502,5090,2337],{"class":518},[502,5092,522],{"class":508},[502,5094,1642],{"class":508},[502,5096,522],{"class":508},[502,5098,2346],{"class":518},[502,5100,522],{"class":508},[502,5102,525],{"class":508},[502,5104,1893],{"class":508},[502,5106,733],{"class":508},[502,5108,522],{"class":508},[502,5110,2359],{"class":518},[502,5112,522],{"class":508},[502,5114,525],{"class":508},[502,5116,522],{"class":508},[502,5118,1583],{"class":549},[502,5120,522],{"class":508},[502,5122,733],{"class":508},[502,5124,522],{"class":508},[502,5126,2376],{"class":518},[502,5128,522],{"class":508},[502,5130,525],{"class":508},[502,5132,1893],{"class":508},[502,5134,733],{"class":508},[502,5136,522],{"class":508},[502,5138,2389],{"class":518},[502,5140,522],{"class":508},[502,5142,2394],{"class":508},[502,5144,522],{"class":508},[502,5146,2399],{"class":518},[502,5148,522],{"class":508},[502,5150,525],{"class":508},[502,5152,1893],{"class":508},[502,5154,733],{"class":508},[502,5156,522],{"class":508},[502,5158,2412],{"class":518},[502,5160,522],{"class":508},[502,5162,525],{"class":508},[502,5164,522],{"class":508},[502,5166,1583],{"class":549},[502,5168,522],{"class":508},[502,5170,733],{"class":508},[502,5172,522],{"class":508},[502,5174,2429],{"class":518},[502,5176,522],{"class":508},[502,5178,525],{"class":508},[502,5180,1893],{"class":508},[502,5182,733],{"class":508},[502,5184,522],{"class":508},[502,5186,2442],{"class":518},[502,5188,522],{"class":508},[502,5190,2394],{"class":508},[502,5192,522],{"class":508},[502,5194,2451],{"class":518},[502,5196,522],{"class":508},[502,5198,525],{"class":508},[502,5200,1893],{"class":508},[502,5202,733],{"class":508},[502,5204,522],{"class":508},[502,5206,2464],{"class":518},[502,5208,522],{"class":508},[502,5210,525],{"class":508},[502,5212,522],{"class":508},[502,5214,1583],{"class":549},[502,5216,522],{"class":508},[502,5218,733],{"class":508},[502,5220,522],{"class":508},[502,5222,2481],{"class":518},[502,5224,522],{"class":508},[502,5226,525],{"class":508},[502,5228,1893],{"class":508},[502,5230,733],{"class":508},[502,5232,522],{"class":508},[502,5234,2494],{"class":518},[502,5236,522],{"class":508},[502,5238,2394],{"class":508},[502,5240,522],{"class":508},[502,5242,2503],{"class":518},[502,5244,522],{"class":508},[502,5246,525],{"class":508},[502,5248,1893],{"class":508},[502,5250,2512],{"class":508},[12,5252,5253],{},"This snippet brings its own broker node so it imports on its own. If you paste it into the same tab as the flow from step 2, you'll end up with two. Point this flow at the one you already set up and delete the spare, or the two clients will fight over the same login.",[12,5255,1397,5256,5258,5259,5262],{},[1212,5257,4043],{}," node keeps the import simple. Swap it for a ",[1212,5260,5261],{},"ui-button"," once your dashboard exists.",[34,5264,5266],{"id":5265},"before-this-touches-real-agvs","Before this touches real AGVs",[12,5268,5269],{},"A flow that works on a test rig is not a production system. Check these first.",[328,5271,5272,5278,5287,5308,5328,5334,5354,5368],{},[331,5273,5274,5277],{},[1212,5275,5276],{},"Lock down the broker."," Restrict each AGV to its own topic path. Give the wildcard subscription to master control only. Use an allowlist, not a blocklist.",[331,5279,5280,5286],{},[1212,5281,5282],{},[19,5283,5285],{"href":5284},"\u002Fblog\u002F2023\u002F04\u002Fsecuring-node-red-in-production\u002F","Use TLS."," Factory networks are shared. Fleet commands should not travel in clear text, and leave certificate checking on.",[331,5288,5289,5297,5298,231,5300,5302,5303,5307],{},[1212,5290,5291,5292,5294,5295,1265],{},"Never retain ",[77,5293,83],{}," or ",[77,5296,159],{}," The broker replays retained commands to every vehicle that reconnects. ",[77,5299,203],{},[77,5301,218],{}," are the two topics that ",[5304,5305,5306],"em",{},"should"," be retained.",[331,5309,5310,5313,5314,289,5316,289,5318,289,5320,354,5322,5324,5325,5327],{},[1212,5311,5312],{},"Match the standard's QoS levels."," QoS 0 for ",[77,5315,83],{},[77,5317,159],{},[77,5319,79],{},[77,5321,218],{},[77,5323,186],{},". QoS 1 for ",[77,5326,203],{},". If your site does something different, change it on both ends, since MQTT delivers at the lower of the two.",[331,5329,5330,5333],{},[1212,5331,5332],{},"Set the keep alive to around 15 seconds."," It sets the floor on how fast you can detect a vehicle dropping off, so a long keep alive quietly undoes your offline alerting.",[331,5335,5336,5341,5342,5344,5345,5347,5348,5350,5351,5353],{},[1212,5337,5338,5339,1265],{},"Watch state freshness, not just ",[77,5340,203],{}," A vehicle can hold its connection open while stuck or faulted. Alert on ",[77,5343,1141],{},", on ",[77,5346,1120],{}," leaving ",[77,5349,1129],{},", and on ",[77,5352,79],{}," messages older than 30 seconds.",[331,5355,5356,5362,5363,231,5365,5367],{},[1212,5357,5358],{},[19,5359,5361],{"href":5360},"\u002Fblog\u002F2025\u002F11\u002Findustrial-data-validation-guide\u002F","Validate orders before you send them."," Check the first node against the vehicle's current position, keep ",[77,5364,624],{},[77,5366,645],{}," unique, and check every action type against the factsheet.",[331,5369,5370,5373],{},[1212,5371,5372],{},"Cap message size on the broker"," to what VDA 5050 payloads actually need. It limits the damage a misbehaving client can do.",[34,5375,5377],{"id":5376},"whats-next","What's next",[12,5379,5380],{},"You now have the basics: subscribe to fleet state, tell vehicles apart, spot vehicles going offline, and send orders. That's enough for a pilot with two or three AGVs.",[12,5382,5383,5384,5388,5389,5391],{},"The next thing most teams do is replace the button with ",[19,5385,5387],{"href":5386},"\u002Fblog\u002F2025\u002F06\u002Fconnect-shop-floor-to-odoo-erp-flowfuse\u002F","the WMS or ERP",", so orders arrive from whatever already decides what needs moving. After that comes order updates and cancellation, because a job that can't be extended or pulled back mid-route is not much use on a real floor. Both of those need the vehicle's ",[77,5390,218],{},", so it's worth requesting and storing it early. Master control can then check load capacity, size, and supported actions before it dispatches anything.",[12,5393,5394,5395,5399,5400,5404],{},"Two bigger pieces usually wait until the pilot has proved itself. ",[19,5396,5398],{"href":5397},"\u002Fblog\u002F2026\u002F02\u002Fmqtt-influxdb-tutorial\u002F","Logging state history"," gives you throughput and utilization numbers, which is normally what makes the case for expanding. Publishing that state into a ",[19,5401,5403],{"href":5402},"\u002Fblog\u002F2024\u002F11\u002Fbuilding-uns-with-flowfuse\u002F","Unified Namespace"," puts it alongside the rest of your production data, so the systems that plan the work can see where the vehicles are. Traffic rules come last, and only once vehicles from different vendors start sharing aisles, because that is the point where a single master control system stops being a convenience and starts being the reason the floor works at all.",[12,5406,5407,5408,5412,5413,289,5417,5421],{},"When the pilot becomes a deployment, FlowFuse adds the parts a real fleet system needs: remote device management for edge gateways, ",[19,5409,5411],{"href":5410},"\u002Fblog\u002F2024\u002F09\u002Fnode-red-version-control-with-snapshots\u002F","snapshots and instant rollback",", audit logs, ",[19,5414,5416],{"href":5415},"\u002Fblog\u002F2024\u002F10\u002Fhow-to-build-automate-devops-pipelines-node-red-deployments\u002F","DevOps Pipelines",[19,5418,5420],{"href":5419},"\u002Fblog\u002F2024\u002F04\u002Frole-based-access-control-rbac-for-node-red-with-flowfuse\u002F","team access control",", and high availability.",[5423,5424,5425],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":268,"searchDepth":557,"depth":557,"links":5427},[5428,5433,5438,5447,5448],{"id":36,"depth":512,"text":37,"children":5429},[5430,5431,5432],{"id":50,"depth":535,"text":51},{"id":71,"depth":535,"text":72},{"id":90,"depth":535,"text":91},{"id":110,"depth":512,"text":111,"children":5434},[5435,5436,5437],{"id":257,"depth":535,"text":258},{"id":322,"depth":535,"text":323},{"id":492,"depth":535,"text":493},{"id":1311,"depth":512,"text":1312,"children":5439},[5440,5441,5442,5443,5444,5445,5446],{"id":1315,"depth":535,"text":1316},{"id":1344,"depth":535,"text":1345},{"id":1409,"depth":535,"text":1410},{"id":2518,"depth":535,"text":2519},{"id":2836,"depth":535,"text":2837},{"id":2902,"depth":535,"text":2903},{"id":2922,"depth":535,"text":2923},{"id":5265,"depth":512,"text":5266},{"id":5376,"depth":512,"text":5377},{"type":5450,"title":5451,"description":5452},"contact","Run Every AGV From One System","See how FlowFuse connects AGVs from any vendor over VDA 5050, takes orders from your WMS, and rolls the same master control setup out to every site you run.","2025-08-12","VDA 5050 explained: how the standard structures AGV communication over MQTT, and how to build a working master control flow in FlowFuse.","md","\u002Fblog\u002F2026\u002F08\u002Fimages\u002Fvda5050-tutorial.png",null,{"excerpt":5459},{"type":9,"value":5460},[5461],[12,5462,14],{},"\u002Fblog\u002F2026\u002F08\u002Fconnect-agvs-vda-5050-mqtt",{"title":5,"description":5454},"blog\u002F2026\u002F08\u002Fconnect-agvs-vda-5050-mqtt","How the six VDA 5050 MQTT topics work, and how to build a master control flow for a mixed AGV fleet.",[5468,5469],"posts","flowfuse","b5mkH-4C2d1Ex7WXsQVpkCTQCj7IcXhFygqxzxjMbdk",[],1786552678372]