[{"data":1,"prerenderedAt":2589},["ShallowReactive",2],{"navigation":3,"\u002Foperate\u002Fyour-first-protocol":750,"\u002Foperate\u002Fyour-first-protocol-surround":2584},[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":143,"body":752,"description":2578,"extension":2579,"links":2580,"meta":2581,"navigation":1021,"path":144,"seo":2582,"stem":145,"__hash__":2583},"docs\u002F03.operate\u002F05.your-first-protocol.md",{"type":753,"value":754,"toc":2569},"minimark",[755,764,769,778,781,786,816,820,823,881,884,897,904,908,911,917,1240,1243,1268,1278,1282,1285,1291,1539,1542,1568,1571,1574,1580,1584,1591,1597,2000,2003,2006,2010,2017,2026,2067,2073,2512,2518,2532,2536,2539,2565],[756,757,758,759,763],"p",{},"This tutorial walks the full physical-layer dependency chain in one runnable script. By the end you will have executed a pipette transfer against the Hamilton simulator and, more importantly, you will understand ",[760,761,762],"strong",{},"why the order of the chain matters",". Every protocol you write from now on will follow the same shape.",[765,766,768],"h2",{"id":767},"why-this-matters","Why this matters",[756,770,771,772,777],{},"The ",[773,774,776],"a",{"href":775},"\u002Foperate\u002Foverview\u002F","Operate overview"," sets out the dependency chain every protocol has to satisfy: labware → deck → device → commands. Writing protocols feels difficult when people jump straight to the last stage without building the first three. This tutorial wires all four together in the simplest possible end-to-end example so the chain becomes muscle memory.",[756,779,780],{},"You will use the Hamilton simulator throughout, so no hardware is required.",[756,782,783],{},[760,784,785],{},"Prerequisites",[787,788,789,793,805,808],"ul",{},[790,791,792],"li",{},"Python 3.10 or newer",[790,794,795,804],{},[773,796,800],{"href":797,"rel":798},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002F",[799],"nofollow",[801,802,803],"code",{},"uv"," installed",[790,806,807],{},"The UniteLabs SDK and liquid handling packages (installed below)",[790,809,810,811,815],{},"Familiarity with the ",[773,812,814],{"href":813},"\u002Foperate\u002Fguides\u002Fsimulation\u002F","simulator"," is helpful but not required",[765,817,819],{"id":818},"set-up-the-project","Set up the project",[756,821,822],{},"Create a new directory and initialize the project:",[824,825,830],"pre",{"className":826,"code":827,"language":828,"meta":829,"style":829},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir first-protocol && cd first-protocol\nuv init --no-workspace\nuv add unitelabs-labware unitelabs-liquid-handling\n","bash","",[801,831,832,856,867],{"__ignoreMap":829},[833,834,837,841,845,849,853],"span",{"class":835,"line":836},"line",1,[833,838,840],{"class":839},"sBMFI","mkdir",[833,842,844],{"class":843},"sfazB"," first-protocol",[833,846,848],{"class":847},"sMK4o"," &&",[833,850,852],{"class":851},"s2Zo4"," cd",[833,854,855],{"class":843}," first-protocol\n",[833,857,859,861,864],{"class":835,"line":858},2,[833,860,803],{"class":839},[833,862,863],{"class":843}," init",[833,865,866],{"class":843}," --no-workspace\n",[833,868,870,872,875,878],{"class":835,"line":869},3,[833,871,803],{"class":839},[833,873,874],{"class":843}," add",[833,876,877],{"class":843}," unitelabs-labware",[833,879,880],{"class":843}," unitelabs-liquid-handling\n",[756,882,883],{},"Create a single script file:",[824,885,887],{"className":826,"code":886,"language":828,"meta":829,"style":829},"touch protocol.py\n",[801,888,889],{"__ignoreMap":829},[833,890,891,894],{"class":835,"line":836},[833,892,893],{"class":839},"touch",[833,895,896],{"class":843}," protocol.py\n",[756,898,899,900,903],{},"The rest of the tutorial lives in ",[801,901,902],{},"protocol.py",". Build it up step by step; each step below adds to the same file.",[765,905,907],{"id":906},"step-1-define-your-labware","Step 1 — Define your labware",[756,909,910],{},"Before anything moves, the SDK needs to know what physical objects exist. In this step you create Python objects for every piece of labware the protocol will touch. You are not placing them anywhere yet; you are just defining them.",[756,912,913,914,916],{},"Open ",[801,915,902],{}," and add:",[824,918,922],{"className":919,"code":920,"language":921,"meta":829,"style":829},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from unitelabs.labware import PredefinedLiquids, Standard96Plate, StandardTrough\nfrom unitelabs.labware.hamilton import (\n    PLT_CAR_L5MD_A00,\n    TIP_CAR_480_A00,\n    HamiltonTip_300,\n    HamiltonTipRack_300,\n)\n\n# A 96-well destination plate\nplate = Standard96Plate(identifier=\"destination_plate\")\n\n# A reservoir of water as the source\ntrough = StandardTrough(identifier=\"water_source\")\ntrough.containers[0].add_liquid(PredefinedLiquids.WATER, 150_000)  # 150 mL\n\n# A rack of filter tips\ntip_rack = HamiltonTipRack_300(filled_with=HamiltonTip_300)\n\n# Two carriers — one for tips, one for the plate + trough\ntip_carrier = TIP_CAR_480_A00(identifier=\"tip_carrier\")\nplate_carrier = PLT_CAR_L5MD_A00(identifier=\"plate_carrier\")\n","python",[801,923,924,957,978,986,994,1002,1010,1016,1023,1030,1060,1065,1071,1097,1143,1148,1154,1177,1182,1188,1214],{"__ignoreMap":829},[833,925,926,930,934,937,940,943,946,949,952,954],{"class":835,"line":836},[833,927,929],{"class":928},"s7zQu","from",[833,931,933],{"class":932},"sTEyZ"," unitelabs",[833,935,936],{"class":847},".",[833,938,939],{"class":932},"labware ",[833,941,942],{"class":928},"import",[833,944,945],{"class":932}," PredefinedLiquids",[833,947,948],{"class":847},",",[833,950,951],{"class":932}," Standard96Plate",[833,953,948],{"class":847},[833,955,956],{"class":932}," StandardTrough\n",[833,958,959,961,963,965,968,970,973,975],{"class":835,"line":858},[833,960,929],{"class":928},[833,962,933],{"class":932},[833,964,936],{"class":847},[833,966,967],{"class":932},"labware",[833,969,936],{"class":847},[833,971,972],{"class":932},"hamilton ",[833,974,942],{"class":928},[833,976,977],{"class":847}," (\n",[833,979,980,983],{"class":835,"line":869},[833,981,982],{"class":932},"    PLT_CAR_L5MD_A00",[833,984,985],{"class":847},",\n",[833,987,989,992],{"class":835,"line":988},4,[833,990,991],{"class":932},"    TIP_CAR_480_A00",[833,993,985],{"class":847},[833,995,997,1000],{"class":835,"line":996},5,[833,998,999],{"class":932},"    HamiltonTip_300",[833,1001,985],{"class":847},[833,1003,1005,1008],{"class":835,"line":1004},6,[833,1006,1007],{"class":932},"    HamiltonTipRack_300",[833,1009,985],{"class":847},[833,1011,1013],{"class":835,"line":1012},7,[833,1014,1015],{"class":847},")\n",[833,1017,1019],{"class":835,"line":1018},8,[833,1020,1022],{"emptyLinePlaceholder":1021},true,"\n",[833,1024,1026],{"class":835,"line":1025},9,[833,1027,1029],{"class":1028},"sHwdD","# A 96-well destination plate\n",[833,1031,1033,1036,1039,1041,1044,1048,1050,1053,1056,1058],{"class":835,"line":1032},10,[833,1034,1035],{"class":932},"plate ",[833,1037,1038],{"class":847},"=",[833,1040,951],{"class":851},[833,1042,1043],{"class":847},"(",[833,1045,1047],{"class":1046},"sHdIc","identifier",[833,1049,1038],{"class":847},[833,1051,1052],{"class":847},"\"",[833,1054,1055],{"class":843},"destination_plate",[833,1057,1052],{"class":847},[833,1059,1015],{"class":847},[833,1061,1063],{"class":835,"line":1062},11,[833,1064,1022],{"emptyLinePlaceholder":1021},[833,1066,1068],{"class":835,"line":1067},12,[833,1069,1070],{"class":1028},"# A reservoir of water as the source\n",[833,1072,1074,1077,1079,1082,1084,1086,1088,1090,1093,1095],{"class":835,"line":1073},13,[833,1075,1076],{"class":932},"trough ",[833,1078,1038],{"class":847},[833,1080,1081],{"class":851}," StandardTrough",[833,1083,1043],{"class":847},[833,1085,1047],{"class":1046},[833,1087,1038],{"class":847},[833,1089,1052],{"class":847},[833,1091,1092],{"class":843},"water_source",[833,1094,1052],{"class":847},[833,1096,1015],{"class":847},[833,1098,1100,1103,1105,1109,1112,1116,1119,1122,1124,1127,1129,1132,1134,1137,1140],{"class":835,"line":1099},14,[833,1101,1102],{"class":932},"trough",[833,1104,936],{"class":847},[833,1106,1108],{"class":1107},"swJcz","containers",[833,1110,1111],{"class":847},"[",[833,1113,1115],{"class":1114},"sbssI","0",[833,1117,1118],{"class":847},"].",[833,1120,1121],{"class":851},"add_liquid",[833,1123,1043],{"class":847},[833,1125,1126],{"class":851},"PredefinedLiquids",[833,1128,936],{"class":847},[833,1130,1131],{"class":1107},"WATER",[833,1133,948],{"class":847},[833,1135,1136],{"class":1114}," 150_000",[833,1138,1139],{"class":847},")",[833,1141,1142],{"class":1028},"  # 150 mL\n",[833,1144,1146],{"class":835,"line":1145},15,[833,1147,1022],{"emptyLinePlaceholder":1021},[833,1149,1151],{"class":835,"line":1150},16,[833,1152,1153],{"class":1028},"# A rack of filter tips\n",[833,1155,1157,1160,1162,1165,1167,1170,1172,1175],{"class":835,"line":1156},17,[833,1158,1159],{"class":932},"tip_rack ",[833,1161,1038],{"class":847},[833,1163,1164],{"class":851}," HamiltonTipRack_300",[833,1166,1043],{"class":847},[833,1168,1169],{"class":1046},"filled_with",[833,1171,1038],{"class":847},[833,1173,1174],{"class":851},"HamiltonTip_300",[833,1176,1015],{"class":847},[833,1178,1180],{"class":835,"line":1179},18,[833,1181,1022],{"emptyLinePlaceholder":1021},[833,1183,1185],{"class":835,"line":1184},19,[833,1186,1187],{"class":1028},"# Two carriers — one for tips, one for the plate + trough\n",[833,1189,1191,1194,1196,1199,1201,1203,1205,1207,1210,1212],{"class":835,"line":1190},20,[833,1192,1193],{"class":932},"tip_carrier ",[833,1195,1038],{"class":847},[833,1197,1198],{"class":851}," TIP_CAR_480_A00",[833,1200,1043],{"class":847},[833,1202,1047],{"class":1046},[833,1204,1038],{"class":847},[833,1206,1052],{"class":847},[833,1208,1209],{"class":843},"tip_carrier",[833,1211,1052],{"class":847},[833,1213,1015],{"class":847},[833,1215,1217,1220,1222,1225,1227,1229,1231,1233,1236,1238],{"class":835,"line":1216},21,[833,1218,1219],{"class":932},"plate_carrier ",[833,1221,1038],{"class":847},[833,1223,1224],{"class":851}," PLT_CAR_L5MD_A00",[833,1226,1043],{"class":847},[833,1228,1047],{"class":1046},[833,1230,1038],{"class":847},[833,1232,1052],{"class":847},[833,1234,1235],{"class":843},"plate_carrier",[833,1237,1052],{"class":847},[833,1239,1015],{"class":847},[756,1241,1242],{},"A few things worth noticing:",[787,1244,1245,1252,1265],{},[790,1246,1247,1248,1251],{},"Every labware gets a stable ",[801,1249,1250],{},"identifier=",". This is what you will reference later when you save or reload a deck. Auto-generated identifiers change every run and make saved layouts non-reproducible.",[790,1253,771,1254,1256,1257,1260,1261,1264],{},[801,1255,1102],{}," has a ",[801,1258,1259],{},"Container"," that tracks liquid volume. You can add, remove, and inspect volumes on any ",[801,1262,1263],{},"Fillable"," labware; this is what lets the simulator catch overfill and underflow errors before they reach real samples.",[790,1266,1267],{},"Tips are \"in\" a tip rack, plates are \"on\" a carrier. The tree structure (carrier → slot → plate → well) is how the SDK computes absolute positions for every well.",[756,1269,1270,1271,1274,1275,936],{},"For the full model see ",[773,1272,163],{"href":1273},"\u002Foperate\u002Fconcepts\u002Flabware\u002F"," and ",[773,1276,197],{"href":1277},"\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware\u002F",[765,1279,1281],{"id":1280},"step-2-start-the-simulator-and-place-labware-on-its-deck","Step 2 — Start the simulator and place labware on its deck",[756,1283,1284],{},"The deck is an attribute of the liquid handler, not a standalone object. You bring up the simulator (which gives you a device context with its own deck), then place your carriers on that deck at specific tracks.",[756,1286,1287,1288,1290],{},"Add to ",[801,1289,902],{},":",[824,1292,1294],{"className":919,"code":1293,"language":921,"meta":829,"style":829},"import asyncio\nfrom unitelabs.liquid_handling.testing import MicrolabSTARMock\n\n\nasync def run():\n    lh = MicrolabSTARMock()\n    await lh.configure()\n    await lh.initialize()\n\n    # Wire labware into carriers\n    tip_carrier[0] = tip_rack\n    plate_carrier[0] = plate\n    plate_carrier[1] = trough\n\n    # Place the carriers on the deck at physical tracks\n    lh.deck.add(tip_carrier, track=7)\n    lh.deck.add(plate_carrier, track=1)\n\n    print(lh.deck.summary())\n",[801,1295,1296,1303,1324,1328,1332,1347,1360,1375,1388,1392,1397,1415,1431,1447,1451,1456,1487,1513,1517],{"__ignoreMap":829},[833,1297,1298,1300],{"class":835,"line":836},[833,1299,942],{"class":928},[833,1301,1302],{"class":932}," asyncio\n",[833,1304,1305,1307,1309,1311,1314,1316,1319,1321],{"class":835,"line":858},[833,1306,929],{"class":928},[833,1308,933],{"class":932},[833,1310,936],{"class":847},[833,1312,1313],{"class":932},"liquid_handling",[833,1315,936],{"class":847},[833,1317,1318],{"class":932},"testing ",[833,1320,942],{"class":928},[833,1322,1323],{"class":932}," MicrolabSTARMock\n",[833,1325,1326],{"class":835,"line":869},[833,1327,1022],{"emptyLinePlaceholder":1021},[833,1329,1330],{"class":835,"line":988},[833,1331,1022],{"emptyLinePlaceholder":1021},[833,1333,1334,1338,1341,1344],{"class":835,"line":996},[833,1335,1337],{"class":1336},"spNyl","async",[833,1339,1340],{"class":1336}," def",[833,1342,1343],{"class":851}," run",[833,1345,1346],{"class":847},"():\n",[833,1348,1349,1352,1354,1357],{"class":835,"line":1004},[833,1350,1351],{"class":932},"    lh ",[833,1353,1038],{"class":847},[833,1355,1356],{"class":851}," MicrolabSTARMock",[833,1358,1359],{"class":847},"()\n",[833,1361,1362,1365,1368,1370,1373],{"class":835,"line":1012},[833,1363,1364],{"class":928},"    await",[833,1366,1367],{"class":932}," lh",[833,1369,936],{"class":847},[833,1371,1372],{"class":851},"configure",[833,1374,1359],{"class":847},[833,1376,1377,1379,1381,1383,1386],{"class":835,"line":1018},[833,1378,1364],{"class":928},[833,1380,1367],{"class":932},[833,1382,936],{"class":847},[833,1384,1385],{"class":851},"initialize",[833,1387,1359],{"class":847},[833,1389,1390],{"class":835,"line":1025},[833,1391,1022],{"emptyLinePlaceholder":1021},[833,1393,1394],{"class":835,"line":1032},[833,1395,1396],{"class":1028},"    # Wire labware into carriers\n",[833,1398,1399,1402,1404,1406,1409,1412],{"class":835,"line":1062},[833,1400,1401],{"class":932},"    tip_carrier",[833,1403,1111],{"class":847},[833,1405,1115],{"class":1114},[833,1407,1408],{"class":847},"]",[833,1410,1411],{"class":847}," =",[833,1413,1414],{"class":932}," tip_rack\n",[833,1416,1417,1420,1422,1424,1426,1428],{"class":835,"line":1067},[833,1418,1419],{"class":932},"    plate_carrier",[833,1421,1111],{"class":847},[833,1423,1115],{"class":1114},[833,1425,1408],{"class":847},[833,1427,1411],{"class":847},[833,1429,1430],{"class":932}," plate\n",[833,1432,1433,1435,1437,1440,1442,1444],{"class":835,"line":1073},[833,1434,1419],{"class":932},[833,1436,1111],{"class":847},[833,1438,1439],{"class":1114},"1",[833,1441,1408],{"class":847},[833,1443,1411],{"class":847},[833,1445,1446],{"class":932}," trough\n",[833,1448,1449],{"class":835,"line":1099},[833,1450,1022],{"emptyLinePlaceholder":1021},[833,1452,1453],{"class":835,"line":1145},[833,1454,1455],{"class":1028},"    # Place the carriers on the deck at physical tracks\n",[833,1457,1458,1461,1463,1466,1468,1471,1473,1475,1477,1480,1482,1485],{"class":835,"line":1150},[833,1459,1460],{"class":932},"    lh",[833,1462,936],{"class":847},[833,1464,1465],{"class":1107},"deck",[833,1467,936],{"class":847},[833,1469,1470],{"class":851},"add",[833,1472,1043],{"class":847},[833,1474,1209],{"class":851},[833,1476,948],{"class":847},[833,1478,1479],{"class":1046}," track",[833,1481,1038],{"class":847},[833,1483,1484],{"class":1114},"7",[833,1486,1015],{"class":847},[833,1488,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511],{"class":835,"line":1156},[833,1490,1460],{"class":932},[833,1492,936],{"class":847},[833,1494,1465],{"class":1107},[833,1496,936],{"class":847},[833,1498,1470],{"class":851},[833,1500,1043],{"class":847},[833,1502,1235],{"class":851},[833,1504,948],{"class":847},[833,1506,1479],{"class":1046},[833,1508,1038],{"class":847},[833,1510,1439],{"class":1114},[833,1512,1015],{"class":847},[833,1514,1515],{"class":835,"line":1179},[833,1516,1022],{"emptyLinePlaceholder":1021},[833,1518,1519,1522,1524,1527,1529,1531,1533,1536],{"class":835,"line":1184},[833,1520,1521],{"class":851},"    print",[833,1523,1043],{"class":847},[833,1525,1526],{"class":851},"lh",[833,1528,936],{"class":847},[833,1530,1465],{"class":1107},[833,1532,936],{"class":847},[833,1534,1535],{"class":851},"summary",[833,1537,1538],{"class":847},"())\n",[756,1540,1541],{},"Run the script so far to confirm the deck prints cleanly:",[824,1543,1545],{"className":826,"code":1544,"language":828,"meta":829,"style":829},"uv run python -c \"import asyncio; from protocol import run; asyncio.run(run())\"\n",[801,1546,1547],{"__ignoreMap":829},[833,1548,1549,1551,1553,1556,1559,1562,1565],{"class":835,"line":836},[833,1550,803],{"class":839},[833,1552,1343],{"class":843},[833,1554,1555],{"class":843}," python",[833,1557,1558],{"class":843}," -c",[833,1560,1561],{"class":847}," \"",[833,1563,1564],{"class":843},"import asyncio; from protocol import run; asyncio.run(run())",[833,1566,1567],{"class":847},"\"\n",[756,1569,1570],{},"You should see a summary showing the plate carrier on tracks 1–6 (plate in slot 0, trough in slot 1) and the tip carrier on tracks 7–12 (tip rack in slot 0).",[756,1572,1573],{},"If a resource collides with another, or if you place something outside the deck bounds, the simulator raises immediately. That is the point of this step. Deck problems are cheap to fix before any liquid moves.",[756,1575,1576,1577,936],{},"For advanced patterns like saving the deck to JSON and reloading it across runs, see ",[773,1578,225],{"href":1579},"\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck\u002F",[765,1581,1583],{"id":1582},"step-3-run-your-first-command","Step 3 — Run your first command",[756,1585,1586,1587,1590],{},"Now that the SDK knows what exists and where it is, you can issue a command. The dependency chain is satisfied: ",[801,1588,1589],{},"plate[\"A1\"]"," has a resolvable absolute position because the plate is in a carrier which is on track 1 of a known deck.",[756,1592,1593,1594,1290],{},"Extend ",[801,1595,1596],{},"run()",[824,1598,1600],{"className":919,"code":1599,"language":921,"meta":829,"style":829},"from unitelabs.labware.hamilton import LiquidClass\n\nliquid_class = LiquidClass.HamiltonTip_300_Water_DispenseJet_Empty()\n\n# Pick up 8 tips from column 1 of the tip rack\nawait lh.pipettes.pick_up_tips_from(channels=range(8), rack=tip_rack)\n\n# Aspirate 100 µL of water from the trough\nawait lh.pipettes.aspirate(\n    source=trough,\n    channels=range(8),\n    volume=100,\n    liquid_class=liquid_class,\n)\n\n# Dispense into column 1 of the destination plate\nawait lh.pipettes.dispense(\n    target=plate[\"A1\":\"H1\"],\n    channels=range(8),\n    volume=100,\n    liquid_class=liquid_class,\n)\n\n# Return the tips\nawait lh.pipettes.discard_tips(channels=range(8))\n\n# Inspect the result\nprint(\"Trough volume:\", trough.containers[0].volume)\nprint(\"Well A1 volume:\", plate[\"A1\"].container.volume)\n",[801,1601,1602,1621,1625,1642,1646,1651,1696,1700,1705,1723,1734,1750,1762,1774,1778,1782,1787,1804,1835,1849,1859,1869,1874,1879,1885,1916,1921,1927,1962],{"__ignoreMap":829},[833,1603,1604,1606,1608,1610,1612,1614,1616,1618],{"class":835,"line":836},[833,1605,929],{"class":928},[833,1607,933],{"class":932},[833,1609,936],{"class":847},[833,1611,967],{"class":932},[833,1613,936],{"class":847},[833,1615,972],{"class":932},[833,1617,942],{"class":928},[833,1619,1620],{"class":932}," LiquidClass\n",[833,1622,1623],{"class":835,"line":858},[833,1624,1022],{"emptyLinePlaceholder":1021},[833,1626,1627,1630,1632,1635,1637,1640],{"class":835,"line":869},[833,1628,1629],{"class":932},"liquid_class ",[833,1631,1038],{"class":847},[833,1633,1634],{"class":932}," LiquidClass",[833,1636,936],{"class":847},[833,1638,1639],{"class":851},"HamiltonTip_300_Water_DispenseJet_Empty",[833,1641,1359],{"class":847},[833,1643,1644],{"class":835,"line":988},[833,1645,1022],{"emptyLinePlaceholder":1021},[833,1647,1648],{"class":835,"line":996},[833,1649,1650],{"class":1028},"# Pick up 8 tips from column 1 of the tip rack\n",[833,1652,1653,1656,1658,1660,1663,1665,1668,1670,1673,1675,1678,1680,1683,1686,1689,1691,1694],{"class":835,"line":1004},[833,1654,1655],{"class":928},"await",[833,1657,1367],{"class":932},[833,1659,936],{"class":847},[833,1661,1662],{"class":1107},"pipettes",[833,1664,936],{"class":847},[833,1666,1667],{"class":851},"pick_up_tips_from",[833,1669,1043],{"class":847},[833,1671,1672],{"class":1046},"channels",[833,1674,1038],{"class":847},[833,1676,1677],{"class":851},"range",[833,1679,1043],{"class":847},[833,1681,1682],{"class":1114},"8",[833,1684,1685],{"class":847},"),",[833,1687,1688],{"class":1046}," rack",[833,1690,1038],{"class":847},[833,1692,1693],{"class":851},"tip_rack",[833,1695,1015],{"class":847},[833,1697,1698],{"class":835,"line":1012},[833,1699,1022],{"emptyLinePlaceholder":1021},[833,1701,1702],{"class":835,"line":1018},[833,1703,1704],{"class":1028},"# Aspirate 100 µL of water from the trough\n",[833,1706,1707,1709,1711,1713,1715,1717,1720],{"class":835,"line":1025},[833,1708,1655],{"class":928},[833,1710,1367],{"class":932},[833,1712,936],{"class":847},[833,1714,1662],{"class":1107},[833,1716,936],{"class":847},[833,1718,1719],{"class":851},"aspirate",[833,1721,1722],{"class":847},"(\n",[833,1724,1725,1728,1730,1732],{"class":835,"line":1032},[833,1726,1727],{"class":1046},"    source",[833,1729,1038],{"class":847},[833,1731,1102],{"class":851},[833,1733,985],{"class":847},[833,1735,1736,1739,1741,1743,1745,1747],{"class":835,"line":1062},[833,1737,1738],{"class":1046},"    channels",[833,1740,1038],{"class":847},[833,1742,1677],{"class":851},[833,1744,1043],{"class":847},[833,1746,1682],{"class":1114},[833,1748,1749],{"class":847},"),\n",[833,1751,1752,1755,1757,1760],{"class":835,"line":1067},[833,1753,1754],{"class":1046},"    volume",[833,1756,1038],{"class":847},[833,1758,1759],{"class":1114},"100",[833,1761,985],{"class":847},[833,1763,1764,1767,1769,1772],{"class":835,"line":1073},[833,1765,1766],{"class":1046},"    liquid_class",[833,1768,1038],{"class":847},[833,1770,1771],{"class":851},"liquid_class",[833,1773,985],{"class":847},[833,1775,1776],{"class":835,"line":1099},[833,1777,1015],{"class":847},[833,1779,1780],{"class":835,"line":1145},[833,1781,1022],{"emptyLinePlaceholder":1021},[833,1783,1784],{"class":835,"line":1150},[833,1785,1786],{"class":1028},"# Dispense into column 1 of the destination plate\n",[833,1788,1789,1791,1793,1795,1797,1799,1802],{"class":835,"line":1156},[833,1790,1655],{"class":928},[833,1792,1367],{"class":932},[833,1794,936],{"class":847},[833,1796,1662],{"class":1107},[833,1798,936],{"class":847},[833,1800,1801],{"class":851},"dispense",[833,1803,1722],{"class":847},[833,1805,1806,1809,1811,1814,1816,1818,1821,1823,1825,1827,1830,1832],{"class":835,"line":1179},[833,1807,1808],{"class":1046},"    target",[833,1810,1038],{"class":847},[833,1812,1813],{"class":851},"plate",[833,1815,1111],{"class":847},[833,1817,1052],{"class":847},[833,1819,1820],{"class":843},"A1",[833,1822,1052],{"class":847},[833,1824,1290],{"class":847},[833,1826,1052],{"class":847},[833,1828,1829],{"class":843},"H1",[833,1831,1052],{"class":847},[833,1833,1834],{"class":847},"],\n",[833,1836,1837,1839,1841,1843,1845,1847],{"class":835,"line":1184},[833,1838,1738],{"class":1046},[833,1840,1038],{"class":847},[833,1842,1677],{"class":851},[833,1844,1043],{"class":847},[833,1846,1682],{"class":1114},[833,1848,1749],{"class":847},[833,1850,1851,1853,1855,1857],{"class":835,"line":1190},[833,1852,1754],{"class":1046},[833,1854,1038],{"class":847},[833,1856,1759],{"class":1114},[833,1858,985],{"class":847},[833,1860,1861,1863,1865,1867],{"class":835,"line":1216},[833,1862,1766],{"class":1046},[833,1864,1038],{"class":847},[833,1866,1771],{"class":851},[833,1868,985],{"class":847},[833,1870,1872],{"class":835,"line":1871},22,[833,1873,1015],{"class":847},[833,1875,1877],{"class":835,"line":1876},23,[833,1878,1022],{"emptyLinePlaceholder":1021},[833,1880,1882],{"class":835,"line":1881},24,[833,1883,1884],{"class":1028},"# Return the tips\n",[833,1886,1888,1890,1892,1894,1896,1898,1901,1903,1905,1907,1909,1911,1913],{"class":835,"line":1887},25,[833,1889,1655],{"class":928},[833,1891,1367],{"class":932},[833,1893,936],{"class":847},[833,1895,1662],{"class":1107},[833,1897,936],{"class":847},[833,1899,1900],{"class":851},"discard_tips",[833,1902,1043],{"class":847},[833,1904,1672],{"class":1046},[833,1906,1038],{"class":847},[833,1908,1677],{"class":851},[833,1910,1043],{"class":847},[833,1912,1682],{"class":1114},[833,1914,1915],{"class":847},"))\n",[833,1917,1919],{"class":835,"line":1918},26,[833,1920,1022],{"emptyLinePlaceholder":1021},[833,1922,1924],{"class":835,"line":1923},27,[833,1925,1926],{"class":1028},"# Inspect the result\n",[833,1928,1930,1933,1935,1937,1940,1942,1944,1947,1949,1951,1953,1955,1957,1960],{"class":835,"line":1929},28,[833,1931,1932],{"class":851},"print",[833,1934,1043],{"class":847},[833,1936,1052],{"class":847},[833,1938,1939],{"class":843},"Trough volume:",[833,1941,1052],{"class":847},[833,1943,948],{"class":847},[833,1945,1946],{"class":851}," trough",[833,1948,936],{"class":847},[833,1950,1108],{"class":1107},[833,1952,1111],{"class":847},[833,1954,1115],{"class":1114},[833,1956,1118],{"class":847},[833,1958,1959],{"class":1107},"volume",[833,1961,1015],{"class":847},[833,1963,1965,1967,1969,1971,1974,1976,1978,1981,1983,1985,1987,1989,1991,1994,1996,1998],{"class":835,"line":1964},29,[833,1966,1932],{"class":851},[833,1968,1043],{"class":847},[833,1970,1052],{"class":847},[833,1972,1973],{"class":843},"Well A1 volume:",[833,1975,1052],{"class":847},[833,1977,948],{"class":847},[833,1979,1980],{"class":851}," plate",[833,1982,1111],{"class":847},[833,1984,1052],{"class":847},[833,1986,1820],{"class":843},[833,1988,1052],{"class":847},[833,1990,1118],{"class":847},[833,1992,1993],{"class":1107},"container",[833,1995,936],{"class":847},[833,1997,1959],{"class":1107},[833,1999,1015],{"class":847},[756,2001,2002],{},"Run the full script again. The simulator's liquid model tracks volumes through every operation, so you can verify your protocol logic before touching real samples: the trough should be 800 µL lighter (8 channels × 100 µL), and each well in column 1 should now contain 100 µL.",[756,2004,2005],{},"This is the hello-world of liquid handling. Every real protocol is a longer version of this shape: pick up tips, aspirate from some source, dispense into some destination, discard tips. What changes between protocols is the labware, the volumes, the liquid classes, and the loops.",[765,2007,2009],{"id":2008},"step-4-handle-errors","Step 4 — Handle errors",[756,2011,2012,2013,2016],{},"A protocol that works only on the happy path is not a protocol; it is a demo. On real hardware, timeouts happen, tips fall off, and samples get left in unexpected states. The goal of error handling in lab automation is not graceful failure; it is ",[760,2014,2015],{},"leaving every instrument in a safe, known state"," before the script exits or retries.",[756,2018,2019,2020,2023,2024,1290],{},"Add ",[801,2021,2022],{},"logging"," to your imports at the top of ",[801,2025,902],{},[824,2027,2029],{"className":919,"code":2028,"language":921,"meta":829,"style":829},"import logging\n\nlogging.basicConfig(level=logging.INFO)\n",[801,2030,2031,2038,2042],{"__ignoreMap":829},[833,2032,2033,2035],{"class":835,"line":836},[833,2034,942],{"class":928},[833,2036,2037],{"class":932}," logging\n",[833,2039,2040],{"class":835,"line":858},[833,2041,1022],{"emptyLinePlaceholder":1021},[833,2043,2044,2046,2048,2051,2053,2056,2058,2060,2062,2065],{"class":835,"line":869},[833,2045,2022],{"class":932},[833,2047,936],{"class":847},[833,2049,2050],{"class":851},"basicConfig",[833,2052,1043],{"class":847},[833,2054,2055],{"class":1046},"level",[833,2057,1038],{"class":847},[833,2059,2022],{"class":851},[833,2061,936],{"class":847},[833,2063,2064],{"class":1107},"INFO",[833,2066,1015],{"class":847},[756,2068,2069,2070,1290],{},"Then wrap the commands in ",[801,2071,2072],{},"try \u002F except \u002F finally",[824,2074,2076],{"className":919,"code":2075,"language":921,"meta":829,"style":829},"async def run():\n    lh = MicrolabSTARMock()\n    await lh.configure()\n    await lh.initialize()\n\n    tip_carrier[0] = tip_rack\n    plate_carrier[0] = plate\n    plate_carrier[1] = trough\n\n    lh.deck.add(tip_carrier, track=7)\n    lh.deck.add(plate_carrier, track=1)\n\n    try:\n        await lh.pipettes.pick_up_tips_from(channels=range(8), rack=tip_rack)\n        await lh.pipettes.aspirate(\n            source=trough,\n            channels=range(8),\n            volume=100,\n            liquid_class=liquid_class,\n        )\n        await lh.pipettes.dispense(\n            target=plate[\"A1\":\"H1\"],\n            channels=range(8),\n            volume=100,\n            liquid_class=liquid_class,\n        )\n\n    except Exception:\n        logging.exception(\"Protocol step failed — attempting safe state\")\n        raise\n\n    finally:\n        # Always return tips, whether or not the protocol succeeded\n        await lh.pipettes.discard_tips(channels=range(8))\n",[801,2077,2078,2088,2098,2110,2122,2126,2140,2154,2168,2172,2198,2224,2228,2236,2273,2289,2300,2315,2326,2337,2342,2358,2385,2399,2409,2419,2423,2427,2437,2458,2464,2469,2477,2483],{"__ignoreMap":829},[833,2079,2080,2082,2084,2086],{"class":835,"line":836},[833,2081,1337],{"class":1336},[833,2083,1340],{"class":1336},[833,2085,1343],{"class":851},[833,2087,1346],{"class":847},[833,2089,2090,2092,2094,2096],{"class":835,"line":858},[833,2091,1351],{"class":932},[833,2093,1038],{"class":847},[833,2095,1356],{"class":851},[833,2097,1359],{"class":847},[833,2099,2100,2102,2104,2106,2108],{"class":835,"line":869},[833,2101,1364],{"class":928},[833,2103,1367],{"class":932},[833,2105,936],{"class":847},[833,2107,1372],{"class":851},[833,2109,1359],{"class":847},[833,2111,2112,2114,2116,2118,2120],{"class":835,"line":988},[833,2113,1364],{"class":928},[833,2115,1367],{"class":932},[833,2117,936],{"class":847},[833,2119,1385],{"class":851},[833,2121,1359],{"class":847},[833,2123,2124],{"class":835,"line":996},[833,2125,1022],{"emptyLinePlaceholder":1021},[833,2127,2128,2130,2132,2134,2136,2138],{"class":835,"line":1004},[833,2129,1401],{"class":932},[833,2131,1111],{"class":847},[833,2133,1115],{"class":1114},[833,2135,1408],{"class":847},[833,2137,1411],{"class":847},[833,2139,1414],{"class":932},[833,2141,2142,2144,2146,2148,2150,2152],{"class":835,"line":1012},[833,2143,1419],{"class":932},[833,2145,1111],{"class":847},[833,2147,1115],{"class":1114},[833,2149,1408],{"class":847},[833,2151,1411],{"class":847},[833,2153,1430],{"class":932},[833,2155,2156,2158,2160,2162,2164,2166],{"class":835,"line":1018},[833,2157,1419],{"class":932},[833,2159,1111],{"class":847},[833,2161,1439],{"class":1114},[833,2163,1408],{"class":847},[833,2165,1411],{"class":847},[833,2167,1446],{"class":932},[833,2169,2170],{"class":835,"line":1025},[833,2171,1022],{"emptyLinePlaceholder":1021},[833,2173,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196],{"class":835,"line":1032},[833,2175,1460],{"class":932},[833,2177,936],{"class":847},[833,2179,1465],{"class":1107},[833,2181,936],{"class":847},[833,2183,1470],{"class":851},[833,2185,1043],{"class":847},[833,2187,1209],{"class":851},[833,2189,948],{"class":847},[833,2191,1479],{"class":1046},[833,2193,1038],{"class":847},[833,2195,1484],{"class":1114},[833,2197,1015],{"class":847},[833,2199,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222],{"class":835,"line":1062},[833,2201,1460],{"class":932},[833,2203,936],{"class":847},[833,2205,1465],{"class":1107},[833,2207,936],{"class":847},[833,2209,1470],{"class":851},[833,2211,1043],{"class":847},[833,2213,1235],{"class":851},[833,2215,948],{"class":847},[833,2217,1479],{"class":1046},[833,2219,1038],{"class":847},[833,2221,1439],{"class":1114},[833,2223,1015],{"class":847},[833,2225,2226],{"class":835,"line":1067},[833,2227,1022],{"emptyLinePlaceholder":1021},[833,2229,2230,2233],{"class":835,"line":1073},[833,2231,2232],{"class":928},"    try",[833,2234,2235],{"class":847},":\n",[833,2237,2238,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":835,"line":1099},[833,2239,2240],{"class":928},"        await",[833,2242,1367],{"class":932},[833,2244,936],{"class":847},[833,2246,1662],{"class":1107},[833,2248,936],{"class":847},[833,2250,1667],{"class":851},[833,2252,1043],{"class":847},[833,2254,1672],{"class":1046},[833,2256,1038],{"class":847},[833,2258,1677],{"class":851},[833,2260,1043],{"class":847},[833,2262,1682],{"class":1114},[833,2264,1685],{"class":847},[833,2266,1688],{"class":1046},[833,2268,1038],{"class":847},[833,2270,1693],{"class":851},[833,2272,1015],{"class":847},[833,2274,2275,2277,2279,2281,2283,2285,2287],{"class":835,"line":1145},[833,2276,2240],{"class":928},[833,2278,1367],{"class":932},[833,2280,936],{"class":847},[833,2282,1662],{"class":1107},[833,2284,936],{"class":847},[833,2286,1719],{"class":851},[833,2288,1722],{"class":847},[833,2290,2291,2294,2296,2298],{"class":835,"line":1150},[833,2292,2293],{"class":1046},"            source",[833,2295,1038],{"class":847},[833,2297,1102],{"class":851},[833,2299,985],{"class":847},[833,2301,2302,2305,2307,2309,2311,2313],{"class":835,"line":1156},[833,2303,2304],{"class":1046},"            channels",[833,2306,1038],{"class":847},[833,2308,1677],{"class":851},[833,2310,1043],{"class":847},[833,2312,1682],{"class":1114},[833,2314,1749],{"class":847},[833,2316,2317,2320,2322,2324],{"class":835,"line":1179},[833,2318,2319],{"class":1046},"            volume",[833,2321,1038],{"class":847},[833,2323,1759],{"class":1114},[833,2325,985],{"class":847},[833,2327,2328,2331,2333,2335],{"class":835,"line":1184},[833,2329,2330],{"class":1046},"            liquid_class",[833,2332,1038],{"class":847},[833,2334,1771],{"class":851},[833,2336,985],{"class":847},[833,2338,2339],{"class":835,"line":1190},[833,2340,2341],{"class":847},"        )\n",[833,2343,2344,2346,2348,2350,2352,2354,2356],{"class":835,"line":1216},[833,2345,2240],{"class":928},[833,2347,1367],{"class":932},[833,2349,936],{"class":847},[833,2351,1662],{"class":1107},[833,2353,936],{"class":847},[833,2355,1801],{"class":851},[833,2357,1722],{"class":847},[833,2359,2360,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383],{"class":835,"line":1871},[833,2361,2362],{"class":1046},"            target",[833,2364,1038],{"class":847},[833,2366,1813],{"class":851},[833,2368,1111],{"class":847},[833,2370,1052],{"class":847},[833,2372,1820],{"class":843},[833,2374,1052],{"class":847},[833,2376,1290],{"class":847},[833,2378,1052],{"class":847},[833,2380,1829],{"class":843},[833,2382,1052],{"class":847},[833,2384,1834],{"class":847},[833,2386,2387,2389,2391,2393,2395,2397],{"class":835,"line":1876},[833,2388,2304],{"class":1046},[833,2390,1038],{"class":847},[833,2392,1677],{"class":851},[833,2394,1043],{"class":847},[833,2396,1682],{"class":1114},[833,2398,1749],{"class":847},[833,2400,2401,2403,2405,2407],{"class":835,"line":1881},[833,2402,2319],{"class":1046},[833,2404,1038],{"class":847},[833,2406,1759],{"class":1114},[833,2408,985],{"class":847},[833,2410,2411,2413,2415,2417],{"class":835,"line":1887},[833,2412,2330],{"class":1046},[833,2414,1038],{"class":847},[833,2416,1771],{"class":851},[833,2418,985],{"class":847},[833,2420,2421],{"class":835,"line":1918},[833,2422,2341],{"class":847},[833,2424,2425],{"class":835,"line":1923},[833,2426,1022],{"emptyLinePlaceholder":1021},[833,2428,2429,2432,2435],{"class":835,"line":1929},[833,2430,2431],{"class":928},"    except",[833,2433,2434],{"class":839}," Exception",[833,2436,2235],{"class":847},[833,2438,2439,2442,2444,2447,2449,2451,2454,2456],{"class":835,"line":1964},[833,2440,2441],{"class":932},"        logging",[833,2443,936],{"class":847},[833,2445,2446],{"class":851},"exception",[833,2448,1043],{"class":847},[833,2450,1052],{"class":847},[833,2452,2453],{"class":843},"Protocol step failed — attempting safe state",[833,2455,1052],{"class":847},[833,2457,1015],{"class":847},[833,2459,2461],{"class":835,"line":2460},30,[833,2462,2463],{"class":928},"        raise\n",[833,2465,2467],{"class":835,"line":2466},31,[833,2468,1022],{"emptyLinePlaceholder":1021},[833,2470,2472,2475],{"class":835,"line":2471},32,[833,2473,2474],{"class":928},"    finally",[833,2476,2235],{"class":847},[833,2478,2480],{"class":835,"line":2479},33,[833,2481,2482],{"class":1028},"        # Always return tips, whether or not the protocol succeeded\n",[833,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510],{"class":835,"line":2485},34,[833,2487,2240],{"class":928},[833,2489,1367],{"class":932},[833,2491,936],{"class":847},[833,2493,1662],{"class":1107},[833,2495,936],{"class":847},[833,2497,1900],{"class":851},[833,2499,1043],{"class":847},[833,2501,1672],{"class":1046},[833,2503,1038],{"class":847},[833,2505,1677],{"class":851},[833,2507,1043],{"class":847},[833,2509,1682],{"class":1114},[833,2511,1915],{"class":847},[756,2513,771,2514,2517],{},[801,2515,2516],{},"finally"," block runs regardless of success or failure. Here it guarantees that the channels never end up holding tips. A real run that crashes mid-protocol should not leave the pipette armed and blocking the next run.",[756,2519,2520,2521,2523,2524,2527,2528,2531],{},"The pattern generalizes. For a full protocol, every step that changes an instrument's physical state (door open, plate picked up, tips held) should have a corresponding safe-state action in ",[801,2522,2516],{}," or in a wider ",[801,2525,2526],{},"except"," block. See ",[773,2529,183],{"href":2530},"\u002Foperate\u002Fconcepts\u002Ferror-handling\u002F"," for common failure patterns (timeout, unexpected state, partial completion, connection loss) and a safe-state checklist.",[765,2533,2535],{"id":2534},"where-to-go-next","Where to go next",[756,2537,2538],{},"You have walked the full chain: labware → deck → device → command → error. Everything from here is a variation on this shape.",[787,2540,2541,2547,2554,2559],{},[790,2542,2543,2546],{},[773,2544,238],{"href":2545},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting\u002F",": same pattern against Hamilton or Bravo, with finer control over liquid classes and tip handling.",[790,2548,2549,1274,2551,2553],{},[773,2550,163],{"href":1273},[773,2552,197],{"href":1277},": the model behind the Python objects you instantiated in step 1.",[790,2555,2556,2558],{},[773,2557,225],{"href":1579},": save this deck layout to JSON and reload it across runs so team members and CI share the same physical setup.",[790,2560,2561,2564],{},[773,2562,442],{"href":2563},"\u002Fautomate\u002Fyour-first-workflow\u002F",": wrap this protocol in a Prefect flow so it can be scheduled, retried, and run unattended from the platform.",[2566,2567,2568],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":829,"searchDepth":836,"depth":858,"links":2570},[2571,2572,2573,2574,2575,2576,2577],{"id":767,"depth":858,"text":768},{"id":818,"depth":858,"text":819},{"id":906,"depth":858,"text":907},{"id":1280,"depth":858,"text":1281},{"id":1582,"depth":858,"text":1583},{"id":2008,"depth":858,"text":2009},{"id":2534,"depth":858,"text":2535},"Walk the full labware → deck → device → command → error chain in one runnable simulator script, and leave understanding why the order matters.","md",null,{},{"title":143,"description":2578},"6s7dm7GMuRLzZV9MlOJ0byi-7ViF2nmjNS5Q-XKCoZs",[2585,2587],{"title":135,"path":140,"stem":141,"description":2586},"Model your physical lab setup in code — the foundation every automation script builds on, from labware through liquid handling.",{"title":151,"path":152,"stem":153,"description":2588},"The domain model for liquid handling in the SDK — aspirate\u002Fdispense as the core abstraction, and how vendor differences are flattened behind one API.",1783607762068]