[{"data":1,"prerenderedAt":2898},["ShallowReactive",2],{"navigation":3,"\u002Foperate\u002Fguides\u002Fsimulation":750,"\u002Foperate\u002Fguides\u002Fsimulation-surround":2893},[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":179,"body":752,"description":2887,"extension":2888,"links":2889,"meta":2890,"navigation":945,"path":257,"seo":2891,"stem":258,"__hash__":2892},"docs\u002F03.operate\u002F20.guides\u002F40.simulation.md",{"type":753,"value":754,"toc":2878},"minimark",[755,764,769,777,793,1625,1629,1632,1639,1858,1861,2081,2084,2137,2141,2148,2211,2214,2318,2325,2329,2332,2354,2357,2464,2468,2471,2684,2687,2691,2694,2849,2852,2856,2874],[756,757,758,759,763],"p",{},"See ",[760,761,179],"a",{"href":762},"\u002Foperate\u002Fconcepts\u002Fsimulation\u002F"," for what the mock validates (and what it doesn't), and why. This guide covers the procedural how-to: instantiating mocks, configuring them, and switching between mock and real hardware.",[765,766,768],"h2",{"id":767},"mock-liquid-handler","Mock liquid handler",[756,770,771,772,776],{},"The following mock classes are available, all imported from ",[773,774,775],"code",{},"unitelabs.liquid_handling.testing",":",[778,779,780,787],"ul",{},[781,782,783,786],"li",{},[773,784,785],{},"MicrolabSTARMock",": mock for the Hamilton Microlab STAR",[781,788,789,792],{},[773,790,791],{},"BravoMock",": mock for the Agilent Bravo",[794,795,800],"pre",{"className":796,"code":797,"language":798,"meta":799,"style":799},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import asyncio\nimport typing\nfrom unitelabs.labware import Liquid, Standard96Plate\nfrom unitelabs.labware.hamilton import (\n    HamiltonTip_300,\n    HamiltonTipRack_300\n)\nfrom unitelabs.liquid_handling.testing import MicrolabSTARMock\nfrom unitelabs.labware.hamilton import PLT_CAR_L5MD_A00, TIP_CAR_480_A00\n\nasync def main():\n    lh = MicrolabSTARMock()\n    await lh.configure()\n    await lh.initialize()\n\n    # Build your deck exactly as you would with real hardware\n    tip_carrier = TIP_CAR_480_A00(identifier=\"tip_carrier\")\n    tip_rack = HamiltonTipRack_300(filled_with=HamiltonTip_300, identifier=\"tip_rack\")\n    tip_carrier[0] = tip_rack\n\n    plate_carrier = PLT_CAR_L5MD_A00(identifier=\"plate_carrier\")\n    plate = Standard96Plate(identifier=\"plate\")\n    for well in plate[\"A1\":\"H1\"]:\n        well.container.add_liquid(Liquid.WATER, 100)\n    plate_carrier[0] = plate\n\n    lh.deck.add(tip_carrier, track=1)\n    lh.deck.add(plate_carrier, track=10)\n\n    # All pipetting operations work normally\n    tips = lh.deck.get(\"tip_rack\") # or just use tip_rack\n    tips = typing.cast(TIP_CAR_480_A00, tips)\n    await lh.pipettes.pick_up_tips(channels=range(8), spots=tip_rack[\"A1\":\"H1\"])\n    await lh.pipettes.aspirate(plate[\"A1\":\"H1\"], volume=[100] * 8)\n    await lh.pipettes.dispense(plate[\"A1\":\"H1\"], volume=[100] * 8)\n    await lh.pipettes.drop_tips()\n\n    print(\"Protocol completed in simulation.\")\n\nasyncio.run(main())\n","python","",[773,801,802,815,823,850,872,881,887,893,915,940,947,964,979,995,1009,1014,1021,1052,1089,1111,1116,1141,1167,1203,1237,1254,1259,1291,1319,1324,1330,1363,1390,1451,1509,1561,1579,1584,1601,1606],{"__ignoreMap":799},[803,804,807,811],"span",{"class":805,"line":806},"line",1,[803,808,810],{"class":809},"s7zQu","import",[803,812,814],{"class":813},"sTEyZ"," asyncio\n",[803,816,818,820],{"class":805,"line":817},2,[803,819,810],{"class":809},[803,821,822],{"class":813}," typing\n",[803,824,826,829,832,836,839,841,844,847],{"class":805,"line":825},3,[803,827,828],{"class":809},"from",[803,830,831],{"class":813}," unitelabs",[803,833,835],{"class":834},"sMK4o",".",[803,837,838],{"class":813},"labware ",[803,840,810],{"class":809},[803,842,843],{"class":813}," Liquid",[803,845,846],{"class":834},",",[803,848,849],{"class":813}," Standard96Plate\n",[803,851,853,855,857,859,862,864,867,869],{"class":805,"line":852},4,[803,854,828],{"class":809},[803,856,831],{"class":813},[803,858,835],{"class":834},[803,860,861],{"class":813},"labware",[803,863,835],{"class":834},[803,865,866],{"class":813},"hamilton ",[803,868,810],{"class":809},[803,870,871],{"class":834}," (\n",[803,873,875,878],{"class":805,"line":874},5,[803,876,877],{"class":813},"    HamiltonTip_300",[803,879,880],{"class":834},",\n",[803,882,884],{"class":805,"line":883},6,[803,885,886],{"class":813},"    HamiltonTipRack_300\n",[803,888,890],{"class":805,"line":889},7,[803,891,892],{"class":834},")\n",[803,894,896,898,900,902,905,907,910,912],{"class":805,"line":895},8,[803,897,828],{"class":809},[803,899,831],{"class":813},[803,901,835],{"class":834},[803,903,904],{"class":813},"liquid_handling",[803,906,835],{"class":834},[803,908,909],{"class":813},"testing ",[803,911,810],{"class":809},[803,913,914],{"class":813}," MicrolabSTARMock\n",[803,916,918,920,922,924,926,928,930,932,935,937],{"class":805,"line":917},9,[803,919,828],{"class":809},[803,921,831],{"class":813},[803,923,835],{"class":834},[803,925,861],{"class":813},[803,927,835],{"class":834},[803,929,866],{"class":813},[803,931,810],{"class":809},[803,933,934],{"class":813}," PLT_CAR_L5MD_A00",[803,936,846],{"class":834},[803,938,939],{"class":813}," TIP_CAR_480_A00\n",[803,941,943],{"class":805,"line":942},10,[803,944,946],{"emptyLinePlaceholder":945},true,"\n",[803,948,950,954,957,961],{"class":805,"line":949},11,[803,951,953],{"class":952},"spNyl","async",[803,955,956],{"class":952}," def",[803,958,960],{"class":959},"s2Zo4"," main",[803,962,963],{"class":834},"():\n",[803,965,967,970,973,976],{"class":805,"line":966},12,[803,968,969],{"class":813},"    lh ",[803,971,972],{"class":834},"=",[803,974,975],{"class":959}," MicrolabSTARMock",[803,977,978],{"class":834},"()\n",[803,980,982,985,988,990,993],{"class":805,"line":981},13,[803,983,984],{"class":809},"    await",[803,986,987],{"class":813}," lh",[803,989,835],{"class":834},[803,991,992],{"class":959},"configure",[803,994,978],{"class":834},[803,996,998,1000,1002,1004,1007],{"class":805,"line":997},14,[803,999,984],{"class":809},[803,1001,987],{"class":813},[803,1003,835],{"class":834},[803,1005,1006],{"class":959},"initialize",[803,1008,978],{"class":834},[803,1010,1012],{"class":805,"line":1011},15,[803,1013,946],{"emptyLinePlaceholder":945},[803,1015,1017],{"class":805,"line":1016},16,[803,1018,1020],{"class":1019},"sHwdD","    # Build your deck exactly as you would with real hardware\n",[803,1022,1024,1027,1029,1032,1035,1039,1041,1044,1048,1050],{"class":805,"line":1023},17,[803,1025,1026],{"class":813},"    tip_carrier ",[803,1028,972],{"class":834},[803,1030,1031],{"class":959}," TIP_CAR_480_A00",[803,1033,1034],{"class":834},"(",[803,1036,1038],{"class":1037},"sHdIc","identifier",[803,1040,972],{"class":834},[803,1042,1043],{"class":834},"\"",[803,1045,1047],{"class":1046},"sfazB","tip_carrier",[803,1049,1043],{"class":834},[803,1051,892],{"class":834},[803,1053,1055,1058,1060,1063,1065,1068,1070,1073,1075,1078,1080,1082,1085,1087],{"class":805,"line":1054},18,[803,1056,1057],{"class":813},"    tip_rack ",[803,1059,972],{"class":834},[803,1061,1062],{"class":959}," HamiltonTipRack_300",[803,1064,1034],{"class":834},[803,1066,1067],{"class":1037},"filled_with",[803,1069,972],{"class":834},[803,1071,1072],{"class":959},"HamiltonTip_300",[803,1074,846],{"class":834},[803,1076,1077],{"class":1037}," identifier",[803,1079,972],{"class":834},[803,1081,1043],{"class":834},[803,1083,1084],{"class":1046},"tip_rack",[803,1086,1043],{"class":834},[803,1088,892],{"class":834},[803,1090,1092,1095,1098,1102,1105,1108],{"class":805,"line":1091},19,[803,1093,1094],{"class":813},"    tip_carrier",[803,1096,1097],{"class":834},"[",[803,1099,1101],{"class":1100},"sbssI","0",[803,1103,1104],{"class":834},"]",[803,1106,1107],{"class":834}," =",[803,1109,1110],{"class":813}," tip_rack\n",[803,1112,1114],{"class":805,"line":1113},20,[803,1115,946],{"emptyLinePlaceholder":945},[803,1117,1119,1122,1124,1126,1128,1130,1132,1134,1137,1139],{"class":805,"line":1118},21,[803,1120,1121],{"class":813},"    plate_carrier ",[803,1123,972],{"class":834},[803,1125,934],{"class":959},[803,1127,1034],{"class":834},[803,1129,1038],{"class":1037},[803,1131,972],{"class":834},[803,1133,1043],{"class":834},[803,1135,1136],{"class":1046},"plate_carrier",[803,1138,1043],{"class":834},[803,1140,892],{"class":834},[803,1142,1144,1147,1149,1152,1154,1156,1158,1160,1163,1165],{"class":805,"line":1143},22,[803,1145,1146],{"class":813},"    plate ",[803,1148,972],{"class":834},[803,1150,1151],{"class":959}," Standard96Plate",[803,1153,1034],{"class":834},[803,1155,1038],{"class":1037},[803,1157,972],{"class":834},[803,1159,1043],{"class":834},[803,1161,1162],{"class":1046},"plate",[803,1164,1043],{"class":834},[803,1166,892],{"class":834},[803,1168,1170,1173,1176,1179,1182,1184,1186,1189,1191,1193,1195,1198,1200],{"class":805,"line":1169},23,[803,1171,1172],{"class":809},"    for",[803,1174,1175],{"class":813}," well ",[803,1177,1178],{"class":809},"in",[803,1180,1181],{"class":813}," plate",[803,1183,1097],{"class":834},[803,1185,1043],{"class":834},[803,1187,1188],{"class":1046},"A1",[803,1190,1043],{"class":834},[803,1192,776],{"class":834},[803,1194,1043],{"class":834},[803,1196,1197],{"class":1046},"H1",[803,1199,1043],{"class":834},[803,1201,1202],{"class":834},"]:\n",[803,1204,1206,1209,1211,1215,1217,1220,1222,1225,1227,1230,1232,1235],{"class":805,"line":1205},24,[803,1207,1208],{"class":813},"        well",[803,1210,835],{"class":834},[803,1212,1214],{"class":1213},"swJcz","container",[803,1216,835],{"class":834},[803,1218,1219],{"class":959},"add_liquid",[803,1221,1034],{"class":834},[803,1223,1224],{"class":959},"Liquid",[803,1226,835],{"class":834},[803,1228,1229],{"class":1213},"WATER",[803,1231,846],{"class":834},[803,1233,1234],{"class":1100}," 100",[803,1236,892],{"class":834},[803,1238,1240,1243,1245,1247,1249,1251],{"class":805,"line":1239},25,[803,1241,1242],{"class":813},"    plate_carrier",[803,1244,1097],{"class":834},[803,1246,1101],{"class":1100},[803,1248,1104],{"class":834},[803,1250,1107],{"class":834},[803,1252,1253],{"class":813}," plate\n",[803,1255,1257],{"class":805,"line":1256},26,[803,1258,946],{"emptyLinePlaceholder":945},[803,1260,1262,1265,1267,1270,1272,1275,1277,1279,1281,1284,1286,1289],{"class":805,"line":1261},27,[803,1263,1264],{"class":813},"    lh",[803,1266,835],{"class":834},[803,1268,1269],{"class":1213},"deck",[803,1271,835],{"class":834},[803,1273,1274],{"class":959},"add",[803,1276,1034],{"class":834},[803,1278,1047],{"class":959},[803,1280,846],{"class":834},[803,1282,1283],{"class":1037}," track",[803,1285,972],{"class":834},[803,1287,1288],{"class":1100},"1",[803,1290,892],{"class":834},[803,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1317],{"class":805,"line":1293},28,[803,1295,1264],{"class":813},[803,1297,835],{"class":834},[803,1299,1269],{"class":1213},[803,1301,835],{"class":834},[803,1303,1274],{"class":959},[803,1305,1034],{"class":834},[803,1307,1136],{"class":959},[803,1309,846],{"class":834},[803,1311,1283],{"class":1037},[803,1313,972],{"class":834},[803,1315,1316],{"class":1100},"10",[803,1318,892],{"class":834},[803,1320,1322],{"class":805,"line":1321},29,[803,1323,946],{"emptyLinePlaceholder":945},[803,1325,1327],{"class":805,"line":1326},30,[803,1328,1329],{"class":1019},"    # All pipetting operations work normally\n",[803,1331,1333,1336,1338,1340,1342,1344,1346,1349,1351,1353,1355,1357,1360],{"class":805,"line":1332},31,[803,1334,1335],{"class":813},"    tips ",[803,1337,972],{"class":834},[803,1339,987],{"class":813},[803,1341,835],{"class":834},[803,1343,1269],{"class":1213},[803,1345,835],{"class":834},[803,1347,1348],{"class":959},"get",[803,1350,1034],{"class":834},[803,1352,1043],{"class":834},[803,1354,1084],{"class":1046},[803,1356,1043],{"class":834},[803,1358,1359],{"class":834},")",[803,1361,1362],{"class":1019}," # or just use tip_rack\n",[803,1364,1366,1368,1370,1373,1375,1378,1380,1383,1385,1388],{"class":805,"line":1365},32,[803,1367,1335],{"class":813},[803,1369,972],{"class":834},[803,1371,1372],{"class":813}," typing",[803,1374,835],{"class":834},[803,1376,1377],{"class":959},"cast",[803,1379,1034],{"class":834},[803,1381,1382],{"class":959},"TIP_CAR_480_A00",[803,1384,846],{"class":834},[803,1386,1387],{"class":959}," tips",[803,1389,892],{"class":834},[803,1391,1393,1395,1397,1399,1402,1404,1407,1409,1412,1414,1417,1419,1422,1425,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446,1448],{"class":805,"line":1392},33,[803,1394,984],{"class":809},[803,1396,987],{"class":813},[803,1398,835],{"class":834},[803,1400,1401],{"class":1213},"pipettes",[803,1403,835],{"class":834},[803,1405,1406],{"class":959},"pick_up_tips",[803,1408,1034],{"class":834},[803,1410,1411],{"class":1037},"channels",[803,1413,972],{"class":834},[803,1415,1416],{"class":959},"range",[803,1418,1034],{"class":834},[803,1420,1421],{"class":1100},"8",[803,1423,1424],{"class":834},"),",[803,1426,1427],{"class":1037}," spots",[803,1429,972],{"class":834},[803,1431,1084],{"class":959},[803,1433,1097],{"class":834},[803,1435,1043],{"class":834},[803,1437,1188],{"class":1046},[803,1439,1043],{"class":834},[803,1441,776],{"class":834},[803,1443,1043],{"class":834},[803,1445,1197],{"class":1046},[803,1447,1043],{"class":834},[803,1449,1450],{"class":834},"])\n",[803,1452,1454,1456,1458,1460,1462,1464,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1490,1493,1496,1499,1501,1504,1507],{"class":805,"line":1453},34,[803,1455,984],{"class":809},[803,1457,987],{"class":813},[803,1459,835],{"class":834},[803,1461,1401],{"class":1213},[803,1463,835],{"class":834},[803,1465,1466],{"class":959},"aspirate",[803,1468,1034],{"class":834},[803,1470,1162],{"class":959},[803,1472,1097],{"class":834},[803,1474,1043],{"class":834},[803,1476,1188],{"class":1046},[803,1478,1043],{"class":834},[803,1480,776],{"class":834},[803,1482,1043],{"class":834},[803,1484,1197],{"class":1046},[803,1486,1043],{"class":834},[803,1488,1489],{"class":834},"],",[803,1491,1492],{"class":1037}," volume",[803,1494,1495],{"class":834},"=[",[803,1497,1498],{"class":1100},"100",[803,1500,1104],{"class":834},[803,1502,1503],{"class":834}," *",[803,1505,1506],{"class":1100}," 8",[803,1508,892],{"class":834},[803,1510,1512,1514,1516,1518,1520,1522,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559],{"class":805,"line":1511},35,[803,1513,984],{"class":809},[803,1515,987],{"class":813},[803,1517,835],{"class":834},[803,1519,1401],{"class":1213},[803,1521,835],{"class":834},[803,1523,1524],{"class":959},"dispense",[803,1526,1034],{"class":834},[803,1528,1162],{"class":959},[803,1530,1097],{"class":834},[803,1532,1043],{"class":834},[803,1534,1188],{"class":1046},[803,1536,1043],{"class":834},[803,1538,776],{"class":834},[803,1540,1043],{"class":834},[803,1542,1197],{"class":1046},[803,1544,1043],{"class":834},[803,1546,1489],{"class":834},[803,1548,1492],{"class":1037},[803,1550,1495],{"class":834},[803,1552,1498],{"class":1100},[803,1554,1104],{"class":834},[803,1556,1503],{"class":834},[803,1558,1506],{"class":1100},[803,1560,892],{"class":834},[803,1562,1564,1566,1568,1570,1572,1574,1577],{"class":805,"line":1563},36,[803,1565,984],{"class":809},[803,1567,987],{"class":813},[803,1569,835],{"class":834},[803,1571,1401],{"class":1213},[803,1573,835],{"class":834},[803,1575,1576],{"class":959},"drop_tips",[803,1578,978],{"class":834},[803,1580,1582],{"class":805,"line":1581},37,[803,1583,946],{"emptyLinePlaceholder":945},[803,1585,1587,1590,1592,1594,1597,1599],{"class":805,"line":1586},38,[803,1588,1589],{"class":959},"    print",[803,1591,1034],{"class":834},[803,1593,1043],{"class":834},[803,1595,1596],{"class":1046},"Protocol completed in simulation.",[803,1598,1043],{"class":834},[803,1600,892],{"class":834},[803,1602,1604],{"class":805,"line":1603},39,[803,1605,946],{"emptyLinePlaceholder":945},[803,1607,1609,1612,1614,1617,1619,1622],{"class":805,"line":1608},40,[803,1610,1611],{"class":813},"asyncio",[803,1613,835],{"class":834},[803,1615,1616],{"class":959},"run",[803,1618,1034],{"class":834},[803,1620,1621],{"class":959},"main",[803,1623,1624],{"class":834},"())\n",[765,1626,1628],{"id":1627},"configuring-the-mock","Configuring the mock",[756,1630,1631],{},"The mock ships with a default configuration based on a Microlab STARlet with all supported modules enabled. For accurate deck dimension checks and module availability, override this with your device's actual configuration.",[756,1633,1634,1635,1638],{},"You can read and modify the configuration object, then call ",[773,1636,1637],{},"configure()"," to apply it:",[794,1640,1642],{"className":796,"code":1641,"language":798,"meta":799,"style":799},"from decimal import Decimal\n\nlh = MicrolabSTARMock()\nconfiguration = await lh.get_configuration()\n\n# Set STAR deck dimensions\nconfiguration.deck_track_count = 54\nconfiguration.autoload_track_count = 54\nconfiguration.waste_x = Decimal('1340.0')\nconfiguration.max_x = Decimal('1140.0')\n\n# Enable installed modules\nconfiguration.iswap = 'left'\nconfiguration.core96 = 'left'\nconfiguration.autoload = 'Scanner'\n\nawait lh.configure()\n",[773,1643,1644,1656,1660,1671,1690,1694,1699,1714,1727,1753,1777,1781,1786,1806,1823,1841,1845],{"__ignoreMap":799},[803,1645,1646,1648,1651,1653],{"class":805,"line":806},[803,1647,828],{"class":809},[803,1649,1650],{"class":813}," decimal ",[803,1652,810],{"class":809},[803,1654,1655],{"class":813}," Decimal\n",[803,1657,1658],{"class":805,"line":817},[803,1659,946],{"emptyLinePlaceholder":945},[803,1661,1662,1665,1667,1669],{"class":805,"line":825},[803,1663,1664],{"class":813},"lh ",[803,1666,972],{"class":834},[803,1668,975],{"class":959},[803,1670,978],{"class":834},[803,1672,1673,1676,1678,1681,1683,1685,1688],{"class":805,"line":852},[803,1674,1675],{"class":813},"configuration ",[803,1677,972],{"class":834},[803,1679,1680],{"class":809}," await",[803,1682,987],{"class":813},[803,1684,835],{"class":834},[803,1686,1687],{"class":959},"get_configuration",[803,1689,978],{"class":834},[803,1691,1692],{"class":805,"line":874},[803,1693,946],{"emptyLinePlaceholder":945},[803,1695,1696],{"class":805,"line":883},[803,1697,1698],{"class":1019},"# Set STAR deck dimensions\n",[803,1700,1701,1704,1706,1709,1711],{"class":805,"line":889},[803,1702,1703],{"class":813},"configuration",[803,1705,835],{"class":834},[803,1707,1708],{"class":1213},"deck_track_count",[803,1710,1107],{"class":834},[803,1712,1713],{"class":1100}," 54\n",[803,1715,1716,1718,1720,1723,1725],{"class":805,"line":895},[803,1717,1703],{"class":813},[803,1719,835],{"class":834},[803,1721,1722],{"class":1213},"autoload_track_count",[803,1724,1107],{"class":834},[803,1726,1713],{"class":1100},[803,1728,1729,1731,1733,1736,1738,1741,1743,1746,1749,1751],{"class":805,"line":917},[803,1730,1703],{"class":813},[803,1732,835],{"class":834},[803,1734,1735],{"class":1213},"waste_x",[803,1737,1107],{"class":834},[803,1739,1740],{"class":959}," Decimal",[803,1742,1034],{"class":834},[803,1744,1745],{"class":834},"'",[803,1747,1748],{"class":1046},"1340.0",[803,1750,1745],{"class":834},[803,1752,892],{"class":834},[803,1754,1755,1757,1759,1762,1764,1766,1768,1770,1773,1775],{"class":805,"line":942},[803,1756,1703],{"class":813},[803,1758,835],{"class":834},[803,1760,1761],{"class":1213},"max_x",[803,1763,1107],{"class":834},[803,1765,1740],{"class":959},[803,1767,1034],{"class":834},[803,1769,1745],{"class":834},[803,1771,1772],{"class":1046},"1140.0",[803,1774,1745],{"class":834},[803,1776,892],{"class":834},[803,1778,1779],{"class":805,"line":949},[803,1780,946],{"emptyLinePlaceholder":945},[803,1782,1783],{"class":805,"line":966},[803,1784,1785],{"class":1019},"# Enable installed modules\n",[803,1787,1788,1790,1792,1795,1797,1800,1803],{"class":805,"line":981},[803,1789,1703],{"class":813},[803,1791,835],{"class":834},[803,1793,1794],{"class":1213},"iswap",[803,1796,1107],{"class":834},[803,1798,1799],{"class":834}," '",[803,1801,1802],{"class":1046},"left",[803,1804,1805],{"class":834},"'\n",[803,1807,1808,1810,1812,1815,1817,1819,1821],{"class":805,"line":997},[803,1809,1703],{"class":813},[803,1811,835],{"class":834},[803,1813,1814],{"class":1213},"core96",[803,1816,1107],{"class":834},[803,1818,1799],{"class":834},[803,1820,1802],{"class":1046},[803,1822,1805],{"class":834},[803,1824,1825,1827,1829,1832,1834,1836,1839],{"class":805,"line":1011},[803,1826,1703],{"class":813},[803,1828,835],{"class":834},[803,1830,1831],{"class":1213},"autoload",[803,1833,1107],{"class":834},[803,1835,1799],{"class":834},[803,1837,1838],{"class":1046},"Scanner",[803,1840,1805],{"class":834},[803,1842,1843],{"class":805,"line":1016},[803,1844,946],{"emptyLinePlaceholder":945},[803,1846,1847,1850,1852,1854,1856],{"class":805,"line":1023},[803,1848,1849],{"class":809},"await",[803,1851,987],{"class":813},[803,1853,835],{"class":834},[803,1855,992],{"class":959},[803,1857,978],{"class":834},[756,1859,1860],{},"Alternatively, pass a pre-built configuration object directly to the constructor:",[794,1862,1864],{"className":796,"code":1863,"language":798,"meta":799,"style":799},"from decimal import Decimal\nfrom unitelabs.liquid_handling.hamilton.interfaces import MicrolabSTARConfiguration\nfrom unitelabs.liquid_handling.testing import MicrolabSTARMock\n\nconfiguration = MicrolabSTARConfiguration(\n    deck_track_count=54,\n    autoload_track_count=54,\n    waste_x=Decimal('1340.0'),\n    max_x=Decimal('1140.0'),\n    iswap='left',\n    core96='left',\n    autoload='Scanner',\n)\n\nlh = MicrolabSTARMock(configuration=configuration)\nawait lh.configure()\n",[773,1865,1866,1876,1901,1919,1923,1935,1947,1958,1979,1998,2013,2028,2043,2047,2051,2069],{"__ignoreMap":799},[803,1867,1868,1870,1872,1874],{"class":805,"line":806},[803,1869,828],{"class":809},[803,1871,1650],{"class":813},[803,1873,810],{"class":809},[803,1875,1655],{"class":813},[803,1877,1878,1880,1882,1884,1886,1888,1891,1893,1896,1898],{"class":805,"line":817},[803,1879,828],{"class":809},[803,1881,831],{"class":813},[803,1883,835],{"class":834},[803,1885,904],{"class":813},[803,1887,835],{"class":834},[803,1889,1890],{"class":813},"hamilton",[803,1892,835],{"class":834},[803,1894,1895],{"class":813},"interfaces ",[803,1897,810],{"class":809},[803,1899,1900],{"class":813}," MicrolabSTARConfiguration\n",[803,1902,1903,1905,1907,1909,1911,1913,1915,1917],{"class":805,"line":825},[803,1904,828],{"class":809},[803,1906,831],{"class":813},[803,1908,835],{"class":834},[803,1910,904],{"class":813},[803,1912,835],{"class":834},[803,1914,909],{"class":813},[803,1916,810],{"class":809},[803,1918,914],{"class":813},[803,1920,1921],{"class":805,"line":852},[803,1922,946],{"emptyLinePlaceholder":945},[803,1924,1925,1927,1929,1932],{"class":805,"line":874},[803,1926,1675],{"class":813},[803,1928,972],{"class":834},[803,1930,1931],{"class":959}," MicrolabSTARConfiguration",[803,1933,1934],{"class":834},"(\n",[803,1936,1937,1940,1942,1945],{"class":805,"line":883},[803,1938,1939],{"class":1037},"    deck_track_count",[803,1941,972],{"class":834},[803,1943,1944],{"class":1100},"54",[803,1946,880],{"class":834},[803,1948,1949,1952,1954,1956],{"class":805,"line":889},[803,1950,1951],{"class":1037},"    autoload_track_count",[803,1953,972],{"class":834},[803,1955,1944],{"class":1100},[803,1957,880],{"class":834},[803,1959,1960,1963,1965,1968,1970,1972,1974,1976],{"class":805,"line":895},[803,1961,1962],{"class":1037},"    waste_x",[803,1964,972],{"class":834},[803,1966,1967],{"class":959},"Decimal",[803,1969,1034],{"class":834},[803,1971,1745],{"class":834},[803,1973,1748],{"class":1046},[803,1975,1745],{"class":834},[803,1977,1978],{"class":834},"),\n",[803,1980,1981,1984,1986,1988,1990,1992,1994,1996],{"class":805,"line":917},[803,1982,1983],{"class":1037},"    max_x",[803,1985,972],{"class":834},[803,1987,1967],{"class":959},[803,1989,1034],{"class":834},[803,1991,1745],{"class":834},[803,1993,1772],{"class":1046},[803,1995,1745],{"class":834},[803,1997,1978],{"class":834},[803,1999,2000,2003,2005,2007,2009,2011],{"class":805,"line":942},[803,2001,2002],{"class":1037},"    iswap",[803,2004,972],{"class":834},[803,2006,1745],{"class":834},[803,2008,1802],{"class":1046},[803,2010,1745],{"class":834},[803,2012,880],{"class":834},[803,2014,2015,2018,2020,2022,2024,2026],{"class":805,"line":949},[803,2016,2017],{"class":1037},"    core96",[803,2019,972],{"class":834},[803,2021,1745],{"class":834},[803,2023,1802],{"class":1046},[803,2025,1745],{"class":834},[803,2027,880],{"class":834},[803,2029,2030,2033,2035,2037,2039,2041],{"class":805,"line":966},[803,2031,2032],{"class":1037},"    autoload",[803,2034,972],{"class":834},[803,2036,1745],{"class":834},[803,2038,1838],{"class":1046},[803,2040,1745],{"class":834},[803,2042,880],{"class":834},[803,2044,2045],{"class":805,"line":981},[803,2046,892],{"class":834},[803,2048,2049],{"class":805,"line":997},[803,2050,946],{"emptyLinePlaceholder":945},[803,2052,2053,2055,2057,2059,2061,2063,2065,2067],{"class":805,"line":1011},[803,2054,1664],{"class":813},[803,2056,972],{"class":834},[803,2058,975],{"class":959},[803,2060,1034],{"class":834},[803,2062,1703],{"class":1037},[803,2064,972],{"class":834},[803,2066,1703],{"class":959},[803,2068,892],{"class":834},[803,2070,2071,2073,2075,2077,2079],{"class":805,"line":1016},[803,2072,1849],{"class":809},[803,2074,987],{"class":813},[803,2076,835],{"class":834},[803,2078,992],{"class":959},[803,2080,978],{"class":834},[756,2082,2083],{},"You can verify any attribute directly after configuring:",[794,2085,2087],{"className":796,"code":2086,"language":798,"meta":799,"style":799},"print(lh.configuration.deck_track_count)\nprint(lh.configuration.iswap)\n# 54\n# 'left'\n",[773,2088,2089,2109,2127,2132],{"__ignoreMap":799},[803,2090,2091,2094,2096,2099,2101,2103,2105,2107],{"class":805,"line":806},[803,2092,2093],{"class":959},"print",[803,2095,1034],{"class":834},[803,2097,2098],{"class":959},"lh",[803,2100,835],{"class":834},[803,2102,1703],{"class":1213},[803,2104,835],{"class":834},[803,2106,1708],{"class":1213},[803,2108,892],{"class":834},[803,2110,2111,2113,2115,2117,2119,2121,2123,2125],{"class":805,"line":817},[803,2112,2093],{"class":959},[803,2114,1034],{"class":834},[803,2116,2098],{"class":959},[803,2118,835],{"class":834},[803,2120,1703],{"class":1213},[803,2122,835],{"class":834},[803,2124,1794],{"class":1213},[803,2126,892],{"class":834},[803,2128,2129],{"class":805,"line":825},[803,2130,2131],{"class":1019},"# 54\n",[803,2133,2134],{"class":805,"line":852},[803,2135,2136],{"class":1019},"# 'left'\n",[765,2138,2140],{"id":2139},"initialization-and-movement","Initialization and movement",[756,2142,2143,2144,2147],{},"Call ",[773,2145,2146],{},"initialize()"," before issuing movement or pipetting commands. After initialization, you can inspect current channel positions:",[794,2149,2151],{"className":796,"code":2150,"language":798,"meta":799,"style":799},"await lh.initialize()\nawait lh.pipettes.initialize()\n\nprint(await lh.pipettes.current_locations())\n# [Vector(x=..., y=..., z=...), ...]\n",[773,2152,2153,2165,2181,2185,2206],{"__ignoreMap":799},[803,2154,2155,2157,2159,2161,2163],{"class":805,"line":806},[803,2156,1849],{"class":809},[803,2158,987],{"class":813},[803,2160,835],{"class":834},[803,2162,1006],{"class":959},[803,2164,978],{"class":834},[803,2166,2167,2169,2171,2173,2175,2177,2179],{"class":805,"line":817},[803,2168,1849],{"class":809},[803,2170,987],{"class":813},[803,2172,835],{"class":834},[803,2174,1401],{"class":1213},[803,2176,835],{"class":834},[803,2178,1006],{"class":959},[803,2180,978],{"class":834},[803,2182,2183],{"class":805,"line":825},[803,2184,946],{"emptyLinePlaceholder":945},[803,2186,2187,2189,2191,2193,2195,2197,2199,2201,2204],{"class":805,"line":852},[803,2188,2093],{"class":959},[803,2190,1034],{"class":834},[803,2192,1849],{"class":809},[803,2194,987],{"class":959},[803,2196,835],{"class":834},[803,2198,1401],{"class":1213},[803,2200,835],{"class":834},[803,2202,2203],{"class":959},"current_locations",[803,2205,1624],{"class":834},[803,2207,2208],{"class":805,"line":874},[803,2209,2210],{"class":1019},"# [Vector(x=..., y=..., z=...), ...]\n",[756,2212,2213],{},"Movement commands to locations within the configured deck bounds execute without error:",[794,2215,2217],{"className":796,"code":2216,"language":798,"meta":799,"style":799},"from unitelabs.labware import Vector\n\nawait lh.pipettes[0].move_to(Vector(x=Decimal('100'), y=Decimal('100'), z=Decimal('300')))\n",[773,2218,2219,2234,2238],{"__ignoreMap":799},[803,2220,2221,2223,2225,2227,2229,2231],{"class":805,"line":806},[803,2222,828],{"class":809},[803,2224,831],{"class":813},[803,2226,835],{"class":834},[803,2228,838],{"class":813},[803,2230,810],{"class":809},[803,2232,2233],{"class":813}," Vector\n",[803,2235,2236],{"class":805,"line":817},[803,2237,946],{"emptyLinePlaceholder":945},[803,2239,2240,2242,2244,2246,2248,2250,2252,2255,2258,2260,2263,2265,2268,2270,2272,2274,2276,2278,2280,2282,2285,2287,2289,2291,2293,2295,2297,2299,2302,2304,2306,2308,2310,2313,2315],{"class":805,"line":825},[803,2241,1849],{"class":809},[803,2243,987],{"class":813},[803,2245,835],{"class":834},[803,2247,1401],{"class":1213},[803,2249,1097],{"class":834},[803,2251,1101],{"class":1100},[803,2253,2254],{"class":834},"].",[803,2256,2257],{"class":959},"move_to",[803,2259,1034],{"class":834},[803,2261,2262],{"class":959},"Vector",[803,2264,1034],{"class":834},[803,2266,2267],{"class":1037},"x",[803,2269,972],{"class":834},[803,2271,1967],{"class":959},[803,2273,1034],{"class":834},[803,2275,1745],{"class":834},[803,2277,1498],{"class":1046},[803,2279,1745],{"class":834},[803,2281,1424],{"class":834},[803,2283,2284],{"class":1037}," y",[803,2286,972],{"class":834},[803,2288,1967],{"class":959},[803,2290,1034],{"class":834},[803,2292,1745],{"class":834},[803,2294,1498],{"class":1046},[803,2296,1745],{"class":834},[803,2298,1424],{"class":834},[803,2300,2301],{"class":1037}," z",[803,2303,972],{"class":834},[803,2305,1967],{"class":959},[803,2307,1034],{"class":834},[803,2309,1745],{"class":834},[803,2311,2312],{"class":1046},"300",[803,2314,1745],{"class":834},[803,2316,2317],{"class":834},")))\n",[756,2319,2320,2321,2324],{},"Note: ",[773,2322,2323],{},"await lh.is_initialized()"," does not reflect the expected initialization status in the mock. Check initialization state by attempting a movement instead.",[765,2326,2328],{"id":2327},"activating-modules","Activating modules",[756,2330,2331],{},"Any module present in the configuration can be activated:",[794,2333,2335],{"className":796,"code":2334,"language":798,"meta":799,"style":799},"await lh.iswap.activate()\n",[773,2336,2337],{"__ignoreMap":799},[803,2338,2339,2341,2343,2345,2347,2349,2352],{"class":805,"line":806},[803,2340,1849],{"class":809},[803,2342,987],{"class":813},[803,2344,835],{"class":834},[803,2346,1794],{"class":1213},[803,2348,835],{"class":834},[803,2350,2351],{"class":959},"activate",[803,2353,978],{"class":834},[756,2355,2356],{},"To simulate initialization errors or recover a module that fails to activate, set its stage manually before initializing:",[794,2358,2360],{"className":796,"code":2359,"language":798,"meta":799,"style":799},"from unitelabs.liquid_handling.modules import Stage\n\nlh.configuration['iswap'] = True\nlh.iswap._stage = Stage.CONFIGURED\nawait lh.iswap.initialize()\nawait lh.iswap.activate()\n",[773,2361,2362,2382,2386,2409,2432,2448],{"__ignoreMap":799},[803,2363,2364,2366,2368,2370,2372,2374,2377,2379],{"class":805,"line":806},[803,2365,828],{"class":809},[803,2367,831],{"class":813},[803,2369,835],{"class":834},[803,2371,904],{"class":813},[803,2373,835],{"class":834},[803,2375,2376],{"class":813},"modules ",[803,2378,810],{"class":809},[803,2380,2381],{"class":813}," Stage\n",[803,2383,2384],{"class":805,"line":817},[803,2385,946],{"emptyLinePlaceholder":945},[803,2387,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406],{"class":805,"line":825},[803,2389,2098],{"class":813},[803,2391,835],{"class":834},[803,2393,1703],{"class":1213},[803,2395,1097],{"class":834},[803,2397,1745],{"class":834},[803,2399,1794],{"class":1046},[803,2401,1745],{"class":834},[803,2403,1104],{"class":834},[803,2405,1107],{"class":834},[803,2407,2408],{"class":834}," True\n",[803,2410,2411,2413,2415,2417,2419,2422,2424,2427,2429],{"class":805,"line":852},[803,2412,2098],{"class":813},[803,2414,835],{"class":834},[803,2416,1794],{"class":1213},[803,2418,835],{"class":834},[803,2420,2421],{"class":1213},"_stage",[803,2423,1107],{"class":834},[803,2425,2426],{"class":813}," Stage",[803,2428,835],{"class":834},[803,2430,2431],{"class":1213},"CONFIGURED\n",[803,2433,2434,2436,2438,2440,2442,2444,2446],{"class":805,"line":874},[803,2435,1849],{"class":809},[803,2437,987],{"class":813},[803,2439,835],{"class":834},[803,2441,1794],{"class":1213},[803,2443,835],{"class":834},[803,2445,1006],{"class":959},[803,2447,978],{"class":834},[803,2449,2450,2452,2454,2456,2458,2460,2462],{"class":805,"line":883},[803,2451,1849],{"class":809},[803,2453,987],{"class":813},[803,2455,835],{"class":834},[803,2457,1794],{"class":1213},[803,2459,835],{"class":834},[803,2461,2351],{"class":959},[803,2463,978],{"class":834},[765,2465,2467],{"id":2466},"checking-liquid-state","Checking liquid state",[756,2469,2470],{},"One of the most useful properties of simulation is that the liquid model runs in full. You can inspect volumes after each operation to verify your protocol logic:",[794,2472,2474],{"className":796,"code":2473,"language":798,"meta":799,"style":799},"await lh.pipettes.pick_up_tips(channels=range(8), spots=tip_rack[\"A2\":\"H2\"])\nawait lh.pipettes.aspirate(plate[\"A1\"], channels=[0], volume=[50])\nprint(plate[\"A1\"].container.volume)  # 50 µL removed from the well\n\nawait lh.pipettes.dispense(plate[\"B1\"], channels=[0], volume=[50])\nprint(plate[\"B1\"].container.volume)  # 50 µL added to B1\n",[773,2475,2476,2530,2576,2606,2610,2655],{"__ignoreMap":799},[803,2477,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514,2517,2519,2521,2523,2526,2528],{"class":805,"line":806},[803,2479,1849],{"class":809},[803,2481,987],{"class":813},[803,2483,835],{"class":834},[803,2485,1401],{"class":1213},[803,2487,835],{"class":834},[803,2489,1406],{"class":959},[803,2491,1034],{"class":834},[803,2493,1411],{"class":1037},[803,2495,972],{"class":834},[803,2497,1416],{"class":959},[803,2499,1034],{"class":834},[803,2501,1421],{"class":1100},[803,2503,1424],{"class":834},[803,2505,1427],{"class":1037},[803,2507,972],{"class":834},[803,2509,1084],{"class":959},[803,2511,1097],{"class":834},[803,2513,1043],{"class":834},[803,2515,2516],{"class":1046},"A2",[803,2518,1043],{"class":834},[803,2520,776],{"class":834},[803,2522,1043],{"class":834},[803,2524,2525],{"class":1046},"H2",[803,2527,1043],{"class":834},[803,2529,1450],{"class":834},[803,2531,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2561,2563,2565,2567,2569,2571,2574],{"class":805,"line":817},[803,2533,1849],{"class":809},[803,2535,987],{"class":813},[803,2537,835],{"class":834},[803,2539,1401],{"class":1213},[803,2541,835],{"class":834},[803,2543,1466],{"class":959},[803,2545,1034],{"class":834},[803,2547,1162],{"class":959},[803,2549,1097],{"class":834},[803,2551,1043],{"class":834},[803,2553,1188],{"class":1046},[803,2555,1043],{"class":834},[803,2557,1489],{"class":834},[803,2559,2560],{"class":1037}," channels",[803,2562,1495],{"class":834},[803,2564,1101],{"class":1100},[803,2566,1489],{"class":834},[803,2568,1492],{"class":1037},[803,2570,1495],{"class":834},[803,2572,2573],{"class":1100},"50",[803,2575,1450],{"class":834},[803,2577,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2601,2603],{"class":805,"line":825},[803,2579,2093],{"class":959},[803,2581,1034],{"class":834},[803,2583,1162],{"class":959},[803,2585,1097],{"class":834},[803,2587,1043],{"class":834},[803,2589,1188],{"class":1046},[803,2591,1043],{"class":834},[803,2593,2254],{"class":834},[803,2595,1214],{"class":1213},[803,2597,835],{"class":834},[803,2599,2600],{"class":1213},"volume",[803,2602,1359],{"class":834},[803,2604,2605],{"class":1019},"  # 50 µL removed from the well\n",[803,2607,2608],{"class":805,"line":852},[803,2609,946],{"emptyLinePlaceholder":945},[803,2611,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653],{"class":805,"line":874},[803,2613,1849],{"class":809},[803,2615,987],{"class":813},[803,2617,835],{"class":834},[803,2619,1401],{"class":1213},[803,2621,835],{"class":834},[803,2623,1524],{"class":959},[803,2625,1034],{"class":834},[803,2627,1162],{"class":959},[803,2629,1097],{"class":834},[803,2631,1043],{"class":834},[803,2633,2634],{"class":1046},"B1",[803,2636,1043],{"class":834},[803,2638,1489],{"class":834},[803,2640,2560],{"class":1037},[803,2642,1495],{"class":834},[803,2644,1101],{"class":1100},[803,2646,1489],{"class":834},[803,2648,1492],{"class":1037},[803,2650,1495],{"class":834},[803,2652,2573],{"class":1100},[803,2654,1450],{"class":834},[803,2656,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681],{"class":805,"line":883},[803,2658,2093],{"class":959},[803,2660,1034],{"class":834},[803,2662,1162],{"class":959},[803,2664,1097],{"class":834},[803,2666,1043],{"class":834},[803,2668,2634],{"class":1046},[803,2670,1043],{"class":834},[803,2672,2254],{"class":834},[803,2674,1214],{"class":1213},[803,2676,835],{"class":834},[803,2678,2600],{"class":1213},[803,2680,1359],{"class":834},[803,2682,2683],{"class":1019},"  # 50 µL added to B1\n",[756,2685,2686],{},"This catches off-by-one errors, wrong well indexing, and volume miscalculations before any liquid is touched.",[765,2688,2690],{"id":2689},"switching-to-real-hardware","Switching to real hardware",[756,2692,2693],{},"The mock is a drop-in replacement for the real device class. Structure your code with a flag to toggle between them:",[794,2695,2697],{"className":796,"code":2696,"language":798,"meta":799,"style":799},"from unitelabs.liquid_handling.testing import MicrolabSTARMock\n\nmock_run = True\n\nif mock_run:\n    lh = MicrolabSTARMock()\nelse:\n    from unitelabs.liquid_handling.hamilton import MicrolabSTAR\n    from unitelabs.sdk import AsyncApiClient\n\n    client = AsyncApiClient()\n    lh = MicrolabSTAR(name=\"Microlab STAR\", client=client)\n",[773,2698,2699,2717,2721,2730,2734,2745,2755,2762,2782,2798,2802,2814],{"__ignoreMap":799},[803,2700,2701,2703,2705,2707,2709,2711,2713,2715],{"class":805,"line":806},[803,2702,828],{"class":809},[803,2704,831],{"class":813},[803,2706,835],{"class":834},[803,2708,904],{"class":813},[803,2710,835],{"class":834},[803,2712,909],{"class":813},[803,2714,810],{"class":809},[803,2716,914],{"class":813},[803,2718,2719],{"class":805,"line":817},[803,2720,946],{"emptyLinePlaceholder":945},[803,2722,2723,2726,2728],{"class":805,"line":825},[803,2724,2725],{"class":813},"mock_run ",[803,2727,972],{"class":834},[803,2729,2408],{"class":834},[803,2731,2732],{"class":805,"line":852},[803,2733,946],{"emptyLinePlaceholder":945},[803,2735,2736,2739,2742],{"class":805,"line":874},[803,2737,2738],{"class":809},"if",[803,2740,2741],{"class":813}," mock_run",[803,2743,2744],{"class":834},":\n",[803,2746,2747,2749,2751,2753],{"class":805,"line":883},[803,2748,969],{"class":813},[803,2750,972],{"class":834},[803,2752,975],{"class":959},[803,2754,978],{"class":834},[803,2756,2757,2760],{"class":805,"line":889},[803,2758,2759],{"class":809},"else",[803,2761,2744],{"class":834},[803,2763,2764,2767,2769,2771,2773,2775,2777,2779],{"class":805,"line":895},[803,2765,2766],{"class":809},"    from",[803,2768,831],{"class":813},[803,2770,835],{"class":834},[803,2772,904],{"class":813},[803,2774,835],{"class":834},[803,2776,866],{"class":813},[803,2778,810],{"class":809},[803,2780,2781],{"class":813}," MicrolabSTAR\n",[803,2783,2784,2786,2788,2790,2793,2795],{"class":805,"line":917},[803,2785,2766],{"class":809},[803,2787,831],{"class":813},[803,2789,835],{"class":834},[803,2791,2792],{"class":813},"sdk ",[803,2794,810],{"class":809},[803,2796,2797],{"class":813}," AsyncApiClient\n",[803,2799,2800],{"class":805,"line":942},[803,2801,946],{"emptyLinePlaceholder":945},[803,2803,2804,2807,2809,2812],{"class":805,"line":949},[803,2805,2806],{"class":813},"    client ",[803,2808,972],{"class":834},[803,2810,2811],{"class":959}," AsyncApiClient",[803,2813,978],{"class":834},[803,2815,2816,2818,2820,2823,2825,2828,2830,2832,2835,2837,2839,2842,2844,2847],{"class":805,"line":966},[803,2817,969],{"class":813},[803,2819,972],{"class":834},[803,2821,2822],{"class":959}," MicrolabSTAR",[803,2824,1034],{"class":834},[803,2826,2827],{"class":1037},"name",[803,2829,972],{"class":834},[803,2831,1043],{"class":834},[803,2833,2834],{"class":1046},"Microlab STAR",[803,2836,1043],{"class":834},[803,2838,846],{"class":834},[803,2840,2841],{"class":1037}," client",[803,2843,972],{"class":834},[803,2845,2846],{"class":959},"client",[803,2848,892],{"class":834},[756,2850,2851],{},"All downstream code (pipetting commands, movement, module use) works identically with either object.",[765,2853,2855],{"id":2854},"next-steps","Next steps",[778,2857,2858,2863,2868],{},[781,2859,2860],{},[760,2861,246],{"href":2862},"\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling\u002F",[781,2864,2865],{},[760,2866,238],{"href":2867},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting\u002F",[781,2869,2870],{},[760,2871,2873],{"href":2872},"\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning\u002F","Getting Started with Hamilton STAR",[2875,2876,2877],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":799,"searchDepth":806,"depth":817,"links":2879},[2880,2881,2882,2883,2884,2885,2886],{"id":767,"depth":817,"text":768},{"id":1627,"depth":817,"text":1628},{"id":2139,"depth":817,"text":2140},{"id":2327,"depth":817,"text":2328},{"id":2466,"depth":817,"text":2467},{"id":2689,"depth":817,"text":2690},{"id":2854,"depth":817,"text":2855},"Run protocols against a mock liquid handler — drop-in replacement for real hardware, with full liquid tracking and state validation.","md",null,{},{"title":179,"description":2887},"5zAz9ZIADi6PiQ-AJ1gZRjQFMA4g6CO_yeePjeRiWDY",[2894,2896],{"title":253,"path":254,"stem":255,"description":2895},"Moving labware during a run using different available grippers on Hamilton Star, Hamilton Vantage, and Bravo liquid handling stations.",{"title":270,"path":271,"stem":272,"description":2897},"From moving to specific positions to reading out the current position.",1783607772337]