[{"data":1,"prerenderedAt":2184},["ShallowReactive",2],{"navigation":3,"\u002Fget-started\u002Fsetup\u002Fsdk-installation":750,"\u002Fget-started\u002Fsetup\u002Fsdk-installation-surround":2179},[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":77,"body":752,"description":2173,"extension":2174,"links":2175,"meta":2176,"navigation":1440,"path":78,"seo":2177,"stem":79,"__hash__":2178},"docs\u002F01.get-started\u002F20.setup\u002F60.sdk-installation.md",{"type":753,"value":754,"toc":2161},"minimark",[755,759,768,784,789,792,795,860,863,867,870,890,1340,1344,1357,1384,1393,1397,1400,1414,1783,1786,1793,1852,1856,1870,1908,1915,2008,2011,2016,2045,2049,2054,2077,2101,2105,2110,2114,2157],[756,757,758],"p",{},"The UniteLabs SDK provides a simple interface for developers to integrate devices in their applications.",[756,760,761,762,767],{},"This guide is designed to help with the setup of your local development environment and send your first API request. If you are an experienced developer or want to dive right into using the UniteLabs API, the ",[763,764,766],"a",{"href":765},"\u002Ftechnical-reference\u002Frest-api\u002F","Reference"," is a great place to start. You will learn:",[769,770,771,775,778,781],"ul",{},[772,773,774],"li",{},"How to setup your development environment",[772,776,777],{},"How to install the latest SDK",[772,779,780],{},"How to send your first API request",[772,782,783],{},"How to improve the developer experience in your IDE",[785,786,788],"h2",{"id":787},"prerequisites","Prerequisites",[756,790,791],{},"UniteLabs requires Python 3.10 or newer. It is platform independent and works equally on Linux, macOS and Windows.",[756,793,794],{},"Some steps require authentication, therefore you need:",[769,796,797,825],{},[772,798,799,803,804],{},[800,801,802],"strong",{},"UniteLabs Artifactory Access","\nA username and password to install UniteLabs Python packages. UniteLabs packages are not published to PyPI — they are hosted in a private GitLab package registry. This is separate from GroundControl and the Platform; it is simply where the Python packages live.\n",[769,805,806,817],{},[772,807,808,809,812,813],{},"Username: 32 characters separated by dashes.",[810,811],"br",{},"\nExample: ",[814,815,816],"code",{},"56ae938f-484c-41cc-ae54-e4f9b8814fb7",[772,818,819,820,812,822],{},"Password: 22 characters separated by dashes.",[810,821],{},[814,823,824],{},"ahjt-Lk-e1swOPZcWYYGh-mKJ",[772,826,827,830,831],{},[800,828,829],{},"UniteLabs Client Credentials","\nClient ID and secret to authenticate connections made from your local SDK installation (your code\u002Fclient) to the UniteLabs API (the platform).\n",[769,832,833,836,844,852],{},[772,834,835],{},"Client ID: A custom username with variable length.",[772,837,838,839,812,841],{},"Client Secret: 32 characters without separators.",[810,840],{},[814,842,843],{},"YT1a2HFEoi8tiAwl6bv127Tqp0ZXDSru",[772,845,846,847,812,849],{},"Tenant Base URL: 32 characters separated by dashes.",[810,848],{},[814,850,851],{},"https:\u002F\u002Facme-corp.dev.unitelabs.io",[772,853,854,855,812,857],{},"Tenant Auth URL: 32 characters separated by dashes.",[810,856],{},[814,858,859],{},"https:\u002F\u002Fauth.acme-corp.dev.unitelabs.io\u002Frealms\u002Fad2a8e12-2bf2-45d7-9fb1-84bdf7102a8c\u002Fprotocol\u002Fopenid-connect\u002F",[756,861,862],{},"If you are missing one of them, please reach out to your UniteLabs contact.",[785,864,866],{"id":865},"install-packages","Install Packages",[756,868,869],{},"We recommend installing the UniteLabs SDK using a Python virtual environment manager such as uv, Poetry, or venv. All packages are provided in a private package registry which requires configuration and authentication.",[756,871,872,873,876,877,880,881,884,885,889],{},"The examples below install ",[814,874,875],{},"unitelabs-liquid-handling",". This package includes the Liquid Handling SDK, while the labware library ",[814,878,879],{},"unitelabs-labware"," and core UniteLabs SDK (",[814,882,883],{},"unitelabs-sdk",") typically need to be installed as well. See ",[763,886,888],{"href":887},"\u002Fget-started\u002Fwelcome\u002F","The SDK at a Glance"," for the full breakdown.",[891,892,893,1053,1204],"tabs",{},[894,895,898,901,912,917,930,989,994,1022,1027],"div",{"icon":896,"label":897},"i-simple-icons-uv","uv (recommended)",[756,899,900],{},"Uv is a tool that manages dependencies, maintains a lockfile for reproducible installations, manages your virtual environment and can build packages for distribution.",[756,902,903,904,911],{},"If you have not used uv before, you can follow any of the options for installation in the ",[763,905,910],{"href":906,"rel":907,"target":909},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fgetting-started\u002Finstallation\u002F",[908],"nofollow","_blank","official uv installation instructions",".",[756,913,914],{},[800,915,916],{},"1. Prepare uv",[756,918,919,920,923,924,929],{},"Uv supports loading credentials from a user's ",[814,921,922],{},".netrc"," file. We suggest to use this option to provide the UniteLabs Artifactory Access for uv to be able to install the required dependencies. See the\n",[763,925,928],{"href":926,"rel":927,"target":909},"https:\u002F\u002Fdocs.astral.sh\u002Fuv\u002Fconfiguration\u002Fauthentication\u002F#http-authentication",[908],"official uv documentation"," for more info or alternatives.",[931,932,938],"pre",{"className":933,"code":934,"filename":935,"language":936,"meta":937,"style":937},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","machine gitlab.com\nlogin \u003Cusername>\npassword \u003Cpassword>\n","~\u002F.netrc","bash","",[814,939,940,953,973],{"__ignoreMap":937},[941,942,945,949],"span",{"class":943,"line":944},"line",1,[941,946,948],{"class":947},"sBMFI","machine",[941,950,952],{"class":951},"sfazB"," gitlab.com\n",[941,954,956,959,963,966,970],{"class":943,"line":955},2,[941,957,958],{"class":947},"login",[941,960,962],{"class":961},"sMK4o"," \u003C",[941,964,965],{"class":951},"usernam",[941,967,969],{"class":968},"sTEyZ","e",[941,971,972],{"class":961},">\n",[941,974,976,979,981,984,987],{"class":943,"line":975},3,[941,977,978],{"class":947},"password",[941,980,962],{"class":961},[941,982,983],{"class":951},"passwor",[941,985,986],{"class":968},"d",[941,988,972],{"class":961},[756,990,991],{},[800,992,993],{},"2. Setup Project",[931,995,998],{"className":933,"code":996,"filename":997,"language":936,"meta":937,"style":937},"uv init --package my-app\ncd my-app\n","Terminal",[814,999,1000,1014],{"__ignoreMap":937},[941,1001,1002,1005,1008,1011],{"class":943,"line":944},[941,1003,1004],{"class":947},"uv",[941,1006,1007],{"class":951}," init",[941,1009,1010],{"class":951}," --package",[941,1012,1013],{"class":951}," my-app\n",[941,1015,1016,1020],{"class":943,"line":955},[941,1017,1019],{"class":1018},"s2Zo4","cd",[941,1021,1013],{"class":951},[756,1023,1024],{},[800,1025,1026],{},"3. Install UniteLabs",[931,1028,1030],{"className":933,"code":1029,"filename":997,"language":936,"meta":937,"style":937},"uv add unitelabs-liquid-handling \\\n  --index unitelabs=https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\n",[814,1031,1032,1045],{"__ignoreMap":937},[941,1033,1034,1036,1039,1042],{"class":943,"line":944},[941,1035,1004],{"class":947},[941,1037,1038],{"class":951}," add",[941,1040,1041],{"class":951}," unitelabs-liquid-handling",[941,1043,1044],{"class":968}," \\\n",[941,1046,1047,1050],{"class":943,"line":955},[941,1048,1049],{"class":951},"  --index",[941,1051,1052],{"class":951}," unitelabs=https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\n",[894,1054,1057,1060,1072,1077,1087,1131,1135,1159,1163],{"icon":1055,"label":1056},"i-simple-icons-poetry","Poetry",[756,1058,1059],{},"Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install\u002Fupdate) them for you. Poetry offers a lockfile to ensure repeatable installs, and can build your project for distribution.",[756,1061,1062,1063,1066,1067,911],{},"If you have not used ",[814,1064,1065],{},"poetry"," before, you can follow any of the options in the\n",[763,1068,1071],{"href":1069,"rel":1070,"target":909},"https:\u002F\u002Fpython-poetry.org\u002Fdocs\u002F#installation",[908],"official Poetry installation instructions",[756,1073,1074],{},[800,1075,1076],{},"1. Prepare Poetry",[756,1078,1079,1080,1082,1083,1086],{},"When ",[814,1081,1065],{}," is available (try ",[814,1084,1085],{},"poetry -V"," in your terminal), you need to provide the UniteLabs Artifactory Access for poetry to be able to install the required dependencies. Optionally, we suggest to configure poetry to create the Python virtual environment within your project folder.",[931,1088,1090],{"className":933,"code":1089,"filename":997,"language":936,"meta":937,"style":937},"poetry config http-basic.unitelabs \u003Cusername> \u003Cpassword>\npoetry config virtualenvs.in-project true\n",[814,1091,1092,1119],{"__ignoreMap":937},[941,1093,1094,1096,1099,1102,1104,1106,1108,1111,1113,1115,1117],{"class":943,"line":944},[941,1095,1065],{"class":947},[941,1097,1098],{"class":951}," config",[941,1100,1101],{"class":951}," http-basic.unitelabs",[941,1103,962],{"class":961},[941,1105,965],{"class":951},[941,1107,969],{"class":968},[941,1109,1110],{"class":961},">",[941,1112,962],{"class":961},[941,1114,983],{"class":951},[941,1116,986],{"class":968},[941,1118,972],{"class":961},[941,1120,1121,1123,1125,1128],{"class":943,"line":955},[941,1122,1065],{"class":947},[941,1124,1098],{"class":951},[941,1126,1127],{"class":951}," virtualenvs.in-project",[941,1129,1130],{"class":961}," true\n",[756,1132,1133],{},[800,1134,993],{},[931,1136,1138],{"className":933,"code":1137,"filename":997,"language":936,"meta":937,"style":937},"poetry new my-app --src\ncd my-app\n",[814,1139,1140,1153],{"__ignoreMap":937},[941,1141,1142,1144,1147,1150],{"class":943,"line":944},[941,1143,1065],{"class":947},[941,1145,1146],{"class":951}," new",[941,1148,1149],{"class":951}," my-app",[941,1151,1152],{"class":951}," --src\n",[941,1154,1155,1157],{"class":943,"line":955},[941,1156,1019],{"class":1018},[941,1158,1013],{"class":951},[756,1160,1161],{},[800,1162,1026],{},[931,1164,1166],{"className":933,"code":1165,"filename":997,"language":936,"meta":937,"style":937},"poetry source add --priority=supplemental unitelabs \\\n  https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\npoetry add --source unitelabs unitelabs-liquid-handling\n",[814,1167,1168,1185,1190],{"__ignoreMap":937},[941,1169,1170,1172,1175,1177,1180,1183],{"class":943,"line":944},[941,1171,1065],{"class":947},[941,1173,1174],{"class":951}," source",[941,1176,1038],{"class":951},[941,1178,1179],{"class":951}," --priority=supplemental",[941,1181,1182],{"class":951}," unitelabs",[941,1184,1044],{"class":968},[941,1186,1187],{"class":943,"line":955},[941,1188,1189],{"class":951},"  https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\n",[941,1191,1192,1194,1196,1199,1201],{"class":943,"line":975},[941,1193,1065],{"class":947},[941,1195,1038],{"class":951},[941,1197,1198],{"class":951}," --source",[941,1200,1182],{"class":951},[941,1202,1203],{"class":951}," unitelabs-liquid-handling\n",[894,1205,1208,1211,1216,1228,1262,1266,1313,1317],{"icon":1206,"label":1207},"i-simple-icons-python","venv",[756,1209,1210],{},"Venv allows you to manage separate package installations for different projects. It creates a \"virtual\" isolated Python installation.",[756,1212,1213],{},[800,1214,1215],{},"1. Prepare pip",[756,1217,1218,1219,1221,1222,1227],{},"Pip supports loading credentials from a user's ",[814,1220,922],{}," file. We suggest to use this option to provide the UniteLabs\nArtifactory Access for pip to be able to install the required dependencies. See the\n",[763,1223,1226],{"href":1224,"rel":1225,"target":909},"https:\u002F\u002Fpip.pypa.io\u002Fen\u002Fstable\u002Ftopics\u002Fauthentication",[908],"official pip documentation"," for more info or\nalternatives.",[931,1229,1230],{"className":933,"code":934,"filename":935,"language":936,"meta":937,"style":937},[814,1231,1232,1238,1250],{"__ignoreMap":937},[941,1233,1234,1236],{"class":943,"line":944},[941,1235,948],{"class":947},[941,1237,952],{"class":951},[941,1239,1240,1242,1244,1246,1248],{"class":943,"line":955},[941,1241,958],{"class":947},[941,1243,962],{"class":961},[941,1245,965],{"class":951},[941,1247,969],{"class":968},[941,1249,972],{"class":961},[941,1251,1252,1254,1256,1258,1260],{"class":943,"line":975},[941,1253,978],{"class":947},[941,1255,962],{"class":961},[941,1257,983],{"class":951},[941,1259,986],{"class":968},[941,1261,972],{"class":961},[756,1263,1264],{},[800,1265,993],{},[931,1267,1269],{"className":933,"code":1268,"filename":997,"language":936,"meta":937,"style":937},"mkdir my-app\ncd my-app\npython -m venv .venv\n.venv\u002Fbin\u002Fpip install -U pip\n",[814,1270,1271,1278,1284,1298],{"__ignoreMap":937},[941,1272,1273,1276],{"class":943,"line":944},[941,1274,1275],{"class":947},"mkdir",[941,1277,1013],{"class":951},[941,1279,1280,1282],{"class":943,"line":955},[941,1281,1019],{"class":1018},[941,1283,1013],{"class":951},[941,1285,1286,1289,1292,1295],{"class":943,"line":975},[941,1287,1288],{"class":947},"python",[941,1290,1291],{"class":951}," -m",[941,1293,1294],{"class":951}," venv",[941,1296,1297],{"class":951}," .venv\n",[941,1299,1301,1304,1307,1310],{"class":943,"line":1300},4,[941,1302,1303],{"class":947},".venv\u002Fbin\u002Fpip",[941,1305,1306],{"class":951}," install",[941,1308,1309],{"class":951}," -U",[941,1311,1312],{"class":951}," pip\n",[756,1314,1315],{},[800,1316,1026],{},[931,1318,1320],{"className":933,"code":1319,"filename":997,"language":936,"meta":937,"style":937},".venv\u002Fbin\u002Fpip install unitelabs-liquid-handling \\\n  --index-url https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\n",[814,1321,1322,1332],{"__ignoreMap":937},[941,1323,1324,1326,1328,1330],{"class":943,"line":944},[941,1325,1303],{"class":947},[941,1327,1306],{"class":951},[941,1329,1041],{"class":951},[941,1331,1044],{"class":968},[941,1333,1334,1337],{"class":943,"line":955},[941,1335,1336],{"class":951},"  --index-url",[941,1338,1339],{"class":951}," https:\u002F\u002Fgitlab.com\u002Fapi\u002Fv4\u002Fgroups\u002F1009252\u002F-\u002Fpackages\u002Fpypi\u002Fsimple\n",[785,1341,1343],{"id":1342},"authenticate-client","Authenticate Client",[756,1345,1346,1347,1352,1353,1356],{},"You need to authenticate your UniteLabs client to access the UniteLabs API on your behalf. We suggest to use\n",[763,1348,1351],{"href":1349,"rel":1350,"target":909},"https:\u002F\u002Fsaurabh-kumar.com\u002Fpython-dotenv\u002F",[908],"python-dotenv"," to load the UniteLabs Client Credentials from a ",[814,1354,1355],{},".env"," file in\nthe root of your project.",[931,1358,1362],{"className":1359,"code":1360,"filename":1355,"language":1361,"meta":937,"style":937},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","BASE_URL=https:\u002F\u002Fapi.unitelabs.io\u002F\nAUTH_URL=https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003CtenantID>\u002Fprotocol\u002Fopenid-connect\u002F\nCLIENT_ID=\u003CclientID>\nCLIENT_SECRET=\u003CclientSecret>\n","dotenv",[814,1363,1364,1369,1374,1379],{"__ignoreMap":937},[941,1365,1366],{"class":943,"line":944},[941,1367,1368],{},"BASE_URL=https:\u002F\u002Fapi.unitelabs.io\u002F\n",[941,1370,1371],{"class":943,"line":955},[941,1372,1373],{},"AUTH_URL=https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F\u003CtenantID>\u002Fprotocol\u002Fopenid-connect\u002F\n",[941,1375,1376],{"class":943,"line":975},[941,1377,1378],{},"CLIENT_ID=\u003CclientID>\n",[941,1380,1381],{"class":943,"line":1300},[941,1382,1383],{},"CLIENT_SECRET=\u003CclientSecret>\n",[1385,1386,1387],"blockquote",{},[756,1388,1389,1390,1392],{},"Security note:",[810,1391],{},"\nWhen using version control, make sure to exclude the .env file by e.g. adding it to the .gitignore file.",[785,1394,1396],{"id":1395},"send-your-first-request","Send Your First Request",[756,1398,1399],{},"The SDK provides both asynchronous and synchronous clients. Choose based on your application's needs and personal preference:",[769,1401,1402,1408],{},[772,1403,1404,1407],{},[800,1405,1406],{},"AsyncApiClient"," (recommended): For modern async\u002Fawait code, better performance with concurrent operations",[772,1409,1410,1413],{},[800,1411,1412],{},"SyncApiClient",": For simple scripts or blocking code where async is not needed",[891,1415,1416,1639],{},[894,1417,1420],{"icon":1418,"label":1419},"i-heroicons-bolt","Async (Recommended)",[931,1421,1425],{"className":1422,"code":1423,"filename":1424,"language":1288,"meta":937,"style":937},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import asyncio\n\nfrom unitelabs.sdk import AsyncApiClient\nfrom dotenv import load_dotenv\n\n\nasync def main():\n  # Async example (recommended)\n  client = AsyncApiClient()\n  connectors = await client.list_services()\n  for connector in connectors:\n    print(connector.name)\n\n\nif __name__ == \"__main__\":\n  load_dotenv()\n  asyncio.run(main())\n","src\u002Fmy_app\u002F__main__.py",[814,1426,1427,1436,1442,1459,1471,1476,1481,1497,1504,1519,1540,1558,1579,1584,1589,1612,1620],{"__ignoreMap":937},[941,1428,1429,1433],{"class":943,"line":944},[941,1430,1432],{"class":1431},"s7zQu","import",[941,1434,1435],{"class":968}," asyncio\n",[941,1437,1438],{"class":943,"line":955},[941,1439,1441],{"emptyLinePlaceholder":1440},true,"\n",[941,1443,1444,1447,1449,1451,1454,1456],{"class":943,"line":975},[941,1445,1446],{"class":1431},"from",[941,1448,1182],{"class":968},[941,1450,911],{"class":961},[941,1452,1453],{"class":968},"sdk ",[941,1455,1432],{"class":1431},[941,1457,1458],{"class":968}," AsyncApiClient\n",[941,1460,1461,1463,1466,1468],{"class":943,"line":1300},[941,1462,1446],{"class":1431},[941,1464,1465],{"class":968}," dotenv ",[941,1467,1432],{"class":1431},[941,1469,1470],{"class":968}," load_dotenv\n",[941,1472,1474],{"class":943,"line":1473},5,[941,1475,1441],{"emptyLinePlaceholder":1440},[941,1477,1479],{"class":943,"line":1478},6,[941,1480,1441],{"emptyLinePlaceholder":1440},[941,1482,1484,1488,1491,1494],{"class":943,"line":1483},7,[941,1485,1487],{"class":1486},"spNyl","async",[941,1489,1490],{"class":1486}," def",[941,1492,1493],{"class":1018}," main",[941,1495,1496],{"class":961},"():\n",[941,1498,1500],{"class":943,"line":1499},8,[941,1501,1503],{"class":1502},"sHwdD","  # Async example (recommended)\n",[941,1505,1507,1510,1513,1516],{"class":943,"line":1506},9,[941,1508,1509],{"class":968},"  client ",[941,1511,1512],{"class":961},"=",[941,1514,1515],{"class":1018}," AsyncApiClient",[941,1517,1518],{"class":961},"()\n",[941,1520,1522,1525,1527,1530,1533,1535,1538],{"class":943,"line":1521},10,[941,1523,1524],{"class":968},"  connectors ",[941,1526,1512],{"class":961},[941,1528,1529],{"class":1431}," await",[941,1531,1532],{"class":968}," client",[941,1534,911],{"class":961},[941,1536,1537],{"class":1018},"list_services",[941,1539,1518],{"class":961},[941,1541,1543,1546,1549,1552,1555],{"class":943,"line":1542},11,[941,1544,1545],{"class":1431},"  for",[941,1547,1548],{"class":968}," connector ",[941,1550,1551],{"class":1431},"in",[941,1553,1554],{"class":968}," connectors",[941,1556,1557],{"class":961},":\n",[941,1559,1561,1564,1567,1570,1572,1576],{"class":943,"line":1560},12,[941,1562,1563],{"class":1018},"    print",[941,1565,1566],{"class":961},"(",[941,1568,1569],{"class":1018},"connector",[941,1571,911],{"class":961},[941,1573,1575],{"class":1574},"swJcz","name",[941,1577,1578],{"class":961},")\n",[941,1580,1582],{"class":943,"line":1581},13,[941,1583,1441],{"emptyLinePlaceholder":1440},[941,1585,1587],{"class":943,"line":1586},14,[941,1588,1441],{"emptyLinePlaceholder":1440},[941,1590,1592,1595,1598,1601,1604,1607,1610],{"class":943,"line":1591},15,[941,1593,1594],{"class":1431},"if",[941,1596,1597],{"class":968}," __name__ ",[941,1599,1600],{"class":961},"==",[941,1602,1603],{"class":961}," \"",[941,1605,1606],{"class":951},"__main__",[941,1608,1609],{"class":961},"\"",[941,1611,1557],{"class":961},[941,1613,1615,1618],{"class":943,"line":1614},16,[941,1616,1617],{"class":1018},"  load_dotenv",[941,1619,1518],{"class":961},[941,1621,1623,1626,1628,1631,1633,1636],{"class":943,"line":1622},17,[941,1624,1625],{"class":968},"  asyncio",[941,1627,911],{"class":961},[941,1629,1630],{"class":1018},"run",[941,1632,1566],{"class":961},[941,1634,1635],{"class":1018},"main",[941,1637,1638],{"class":961},"())\n",[894,1640,1643],{"icon":1641,"label":1642},"i-heroicons-arrow-path","Sync",[931,1644,1646],{"className":1422,"code":1645,"filename":1424,"language":1288,"meta":937,"style":937},"from unitelabs.sdk import SyncApiClient\nfrom dotenv import load_dotenv\n\n\ndef main():\n  # Synchronous example\n  client = SyncApiClient()\n  connectors = client.list_services()\n  for connector in connectors:\n    print(connector.name)\n\n\nif __name__ == \"__main__\":\n  load_dotenv()\n  main()\n",[814,1647,1648,1663,1673,1677,1681,1690,1695,1706,1720,1732,1746,1750,1754,1770,1776],{"__ignoreMap":937},[941,1649,1650,1652,1654,1656,1658,1660],{"class":943,"line":944},[941,1651,1446],{"class":1431},[941,1653,1182],{"class":968},[941,1655,911],{"class":961},[941,1657,1453],{"class":968},[941,1659,1432],{"class":1431},[941,1661,1662],{"class":968}," SyncApiClient\n",[941,1664,1665,1667,1669,1671],{"class":943,"line":955},[941,1666,1446],{"class":1431},[941,1668,1465],{"class":968},[941,1670,1432],{"class":1431},[941,1672,1470],{"class":968},[941,1674,1675],{"class":943,"line":975},[941,1676,1441],{"emptyLinePlaceholder":1440},[941,1678,1679],{"class":943,"line":1300},[941,1680,1441],{"emptyLinePlaceholder":1440},[941,1682,1683,1686,1688],{"class":943,"line":1473},[941,1684,1685],{"class":1486},"def",[941,1687,1493],{"class":1018},[941,1689,1496],{"class":961},[941,1691,1692],{"class":943,"line":1478},[941,1693,1694],{"class":1502},"  # Synchronous example\n",[941,1696,1697,1699,1701,1704],{"class":943,"line":1483},[941,1698,1509],{"class":968},[941,1700,1512],{"class":961},[941,1702,1703],{"class":1018}," SyncApiClient",[941,1705,1518],{"class":961},[941,1707,1708,1710,1712,1714,1716,1718],{"class":943,"line":1499},[941,1709,1524],{"class":968},[941,1711,1512],{"class":961},[941,1713,1532],{"class":968},[941,1715,911],{"class":961},[941,1717,1537],{"class":1018},[941,1719,1518],{"class":961},[941,1721,1722,1724,1726,1728,1730],{"class":943,"line":1506},[941,1723,1545],{"class":1431},[941,1725,1548],{"class":968},[941,1727,1551],{"class":1431},[941,1729,1554],{"class":968},[941,1731,1557],{"class":961},[941,1733,1734,1736,1738,1740,1742,1744],{"class":943,"line":1521},[941,1735,1563],{"class":1018},[941,1737,1566],{"class":961},[941,1739,1569],{"class":1018},[941,1741,911],{"class":961},[941,1743,1575],{"class":1574},[941,1745,1578],{"class":961},[941,1747,1748],{"class":943,"line":1542},[941,1749,1441],{"emptyLinePlaceholder":1440},[941,1751,1752],{"class":943,"line":1560},[941,1753,1441],{"emptyLinePlaceholder":1440},[941,1755,1756,1758,1760,1762,1764,1766,1768],{"class":943,"line":1581},[941,1757,1594],{"class":1431},[941,1759,1597],{"class":968},[941,1761,1600],{"class":961},[941,1763,1603],{"class":961},[941,1765,1606],{"class":951},[941,1767,1609],{"class":961},[941,1769,1557],{"class":961},[941,1771,1772,1774],{"class":943,"line":1586},[941,1773,1617],{"class":1018},[941,1775,1518],{"class":961},[941,1777,1778,1781],{"class":943,"line":1591},[941,1779,1780],{"class":1018},"  main",[941,1782,1518],{"class":961},[756,1784,1785],{},"Run the script to verify your credentials and confirm the SDK can reach the platform. It should print the names of your connected instruments. This is just a smoke test; in real projects your entry point will vary.",[756,1787,1788,1789,1792],{},"Run the package's ",[814,1790,1791],{},"__main__.py"," file with:",[891,1794,1795,1817,1836],{},[894,1796,1797],{"icon":896,"label":1004},[931,1798,1800],{"className":933,"code":1799,"filename":997,"language":936,"meta":937,"style":937},"uv run python -m my_app\n",[814,1801,1802],{"__ignoreMap":937},[941,1803,1804,1806,1809,1812,1814],{"class":943,"line":944},[941,1805,1004],{"class":947},[941,1807,1808],{"class":951}," run",[941,1810,1811],{"class":951}," python",[941,1813,1291],{"class":951},[941,1815,1816],{"class":951}," my_app\n",[894,1818,1819],{"icon":1055,"label":1056},[931,1820,1822],{"className":933,"code":1821,"filename":997,"language":936,"meta":937,"style":937},"poetry run python -m my_app\n",[814,1823,1824],{"__ignoreMap":937},[941,1825,1826,1828,1830,1832,1834],{"class":943,"line":944},[941,1827,1065],{"class":947},[941,1829,1808],{"class":951},[941,1831,1811],{"class":951},[941,1833,1291],{"class":951},[941,1835,1816],{"class":951},[894,1837,1838],{"icon":1206,"label":1207},[931,1839,1841],{"className":933,"code":1840,"filename":997,"language":936,"meta":937,"style":937},".venv\u002Fbin\u002Fpython -m my_app\n",[814,1842,1843],{"__ignoreMap":937},[941,1844,1845,1848,1850],{"class":943,"line":944},[941,1846,1847],{"class":947},".venv\u002Fbin\u002Fpython",[941,1849,1291],{"class":951},[941,1851,1816],{"class":951},[785,1853,1855],{"id":1854},"versions","Versions",[756,1857,1858,1859,1863,1864,1869],{},"The installation defaults to the latest version. Updates on versions and the corresponding changelogs are posted in the ",[763,1860,1862],{"href":1861},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","Technical Reference Section",". If a defined version is required or needs to be locked, it must be explicitly defined using the ",[763,1865,1868],{"href":1866,"rel":1867},"https:\u002F\u002Fpeps.python.org\u002Fpep-0440\u002F#version-specifiers",[908],"PEP 440 Version Specifier","(==, !=, \u003C, >, \u003C=, >, >=) in the pyproject.toml.",[931,1871,1876],{"className":1872,"code":1873,"filename":1874,"language":1875,"meta":937,"style":937},"language-.toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[project]\nrequires-python = \">=3.10,\u003C4.0\"\ndependencies = [\n    \"unitelabs-liquid-handling~=0.11.0\",\n    \"python-dotenv\",\n]\n","pyproject.toml",".toml",[814,1877,1878,1883,1888,1893,1898,1903],{"__ignoreMap":937},[941,1879,1880],{"class":943,"line":944},[941,1881,1882],{},"[project]\n",[941,1884,1885],{"class":943,"line":955},[941,1886,1887],{},"requires-python = \">=3.10,\u003C4.0\"\n",[941,1889,1890],{"class":943,"line":975},[941,1891,1892],{},"dependencies = [\n",[941,1894,1895],{"class":943,"line":1300},[941,1896,1897],{},"    \"unitelabs-liquid-handling~=0.11.0\",\n",[941,1899,1900],{"class":943,"line":1473},[941,1901,1902],{},"    \"python-dotenv\",\n",[941,1904,1905],{"class":943,"line":1478},[941,1906,1907],{},"]\n",[756,1909,1910,1911,1914],{},"We recommend pinning explicit versions for workflows you plan on running in production. The installed version can be checked using ",[814,1912,1913],{},"__version__",":",[931,1916,1918],{"className":1422,"code":1917,"filename":1791,"language":1288,"meta":937,"style":937},"from unitelabs import labware, liquid_handling, sdk\n\nif __name__ == \"__main__\":\n    print(sdk.__version__)\n    print(labware.__version__)\n    print(liquid_handling.__version__)\n",[814,1919,1920,1943,1947,1963,1978,1993],{"__ignoreMap":937},[941,1921,1922,1924,1927,1929,1932,1935,1938,1940],{"class":943,"line":944},[941,1923,1446],{"class":1431},[941,1925,1926],{"class":968}," unitelabs ",[941,1928,1432],{"class":1431},[941,1930,1931],{"class":968}," labware",[941,1933,1934],{"class":961},",",[941,1936,1937],{"class":968}," liquid_handling",[941,1939,1934],{"class":961},[941,1941,1942],{"class":968}," sdk\n",[941,1944,1945],{"class":943,"line":955},[941,1946,1441],{"emptyLinePlaceholder":1440},[941,1948,1949,1951,1953,1955,1957,1959,1961],{"class":943,"line":975},[941,1950,1594],{"class":1431},[941,1952,1597],{"class":968},[941,1954,1600],{"class":961},[941,1956,1603],{"class":961},[941,1958,1606],{"class":951},[941,1960,1609],{"class":961},[941,1962,1557],{"class":961},[941,1964,1965,1967,1969,1972,1974,1976],{"class":943,"line":1300},[941,1966,1563],{"class":1018},[941,1968,1566],{"class":961},[941,1970,1971],{"class":1018},"sdk",[941,1973,911],{"class":961},[941,1975,1913],{"class":968},[941,1977,1578],{"class":961},[941,1979,1980,1982,1984,1987,1989,1991],{"class":943,"line":1473},[941,1981,1563],{"class":1018},[941,1983,1566],{"class":961},[941,1985,1986],{"class":1018},"labware",[941,1988,911],{"class":961},[941,1990,1913],{"class":968},[941,1992,1578],{"class":961},[941,1994,1995,1997,1999,2002,2004,2006],{"class":943,"line":1478},[941,1996,1563],{"class":1018},[941,1998,1566],{"class":961},[941,2000,2001],{"class":1018},"liquid_handling",[941,2003,911],{"class":961},[941,2005,1913],{"class":968},[941,2007,1578],{"class":961},[756,2009,2010],{},"Run the file as explained above.",[756,2012,2013],{},[800,2014,2015],{},"Note on client types:",[769,2017,2018,2031,2037,2042],{},[772,2019,2020,2023,2024,2027,2028],{},[814,2021,2022],{},"Client"," from ",[814,2025,2026],{},"unitelabs.sdk"," is ",[800,2029,2030],{},"deprecated",[772,2032,2033,2034,2036],{},"Use ",[814,2035,1406],{}," (recommended) for async\u002Fawait patterns",[772,2038,2033,2039,2041],{},[814,2040,1412],{}," for synchronous\u002Fblocking code",[772,2043,2044],{},"Both clients provide the same methods - the only difference is async vs sync execution",[785,2046,2048],{"id":2047},"ide-integration","IDE Integration",[2050,2051,2053],"h3",{"id":2052},"vscode","VSCode",[931,2055,2060],{"className":2056,"code":2057,"filename":2058,"language":2059,"meta":937,"style":937},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"recommendations\": [\"ms-python.python\"]\n}\n",".vscode\u002Fextensions.json","json",[814,2061,2062,2067,2072],{"__ignoreMap":937},[941,2063,2064],{"class":943,"line":944},[941,2065,2066],{},"{\n",[941,2068,2069],{"class":943,"line":955},[941,2070,2071],{},"  \"recommendations\": [\"ms-python.python\"]\n",[941,2073,2074],{"class":943,"line":975},[941,2075,2076],{},"}\n",[931,2078,2081],{"className":2056,"code":2079,"filename":2080,"language":2059,"meta":937,"style":937},"{\n  \"python.defaultInterpreterPath\": \".venv\u002Fbin\u002Fpython\",\n  \"python.terminal.activateEnvironment\": false\n}\n",".vscode\u002Fsettings.json",[814,2082,2083,2087,2092,2097],{"__ignoreMap":937},[941,2084,2085],{"class":943,"line":944},[941,2086,2066],{},[941,2088,2089],{"class":943,"line":955},[941,2090,2091],{},"  \"python.defaultInterpreterPath\": \".venv\u002Fbin\u002Fpython\",\n",[941,2093,2094],{"class":943,"line":975},[941,2095,2096],{},"  \"python.terminal.activateEnvironment\": false\n",[941,2098,2099],{"class":943,"line":1300},[941,2100,2076],{},[2050,2102,2104],{"id":2103},"pycharm","PyCharm",[1385,2106,2107],{},[756,2108,2109],{},"Details coming soon!",[2050,2111,2113],{"id":2112},"jupyter-notebooks","Jupyter Notebooks",[2115,2116,2119,2137,2154],"callout",{"color":2117,"icon":2118},"info","i-heroicons-light-bulb",[756,2120,2121,2124,2125,2128,2129,2132,2133,2136],{},[800,2122,2123],{},"Prefer Jupyter for exploration?"," Install ",[814,2126,2127],{},"ipykernel"," as a dev dependency and run SDK calls interactively in notebook cells — all async methods work via ",[814,2130,2131],{},"await"," in Jupyter without an explicit ",[814,2134,2135],{},"asyncio.run()"," wrapper.",[931,2138,2140],{"className":933,"code":2139,"filename":997,"language":936,"meta":937,"style":937},"uv add --dev ipykernel\n",[814,2141,2142],{"__ignoreMap":937},[941,2143,2144,2146,2148,2151],{"class":943,"line":944},[941,2145,1004],{"class":947},[941,2147,1038],{"class":951},[941,2149,2150],{"class":951}," --dev",[941,2152,2153],{"class":951}," ipykernel\n",[756,2155,2156],{},"All SDK calls work identically in Jupyter. This is useful for prototyping and exploring connectors interactively before writing a script.",[2158,2159,2160],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":937,"searchDepth":944,"depth":955,"links":2162},[2163,2164,2165,2166,2167,2168],{"id":787,"depth":955,"text":788},{"id":865,"depth":955,"text":866},{"id":1342,"depth":955,"text":1343},{"id":1395,"depth":955,"text":1396},{"id":1854,"depth":955,"text":1855},{"id":2047,"depth":955,"text":2048,"children":2169},[2170,2171,2172],{"id":2052,"depth":975,"text":2053},{"id":2103,"depth":975,"text":2104},{"id":2112,"depth":975,"text":2113},"A quick guide to installing SDK components.","md",null,{},{"title":77,"description":2173},"IaI8MJz690WjET8Pq4Fk87rCxzRC7yU-kw-BJbst9dg",[2180,2182],{"title":73,"path":74,"stem":75,"description":2181},"Running multiple UniteLabs connectors on a Raspberry Pi — folder structure, systemd services, and common operations.",{"title":86,"path":87,"stem":88,"description":2183},"A connector is the software bridge between a physical lab instrument and the UniteLabs platform. Learn how connectors work and how they fit into your lab.",1783607759204]