[{"data":1,"prerenderedAt":1611},["ShallowReactive",2],{"navigation":3,"\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi":788,"\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi-surround":1606},[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":148,"body":790,"description":1599,"extension":1600,"links":1601,"meta":1602,"navigation":1276,"path":1603,"seo":1604,"stem":150,"__hash__":1605},"docs\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi.md",{"type":791,"value":792,"toc":1580},"minimark",[793,797,804,807,812,820,830,833,863,865,869,943,946,948,952,957,987,991,1010,1014,1054,1058,1077,1079,1083,1087,1181,1185,1232,1236,1243,1331,1335,1406,1410,1447,1449,1453,1551,1553,1557,1576],[794,795,796],"p",{},"This example shows a typical multi-connector deployment on a Raspberry Pi 4 running Raspberry Pi OS (64-bit). All connectors run as systemd services and start automatically on boot.",[794,798,799,800,803],{},"For the step-by-step setup guide, see ",[801,802,144],"a",{"href":145},".",[805,806],"hr",{},[808,809,811],"h2",{"id":810},"folder-structure","Folder structure",[794,813,814,815,819],{},"All connectors live under ",[816,817,818],"code",{},"\u002Fopt\u002Fconnectors\u002F",", one folder per connector:",[821,822,827],"pre",{"className":823,"code":825,"language":826},[824],"language-text","\u002Fopt\u002Fconnectors\u002F\n├── microlab_star\u002F\n│   ├── unitelabs-microlab-star-aarch64-unknown-linux-gnu-\u003Cversion>\n│   ├── config.json\n│   └── ul-microlab-star.service          # backup of the systemd unit\n├── bioshake_q1\u002F\n│   ├── unitelabs-bioshake-q1-aarch64-unknown-linux-gnu-\u003Cversion>\n│   ├── config.json\n│   └── ul-bioshake-q1.service\n└── filesystem\u002F\n    ├── unitelabs-filesystem-aarch64-unknown-linux-gnu-\u003Cversion>\n    ├── config.json\n    └── ul-filesystem.service\n","text",[816,828,825],{"__ignoreMap":829},"",[794,831,832],{},"Each connector folder contains:",[834,835,836,845,853],"ul",{},[837,838,839,840,844],"li",{},"The connector ",[841,842,843],"strong",{},"binary",": self-contained executable with a bundled Python runtime",[837,846,847,852],{},[841,848,849],{},[816,850,851],{},"config.json",": instrument connection settings and cloud relay config",[837,854,855,856,859,860,862],{},"A ",[841,857,858],{},"backup of the systemd unit file",": so the full setup can be reconstructed from ",[816,861,818],{}," alone",[805,864],{},[808,866,868],{"id":867},"example-active-services","Example active services",[870,871,872,887],"table",{},[873,874,875],"thead",{},[876,877,878,882,884],"tr",{},[879,880,881],"th",{},"Service name",[879,883,103],{},[879,885,886],{},"Port",[888,889,890,904,917,930],"tbody",{},[876,891,892,898,901],{},[893,894,895],"td",{},[816,896,897],{},"ul-microlab-star",[893,899,900],{},"Hamilton Microlab STAR",[893,902,903],{},"50052",[876,905,906,911,914],{},[893,907,908],{},[816,909,910],{},"ul-bioshake-q1",[893,912,913],{},"Bioshake Q1",[893,915,916],{},"50053",[876,918,919,924,927],{},[893,920,921],{},[816,922,923],{},"ul-filesystem",[893,925,926],{},"File System",[893,928,929],{},"50054",[876,931,932,937,940],{},[893,933,934],{},[816,935,936],{},"ul-tapo-camera-01",[893,938,939],{},"Tapo Camera",[893,941,942],{},"50055",[794,944,945],{},"Each service uses a unique port for its local SiLA 2 server. Assign ports incrementally to avoid conflicts.",[805,947],{},[808,949,951],{"id":950},"common-operations","Common operations",[953,954,956],"h3",{"id":955},"list-all-unitelabs-services","List all UniteLabs services",[821,958,962],{"className":959,"code":960,"language":961,"meta":829,"style":829},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","systemctl list-units | grep ul-\n","bash",[816,963,964],{"__ignoreMap":829},[965,966,969,973,977,981,984],"span",{"class":967,"line":968},"line",1,[965,970,972],{"class":971},"sBMFI","systemctl",[965,974,976],{"class":975},"sfazB"," list-units",[965,978,980],{"class":979},"sMK4o"," |",[965,982,983],{"class":971}," grep",[965,985,986],{"class":975}," ul-\n",[953,988,990],{"id":989},"check-the-status-of-a-service","Check the status of a service",[821,992,994],{"className":959,"code":993,"language":961,"meta":829,"style":829},"sudo systemctl status ul-microlab-star\n",[816,995,996],{"__ignoreMap":829},[965,997,998,1001,1004,1007],{"class":967,"line":968},[965,999,1000],{"class":971},"sudo",[965,1002,1003],{"class":975}," systemctl",[965,1005,1006],{"class":975}," status",[965,1008,1009],{"class":975}," ul-microlab-star\n",[953,1011,1013],{"id":1012},"start-stop-restart","Start \u002F stop \u002F restart",[821,1015,1017],{"className":959,"code":1016,"language":961,"meta":829,"style":829},"sudo systemctl start ul-microlab-star\nsudo systemctl stop ul-microlab-star\nsudo systemctl restart ul-microlab-star\n",[816,1018,1019,1030,1042],{"__ignoreMap":829},[965,1020,1021,1023,1025,1028],{"class":967,"line":968},[965,1022,1000],{"class":971},[965,1024,1003],{"class":975},[965,1026,1027],{"class":975}," start",[965,1029,1009],{"class":975},[965,1031,1033,1035,1037,1040],{"class":967,"line":1032},2,[965,1034,1000],{"class":971},[965,1036,1003],{"class":975},[965,1038,1039],{"class":975}," stop",[965,1041,1009],{"class":975},[965,1043,1045,1047,1049,1052],{"class":967,"line":1044},3,[965,1046,1000],{"class":971},[965,1048,1003],{"class":975},[965,1050,1051],{"class":975}," restart",[965,1053,1009],{"class":975},[953,1055,1057],{"id":1056},"view-live-logs","View live logs",[821,1059,1061],{"className":959,"code":1060,"language":961,"meta":829,"style":829},"journalctl -u ul-microlab-star -f\n",[816,1062,1063],{"__ignoreMap":829},[965,1064,1065,1068,1071,1074],{"class":967,"line":968},[965,1066,1067],{"class":971},"journalctl",[965,1069,1070],{"class":975}," -u",[965,1072,1073],{"class":975}," ul-microlab-star",[965,1075,1076],{"class":975}," -f\n",[805,1078],{},[808,1080,1082],{"id":1081},"adding-a-new-connector","Adding a new connector",[953,1084,1086],{"id":1085},"_1-create-the-folder-and-place-the-binary","1. Create the folder and place the binary",[821,1088,1090],{"className":959,"code":1089,"language":961,"meta":829,"style":829},"sudo mkdir -p \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\nsudo cp \u003Cbinary> \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\u002F\nsudo chmod +x \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\u002F\u003Cbinary>\n",[816,1091,1092,1118,1150],{"__ignoreMap":829},[965,1093,1094,1096,1099,1102,1105,1108,1111,1115],{"class":967,"line":968},[965,1095,1000],{"class":971},[965,1097,1098],{"class":975}," mkdir",[965,1100,1101],{"class":975}," -p",[965,1103,1104],{"class":975}," \u002Fopt\u002Fconnectors\u002F",[965,1106,1107],{"class":979},"\u003C",[965,1109,1110],{"class":975},"connector_nam",[965,1112,1114],{"class":1113},"sTEyZ","e",[965,1116,1117],{"class":979},">\n",[965,1119,1120,1122,1125,1128,1131,1134,1137,1139,1141,1143,1145,1147],{"class":967,"line":1032},[965,1121,1000],{"class":971},[965,1123,1124],{"class":975}," cp",[965,1126,1127],{"class":979}," \u003C",[965,1129,1130],{"class":975},"binar",[965,1132,1133],{"class":1113},"y",[965,1135,1136],{"class":979},">",[965,1138,1104],{"class":975},[965,1140,1107],{"class":979},[965,1142,1110],{"class":975},[965,1144,1114],{"class":1113},[965,1146,1136],{"class":979},[965,1148,1149],{"class":975},"\u002F\n",[965,1151,1152,1154,1157,1160,1162,1164,1166,1168,1170,1173,1175,1177,1179],{"class":967,"line":1044},[965,1153,1000],{"class":971},[965,1155,1156],{"class":975}," chmod",[965,1158,1159],{"class":975}," +x",[965,1161,1104],{"class":975},[965,1163,1107],{"class":979},[965,1165,1110],{"class":975},[965,1167,1114],{"class":1113},[965,1169,1136],{"class":979},[965,1171,1172],{"class":975},"\u002F",[965,1174,1107],{"class":979},[965,1176,1130],{"class":975},[965,1178,1133],{"class":1113},[965,1180,1117],{"class":979},[953,1182,1184],{"id":1183},"_2-generate-and-edit-the-config","2. Generate and edit the config",[821,1186,1188],{"className":959,"code":1187,"language":961,"meta":829,"style":829},"cd \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\n.\u002F\u003Cbinary> --start-cmd \"config create\"\n# edit config.json with instrument settings and the next available port\n",[816,1189,1190,1206,1226],{"__ignoreMap":829},[965,1191,1192,1196,1198,1200,1202,1204],{"class":967,"line":968},[965,1193,1195],{"class":1194},"s2Zo4","cd",[965,1197,1104],{"class":975},[965,1199,1107],{"class":979},[965,1201,1110],{"class":975},[965,1203,1114],{"class":1113},[965,1205,1117],{"class":979},[965,1207,1208,1211,1214,1217,1220,1223],{"class":967,"line":1032},[965,1209,1210],{"class":971},".\u002F",[965,1212,1213],{"class":1113},"\u003Cbinary> ",[965,1215,1216],{"class":975},"--start-cmd",[965,1218,1219],{"class":979}," \"",[965,1221,1222],{"class":975},"config create",[965,1224,1225],{"class":979},"\"\n",[965,1227,1228],{"class":967,"line":1044},[965,1229,1231],{"class":1230},"sHwdD","# edit config.json with instrument settings and the next available port\n",[953,1233,1235],{"id":1234},"_3-create-the-systemd-service-file","3. Create the systemd service file",[794,1237,1238,1239,1242],{},"Create ",[816,1240,1241],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-\u003Cname>.service",":",[821,1244,1248],{"className":1245,"code":1246,"language":1247,"meta":829,"style":829},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=UniteLabs \u003CConnector Name>\nAfter=network.target\nWants=network-online.target\n\n[Service]\nUser=\u003Cyour-user>\nWorkingDirectory=\u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\nExecStart=\u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\u002F\u003Cbinary>\nRestart=on-failure\nRestartSec=10\n\n[Install]\nWantedBy=multi-user.target\n","ini",[816,1249,1250,1255,1260,1265,1271,1278,1284,1290,1296,1302,1308,1314,1319,1325],{"__ignoreMap":829},[965,1251,1252],{"class":967,"line":968},[965,1253,1254],{},"[Unit]\n",[965,1256,1257],{"class":967,"line":1032},[965,1258,1259],{},"Description=UniteLabs \u003CConnector Name>\n",[965,1261,1262],{"class":967,"line":1044},[965,1263,1264],{},"After=network.target\n",[965,1266,1268],{"class":967,"line":1267},4,[965,1269,1270],{},"Wants=network-online.target\n",[965,1272,1274],{"class":967,"line":1273},5,[965,1275,1277],{"emptyLinePlaceholder":1276},true,"\n",[965,1279,1281],{"class":967,"line":1280},6,[965,1282,1283],{},"[Service]\n",[965,1285,1287],{"class":967,"line":1286},7,[965,1288,1289],{},"User=\u003Cyour-user>\n",[965,1291,1293],{"class":967,"line":1292},8,[965,1294,1295],{},"WorkingDirectory=\u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\n",[965,1297,1299],{"class":967,"line":1298},9,[965,1300,1301],{},"ExecStart=\u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\u002F\u003Cbinary>\n",[965,1303,1305],{"class":967,"line":1304},10,[965,1306,1307],{},"Restart=on-failure\n",[965,1309,1311],{"class":967,"line":1310},11,[965,1312,1313],{},"RestartSec=10\n",[965,1315,1317],{"class":967,"line":1316},12,[965,1318,1277],{"emptyLinePlaceholder":1276},[965,1320,1322],{"class":967,"line":1321},13,[965,1323,1324],{},"[Install]\n",[965,1326,1328],{"class":967,"line":1327},14,[965,1329,1330],{},"WantedBy=multi-user.target\n",[953,1332,1334],{"id":1333},"_4-enable-and-start","4. Enable and start",[821,1336,1338],{"className":959,"code":1337,"language":961,"meta":829,"style":829},"sudo systemctl daemon-reload\nsudo systemctl enable ul-\u003Cname>\nsudo systemctl start ul-\u003Cname>\nsudo systemctl status ul-\u003Cname>\n",[816,1339,1340,1349,1370,1388],{"__ignoreMap":829},[965,1341,1342,1344,1346],{"class":967,"line":968},[965,1343,1000],{"class":971},[965,1345,1003],{"class":975},[965,1347,1348],{"class":975}," daemon-reload\n",[965,1350,1351,1353,1355,1358,1361,1363,1366,1368],{"class":967,"line":1032},[965,1352,1000],{"class":971},[965,1354,1003],{"class":975},[965,1356,1357],{"class":975}," enable",[965,1359,1360],{"class":975}," ul-",[965,1362,1107],{"class":979},[965,1364,1365],{"class":975},"nam",[965,1367,1114],{"class":1113},[965,1369,1117],{"class":979},[965,1371,1372,1374,1376,1378,1380,1382,1384,1386],{"class":967,"line":1044},[965,1373,1000],{"class":971},[965,1375,1003],{"class":975},[965,1377,1027],{"class":975},[965,1379,1360],{"class":975},[965,1381,1107],{"class":979},[965,1383,1365],{"class":975},[965,1385,1114],{"class":1113},[965,1387,1117],{"class":979},[965,1389,1390,1392,1394,1396,1398,1400,1402,1404],{"class":967,"line":1267},[965,1391,1000],{"class":971},[965,1393,1003],{"class":975},[965,1395,1006],{"class":975},[965,1397,1360],{"class":975},[965,1399,1107],{"class":979},[965,1401,1365],{"class":975},[965,1403,1114],{"class":1113},[965,1405,1117],{"class":979},[953,1407,1409],{"id":1408},"_5-back-up-the-service-file","5. Back up the service file",[821,1411,1413],{"className":959,"code":1412,"language":961,"meta":829,"style":829},"sudo cp \u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-\u003Cname>.service \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\u002F\n",[816,1414,1415],{"__ignoreMap":829},[965,1416,1417,1419,1421,1424,1426,1428,1430,1432,1435,1437,1439,1441,1443,1445],{"class":967,"line":968},[965,1418,1000],{"class":971},[965,1420,1124],{"class":975},[965,1422,1423],{"class":975}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-",[965,1425,1107],{"class":979},[965,1427,1365],{"class":975},[965,1429,1114],{"class":1113},[965,1431,1136],{"class":979},[965,1433,1434],{"class":975},".service",[965,1436,1104],{"class":975},[965,1438,1107],{"class":979},[965,1440,1110],{"class":975},[965,1442,1114],{"class":1113},[965,1444,1136],{"class":979},[965,1446,1149],{"class":975},[805,1448],{},[808,1450,1452],{"id":1451},"removing-a-connector","Removing a connector",[821,1454,1456],{"className":959,"code":1455,"language":961,"meta":829,"style":829},"sudo systemctl stop ul-\u003Cname>\nsudo systemctl disable ul-\u003Cname>\nsudo rm \u002Fetc\u002Fsystemd\u002Fsystem\u002Ful-\u003Cname>.service\nsudo systemctl daemon-reload\nsudo systemctl reset-failed\nsudo rm -rf \u002Fopt\u002Fconnectors\u002F\u003Cconnector_name>\n",[816,1457,1458,1476,1495,1515,1523,1532],{"__ignoreMap":829},[965,1459,1460,1462,1464,1466,1468,1470,1472,1474],{"class":967,"line":968},[965,1461,1000],{"class":971},[965,1463,1003],{"class":975},[965,1465,1039],{"class":975},[965,1467,1360],{"class":975},[965,1469,1107],{"class":979},[965,1471,1365],{"class":975},[965,1473,1114],{"class":1113},[965,1475,1117],{"class":979},[965,1477,1478,1480,1482,1485,1487,1489,1491,1493],{"class":967,"line":1032},[965,1479,1000],{"class":971},[965,1481,1003],{"class":975},[965,1483,1484],{"class":975}," disable",[965,1486,1360],{"class":975},[965,1488,1107],{"class":979},[965,1490,1365],{"class":975},[965,1492,1114],{"class":1113},[965,1494,1117],{"class":979},[965,1496,1497,1499,1502,1504,1506,1508,1510,1512],{"class":967,"line":1044},[965,1498,1000],{"class":971},[965,1500,1501],{"class":975}," rm",[965,1503,1423],{"class":975},[965,1505,1107],{"class":979},[965,1507,1365],{"class":975},[965,1509,1114],{"class":1113},[965,1511,1136],{"class":979},[965,1513,1514],{"class":975},".service\n",[965,1516,1517,1519,1521],{"class":967,"line":1267},[965,1518,1000],{"class":971},[965,1520,1003],{"class":975},[965,1522,1348],{"class":975},[965,1524,1525,1527,1529],{"class":967,"line":1273},[965,1526,1000],{"class":971},[965,1528,1003],{"class":975},[965,1530,1531],{"class":975}," reset-failed\n",[965,1533,1534,1536,1538,1541,1543,1545,1547,1549],{"class":967,"line":1280},[965,1535,1000],{"class":971},[965,1537,1501],{"class":975},[965,1539,1540],{"class":975}," -rf",[965,1542,1104],{"class":975},[965,1544,1107],{"class":979},[965,1546,1110],{"class":975},[965,1548,1114],{"class":1113},[965,1550,1117],{"class":979},[805,1552],{},[808,1554,1556],{"id":1555},"notes","Notes",[834,1558,1559,1566,1573],{},[837,1560,1561,1562,1565],{},"The connector binary unpacks a Python runtime into ",[816,1563,1564],{},"\u002Fopt\u002Fconnectors\u002F.cache\u002F"," on first run. This is expected and shared across all connectors on the machine.",[837,1567,1568,1569,1572],{},"Service names use the ",[816,1570,1571],{},"ul-"," prefix so they group together when listing services.",[837,1574,1575],{},"Camera connectors may log raw binary data (encoded video stream): this is normal.",[1577,1578,1579],"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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":829,"searchDepth":968,"depth":1032,"links":1581},[1582,1583,1584,1590,1597,1598],{"id":810,"depth":1032,"text":811},{"id":867,"depth":1032,"text":868},{"id":950,"depth":1032,"text":951,"children":1585},[1586,1587,1588,1589],{"id":955,"depth":1044,"text":956},{"id":989,"depth":1044,"text":990},{"id":1012,"depth":1044,"text":1013},{"id":1056,"depth":1044,"text":1057},{"id":1081,"depth":1032,"text":1082,"children":1591},[1592,1593,1594,1595,1596],{"id":1085,"depth":1044,"text":1086},{"id":1183,"depth":1044,"text":1184},{"id":1234,"depth":1044,"text":1235},{"id":1333,"depth":1044,"text":1334},{"id":1408,"depth":1044,"text":1409},{"id":1451,"depth":1032,"text":1452},{"id":1555,"depth":1032,"text":1556},"Running multiple UniteLabs connectors on a Raspberry Pi — folder structure, systemd services, and common operations.","md",null,{},"\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi",{"title":148,"description":1599},"yQhokn9r2bn2nGvtzfYimapmdqYCt7YVpJLYwUio1lM",[1607,1609],{"title":144,"path":145,"stem":146,"description":1608,"children":-1},"Run connectors as standalone executables on servers, Raspberry Pi, and other headless Linux devices — no GUI required.",{"title":57,"path":157,"stem":158,"description":1610,"children":-1},"Read values, trigger actions, and follow device activity from GroundControl.",1787145703461]