[{"data":1,"prerenderedAt":1482},["ShallowReactive",2],{"navigation":3,"\u002Fconnector-development\u002Fguides\u002Fexecution-modes":826,"\u002Fconnector-development\u002Fguides\u002Fexecution-modes-surround":1477},[4,88,171,427,491,597,634,713],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started\u002F","01.get-started",[9,13,17,43,47,51],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works\u002F","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases\u002F","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control\u002F","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control\u002F","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration\u002F","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims\u002F","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet\u002F","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code\u002F","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F05.self-onboarding",{"title":52,"path":53,"stem":54,"children":55,"page":42},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F20.setup",[56,60,64,68,72,76,80,84],{"title":57,"path":58,"stem":59},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F20.setup\u002F00.get-access",{"title":61,"path":62,"stem":63},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":65,"path":66,"stem":67},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F20.setup\u002F20.developer-machine",{"title":69,"path":70,"stem":71},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F20.setup\u002F30.sdk-installation",{"title":73,"path":74,"stem":75},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":77,"path":78,"stem":79},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices\u002F","01.get-started\u002F20.setup\u002F45.multiple-devices",{"title":81,"path":82,"stem":83},"UniteLabs Desktop","\u002Fget-started\u002Fsetup\u002Funitelabs-desktop\u002F","01.get-started\u002F20.setup\u002F70.unitelabs-desktop",{"title":85,"path":86,"stem":87},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements\u002F","01.get-started\u002F20.setup\u002F90.network-requirements",{"title":89,"path":90,"stem":91,"children":92,"page":42},"Integrate","\u002Fintegrate\u002F","02.integrate",[93,97,101,126,155],{"title":94,"path":95,"stem":96},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector\u002F","02.integrate\u002F00.what-is-a-connector",{"title":98,"path":99,"stem":100},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code\u002F","02.integrate\u002F05.control-with-code",{"title":102,"path":103,"stem":104,"children":105,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts\u002F","02.integrate\u002F10.concepts",[106,110,114,118,122],{"title":107,"path":108,"stem":109},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector\u002F","02.integrate\u002F10.concepts\u002F10.connector",{"title":111,"path":112,"stem":113},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule\u002F","02.integrate\u002F10.concepts\u002F20.module",{"title":115,"path":116,"stem":117},"Action","\u002Fintegrate\u002Fconcepts\u002Faction\u002F","02.integrate\u002F10.concepts\u002F30.action",{"title":119,"path":120,"stem":121},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription\u002F","02.integrate\u002F10.concepts\u002F40.subscription",{"title":123,"path":124,"stem":125},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice\u002F","02.integrate\u002F10.concepts\u002F50.device",{"title":127,"path":128,"stem":129,"children":130,"page":42},"Connect a device","\u002Fintegrate\u002Fconnect-a-device\u002F","02.integrate\u002F20.connect-a-device",[131,135,139,143,147,151],{"title":132,"path":133,"stem":134},"Connector Configuration","\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":136,"path":137,"stem":138},"With an executable","\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":140,"path":141,"stem":142},"From source","\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":144,"path":145,"stem":146},"Build your own","\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":148,"path":149,"stem":150},"Headless install","\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":152,"path":153,"stem":154},"Raspberry Pi","\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":156,"path":157,"stem":158,"children":159,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector\u002F","02.integrate\u002F30.use-a-connector",[160,163,167],{"title":61,"path":161,"stem":162},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol\u002F","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":164,"path":165,"stem":166},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform\u002F","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":168,"path":169,"stem":170},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython\u002F","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":172,"path":173,"stem":174,"children":175,"page":42},"Operate","\u002Foperate\u002F","03.operate",[176,179,183,227,300],{"title":172,"path":177,"stem":178},"\u002Foperate\u002Foverview\u002F","03.operate\u002F00.overview",{"title":180,"path":181,"stem":182},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol\u002F","03.operate\u002F05.your-first-protocol",{"title":102,"path":184,"stem":185,"children":186,"page":42},"\u002Foperate\u002Fconcepts\u002F","03.operate\u002F10.concepts",[187,191,195,199,203,207,211,215,219,223],{"title":188,"path":189,"stem":190},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling\u002F","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":192,"path":193,"stem":194},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules\u002F","03.operate\u002F10.concepts\u002F20.modules",{"title":196,"path":197,"stem":198},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck\u002F","03.operate\u002F10.concepts\u002F30.deck",{"title":200,"path":201,"stem":202},"Labware","\u002Foperate\u002Fconcepts\u002Flabware\u002F","03.operate\u002F10.concepts\u002F40.labware",{"title":204,"path":205,"stem":206},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids\u002F","03.operate\u002F10.concepts\u002F50.liquids",{"title":208,"path":209,"stem":210},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes\u002F","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":212,"path":213,"stem":214},"Parameter Sets","\u002Foperate\u002Fconcepts\u002Fparameter-sets\u002F","03.operate\u002F10.concepts\u002F65.parameter-sets",{"title":216,"path":217,"stem":218},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips\u002F","03.operate\u002F10.concepts\u002F70.tips",{"title":220,"path":221,"stem":222},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation\u002F","03.operate\u002F10.concepts\u002F80.simulation",{"title":224,"path":225,"stem":226},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling\u002F","03.operate\u002F10.concepts\u002F90.error-handling",{"title":228,"path":229,"stem":230,"children":231,"page":42},"Guides","\u002Foperate\u002Fguides\u002F","03.operate\u002F20.guides",[232,261,273,297],{"title":200,"path":233,"stem":234,"children":235},"\u002Foperate\u002Fguides\u002Flabware\u002F","03.operate\u002F20.guides\u002F10.labware\u002Findex",[236,237,241,245,249,253,257],{"title":200,"path":233,"stem":234},{"title":238,"path":239,"stem":240},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware\u002F","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":242,"path":243,"stem":244},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates\u002F","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":246,"path":247,"stem":248},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks\u002F","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":250,"path":251,"stem":252},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks\u002F","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":254,"path":255,"stem":256},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs\u002F","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":258,"path":259,"stem":260},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters\u002F","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":196,"path":262,"stem":263,"children":264,"page":42},"\u002Foperate\u002Fguides\u002Fdeck\u002F","03.operate\u002F20.guides\u002F20.deck",[265,269],{"title":266,"path":267,"stem":268},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck\u002F","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":270,"path":271,"stem":272},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck\u002F","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":274,"path":275,"stem":276,"children":277,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting",[278,282,286,290,293],{"title":279,"path":280,"stem":281},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":283,"path":284,"stem":285},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":287,"path":288,"stem":289},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":208,"path":291,"stem":292},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":294,"path":295,"stem":296},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":220,"path":298,"stem":299},"\u002Foperate\u002Fguides\u002Fsimulation\u002F","03.operate\u002F20.guides\u002F40.simulation",{"title":301,"path":302,"stem":303,"children":304,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices\u002F","03.operate\u002F30.devices",[305,346,371,388,405],{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002F","03.operate\u002F30.devices\u002F10.hamilton-star",[310,314,318,322,326,330,334,338,342],{"title":311,"path":312,"stem":313},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":315,"path":316,"stem":317},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":319,"path":320,"stem":321},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":323,"path":324,"stem":325},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":327,"path":328,"stem":329},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":331,"path":332,"stem":333},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":335,"path":336,"stem":337},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":339,"path":340,"stem":341},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":343,"path":344,"stem":345},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":347,"path":348,"stem":349,"children":350,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage",[351,355,359,363,367],{"title":352,"path":353,"stem":354},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":356,"path":357,"stem":358},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":360,"path":361,"stem":362},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":364,"path":365,"stem":366},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":368,"path":369,"stem":370},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":372,"path":373,"stem":374,"children":375,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo",[376,379,382,385],{"title":287,"path":377,"stem":378},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":279,"path":380,"stem":381},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":208,"path":383,"stem":384},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":315,"path":386,"stem":387},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":389,"path":390,"stem":391,"children":392,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[393,397,401],{"title":394,"path":395,"stem":396},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":398,"path":399,"stem":400},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":402,"path":403,"stem":404},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":406,"path":407,"stem":408,"children":409,"page":42},"Tecan Freedom EVO","\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo",[410,414,417,420,424],{"title":411,"path":412,"stem":413},"Deck & Carriers","\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":287,"path":415,"stem":416},"\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo\u002F20.tip-handling",{"title":279,"path":418,"stem":419},"\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo\u002F30.basic-pipetting",{"title":421,"path":422,"stem":423},"Using the Gripper (RoMa)","\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo\u002F40.using-the-gripper",{"title":208,"path":425,"stem":426},"\u002Foperate\u002Fdevices\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","03.operate\u002F30.devices\u002F50.tecan-freedom-evo\u002F50.liquid-classes",{"title":428,"path":429,"stem":430,"children":431,"page":42},"Device Guides","\u002Fdevice-guides\u002F","06.device-guides",[432,435,448,465,478],{"title":428,"path":433,"stem":434},"\u002Fdevice-guides\u002Foverview\u002F","06.device-guides\u002F00.overview",{"title":436,"path":437,"stem":438,"children":439,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation\u002F","06.device-guides\u002F20.incubation",[440,444],{"title":441,"path":442,"stem":443},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc\u002F","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":445,"path":446,"stem":447},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila\u002F","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":449,"path":450,"stem":451,"children":452,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers\u002F","06.device-guides\u002F30.heater-shakers",[453,457,461],{"title":454,"path":455,"stem":456},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake\u002F","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":458,"path":459,"stem":460},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake\u002F","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":462,"path":463,"stem":464},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate\u002F","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":466,"path":467,"stem":468,"children":469,"page":42},"Readers","\u002Fdevice-guides\u002Freaders\u002F","06.device-guides\u002F40.readers",[470,474],{"title":471,"path":472,"stem":473},"Agilent Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5\u002F","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":475,"path":476,"stem":477},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1\u002F","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":479,"path":480,"stem":481,"children":482,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn\u002F","06.device-guides\u002F50.tilt-and-turn",[483,487],{"title":484,"path":485,"stem":486},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation\u002F","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":488,"path":489,"stem":490},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation\u002F","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":492,"path":493,"stem":494,"children":495,"page":42},"Automate","\u002Fautomate\u002F","07.automate",[496,500,504,508,557],{"title":497,"path":498,"stem":499},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow\u002F","07.automate\u002F00.what-is-a-workflow",{"title":501,"path":502,"stem":503},"Workflow template","\u002Fautomate\u002Fworkflow-template\u002F","07.automate\u002F05.workflow-template",{"title":505,"path":506,"stem":507},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow\u002F","07.automate\u002F08.your-first-workflow",{"title":102,"pages":509,"path":519,"stem":520,"children":521,"page":42},[510,511,512,513,514,515,516,517,518],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts\u002F","07.automate\u002F10.concepts",[522,526,530,534,538,542,546,550,554],{"title":523,"path":524,"stem":525},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow\u002F","07.automate\u002F10.concepts\u002F10.workflow",{"title":527,"path":528,"stem":529},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase\u002F","07.automate\u002F10.concepts\u002F20.phase",{"title":531,"path":532,"stem":533},"Step","\u002Fautomate\u002Fconcepts\u002Fstep\u002F","07.automate\u002F10.concepts\u002F30.step",{"title":535,"path":536,"stem":537},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns\u002F","07.automate\u002F10.concepts\u002F40.runs",{"title":539,"path":540,"stem":541},"Input","\u002Fautomate\u002Fconcepts\u002Finput\u002F","07.automate\u002F10.concepts\u002F50.input",{"title":543,"path":544,"stem":545},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts\u002F","07.automate\u002F10.concepts\u002F60.artifacts",{"title":547,"path":548,"stem":549},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs\u002F","07.automate\u002F10.concepts\u002F70.logs",{"title":551,"path":552,"stem":553},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop\u002F","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":224,"path":555,"stem":556},"\u002Fautomate\u002Fconcepts\u002Ferror-handling\u002F","07.automate\u002F10.concepts\u002F90.error-handling",{"title":228,"path":558,"stem":559,"children":560,"page":42},"\u002Fautomate\u002Fguides\u002F","07.automate\u002F25.guides",[561,565,569,573,577,581,585,589,593],{"title":562,"path":563,"stem":564},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow\u002F","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":566,"path":567,"stem":568},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow\u002F","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":570,"path":571,"stem":572},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows\u002F","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":574,"path":575,"stem":576},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl\u002F","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":578,"path":579,"stem":580},"Slack notifications and operator confirmation","\u002Fautomate\u002Fguides\u002Fslack-notifications\u002F","07.automate\u002F25.guides\u002F52.slack-notifications",{"title":582,"path":583,"stem":584},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs\u002F","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":586,"path":587,"stem":588},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling\u002F","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":590,"path":591,"stem":592},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling\u002F","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":594,"path":595,"stem":596},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api\u002F","07.automate\u002F25.guides\u002F80.workflows-api",{"title":598,"path":599,"stem":600,"children":601,"page":42},"Observe","\u002Fobserve\u002F","08.observe",[602,606,622],{"title":603,"path":604,"stem":605},"Overview","\u002Fobserve\u002Foverview\u002F","08.observe\u002F10.overview",{"title":102,"path":607,"stem":608,"children":609,"page":42},"\u002Fobserve\u002Fconcepts\u002F","08.observe\u002F20.concepts",[610,614,618],{"title":611,"path":612,"stem":613},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage\u002F","08.observe\u002F20.concepts\u002F10.storage",{"title":615,"path":616,"stem":617},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets\u002F","08.observe\u002F20.concepts\u002F20.secrets",{"title":619,"path":620,"stem":621},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources\u002F","08.observe\u002F20.concepts\u002F30.data-sources",{"title":228,"path":623,"stem":624,"children":625,"page":42},"\u002Fobserve\u002Fguides\u002F","08.observe\u002F30.guides",[626,630],{"title":627,"path":628,"stem":629},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector\u002F","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":631,"path":632,"stem":633},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl\u002F","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":635,"path":636,"stem":637,"children":638,"page":42},"Technical Reference","\u002Ftechnical-reference\u002F","10.technical-reference",[639,643,647,659,670,681,691,702],{"title":640,"path":641,"stem":642},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint\u002F","10.technical-reference\u002F00.platform-blueprint",{"title":644,"path":645,"stem":646},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","10.technical-reference\u002F01.rest-api",{"title":61,"path":648,"stem":649,"children":650,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","10.technical-reference\u002F10.groundcontrol",[651,655],{"title":652,"path":653,"stem":654},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall\u002F","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":656,"path":657,"stem":658},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":660,"path":661,"stem":662,"children":663,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","10.technical-reference\u002F20.python-sdk",[664,667],{"title":652,"path":665,"stem":666},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall\u002F","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":656,"path":668,"stem":669},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":671,"path":672,"stem":673,"children":674,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk",[675,678],{"title":652,"path":676,"stem":677},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":656,"path":679,"stem":680},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":200,"path":682,"stem":683,"children":684,"page":42},"\u002Ftechnical-reference\u002Flabware\u002F","10.technical-reference\u002F40.labware",[685,688],{"title":652,"path":686,"stem":687},"\u002Ftechnical-reference\u002Flabware\u002Finstall\u002F","10.technical-reference\u002F40.labware\u002F10.install",{"title":656,"path":689,"stem":690},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":692,"path":693,"stem":694,"children":695,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","10.technical-reference\u002F50.python-omnibus",[696,699],{"title":652,"path":697,"stem":698},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall\u002F","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":656,"path":700,"stem":701},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":703,"path":704,"stem":705,"children":706,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","10.technical-reference\u002F60.python-cdk",[707,710],{"title":652,"path":708,"stem":709},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall\u002F","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":656,"path":711,"stem":712},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":714,"path":715,"stem":716,"children":717},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[718,720,740,773,781,820],{"title":714,"path":715,"stem":719},"20.connector-development\u002Findex",{"title":721,"path":722,"stem":723,"children":724,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[725,728,732,736],{"title":603,"path":726,"stem":727},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":729,"path":730,"stem":731},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":733,"path":734,"stem":735},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":737,"path":738,"stem":739},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":741,"path":742,"stem":743,"children":744,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[745,749,753,757,761,765,769],{"title":746,"path":747,"stem":748},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":750,"path":751,"stem":752},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":754,"path":755,"stem":756},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":758,"path":759,"stem":760},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":762,"path":763,"stem":764},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":766,"path":767,"stem":768},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":770,"path":771,"stem":772},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":102,"path":774,"stem":775,"children":776,"page":42},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[777],{"title":778,"path":779,"stem":780},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":228,"path":782,"stem":783,"children":784,"page":42},"\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[785,789,793,797,801,805,809,812,816],{"title":786,"path":787,"stem":788},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":790,"path":791,"stem":792},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":794,"path":795,"stem":796},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":798,"path":799,"stem":800},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":802,"path":803,"stem":804},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":806,"path":807,"stem":808},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":224,"path":810,"stem":811},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":813,"path":814,"stem":815},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":817,"path":818,"stem":819},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":821,"path":822,"stem":823,"children":824},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[825],{"title":821,"path":822,"stem":823},{"id":827,"title":806,"body":828,"description":1470,"extension":1471,"links":1472,"meta":1473,"navigation":879,"path":1474,"seo":1475,"stem":808,"__hash__":1476},"docs\u002F20.connector-development\u002F40.guides\u002F46.execution-modes.md",{"type":829,"value":830,"toc":1466},"minimark",[831,835,851,1282,1292,1306,1357,1381,1386,1409,1413,1429,1462],[832,833,834],"p",{},"By default, a SiLA command can be executed by multiple clients at the same time, and each invocation runs independently. That's the right behavior for most commands, but not all of them - a command that moves a physical axis, writes to a shared resource, or otherwise can't tolerate overlapping executions needs the server to coordinate concurrent calls instead of just running them all at once.",[832,836,837,838,842,843,846,847,850],{},"The ",[839,840,841],"code",{},"mode"," argument on ",[839,844,845],{},"sila.ObservableCommand"," and ",[839,848,849],{},"sila.UnobservableCommand"," controls exactly this: what the server does when a client calls a command while a previous invocation of that same command is still running.",[852,853,859],"pre",{"className":854,"code":855,"filename":856,"language":857,"meta":858,"style":858},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","import asyncio\n\nfrom unitelabs.cdk import sila\n\n\nclass ExecutionModeTutorialService(sila.Feature):\n    @sila.ObservableCommand(mode=sila.ExecutionMode.PARALLEL)\n    async def run_parallel(self, duration: float, *, status: sila.Status) -> None:\n        \"\"\"\n        Run for `duration` seconds. This is the default execution mode.\n\n        Args:\n          Duration: How many seconds this command should run for.\n        \"\"\"\n        status.update(progress=0)\n        await asyncio.sleep(duration)\n        status.update(progress=1)\n\n    @sila.ObservableCommand(mode=sila.ExecutionMode.QUEUED)\n    async def run_queued(self, duration: float, *, status: sila.Status) -> None:\n        \"\"\"\n        Run for `duration` seconds, queueing concurrent invocations.\n\n        Args:\n          Duration: How many seconds this command should run for.\n        \"\"\"\n        status.update(progress=0)\n        await asyncio.sleep(duration)\n        status.update(progress=1)\n\n    @sila.ObservableCommand(mode=sila.ExecutionMode.SINGLE)\n    async def run_single(self, duration: float, *, status: sila.Status) -> None:\n        \"\"\"\n        Run for `duration` seconds, rejecting concurrent invocations.\n\n        Args:\n          Duration: How many seconds this command should run for.\n        \"\"\"\n        status.update(progress=0)\n        await asyncio.sleep(duration)\n        status.update(progress=1)\n","src\u002Funitelabs\u002Ftutorial\u002Ffeatures\u002Fexecution_modes.py","python","",[839,860,861,874,881,895,900,905,930,953,986,993,999,1004,1010,1016,1021,1037,1046,1060,1065,1083,1107,1112,1118,1123,1128,1133,1138,1151,1158,1171,1176,1194,1218,1223,1229,1234,1239,1244,1249,1262,1269],{"__ignoreMap":858},[862,863,866,870],"span",{"class":864,"line":865},"line",1,[862,867,869],{"class":868},"sxkbv","import",[862,871,873],{"class":872},"sc-9e"," asyncio\n",[862,875,877],{"class":864,"line":876},2,[862,878,880],{"emptyLinePlaceholder":879},true,"\n",[862,882,884,887,890,892],{"class":864,"line":883},3,[862,885,886],{"class":868},"from",[862,888,889],{"class":872}," unitelabs.cdk ",[862,891,869],{"class":868},[862,893,894],{"class":872}," sila\n",[862,896,898],{"class":864,"line":897},4,[862,899,880],{"emptyLinePlaceholder":879},[862,901,903],{"class":864,"line":902},5,[862,904,880],{"emptyLinePlaceholder":879},[862,906,908,911,915,918,922,925,927],{"class":864,"line":907},6,[862,909,910],{"class":868},"class",[862,912,914],{"class":913},"sNqAu"," ExecutionModeTutorialService",[862,916,917],{"class":872},"(",[862,919,921],{"class":920},"sOiAX","sila",[862,923,924],{"class":872},".",[862,926,766],{"class":920},[862,928,929],{"class":872},"):\n",[862,931,933,937,939,941,944,947,950],{"class":864,"line":932},7,[862,934,936],{"class":935},"s4qFZ","    @sila.ObservableCommand",[862,938,917],{"class":872},[862,940,841],{"class":913},[862,942,943],{"class":868},"=",[862,945,946],{"class":872},"sila.ExecutionMode.",[862,948,949],{"class":920},"PARALLEL",[862,951,952],{"class":872},")\n",[862,954,956,959,962,965,968,971,974,977,980,983],{"class":864,"line":955},8,[862,957,958],{"class":868},"    async",[862,960,961],{"class":868}," def",[862,963,964],{"class":935}," run_parallel",[862,966,967],{"class":872},"(self, duration: ",[862,969,970],{"class":920},"float",[862,972,973],{"class":872},", ",[862,975,976],{"class":868},"*",[862,978,979],{"class":872},", status: sila.Status) -> ",[862,981,982],{"class":920},"None",[862,984,985],{"class":872},":\n",[862,987,989],{"class":864,"line":988},9,[862,990,992],{"class":991},"sCx38","        \"\"\"\n",[862,994,996],{"class":864,"line":995},10,[862,997,998],{"class":991},"        Run for `duration` seconds. This is the default execution mode.\n",[862,1000,1002],{"class":864,"line":1001},11,[862,1003,880],{"emptyLinePlaceholder":879},[862,1005,1007],{"class":864,"line":1006},12,[862,1008,1009],{"class":991},"        Args:\n",[862,1011,1013],{"class":864,"line":1012},13,[862,1014,1015],{"class":991},"          Duration: How many seconds this command should run for.\n",[862,1017,1019],{"class":864,"line":1018},14,[862,1020,992],{"class":991},[862,1022,1024,1027,1030,1032,1035],{"class":864,"line":1023},15,[862,1025,1026],{"class":872},"        status.update(",[862,1028,1029],{"class":913},"progress",[862,1031,943],{"class":868},[862,1033,1034],{"class":920},"0",[862,1036,952],{"class":872},[862,1038,1040,1043],{"class":864,"line":1039},16,[862,1041,1042],{"class":868},"        await",[862,1044,1045],{"class":872}," asyncio.sleep(duration)\n",[862,1047,1049,1051,1053,1055,1058],{"class":864,"line":1048},17,[862,1050,1026],{"class":872},[862,1052,1029],{"class":913},[862,1054,943],{"class":868},[862,1056,1057],{"class":920},"1",[862,1059,952],{"class":872},[862,1061,1063],{"class":864,"line":1062},18,[862,1064,880],{"emptyLinePlaceholder":879},[862,1066,1068,1070,1072,1074,1076,1078,1081],{"class":864,"line":1067},19,[862,1069,936],{"class":935},[862,1071,917],{"class":872},[862,1073,841],{"class":913},[862,1075,943],{"class":868},[862,1077,946],{"class":872},[862,1079,1080],{"class":920},"QUEUED",[862,1082,952],{"class":872},[862,1084,1086,1088,1090,1093,1095,1097,1099,1101,1103,1105],{"class":864,"line":1085},20,[862,1087,958],{"class":868},[862,1089,961],{"class":868},[862,1091,1092],{"class":935}," run_queued",[862,1094,967],{"class":872},[862,1096,970],{"class":920},[862,1098,973],{"class":872},[862,1100,976],{"class":868},[862,1102,979],{"class":872},[862,1104,982],{"class":920},[862,1106,985],{"class":872},[862,1108,1110],{"class":864,"line":1109},21,[862,1111,992],{"class":991},[862,1113,1115],{"class":864,"line":1114},22,[862,1116,1117],{"class":991},"        Run for `duration` seconds, queueing concurrent invocations.\n",[862,1119,1121],{"class":864,"line":1120},23,[862,1122,880],{"emptyLinePlaceholder":879},[862,1124,1126],{"class":864,"line":1125},24,[862,1127,1009],{"class":991},[862,1129,1131],{"class":864,"line":1130},25,[862,1132,1015],{"class":991},[862,1134,1136],{"class":864,"line":1135},26,[862,1137,992],{"class":991},[862,1139,1141,1143,1145,1147,1149],{"class":864,"line":1140},27,[862,1142,1026],{"class":872},[862,1144,1029],{"class":913},[862,1146,943],{"class":868},[862,1148,1034],{"class":920},[862,1150,952],{"class":872},[862,1152,1154,1156],{"class":864,"line":1153},28,[862,1155,1042],{"class":868},[862,1157,1045],{"class":872},[862,1159,1161,1163,1165,1167,1169],{"class":864,"line":1160},29,[862,1162,1026],{"class":872},[862,1164,1029],{"class":913},[862,1166,943],{"class":868},[862,1168,1057],{"class":920},[862,1170,952],{"class":872},[862,1172,1174],{"class":864,"line":1173},30,[862,1175,880],{"emptyLinePlaceholder":879},[862,1177,1179,1181,1183,1185,1187,1189,1192],{"class":864,"line":1178},31,[862,1180,936],{"class":935},[862,1182,917],{"class":872},[862,1184,841],{"class":913},[862,1186,943],{"class":868},[862,1188,946],{"class":872},[862,1190,1191],{"class":920},"SINGLE",[862,1193,952],{"class":872},[862,1195,1197,1199,1201,1204,1206,1208,1210,1212,1214,1216],{"class":864,"line":1196},32,[862,1198,958],{"class":868},[862,1200,961],{"class":868},[862,1202,1203],{"class":935}," run_single",[862,1205,967],{"class":872},[862,1207,970],{"class":920},[862,1209,973],{"class":872},[862,1211,976],{"class":868},[862,1213,979],{"class":872},[862,1215,982],{"class":920},[862,1217,985],{"class":872},[862,1219,1221],{"class":864,"line":1220},33,[862,1222,992],{"class":991},[862,1224,1226],{"class":864,"line":1225},34,[862,1227,1228],{"class":991},"        Run for `duration` seconds, rejecting concurrent invocations.\n",[862,1230,1232],{"class":864,"line":1231},35,[862,1233,880],{"emptyLinePlaceholder":879},[862,1235,1237],{"class":864,"line":1236},36,[862,1238,1009],{"class":991},[862,1240,1242],{"class":864,"line":1241},37,[862,1243,1015],{"class":991},[862,1245,1247],{"class":864,"line":1246},38,[862,1248,992],{"class":991},[862,1250,1252,1254,1256,1258,1260],{"class":864,"line":1251},39,[862,1253,1026],{"class":872},[862,1255,1029],{"class":913},[862,1257,943],{"class":868},[862,1259,1034],{"class":920},[862,1261,952],{"class":872},[862,1263,1265,1267],{"class":864,"line":1264},40,[862,1266,1042],{"class":868},[862,1268,1045],{"class":872},[862,1270,1272,1274,1276,1278,1280],{"class":864,"line":1271},41,[862,1273,1026],{"class":872},[862,1275,1029],{"class":913},[862,1277,943],{"class":868},[862,1279,1057],{"class":920},[862,1281,952],{"class":872},[832,1283,1284],{},[1285,1286,1287,1291],"small",{},[1288,1289,1290],"strong",{},"Listing 1",": The same command implementation, run under all three execution modes.",[832,1293,1294,1295,973,1298,1301,1302,1305],{},"Calling ",[839,1296,1297],{},"run_parallel",[839,1299,1300],{},"run_queued",", and ",[839,1303,1304],{},"run_single"," a second time - while the first call is still sleeping - demonstrates the difference between the three modes:",[1307,1308,1309,1322],"table",{},[1310,1311,1312],"thead",{},[1313,1314,1315,1319],"tr",{},[1316,1317,1318],"th",{},"Mode",[1316,1320,1321],{},"Behavior",[1323,1324,1325,1337,1347],"tbody",{},[1313,1326,1327,1334],{},[1328,1329,1330,1333],"td",{},[839,1331,1332],{},"sila.ExecutionMode.PARALLEL"," (default)",[1328,1335,1336],{},"No coordination. Every invocation runs independently, with no limit on how many can be in flight at once.",[1313,1338,1339,1344],{},[1328,1340,1341],{},[839,1342,1343],{},"sila.ExecutionMode.QUEUED",[1328,1345,1346],{},"The second call is accepted immediately, but its execution waits until the first one finishes. Invocations of the same command run one after another, in the order they were received.",[1313,1348,1349,1354],{},[1328,1350,1351],{},[839,1352,1353],{},"sila.ExecutionMode.SINGLE",[1328,1355,1356],{},"The second call is rejected outright while the first is still running - it is never queued.",[1358,1359,1362],"callout",{"color":1360,"icon":1361},"neutral","i-heroicons-magnifying-glass",[832,1363,1364,1365,1368,1369,1371,1372,1374,1375,1377,1378,1380],{},"Execution mode only coordinates repeated calls to the ",[1288,1366,1367],{},"same"," command. ",[839,1370,1080],{}," or ",[839,1373,1191],{}," on ",[839,1376,1300],{}," has no effect on calls to ",[839,1379,1297],{}," or any other command - each command is tracked independently.",[1382,1383,1385],"h2",{"id":1384},"choosing-a-mode","Choosing a mode",[1387,1388,1389,1399,1404],"ul",{},[1390,1391,1392,1393,1395,1396,1398],"li",{},"Use ",[839,1394,949],{}," for anything stateless or safe to run concurrently, such as reading a sensor value multiple times. This is the default, so most commands don't need to set ",[839,1397,841],{}," at all.",[1390,1400,1392,1401,1403],{},[839,1402,1080],{}," when overlapping executions are safe to run eventually, but not at the same time - for example, a command that moves a shared stage: every request should still complete, just not simultaneously.",[1390,1405,1392,1406,1408],{},[839,1407,1191],{}," when a second, overlapping request should never happen, and calling it anyway is a client error worth surfacing immediately - a command that isn't idempotent, or hardware that has no way to serialize two in-flight commands safely.",[1382,1410,1412],{"id":1411},"handling-rejected-invocations","Handling rejected invocations",[832,1414,1415,1416,1418,1419,1422,1423,1428],{},"Under ",[839,1417,1191],{}," mode, an invocation that arrives while another is still running fails with the SiLA framework error ",[839,1420,1421],{},"CommandExecutionNotAccepted",". This is raised by the SiLA framework itself, not by your command implementation, so there's nothing to catch or declare - see ",[1424,1425,1427],"a",{"href":1426},"\u002Fconnector-development\u002Fguides\u002Ferror-handling#framework-errors","Framework Errors"," for how these are surfaced to the client.",[832,1430,1431,1432,1435,1436,1440,1441,1443,1444,1446,1447,1450,1451,846,1453,1455,1456,1458,1459,1461],{},"For ",[839,1433,1434],{},"ObservableCommand",", this distinction shows up in ",[1437,1438,1439],"em",{},"when"," the client finds out: ",[839,1442,1080],{}," confirms the execution immediately and only delays the underlying work, while ",[839,1445,1191],{}," fails the initiating call itself. For ",[839,1448,1449],{},"UnobservableCommand",", both ",[839,1452,1080],{},[839,1454,1191],{}," affect the single blocking call the client makes - ",[839,1457,1080],{}," simply delays the response, while ",[839,1460,1191],{}," fails it immediately.",[1463,1464,1465],"style",{},"html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .s4qFZ, html code.shiki .s4qFZ{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#D2A8FF}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":858,"searchDepth":865,"depth":876,"links":1467},[1468,1469],{"id":1384,"depth":876,"text":1385},{"id":1411,"depth":876,"text":1412},"Controlling how the server handles concurrent invocations of the same SiLA command.","md",null,{},"\u002Fconnector-development\u002Fguides\u002Fexecution-modes",{"title":806,"description":1470},"Lr2d0xpfatOLTIsdzAPMC_tzUuWt_frXyi1ZaAZ4Avw",[1478,1480],{"title":802,"path":803,"stem":804,"description":1479,"children":-1},"Creating and managing continuously updating data streams, pipelines and filters.",{"title":224,"path":810,"stem":811,"description":1481,"children":-1},"Errors happen. This guide shows how to handle them gracefully in your SiLA 2 connector - so clients and users stay informed, not confused.",1790863981322]