[{"data":1,"prerenderedAt":1442},["ShallowReactive",2],{"navigation":3,"\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run":750,"\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run-surround":1437},[4,80,134,364,428,530,567,646],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","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","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","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","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","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","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","\u002Foperate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":159,"path":160,"stem":161},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":163,"path":164,"stem":165},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":167,"path":168,"stem":169},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":179,"path":180,"stem":181},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":229,"path":230,"stem":231},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":171,"path":250,"stem":251},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":179,"path":257,"stem":258},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[264,305,330,347],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":323,"path":324,"stem":325},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":327,"path":328,"stem":329},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":331,"path":332,"stem":333,"children":334,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[335,338,341,344],{"title":246,"path":336,"stem":337},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":238,"path":339,"stem":340},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":171,"path":342,"stem":343},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":274,"path":345,"stem":346},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":348,"path":349,"stem":350,"children":351,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[352,356,360],{"title":353,"path":354,"stem":355},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":357,"path":358,"stem":359},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":361,"path":362,"stem":363},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":365,"path":366,"stem":367,"children":368,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[369,372,385,402,415],{"title":365,"path":370,"stem":371},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":373,"path":374,"stem":375,"children":376,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[377,381],{"title":378,"path":379,"stem":380},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":382,"path":383,"stem":384},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[390,394,398],{"title":391,"path":392,"stem":393},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":395,"path":396,"stem":397},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":399,"path":400,"stem":401},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":403,"path":404,"stem":405,"children":406,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[407,411],{"title":408,"path":409,"stem":410},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":412,"path":413,"stem":414},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":416,"path":417,"stem":418,"children":419,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[420,424],{"title":421,"path":422,"stem":423},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":425,"path":426,"stem":427},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":429,"path":430,"stem":431,"children":432,"page":42},"Automate","\u002Fautomate","07.automate",[433,437,441,445,494],{"title":434,"path":435,"stem":436},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":438,"path":439,"stem":440},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":442,"path":443,"stem":444},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":446,"path":456,"stem":457,"children":458,"page":42},[447,448,449,450,451,452,453,454,455],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[459,463,467,471,475,479,483,487,491],{"title":460,"path":461,"stem":462},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":464,"path":465,"stem":466},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":468,"path":469,"stem":470},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":472,"path":473,"stem":474},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":476,"path":477,"stem":478},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":480,"path":481,"stem":482},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":484,"path":485,"stem":486},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":488,"path":489,"stem":490},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":183,"path":492,"stem":493},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":495,"stem":496,"children":497,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[498,502,506,510,514,518,522,526],{"title":499,"path":500,"stem":501},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":503,"path":504,"stem":505},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":507,"path":508,"stem":509},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":511,"path":512,"stem":513},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":515,"path":516,"stem":517},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":519,"path":520,"stem":521},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":523,"path":524,"stem":525},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":527,"path":528,"stem":529},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":531,"path":532,"stem":533,"children":534,"page":42},"Observe","\u002Fobserve","08.observe",[535,539,555],{"title":536,"path":537,"stem":538},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":540,"stem":541,"children":542,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[543,547,551],{"title":544,"path":545,"stem":546},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":548,"path":549,"stem":550},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":552,"path":553,"stem":554},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":187,"path":556,"stem":557,"children":558,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[559,563],{"title":560,"path":561,"stem":562},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":564,"path":565,"stem":566},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":568,"path":569,"stem":570,"children":571,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[572,576,580,592,603,614,624,635],{"title":573,"path":574,"stem":575},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":577,"path":578,"stem":579},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":581,"stem":582,"children":583,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[584,588],{"title":585,"path":586,"stem":587},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":589,"path":590,"stem":591},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":593,"path":594,"stem":595,"children":596,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[597,600],{"title":585,"path":598,"stem":599},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":589,"path":601,"stem":602},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":604,"path":605,"stem":606,"children":607,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[608,611],{"title":585,"path":609,"stem":610},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":589,"path":612,"stem":613},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":163,"path":615,"stem":616,"children":617,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[618,621],{"title":585,"path":619,"stem":620},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":589,"path":622,"stem":623},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":625,"path":626,"stem":627,"children":628,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[629,632],{"title":585,"path":630,"stem":631},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":589,"path":633,"stem":634},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":636,"path":637,"stem":638,"children":639,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[640,643],{"title":585,"path":641,"stem":642},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":589,"path":644,"stem":645},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":647,"path":648,"stem":649,"children":650},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[651,653,672,705,713,744],{"title":647,"path":648,"stem":652},"20.connector-development\u002Findex",{"title":654,"path":655,"stem":656,"children":657,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[658,661,665,668],{"title":536,"path":659,"stem":660},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":662,"path":663,"stem":664},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":666,"stem":667},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":669,"path":670,"stem":671},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":673,"path":674,"stem":675,"children":676,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[677,681,685,689,693,697,701],{"title":678,"path":679,"stem":680},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":682,"path":683,"stem":684},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":686,"path":687,"stem":688},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":690,"path":691,"stem":692},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":694,"path":695,"stem":696},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":698,"path":699,"stem":700},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":702,"path":703,"stem":704},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":706,"stem":707,"children":708,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[709],{"title":710,"path":711,"stem":712},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":187,"path":714,"stem":715,"children":716,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[717,721,725,729,733,736,740],{"title":718,"path":719,"stem":720},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":722,"path":723,"stem":724},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":726,"path":727,"stem":728},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":730,"path":731,"stem":732},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":183,"path":734,"stem":735},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":737,"path":738,"stem":739},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":741,"path":742,"stem":743},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":745,"path":746,"stem":747,"children":748},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[749],{"title":745,"path":746,"stem":747},{"id":751,"title":353,"body":752,"description":1431,"extension":1432,"links":1433,"meta":1434,"navigation":858,"path":354,"seo":1435,"stem":355,"__hash__":1436},"docs\u002F03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run.md",{"type":753,"value":754,"toc":1424},"minimark",[755,767,783,788,810,815,818,909,921,925,928,1080,1111,1115,1122,1166,1170,1177,1300,1325,1329,1332,1344,1359,1404,1420],[756,757,759],"callout",{"icon":758},"i-heroicons-information-circle",[760,761,762,766],"p",{},[763,764,765],"strong",{},"Different integration model",": Unlike Hamilton STAR\u002FVantage and Agilent Bravo — which expose instrument commands directly through the SDK's typed deck and labware model — FluentControl is driven through a method defined inside the FluentControl software. The SDK prepares and starts that method; FluentControl handles the actual instrument control. If the method is fully configured in FluentControl, no further interaction is needed — the SDK simply triggers it and waits. For dynamic control, the method can include an XML execution channel step, which lets the SDK stream commands into the running method to configure the worktable, register labware, and trigger liquid handling at runtime.",[760,768,769,770,774,775,778,779,782],{},"The FluentControl connector exposes two controller interfaces on the ",[771,772,773],"code",{},"Service"," object. The ",[771,776,777],{},"runtime_controller"," manages the lifecycle of a named method in the FluentControl software — preparing, starting, and closing it. The ",[771,780,781],{},"execution_channel_controller"," is an XML message bus that becomes available while the method is running, through which commands are streamed to the instrument. Commands can only be sent through the XML channel while a method is actively executing.",[760,784,785],{},[763,786,787],{},"Prerequisites",[789,790,791,795,798,801],"ul",{},[792,793,794],"li",{},"A running Tecan FluentControl instrument with the FluentControl software open",[792,796,797],{},"A named method configured in the FluentControl software",[792,799,800],{},"A running Tecan FluentControl connector registered in the UniteLabs platform",[792,802,803,804,809],{},"The UniteLabs SDK installed (see the ",[805,806,808],"a",{"href":807},"\u002Fautomate\u002Fwhat-is-a-workflow\u002F","SDK getting started guide",")",[811,812,814],"h2",{"id":813},"connect-to-the-connector","Connect to the Connector",[760,816,817],{},"Retrieve the FluentControl service by the connector name registered in the platform. The name must match exactly.",[819,820,825],"pre",{"className":821,"code":822,"language":823,"meta":824,"style":824},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from unitelabs.sdk import AsyncApiClient\n\nclient = AsyncApiClient()\nservice = await client.get_service_by_name(\"Tecan FluentControl\")\n","python","",[771,826,827,853,860,876],{"__ignoreMap":824},[828,829,832,836,840,844,847,850],"span",{"class":830,"line":831},"line",1,[828,833,835],{"class":834},"s7zQu","from",[828,837,839],{"class":838},"sTEyZ"," unitelabs",[828,841,843],{"class":842},"sMK4o",".",[828,845,846],{"class":838},"sdk ",[828,848,849],{"class":834},"import",[828,851,852],{"class":838}," AsyncApiClient\n",[828,854,856],{"class":830,"line":855},2,[828,857,859],{"emptyLinePlaceholder":858},true,"\n",[828,861,863,866,869,873],{"class":830,"line":862},3,[828,864,865],{"class":838},"client ",[828,867,868],{"class":842},"=",[828,870,872],{"class":871},"s2Zo4"," AsyncApiClient",[828,874,875],{"class":842},"()\n",[828,877,879,882,884,887,890,892,895,898,901,904,906],{"class":830,"line":878},4,[828,880,881],{"class":838},"service ",[828,883,868],{"class":842},[828,885,886],{"class":834}," await",[828,888,889],{"class":838}," client",[828,891,843],{"class":842},[828,893,894],{"class":871},"get_service_by_name",[828,896,897],{"class":842},"(",[828,899,900],{"class":842},"\"",[828,902,348],{"class":903},"sfazB",[828,905,900],{"class":842},[828,907,908],{"class":842},")\n",[760,910,911,912,915,916,918,919,843],{},"The returned ",[771,913,914],{},"service"," object exposes both ",[771,917,781],{}," and ",[771,920,777],{},[811,922,924],{"id":923},"check-and-reset-the-channel","Check and Reset the Channel",[760,926,927],{},"Before starting a new session, verify that no XML channel is already open from a previous run. If one is, close it before proceeding.",[819,929,931],{"className":821,"code":930,"language":823,"meta":824,"style":824},"import asyncio\n\nawait asyncio.sleep(2)  # let the system state settle before reading channel status\nis_alive = await service.execution_channel_controller.get_is_alive()\n\nif is_alive:\n    channel = await service.execution_channel_controller.get_channel()\n    print(f\"Closing open channel: {channel}\")\n    await service.execution_channel_controller.finish_command()\n",[771,932,933,940,944,969,993,998,1010,1033,1061],{"__ignoreMap":824},[828,934,935,937],{"class":830,"line":831},[828,936,849],{"class":834},[828,938,939],{"class":838}," asyncio\n",[828,941,942],{"class":830,"line":855},[828,943,859],{"emptyLinePlaceholder":858},[828,945,946,949,952,954,957,959,963,965],{"class":830,"line":862},[828,947,948],{"class":834},"await",[828,950,951],{"class":838}," asyncio",[828,953,843],{"class":842},[828,955,956],{"class":871},"sleep",[828,958,897],{"class":842},[828,960,962],{"class":961},"sbssI","2",[828,964,809],{"class":842},[828,966,968],{"class":967},"sHwdD","  # let the system state settle before reading channel status\n",[828,970,971,974,976,978,981,983,986,988,991],{"class":830,"line":878},[828,972,973],{"class":838},"is_alive ",[828,975,868],{"class":842},[828,977,886],{"class":834},[828,979,980],{"class":838}," service",[828,982,843],{"class":842},[828,984,781],{"class":985},"swJcz",[828,987,843],{"class":842},[828,989,990],{"class":871},"get_is_alive",[828,992,875],{"class":842},[828,994,996],{"class":830,"line":995},5,[828,997,859],{"emptyLinePlaceholder":858},[828,999,1001,1004,1007],{"class":830,"line":1000},6,[828,1002,1003],{"class":834},"if",[828,1005,1006],{"class":838}," is_alive",[828,1008,1009],{"class":842},":\n",[828,1011,1013,1016,1018,1020,1022,1024,1026,1028,1031],{"class":830,"line":1012},7,[828,1014,1015],{"class":838},"    channel ",[828,1017,868],{"class":842},[828,1019,886],{"class":834},[828,1021,980],{"class":838},[828,1023,843],{"class":842},[828,1025,781],{"class":985},[828,1027,843],{"class":842},[828,1029,1030],{"class":871},"get_channel",[828,1032,875],{"class":842},[828,1034,1036,1039,1041,1045,1048,1051,1054,1057,1059],{"class":830,"line":1035},8,[828,1037,1038],{"class":871},"    print",[828,1040,897],{"class":842},[828,1042,1044],{"class":1043},"spNyl","f",[828,1046,1047],{"class":903},"\"Closing open channel: ",[828,1049,1050],{"class":961},"{",[828,1052,1053],{"class":871},"channel",[828,1055,1056],{"class":961},"}",[828,1058,900],{"class":903},[828,1060,908],{"class":842},[828,1062,1064,1067,1069,1071,1073,1075,1078],{"class":830,"line":1063},9,[828,1065,1066],{"class":834},"    await",[828,1068,980],{"class":838},[828,1070,843],{"class":842},[828,1072,781],{"class":985},[828,1074,843],{"class":842},[828,1076,1077],{"class":871},"finish_command",[828,1079,875],{"class":842},[756,1081,1084],{"icon":1082,"color":1083},"i-heroicons-exclamation-triangle","amber",[760,1085,1086,1089,1090,1093,1094,1097,1098,1102,1103,1106,1107,1110],{},[763,1087,1088],{},"Important",": If ",[771,1091,1092],{},"get_is_alive()"," returns ",[771,1095,1096],{},"True",", FluentControl is still in ",[1099,1100,1101],"em",{},"Advanced Worklist Execution"," mode from a prior run. Calling ",[771,1104,1105],{},"prepare_method()"," in this state will raise an exception — FluentControl cannot accept a new method preparation while the previous execution channel is still open. Call ",[771,1108,1109],{},"finish_command()"," first to return it to EditMode.",[811,1112,1114],{"id":1113},"list-available-methods","List Available Methods",[760,1116,1117,1118,1121],{},"Use ",[771,1119,1120],{},"get_runnable_methods()"," to retrieve the method names available in the connected FluentControl software. Method names are case-sensitive.",[819,1123,1125],{"className":821,"code":1124,"language":823,"meta":824,"style":824},"methods = await service.runtime_controller.get_runnable_methods()\nprint(methods)\n# [\"plate_prep\", \"dilution_series\", \"demo\"]\n",[771,1126,1127,1149,1161],{"__ignoreMap":824},[828,1128,1129,1132,1134,1136,1138,1140,1142,1144,1147],{"class":830,"line":831},[828,1130,1131],{"class":838},"methods ",[828,1133,868],{"class":842},[828,1135,886],{"class":834},[828,1137,980],{"class":838},[828,1139,843],{"class":842},[828,1141,777],{"class":985},[828,1143,843],{"class":842},[828,1145,1146],{"class":871},"get_runnable_methods",[828,1148,875],{"class":842},[828,1150,1151,1154,1156,1159],{"class":830,"line":855},[828,1152,1153],{"class":871},"print",[828,1155,897],{"class":842},[828,1157,1158],{"class":871},"methods",[828,1160,908],{"class":842},[828,1162,1163],{"class":830,"line":862},[828,1164,1165],{"class":967},"# [\"plate_prep\", \"dilution_series\", \"demo\"]\n",[811,1167,1169],{"id":1168},"prepare-and-start-the-method","Prepare and Start the Method",[760,1171,1172,1173,1176],{},"Prepare the method by name, then start it. After calling ",[771,1174,1175],{},"run_method()",", wait for the XML channel to become ready before sending any commands.",[819,1178,1180],{"className":821,"code":1179,"language":823,"meta":824,"style":824},"await service.runtime_controller.prepare_method(method=\"plate_prep\")\nawait service.runtime_controller.run_method()\n\n# Simple: fixed wait for the XML channel to open (used in the reference implementation)\nawait asyncio.sleep(3)\n\n# Robust alternative: poll until the channel is ready, with a timeout\n# for _ in range(20):\n#     if await service.execution_channel_controller.get_is_alive():\n#         break\n#     await asyncio.sleep(0.5)\n# else:\n#     raise TimeoutError(\"XML channel did not open within 10 seconds\")\n",[771,1181,1182,1214,1231,1235,1240,1257,1261,1266,1271,1276,1282,1288,1294],{"__ignoreMap":824},[828,1183,1184,1186,1188,1190,1192,1194,1197,1199,1203,1205,1207,1210,1212],{"class":830,"line":831},[828,1185,948],{"class":834},[828,1187,980],{"class":838},[828,1189,843],{"class":842},[828,1191,777],{"class":985},[828,1193,843],{"class":842},[828,1195,1196],{"class":871},"prepare_method",[828,1198,897],{"class":842},[828,1200,1202],{"class":1201},"sHdIc","method",[828,1204,868],{"class":842},[828,1206,900],{"class":842},[828,1208,1209],{"class":903},"plate_prep",[828,1211,900],{"class":842},[828,1213,908],{"class":842},[828,1215,1216,1218,1220,1222,1224,1226,1229],{"class":830,"line":855},[828,1217,948],{"class":834},[828,1219,980],{"class":838},[828,1221,843],{"class":842},[828,1223,777],{"class":985},[828,1225,843],{"class":842},[828,1227,1228],{"class":871},"run_method",[828,1230,875],{"class":842},[828,1232,1233],{"class":830,"line":862},[828,1234,859],{"emptyLinePlaceholder":858},[828,1236,1237],{"class":830,"line":878},[828,1238,1239],{"class":967},"# Simple: fixed wait for the XML channel to open (used in the reference implementation)\n",[828,1241,1242,1244,1246,1248,1250,1252,1255],{"class":830,"line":995},[828,1243,948],{"class":834},[828,1245,951],{"class":838},[828,1247,843],{"class":842},[828,1249,956],{"class":871},[828,1251,897],{"class":842},[828,1253,1254],{"class":961},"3",[828,1256,908],{"class":842},[828,1258,1259],{"class":830,"line":1000},[828,1260,859],{"emptyLinePlaceholder":858},[828,1262,1263],{"class":830,"line":1012},[828,1264,1265],{"class":967},"# Robust alternative: poll until the channel is ready, with a timeout\n",[828,1267,1268],{"class":830,"line":1035},[828,1269,1270],{"class":967},"# for _ in range(20):\n",[828,1272,1273],{"class":830,"line":1063},[828,1274,1275],{"class":967},"#     if await service.execution_channel_controller.get_is_alive():\n",[828,1277,1279],{"class":830,"line":1278},10,[828,1280,1281],{"class":967},"#         break\n",[828,1283,1285],{"class":830,"line":1284},11,[828,1286,1287],{"class":967},"#     await asyncio.sleep(0.5)\n",[828,1289,1291],{"class":830,"line":1290},12,[828,1292,1293],{"class":967},"# else:\n",[828,1295,1297],{"class":830,"line":1296},13,[828,1298,1299],{"class":967},"#     raise TimeoutError(\"XML channel did not open within 10 seconds\")\n",[756,1301,1302],{"icon":1082,"color":1083},[760,1303,1304,1307,1308,1310,1311,1314,1315,1317,1318,1321,1322,1324],{},[763,1305,1306],{},"Why the wait?",": After ",[771,1309,1175],{},", FluentControl transitions from ",[1099,1312,1313],{},"Idle"," to ",[1099,1316,1101],{}," mode and opens the XML channel. This state transition takes a few seconds on the FluentControl side and is not signalled back to the SDK. The fixed ",[771,1319,1320],{},"asyncio.sleep(3)"," works in most environments — increase it to 5 seconds on slower hardware, or replace it with the polling loop above, which waits until ",[771,1323,1092],{}," confirms the channel is actually ready.",[811,1326,1328],{"id":1327},"close-the-method","Close the Method",[760,1330,1331],{},"Closing the session requires two distinct steps, in order.",[760,1333,1334,1339,1340,1343],{},[763,1335,1336,1337],{},"Step 1 — ",[771,1338,1109],{}," sends the finish signal through the XML execution channel. FluentControl receives it, closes the channel on its side, and returns to ",[1099,1341,1342],{},"EditMode",". The instrument is no longer accepting XML commands after this call.",[760,1345,1346,1352,1353,1355,1356,1358],{},[763,1347,1348,1349],{},"Step 2 — ",[771,1350,1351],{},"close_method()"," closes the SDK-level method session. After ",[771,1354,1109],{}," the method has completed on the instrument, but the connector still holds a reference to it; ",[771,1357,1351],{}," releases that reference and marks the runtime as idle and ready for the next run.",[819,1360,1362],{"className":821,"code":1361,"language":823,"meta":824,"style":824},"await service.execution_channel_controller.finish_command()  # close XML channel → EditMode\nawait service.runtime_controller.close_method()              # release SDK method reference\n",[771,1363,1364,1384],{"__ignoreMap":824},[828,1365,1366,1368,1370,1372,1374,1376,1378,1381],{"class":830,"line":831},[828,1367,948],{"class":834},[828,1369,980],{"class":838},[828,1371,843],{"class":842},[828,1373,781],{"class":985},[828,1375,843],{"class":842},[828,1377,1077],{"class":871},[828,1379,1380],{"class":842},"()",[828,1382,1383],{"class":967},"  # close XML channel → EditMode\n",[828,1385,1386,1388,1390,1392,1394,1396,1399,1401],{"class":830,"line":855},[828,1387,948],{"class":834},[828,1389,980],{"class":838},[828,1391,843],{"class":842},[828,1393,777],{"class":985},[828,1395,843],{"class":842},[828,1397,1398],{"class":871},"close_method",[828,1400,1380],{"class":842},[828,1402,1403],{"class":967},"              # release SDK method reference\n",[756,1405,1406],{"icon":1082,"color":1083},[760,1407,1408,1410,1411,1413,1414,1416,1417,1419],{},[763,1409,1088],{},": ",[771,1412,1109],{}," must always be called before ",[771,1415,1351],{},". Calling ",[771,1418,1351],{}," while the XML channel is still open leaves FluentControl with an orphaned execution channel that requires a manual restart of the FluentControl software to recover.",[1421,1422,1423],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":824,"searchDepth":831,"depth":855,"links":1425},[1426,1427,1428,1429,1430],{"id":813,"depth":855,"text":814},{"id":923,"depth":855,"text":924},{"id":1113,"depth":855,"text":1114},{"id":1168,"depth":855,"text":1169},{"id":1327,"depth":855,"text":1328},"How to connect to the Tecan FluentControl connector and start a FluentControl method.","md",null,{},{"title":353,"description":1431},"Q7H-kGUQWY5Ni8HOKcKky8tp2raUhMttx-3afCl3yvY",[1438,1440],{"title":274,"path":345,"stem":346,"description":1439},"Moving labware with the integrated gripper on the Agilent Bravo.",{"title":357,"path":358,"stem":359,"description":1441},"Using the execution channel to send XML commands to FluentControl at runtime.",1783607779327]