From c27ea52cda762b3530f19831b670ff1f37093c21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20L=C3=BCtjens?= Definition of the firealarm API between a fire alarm system and Magazino Fleet Manager. The fire alarm system connects to the MQTT broker and sets its last will to the state "offline" on the state topic.
+Afterwards, depending on the state of the fire alarm system, either the state "ok" or "alarm" (in case of an alarm) is published. The keep-alive of 60 seconds ensures that the Magazino Fleet Manager can treat the absense of the fire alarm system like the alarm state and start the respective procedures. MQTT broker Name of the customer Topic that the firealarm system offers to provide its state. Published by the fire alarm system in case of a firealarm Depending on the state of the fire alarm system, either the state "ok" or "alarm" (in case of an alarm) is published The name of the fire alarm system. Accepts the following message: State of the fire alarm system State of the fire alarm system State of the fire alarm system State of the fire alarm system State of the fire alarm system "+e+"Servers
Security:
Operations
SUB firealarm/v2/magazino/{fireAlarmSystem}/state
Examples
+{
+ "state": "offline"
+}
+This example has been generated automatically.
Messages
Schemas
/g,"\n"))},"after:highlightElement":({result:e})=>{c.useBR&&(e.value=e.value.replace(/\n/g,"
"))}},y=/^(<[^>]+>|\t)+/gm,b={"after:highlightElement":({result:e})=>{c.tabReplace&&(e.value=e.value.replace(y,e=>e.replace(/\t/g,c.tabReplace)))}};function v(e){let t=null;const r=function(e){let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"";const n=c.languageDetectRe.exec(t);if(n){const t=D(n[1]);return t||(q(u.replace("{}",n[1])),q("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"}return t.split(/\s+/).find(e=>d(e)||D(e))}(e);if(d(r))return;_("before:highlightElement",{el:e,language:r}),t=e;const a=t.textContent,i=r?p(a,{language:r,ignoreIllegals:!0}):h(a);_("after:highlightElement",{el:e,result:i,text:a}),e.innerHTML=i.value,function(e,t,r){const a=t?n[t]:r;e.classList.add("hljs"),a&&e.classList.add(a)}(e,r,i.language),e.result={language:i.language,re:i.relevance,relavance:i.relevance},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.relevance,relavance:i.second_best.relevance})}const x=()=>{if(x.called)return;x.called=!0,Y("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(v)};let E=!1;function w(){if("loading"===document.readyState)return void(E=!0);document.querySelectorAll("pre code").forEach(v)}function D(e){return e=(e||"").toLowerCase(),t[e]||t[n[e]]}function k(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach(e=>{n[e.toLowerCase()]=t})}function C(e){const t=D(e);return t&&!t.disableAutodetect}function _(e,t){const n=e;a.forEach((function(e){e[n]&&e[n](t)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function(){E&&w()}),!1),Object.assign(e,{highlight:p,highlightAuto:h,highlightAll:w,fixMarkup:function(e){return Y("10.2.0","fixMarkup will be removed entirely in v11.0"),Y("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),t=e,c.tabReplace||c.useBR?t.replace(l,e=>"\n"===e?c.useBR?"
":e:c.tabReplace?e.replace(/\t/g,c.tabReplace):e):t;var t},highlightElement:v,highlightBlock:function(e){return Y("10.7.0","highlightBlock will be removed entirely in v12.0"),Y("10.7.0","Please use highlightElement now."),v(e)},configure:function(e){e.useBR&&(Y("10.3.0","'useBR' will be removed entirely in v11.0"),Y("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),c=K(c,e)},initHighlighting:x,initHighlightingOnLoad:function(){Y("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),E=!0},registerLanguage:function(n,r){let a=null;try{a=r(e)}catch(e){if(W("Language definition for '{}' could not be registered.".replace("{}",n)),!o)throw e;W(e),a=s}a.name||(a.name=n),t[n]=a,a.rawDefinition=r.bind(null,e),a.aliases&&k(a.aliases,{languageName:n})},unregisterLanguage:function(e){delete t[e];for(const t of Object.keys(n))n[t]===e&&delete n[t]},listLanguages:function(){return Object.keys(t)},getLanguage:D,registerAliases:k,requireLanguage:function(e){Y("10.4.0","requireLanguage will be removed entirely in v11."),Y("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const t=D(e);if(t)return t;throw new Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:C,inherit:K,addPlugin:function(e){!function(e){e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{e["before:highlightBlock"](Object.assign({block:t.el},t))}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{e["after:highlightBlock"](Object.assign({block:t.el},t))})}(e),a.push(e)},vuePlugin:L(e).VuePlugin}),e.debugMode=function(){o=!1},e.safeMode=function(){o=!0},e.versionString="10.7.3";for(const e in O)"object"==typeof O[e]&&r(O[e]);return Object.assign(e,O),e.addPlugin(g),e.addPlugin(U),e.addPlugin(b),e}({});e.exports=Z},17:function(e,t,n){const{getMapValueOfType:r}=n(2),a=n(85),i={hasExternalDocs(){return!(!this._json.externalDocs||!Object.keys(this._json.externalDocs).length)},externalDocs(){return r(this._json,"externalDocs",a)}};e.exports=i},2:function(e,t){const n=e.exports,r=(e,t,n,r)=>{if("string"!=typeof t||!e)return null;const a=e[String(t)];return void 0===a?null:n?new n(a,r):a};n.createMapOfType=(e,t,n)=>{const r={};return e?(Object.entries(e).forEach(([e,a])=>{r[String(e)]=new t(a,n)}),r):r},n.getMapValueOfType=(e,t,n,a)=>r(e,t,n,a),n.getMapValueByKey=(e,t)=>r(e,t),n.mix=(e,...t)=>{let n=!1;if(t.some((function(t){return e===t||(n=Object.keys(t).some(t=>e.prototype.hasOwnProperty(t)),n)})))throw n?new Error(`invalid mix function: model ${e.name} has at least one method that it is trying to replace by mixin`):new Error(`invalid mix function: cannot use the model ${e.name} as a mixin`);return t.forEach(t=>Object.assign(e.prototype,t)),e}},21:function(e,t,n){const{getMapValueByKey:r}=n(2),a={hasBindings(){return!(!this._json.bindings||!Object.keys(this._json.bindings).length)},bindings(){return this.hasBindings()?this._json.bindings:{}},bindingProtocols(){return Object.keys(this.bindings())},hasBinding(e){return this.hasBindings()&&!!this._json.bindings[String(e)]},binding(e){return r(this._json.bindings,e)}};e.exports=a},22:function(e,t,n){const r=n(84),a={hasTags(){return!(!Array.isArray(this._json.tags)||!this._json.tags.length)},tags(){return this.hasTags()?this._json.tags.map(e=>new r(e)):[]},tagNames(){return this.hasTags()?this._json.tags.map(e=>e.name):[]},hasTag(e){return this.hasTags()&&this._json.tags.some(t=>t.name===e)},tag(e){const t=this.hasTags()&&this._json.tags.find(t=>t.name===e);return t?new r(t):null}};e.exports=a},25:function(e,t,n){const{createMapOfType:r,getMapValueOfType:a,mix:i}=n(2),o=n(3),l=n(80),u=n(40),s=n(42),c=n(91),f=n(17),d=n(22),p=n(4),{xParserSpecParsed:m,xParserSpecStringified:h,xParserCircle:g}=n(27),{assignNameToAnonymousMessages:y,assignNameToComponentMessages:b,assignUidToComponentSchemas:v,assignUidToParameterSchemas:x,assignIdToAnonymousSchemas:E,assignUidToComponentParameterSchemas:w}=n(94),{traverseAsyncApiDocument:D}=n(50);class k extends o{constructor(...e){super(...e),!0!==this.ext(m)&&(b(this),y(this),v(this),w(this),x(this),E(this),this.json()[String(m)]=!0)}version(){return this._json.asyncapi}info(){return new l(this._json.info)}id(){return this._json.id}hasServers(){return!!this._json.servers}servers(){return r(this._json.servers,u)}serverNames(){return this._json.servers?Object.keys(this._json.servers):[]}server(e){return a(this._json.servers,e,u)}hasDefaultContentType(){return!!this._json.defaultContentType}defaultContentType(){return this._json.defaultContentType||null}hasChannels(){return!!this._json.channels}channels(){return r(this._json.channels,s,this)}channelNames(){return this._json.channels?Object.keys(this._json.channels):[]}channel(e){return a(this._json.channels,e,s,this)}hasComponents(){return!!this._json.components}components(){return this._json.components?new c(this._json.components):null}hasMessages(){return!!this.allMessages().size}allMessages(){const e=new Map;return this.hasChannels()&&this.channelNames().forEach(t=>{const n=this.channel(t);n.hasPublish()&&n.publish().messages().forEach(t=>{e.set(t.uid(),t)}),n.hasSubscribe()&&n.subscribe().messages().forEach(t=>{e.set(t.uid(),t)})}),this.hasComponents()&&Object.values(this.components().messages()).forEach(t=>{e.set(t.uid(),t)}),e}allSchemas(){const e=new Map;return D(this,t=>{t.uid()&&e.set(t.uid(),t)}),e}hasCircular(){return!!this._json[String(g)]}traverseSchemas(e,t){D(this,e,t)}static stringify(e,t){const n={...e.json()};return n[String(h)]=!0,JSON.stringify(n,function(){const e=new Map,t=new Map;let n=null;return function(r,a){const i=e.get(this)+(Array.isArray(this)?`[${r}]`:"."+r),o=a===Object(a);o&&e.set(a,i);const l=t.get(a)||"";if(!l&&o){const e=i.replace(/undefined\.\.?/,"");t.set(a,e)}const u="["===l[0]?"$":"$.";let s=l?`$ref:${u}${l}`:a;return null===n?n=a:s===n&&(s="$ref:$"),s}}(),t)}static parse(e){let t=e;if("string"==typeof e?t=JSON.parse(e):"object"==typeof e&&(t={...t}),"object"!=typeof t||!t[String(m)])throw new Error("Cannot parse invalid AsyncAPI document");if(!t[String(h)])return new k(t);delete t[String(h)];return function e(t,n,r,a,i){let o=t,l="$ref:$";if(void 0!==n){o=t[String(n)];const e=n?"."+n:"";l=a.get(t)+(Array.isArray(t)?`[${n}]`:e)}a.set(o,l),i.set(l,o);const u=i.get(o);u&&(t[String(n)]=u);"$ref:$"!==o&&"$ref:$"!==u||(t[String(n)]=r);if(o===Object(o))for(const t in o)e(o,t,r,a,i)}(t,void 0,t,new Map,new Map),new k(t)}}e.exports=i(k,d,f,p)},26:function(e,t){const n=(e,t)=>(t.type=e.type.startsWith("https://github.com/asyncapi/parser-js/")?e.type:"https://github.com/asyncapi/parser-js/"+e.type,t.title=e.title,e.detail&&(t.detail=e.detail),e.validationErrors&&(t.validationErrors=e.validationErrors),e.parsedJSON&&(t.parsedJSON=e.parsedJSON),e.location&&(t.location=e.location),e.refs&&(t.refs=e.refs),t);class r extends Error{constructor(e){super(),n(e,this),this.message=e.title}toJS(){return n(this,{})}}e.exports=r},27:function(e,t){e.exports={xParserSpecParsed:"x-parser-spec-parsed",xParserSpecStringified:"x-parser-spec-stringified",xParserMessageName:"x-parser-message-name",xParserSchemaId:"x-parser-schema-id",xParserCircle:"x-parser-circular",xParserCircleProps:"x-parser-circular-props"}},3:function(e,t,n){const r=n(26);e.exports=class{constructor(e){if(null==e)throw new r(`Invalid JSON to instantiate the ${this.constructor.name} object.`);this._json=e}json(e){return void 0===e?this._json:this._json?this._json[String(e)]:void 0}}},30:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return u}));var r=n(0),a=n.n(r),i=n(31);function o(e){return"undefined"!=typeof document?document.querySelector(e):null}function l(e){return function(t,n,r){null!==(n=n||o("asyncapi"))&&Object(i.render)(a.a.createElement(e,t),n,r)}}function u(e){return function(t,n,r){null!==(n=n||o("asyncapi"))&&Object(i.hydrate)(a.a.createElement(e,t),n,r)}}},300:function(e,t,n){"use strict";n.r(t);var r=n(39),a=n(30),i=n(16),o=n.n(i);t.default={render:Object(a.b)(r.a),hydrate:Object(a.a)(r.a),hljs:o.a}},31:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(77)},32:function(e,t,n){"use strict";
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/var r=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function o(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,l,u=o(e),s=1;s
\n":"'+(n?e:f(e,!0))+"
\n"},n.blockquote=function(e){return""+(n?e:f(e,!0))+"\n"+e+"
\n"},n.html=function(e){return e},n.heading=function(e,t,n,r){return this.options.headerIds?"
\n":"
\n"},n.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"},n.listitem=function(e){return"\n\n"+e+"\n"+t+"
\n"},n.tablerow=function(e){return"\n"+e+" \n"},n.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+""+n+">\n"},n.strong=function(e){return""+e+""},n.em=function(e){return""+e+""},n.codespan=function(e){return""+e+""},n.br=function(){return this.options.xhtml?"
":"
"},n.del=function(e){return""+e+""},n.link=function(e,t,n){if(null===(e=b(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"+n+""},n.image=function(e,t,n){if(null===(e=b(this.options.sanitize,this.options.baseUrl,e)))return n;var r='":">"},n.text=function(e){return e},t}(),I=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),M=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n)){r=this.seen[e];do{n=e+"-"+ ++r}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=r,this.seen[n]=0),n},t.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),z=function(){function t(t){this.options=t||e.defaults,this.options.renderer=this.options.renderer||new B,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new I,this.slugger=new M}t.parse=function(e,n){return new t(n).parse(e)},t.parseInline=function(e,n){return new t(n).parseInline(e)};var n=t.prototype;return n.parse=function(e,t){void 0===t&&(t=!0);var n,r,a,i,o,l,u,s,c,f,d,m,h,g,y,b,v,x,E,w="",D=e.length;for(n=0;n
"+f(e.message+"",!0)+"";throw e}}L.options=L.setOptions=function(t){var n;return k(L.defaults,t),n=L.defaults,e.defaults=n,L},L.getDefaults=a,L.defaults=e.defaults,L.use=function(){for(var e=arguments.length,t=new Array(e),n=0;n
"+f(e.message+"",!0)+"";throw e}},L.Parser=z,L.parser=z.parse,L.Renderer=B,L.TextRenderer=I,L.Lexer=R,L.lexer=R.lex,L.Tokenizer=N,L.Slugger=M,L.parse=L;var U=L.options,$=L.setOptions,H=L.use,V=L.walkTokens,W=L.parseInline,q=L,Y=z.parse,Q=R.lex;e.Lexer=R,e.Parser=z,e.Renderer=B,e.Slugger=M,e.TextRenderer=I,e.Tokenizer=N,e.getDefaults=a,e.lexer=Q,e.marked=L,e.options=U,e.parse=q,e.parseInline=W,e.parser=Y,e.setOptions=$,e.use=H,e.walkTokens=V,Object.defineProperty(e,"__esModule",{value:!0})}(t)},61:function(e,t){e.exports=function(e){const t={literal:"true false null"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},i={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(a,{begin:/:/})].concat(n),illegal:"\\S"},o={begin:"\\[",end:"\\]",contains:[e.inherit(a)],illegal:"\\S"};return r.push(i,o),n.forEach((function(e){r.push(e)})),{name:"JSON",contains:r,keywords:t,illegal:"\\S"}}},62:function(e,t){e.exports=function(e){var t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},o={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},l={begin:/\{/,end:/\}/,contains:[o],illegal:"\\n",relevance:0},u={begin:"\\[",end:"\\]",contains:[o],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},i,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},l,u,r],c=[...s];return c.pop(),c.push(a),o.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}},63:function(e,t){function n(...e){return e.map(e=>{return(t=e)?"string"==typeof t?t:t.source:null;var t}).join("")}e.exports=function(e){const t={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),s={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[u,e.SHEBANG(),s,l,e.HASH_COMMENT_MODE,i,o,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}},64:function(e,t,n){"use strict";var r=n(95);function a(e,t,n){if(3===arguments.length)return a.set(e,t,n);if(2===arguments.length)return a.get(e,t);var r=a.bind(a,e);for(var i in a)a.hasOwnProperty(i)&&(r[i]=a[i].bind(r,e));return r}e.exports=a,a.get=function(e,t){for(var n=Array.isArray(t)?t:a.parse(t),r=0;r
This document describes the usage of the VDA5050 v2.0 topics by Magazino. +For some topics, it defines additional fields, that are not included in the +VDA5050 v2.0. However, all messages are fully compatible with the standard.
+These messages are used by the master controller implementation of Magazino, +named Magazino Fleet Manager (MFM).
+The document is written from the perspective of the Master Controller (MC):
+PUBLISH operations define messages published by the robot.SUBSCRIBE operations define messages produced by the MC, which the robot
+subscribes to.MQTT broker for a specific customer instance.
+This endpoint should be used by browsers (users), and is secured by +Identity-Aware Proxy (IAP) and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Identifier of the location, plant, or site of the customer
+Identity-Aware Proxy (IAP) using Magazino credentials in combination +with optional User/Password (see below) to connect to the broker.
+Optional. +Depending on the instance, x509 or IAP might be combined with +User/Password authentication to connect to the broker. The broker uses +the username for rights-management.
+The topic "order" is the MQTT topic via which the AGV receives a JSON +encapsulated order.
+Send an order or order update to the robot.
The serial number of the robot.
+Accepts the following message:
Order or order update to the robot
The message schema to communicate orders from master control to the AGV.
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "orderId": "eece0077-62d6-44c6-ac91-df4b4e4075fd",
+ "orderUpdateId": 0,
+ "zoneSetId": "string",
+ "nodes": [
+ {
+ "nodeId": "pumpenhaus_1",
+ "sequenceId": 0,
+ "nodeDescription": "string",
+ "released": true,
+ "nodePosition": {
+ "x": 0,
+ "y": 0,
+ "theta": -3.14159265359,
+ "allowedDeviationXy": 0,
+ "allowedDeviationTheta": -3.141592654,
+ "mapId": "string",
+ "mapDescription": "string"
+ },
+ "actions": [
+ {
+ "actionType": "startPause",
+ "actionId": "string",
+ "actionDescription": "string",
+ "blockingType": "NONE",
+ "actionParameters": [
+ {
+ "key": "duration",
+ "value": 103.2
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "edges": [
+ {
+ "edgeId": "string",
+ "sequenceId": 0,
+ "edgeDescription": "string",
+ "released": true,
+ "startNodeId": "string",
+ "endNodeId": "string",
+ "maxSpeed": 0,
+ "maxHeight": 0,
+ "minHeight": 0,
+ "orientation": -3.14159265359,
+ "orientationType": "GLOBAL",
+ "direction": "left",
+ "rotationAllowed": true,
+ "maxRotationSpeed": 0,
+ "length": 0,
+ "trajectory": {
+ "degree": 1,
+ "knotVector": [
+ 1
+ ],
+ "controlPoints": [
+ {
+ "x": 0,
+ "y": 0,
+ "weight": 0
+ }
+ ]
+ },
+ "actions": [
+ {
+ "actionType": "startPause",
+ "actionId": "string",
+ "actionDescription": "string",
+ "blockingType": "NONE",
+ "actionParameters": [
+ {
+ "key": "duration",
+ "value": 103.2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+
+In certain cases, it is necessary to send actions to the AGV, that need to +be performed immediately. This is made possible by publishing an +instantAction message to the topic instantActions. instantActions must not +conflict with the content of the AGV’s current order (e.g., instantAction +to lower fork, while order says to raise fork).
+Send an instant action to the robot.
The serial number of the robot.
+Accepts the following message:
JSON Schema for publishing instantActions that the AGV is to execute as soon as they arrive.
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "actions": [
+ {
+ "actionType": "startPause",
+ "actionId": "string",
+ "actionDescription": "string",
+ "blockingType": "NONE",
+ "actionParameters": [
+ {
+ "key": "duration",
+ "value": 103.2
+ }
+ ]
+ }
+ ]
+}
+
+The AGV-State will be transmitted on only one topic. Compared to separate +messages (e.g., for orders, battery-state and errors) using one topic will +reduce the workload of the broker and the master control for handling +messages, while also keeping the information about the AGV state +synchronized.
+A state message from the robot.
The serial number of the robot.
+Accepts the following message:
all encompassing state of the AGV.
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "orderId": "eece0077-62d6-44c6-ac91-df4b4e4075fd",
+ "orderUpdateId": 0,
+ "zoneSetId": "string",
+ "lastNodeId": "string",
+ "lastNodeSequenceId": 0,
+ "driving": true,
+ "paused": true,
+ "newBaseRequest": true,
+ "distanceSinceLastNode": 0,
+ "operatingMode": "AUTOMATIC",
+ "nodeStates": [
+ {
+ "nodeId": "string",
+ "sequenceId": 0,
+ "nodeDescription": "string",
+ "nodePosition": {
+ "x": 0,
+ "y": 0,
+ "theta": -3.14159265359,
+ "allowedDeviationXy": 0,
+ "allowedDeviationTheta": -3.141592654,
+ "mapId": "string",
+ "mapDescription": "string"
+ },
+ "released": true
+ }
+ ],
+ "edgeStates": [
+ {
+ "edgeId": "string",
+ "sequenceId": 0,
+ "edgeDescription": "string",
+ "released": true,
+ "trajectory": {
+ "degree": 1,
+ "knotVector": [
+ 1
+ ],
+ "controlPoints": [
+ {
+ "x": 0,
+ "y": 0,
+ "weight": 0
+ }
+ ]
+ }
+ }
+ ],
+ "agvPosition": {
+ "x": 0,
+ "y": 0,
+ "theta": 0,
+ "mapId": "string",
+ "mapDescription": "string",
+ "positionInitialized": true,
+ "localizationScore": 1,
+ "deviationRange": 0
+ },
+ "velocity": {
+ "vx": 0,
+ "vy": 0,
+ "omega": 0
+ },
+ "loads": [
+ {
+ "loadId": "string",
+ "loadType": "string",
+ "loadPosition": "front",
+ "boundingBoxReference": {
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "theta": 0
+ },
+ "loadDimensions": {
+ "length": 0,
+ "width": 0,
+ "height": 0
+ },
+ "weight": 0
+ }
+ ],
+ "actionStates": [
+ {
+ "actionId": "blink_123jdaimoim234",
+ "actionType": "startPause",
+ "actionDescription": "string",
+ "actionStatus": "WAITING",
+ "resultDescription": "string"
+ }
+ ],
+ "batteryState": {
+ "batteryCharge": 0,
+ "batteryVoltage": 0,
+ "batteryHealth": 100,
+ "charging": true,
+ "reach": 0
+ },
+ "errors": [
+ {
+ "errorType": "string",
+ "errorReferences": [
+ {
+ "referenceKey": "string",
+ "referenceValue": "string"
+ }
+ ],
+ "errorDescription": "string",
+ "errorLevel": "WARNING"
+ }
+ ],
+ "information": [
+ {
+ "infoType": "string",
+ "infoReferences": [
+ {
+ "referenceKey": "string",
+ "referenceValue": "string"
+ }
+ ],
+ "infoDescription": "string",
+ "infoLevel": "INFO"
+ }
+ ],
+ "safetyState": {
+ "eStop": "AUTOACK",
+ "fieldViolation": true
+ }
+}
+
+For a near real-time position update the AGV can broadcast its position +and velocity on the subtopic visualization.
+Visualization message from the robot.
The serial number of the robot.
+Accepts the following message:
AGV position and/or velocity for visualization purposes. Can be published at a higher rate if wanted. Since bandwidth may be expensive depening on the update rate for this topic, all fields are optional.
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "agvPosition": {
+ "x": 0,
+ "y": 0,
+ "theta": 0,
+ "mapId": "string",
+ "mapDescription": "string",
+ "positionInitialized": true,
+ "localizationScore": 1,
+ "deviationRange": 0
+ },
+ "velocity": {
+ "vx": 0,
+ "vy": 0,
+ "omega": 0
+ }
+}
+
+During the connection of an AGV client to the broker, a last will topic +and message can be set, which is published by the broker upon +disconnection of the AGV client from the broker. Thus, the master control +can detect a disconnection event by subscribing the connection topics of +all AGV. The disconnection is detected via a heartbeat that is exchanged +between the broker and the client. The interval is configurable in most +brokers and should be set around 15 seconds. The Quality of Service level +for the connection topic shall be 1 - At Least Once.
+Connection message from the robot.
The serial number of the robot.
+Accepts the following message:
The last will message of the AGV. Has to be sent with retain flag. +Once the AGV comes online, it has to send this message on its connect topic, with the connectionState enum set to "ONLINE". + The last will message is to be configured with the connection state set to "CONNECTIONBROKEN". +Thus, if the AGV disconnects from the broker, master control gets notified via the topic "connection". +If the AGV is disconnecting in an orderly fashion (e.g. shutting down, sleeping), the AGV is to publish a message on this topic with the connectionState set to "DISCONNECTED".
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "connectionState": "ONLINE"
+}
+
+The factsheet provides basic information about a specific AGV type series. +This information allows comparison of different AGV types and can be +applied for the planning, dimensioning and simulation of an AGV system. +The factsheet also includes information about AGV communication interfaces +which are required for the integration of an AGV type series into a +VDA-5050-compliant master control.
+Factsheet message from the robot.
The serial number of the robot.
+Accepts the following message:
The factsheet provides basic information about a specific AGV type series. This information allows comparison of different AGV types and can be applied for the planning, dimensioning and simulation of an AGV system. The factsheet also includes information about AGV communication interfaces which are required for the integration of an AGV type series into a VD[M]A-5050-compliant master control.
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "typeSpecification": {
+ "seriesName": "string",
+ "seriesDescription": "string",
+ "agvKinematic": "DIFF",
+ "agvClass": "FORKLIFT",
+ "maxLoadMass": 0,
+ "localizationTypes": [
+ "NATURAL"
+ ],
+ "navigationTypes": [
+ "PHYSICAL_LINDE_GUIDED"
+ ]
+ },
+ "physicalParameters": {
+ "speedMin": 0,
+ "speedMax": 0,
+ "accelerationMax": 0,
+ "decelerationMax": 0,
+ "heightMin": 0,
+ "heightMax": 0,
+ "width": 0,
+ "length": 0
+ },
+ "protocolLimits": {
+ "maxStringLens": {
+ "msgLen": 0,
+ "topicSerialLen": 0,
+ "topicElemLen": 0,
+ "idLen": 0,
+ "idNumericalOnly": true,
+ "enumLen": 0,
+ "loadIdLen": 0
+ },
+ "maxArrayLens": {},
+ "timing": {
+ "minOrderInterval": 0,
+ "minStateInterval": 0,
+ "defaultStateInterval": 0,
+ "visualizationInterval": 0
+ }
+ },
+ "protocolFeatures": {
+ "optionalParameters": [
+ {
+ "parameter": "string",
+ "support": "SUPPORTED",
+ "description": "string"
+ }
+ ],
+ "agvActions": [
+ {
+ "actionType": "startPause",
+ "actionDescription": "string",
+ "actionScopes": [
+ "INSTANT"
+ ],
+ "actionParameters": [
+ {
+ "key": "string",
+ "valueDataType": "BOOL",
+ "description": "string",
+ "isOptional": true
+ }
+ ],
+ "resultDescription": "string"
+ }
+ ]
+ },
+ "agvGeometry": {
+ "wheelDefinitions": [
+ {
+ "type": "DRIVE",
+ "isActiveDriven": true,
+ "isActiveSteered": true,
+ "position": {
+ "x": 0,
+ "y": 0,
+ "theta": 0
+ },
+ "diameter": 0,
+ "width": 0,
+ "centerDisplacement": 0,
+ "constraints": "string"
+ }
+ ],
+ "envelopes2d": [
+ {
+ "set": "string",
+ "polygonPoints": [
+ {
+ "x": 0,
+ "y": 0
+ }
+ ],
+ "description": "string"
+ }
+ ],
+ "envelopes3d": [
+ {
+ "set": "string",
+ "format": "string",
+ "data": {},
+ "url": "string",
+ "description": 0
+ }
+ ]
+ },
+ "loadSpecification": {
+ "loadPositions": [
+ "string"
+ ],
+ "loadSets": [
+ {
+ "setName": "string",
+ "loadType": "string",
+ "loadPositions": [
+ "string"
+ ],
+ "boundingBoxReference": {
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "theta": 0
+ },
+ "loadDimensions": {
+ "length": 0,
+ "width": 0,
+ "height": 0
+ },
+ "maxWeight": 0,
+ "minLoadhandlingHeight": 0,
+ "maxLoadhandlingHeight": 0,
+ "minLoadhandlingDepth": 0,
+ "maxLoadhandlingDepth": 0,
+ "minLoadhandlingTilt": 0,
+ "maxLoadhandlingTilt": 0,
+ "agvSpeedLimit": 0,
+ "agvAccelerationLimit": 0,
+ "agvDecelerationLimit": 0,
+ "pickTime": 0,
+ "dropTime": 0,
+ "description": "string"
+ }
+ ]
+ },
+ "localizationParameters": 0,
+ "agvStatus": {
+ "versions": [
+ {
+ "key": "softwareVersion",
+ "value": "v1.03.2"
+ }
+ ],
+ "network": {
+ "dnsServers": [
+ "string"
+ ],
+ "localIpAddress": "string",
+ "ntpServers": [
+ "string"
+ ],
+ "netmask": "string",
+ "defaultGateway": "string"
+ }
+ }
+}
+
+Order or order update to the robot
The message schema to communicate orders from master control to the AGV.
+JSON Schema for publishing instantActions that the AGV is to execute as soon as they arrive.
+all encompassing state of the AGV.
+AGV position and/or velocity for visualization purposes. Can be published at a higher rate if wanted. Since bandwidth may be expensive depening on the update rate for this topic, all fields are optional.
+The last will message of the AGV. Has to be sent with retain flag. +Once the AGV comes online, it has to send this message on its connect topic, with the connectionState enum set to "ONLINE". + The last will message is to be configured with the connection state set to "CONNECTIONBROKEN". +Thus, if the AGV disconnects from the broker, master control gets notified via the topic "connection". +If the AGV is disconnecting in an orderly fashion (e.g. shutting down, sleeping), the AGV is to publish a message on this topic with the connectionState set to "DISCONNECTED".
+The factsheet provides basic information about a specific AGV type series. This information allows comparison of different AGV types and can be applied for the planning, dimensioning and simulation of an AGV system. The factsheet also includes information about AGV communication interfaces which are required for the integration of an AGV type series into a VD[M]A-5050-compliant master control.
+'+(n?e:f(e,!0))+"\n":""+(n?e:f(e,!0))+"\n"},n.blockquote=function(e){return"\n"+e+"\n"},n.html=function(e){return e},n.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},n.table=function(e,t){return t&&(t=""+t+""),""+e+""},n.br=function(){return this.options.xhtml?""+f(e.message+"",!0)+"";throw e}}L.options=L.setOptions=function(t){var n;return k(L.defaults,t),n=L.defaults,e.defaults=n,L},L.getDefaults=a,L.defaults=e.defaults,L.use=function(){for(var e=arguments.length,t=new Array(e),n=0;n
"+f(e.message+"",!0)+"";throw e}},L.Parser=z,L.parser=z.parse,L.Renderer=B,L.TextRenderer=I,L.Lexer=R,L.lexer=R.lex,L.Tokenizer=N,L.Slugger=M,L.parse=L;var U=L.options,$=L.setOptions,H=L.use,V=L.walkTokens,W=L.parseInline,q=L,Y=z.parse,Q=R.lex;e.Lexer=R,e.Parser=z,e.Renderer=B,e.Slugger=M,e.TextRenderer=I,e.Tokenizer=N,e.getDefaults=a,e.lexer=Q,e.marked=L,e.options=U,e.parse=q,e.parseInline=W,e.parser=Y,e.setOptions=$,e.use=H,e.walkTokens=V,Object.defineProperty(e,"__esModule",{value:!0})}(t)},61:function(e,t){e.exports=function(e){const t={literal:"true false null"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},i={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(a,{begin:/:/})].concat(n),illegal:"\\S"},o={begin:"\\[",end:"\\]",contains:[e.inherit(a)],illegal:"\\S"};return r.push(i,o),n.forEach((function(e){r.push(e)})),{name:"JSON",contains:r,keywords:t,illegal:"\\S"}}},62:function(e,t){e.exports=function(e){var t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},o={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},l={begin:/\{/,end:/\}/,contains:[o],illegal:"\\n",relevance:0},u={begin:"\\[",end:"\\]",contains:[o],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},i,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},l,u,r],c=[...s];return c.pop(),c.push(a),o.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}},63:function(e,t){function n(...e){return e.map(e=>{return(t=e)?"string"==typeof t?t:t.source:null;var t}).join("")}e.exports=function(e){const t={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),s={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[u,e.SHEBANG(),s,l,e.HASH_COMMENT_MODE,i,o,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}},64:function(e,t,n){"use strict";var r=n(95);function a(e,t,n){if(3===arguments.length)return a.set(e,t,n);if(2===arguments.length)return a.get(e,t);var r=a.bind(a,e);for(var i in a)a.hasOwnProperty(i)&&(r[i]=a[i].bind(r,e));return r}e.exports=a,a.get=function(e,t){for(var n=Array.isArray(t)?t:a.parse(t),r=0;r
This extension to the VDA5050 describes how environments can be deployed +from the Magazino Fleet Manager (MFM) via a VDA5050 master controller (MC) +to a fleet of robots.
+The document is written from the perspective of the master controller which +is implemented by a Magazino Partner or Integrator.
+PUBLISH operations define the messages consumed by the master controller
+from the channel.SUBSCRIBE operations define the messages produced by the master controller
+and sent to the channel.The two-phase deployment consists of:
+Before deploying an environment, a map is created with the robot. Upon
+completed mapping, the robot uploads the map to MFM. Interested parties can
+monitor the progress of the map upload by subscribing to the map/upload
+subtopic.
deploy subtopicdeploy and receives a call to upgrade. It
+ fetches the environment files via the Environment Deployment REST API, and
+ upgrades. It publishes the state on the environment subtopic.deploy, where
+ serialNumber equals the robot's name.environment subtopic, where serialNumber equals the robot's name.The user monitors the progress via the MFM, by subscribing to all
+environment subtopics.
All messages are sent with QoS 2, and retained=True unless stated
+differently.
MQTT broker for a specific customer instance.
+This endpoint should be used by browsers (users), and is secured by +Identity-Aware Proxy (IAP) and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Use Identity-Aware Proxy (IAP) in combination with (optional) +User/Password to connect to the broker.
+x509 or IAP must be combined with User/Password authentication to +connect to the broker. The broker uses the username for +rights-management.
+MQTT broker for a specific customer instance.
+This endpoint should be used by robots and developers, and is secured by +client certificates and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Use client certificates (X509) in combination with User/Password to +connect to the broker.
+x509 or IAP must be combined with User/Password authentication to +connect to the broker. The broker uses the username for +rights-management.
+Topic, published by the robot during map upload. MFM uses the topic to +display the progress to the user.
+Robot publishes a message during map upload, and when map upload is +completed. +
The serial number of the robot.
+Accepts the following message:
Message publishing the status of map upload by the robot. +
Proprietary message that robot publishes while uploading blobs to the Magazino Fleet Manager, e.g. a map.
+Example of a message after a successfully completed upload. +
{
+ "name": "mylocalizationmap1",
+ "timestamp": "2023-01-19T00:00:00Z",
+ "status": "finished",
+ "retryCount": 0,
+ "totalBytes": 532501,
+ "bytesTransferred": 532501
+}
+
+Topic that MFM uses to advertise the desired environment version. The +Master controller subscribes to the topic, updates its own environment, +and consecutively updates the robots of the fleet.
+Published once by MFM, then retained.
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
Message requesting master controller to upgrade to environment to +desired deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+{
+ "deploymentId": "string"
+}
+
+New topic on which the master controller publishes its currently deployed +environment version.
+MC must publish after receiving a request to deploy a new environment, +and on every `DeploymentState` change. +
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
Message describing the master controller's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+{
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "current": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "desired": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "serialNumber": "string",
+ "status": "no_environment",
+ "result": "string"
+}
+
+New topic to tell the robot to upgrade the environment.
+MC advertises a new desired deployment version for a robot, after +receiving a `masterDeploymentRequest` and successfully completing it. +
The serial number of the robot.
+Accepts the following message:
Message requesting robot to upgrade to environment to desired +deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+{
+ "deploymentId": "string"
+}
+
+New topic to tell the MFM or MC the version of the currently deployed
+environment and its DeploymentState.
Robot publishes after receiving a request to deploy a new environment, +and on every `DeploymentState` change. +
The serial number of the robot.
+Accepts the following message:
Message describing the robot's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+{
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "current": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "desired": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "serialNumber": "string",
+ "status": "no_environment",
+ "result": "string"
+}
+
+Message publishing the status of map upload by the robot. +
Proprietary message that robot publishes while uploading blobs to the Magazino Fleet Manager, e.g. a map.
+Message requesting master controller to upgrade to environment to +desired deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+Message describing the master controller's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+Message requesting robot to upgrade to environment to desired +deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+Message describing the robot's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+Proprietary message that robot publishes while uploading blobs to the Magazino Fleet Manager, e.g. a map.
+Proprietary message to request a robot or master controller to upgrade its environment.
+Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+'+(n?e:f(e,!0))+"\n":""+(n?e:f(e,!0))+"\n"},n.blockquote=function(e){return"\n"+e+"\n"},n.html=function(e){return e},n.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},n.table=function(e,t){return t&&(t=""+t+""),""+e+""},n.br=function(){return this.options.xhtml?""+f(e.message+"",!0)+"";throw e}}L.options=L.setOptions=function(t){var n;return k(L.defaults,t),n=L.defaults,e.defaults=n,L},L.getDefaults=a,L.defaults=e.defaults,L.use=function(){for(var e=arguments.length,t=new Array(e),n=0;n
"+f(e.message+"",!0)+"";throw e}},L.Parser=z,L.parser=z.parse,L.Renderer=B,L.TextRenderer=I,L.Lexer=R,L.lexer=R.lex,L.Tokenizer=N,L.Slugger=M,L.parse=L;var U=L.options,$=L.setOptions,H=L.use,V=L.walkTokens,W=L.parseInline,q=L,Y=z.parse,Q=R.lex;e.Lexer=R,e.Parser=z,e.Renderer=B,e.Slugger=M,e.TextRenderer=I,e.Tokenizer=N,e.getDefaults=a,e.lexer=Q,e.marked=L,e.options=U,e.parse=q,e.parseInline=W,e.parser=Y,e.setOptions=$,e.use=H,e.walkTokens=V,Object.defineProperty(e,"__esModule",{value:!0})}(t)},61:function(e,t){e.exports=function(e){const t={literal:"true false null"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},i={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(a,{begin:/:/})].concat(n),illegal:"\\S"},o={begin:"\\[",end:"\\]",contains:[e.inherit(a)],illegal:"\\S"};return r.push(i,o),n.forEach((function(e){r.push(e)})),{name:"JSON",contains:r,keywords:t,illegal:"\\S"}}},62:function(e,t){e.exports=function(e){var t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},o={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},l={begin:/\{/,end:/\}/,contains:[o],illegal:"\\n",relevance:0},u={begin:"\\[",end:"\\]",contains:[o],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},i,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},l,u,r],c=[...s];return c.pop(),c.push(a),o.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}},63:function(e,t){function n(...e){return e.map(e=>{return(t=e)?"string"==typeof t?t:t.source:null;var t}).join("")}e.exports=function(e){const t={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),s={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[u,e.SHEBANG(),s,l,e.HASH_COMMENT_MODE,i,o,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}},64:function(e,t,n){"use strict";var r=n(95);function a(e,t,n){if(3===arguments.length)return a.set(e,t,n);if(2===arguments.length)return a.get(e,t);var r=a.bind(a,e);for(var i in a)a.hasOwnProperty(i)&&(r[i]=a[i].bind(r,e));return r}e.exports=a,a.get=function(e,t){for(var n=Array.isArray(t)?t:a.parse(t),r=0;r
This document describes a extension to the VDA5050 v2.0 by Magazino. It +defines additional topics that are used by the Magazino Fleet Manager (MFM).
+The document is written from the perspective of the MFM:
+PUBLISH operations define messages published by the robot.SUBSCRIBE operations define messages produced by MFM, which the robot
+subscribes to.Live laser data can be requested by the frontend to assert that a robot is +correctly localized or handover stations are correctly modelled.
+The topics are going to be used in the Live View of MFM and during modelling +of handover stations in the Environment Editor (EE).
+Actors:
+Requirements:
+uagv/v2/magazino/soto-0012/lasers.uagv/v2/magazino/soto-0012/lasers/start.uagv/v2/magazino/soto-0012/lasers/data/bottom. After receiving a new
+message it continues to publish for another 30 seconds (timeout interval).[top, bottom] and client B is
+ interested in [bottom]. Then the robot considers the heartbeat messages
+ of both clients for publishing the data of the top laser scanner, and the
+ heartbeat of client B for the bottom laser scanners.MQTT broker for a specific customer instance.
+This endpoint should be used by browsers (users), and is secured by +Identity-Aware Proxy (IAP) and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Identifier of the location, plant, or site of the customer
+Identity-Aware Proxy (IAP) using Magazino credentials in combination +with optional User/Password (see below) to connect to the broker.
+Optional. +Depending on the instance, x509 or IAP might be combined with +User/Password authentication to connect to the broker. The broker uses +the username for rights-management.
+Topic on which the robot advertises the available laserLocations, e.g. +bottom and top lasers. Each laser location is an aggregation of multiple +sensors at this location, e.g. the bottom laser location aggregates three +different Lidar sensors on a SOTO robot.
+Laser data published by the robot as long as it's requested
The serial number of the robot.
+Accepts the following message:
Message to advertise available laser locations.
+Example of a robot advertising both top and bottom laser scanners. +
{
+ "timestamp": "2023-04-26T09:18:20Z",
+ "laserLocations": [
+ "bottom",
+ "top"
+ ]
+}
+
+Request topic for the User to request laser publishing from a robot. +Requests are for a specific robot on a specific laser location. The robot +publishes as long as it receives heartbeat messages. It stops, if no +message is received within the timeout interval.
+Request robot to start publishing laser data.
The serial number of the robot.
+Accepts the following message:
Message to request a robot to start streaming live laser data.
+Example of a request message when MFM requests to stream the +aggregated data of the bottom laser scanners. +
{
+ "timestamp": "2023-04-26T09:18:20Z",
+ "laserLocations": [
+ "bottom"
+ ],
+ "clientId": "bb2b8ad5-0072-436d-a4a7-022f0730c6d0"
+}
+
+Topic that the robot uses to publish laser data, as long as the data is +requested. Bottom and top lasers are published on the respective +subtopics.
+Messages are throttled, but users should expect messages to arrive with at +least 1 Hz.
+Laser data published by the robot as long as it's requested
The serial number of the robot.
+For robots with a top laser scanner, laser data is aggregated for +different locations.
+Accepts the following message:
Message representing a laser point cloud at a specific point in time. Array values can be zipped. x and y coordinates are mandatory; z values are optional.
+Example of one bottom laser scan reading with x and y values. z +values are omitted. +
{
+ "x": [
+ -8.292448997497559,
+ -8.25539493560791,
+ -8.218429565429688
+ ],
+ "y": [
+ 5.002348899841309,
+ 5.006131172180176,
+ 5.005261421203613
+ ]
+}
+
+Message to advertise available laser locations.
+Message representing a laser point cloud at a specific point in time. Array values can be zipped. x and y coordinates are mandatory; z values are optional.
+Message to request a robot to start streaming live laser data.
+'+(n?e:f(e,!0))+"\n":""+(n?e:f(e,!0))+"\n"},n.blockquote=function(e){return"\n"+e+"\n"},n.html=function(e){return e},n.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},n.table=function(e,t){return t&&(t=""+t+""),""+e+""},n.br=function(){return this.options.xhtml?""+f(e.message+"",!0)+"";throw e}}L.options=L.setOptions=function(t){var n;return k(L.defaults,t),n=L.defaults,e.defaults=n,L},L.getDefaults=a,L.defaults=e.defaults,L.use=function(){for(var e=arguments.length,t=new Array(e),n=0;n
"+f(e.message+"",!0)+"";throw e}},L.Parser=z,L.parser=z.parse,L.Renderer=B,L.TextRenderer=I,L.Lexer=R,L.lexer=R.lex,L.Tokenizer=N,L.Slugger=M,L.parse=L;var U=L.options,$=L.setOptions,H=L.use,V=L.walkTokens,W=L.parseInline,q=L,Y=z.parse,Q=R.lex;e.Lexer=R,e.Parser=z,e.Renderer=B,e.Slugger=M,e.TextRenderer=I,e.Tokenizer=N,e.getDefaults=a,e.lexer=Q,e.marked=L,e.options=U,e.parse=q,e.parseInline=W,e.parser=Y,e.setOptions=$,e.use=H,e.walkTokens=V,Object.defineProperty(e,"__esModule",{value:!0})}(t)},61:function(e,t){e.exports=function(e){const t={literal:"true false null"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},i={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(a,{begin:/:/})].concat(n),illegal:"\\S"},o={begin:"\\[",end:"\\]",contains:[e.inherit(a)],illegal:"\\S"};return r.push(i,o),n.forEach((function(e){r.push(e)})),{name:"JSON",contains:r,keywords:t,illegal:"\\S"}}},62:function(e,t){e.exports=function(e){var t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},o={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},l={begin:/\{/,end:/\}/,contains:[o],illegal:"\\n",relevance:0},u={begin:"\\[",end:"\\]",contains:[o],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},i,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},l,u,r],c=[...s];return c.pop(),c.push(a),o.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}},63:function(e,t){function n(...e){return e.map(e=>{return(t=e)?"string"==typeof t?t:t.source:null;var t}).join("")}e.exports=function(e){const t={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),s={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[u,e.SHEBANG(),s,l,e.HASH_COMMENT_MODE,i,o,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}},64:function(e,t,n){"use strict";var r=n(95);function a(e,t,n){if(3===arguments.length)return a.set(e,t,n);if(2===arguments.length)return a.get(e,t);var r=a.bind(a,e);for(var i in a)a.hasOwnProperty(i)&&(r[i]=a[i].bind(r,e));return r}e.exports=a,a.get=function(e,t){for(var n=Array.isArray(t)?t:a.parse(t),r=0;r
Definition of additional topics that MFM uses to communicate with Magazino's +master controller implemented in Node-RED (MC).
+The document is written from the perspective of the master controller:
+PUBLISH operations define the messages consumed by the master controller
+from the channel.SUBSCRIBE operations define the messages produced by the master controller
+and sent to the channel.MQTT broker for a specific customer instance.
+This endpoint should be used by browsers (users), and is secured by +Identity-Aware Proxy (IAP) and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Use Identity-Aware Proxy (IAP) in combination with (optional) +User/Password to connect to the broker.
+x509 or IAP must be combined with User/Password authentication to +connect to the broker. The broker uses the username for +rights-management.
+MQTT broker for a specific customer instance.
+This endpoint should be used by robots and developers, and is secured by +client certificates and (optionally) user/password authentication.
+Please read How to connect to SOTO fleet manager in the +cloud for +details on how to connect to the broker.
+Customer name
+Use client certificates (X509) in combination with User/Password to +connect to the broker.
+x509 or IAP must be combined with User/Password authentication to +connect to the broker. The broker uses the username for +rights-management.
+Connection topic of the master controller, which is used to detect the +disconnection of the master controller. See VDA5050 chapter on the +connection topic.
+Connection message from the master controller.
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
The last will message of the AGV. Has to be sent with retain flag. +Once the AGV comes online, it has to send this message on its connect topic, with the connectionState enum set to "ONLINE". + The last will message is to be configured with the connection state set to "CONNECTIONBROKEN". +Thus, if the AGV disconnects from the broker, master control gets notified via the topic "connection". +If the AGV is disconnecting in an orderly fashion (e.g. shutting down, sleeping), the AGV is to publish a message on this topic with the connectionState set to "DISCONNECTED".
+{
+ "headerId": 0,
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "version": "2.0.0",
+ "manufacturer": "Magazino",
+ "serialNumber": "soto-0012",
+ "connectionState": "ONLINE"
+}
+
+Topic that MFM uses to advertise the desired environment version. The +Master controller subscribes to the topic, updates its own environment, +and consecutively updates the robots of the fleet.
+Published once by MFM, then retained.
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
Message requesting master controller to upgrade to environment to +desired deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+{
+ "deploymentId": "string"
+}
+
+New topic on which the master controller publishes its currently deployed +environment version.
+MC must publish after receiving a request to deploy a new environment, +and on every `DeploymentState` change. +
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
Message describing the master controller's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+{
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "current": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "desired": {
+ "timestamp": "1991-03-11T11:40:03.12Z",
+ "deploymentId": "string",
+ "projectId": "string",
+ "projectName": "string",
+ "projectVersion": "string",
+ "mapDescription": "string"
+ },
+ "serialNumber": "string",
+ "status": "no_environment",
+ "result": "string"
+}
+
+Topic on which the master controller advertises the current control level +for each robot.
+Published when a robot's control level changes, either triggered by a +user or service change. +
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
A mapping from robot serial number to current control level [int].
+{
+ "soto-0012": 10,
+ "soto-0011": 5
+}
+
+All unterminated requests that the fleet of robots is currently working +on, or are created in the Magazino system.
+Published when a request is created, or updated. Contains a list of all +unterminated requests. +
Unique identifier of the master controller. Usually unique, and set to
+the constant "master". In multi-floor projects, there might be more
+than one master controller.
Accepts the following message:
List of transport requests.
+[
+ {
+ "order_id": "ORDER_01",
+ "request_id": "REQUEST_01",
+ "state": "string",
+ "item": {
+ "item_id": "string",
+ "length": 0.3,
+ "width": 0.2,
+ "height": 0.08
+ },
+ "source": {
+ "name": "HandoverStation-1-1-1",
+ "station_name": "HandoverStation-1"
+ },
+ "target": {
+ "name": "HandoverStation-1-1-1",
+ "station_name": "HandoverStation-1"
+ },
+ "created_at": "string",
+ "terminated_at": "string",
+ "custom_fields": {},
+ "is_cancelable": true
+ }
+]
+
+The last will message of the AGV. Has to be sent with retain flag. +Once the AGV comes online, it has to send this message on its connect topic, with the connectionState enum set to "ONLINE". + The last will message is to be configured with the connection state set to "CONNECTIONBROKEN". +Thus, if the AGV disconnects from the broker, master control gets notified via the topic "connection". +If the AGV is disconnecting in an orderly fashion (e.g. shutting down, sleeping), the AGV is to publish a message on this topic with the connectionState set to "DISCONNECTED".
+Message requesting master controller to upgrade to environment to +desired deployment_id. +
Proprietary message to request a robot or master controller to upgrade its environment.
+Message describing the master controller's environment deployment. +
Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+A mapping from robot serial number to current control level [int].
+List of transport requests.
+Proprietary message to request a robot or master controller to upgrade its environment.
+Proprietary message that robots and master controller use to publish their currently deployed, and desired environment version and state.
+'+(n?e:f(e,!0))+"\n":""+(n?e:f(e,!0))+"\n"},n.blockquote=function(e){return"\n"+e+"\n"},n.html=function(e){return e},n.heading=function(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"},n.table=function(e,t){return t&&(t=""+t+""),""+e+""},n.br=function(){return this.options.xhtml?""+f(e.message+"",!0)+"";throw e}}L.options=L.setOptions=function(t){var n;return k(L.defaults,t),n=L.defaults,e.defaults=n,L},L.getDefaults=a,L.defaults=e.defaults,L.use=function(){for(var e=arguments.length,t=new Array(e),n=0;n
"+f(e.message+"",!0)+"";throw e}},L.Parser=z,L.parser=z.parse,L.Renderer=B,L.TextRenderer=I,L.Lexer=R,L.lexer=R.lex,L.Tokenizer=N,L.Slugger=M,L.parse=L;var U=L.options,$=L.setOptions,H=L.use,V=L.walkTokens,W=L.parseInline,q=L,Y=z.parse,Q=R.lex;e.Lexer=R,e.Parser=z,e.Renderer=B,e.Slugger=M,e.TextRenderer=I,e.Tokenizer=N,e.getDefaults=a,e.lexer=Q,e.marked=L,e.options=U,e.parse=q,e.parseInline=W,e.parser=Y,e.setOptions=$,e.use=H,e.walkTokens=V,Object.defineProperty(e,"__esModule",{value:!0})}(t)},61:function(e,t){e.exports=function(e){const t={literal:"true false null"},n=[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],r=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:r,keywords:t},i={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(a,{begin:/:/})].concat(n),illegal:"\\S"},o={begin:"\\[",end:"\\]",contains:[e.inherit(a)],illegal:"\\S"};return r.push(i,o),n.forEach((function(e){r.push(e)})),{name:"JSON",contains:r,keywords:t,illegal:"\\S"}}},62:function(e,t){e.exports=function(e){var t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},a=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},o={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},l={begin:/\{/,end:/\}/,contains:[o],illegal:"\\n",relevance:0},u={begin:"\\[",end:"\\]",contains:[o],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},i,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},l,u,r],c=[...s];return c.pop(),c.push(a),o.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}}},63:function(e,t){function n(...e){return e.map(e=>{return(t=e)?"string"==typeof t?t:t.source:null;var t}).join("")}e.exports=function(e){const t={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:n(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},o={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(o);const l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},u=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),s={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[u,e.SHEBANG(),s,l,e.HASH_COMMENT_MODE,i,o,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}},64:function(e,t,n){"use strict";var r=n(95);function a(e,t,n){if(3===arguments.length)return a.set(e,t,n);if(2===arguments.length)return a.get(e,t);var r=a.bind(a,e);for(var i in a)a.hasOwnProperty(i)&&(r[i]=a[i].bind(r,e));return r}e.exports=a,a.get=function(e,t){for(var n=Array.isArray(t)?t:a.parse(t),r=0;r