[{"data":1,"prerenderedAt":2027},["ShallowReactive",2],{"navigation":3,"\u002Fintegrate\u002Fuse-a-connector\u002Fpython":750,"\u002Fintegrate\u002Fuse-a-connector\u002Fpython-surround":2022},[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":131,"body":752,"description":2016,"extension":2017,"links":2018,"meta":2019,"navigation":959,"path":132,"seo":2020,"stem":133,"__hash__":2021},"docs\u002F02.integrate\u002F30.use-a-connector\u002F30.python.md",{"type":753,"value":754,"toc":2006},"minimark",[755,772,783,788,847,851,854,1072,1075,1079,1082,1257,1259,1263,1266,1413,1415,1419,1425,1548,1550,1554,1560,1746,1748,1752,1758,1975,1977,1981,2002],[756,757,758,759,763,764,767,768,771],"p",{},"The UniteLabs UniteLabs SDK and REST API expose the same connector model: ",[760,761,762],"strong",{},"services"," (connectors), ",[760,765,766],{},"modules"," (features), and ",[760,769,770],{},"actions"," (commands and properties). Each section below shows both approaches side by side.",[773,774,776],"callout",{"icon":775},"i-heroicons-information-circle",[756,777,778,779,782],{},"This guide covers discovery and subscriptions. For executing commands and reading properties inside an automation script, continue with ",[780,781,90],"a",{"href":91},".",[784,785,787],"h2",{"id":786},"prerequisites","Prerequisites",[789,790,791,820],"tabs",{},[792,793,795],"div",{"icon":794,"label":593},"i-simple-icons-python",[796,797,798,805,810],"ol",{},[799,800,801],"li",{},[780,802,804],{"href":803},"\u002Fget-started\u002Fwelcome\u002F","Access to the UniteLabs platform",[799,806,807,808],{},"An environment with an installed SDK — see ",[780,809,77],{"href":78},[799,811,812,813,819],{},"A connector deployed and connected to your tenant (the ",[780,814,818],{"href":815,"rel":816},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fconnectors\u002Fthermocycler",[817],"nofollow","thermocycler demo"," works for these examples)",[792,821,823],{"icon":822,"label":577},"i-heroicons-command-line",[796,824,825,829,844],{},[799,826,827],{},[780,828,804],{"href":11},[799,830,831,832,835,836,839,840,843],{},"API credentials: your ",[760,833,834],{},"tenant ID",", ",[760,837,838],{},"client ID",", and ",[760,841,842],{},"client secret",": ask your UniteLabs contact if you don't have these",[799,845,846],{},"A connector deployed and connected to your tenant",[784,848,850],{"id":849},"authentication","Authentication",[756,852,853],{},"The UniteLabs SDK handles authentication automatically using environment variables. For the REST API you need a Bearer token.",[789,855,856,975],{},[792,857,858,866,925,928],{"icon":794,"label":593},[756,859,860,861,865],{},"The SDK reads credentials from environment variables. Set them in your ",[862,863,864],"code",{},".env"," file:",[867,868,873],"pre",{"className":869,"code":870,"filename":864,"language":871,"meta":872,"style":872},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","BASE_URL=your-tenant-base-url\nAUTH_URL=your-authentication-url\nCLIENT_ID=your-client-id\nCLIENT_SECRET=your-client-secret\n","bash","",[862,874,875,892,903,914],{"__ignoreMap":872},[876,877,880,884,888],"span",{"class":878,"line":879},"line",1,[876,881,883],{"class":882},"sTEyZ","BASE_URL",[876,885,887],{"class":886},"sMK4o","=",[876,889,891],{"class":890},"sfazB","your-tenant-base-url\n",[876,893,895,898,900],{"class":878,"line":894},2,[876,896,897],{"class":882},"AUTH_URL",[876,899,887],{"class":886},[876,901,902],{"class":890},"your-authentication-url\n",[876,904,906,909,911],{"class":878,"line":905},3,[876,907,908],{"class":882},"CLIENT_ID",[876,910,887],{"class":886},[876,912,913],{"class":890},"your-client-id\n",[876,915,917,920,922],{"class":878,"line":916},4,[876,918,919],{"class":882},"CLIENT_SECRET",[876,921,887],{"class":886},[876,923,924],{"class":890},"your-client-secret\n",[756,926,927],{},"Then instantiate the client — no token handling required:",[867,929,933],{"className":930,"code":931,"language":932,"meta":872,"style":872},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from unitelabs.sdk import AsyncApiClient\n\nclient = AsyncApiClient()\n","python",[862,934,935,955,961],{"__ignoreMap":872},[876,936,937,941,944,946,949,952],{"class":878,"line":879},[876,938,940],{"class":939},"s7zQu","from",[876,942,943],{"class":882}," unitelabs",[876,945,782],{"class":886},[876,947,948],{"class":882},"sdk ",[876,950,951],{"class":939},"import",[876,953,954],{"class":882}," AsyncApiClient\n",[876,956,957],{"class":878,"line":894},[876,958,960],{"emptyLinePlaceholder":959},true,"\n",[876,962,963,966,968,972],{"class":878,"line":905},[876,964,965],{"class":882},"client ",[876,967,887],{"class":886},[876,969,971],{"class":970},"s2Zo4"," AsyncApiClient",[876,973,974],{"class":886},"()\n",[792,976,978,981,1037,1040],{"icon":822,"label":977},"curl",[756,979,980],{},"Request a Bearer token via OAuth2 client credentials:",[867,982,985],{"className":869,"code":983,"filename":984,"language":871,"meta":872,"style":872},"curl -X POST \"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken\" \\\n  -H \"Content-Type: application\u002Fx-www-form-urlencoded\" \\\n  -d \"grant_type=client_credentials&client_id={client-id}&client_secret={client-secret}\"\n","Terminal",[862,986,987,1010,1024],{"__ignoreMap":872},[876,988,989,992,995,998,1001,1004,1007],{"class":878,"line":879},[876,990,977],{"class":991},"sBMFI",[876,993,994],{"class":890}," -X",[876,996,997],{"class":890}," POST",[876,999,1000],{"class":886}," \"",[876,1002,1003],{"class":890},"https:\u002F\u002Fauth.unitelabs.io\u002Frealms\u002F{tenant-id}\u002Fprotocol\u002Fopenid-connect\u002Ftoken",[876,1005,1006],{"class":886},"\"",[876,1008,1009],{"class":882}," \\\n",[876,1011,1012,1015,1017,1020,1022],{"class":878,"line":894},[876,1013,1014],{"class":890},"  -H",[876,1016,1000],{"class":886},[876,1018,1019],{"class":890},"Content-Type: application\u002Fx-www-form-urlencoded",[876,1021,1006],{"class":886},[876,1023,1009],{"class":882},[876,1025,1026,1029,1031,1034],{"class":878,"line":905},[876,1027,1028],{"class":890},"  -d",[876,1030,1000],{"class":886},[876,1032,1033],{"class":890},"grant_type=client_credentials&client_id={client-id}&client_secret={client-secret}",[876,1035,1036],{"class":886},"\"\n",[756,1038,1039],{},"Store the token and set your base URL for subsequent requests:",[867,1041,1043],{"className":869,"code":1042,"filename":984,"language":871,"meta":872,"style":872},"TOKEN=\"\u003Caccess_token from response>\"\nBASE_URL=\"https:\u002F\u002Fapi.unitelabs.io\u002F{tenant-id}\u002Fv1\"\n",[862,1044,1045,1059],{"__ignoreMap":872},[876,1046,1047,1050,1052,1054,1057],{"class":878,"line":879},[876,1048,1049],{"class":882},"TOKEN",[876,1051,887],{"class":886},[876,1053,1006],{"class":886},[876,1055,1056],{"class":890},"\u003Caccess_token from response>",[876,1058,1036],{"class":886},[876,1060,1061,1063,1065,1067,1070],{"class":878,"line":894},[876,1062,883],{"class":882},[876,1064,887],{"class":886},[876,1066,1006],{"class":886},[876,1068,1069],{"class":890},"https:\u002F\u002Fapi.unitelabs.io\u002F{tenant-id}\u002Fv1",[876,1071,1036],{"class":886},[1073,1074],"hr",{},[784,1076,1078],{"id":1077},"list-connectors","List connectors",[756,1080,1081],{},"Retrieve all connectors connected to your tenant.",[789,1083,1084,1174],{},[792,1085,1086,1124],{"icon":794,"label":593},[867,1087,1089],{"className":930,"code":1088,"language":932,"meta":872,"style":872},"services = await client.list_services()\nprint(services)\n",[862,1090,1091,1111],{"__ignoreMap":872},[876,1092,1093,1096,1098,1101,1104,1106,1109],{"class":878,"line":879},[876,1094,1095],{"class":882},"services ",[876,1097,887],{"class":886},[876,1099,1100],{"class":939}," await",[876,1102,1103],{"class":882}," client",[876,1105,782],{"class":886},[876,1107,1108],{"class":970},"list_services",[876,1110,974],{"class":886},[876,1112,1113,1116,1119,1121],{"class":878,"line":894},[876,1114,1115],{"class":970},"print",[876,1117,1118],{"class":886},"(",[876,1120,762],{"class":970},[876,1122,1123],{"class":886},")\n",[867,1125,1127],{"className":869,"code":1126,"filename":984,"language":871,"meta":872,"style":872},"(Thermocycler(client=..., id='daa46515-49bc-4a7d-944f-369732edde2e', name='Thermocycler'),)\n",[862,1128,1129],{"__ignoreMap":872},[876,1130,1131,1133,1136,1138,1141,1144,1147,1150,1153,1155,1157,1160,1162,1165,1167,1170,1172],{"class":878,"line":879},[876,1132,1118],{"class":886},[876,1134,1135],{"class":991},"Thermocycler(client",[876,1137,887],{"class":890},[876,1139,1140],{"class":970},"...",[876,1142,1143],{"class":890},",",[876,1145,1146],{"class":890}," id=",[876,1148,1149],{"class":886},"'",[876,1151,1152],{"class":890},"daa46515-49bc-4a7d-944f-369732edde2e",[876,1154,1149],{"class":886},[876,1156,1143],{"class":890},[876,1158,1159],{"class":890}," name=",[876,1161,1149],{"class":886},[876,1163,1164],{"class":890},"Thermocycler",[876,1166,1149],{"class":886},[876,1168,1169],{"class":886},")",[876,1171,1143],{"class":991},[876,1173,1123],{"class":882},[792,1175,1176,1211],{"icon":822,"label":977},[867,1177,1179],{"className":869,"code":1178,"filename":984,"language":871,"meta":872,"style":872},"curl \"$BASE_URL\u002Fservices\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1180,1181,1197],{"__ignoreMap":872},[876,1182,1183,1185,1187,1190,1193,1195],{"class":878,"line":879},[876,1184,977],{"class":991},[876,1186,1000],{"class":886},[876,1188,1189],{"class":882},"$BASE_URL",[876,1191,1192],{"class":890},"\u002Fservices",[876,1194,1006],{"class":886},[876,1196,1009],{"class":882},[876,1198,1199,1201,1203,1206,1209],{"class":878,"line":894},[876,1200,1014],{"class":890},[876,1202,1000],{"class":886},[876,1204,1205],{"class":890},"Authorization: Bearer ",[876,1207,1208],{"class":882},"$TOKEN",[876,1210,1036],{"class":886},[867,1212,1217],{"className":1213,"code":1214,"filename":1215,"language":1216,"meta":872,"style":872},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[\n  {\n    \"id\": \"daa46515-49bc-4a7d-944f-369732edde2e\",\n    \"name\": \"Thermocycler\",\n    \"category\": \"thermocycler\"\n  }\n]\n","Response","json",[862,1218,1219,1224,1229,1234,1239,1245,1251],{"__ignoreMap":872},[876,1220,1221],{"class":878,"line":879},[876,1222,1223],{},"[\n",[876,1225,1226],{"class":878,"line":894},[876,1227,1228],{},"  {\n",[876,1230,1231],{"class":878,"line":905},[876,1232,1233],{},"    \"id\": \"daa46515-49bc-4a7d-944f-369732edde2e\",\n",[876,1235,1236],{"class":878,"line":916},[876,1237,1238],{},"    \"name\": \"Thermocycler\",\n",[876,1240,1242],{"class":878,"line":1241},5,[876,1243,1244],{},"    \"category\": \"thermocycler\"\n",[876,1246,1248],{"class":878,"line":1247},6,[876,1249,1250],{},"  }\n",[876,1252,1254],{"class":878,"line":1253},7,[876,1255,1256],{},"]\n",[1073,1258],{},[784,1260,1262],{"id":1261},"get-a-specific-connector","Get a specific connector",[756,1264,1265],{},"Look up a connector by name or ID.",[789,1267,1268,1379],{},[792,1269,1270,1273,1341,1344],{"icon":794,"label":593},[756,1271,1272],{},"By name:",[867,1274,1276],{"className":930,"code":1275,"language":932,"meta":872,"style":872},"thermocycler = await client.get_service_by_name(name=\"Thermocycler\")\nprint(thermocycler.id)\nprint(thermocycler.name)\n",[862,1277,1278,1310,1327],{"__ignoreMap":872},[876,1279,1280,1283,1285,1287,1289,1291,1294,1296,1300,1302,1304,1306,1308],{"class":878,"line":879},[876,1281,1282],{"class":882},"thermocycler ",[876,1284,887],{"class":886},[876,1286,1100],{"class":939},[876,1288,1103],{"class":882},[876,1290,782],{"class":886},[876,1292,1293],{"class":970},"get_service_by_name",[876,1295,1118],{"class":886},[876,1297,1299],{"class":1298},"sHdIc","name",[876,1301,887],{"class":886},[876,1303,1006],{"class":886},[876,1305,1164],{"class":890},[876,1307,1006],{"class":886},[876,1309,1123],{"class":886},[876,1311,1312,1314,1316,1319,1321,1325],{"class":878,"line":894},[876,1313,1115],{"class":970},[876,1315,1118],{"class":886},[876,1317,1318],{"class":970},"thermocycler",[876,1320,782],{"class":886},[876,1322,1324],{"class":1323},"swJcz","id",[876,1326,1123],{"class":886},[876,1328,1329,1331,1333,1335,1337,1339],{"class":878,"line":905},[876,1330,1115],{"class":970},[876,1332,1118],{"class":886},[876,1334,1318],{"class":970},[876,1336,782],{"class":886},[876,1338,1299],{"class":1323},[876,1340,1123],{"class":886},[756,1342,1343],{},"By ID:",[867,1345,1347],{"className":930,"code":1346,"language":932,"meta":872,"style":872},"thermocycler = await client.get_service(service_id=\"daa46515-49bc-4a7d-944f-369732edde2e\")\n",[862,1348,1349],{"__ignoreMap":872},[876,1350,1351,1353,1355,1357,1359,1361,1364,1366,1369,1371,1373,1375,1377],{"class":878,"line":879},[876,1352,1282],{"class":882},[876,1354,887],{"class":886},[876,1356,1100],{"class":939},[876,1358,1103],{"class":882},[876,1360,782],{"class":886},[876,1362,1363],{"class":970},"get_service",[876,1365,1118],{"class":886},[876,1367,1368],{"class":1298},"service_id",[876,1370,887],{"class":886},[876,1372,1006],{"class":886},[876,1374,1152],{"class":890},[876,1376,1006],{"class":886},[876,1378,1123],{"class":886},[792,1380,1381],{"icon":822,"label":977},[867,1382,1384],{"className":869,"code":1383,"filename":984,"language":871,"meta":872,"style":872},"curl \"$BASE_URL\u002Fservices\u002Fdaa46515-49bc-4a7d-944f-369732edde2e\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1385,1386,1401],{"__ignoreMap":872},[876,1387,1388,1390,1392,1394,1397,1399],{"class":878,"line":879},[876,1389,977],{"class":991},[876,1391,1000],{"class":886},[876,1393,1189],{"class":882},[876,1395,1396],{"class":890},"\u002Fservices\u002Fdaa46515-49bc-4a7d-944f-369732edde2e",[876,1398,1006],{"class":886},[876,1400,1009],{"class":882},[876,1402,1403,1405,1407,1409,1411],{"class":878,"line":894},[876,1404,1014],{"class":890},[876,1406,1000],{"class":886},[876,1408,1205],{"class":890},[876,1410,1208],{"class":882},[876,1412,1036],{"class":886},[1073,1414],{},[784,1416,1418],{"id":1417},"explore-modules-features","Explore modules (features)",[756,1420,1421,1422,1424],{},"A connector's ",[760,1423,766],{}," are its features — logical groupings of related actions.",[789,1426,1427,1491],{},[792,1428,1429,1454],{"icon":794,"label":593},[867,1430,1432],{"className":930,"code":1431,"language":932,"meta":872,"style":872},"print(thermocycler.modules.keys())\n",[862,1433,1434],{"__ignoreMap":872},[876,1435,1436,1438,1440,1442,1444,1446,1448,1451],{"class":878,"line":879},[876,1437,1115],{"class":970},[876,1439,1118],{"class":886},[876,1441,1318],{"class":970},[876,1443,782],{"class":886},[876,1445,766],{"class":1323},[876,1447,782],{"class":886},[876,1449,1450],{"class":970},"keys",[876,1452,1453],{"class":886},"())\n",[867,1455,1457],{"className":869,"code":1456,"filename":984,"language":871,"meta":872,"style":872},"dict_keys(['sila_service', 'temperature_controller', 'door_controller'])\n",[862,1458,1459],{"__ignoreMap":872},[876,1460,1461,1464,1467,1469,1472,1475,1477,1479,1481,1484,1486,1489],{"class":878,"line":879},[876,1462,1463],{"class":991},"dict_keys([",[876,1465,1466],{"class":991},"'sila_service'",[876,1468,1143],{"class":991},[876,1470,1471],{"class":886}," '",[876,1473,1474],{"class":890},"temperature_controller",[876,1476,1149],{"class":886},[876,1478,1143],{"class":890},[876,1480,1471],{"class":886},[876,1482,1483],{"class":890},"door_controller",[876,1485,1149],{"class":886},[876,1487,1488],{"class":890},"]",[876,1490,1123],{"class":882},[792,1492,1493,1525],{"icon":822,"label":977},[867,1494,1496],{"className":869,"code":1495,"filename":984,"language":871,"meta":872,"style":872},"curl \"$BASE_URL\u002Fservices\u002Fdaa46515-49bc-4a7d-944f-369732edde2e\u002Fmodules\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1497,1498,1513],{"__ignoreMap":872},[876,1499,1500,1502,1504,1506,1509,1511],{"class":878,"line":879},[876,1501,977],{"class":991},[876,1503,1000],{"class":886},[876,1505,1189],{"class":882},[876,1507,1508],{"class":890},"\u002Fservices\u002Fdaa46515-49bc-4a7d-944f-369732edde2e\u002Fmodules",[876,1510,1006],{"class":886},[876,1512,1009],{"class":882},[876,1514,1515,1517,1519,1521,1523],{"class":878,"line":894},[876,1516,1014],{"class":890},[876,1518,1000],{"class":886},[876,1520,1205],{"class":890},[876,1522,1208],{"class":882},[876,1524,1036],{"class":886},[867,1526,1528],{"className":1213,"code":1527,"filename":1215,"language":1216,"meta":872,"style":872},"[\n  { \"id\": \"...\", \"name\": \"temperature_controller\" },\n  { \"id\": \"...\", \"name\": \"door_controller\" }\n]\n",[862,1529,1530,1534,1539,1544],{"__ignoreMap":872},[876,1531,1532],{"class":878,"line":879},[876,1533,1223],{},[876,1535,1536],{"class":878,"line":894},[876,1537,1538],{},"  { \"id\": \"...\", \"name\": \"temperature_controller\" },\n",[876,1540,1541],{"class":878,"line":905},[876,1542,1543],{},"  { \"id\": \"...\", \"name\": \"door_controller\" }\n",[876,1545,1546],{"class":878,"line":916},[876,1547,1256],{},[1073,1549],{},[784,1551,1553],{"id":1552},"explore-actions","Explore actions",[756,1555,1556,1557,1559],{},"Each module exposes ",[760,1558,770],{},": the individual commands and properties you can call.",[789,1561,1562,1674],{},[792,1563,1564,1591,1625,1639],{"icon":794,"label":593},[867,1565,1567],{"className":930,"code":1566,"language":932,"meta":872,"style":872},"print(thermocycler.temperature_controller.actions.keys())\n",[862,1568,1569],{"__ignoreMap":872},[876,1570,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589],{"class":878,"line":879},[876,1572,1115],{"class":970},[876,1574,1118],{"class":886},[876,1576,1318],{"class":970},[876,1578,782],{"class":886},[876,1580,1474],{"class":1323},[876,1582,782],{"class":886},[876,1584,770],{"class":1323},[876,1586,782],{"class":886},[876,1588,1450],{"class":970},[876,1590,1453],{"class":886},[867,1592,1594],{"className":869,"code":1593,"filename":984,"language":871,"meta":872,"style":872},"dict_keys(['get_target_temperature', 'subscribe_current_temperature', 'set_target_temperature'])\n",[862,1595,1596],{"__ignoreMap":872},[876,1597,1598,1600,1603,1605,1607,1610,1612,1614,1616,1619,1621,1623],{"class":878,"line":879},[876,1599,1463],{"class":991},[876,1601,1602],{"class":991},"'get_target_temperature'",[876,1604,1143],{"class":991},[876,1606,1471],{"class":886},[876,1608,1609],{"class":890},"subscribe_current_temperature",[876,1611,1149],{"class":886},[876,1613,1143],{"class":890},[876,1615,1471],{"class":886},[876,1617,1618],{"class":890},"set_target_temperature",[876,1620,1149],{"class":886},[876,1622,1488],{"class":890},[876,1624,1123],{"class":882},[756,1626,1627,1628,835,1631,1634,1635,1638],{},"Check the type of an action (",[862,1629,1630],{},"PROPERTY",[862,1632,1633],{},"COMMAND",", or ",[862,1636,1637],{},"SENSOR","):",[867,1640,1642],{"className":930,"code":1641,"language":932,"meta":872,"style":872},"print(thermocycler.temperature_controller.get_target_temperature.type)\n# PROPERTY\n",[862,1643,1644,1668],{"__ignoreMap":872},[876,1645,1646,1648,1650,1652,1654,1656,1658,1661,1663,1666],{"class":878,"line":879},[876,1647,1115],{"class":970},[876,1649,1118],{"class":886},[876,1651,1318],{"class":970},[876,1653,782],{"class":886},[876,1655,1474],{"class":1323},[876,1657,782],{"class":886},[876,1659,1660],{"class":1323},"get_target_temperature",[876,1662,782],{"class":886},[876,1664,1665],{"class":1323},"type",[876,1667,1123],{"class":886},[876,1669,1670],{"class":878,"line":894},[876,1671,1673],{"class":1672},"sHwdD","# PROPERTY\n",[792,1675,1676,1679,1711,1714],{"icon":822,"label":977},[756,1677,1678],{},"List all actions for a module:",[867,1680,1682],{"className":869,"code":1681,"filename":984,"language":871,"meta":872,"style":872},"curl \"$BASE_URL\u002Fmodules\u002F{moduleId}\u002Factions\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1683,1684,1699],{"__ignoreMap":872},[876,1685,1686,1688,1690,1692,1695,1697],{"class":878,"line":879},[876,1687,977],{"class":991},[876,1689,1000],{"class":886},[876,1691,1189],{"class":882},[876,1693,1694],{"class":890},"\u002Fmodules\u002F{moduleId}\u002Factions",[876,1696,1006],{"class":886},[876,1698,1009],{"class":882},[876,1700,1701,1703,1705,1707,1709],{"class":878,"line":894},[876,1702,1014],{"class":890},[876,1704,1000],{"class":886},[876,1706,1205],{"class":890},[876,1708,1208],{"class":882},[876,1710,1036],{"class":886},[756,1712,1713],{},"Get detailed info (parameters, response schema) for a specific action:",[867,1715,1717],{"className":869,"code":1716,"filename":984,"language":871,"meta":872,"style":872},"curl \"$BASE_URL\u002Factions\u002F{actionId}\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1718,1719,1734],{"__ignoreMap":872},[876,1720,1721,1723,1725,1727,1730,1732],{"class":878,"line":879},[876,1722,977],{"class":991},[876,1724,1000],{"class":886},[876,1726,1189],{"class":882},[876,1728,1729],{"class":890},"\u002Factions\u002F{actionId}",[876,1731,1006],{"class":886},[876,1733,1009],{"class":882},[876,1735,1736,1738,1740,1742,1744],{"class":878,"line":894},[876,1737,1014],{"class":890},[876,1739,1000],{"class":886},[876,1741,1205],{"class":890},[876,1743,1208],{"class":882},[876,1745,1036],{"class":886},[1073,1747],{},[784,1749,1751],{"id":1750},"subscribe-to-live-data","Subscribe to live data",[756,1753,1754,1757],{},[760,1755,1756],{},"Observable"," properties (Sensors) and commands stream data continuously. Use subscriptions to receive values as they change.",[789,1759,1760,1817],{},[792,1761,1762,1810],{"icon":794,"label":593},[867,1763,1765],{"className":930,"code":1764,"language":932,"meta":872,"style":872},"async for temperature in thermocycler.temperature_controller.subscribe_current_temperature():\n    print(temperature)  # prints each new reading as it arrives\n",[862,1766,1767,1795],{"__ignoreMap":872},[876,1768,1769,1772,1775,1778,1781,1784,1786,1788,1790,1792],{"class":878,"line":879},[876,1770,1771],{"class":939},"async",[876,1773,1774],{"class":939}," for",[876,1776,1777],{"class":882}," temperature ",[876,1779,1780],{"class":939},"in",[876,1782,1783],{"class":882}," thermocycler",[876,1785,782],{"class":886},[876,1787,1474],{"class":1323},[876,1789,782],{"class":886},[876,1791,1609],{"class":970},[876,1793,1794],{"class":886},"():\n",[876,1796,1797,1800,1802,1805,1807],{"class":878,"line":894},[876,1798,1799],{"class":970},"    print",[876,1801,1118],{"class":886},[876,1803,1804],{"class":970},"temperature",[876,1806,1169],{"class":886},[876,1808,1809],{"class":1672},"  # prints each new reading as it arrives\n",[756,1811,1812,1813,1816],{},"Cancel the subscription by breaking out of the loop or using ",[862,1814,1815],{},"asyncio"," cancellation.",[792,1818,1819,1822,1906,1935,1938],{"icon":822,"label":977},[756,1820,1821],{},"Create a subscription by passing the action ID and an optional polling interval (milliseconds):",[867,1823,1825],{"className":869,"code":1824,"filename":984,"language":871,"meta":872,"style":872},"curl -X POST \"$BASE_URL\u002Fsubscriptions\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"{actionId}\",\n    \"parameters\": {},\n    \"interval\": 1000\n  }'\n",[862,1826,1827,1846,1860,1873,1882,1887,1892,1897],{"__ignoreMap":872},[876,1828,1829,1831,1833,1835,1837,1839,1842,1844],{"class":878,"line":879},[876,1830,977],{"class":991},[876,1832,994],{"class":890},[876,1834,997],{"class":890},[876,1836,1000],{"class":886},[876,1838,1189],{"class":882},[876,1840,1841],{"class":890},"\u002Fsubscriptions",[876,1843,1006],{"class":886},[876,1845,1009],{"class":882},[876,1847,1848,1850,1852,1854,1856,1858],{"class":878,"line":894},[876,1849,1014],{"class":890},[876,1851,1000],{"class":886},[876,1853,1205],{"class":890},[876,1855,1208],{"class":882},[876,1857,1006],{"class":886},[876,1859,1009],{"class":882},[876,1861,1862,1864,1866,1869,1871],{"class":878,"line":905},[876,1863,1014],{"class":890},[876,1865,1000],{"class":886},[876,1867,1868],{"class":890},"Content-Type: application\u002Fjson",[876,1870,1006],{"class":886},[876,1872,1009],{"class":882},[876,1874,1875,1877,1879],{"class":878,"line":916},[876,1876,1028],{"class":890},[876,1878,1471],{"class":886},[876,1880,1881],{"class":890},"{\n",[876,1883,1884],{"class":878,"line":1241},[876,1885,1886],{"class":890},"    \"action\": \"{actionId}\",\n",[876,1888,1889],{"class":878,"line":1247},[876,1890,1891],{"class":890},"    \"parameters\": {},\n",[876,1893,1894],{"class":878,"line":1253},[876,1895,1896],{"class":890},"    \"interval\": 1000\n",[876,1898,1900,1903],{"class":878,"line":1899},8,[876,1901,1902],{"class":890},"  }",[876,1904,1905],{"class":886},"'\n",[867,1907,1909],{"className":1213,"code":1908,"filename":1215,"language":1216,"meta":872,"style":872},"{\n  \"id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n  \"action\": \"{actionId}\",\n  \"source\": \"...\"\n}\n",[862,1910,1911,1915,1920,1925,1930],{"__ignoreMap":872},[876,1912,1913],{"class":878,"line":879},[876,1914,1881],{},[876,1916,1917],{"class":878,"line":894},[876,1918,1919],{},"  \"id\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\",\n",[876,1921,1922],{"class":878,"line":905},[876,1923,1924],{},"  \"action\": \"{actionId}\",\n",[876,1926,1927],{"class":878,"line":916},[876,1928,1929],{},"  \"source\": \"...\"\n",[876,1931,1932],{"class":878,"line":1241},[876,1933,1934],{},"}\n",[756,1936,1937],{},"Cancel the subscription when done:",[867,1939,1941],{"className":869,"code":1940,"filename":984,"language":871,"meta":872,"style":872},"curl -X DELETE \"$BASE_URL\u002Fsubscriptions\u002Ff47ac10b-58cc-4372-a567-0e02b2c3d479\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n",[862,1942,1943,1963],{"__ignoreMap":872},[876,1944,1945,1947,1949,1952,1954,1956,1959,1961],{"class":878,"line":879},[876,1946,977],{"class":991},[876,1948,994],{"class":890},[876,1950,1951],{"class":890}," DELETE",[876,1953,1000],{"class":886},[876,1955,1189],{"class":882},[876,1957,1958],{"class":890},"\u002Fsubscriptions\u002Ff47ac10b-58cc-4372-a567-0e02b2c3d479",[876,1960,1006],{"class":886},[876,1962,1009],{"class":882},[876,1964,1965,1967,1969,1971,1973],{"class":878,"line":894},[876,1966,1014],{"class":890},[876,1968,1000],{"class":886},[876,1970,1205],{"class":890},[876,1972,1208],{"class":882},[876,1974,1036],{"class":886},[1073,1976],{},[784,1978,1980],{"id":1979},"next-steps","Next steps",[1982,1983,1984,1993],"ul",{},[799,1985,1986,1989,1990],{},[760,1987,1988],{},"Execute commands",": read properties and call commands on the instrument from a script: ",[780,1991,90],{"href":1992},"\u002Fintegrate\u002Fcontrol-with-code\u002F",[799,1994,1995,1998,1999],{},[760,1996,1997],{},"Liquid handling & robots",": additional SDK packages for deck building and liquid transfers: ",[780,2000,135],{"href":2001},"\u002Foperate\u002Foverview\u002F",[2003,2004,2005],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":872,"searchDepth":879,"depth":894,"links":2007},[2008,2009,2010,2011,2012,2013,2014,2015],{"id":786,"depth":894,"text":787},{"id":849,"depth":894,"text":850},{"id":1077,"depth":894,"text":1078},{"id":1261,"depth":894,"text":1262},{"id":1417,"depth":894,"text":1418},{"id":1552,"depth":894,"text":1553},{"id":1750,"depth":894,"text":1751},{"id":1979,"depth":894,"text":1980},"Access connectors programmatically — discover services, explore their modules and actions, and subscribe to live data using the UniteLabs SDK or the REST API.","md",null,{},{"title":131,"description":2016},"U0OIdl4ouhFRMhDblLw5_yXc_4D1nlhWunihNqBBQI0",[2023,2025],{"title":127,"path":128,"stem":129,"description":2024},"How to view, inspect, and interact with connectors from the UniteLabs Platform UI.",{"title":135,"path":140,"stem":141,"description":2026},"Model your physical lab setup in code — the foundation every automation script builds on, from labware through liquid handling.",1783607761788]