[{"data":1,"prerenderedAt":1716},["ShallowReactive",2],{"navigation":3,"\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install":788,"\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install-surround":1711},[4,84,167,397,461,563,600,679],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started\u002F","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works\u002F","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases\u002F","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\u002F","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\u002F","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration\u002F","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\u002F","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\u002F","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code\u002F","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F20.setup",[52,56,60,64,68,72,76,80],{"title":53,"path":54,"stem":55},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F20.setup\u002F00.get-access",{"title":57,"path":58,"stem":59},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":61,"path":62,"stem":63},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F20.setup\u002F20.developer-machine",{"title":65,"path":66,"stem":67},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F20.setup\u002F30.sdk-installation",{"title":69,"path":70,"stem":71},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":73,"path":74,"stem":75},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices\u002F","01.get-started\u002F20.setup\u002F45.multiple-devices",{"title":77,"path":78,"stem":79},"UniteLabs Desktop","\u002Fget-started\u002Fsetup\u002Funitelabs-desktop\u002F","01.get-started\u002F20.setup\u002F70.unitelabs-desktop",{"title":81,"path":82,"stem":83},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements\u002F","01.get-started\u002F20.setup\u002F90.network-requirements",{"title":85,"path":86,"stem":87,"children":88,"page":42},"Integrate","\u002Fintegrate\u002F","02.integrate",[89,93,97,122,151],{"title":90,"path":91,"stem":92},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector\u002F","02.integrate\u002F00.what-is-a-connector",{"title":94,"path":95,"stem":96},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code\u002F","02.integrate\u002F05.control-with-code",{"title":98,"path":99,"stem":100,"children":101,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts\u002F","02.integrate\u002F10.concepts",[102,106,110,114,118],{"title":103,"path":104,"stem":105},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector\u002F","02.integrate\u002F10.concepts\u002F10.connector",{"title":107,"path":108,"stem":109},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule\u002F","02.integrate\u002F10.concepts\u002F20.module",{"title":111,"path":112,"stem":113},"Action","\u002Fintegrate\u002Fconcepts\u002Faction\u002F","02.integrate\u002F10.concepts\u002F30.action",{"title":115,"path":116,"stem":117},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription\u002F","02.integrate\u002F10.concepts\u002F40.subscription",{"title":119,"path":120,"stem":121},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice\u002F","02.integrate\u002F10.concepts\u002F50.device",{"title":123,"path":124,"stem":125,"children":126,"page":42},"Connect a device","\u002Fintegrate\u002Fconnect-a-device\u002F","02.integrate\u002F20.connect-a-device",[127,131,135,139,143,147],{"title":128,"path":129,"stem":130},"Connector Configuration","\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":132,"path":133,"stem":134},"With an executable","\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":136,"path":137,"stem":138},"From source","\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":140,"path":141,"stem":142},"Build your own","\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":144,"path":145,"stem":146},"Headless install","\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":148,"path":149,"stem":150},"Raspberry Pi","\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":152,"path":153,"stem":154,"children":155,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector\u002F","02.integrate\u002F30.use-a-connector",[156,159,163],{"title":57,"path":157,"stem":158},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol\u002F","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":160,"path":161,"stem":162},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform\u002F","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":164,"path":165,"stem":166},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython\u002F","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":168,"path":169,"stem":170,"children":171,"page":42},"Operate","\u002Foperate\u002F","03.operate",[172,175,179,219,292],{"title":168,"path":173,"stem":174},"\u002Foperate\u002Foverview\u002F","03.operate\u002F00.overview",{"title":176,"path":177,"stem":178},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol\u002F","03.operate\u002F05.your-first-protocol",{"title":98,"path":180,"stem":181,"children":182,"page":42},"\u002Foperate\u002Fconcepts\u002F","03.operate\u002F10.concepts",[183,187,191,195,199,203,207,211,215],{"title":184,"path":185,"stem":186},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling\u002F","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":188,"path":189,"stem":190},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules\u002F","03.operate\u002F10.concepts\u002F20.modules",{"title":192,"path":193,"stem":194},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck\u002F","03.operate\u002F10.concepts\u002F30.deck",{"title":196,"path":197,"stem":198},"Labware","\u002Foperate\u002Fconcepts\u002Flabware\u002F","03.operate\u002F10.concepts\u002F40.labware",{"title":200,"path":201,"stem":202},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids\u002F","03.operate\u002F10.concepts\u002F50.liquids",{"title":204,"path":205,"stem":206},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes\u002F","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":208,"path":209,"stem":210},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips\u002F","03.operate\u002F10.concepts\u002F70.tips",{"title":212,"path":213,"stem":214},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation\u002F","03.operate\u002F10.concepts\u002F80.simulation",{"title":216,"path":217,"stem":218},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling\u002F","03.operate\u002F10.concepts\u002F90.error-handling",{"title":220,"path":221,"stem":222,"children":223,"page":42},"Guides","\u002Foperate\u002Fguides\u002F","03.operate\u002F20.guides",[224,253,265,289],{"title":196,"path":225,"stem":226,"children":227},"\u002Foperate\u002Fguides\u002Flabware\u002F","03.operate\u002F20.guides\u002F10.labware\u002Findex",[228,229,233,237,241,245,249],{"title":196,"path":225,"stem":226},{"title":230,"path":231,"stem":232},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware\u002F","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":234,"path":235,"stem":236},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates\u002F","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":238,"path":239,"stem":240},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks\u002F","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":242,"path":243,"stem":244},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks\u002F","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":246,"path":247,"stem":248},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs\u002F","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":250,"path":251,"stem":252},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters\u002F","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":192,"path":254,"stem":255,"children":256,"page":42},"\u002Foperate\u002Fguides\u002Fdeck\u002F","03.operate\u002F20.guides\u002F20.deck",[257,261],{"title":258,"path":259,"stem":260},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck\u002F","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":262,"path":263,"stem":264},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck\u002F","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":266,"path":267,"stem":268,"children":269,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting",[270,274,278,282,285],{"title":271,"path":272,"stem":273},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":275,"path":276,"stem":277},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":279,"path":280,"stem":281},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":204,"path":283,"stem":284},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":286,"path":287,"stem":288},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport\u002F","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":212,"path":290,"stem":291},"\u002Foperate\u002Fguides\u002Fsimulation\u002F","03.operate\u002F20.guides\u002F40.simulation",{"title":293,"path":294,"stem":295,"children":296,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices\u002F","03.operate\u002F30.devices",[297,338,363,380],{"title":298,"path":299,"stem":300,"children":301,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002F","03.operate\u002F30.devices\u002F10.hamilton-star",[302,306,310,314,318,322,326,330,334],{"title":303,"path":304,"stem":305},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":307,"path":308,"stem":309},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":311,"path":312,"stem":313},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":315,"path":316,"stem":317},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":319,"path":320,"stem":321},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":323,"path":324,"stem":325},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":327,"path":328,"stem":329},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":331,"path":332,"stem":333},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":335,"path":336,"stem":337},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position\u002F","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":339,"path":340,"stem":341,"children":342,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage",[343,347,351,355,359],{"title":344,"path":345,"stem":346},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":348,"path":349,"stem":350},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":352,"path":353,"stem":354},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":356,"path":357,"stem":358},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":360,"path":361,"stem":362},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels\u002F","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":364,"path":365,"stem":366,"children":367,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo",[368,371,374,377],{"title":279,"path":369,"stem":370},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":271,"path":372,"stem":373},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":204,"path":375,"stem":376},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":307,"path":378,"stem":379},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":381,"path":382,"stem":383,"children":384,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[385,389,393],{"title":386,"path":387,"stem":388},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":390,"path":391,"stem":392},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":394,"path":395,"stem":396},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":398,"path":399,"stem":400,"children":401,"page":42},"Device Guides","\u002Fdevice-guides\u002F","06.device-guides",[402,405,418,435,448],{"title":398,"path":403,"stem":404},"\u002Fdevice-guides\u002Foverview\u002F","06.device-guides\u002F00.overview",{"title":406,"path":407,"stem":408,"children":409,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation\u002F","06.device-guides\u002F20.incubation",[410,414],{"title":411,"path":412,"stem":413},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc\u002F","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":415,"path":416,"stem":417},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila\u002F","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":419,"path":420,"stem":421,"children":422,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers\u002F","06.device-guides\u002F30.heater-shakers",[423,427,431],{"title":424,"path":425,"stem":426},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake\u002F","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":428,"path":429,"stem":430},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake\u002F","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":432,"path":433,"stem":434},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate\u002F","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":436,"path":437,"stem":438,"children":439,"page":42},"Readers","\u002Fdevice-guides\u002Freaders\u002F","06.device-guides\u002F40.readers",[440,444],{"title":441,"path":442,"stem":443},"Agilent Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5\u002F","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":445,"path":446,"stem":447},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1\u002F","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":449,"path":450,"stem":451,"children":452,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn\u002F","06.device-guides\u002F50.tilt-and-turn",[453,457],{"title":454,"path":455,"stem":456},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation\u002F","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":458,"path":459,"stem":460},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation\u002F","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":462,"path":463,"stem":464,"children":465,"page":42},"Automate","\u002Fautomate\u002F","07.automate",[466,470,474,478,527],{"title":467,"path":468,"stem":469},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow\u002F","07.automate\u002F00.what-is-a-workflow",{"title":471,"path":472,"stem":473},"Workflow template","\u002Fautomate\u002Fworkflow-template\u002F","07.automate\u002F05.workflow-template",{"title":475,"path":476,"stem":477},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow\u002F","07.automate\u002F08.your-first-workflow",{"title":98,"pages":479,"path":489,"stem":490,"children":491,"page":42},[480,481,482,483,484,485,486,487,488],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts\u002F","07.automate\u002F10.concepts",[492,496,500,504,508,512,516,520,524],{"title":493,"path":494,"stem":495},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow\u002F","07.automate\u002F10.concepts\u002F10.workflow",{"title":497,"path":498,"stem":499},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase\u002F","07.automate\u002F10.concepts\u002F20.phase",{"title":501,"path":502,"stem":503},"Step","\u002Fautomate\u002Fconcepts\u002Fstep\u002F","07.automate\u002F10.concepts\u002F30.step",{"title":505,"path":506,"stem":507},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns\u002F","07.automate\u002F10.concepts\u002F40.runs",{"title":509,"path":510,"stem":511},"Input","\u002Fautomate\u002Fconcepts\u002Finput\u002F","07.automate\u002F10.concepts\u002F50.input",{"title":513,"path":514,"stem":515},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts\u002F","07.automate\u002F10.concepts\u002F60.artifacts",{"title":517,"path":518,"stem":519},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs\u002F","07.automate\u002F10.concepts\u002F70.logs",{"title":521,"path":522,"stem":523},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop\u002F","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":216,"path":525,"stem":526},"\u002Fautomate\u002Fconcepts\u002Ferror-handling\u002F","07.automate\u002F10.concepts\u002F90.error-handling",{"title":220,"path":528,"stem":529,"children":530,"page":42},"\u002Fautomate\u002Fguides\u002F","07.automate\u002F25.guides",[531,535,539,543,547,551,555,559],{"title":532,"path":533,"stem":534},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow\u002F","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":536,"path":537,"stem":538},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow\u002F","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":540,"path":541,"stem":542},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows\u002F","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":544,"path":545,"stem":546},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl\u002F","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":548,"path":549,"stem":550},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs\u002F","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":552,"path":553,"stem":554},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling\u002F","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":556,"path":557,"stem":558},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling\u002F","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":560,"path":561,"stem":562},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api\u002F","07.automate\u002F25.guides\u002F80.workflows-api",{"title":564,"path":565,"stem":566,"children":567,"page":42},"Observe","\u002Fobserve\u002F","08.observe",[568,572,588],{"title":569,"path":570,"stem":571},"Overview","\u002Fobserve\u002Foverview\u002F","08.observe\u002F10.overview",{"title":98,"path":573,"stem":574,"children":575,"page":42},"\u002Fobserve\u002Fconcepts\u002F","08.observe\u002F20.concepts",[576,580,584],{"title":577,"path":578,"stem":579},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage\u002F","08.observe\u002F20.concepts\u002F10.storage",{"title":581,"path":582,"stem":583},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets\u002F","08.observe\u002F20.concepts\u002F20.secrets",{"title":585,"path":586,"stem":587},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources\u002F","08.observe\u002F20.concepts\u002F30.data-sources",{"title":220,"path":589,"stem":590,"children":591,"page":42},"\u002Fobserve\u002Fguides\u002F","08.observe\u002F30.guides",[592,596],{"title":593,"path":594,"stem":595},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector\u002F","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":597,"path":598,"stem":599},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl\u002F","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":601,"path":602,"stem":603,"children":604,"page":42},"Technical Reference","\u002Ftechnical-reference\u002F","10.technical-reference",[605,609,613,625,636,647,657,668],{"title":606,"path":607,"stem":608},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint\u002F","10.technical-reference\u002F00.platform-blueprint",{"title":610,"path":611,"stem":612},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","10.technical-reference\u002F01.rest-api",{"title":57,"path":614,"stem":615,"children":616,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","10.technical-reference\u002F10.groundcontrol",[617,621],{"title":618,"path":619,"stem":620},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall\u002F","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":622,"path":623,"stem":624},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":626,"path":627,"stem":628,"children":629,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","10.technical-reference\u002F20.python-sdk",[630,633],{"title":618,"path":631,"stem":632},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall\u002F","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":622,"path":634,"stem":635},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":637,"path":638,"stem":639,"children":640,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk",[641,644],{"title":618,"path":642,"stem":643},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":622,"path":645,"stem":646},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":196,"path":648,"stem":649,"children":650,"page":42},"\u002Ftechnical-reference\u002Flabware\u002F","10.technical-reference\u002F40.labware",[651,654],{"title":618,"path":652,"stem":653},"\u002Ftechnical-reference\u002Flabware\u002Finstall\u002F","10.technical-reference\u002F40.labware\u002F10.install",{"title":622,"path":655,"stem":656},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":658,"path":659,"stem":660,"children":661,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","10.technical-reference\u002F50.python-omnibus",[662,665],{"title":618,"path":663,"stem":664},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall\u002F","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":622,"path":666,"stem":667},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":669,"path":670,"stem":671,"children":672,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","10.technical-reference\u002F60.python-cdk",[673,676],{"title":618,"path":674,"stem":675},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall\u002F","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":622,"path":677,"stem":678},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":680,"path":681,"stem":682,"children":683},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[684,686,706,739,747,782],{"title":680,"path":681,"stem":685},"20.connector-development\u002Findex",{"title":687,"path":688,"stem":689,"children":690,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[691,694,698,702],{"title":569,"path":692,"stem":693},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":695,"path":696,"stem":697},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":699,"path":700,"stem":701},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":703,"path":704,"stem":705},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":707,"path":708,"stem":709,"children":710,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[711,715,719,723,727,731,735],{"title":712,"path":713,"stem":714},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":716,"path":717,"stem":718},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":720,"path":721,"stem":722},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":724,"path":725,"stem":726},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":728,"path":729,"stem":730},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":732,"path":733,"stem":734},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":736,"path":737,"stem":738},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":98,"path":740,"stem":741,"children":742,"page":42},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[743],{"title":744,"path":745,"stem":746},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":220,"path":748,"stem":749,"children":750,"page":42},"\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[751,755,759,763,767,771,774,778],{"title":752,"path":753,"stem":754},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":756,"path":757,"stem":758},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":760,"path":761,"stem":762},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":764,"path":765,"stem":766},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":768,"path":769,"stem":770},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":216,"path":772,"stem":773},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":775,"path":776,"stem":777},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":779,"path":780,"stem":781},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":783,"path":784,"stem":785,"children":786},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[787],{"title":783,"path":784,"stem":785},{"id":789,"title":144,"body":790,"description":1704,"extension":1705,"links":1706,"meta":1707,"navigation":1373,"path":1708,"seo":1709,"stem":146,"__hash__":1710},"docs\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install.md",{"type":791,"value":792,"toc":1687},"minimark",[793,797,810,817,822,825,836,839,845,848,890,905,909,914,921,1072,1076,1087,1127,1133,1137,1143,1207,1214,1251,1255,1258,1270,1280,1300,1325,1329,1332,1336,1342,1423,1433,1437,1510,1514,1600,1604,1610,1647,1651,1673,1677,1683],[794,795,796],"p",{},"Connectors are distributed as self-contained executables that bundle their own Python runtime. You can run them directly on any Linux machine without installing GroundControl or Python. This is the typical setup for:",[798,799,800,804,807],"ul",{},[801,802,803],"li",{},"Raspberry Pi devices co-located with instruments",[801,805,806],{},"Headless Linux servers in the lab network",[801,808,809],{},"Environments where a GUI is not practical",[794,811,812,813,816],{},"For workstations and lab PCs with a display, ",[814,815,57],"a",{"href":58}," is the easier path.",[818,819,821],"h2",{"id":820},"get-the-connector-executable","Get the connector executable",[794,823,824],{},"Contact your UniteLabs representative or download the connector from the UniteLabs connector registry. Executables are named:",[826,827,832],"pre",{"className":828,"code":830,"language":831},[829],"language-text","unitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\n","text",[833,834,830],"code",{"__ignoreMap":835},"",[794,837,838],{},"For example, on a Raspberry Pi 4 (64-bit):",[826,840,843],{"className":841,"code":842,"language":831},[829],"unitelabs-microlab-star-aarch64-unknown-linux-gnu-0.5.0\n",[833,844,842],{"__ignoreMap":835},[794,846,847],{},"Common architecture suffixes:",[849,850,851,866],"table",{},[852,853,854],"thead",{},[855,856,857,861],"tr",{},[858,859,860],"th",{},"Architecture",[858,862,863],{},[833,864,865],{},"\u003Cplatform>",[867,868,869,880],"tbody",{},[855,870,871,875],{},[872,873,874],"td",{},"x86_64 Linux",[872,876,877],{},[833,878,879],{},"x86_64-unknown-linux-gnu",[855,881,882,885],{},[872,883,884],{},"ARM64 Linux (RPi 4\u002F5)",[872,886,887],{},[833,888,889],{},"aarch64-unknown-linux-gnu",[794,891,892,893,896,897,900,901,904],{},"The commands below use ",[833,894,895],{},"unitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>"," as a placeholder — replace it with the file name of the executable you downloaded, and ",[833,898,899],{},"\u003Cdevice_name>"," with your device, e.g. ",[833,902,903],{},"microlab_star",".",[818,906,908],{"id":907},"install-and-configure","Install and configure",[910,911,913],"h3",{"id":912},"_1-place-the-binary","1. Place the binary",[794,915,916,917,920],{},"Create a folder for the connector under ",[833,918,919],{},"\u002Fopt\u002Fconnectors\u002F",":",[826,922,926],{"className":923,"code":924,"language":925,"meta":835,"style":835},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo mkdir -p \u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\nsudo cp unitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion> \u002Fopt\u002Fconnectors\u002F\u003Cdevice-name>\u002F\nsudo chmod +x \u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\n","bash",[833,927,928,961,1020],{"__ignoreMap":835},[929,930,933,937,941,944,947,951,954,958],"span",{"class":931,"line":932},"line",1,[929,934,936],{"class":935},"sBMFI","sudo",[929,938,940],{"class":939},"sfazB"," mkdir",[929,942,943],{"class":939}," -p",[929,945,946],{"class":939}," \u002Fopt\u002Fconnectors\u002F",[929,948,950],{"class":949},"sMK4o","\u003C",[929,952,953],{"class":939},"device_nam",[929,955,957],{"class":956},"sTEyZ","e",[929,959,960],{"class":949},">\n",[929,962,964,966,969,972,974,977,979,982,985,987,990,993,995,997,999,1002,1005,1007,1009,1011,1013,1015,1017],{"class":931,"line":963},2,[929,965,936],{"class":935},[929,967,968],{"class":939}," cp",[929,970,971],{"class":939}," unitelabs-",[929,973,950],{"class":949},[929,975,976],{"class":939},"device-nam",[929,978,957],{"class":956},[929,980,981],{"class":949},">",[929,983,984],{"class":939},"-",[929,986,950],{"class":949},[929,988,989],{"class":939},"platfor",[929,991,992],{"class":956},"m",[929,994,981],{"class":949},[929,996,984],{"class":939},[929,998,950],{"class":949},[929,1000,1001],{"class":939},"versio",[929,1003,1004],{"class":956},"n",[929,1006,981],{"class":949},[929,1008,946],{"class":939},[929,1010,950],{"class":949},[929,1012,976],{"class":939},[929,1014,957],{"class":956},[929,1016,981],{"class":949},[929,1018,1019],{"class":939},"\u002F\n",[929,1021,1023,1025,1028,1031,1033,1035,1037,1039,1041,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070],{"class":931,"line":1022},3,[929,1024,936],{"class":935},[929,1026,1027],{"class":939}," chmod",[929,1029,1030],{"class":939}," +x",[929,1032,946],{"class":939},[929,1034,950],{"class":949},[929,1036,953],{"class":939},[929,1038,957],{"class":956},[929,1040,981],{"class":949},[929,1042,1043],{"class":939},"\u002Funitelabs-",[929,1045,950],{"class":949},[929,1047,976],{"class":939},[929,1049,957],{"class":956},[929,1051,981],{"class":949},[929,1053,984],{"class":939},[929,1055,950],{"class":949},[929,1057,989],{"class":939},[929,1059,992],{"class":956},[929,1061,981],{"class":949},[929,1063,984],{"class":939},[929,1065,950],{"class":949},[929,1067,1001],{"class":939},[929,1069,1004],{"class":956},[929,1071,960],{"class":949},[910,1073,1075],{"id":1074},"_2-generate-the-default-config","2. Generate the default config",[794,1077,1078,1079,1082,1083,1086],{},"Run the connector once with the ",[833,1080,1081],{},"config create"," command to generate a ",[833,1084,1085],{},"config.json"," with all available fields:",[826,1088,1090],{"className":923,"code":1089,"language":925,"meta":835,"style":835},"cd \u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\n.\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion> --start-cmd \"config create\"\n",[833,1091,1092,1108],{"__ignoreMap":835},[929,1093,1094,1098,1100,1102,1104,1106],{"class":931,"line":932},[929,1095,1097],{"class":1096},"s2Zo4","cd",[929,1099,946],{"class":939},[929,1101,950],{"class":949},[929,1103,953],{"class":939},[929,1105,957],{"class":956},[929,1107,960],{"class":949},[929,1109,1110,1113,1116,1119,1122,1124],{"class":931,"line":963},[929,1111,1112],{"class":935},".\u002Funitelabs-",[929,1114,1115],{"class":956},"\u003Cdevice-name>-\u003Cplatform>-\u003Cversion> ",[929,1117,1118],{"class":939},"--start-cmd",[929,1120,1121],{"class":949}," \"",[929,1123,1081],{"class":939},[929,1125,1126],{"class":949},"\"\n",[794,1128,1129,1130,1132],{},"This writes ",[833,1131,1085],{}," to the current folder.",[910,1134,1136],{"id":1135},"_3-edit-configjson","3. Edit config.json",[794,1138,1139,1140,1142],{},"Open ",[833,1141,1085],{}," and fill in the instrument-specific settings — typically the connector's hostname or IP address and port it should run on or instrument specifics such as the serial port (This is not required for the Mircolab STAR as it auto-detects the instrument):",[826,1144,1148],{"className":1145,"code":1146,"language":1147,"meta":835,"style":835},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"serial_port\": \"\",\n  \"sila_server\": {\n    \"hostname\": \"0.0.0.0\",\n    \"port\": 50052,\n    \"tls\": true,\n    \"name\": \"Hamilton Microlab STAR\",\n    ...\n  }\n}\n","json",[833,1149,1150,1155,1160,1165,1171,1177,1183,1189,1195,1201],{"__ignoreMap":835},[929,1151,1152],{"class":931,"line":932},[929,1153,1154],{},"{\n",[929,1156,1157],{"class":931,"line":963},[929,1158,1159],{},"  \"serial_port\": \"\",\n",[929,1161,1162],{"class":931,"line":1022},[929,1163,1164],{},"  \"sila_server\": {\n",[929,1166,1168],{"class":931,"line":1167},4,[929,1169,1170],{},"    \"hostname\": \"0.0.0.0\",\n",[929,1172,1174],{"class":931,"line":1173},5,[929,1175,1176],{},"    \"port\": 50052,\n",[929,1178,1180],{"class":931,"line":1179},6,[929,1181,1182],{},"    \"tls\": true,\n",[929,1184,1186],{"class":931,"line":1185},7,[929,1187,1188],{},"    \"name\": \"Hamilton Microlab STAR\",\n",[929,1190,1192],{"class":931,"line":1191},8,[929,1193,1194],{},"    ...\n",[929,1196,1198],{"class":931,"line":1197},9,[929,1199,1200],{},"  }\n",[929,1202,1204],{"class":931,"line":1203},10,[929,1205,1206],{},"}\n",[794,1208,1209,1210,1213],{},"To connect to the UniteLabs cloud, edit the ",[833,1211,1212],{},"cloud_server_endpoint"," block:",[826,1215,1217],{"className":1145,"code":1216,"language":1147,"meta":835,"style":835},"{\n  \"cloud_server_endpoint\": {\n    \"hostname\": \"\u003Ctenant-id>.unitelabs.io\",\n    \"port\": 443,\n    \"tls\": true\n  }\n}\n",[833,1218,1219,1223,1228,1233,1238,1243,1247],{"__ignoreMap":835},[929,1220,1221],{"class":931,"line":932},[929,1222,1154],{},[929,1224,1225],{"class":931,"line":963},[929,1226,1227],{},"  \"cloud_server_endpoint\": {\n",[929,1229,1230],{"class":931,"line":1022},[929,1231,1232],{},"    \"hostname\": \"\u003Ctenant-id>.unitelabs.io\",\n",[929,1234,1235],{"class":931,"line":1167},[929,1236,1237],{},"    \"port\": 443,\n",[929,1239,1240],{"class":931,"line":1173},[929,1241,1242],{},"    \"tls\": true\n",[929,1244,1245],{"class":931,"line":1179},[929,1246,1200],{},[929,1248,1249],{"class":931,"line":1185},[929,1250,1206],{},[910,1252,1254],{"id":1253},"_4-test-run","4. Test run",[794,1256,1257],{},"Run the connector directly to verify it starts and connects to the instrument:",[826,1259,1261],{"className":923,"code":1260,"language":925,"meta":835,"style":835},".\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\n",[833,1262,1263],{"__ignoreMap":835},[929,1264,1265,1267],{"class":931,"line":932},[929,1266,1112],{"class":935},[929,1268,1269],{"class":956},"\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\n",[794,1271,1272,1273,1276,1277,1279],{},"Check the logs for any connection errors. Press ",[833,1274,1275],{},"Ctrl+C"," to stop. The default logging config writes a log file in the\nspecified folder in the ",[833,1278,1085],{},". For troubleshooting during a headless install, we recommend starting a connector\nin a more verbose mode that prints the logs to the terminal",[826,1281,1283],{"className":923,"code":1282,"language":925,"meta":835,"style":835},".\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion> --start-cmd \"connector start -vvv\"\n",[833,1284,1285],{"__ignoreMap":835},[929,1286,1287,1289,1291,1293,1295,1298],{"class":931,"line":932},[929,1288,1112],{"class":935},[929,1290,1115],{"class":956},[929,1292,1118],{"class":939},[929,1294,1121],{"class":949},[929,1296,1297],{"class":939},"connector start -vvv",[929,1299,1126],{"class":949},[1301,1302,1304],"callout",{"icon":1303},"i-lucide-triangle-alert",[794,1305,1306,1307,1310,1311,1314,1315,1319,1320,1324],{},"The ",[833,1308,1309],{},"-v","\u002F",[833,1312,1313],{},"--verbose"," CLI flag is ",[1316,1317,1318],"strong",{},"deprecated"," and will be removed in future versions. Until then it overrides the root logger config level. For more information on the new logger configuration read the ",[814,1321,1323],{"href":1322},"\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source#logging","logging section"," of the \"from source\" guide.",[818,1326,1328],{"id":1327},"register-as-a-systemd-service","Register as a systemd service",[794,1330,1331],{},"For production use, register the connector as a systemd service so it starts automatically on boot and restarts on failure.",[910,1333,1335],{"id":1334},"create-the-service-file","Create the service file",[794,1337,1338,1339,920],{},"Create ",[833,1340,1341],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-\u003Cdevice_name>.service",[826,1343,1347],{"className":1344,"code":1345,"language":1346,"meta":835,"style":835},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=UniteLabs \u003CDevice Name>\nAfter=network.target\nWants=network-online.target\n\n[Service]\nUser=\u003Cyour-user>\nWorkingDirectory=\u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\nExecStart=\u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target\n","ini",[833,1348,1349,1354,1359,1364,1369,1375,1380,1385,1390,1395,1400,1406,1411,1417],{"__ignoreMap":835},[929,1350,1351],{"class":931,"line":932},[929,1352,1353],{},"[Unit]\n",[929,1355,1356],{"class":931,"line":963},[929,1357,1358],{},"Description=UniteLabs \u003CDevice Name>\n",[929,1360,1361],{"class":931,"line":1022},[929,1362,1363],{},"After=network.target\n",[929,1365,1366],{"class":931,"line":1167},[929,1367,1368],{},"Wants=network-online.target\n",[929,1370,1371],{"class":931,"line":1173},[929,1372,1374],{"emptyLinePlaceholder":1373},true,"\n",[929,1376,1377],{"class":931,"line":1179},[929,1378,1379],{},"[Service]\n",[929,1381,1382],{"class":931,"line":1185},[929,1383,1384],{},"User=\u003Cyour-user>\n",[929,1386,1387],{"class":931,"line":1191},[929,1388,1389],{},"WorkingDirectory=\u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\n",[929,1391,1392],{"class":931,"line":1197},[929,1393,1394],{},"ExecStart=\u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\u002Funitelabs-\u003Cdevice-name>-\u003Cplatform>-\u003Cversion>\n",[929,1396,1397],{"class":931,"line":1203},[929,1398,1399],{},"Restart=on-failure\n",[929,1401,1403],{"class":931,"line":1402},11,[929,1404,1405],{},"RestartSec=10\n",[929,1407,1409],{"class":931,"line":1408},12,[929,1410,1374],{"emptyLinePlaceholder":1373},[929,1412,1414],{"class":931,"line":1413},13,[929,1415,1416],{},"[Install]\n",[929,1418,1420],{"class":931,"line":1419},14,[929,1421,1422],{},"WantedBy=multi-user.target\n",[1301,1424,1426],{"icon":1425},"i-heroicons-information-circle",[794,1427,1428,1429,1432],{},"Name all UniteLabs services with the ",[833,1430,1431],{},"ul-"," prefix — it makes them easy to list and manage together.",[910,1434,1436],{"id":1435},"enable-and-start","Enable and start",[826,1438,1440],{"className":923,"code":1439,"language":925,"meta":835,"style":835},"sudo systemctl daemon-reload\nsudo systemctl enable ul-\u003Cdevice_name>\nsudo systemctl start ul-\u003Cdevice_name>\nsudo systemctl status ul-\u003Cdevice_name>\n",[833,1441,1442,1452,1472,1491],{"__ignoreMap":835},[929,1443,1444,1446,1449],{"class":931,"line":932},[929,1445,936],{"class":935},[929,1447,1448],{"class":939}," systemctl",[929,1450,1451],{"class":939}," daemon-reload\n",[929,1453,1454,1456,1458,1461,1464,1466,1468,1470],{"class":931,"line":963},[929,1455,936],{"class":935},[929,1457,1448],{"class":939},[929,1459,1460],{"class":939}," enable",[929,1462,1463],{"class":939}," ul-",[929,1465,950],{"class":949},[929,1467,953],{"class":939},[929,1469,957],{"class":956},[929,1471,960],{"class":949},[929,1473,1474,1476,1478,1481,1483,1485,1487,1489],{"class":931,"line":1022},[929,1475,936],{"class":935},[929,1477,1448],{"class":939},[929,1479,1480],{"class":939}," start",[929,1482,1463],{"class":939},[929,1484,950],{"class":949},[929,1486,953],{"class":939},[929,1488,957],{"class":956},[929,1490,960],{"class":949},[929,1492,1493,1495,1497,1500,1502,1504,1506,1508],{"class":931,"line":1167},[929,1494,936],{"class":935},[929,1496,1448],{"class":939},[929,1498,1499],{"class":939}," status",[929,1501,1463],{"class":939},[929,1503,950],{"class":949},[929,1505,953],{"class":939},[929,1507,957],{"class":956},[929,1509,960],{"class":949},[910,1511,1513],{"id":1512},"common-service-commands","Common service commands",[826,1515,1517],{"className":923,"code":1516,"language":925,"meta":835,"style":835},"# List all UniteLabs services\nsystemctl list-units | grep ul-\n\n# Check logs\njournalctl -u ul-\u003Cdevice_name> -f\n\n# Restart after a config change\nsudo systemctl restart ul-\u003Cdevice_name>\n",[833,1518,1519,1525,1542,1546,1551,1572,1576,1581],{"__ignoreMap":835},[929,1520,1521],{"class":931,"line":932},[929,1522,1524],{"class":1523},"sHwdD","# List all UniteLabs services\n",[929,1526,1527,1530,1533,1536,1539],{"class":931,"line":963},[929,1528,1529],{"class":935},"systemctl",[929,1531,1532],{"class":939}," list-units",[929,1534,1535],{"class":949}," |",[929,1537,1538],{"class":935}," grep",[929,1540,1541],{"class":939}," ul-\n",[929,1543,1544],{"class":931,"line":1022},[929,1545,1374],{"emptyLinePlaceholder":1373},[929,1547,1548],{"class":931,"line":1167},[929,1549,1550],{"class":1523},"# Check logs\n",[929,1552,1553,1556,1559,1561,1563,1565,1567,1569],{"class":931,"line":1173},[929,1554,1555],{"class":935},"journalctl",[929,1557,1558],{"class":939}," -u",[929,1560,1463],{"class":939},[929,1562,950],{"class":949},[929,1564,953],{"class":939},[929,1566,957],{"class":956},[929,1568,981],{"class":949},[929,1570,1571],{"class":939}," -f\n",[929,1573,1574],{"class":931,"line":1179},[929,1575,1374],{"emptyLinePlaceholder":1373},[929,1577,1578],{"class":931,"line":1185},[929,1579,1580],{"class":1523},"# Restart after a config change\n",[929,1582,1583,1585,1587,1590,1592,1594,1596,1598],{"class":931,"line":1191},[929,1584,936],{"class":935},[929,1586,1448],{"class":939},[929,1588,1589],{"class":939}," restart",[929,1591,1463],{"class":939},[929,1593,950],{"class":949},[929,1595,953],{"class":939},[929,1597,957],{"class":956},[929,1599,960],{"class":949},[910,1601,1603],{"id":1602},"back-up-the-service-file","Back up the service file",[794,1605,1606,1607,1609],{},"Store a copy of the service file alongside the connector binary so the setup can be fully reconstructed from ",[833,1608,919],{}," alone:",[826,1611,1613],{"className":923,"code":1612,"language":925,"meta":835,"style":835},"sudo cp \u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-\u003Cdevice_name>.service \u002Fopt\u002Fconnectors\u002F\u003Cdevice_name>\u002F\n",[833,1614,1615],{"__ignoreMap":835},[929,1616,1617,1619,1621,1624,1626,1628,1630,1632,1635,1637,1639,1641,1643,1645],{"class":931,"line":932},[929,1618,936],{"class":935},[929,1620,968],{"class":939},[929,1622,1623],{"class":939}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-",[929,1625,950],{"class":949},[929,1627,953],{"class":939},[929,1629,957],{"class":956},[929,1631,981],{"class":949},[929,1633,1634],{"class":939},".service",[929,1636,946],{"class":939},[929,1638,950],{"class":949},[929,1640,953],{"class":939},[929,1642,957],{"class":956},[929,1644,981],{"class":949},[929,1646,1019],{"class":939},[818,1648,1650],{"id":1649},"notes","Notes",[798,1652,1653,1660,1667],{},[801,1654,1655,1656,1659],{},"The connector binary unpacks a Python runtime into a ",[833,1657,1658],{},".cache\u002F"," directory on first run. This is expected behavior shared across all connectors.",[801,1661,1662,1663,1666],{},"Each connector must use a ",[1316,1664,1665],{},"unique port"," for its local SiLA 2 server. By convention, assign ports incrementally (50052, 50053, 50054, …) or use a site-specific range.",[801,1668,1669,1670,1672],{},"See ",[814,1671,81],{"href":82}," for firewall rules and other security settings.",[818,1674,1676],{"id":1675},"example-multi-connector-raspberry-pi-setup","Example: multi-connector Raspberry Pi setup",[794,1678,1679,1680,904],{},"For a complete example of multiple connectors running on a single Raspberry Pi, including folder layout, active services, and troubleshooting, see the ",[814,1681,1682],{"href":149},"Raspberry Pi deployment example",[1684,1685,1686],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .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":835,"searchDepth":932,"depth":963,"links":1688},[1689,1690,1696,1702,1703],{"id":820,"depth":963,"text":821},{"id":907,"depth":963,"text":908,"children":1691},[1692,1693,1694,1695],{"id":912,"depth":1022,"text":913},{"id":1074,"depth":1022,"text":1075},{"id":1135,"depth":1022,"text":1136},{"id":1253,"depth":1022,"text":1254},{"id":1327,"depth":963,"text":1328,"children":1697},[1698,1699,1700,1701],{"id":1334,"depth":1022,"text":1335},{"id":1435,"depth":1022,"text":1436},{"id":1512,"depth":1022,"text":1513},{"id":1602,"depth":1022,"text":1603},{"id":1649,"depth":963,"text":1650},{"id":1675,"depth":963,"text":1676},"Run connectors as standalone executables on servers, Raspberry Pi, and other headless Linux devices — no GUI required.","md",null,{},"\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install",{"title":144,"description":1704},"xIOa6y-7R9PXCo1jmd3wTF6O6XzchVX-Da-cxklCYJ8",[1712,1714],{"title":140,"path":141,"stem":142,"description":1713,"children":-1},"Build a connector for an unsupported instrument with the UniteLabs tooling.",{"title":148,"path":149,"stem":150,"description":1715,"children":-1},"Running multiple UniteLabs connectors on a Raspberry Pi — folder structure, systemd services, and common operations.",1787145700831]