[{"data":1,"prerenderedAt":2128},["ShallowReactive",2],{"navigation":3,"\u002Fdevices\u002Fbrooks-preciseflex-400":951,"\u002Fdevices\u002Fbrooks-preciseflex-400-surround":2125},[4,59,188,271,449,613,802,833],{"title":5,"type":6,"device":6,"path":7,"stem":8,"children":9,"page":41},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,15,42,47,51,55],{"title":11,"path":12,"stem":13,"type":14,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome","landing",{"title":16,"type":6,"device":6,"path":17,"stem":18,"children":19,"page":41},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[20,25,29,33,37],{"title":21,"path":22,"stem":23,"type":24,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access","howto",{"title":26,"path":27,"stem":28,"type":24,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":30,"path":31,"stem":32,"type":24,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":34,"path":35,"stem":36,"type":24,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":38,"path":39,"stem":40,"type":24,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",false,{"title":43,"path":44,"stem":45,"type":46,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device","tutorial",{"title":48,"path":49,"stem":50,"type":46,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":52,"path":53,"stem":54,"type":46,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":56,"path":57,"stem":58,"type":6,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":60,"type":6,"device":6,"path":61,"stem":62,"children":63,"page":41},"How-to","\u002Fhow-to\u002F","02.how-to",[64,118,163,180],{"title":65,"type":6,"device":6,"path":66,"stem":67,"children":68,"page":41},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[69,102],{"title":70,"type":6,"device":6,"path":71,"stem":72,"children":73,"page":41},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[74,78,82,86,90,94,98],{"title":75,"path":76,"stem":77,"type":24,"device":6},"Connector Configuration","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":79,"path":80,"stem":81,"type":24,"device":6},"With an executable","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":83,"path":84,"stem":85,"type":24,"device":6},"From source","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":87,"path":88,"stem":89,"type":24,"device":6},"Build your own","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":91,"path":92,"stem":93,"type":24,"device":6},"Headless install","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":95,"path":96,"stem":97,"type":24,"device":6},"Raspberry Pi","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":99,"path":100,"stem":101,"type":24,"device":6},"Multi-device Networking","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fmultiple-devices\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F60.multiple-devices",{"title":103,"type":6,"device":6,"path":104,"stem":105,"children":106,"page":41},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[107,110,114],{"title":26,"path":108,"stem":109,"type":24,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":111,"path":112,"stem":113,"type":24,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":115,"path":116,"stem":117,"type":24,"device":6},"UniteLabs SDK & REST API","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fpython\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F30.python",{"title":119,"type":6,"device":6,"path":120,"stem":121,"children":122,"page":41},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[123,127,131,135,139,143,147,151,155,159],{"title":124,"path":125,"stem":126,"type":24,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":128,"path":129,"stem":130,"type":24,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":132,"path":133,"stem":134,"type":24,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":136,"path":137,"stem":138,"type":24,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":140,"path":141,"stem":142,"type":24,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":144,"path":145,"stem":146,"type":24,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":148,"path":149,"stem":150,"type":24,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":152,"path":153,"stem":154,"type":24,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":156,"path":157,"stem":158,"type":24,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":160,"path":161,"stem":162,"type":24,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":164,"type":6,"device":6,"path":165,"stem":166,"children":167,"page":41},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[168,172,176],{"title":169,"path":170,"stem":171,"type":24,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":173,"path":174,"stem":175,"type":24,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":177,"path":178,"stem":179,"type":24,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":111,"type":6,"device":6,"path":181,"stem":182,"children":183,"page":41},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[184],{"title":185,"path":186,"stem":187,"type":24,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":189,"type":6,"device":6,"path":190,"stem":191,"children":192},"Technical Reference","\u002Ftechnical-reference\u002F","03.technical-reference",[193,196,201,213,226,235,244,253,262],{"title":194,"path":190,"stem":195,"type":14,"device":6},"Overview","03.technical-reference\u002Findex",{"title":197,"path":198,"stem":199,"type":200,"device":6},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","03.technical-reference\u002F01.rest-api","reference",{"title":119,"type":6,"device":6,"path":202,"stem":203,"children":204,"page":41},"\u002Ftechnical-reference\u002Fautomate\u002F","03.technical-reference\u002F07.automate",[205,209],{"title":206,"path":207,"stem":208,"type":200,"device":6},"Workflow template","\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template\u002F","03.technical-reference\u002F07.automate\u002F05.workflow-template",{"title":210,"path":211,"stem":212,"type":200,"device":6},"Workflows REST API","\u002Ftechnical-reference\u002Fautomate\u002Fworkflows-api\u002F","03.technical-reference\u002F07.automate\u002F80.workflows-api",{"title":26,"type":6,"device":6,"path":214,"stem":215,"children":216},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","03.technical-reference\u002F10.groundcontrol\u002Findex",[217,218,222],{"title":194,"path":214,"stem":215,"type":14,"device":6},{"title":219,"path":220,"stem":221,"type":200,"device":6},"Network requirements","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fnetwork-requirements\u002F","03.technical-reference\u002F10.groundcontrol\u002F10.network-requirements",{"title":223,"path":224,"stem":225,"type":200,"device":6},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","03.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":227,"type":6,"device":6,"path":228,"stem":229,"children":230},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","03.technical-reference\u002F20.python-sdk\u002Findex",[231,232],{"title":194,"path":228,"stem":229,"type":14,"device":6},{"title":223,"path":233,"stem":234,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","03.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":236,"type":6,"device":6,"path":237,"stem":238,"children":239},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002Findex",[240,241],{"title":194,"path":237,"stem":238,"type":14,"device":6},{"title":223,"path":242,"stem":243,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":245,"type":6,"device":6,"path":246,"stem":247,"children":248},"Labware","\u002Ftechnical-reference\u002Flabware\u002F","03.technical-reference\u002F40.labware\u002Findex",[249,250],{"title":194,"path":246,"stem":247,"type":14,"device":6},{"title":223,"path":251,"stem":252,"type":200,"device":6},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","03.technical-reference\u002F40.labware\u002F20.changelog",{"title":254,"type":6,"device":6,"path":255,"stem":256,"children":257},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","03.technical-reference\u002F50.python-omnibus\u002Findex",[258,259],{"title":194,"path":255,"stem":256,"type":14,"device":6},{"title":223,"path":260,"stem":261,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","03.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":263,"type":6,"device":6,"path":264,"stem":265,"children":266},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","03.technical-reference\u002F60.python-cdk\u002Findex",[267,268],{"title":194,"path":264,"stem":265,"type":14,"device":6},{"title":223,"path":269,"stem":270,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","03.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":272,"type":6,"device":6,"path":273,"stem":274,"children":275,"page":41},"Concepts","\u002Fconcepts\u002F","04.concepts",[276,315,339,387,426],{"title":277,"type":6,"device":6,"path":278,"stem":279,"children":280,"page":41},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[281,286,290],{"title":282,"path":283,"stem":284,"type":285,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code","explanation",{"title":287,"path":288,"stem":289,"type":285,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":291,"type":6,"device":6,"path":292,"stem":293,"children":294,"page":41},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[295,299,303,307,311],{"title":296,"path":297,"stem":298,"type":285,"device":6},"Instrument Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Flow-level-instrument-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":300,"path":301,"stem":302,"type":285,"device":6},"Multi-device Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fmulti-device-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F20.multi-device-control",{"title":304,"path":305,"stem":306,"type":285,"device":6},"Workflow Orchestration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fworkflow-orchestration\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F30.workflow-orchestration",{"title":308,"path":309,"stem":310,"type":285,"device":6},"Custom Apps and LIMS Integration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fcustom-apps-lims\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F40.custom-apps-lims",{"title":312,"path":313,"stem":314,"type":285,"device":6},"Scale and Fleet Management","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fscale-and-fleet\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F50.scale-and-fleet",{"title":65,"type":6,"device":6,"path":316,"stem":317,"children":318,"page":41},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[319,323,327,331,335],{"title":320,"path":321,"stem":322,"type":285,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":324,"path":325,"stem":326,"type":285,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":328,"path":329,"stem":330,"type":285,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":332,"path":333,"stem":334,"type":285,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":336,"path":337,"stem":338,"type":285,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":340,"type":6,"device":6,"path":341,"stem":342,"children":343,"page":41},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[344,348,352,356,359,363,367,371,375,379,383],{"title":345,"path":346,"stem":347,"type":285,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":349,"path":350,"stem":351,"type":285,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":353,"path":354,"stem":355,"type":285,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":245,"path":357,"stem":358,"type":285,"device":6},"\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":360,"path":361,"stem":362,"type":285,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":364,"path":365,"stem":366,"type":285,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":368,"path":369,"stem":370,"type":285,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":372,"path":373,"stem":374,"type":285,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":376,"path":377,"stem":378,"type":285,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":380,"path":381,"stem":382,"type":285,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":384,"path":385,"stem":386,"type":285,"device":6},"Robot Arms","\u002Fconcepts\u002Foperate\u002Frobot-arms\u002F","04.concepts\u002F03.operate\u002F95.robot-arms",{"title":119,"type":6,"device":6,"path":388,"stem":389,"children":390,"page":41},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[391,395,399,403,407,411,415,419,423],{"title":392,"path":393,"stem":394,"type":285,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":396,"path":397,"stem":398,"type":285,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":400,"path":401,"stem":402,"type":285,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":404,"path":405,"stem":406,"type":285,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":408,"path":409,"stem":410,"type":285,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":412,"path":413,"stem":414,"type":285,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":416,"path":417,"stem":418,"type":285,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":420,"path":421,"stem":422,"type":285,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":380,"path":424,"stem":425,"type":285,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":164,"type":6,"device":6,"path":427,"stem":428,"children":429,"page":41},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[430,433,437,441,445],{"title":194,"path":431,"stem":432,"type":14,"device":6},"\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":434,"path":435,"stem":436,"type":285,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":438,"path":439,"stem":440,"type":285,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":442,"path":443,"stem":444,"type":285,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":446,"path":447,"stem":448,"type":285,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":450,"type":6,"device":6,"path":451,"stem":452,"children":453,"page":41},"Devices","\u002Fdevices\u002F","05.devices",[454,457,505,518,534,571,595],{"title":194,"path":455,"stem":456,"type":14,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":458,"path":459,"page":41,"children":460},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[461,482,492],{"title":462,"path":463,"stem":464,"type":200,"device":465},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":466,"vendor":467,"category":468,"connector":466,"package":469,"models":470,"communication":477,"vendor_software":6,"os":478},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[471,472,473,474,475,476],"BioShake 3000 \u002F 3000 elm \u002F 3000 elm DWP","BioShake 3000-T \u002F 3000-T elm","BioShake 5000 elm","BioShake D30 \u002F D30 elm \u002F D30-T \u002F D30-T elm","BioShake Q1 \u002F Q1 (1.2 mm) \u002F Q1 (3.0 mm) \u002F Q2","HeatPlate","serial (RS-232 over USB)",[479,480,481],"windows","linux","macos",{"title":483,"path":484,"stem":485,"type":200,"device":486},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":487,"vendor":467,"category":468,"connector":466,"package":469,"models":488,"communication":477,"vendor_software":6,"os":491},"qinstruments-coldplate",[489,490],"ColdPlate","ColdPlate slim",[479,480,481],{"title":493,"path":494,"stem":495,"type":200,"device":496},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":497,"vendor":498,"category":468,"connector":499,"models":500},"inheco-thermoshake","Inheco","inheco-tec-controller",[501,502,503,504],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":506,"path":507,"page":41,"children":508},"Incubation","\u002Fdevices\u002Fincubation\u002F",[509],{"title":510,"path":511,"stem":512,"type":200,"device":513},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":514,"vendor":498,"category":506,"connector":514,"models":515},"inheco-scila",[516,517],"SCILA","SCILA MIX 2-gas mixing device",{"title":519,"path":520,"page":41,"children":521},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[522],{"title":523,"path":524,"stem":525,"type":200,"device":526},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":527,"vendor":498,"category":528,"connector":527,"models":529},"inheco-odtc","Thermal Cycler",[530,531,532,533],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":535,"path":536,"page":41,"children":537},"Readers","\u002Fdevices\u002Freaders\u002F",[538,547,556],{"title":539,"path":540,"stem":541,"type":200,"device":542},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":543,"vendor":544,"category":545,"connector":546},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":548,"path":549,"stem":550,"type":200,"device":551},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":552,"vendor":544,"category":545,"connector":553,"models":554},"biotek-synergy-h1","agilent-synergy-h1",[555],"BioTek Synergy H1",{"title":557,"path":558,"stem":559,"type":200,"device":560},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":561,"vendor":562,"category":545,"connector":561,"package":563,"models":564,"communication":568,"vendor_software":569,"os":570},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[565,566,567],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[479,480,481],{"title":572,"path":573,"page":41,"children":574},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[575,585],{"title":576,"path":577,"stem":578,"type":200,"device":579},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":580,"vendor":467,"category":581,"connector":466,"package":469,"models":582,"communication":477,"vendor_software":6,"os":584},"qinstruments-tiltstation","Plate Tilting",[583],"TiltStation",[479,480,481],{"title":586,"path":587,"stem":588,"type":200,"device":589},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":590,"vendor":467,"category":591,"connector":466,"package":469,"models":592,"communication":477,"vendor_software":6,"os":594},"qinstruments-turnstation","Plate Rotating",[593],"TurnStation",[479,480,481],{"title":596,"path":597,"page":41,"children":598},"Robots","\u002Fdevices\u002Frobots\u002F",[599],{"title":600,"path":601,"stem":602,"type":200,"device":603},"Brooks PreciseFlex 400","\u002Fdevices\u002Fbrooks-preciseflex-400\u002F","05.devices\u002F95.brooks-preciseflex-400",{"slug":604,"vendor":605,"category":596,"connector":604,"package":606,"models":607,"communication":611,"vendor_software":6,"os":612},"brooks-preciseflex-400","Brooks Automation","unitelabs-brooks-preciseflex-400",[608,609,610],"PreciseFlex 400, standard reach, 400 \u002F 750 \u002F 1160 mm Z","PreciseFlex 400, extended reach (XR), 400 \u002F 750 \u002F 1160 mm Z","Either on a PreciseFlex linear rail (1.0, 1.5 or 2.0 m)","Ethernet (TCP)",[479,480,481],{"title":614,"type":6,"device":6,"path":615,"stem":616,"children":617,"page":41},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[618,621,633,657,660,705,730,747,764,786],{"title":194,"path":619,"stem":620,"type":14,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":353,"type":6,"device":6,"path":622,"stem":623,"children":624,"page":41},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[625,629],{"title":626,"path":627,"stem":628,"type":24,"device":6},"Building a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fbuilding-a-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F10.building-a-deck",{"title":630,"path":631,"stem":632,"type":24,"device":6},"Save\u002FLoad a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fsave-load-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F20.save-load-deck",{"title":634,"type":6,"device":6,"path":635,"stem":636,"children":637,"page":41},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[638,642,646,650,653],{"title":639,"path":640,"stem":641,"type":24,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":643,"path":644,"stem":645,"type":24,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":647,"path":648,"stem":649,"type":24,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":364,"path":651,"stem":652,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":654,"path":655,"stem":656,"type":24,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":376,"path":658,"stem":659,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":661,"type":6,"device":6,"path":662,"stem":663,"children":664,"page":41},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[665,669,673,677,681,685,689,693,697,701],{"title":666,"path":667,"stem":668,"type":24,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":670,"path":671,"stem":672,"type":24,"device":6},"Gripper Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcore-gripper\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F20.core-gripper",{"title":674,"path":675,"stem":676,"type":24,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":678,"path":679,"stem":680,"type":24,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":682,"path":683,"stem":684,"type":24,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":686,"path":687,"stem":688,"type":24,"device":6},"Waste Block","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fwaste-block\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F60.waste-block",{"title":690,"path":691,"stem":692,"type":24,"device":6},"Complex Mixing","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcomplex-mixing\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F66.complex-mixing",{"title":694,"path":695,"stem":696,"type":24,"device":6},"Teaching Gripper Paddle Positions","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fgripper-positions\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F70.gripper-positions",{"title":698,"path":699,"stem":700,"type":24,"device":6},"Training a Custom Deck Position With the iSWAP","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcustom-deck-position\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F75.custom-deck-position",{"title":702,"path":703,"stem":704,"type":200,"device":6},"Observable Commands","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fobservable-commands\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F80.observable-commands",{"title":706,"type":6,"device":6,"path":707,"stem":708,"children":709,"page":41},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[710,714,718,722,726],{"title":711,"path":712,"stem":713,"type":24,"device":6},"Waste Configuration","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F05.waste-configuration",{"title":715,"path":716,"stem":717,"type":24,"device":6},"Covers and Lights","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F10.covers-and-lights",{"title":719,"path":720,"stem":721,"type":24,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":723,"path":724,"stem":725,"type":24,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":727,"path":728,"stem":729,"type":24,"device":6},"XL Pipettes","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fxl-channels\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F40.xl-channels",{"title":731,"type":6,"device":6,"path":732,"stem":733,"children":734,"page":41},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[735,738,741,744],{"title":647,"path":736,"stem":737,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":639,"path":739,"stem":740,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":364,"path":742,"stem":743,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":670,"path":745,"stem":746,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F30.using-the-gripper",{"title":748,"type":6,"device":6,"path":749,"stem":750,"children":751,"page":41},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[752,756,760],{"title":753,"path":754,"stem":755,"type":24,"device":6},"Connect & Run a Method","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F10.connect-and-run",{"title":757,"path":758,"stem":759,"type":24,"device":6},"Sending XML Commands","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":761,"path":762,"stem":763,"type":24,"device":6},"Full Workflow Example","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":765,"type":6,"device":6,"path":766,"stem":767,"children":768,"page":41},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[769,773,776,779,783],{"title":770,"path":771,"stem":772,"type":24,"device":6},"Deck & Carriers","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":647,"path":774,"stem":775,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F20.tip-handling",{"title":639,"path":777,"stem":778,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F30.basic-pipetting",{"title":780,"path":781,"stem":782,"type":24,"device":6},"Using the Gripper (RoMa)","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F40.using-the-gripper",{"title":364,"path":784,"stem":785,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F50.liquid-classes",{"title":600,"type":6,"device":6,"path":787,"stem":788,"children":789,"page":41},"\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400",[790,794,798],{"title":791,"path":792,"stem":793,"type":24,"device":6},"Teach Positions","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fteach-positions\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F10.teach-positions",{"title":795,"path":796,"stem":797,"type":24,"device":6},"Move a Plate","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Fmove-a-plate\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F20.move-a-plate",{"title":799,"path":800,"stem":801,"type":24,"device":6},"Recover from a Stop","\u002Fliquid-handling-and-robots\u002Fbrooks-preciseflex-400\u002Frecover-from-a-stop\u002F","06.liquid-handling-and-robots\u002F46.brooks-preciseflex-400\u002F30.recover-from-a-stop",{"title":245,"type":6,"device":6,"path":803,"stem":804,"children":805,"page":41},"\u002Flabware\u002F","07.labware",[806,809,813,817,821,825,829],{"title":194,"path":807,"stem":808,"type":14,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":810,"path":811,"stem":812,"type":200,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":814,"path":815,"stem":816,"type":200,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":818,"path":819,"stem":820,"type":200,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":822,"path":823,"stem":824,"type":200,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":826,"path":827,"stem":828,"type":200,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":830,"path":831,"stem":832,"type":200,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":834,"type":6,"device":6,"path":835,"stem":836,"children":837},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[838,840,864,897,905,945],{"title":194,"path":835,"stem":839,"type":14,"device":6},"20.connector-development\u002Findex",{"title":841,"path":842,"stem":843,"children":844,"page":41},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[845,848,852,856,860],{"title":194,"path":846,"stem":847,"type":285,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":849,"path":850,"stem":851,"type":24,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":853,"path":854,"stem":855,"type":24,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":857,"path":858,"stem":859,"type":24,"device":6},"Python Environment and Project Management","\u002Fconnector-development\u002Fgetting-started\u002Fpython-environments\u002F","20.connector-development\u002F10.getting-started\u002F35.python-environments",{"title":861,"path":862,"stem":863,"type":24,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":865,"path":866,"stem":867,"children":868,"page":41},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[869,873,877,881,885,889,893],{"title":870,"path":871,"stem":872,"type":46,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":874,"path":875,"stem":876,"type":46,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":878,"path":879,"stem":880,"type":46,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":882,"path":883,"stem":884,"type":46,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":886,"path":887,"stem":888,"type":46,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":890,"path":891,"stem":892,"type":46,"device":6},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":894,"path":895,"stem":896,"type":46,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":272,"type":6,"device":6,"path":898,"stem":899,"children":900,"page":41},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[901],{"title":902,"path":903,"stem":904,"type":285,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":906,"path":907,"stem":908,"children":909,"page":41},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[910,914,918,922,926,930,934,937,941],{"title":911,"path":912,"stem":913,"type":24,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":915,"path":916,"stem":917,"type":24,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":919,"path":920,"stem":921,"type":24,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":923,"path":924,"stem":925,"type":24,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":927,"path":928,"stem":929,"type":24,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":931,"path":932,"stem":933,"type":24,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":380,"path":935,"stem":936,"type":24,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":938,"path":939,"stem":940,"type":24,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":942,"path":943,"stem":944,"type":24,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":946,"path":947,"stem":948,"children":949,"type":6,"device":6},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[950],{"title":946,"path":947,"stem":948,"type":200,"device":6},{"id":952,"title":600,"body":953,"description":2116,"device":2117,"extension":2120,"links":6,"meta":2121,"navigation":1465,"path":2122,"seo":2123,"stem":602,"type":200,"__hash__":2124},"docs\u002F05.devices\u002F95.brooks-preciseflex-400.md",{"type":954,"value":955,"toc":2106},"minimark",[956,965,972,977,1062,1065,1119,1123,1126,1133,1149,1152,1160,1164,1384,1395,1404,1408,1427,1431,1437,1886,1893,1901,1920,1924,2062,2068,2072,2095,2099,2102],[957,958,959,960,964],"p",{},"This page gets a PF400 connected and confirms the connection without moving the arm. Mounting,\nwiring and safety are covered by the Brooks manuals; the\n",[961,962,963],"a",{"href":792},"PF400 guides"," take it from\nhere to teaching positions and moving plates.",[957,966,967,968,971],{},"The connector targets ",[969,970,606],"code",{}," 0.4.0. The connection test below ran\nagainst a simulated arm and a real PF400.",[973,974,976],"h2",{"id":975},"what-you-need","What you need",[978,979,980,993],"table",{},[981,982,983],"thead",{},[984,985,986,990],"tr",{},[987,988,989],"th",{},"Item",[987,991,992],{},"Detail",[994,995,996,1005,1013,1024,1034,1042,1052],"tbody",{},[984,997,998,1002],{},[999,1000,1001],"td",{},"Instrument",[999,1003,1004],{},"A PF400 with its Guidance Controller, bolted down, powered, with the emergency stop within reach",[984,1006,1007,1010],{},[999,1008,1009],{},"Controller",[999,1011,1012],{},"Its IP address and basic settings done through the Brooks web interface. See below",[984,1014,1015,1018],{},[999,1016,1017],{},"Network",[999,1019,1020,1021],{},"An Ethernet link from the GroundControl machine to the controller. The factory address is ",[969,1022,1023],{},"192.168.0.1",[984,1025,1026,1028],{},[999,1027,324],{},[999,1029,1030,1033],{},[1031,1032,600],"strong",{}," from the UniteLabs registry",[984,1035,1036,1039],{},[999,1037,1038],{},"Vendor software",[999,1040,1041],{},"None at runtime. The connector installs and runs its own program on the controller",[984,1043,1044,1047],{},[999,1045,1046],{},"Machine",[999,1048,1049,1050],{},"Windows, Linux or macOS running ",[961,1051,26],{"href":27},[984,1053,1054,1057],{},[999,1055,1056],{},"Access",[999,1058,1059,1060],{},"A tenant and the SDK installed. See ",[961,1061,16],{"href":22},[957,1063,1064],{},"The GroundControl machine has to reach these ports on the controller:",[978,1066,1067,1077],{},[981,1068,1069],{},[984,1070,1071,1074],{},[987,1072,1073],{},"Port",[987,1075,1076],{},"Used for",[994,1078,1079,1089,1099,1109],{},[984,1080,1081,1086],{},[999,1082,1083],{},[969,1084,1085],{},"10100",[999,1087,1088],{},"Commands to the arm",[984,1090,1091,1096],{},[999,1092,1093],{},[969,1094,1095],{},"10000",[999,1097,1098],{},"Status reads, and stopping the arm while another command runs",[984,1100,1101,1106],{},[999,1102,1103],{},[969,1104,1105],{},"21",[999,1107,1108],{},"FTP, to upload the connector's program: on the first start, after a connector update, and when another program answers",[984,1110,1111,1116],{},[999,1112,1113],{},[969,1114,1115],{},"80",[999,1117,1118],{},"The web console, to write the startup settings and to start or restart the program",[973,1120,1122],{"id":1121},"before-you-connect","Before you connect",[957,1124,1125],{},"A factory-fresh controller is not ready for the connector. Give it its IP address and initial\nsettings through the Brooks web interface first, as the Guidance Controller documentation\ndescribes. The connector takes over from there.",[957,1127,1128,1129,1132],{},"The connector runs its own GPL program on the controller, in its own folder,\n",[969,1130,1131],{},"\u002Fflash\u002Fprojects\u002Funitelabs_tcp_server\u002F",". It never deletes another project. If the controller runs\nanother program, from Brooks, an integrator or another scheduler, the connector stops and unloads\nit and points the startup settings at its own program. It changes these startup settings:",[1134,1135,1136,1140,1143,1146],"ul",{},[1137,1138,1139],"li",{},"GPL operating mode on;",[1137,1141,1142],{},"autostart, and auto compile and run, of its own project, at its own project path;",[1137,1144,1145],{},"home the arm on power-up;",[1137,1147,1148],{},"switch motor power on at power-up: off.",[957,1150,1151],{},"Note the current values in the web console before you connect, along with the name of the startup\nproject. To switch back later, disable motor power, set the old project and values again, and save\nthem to flash.",[1153,1154,1157],"callout",{"color":1155,"icon":1156},"warning","i-heroicons-exclamation-triangle",[957,1158,1159],{},"Drive the arm from one place at a time. Stop the connector in GroundControl before you use the Brooks web console to move the arm, and close the console before you start the connector again.",[973,1161,1163],{"id":1162},"install-and-configure-the-connector","Install and configure the connector",[1165,1166,1167,1177,1323,1350],"ol",{},[1137,1168,1169,1170,1172,1173,1176],{},"In GroundControl, add a connector and pick ",[1031,1171,600],{}," from the registry\n(",[961,1174,1175],{"href":76},"how to add a connector",").",[1137,1178,1179,1180,1183,1184,1319,1322],{},"Fill in the ",[969,1181,1182],{},"device"," block of the configuration. The fields that matter:",[978,1185,1186,1196],{},[981,1187,1188],{},[984,1189,1190,1193],{},[987,1191,1192],{},"Field",[987,1194,1195],{},"Value",[994,1197,1198,1211,1224,1241,1257,1274,1287,1301],{},[984,1199,1200,1205],{},[999,1201,1202],{},[969,1203,1204],{},"host",[999,1206,1207,1208,1210],{},"The controller's IP address, ",[969,1209,1023],{}," unless it was changed",[984,1212,1213,1218],{},[999,1214,1215],{},[969,1216,1217],{},"port",[999,1219,1220,1221,1223],{},"The command port, ",[969,1222,1085],{},". Change it only if the controller serves commands elsewhere",[984,1225,1226,1231],{},[999,1227,1228],{},[969,1229,1230],{},"simulation",[999,1232,1233,1236,1237,1240],{},[969,1234,1235],{},"false"," for the real arm. It defaults to ",[969,1238,1239],{},"true",", so a fresh install never moves anything",[984,1242,1243,1248],{},[999,1244,1245],{},[969,1246,1247],{},"extended_reach",[999,1249,1250,1251,1253,1254,1256],{},"Always set it: ",[969,1252,1239],{}," for an XR arm, ",[969,1255,1235],{}," for standard reach. A wrong value makes the reach check use the wrong link lengths, up to about 113 mm off",[984,1258,1259,1264],{},[999,1260,1261],{},[969,1262,1263],{},"rail_axis",[999,1265,1266,1269,1270,1273],{},[969,1267,1268],{},"y",", or ",[969,1271,1272],{},"x"," if the rail carriage is turned a quarter. Ignored without a rail",[984,1275,1276,1281],{},[999,1277,1278],{},[969,1279,1280],{},"ftp_user",[999,1282,1283,1284],{},"Leave empty, unless someone added FTP credentials on the controller. Same for ",[969,1285,1286],{},"ftp_password",[984,1288,1289,1294],{},[999,1290,1291],{},[969,1292,1293],{},"boot_timeout",[999,1295,1296,1297,1300],{},"Seconds to wait for the controller after installing the program, ",[969,1298,1299],{},"120"," by default",[984,1302,1303,1308],{},[999,1304,1305],{},[969,1306,1307],{},"profiles",[999,1309,1310,1311,1314,1315,1318],{},"Motion profiles to write into slots ",[969,1312,1313],{},"1"," to ",[969,1316,1317],{},"20"," at startup. Empty leaves the controller's values",[1320,1321],"br",{},"The rail is detected from the controller; there is no setting to turn it on.",[1137,1324,1325,1326,1340,1342,1343,1346,1347,1349],{},"Start the connector. On the first real-mode start it installs its program, which takes up to two\nminutes:",[1134,1327,1328,1331,1334],{},[1137,1329,1330],{},"uploads the program over FTP and sets it to start, compile and run on every power-up;",[1137,1332,1333],{},"starts it from the web console and checks that the code answering is the code it uploaded;",[1137,1335,1336,1337],{},"switches motor power on and homes the arm. ",[1031,1338,1339],{},"The arm moves.",[1320,1341],{},"On later starts nothing is uploaded. A connector update with a newer program re-uploads it.\nIf the program is installed but stopped, after a crash or an operator stopping it, the connector\nonly restarts it: no settings rewritten, no homing. The arm comes up powered but not homed, and\nmoves fail with ",[969,1344,1345],{},"-1021"," until you home it.",[1320,1348],{},"After a power cycle of the controller, the program starts on its own but motor power stays off.\nThe controller ships with power coming on at startup, and the connector turns that off. Switch\npower on and home the arm before the first move.",[1137,1351,1352,1353,1356,1357,1360,1361,1356,1364,1356,1367,1356,1370,1360,1373,1376,1377,1380,1381,1383],{},"GroundControl lists the modules, among them ",[969,1354,1355],{},"MovementController",", ",[969,1358,1359],{},"JointMovementController",",\n",[969,1362,1363],{},"PathController",[969,1365,1366],{},"GripperController",[969,1368,1369],{},"TransportController",[969,1371,1372],{},"SafetyController",[969,1374,1375],{},"LightingController"," and ",[969,1378,1379],{},"SimulationController",". ",[969,1382,1369],{}," only appears when the\ncontroller reports plate handling.",[957,1385,1386,1387,1314,1389,1391,1392,1394],{},"To go from simulation to the real arm, set ",[969,1388,1230],{},[969,1390,1235],{}," and restart the connector.\nSwitching with the ",[969,1393,1379],{}," module does not install the program, and fails if the\ncontroller runs another program until the connector restarts.",[957,1396,1397,1398,1314,1401,1403],{},"To install the program by hand instead, for example on a site that blocks FTP, set\n",[969,1399,1400],{},"auto_deploy",[969,1402,1235],{}," and ask UniteLabs support for the project files.",[973,1405,1407],{"id":1406},"try-it-without-an-arm","Try it without an arm",[957,1409,1410,1411,1413,1414,1416,1417,1420,1421,1423,1424,1426],{},"With ",[969,1412,1230],{}," left at ",[969,1415,1239],{},", the connector answers like a PF400 without one: moves take time\nand finish, the gripper grasps, and plate handling is reported. ",[969,1418,1419],{},"simulate_rail"," adds a rail. It\nchecks targets against the arm ",[969,1422,1247],{}," describes, so set that as you would for the real\narm. Every script on this page and in the\n",[961,1425,963],{"href":792}," runs against it.",[973,1428,1430],{"id":1429},"first-connection-test","First connection test",[957,1432,1433,1434,1436],{},"The script reads what the controller reports about itself, then its state and joint positions.\nNothing in it moves the arm. Run it with the SDK authenticated\n(",[961,1435,30],{"href":31},"), using the connector's name from\nGroundControl.",[1438,1439,1445],"pre",{"className":1440,"code":1441,"filename":1442,"language":1443,"meta":1444,"style":1444},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","import asyncio\n\nfrom unitelabs.sdk import AsyncApiClient\n\n\nasync def first(subscription, key):\n    # Sensor streams open with an event that carries no value,\n    # so read until one that does\n    async with subscription:\n        async for value in subscription:\n            if key in value:\n                return value\n    raise RuntimeError(\"The stream closed without a value\")\n\n\nasync def main():\n    client = AsyncApiClient()\n    arm = await client.get_service_by_name(name=\"Brooks PreciseFlex 400\")\n    info = arm.information_provider\n\n    # What the controller reports about itself\n    print(\"Model:\", await info.get_model())\n    print(\"Firmware:\", await info.get_firmware_version())\n    rail = await info.get_rail_installed()\n    print(\"Rail:\", rail)\n    print(\"Plate handling:\", await info.get_plate_handling_supported())\n\n    # Live state and position. Nothing here moves the arm\n    print(\"State:\", await first(await info.subscribe_state(), \"Homed\"))\n    suffix = \"_with_rail\" if rail else \"\"\n    stream = arm.joint_movement_controller.actions[\n        \"subscribe_joint_positions\" + suffix\n    ]\n    print(\"Joints:\", await first(await stream(), \"Column\"))\n\n\nasyncio.run(main())\n","first_connection.py","python","",[969,1446,1447,1460,1467,1481,1486,1491,1507,1514,1520,1532,1549,1563,1572,1592,1597,1602,1615,1627,1652,1663,1668,1674,1693,1710,1723,1736,1753,1758,1764,1792,1815,1826,1838,1844,1870,1875,1880],{"__ignoreMap":1444},[1448,1449,1452,1456],"span",{"class":1450,"line":1451},"line",1,[1448,1453,1455],{"class":1454},"sxkbv","import",[1448,1457,1459],{"class":1458},"sc-9e"," asyncio\n",[1448,1461,1463],{"class":1450,"line":1462},2,[1448,1464,1466],{"emptyLinePlaceholder":1465},true,"\n",[1448,1468,1470,1473,1476,1478],{"class":1450,"line":1469},3,[1448,1471,1472],{"class":1454},"from",[1448,1474,1475],{"class":1458}," unitelabs.sdk ",[1448,1477,1455],{"class":1454},[1448,1479,1480],{"class":1458}," AsyncApiClient\n",[1448,1482,1484],{"class":1450,"line":1483},4,[1448,1485,1466],{"emptyLinePlaceholder":1465},[1448,1487,1489],{"class":1450,"line":1488},5,[1448,1490,1466],{"emptyLinePlaceholder":1465},[1448,1492,1494,1497,1500,1504],{"class":1450,"line":1493},6,[1448,1495,1496],{"class":1454},"async",[1448,1498,1499],{"class":1454}," def",[1448,1501,1503],{"class":1502},"s4qFZ"," first",[1448,1505,1506],{"class":1458},"(subscription, key):\n",[1448,1508,1510],{"class":1450,"line":1509},7,[1448,1511,1513],{"class":1512},"sIsDC","    # Sensor streams open with an event that carries no value,\n",[1448,1515,1517],{"class":1450,"line":1516},8,[1448,1518,1519],{"class":1512},"    # so read until one that does\n",[1448,1521,1523,1526,1529],{"class":1450,"line":1522},9,[1448,1524,1525],{"class":1454},"    async",[1448,1527,1528],{"class":1454}," with",[1448,1530,1531],{"class":1458}," subscription:\n",[1448,1533,1535,1538,1541,1544,1547],{"class":1450,"line":1534},10,[1448,1536,1537],{"class":1454},"        async",[1448,1539,1540],{"class":1454}," for",[1448,1542,1543],{"class":1458}," value ",[1448,1545,1546],{"class":1454},"in",[1448,1548,1531],{"class":1458},[1448,1550,1552,1555,1558,1560],{"class":1450,"line":1551},11,[1448,1553,1554],{"class":1454},"            if",[1448,1556,1557],{"class":1458}," key ",[1448,1559,1546],{"class":1454},[1448,1561,1562],{"class":1458}," value:\n",[1448,1564,1566,1569],{"class":1450,"line":1565},12,[1448,1567,1568],{"class":1454},"                return",[1448,1570,1571],{"class":1458}," value\n",[1448,1573,1575,1578,1582,1585,1589],{"class":1450,"line":1574},13,[1448,1576,1577],{"class":1454},"    raise",[1448,1579,1581],{"class":1580},"sOiAX"," RuntimeError",[1448,1583,1584],{"class":1458},"(",[1448,1586,1588],{"class":1587},"sCx38","\"The stream closed without a value\"",[1448,1590,1591],{"class":1458},")\n",[1448,1593,1595],{"class":1450,"line":1594},14,[1448,1596,1466],{"emptyLinePlaceholder":1465},[1448,1598,1600],{"class":1450,"line":1599},15,[1448,1601,1466],{"emptyLinePlaceholder":1465},[1448,1603,1605,1607,1609,1612],{"class":1450,"line":1604},16,[1448,1606,1496],{"class":1454},[1448,1608,1499],{"class":1454},[1448,1610,1611],{"class":1502}," main",[1448,1613,1614],{"class":1458},"():\n",[1448,1616,1618,1621,1624],{"class":1450,"line":1617},17,[1448,1619,1620],{"class":1458},"    client ",[1448,1622,1623],{"class":1454},"=",[1448,1625,1626],{"class":1458}," AsyncApiClient()\n",[1448,1628,1630,1633,1635,1638,1641,1645,1647,1650],{"class":1450,"line":1629},18,[1448,1631,1632],{"class":1458},"    arm ",[1448,1634,1623],{"class":1454},[1448,1636,1637],{"class":1454}," await",[1448,1639,1640],{"class":1458}," client.get_service_by_name(",[1448,1642,1644],{"class":1643},"sNqAu","name",[1448,1646,1623],{"class":1454},[1448,1648,1649],{"class":1587},"\"Brooks PreciseFlex 400\"",[1448,1651,1591],{"class":1458},[1448,1653,1655,1658,1660],{"class":1450,"line":1654},19,[1448,1656,1657],{"class":1458},"    info ",[1448,1659,1623],{"class":1454},[1448,1661,1662],{"class":1458}," arm.information_provider\n",[1448,1664,1666],{"class":1450,"line":1665},20,[1448,1667,1466],{"emptyLinePlaceholder":1465},[1448,1669,1671],{"class":1450,"line":1670},21,[1448,1672,1673],{"class":1512},"    # What the controller reports about itself\n",[1448,1675,1677,1680,1682,1685,1687,1690],{"class":1450,"line":1676},22,[1448,1678,1679],{"class":1580},"    print",[1448,1681,1584],{"class":1458},[1448,1683,1684],{"class":1587},"\"Model:\"",[1448,1686,1356],{"class":1458},[1448,1688,1689],{"class":1454},"await",[1448,1691,1692],{"class":1458}," info.get_model())\n",[1448,1694,1696,1698,1700,1703,1705,1707],{"class":1450,"line":1695},23,[1448,1697,1679],{"class":1580},[1448,1699,1584],{"class":1458},[1448,1701,1702],{"class":1587},"\"Firmware:\"",[1448,1704,1356],{"class":1458},[1448,1706,1689],{"class":1454},[1448,1708,1709],{"class":1458}," info.get_firmware_version())\n",[1448,1711,1713,1716,1718,1720],{"class":1450,"line":1712},24,[1448,1714,1715],{"class":1458},"    rail ",[1448,1717,1623],{"class":1454},[1448,1719,1637],{"class":1454},[1448,1721,1722],{"class":1458}," info.get_rail_installed()\n",[1448,1724,1726,1728,1730,1733],{"class":1450,"line":1725},25,[1448,1727,1679],{"class":1580},[1448,1729,1584],{"class":1458},[1448,1731,1732],{"class":1587},"\"Rail:\"",[1448,1734,1735],{"class":1458},", rail)\n",[1448,1737,1739,1741,1743,1746,1748,1750],{"class":1450,"line":1738},26,[1448,1740,1679],{"class":1580},[1448,1742,1584],{"class":1458},[1448,1744,1745],{"class":1587},"\"Plate handling:\"",[1448,1747,1356],{"class":1458},[1448,1749,1689],{"class":1454},[1448,1751,1752],{"class":1458}," info.get_plate_handling_supported())\n",[1448,1754,1756],{"class":1450,"line":1755},27,[1448,1757,1466],{"emptyLinePlaceholder":1465},[1448,1759,1761],{"class":1450,"line":1760},28,[1448,1762,1763],{"class":1512},"    # Live state and position. Nothing here moves the arm\n",[1448,1765,1767,1769,1771,1774,1776,1778,1781,1783,1786,1789],{"class":1450,"line":1766},29,[1448,1768,1679],{"class":1580},[1448,1770,1584],{"class":1458},[1448,1772,1773],{"class":1587},"\"State:\"",[1448,1775,1356],{"class":1458},[1448,1777,1689],{"class":1454},[1448,1779,1780],{"class":1458}," first(",[1448,1782,1689],{"class":1454},[1448,1784,1785],{"class":1458}," info.subscribe_state(), ",[1448,1787,1788],{"class":1587},"\"Homed\"",[1448,1790,1791],{"class":1458},"))\n",[1448,1793,1795,1798,1800,1803,1806,1809,1812],{"class":1450,"line":1794},30,[1448,1796,1797],{"class":1458},"    suffix ",[1448,1799,1623],{"class":1454},[1448,1801,1802],{"class":1587}," \"_with_rail\"",[1448,1804,1805],{"class":1454}," if",[1448,1807,1808],{"class":1458}," rail ",[1448,1810,1811],{"class":1454},"else",[1448,1813,1814],{"class":1587}," \"\"\n",[1448,1816,1818,1821,1823],{"class":1450,"line":1817},31,[1448,1819,1820],{"class":1458},"    stream ",[1448,1822,1623],{"class":1454},[1448,1824,1825],{"class":1458}," arm.joint_movement_controller.actions[\n",[1448,1827,1829,1832,1835],{"class":1450,"line":1828},32,[1448,1830,1831],{"class":1587},"        \"subscribe_joint_positions\"",[1448,1833,1834],{"class":1454}," +",[1448,1836,1837],{"class":1458}," suffix\n",[1448,1839,1841],{"class":1450,"line":1840},33,[1448,1842,1843],{"class":1458},"    ]\n",[1448,1845,1847,1849,1851,1854,1856,1858,1860,1862,1865,1868],{"class":1450,"line":1846},34,[1448,1848,1679],{"class":1580},[1448,1850,1584],{"class":1458},[1448,1852,1853],{"class":1587},"\"Joints:\"",[1448,1855,1356],{"class":1458},[1448,1857,1689],{"class":1454},[1448,1859,1780],{"class":1458},[1448,1861,1689],{"class":1454},[1448,1863,1864],{"class":1458}," stream(), ",[1448,1866,1867],{"class":1587},"\"Column\"",[1448,1869,1791],{"class":1458},[1448,1871,1873],{"class":1450,"line":1872},35,[1448,1874,1466],{"emptyLinePlaceholder":1465},[1448,1876,1878],{"class":1450,"line":1877},36,[1448,1879,1466],{"emptyLinePlaceholder":1465},[1448,1881,1883],{"class":1450,"line":1882},37,[1448,1884,1885],{"class":1458},"asyncio.run(main())\n",[957,1887,1888,1889,1892],{},"Run it with ",[969,1890,1891],{},"uv run first_connection.py",". On a real arm it prints something like:",[1438,1894,1899],{"className":1895,"code":1897,"language":1898,"meta":1444},[1896],"language-text","Model: PreciseFlex 400\nFirmware: TCP Command Server 3.0D2 06-28-2024, ..., PARobot Module 3.0C2 07-11-2023, ...\nRail: False\nPlate handling: True\nState: {'Status': 'IDLE', 'Enabled': True, 'Homed': True}\nJoints: {'Column': 502.27, 'Shoulder': 26.389, 'Elbow': 181.844, 'Wrist': -207.677, 'Gripper': 126.12}\n","text",[969,1900,1897],{"__ignoreMap":1444},[957,1902,1903,1904,1907,1908,1911,1912,1915,1916,1919],{},"With a rail, ",[969,1905,1906],{},"Joints"," also carries ",[969,1909,1910],{},"Rail",". If ",[969,1913,1914],{},"Plate handling"," is ",[969,1917,1918],{},"False",", the pick-up and put-down\ncommands are not available; contact UniteLabs support.",[973,1921,1923],{"id":1922},"known-quirks-and-errors","Known quirks and errors",[978,1925,1926,1939],{},[981,1927,1928],{},[984,1929,1930,1933,1936],{},[987,1931,1932],{},"You see",[987,1934,1935],{},"It means",[987,1937,1938],{},"Do this",[994,1940,1941,1962,1980,1998,2015,2028,2051],{},[984,1942,1943,1949,1952],{},[999,1944,1945,1948],{},[969,1946,1947],{},"-1021 Robot not homed"," on every move",[999,1950,1951],{},"The program restarted, the controller was power-cycled, or the arm was stopped",[999,1953,1954,1955,1958,1959],{},"Clear the gripper. Switch power on if it is off (",[969,1956,1957],{},"update_power(active=True)","), then ",[969,1960,1961],{},"await arm.movement_controller.home()",[984,1963,1964,1970,1973],{},[999,1965,1966,1969],{},[969,1967,1968],{},"-1009"," latched fault",[999,1971,1972],{},"A collision or an emergency stop left a fault the controller holds",[999,1974,1975,1976,1979],{},"Check the cell and the gripper, then ",[969,1977,1978],{},"await arm.safety_controller.recover()",". It clears the fault and re-homes, so the arm moves",[984,1981,1982,1990,1995],{},[999,1983,1984,1985,1987,1988],{},"The connector does not start with ",[969,1986,1230],{}," set to ",[969,1989,1235],{},[999,1991,1992,1993],{},"No arm answered at ",[969,1994,1204],{},[999,1996,1997],{},"Check the cable, the address and the ports above. The connector does not fall back to simulation",[984,1999,2000,2003,2009],{},[999,2001,2002],{},"An error naming two digests",[999,2004,2005,2006,2008],{},"A different program answers on port ",[969,2007,1085],{},", found on a reconnect",[999,2010,2011,2012,1503],{},"Restart the connector. A fresh start installs its own program next to the other one and switches the startup settings; see ",[961,2013,1122],{"href":2014},"#before-you-connect",[984,2016,2017,2022,2025],{},[999,2018,2019],{},[969,2020,2021],{},"-2805 Unknown command",[999,2023,2024],{},"The controller runs another vendor's program",[999,2026,2027],{},"As above",[984,2029,2030,2033,2043],{},[999,2031,2032],{},"A move is refused with a profile out of range",[999,2034,2035,2036,1314,2039,2042],{},"Profiles ",[969,2037,2038],{},"0",[969,2040,2041],{},"-5"," only exist from connector 0.4.0",[999,2044,2045,2046,1314,2048,2050],{},"Update the connector, or use a slot from ",[969,2047,1313],{},[969,2049,1317],{}," that you have set to a known speed",[984,2052,2053,2056,2059],{},[999,2054,2055],{},"The arm does not respond to the connector",[999,2057,2058],{},"Someone is driving it from the Brooks web console",[999,2060,2061],{},"Close the console; one driver at a time",[957,2063,2064,2067],{},[969,2065,2066],{},"Homed"," in the state can lag behind the arm for a few seconds after a move, a stop or a recovery.",[973,2069,2071],{"id":2070},"next-steps","Next steps",[1134,2073,2074,2079,2085],{},[1137,2075,2076,2078],{},[961,2077,384],{"href":385},": how UniteLabs represents an arm and its teachpoints.",[1137,2080,2081,2084],{},[961,2082,2083],{"href":792},"Teach positions",": capture\nstations in the Teach view.",[1137,2086,2087,2090,2091,2094],{},[961,2088,2089],{"href":796},"Move a plate"," and\n",[961,2092,2093],{"href":800},"Recover from a stop",".",[973,2096,2098],{"id":2097},"vendor-documentation","Vendor documentation",[957,2100,2101],{},"Mounting, power, the controller's own settings and safety are covered by the Brooks PreciseFlex\n400 manual and the Guidance Controller documentation shipped with the arm.",[2103,2104,2105],"style",{},"html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .s4qFZ, html code.shiki .s4qFZ{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#D2A8FF}html pre.shiki code .sIsDC, html code.shiki .sIsDC{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#8B949E}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}html pre.shiki code .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1444,"searchDepth":1451,"depth":1462,"links":2107},[2108,2109,2110,2111,2112,2113,2114,2115],{"id":975,"depth":1462,"text":976},{"id":1121,"depth":1462,"text":1122},{"id":1162,"depth":1462,"text":1163},{"id":1406,"depth":1462,"text":1407},{"id":1429,"depth":1462,"text":1430},{"id":1922,"depth":1462,"text":1923},{"id":2070,"depth":1462,"text":2071},{"id":2097,"depth":1462,"text":2098},"Get a Brooks PreciseFlex 400 robot arm connected through GroundControl, with the connector installing its own controller software, and confirm the connection from Python.",{"slug":604,"vendor":605,"category":596,"connector":604,"package":606,"models":2118,"communication":611,"vendor_software":6,"os":2119},[608,609,610],[479,480,481],"md",{},"\u002Fdevices\u002Fbrooks-preciseflex-400",{"title":600,"description":2116},"4SpfZcUJp8OYkr0kKn5SiMO27YhYkYA0cTUVXnUTqCM",[2126,6],{"title":586,"description":2127,"path":587},"Get a QInstruments TurnStation connected through GroundControl, initialise it and turn a plate to a first position from Python.",1791466878884]