[{"data":1,"prerenderedAt":2000},["ShallowReactive",2],{"navigation":3,"\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source":775,"\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source-surround":1995},[4,80,155,385,449,551,588,667],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118,139],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Connect a device","\u002Fintegrate\u002Fconnect-a-device","02.integrate\u002F20.connect-a-device",[123,127,131,135],{"title":124,"path":125,"stem":126},"Via GroundControl","\u002Fintegrate\u002Fconnect-a-device\u002Fvia-groundcontrol","02.integrate\u002F20.connect-a-device\u002F10.via-groundcontrol",{"title":128,"path":129,"stem":130},"With an executable","\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable","02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":132,"path":133,"stem":134},"From source","\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source","02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":136,"path":137,"stem":138},"Build your own","\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself","02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":140,"path":141,"stem":142,"children":143,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[144,147,151],{"title":53,"path":145,"stem":146},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":148,"path":149,"stem":150},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":152,"path":153,"stem":154},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":156,"path":157,"stem":158,"children":159,"page":42},"Operate","\u002Foperate","03.operate",[160,163,167,207,280],{"title":156,"path":161,"stem":162},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":164,"path":165,"stem":166},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":168,"stem":169,"children":170,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[171,175,179,183,187,191,195,199,203],{"title":172,"path":173,"stem":174},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":176,"path":177,"stem":178},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":180,"path":181,"stem":182},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":184,"path":185,"stem":186},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":188,"path":189,"stem":190},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":192,"path":193,"stem":194},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":196,"path":197,"stem":198},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":200,"path":201,"stem":202},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":204,"path":205,"stem":206},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":208,"path":209,"stem":210,"children":211,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[212,241,253,277],{"title":184,"path":213,"stem":214,"children":215},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[216,217,221,225,229,233,237],{"title":184,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":222,"path":223,"stem":224},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":226,"path":227,"stem":228},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":230,"path":231,"stem":232},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":234,"path":235,"stem":236},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":238,"path":239,"stem":240},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":180,"path":242,"stem":243,"children":244,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[245,249],{"title":246,"path":247,"stem":248},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":250,"path":251,"stem":252},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":254,"path":255,"stem":256,"children":257,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[258,262,266,270,273],{"title":259,"path":260,"stem":261},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":263,"path":264,"stem":265},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":267,"path":268,"stem":269},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":192,"path":271,"stem":272},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":274,"path":275,"stem":276},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":200,"path":278,"stem":279},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":281,"path":282,"stem":283,"children":284,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[285,326,351,368],{"title":286,"path":287,"stem":288,"children":289,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[290,294,298,302,306,310,314,318,322],{"title":291,"path":292,"stem":293},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":295,"path":296,"stem":297},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":299,"path":300,"stem":301},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":303,"path":304,"stem":305},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":307,"path":308,"stem":309},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":311,"path":312,"stem":313},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":315,"path":316,"stem":317},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":319,"path":320,"stem":321},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":323,"path":324,"stem":325},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":327,"path":328,"stem":329,"children":330,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[331,335,339,343,347],{"title":332,"path":333,"stem":334},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":336,"path":337,"stem":338},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":340,"path":341,"stem":342},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":344,"path":345,"stem":346},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":348,"path":349,"stem":350},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":352,"path":353,"stem":354,"children":355,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[356,359,362,365],{"title":267,"path":357,"stem":358},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":259,"path":360,"stem":361},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":192,"path":363,"stem":364},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":295,"path":366,"stem":367},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":369,"path":370,"stem":371,"children":372,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[373,377,381],{"title":374,"path":375,"stem":376},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":378,"path":379,"stem":380},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":382,"path":383,"stem":384},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[390,393,406,423,436],{"title":386,"path":391,"stem":392},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":394,"path":395,"stem":396,"children":397,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[398,402],{"title":399,"path":400,"stem":401},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":403,"path":404,"stem":405},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":407,"path":408,"stem":409,"children":410,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[411,415,419],{"title":412,"path":413,"stem":414},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":416,"path":417,"stem":418},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":420,"path":421,"stem":422},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":424,"path":425,"stem":426,"children":427,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[428,432],{"title":429,"path":430,"stem":431},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":433,"path":434,"stem":435},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":437,"path":438,"stem":439,"children":440,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[441,445],{"title":442,"path":443,"stem":444},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":446,"path":447,"stem":448},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":450,"path":451,"stem":452,"children":453,"page":42},"Automate","\u002Fautomate","07.automate",[454,458,462,466,515],{"title":455,"path":456,"stem":457},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":459,"path":460,"stem":461},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":463,"path":464,"stem":465},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":467,"path":477,"stem":478,"children":479,"page":42},[468,469,470,471,472,473,474,475,476],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[480,484,488,492,496,500,504,508,512],{"title":481,"path":482,"stem":483},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":485,"path":486,"stem":487},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":489,"path":490,"stem":491},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":493,"path":494,"stem":495},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":497,"path":498,"stem":499},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":501,"path":502,"stem":503},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":505,"path":506,"stem":507},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":509,"path":510,"stem":511},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":204,"path":513,"stem":514},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":208,"path":516,"stem":517,"children":518,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[519,523,527,531,535,539,543,547],{"title":520,"path":521,"stem":522},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":524,"path":525,"stem":526},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":528,"path":529,"stem":530},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":532,"path":533,"stem":534},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":536,"path":537,"stem":538},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":540,"path":541,"stem":542},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":544,"path":545,"stem":546},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":548,"path":549,"stem":550},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":552,"path":553,"stem":554,"children":555,"page":42},"Observe","\u002Fobserve","08.observe",[556,560,576],{"title":557,"path":558,"stem":559},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":561,"stem":562,"children":563,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[564,568,572],{"title":565,"path":566,"stem":567},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":569,"path":570,"stem":571},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":573,"path":574,"stem":575},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":208,"path":577,"stem":578,"children":579,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[580,584],{"title":581,"path":582,"stem":583},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":585,"path":586,"stem":587},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":589,"path":590,"stem":591,"children":592,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[593,597,601,613,624,635,645,656],{"title":594,"path":595,"stem":596},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":598,"path":599,"stem":600},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":602,"stem":603,"children":604,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[605,609],{"title":606,"path":607,"stem":608},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":610,"path":611,"stem":612},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":614,"path":615,"stem":616,"children":617,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[618,621],{"title":606,"path":619,"stem":620},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":610,"path":622,"stem":623},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":625,"path":626,"stem":627,"children":628,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[629,632],{"title":606,"path":630,"stem":631},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":610,"path":633,"stem":634},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":184,"path":636,"stem":637,"children":638,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[639,642],{"title":606,"path":640,"stem":641},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":610,"path":643,"stem":644},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":646,"path":647,"stem":648,"children":649,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[650,653],{"title":606,"path":651,"stem":652},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":610,"path":654,"stem":655},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":657,"path":658,"stem":659,"children":660,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[661,664],{"title":606,"path":662,"stem":663},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":610,"path":665,"stem":666},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":668,"path":669,"stem":670,"children":671},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[672,674,693,726,734,769],{"title":668,"path":669,"stem":673},"20.connector-development\u002Findex",{"title":675,"path":676,"stem":677,"children":678,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[679,682,686,689],{"title":557,"path":680,"stem":681},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":683,"path":684,"stem":685},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":687,"stem":688},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":690,"path":691,"stem":692},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":694,"path":695,"stem":696,"children":697,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[698,702,706,710,714,718,722],{"title":699,"path":700,"stem":701},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":703,"path":704,"stem":705},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":707,"path":708,"stem":709},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":711,"path":712,"stem":713},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":715,"path":716,"stem":717},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":719,"path":720,"stem":721},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":723,"path":724,"stem":725},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":727,"stem":728,"children":729,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[730],{"title":731,"path":732,"stem":733},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":208,"path":735,"stem":736,"children":737,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[738,742,746,750,754,758,761,765],{"title":739,"path":740,"stem":741},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":743,"path":744,"stem":745},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging","20.connector-development\u002F40.guides\u002F21.logging",{"title":747,"path":748,"stem":749},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":751,"path":752,"stem":753},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":755,"path":756,"stem":757},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":204,"path":759,"stem":760},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":762,"path":763,"stem":764},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":766,"path":767,"stem":768},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":770,"path":771,"stem":772,"children":773},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[774],{"title":770,"path":771,"stem":772},{"id":776,"title":132,"body":777,"description":1988,"extension":1989,"links":1990,"meta":1991,"navigation":1992,"path":133,"seo":1993,"stem":134,"__hash__":1994},"docs\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source.md",{"type":778,"value":779,"toc":1979},"minimark",[780,809,820,825,840,914,934,954,1028,1032,1039,1100,1117,1189,1226,1232,1280,1286,1339,1341,1351,1413,1436,1444,1484,1489,1506,1522,1595,1601,1799,1803,1818,1893,1896,1931,1940,1944,1947,1975],[781,782,783,784,796,797,800,801,804,805,808],"p",{},"If you have a connector's Python project, cloned from source or scaffolded with the ",[785,786,791],"a",{"href":787,"rel":788,"target":790},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fconnector-factory",[789],"nofollow","_blank",[792,793,795],"code",{"style":794},"color: green;","connector-factory",", you can configure and run it directly with ",[792,798,799],{},"uv",", ",[792,802,803],{},"hatch",", or ",[792,806,807],{},"poetry",". This is the typical workflow during connector development and for advanced deployments where you run the connector from its project rather than as a packaged executable.",[810,811,813],"callout",{"icon":812},"i-heroicons-light-bulb",[781,814,815,816,819],{},"Want to build your own connector? See ",[785,817,136],{"href":818},"\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F",".",[821,822,824],"h2",{"id":823},"create-a-configuration-file","Create a configuration file",[781,826,827,828,831,832,835,836,839],{},"A connector is configured through a ",[792,829,830],{},"config.json"," (or ",[792,833,834],{},"config.yaml",") file. Generate one with the ",[792,837,838],{},"config create"," command:",[841,842,843,876,895],"code-group",{},[844,845,850],"pre",{"className":846,"code":847,"filename":799,"language":848,"meta":849,"style":849},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","uv run config create --app unitelabs.connector_starter:create_app\n","bash","",[792,851,852],{"__ignoreMap":849},[853,854,857,860,864,867,870,873],"span",{"class":855,"line":856},"line",1,[853,858,799],{"class":859},"sBMFI",[853,861,863],{"class":862},"sfazB"," run",[853,865,866],{"class":862}," config",[853,868,869],{"class":862}," create",[853,871,872],{"class":862}," --app",[853,874,875],{"class":862}," unitelabs.connector_starter:create_app\n",[844,877,879],{"className":846,"code":878,"filename":803,"language":848,"meta":849,"style":849},"hatch run config create --app unitelabs.connector_starter:create_app\n",[792,880,881],{"__ignoreMap":849},[853,882,883,885,887,889,891,893],{"class":855,"line":856},[853,884,803],{"class":859},[853,886,863],{"class":862},[853,888,866],{"class":862},[853,890,869],{"class":862},[853,892,872],{"class":862},[853,894,875],{"class":862},[844,896,898],{"className":846,"code":897,"filename":807,"language":848,"meta":849,"style":849},"poetry run config create --app unitelabs.connector_starter:create_app\n",[792,899,900],{"__ignoreMap":849},[853,901,902,904,906,908,910,912],{"class":855,"line":856},[853,903,807],{"class":859},[853,905,863],{"class":862},[853,907,866],{"class":862},[853,909,869],{"class":862},[853,911,872],{"class":862},[853,913,875],{"class":862},[810,915,916],{"icon":812},[781,917,918,919,922,923,926,927,930,931,933],{},"The ",[792,920,921],{},"--app"," option is required for Windows. On MacOS and Linux, commands like ",[792,924,925],{},"connector start"," and ",[792,928,929],{},"config"," will generally work without providing this option. On these operating systems, needing to provide ",[792,932,921],{}," often points to an error in the connector package.",[781,935,918,936,939,940,942,943,926,946,949,950,953],{},[792,937,938],{},"create"," command by default will create a file called ",[792,941,830],{}," in the current working directory. We support ",[792,944,945],{},"yaml",[792,947,948],{},"json"," file-types and allow users to specify their own path and file type by adding the ",[792,951,952],{},"--path"," argument:",[841,955,956,982,1005],{},[844,957,959],{"className":846,"code":958,"filename":799,"language":848,"meta":849,"style":849},"uv run config create --app unitelabs.connector_starter:create_app --path \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,960,961],{"__ignoreMap":849},[853,962,963,965,967,969,971,973,976,979],{"class":855,"line":856},[853,964,799],{"class":859},[853,966,863],{"class":862},[853,968,866],{"class":862},[853,970,869],{"class":862},[853,972,872],{"class":862},[853,974,975],{"class":862}," unitelabs.connector_starter:create_app",[853,977,978],{"class":862}," --path",[853,980,981],{"class":862}," \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[844,983,985],{"className":846,"code":984,"filename":803,"language":848,"meta":849,"style":849},"hatch run config create --app unitelabs.connector_starter:create_app --path \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,986,987],{"__ignoreMap":849},[853,988,989,991,993,995,997,999,1001,1003],{"class":855,"line":856},[853,990,803],{"class":859},[853,992,863],{"class":862},[853,994,866],{"class":862},[853,996,869],{"class":862},[853,998,872],{"class":862},[853,1000,975],{"class":862},[853,1002,978],{"class":862},[853,1004,981],{"class":862},[844,1006,1008],{"className":846,"code":1007,"filename":807,"language":848,"meta":849,"style":849},"poetry run config create --app unitelabs.connector_starter:create_app --path \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,1009,1010],{"__ignoreMap":849},[853,1011,1012,1014,1016,1018,1020,1022,1024,1026],{"class":855,"line":856},[853,1013,807],{"class":859},[853,1015,863],{"class":862},[853,1017,866],{"class":862},[853,1019,869],{"class":862},[853,1021,872],{"class":862},[853,1023,975],{"class":862},[853,1025,978],{"class":862},[853,1027,981],{"class":862},[821,1029,1031],{"id":1030},"run-the-connector","Run the connector",[781,1033,1034,1035,1038],{},"Starting the connector named ",[792,1036,1037],{},"connector-starter"," with a configuration file at the default path is as simple as:",[841,1040,1041,1062,1081],{},[844,1042,1044],{"className":846,"code":1043,"filename":799,"language":848,"meta":849,"style":849},"uv run connector start --app unitelabs.connector_starter:create_app\n",[792,1045,1046],{"__ignoreMap":849},[853,1047,1048,1050,1052,1055,1058,1060],{"class":855,"line":856},[853,1049,799],{"class":859},[853,1051,863],{"class":862},[853,1053,1054],{"class":862}," connector",[853,1056,1057],{"class":862}," start",[853,1059,872],{"class":862},[853,1061,875],{"class":862},[844,1063,1065],{"className":846,"code":1064,"filename":803,"language":848,"meta":849,"style":849},"hatch run connector start --app unitelabs.connector_starter:create_app\n",[792,1066,1067],{"__ignoreMap":849},[853,1068,1069,1071,1073,1075,1077,1079],{"class":855,"line":856},[853,1070,803],{"class":859},[853,1072,863],{"class":862},[853,1074,1054],{"class":862},[853,1076,1057],{"class":862},[853,1078,872],{"class":862},[853,1080,875],{"class":862},[844,1082,1084],{"className":846,"code":1083,"filename":807,"language":848,"meta":849,"style":849},"poetry run connector start --app unitelabs.connector_starter:create_app\n",[792,1085,1086],{"__ignoreMap":849},[853,1087,1088,1090,1092,1094,1096,1098],{"class":855,"line":856},[853,1089,807],{"class":859},[853,1091,863],{"class":862},[853,1093,1054],{"class":862},[853,1095,1057],{"class":862},[853,1097,872],{"class":862},[853,1099,875],{"class":862},[781,1101,1102,1103,926,1105,1108,1109,1112,1113,1116],{},"Both ",[792,1104,925],{},[792,1106,1107],{},"certificate generate"," CLIs have a ",[792,1110,1111],{},"--config-path"," or ",[792,1114,1115],{},"-cfg"," argument that allows one to pass in a path to their configuration file, enabling users to create and apply multiple configurations for their connectors.",[841,1118,1119,1143,1166],{},[844,1120,1122],{"className":846,"code":1121,"filename":799,"language":848,"meta":849,"style":849},"uv run connector start --app unitelabs.connector_starter:create_app -cfg \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,1123,1124],{"__ignoreMap":849},[853,1125,1126,1128,1130,1132,1134,1136,1138,1141],{"class":855,"line":856},[853,1127,799],{"class":859},[853,1129,863],{"class":862},[853,1131,1054],{"class":862},[853,1133,1057],{"class":862},[853,1135,872],{"class":862},[853,1137,975],{"class":862},[853,1139,1140],{"class":862}," -cfg",[853,1142,981],{"class":862},[844,1144,1146],{"className":846,"code":1145,"filename":803,"language":848,"meta":849,"style":849},"hatch run connector start --app unitelabs.connector_starter:create_app -cfg \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,1147,1148],{"__ignoreMap":849},[853,1149,1150,1152,1154,1156,1158,1160,1162,1164],{"class":855,"line":856},[853,1151,803],{"class":859},[853,1153,863],{"class":862},[853,1155,1054],{"class":862},[853,1157,1057],{"class":862},[853,1159,872],{"class":862},[853,1161,975],{"class":862},[853,1163,1140],{"class":862},[853,1165,981],{"class":862},[844,1167,1169],{"className":846,"code":1168,"filename":807,"language":848,"meta":849,"style":849},"poetry run connector start --app unitelabs.connector_starter:create_app -cfg \u002Fpath\u002Fto\u002Fconfig.prod.json\n",[792,1170,1171],{"__ignoreMap":849},[853,1172,1173,1175,1177,1179,1181,1183,1185,1187],{"class":855,"line":856},[853,1174,807],{"class":859},[853,1176,863],{"class":862},[853,1178,1054],{"class":862},[853,1180,1057],{"class":862},[853,1182,872],{"class":862},[853,1184,975],{"class":862},[853,1186,1140],{"class":862},[853,1188,981],{"class":862},[810,1190,1193],{"icon":1191,"color":1192},"i-heroicons-exclamation-triangle","amber",[781,1194,1195,1199,1200,1203,1204,1207,1208,926,1211,1214,1215,1218,1219,1225],{},[1196,1197,1198],"strong",{},"Deprecated:"," The ",[792,1201,1202],{},"-v","\u002F",[792,1205,1206],{},"--verbose"," CLI flag on ",[792,1209,1210],{},"start",[792,1212,1213],{},"dev"," is ",[1196,1216,1217],{},"deprecated"," and will be removed in future versions. Until then it overrides the root config level. Configure the log level through the ",[785,1220,1222],{"href":1221},"#logging",[792,1223,1224],{},"logging"," section instead.",[781,1227,1228,1229,1231],{},"For more information about the ",[792,1230,929],{}," CLI, check out the help documentation:",[841,1233,1234,1250,1265],{},[844,1235,1237],{"className":846,"code":1236,"filename":799,"language":848,"meta":849,"style":849},"uv run config --help\n",[792,1238,1239],{"__ignoreMap":849},[853,1240,1241,1243,1245,1247],{"class":855,"line":856},[853,1242,799],{"class":859},[853,1244,863],{"class":862},[853,1246,866],{"class":862},[853,1248,1249],{"class":862}," --help\n",[844,1251,1253],{"className":846,"code":1252,"filename":803,"language":848,"meta":849,"style":849},"hatch run config --help\n",[792,1254,1255],{"__ignoreMap":849},[853,1256,1257,1259,1261,1263],{"class":855,"line":856},[853,1258,803],{"class":859},[853,1260,863],{"class":862},[853,1262,866],{"class":862},[853,1264,1249],{"class":862},[844,1266,1268],{"className":846,"code":1267,"filename":807,"language":848,"meta":849,"style":849},"poetry run config --help\n",[792,1269,1270],{"__ignoreMap":849},[853,1271,1272,1274,1276,1278],{"class":855,"line":856},[853,1273,807],{"class":859},[853,1275,863],{"class":862},[853,1277,866],{"class":862},[853,1279,1249],{"class":862},[781,1281,1282,1283,1285],{},"or for a sub-command, e.g. ",[792,1284,938],{},":",[841,1287,1288,1305,1322],{},[844,1289,1291],{"className":846,"code":1290,"filename":799,"language":848,"meta":849,"style":849},"uv run config create --help\n",[792,1292,1293],{"__ignoreMap":849},[853,1294,1295,1297,1299,1301,1303],{"class":855,"line":856},[853,1296,799],{"class":859},[853,1298,863],{"class":862},[853,1300,866],{"class":862},[853,1302,869],{"class":862},[853,1304,1249],{"class":862},[844,1306,1308],{"className":846,"code":1307,"filename":803,"language":848,"meta":849,"style":849},"hatch run config create --help\n",[792,1309,1310],{"__ignoreMap":849},[853,1311,1312,1314,1316,1318,1320],{"class":855,"line":856},[853,1313,803],{"class":859},[853,1315,863],{"class":862},[853,1317,866],{"class":862},[853,1319,869],{"class":862},[853,1321,1249],{"class":862},[844,1323,1325],{"className":846,"code":1324,"filename":807,"language":848,"meta":849,"style":849},"poetry run config create --help\n",[792,1326,1327],{"__ignoreMap":849},[853,1328,1329,1331,1333,1335,1337],{"class":855,"line":856},[853,1330,807],{"class":859},[853,1332,863],{"class":862},[853,1334,866],{"class":862},[853,1336,869],{"class":862},[853,1338,1249],{"class":862},[821,1340,743],{"id":1224},[781,1342,1343,1344,1346,1347,1350],{},"A connector logs its activity so you can monitor it and diagnose problems. There is no need to set anything up to get useful logs.\nLeaving the ",[792,1345,1224],{}," field of your configuration unset (",[792,1348,1349],{},"null",", the default) applies sensible, command-specific presets automatically:",[1352,1353,1354,1377],"table",{},[1355,1356,1357],"thead",{},[1358,1359,1360,1364,1371],"tr",{},[1361,1362,1363],"th",{},"Command",[1361,1365,1366,1367,1370],{},"Console (",[792,1368,1369],{},"stderr",")",[1361,1372,1373,1374,1370],{},"JSON log file (",[792,1375,1376],{},".\u002Flogs\u002Fconnector.log",[1378,1379,1380,1397],"tbody",{},[1358,1381,1382,1388,1394],{},[1383,1384,1385],"td",{},[792,1386,1387],{},"connector dev",[1383,1389,1390,1393],{},[792,1391,1392],{},"DEBUG",", human-readable",[1383,1395,1396],{},"—",[1358,1398,1399,1403,1408],{},[1383,1400,1401],{},[792,1402,925],{},[1383,1404,1405,1393],{},[792,1406,1407],{},"INFO",[1383,1409,1410,1412],{},[792,1411,1392],{},", structured JSON",[781,1414,1415,1416,1418,1419,1421,1422,1424,1425,800,1428,1431,1432,1435],{},"In production (",[792,1417,925],{},") the console shows ",[792,1420,1407],{}," and above for a readable live view, while the rotating file records everything from ",[792,1423,1392],{}," up as structured JSON for troubleshooting. Once the active file reaches 5 MB it rolls over to ",[792,1426,1427],{},"connector.log.1",[792,1429,1430],{},"connector.log.2",", and so on. By default the connector keeps the active file plus the 199 most recent rotated files (",[792,1433,1434],{},"backupCount","), deleting the oldest on each rollover:",[844,1437,1442],{"className":1438,"code":1440,"language":1441},[1439],"language-text",".\u002Flogs\u002F\n├── connector.log         ← active file\n├── connector.log.1       ← most recent rotation\n├── connector.log.2       ← ...\n└── connector.log.199     ← oldest kept; deleted on the next rollover\n","text",[792,1443,1440],{"__ignoreMap":849},[810,1445,1446],{"icon":1191},[781,1447,918,1448,1450,1451,1454,1455,1458,1459,831,1461,1464,1465,1468,1469,1471,1472,1475,1476,1483],{},[792,1449,1434],{}," default is a ",[1196,1452,1453],{},"safety cap to stop logs from filling the disk",". It bounds total usage to roughly 1 GB.\nIt is ",[1196,1456,1457],{},"not"," a retention or archival policy. It is the connector user's responsibility to manage log files by shipping them to a log aggregator, rotating them with an external tool, or backing them up before they are deleted. If you don't need a large local buffer, or don't care about the logs except for error debugging in case of crashes, you can lower ",[792,1460,1434],{},[792,1462,1463],{},"maxBytes",") in your ",[785,1466,1467],{"href":1221},"logging config","; setting ",[792,1470,1434],{}," to ",[792,1473,1474],{},"0"," keeps only the active file. For more information how to configure the file handler read the respective ",[785,1477,1480],{"href":1478,"rel":1479},"https:\u002F\u002Fdocs.python.org\u002F3\u002Flibrary\u002Flogging.handlers.html#rotatingfilehandler",[789],[792,1481,1482],{"style":794},"logging.handlers.RotatingFileHandler"," documentation.",[1485,1486,1488],"h3",{"id":1487},"customizing-the-logging-configuration","Customizing the logging configuration",[781,1490,1491,1492,1494,1495,1500,1501,1505],{},"To change the defaults, set the ",[792,1493,1224],{}," field to a standard Python ",[785,1496,1499],{"href":1497,"rel":1498,"target":790},"https:\u002F\u002Fdocs.python.org\u002F3\u002Flibrary\u002Flogging.config.html#configuration-dictionary-schema",[789],"logging configuration dictionary",". Once set, your configuration is used for ",[1502,1503,1504],"em",{},"every"," command, overwriting the defaults.",[781,1507,1508,1509,1203,1512,1515,1516,1518,1519,1285],{},"To scaffold a new config file pre-populated with a preset, use the ",[792,1510,1511],{},"--explicit-logging",[792,1513,1514],{},"-x"," flag of ",[792,1517,838],{},". The flag defaults to ",[792,1520,1521],{},"prod",[841,1523,1524,1549,1572],{},[844,1525,1527],{"className":846,"code":1526,"filename":799,"language":848,"meta":849,"style":849},"uv run config create --app unitelabs.connector_starter:create_app -x prod\n",[792,1528,1529],{"__ignoreMap":849},[853,1530,1531,1533,1535,1537,1539,1541,1543,1546],{"class":855,"line":856},[853,1532,799],{"class":859},[853,1534,863],{"class":862},[853,1536,866],{"class":862},[853,1538,869],{"class":862},[853,1540,872],{"class":862},[853,1542,975],{"class":862},[853,1544,1545],{"class":862}," -x",[853,1547,1548],{"class":862}," prod\n",[844,1550,1552],{"className":846,"code":1551,"filename":803,"language":848,"meta":849,"style":849},"hatch run config create --app unitelabs.connector_starter:create_app -x prod\n",[792,1553,1554],{"__ignoreMap":849},[853,1555,1556,1558,1560,1562,1564,1566,1568,1570],{"class":855,"line":856},[853,1557,803],{"class":859},[853,1559,863],{"class":862},[853,1561,866],{"class":862},[853,1563,869],{"class":862},[853,1565,872],{"class":862},[853,1567,975],{"class":862},[853,1569,1545],{"class":862},[853,1571,1548],{"class":862},[844,1573,1575],{"className":846,"code":1574,"filename":807,"language":848,"meta":849,"style":849},"poetry run config create --app unitelabs.connector_starter:create_app -x prod\n",[792,1576,1577],{"__ignoreMap":849},[853,1578,1579,1581,1583,1585,1587,1589,1591,1593],{"class":855,"line":856},[853,1580,807],{"class":859},[853,1582,863],{"class":862},[853,1584,866],{"class":862},[853,1586,869],{"class":862},[853,1588,872],{"class":862},[853,1590,975],{"class":862},[853,1592,1545],{"class":862},[853,1594,1548],{"class":862},[781,1596,1597,1598,1600],{},"Alternatively, copy one of the presets below into the ",[792,1599,1224],{}," section of your config file and adapt it:",[841,1602,1603,1740],{},[844,1604,1607],{"className":1605,"code":1606,"filename":1521,"language":948,"meta":849,"style":849},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"logging\": {\n  \"version\": 1,\n  \"disable_existing_loggers\": false,\n  \"handlers\": {\n    \"file\": {\n      \"class\": \"unitelabs.cdk.logging.RotatingStructlogHandler\",\n      \"filename\": \".\u002Flogs\u002Fconnector.log\",\n      \"maxBytes\": 5242880,\n      \"backupCount\": 200,\n      \"encoding\": \"utf-8\",\n      \"level\": \"DEBUG\"\n    },\n    \"console\": {\n      \"class\": \"unitelabs.cdk.logging.ConsoleHandler\",\n      \"level\": \"INFO\"\n    }\n  },\n  \"root\": {\n    \"level\": \"DEBUG\",\n    \"handlers\": [\"file\", \"console\"]\n  }\n}\n",[792,1608,1609,1614,1620,1626,1632,1638,1644,1650,1656,1662,1668,1674,1680,1686,1692,1698,1704,1710,1716,1722,1728,1734],{"__ignoreMap":849},[853,1610,1611],{"class":855,"line":856},[853,1612,1613],{},"\"logging\": {\n",[853,1615,1617],{"class":855,"line":1616},2,[853,1618,1619],{},"  \"version\": 1,\n",[853,1621,1623],{"class":855,"line":1622},3,[853,1624,1625],{},"  \"disable_existing_loggers\": false,\n",[853,1627,1629],{"class":855,"line":1628},4,[853,1630,1631],{},"  \"handlers\": {\n",[853,1633,1635],{"class":855,"line":1634},5,[853,1636,1637],{},"    \"file\": {\n",[853,1639,1641],{"class":855,"line":1640},6,[853,1642,1643],{},"      \"class\": \"unitelabs.cdk.logging.RotatingStructlogHandler\",\n",[853,1645,1647],{"class":855,"line":1646},7,[853,1648,1649],{},"      \"filename\": \".\u002Flogs\u002Fconnector.log\",\n",[853,1651,1653],{"class":855,"line":1652},8,[853,1654,1655],{},"      \"maxBytes\": 5242880,\n",[853,1657,1659],{"class":855,"line":1658},9,[853,1660,1661],{},"      \"backupCount\": 200,\n",[853,1663,1665],{"class":855,"line":1664},10,[853,1666,1667],{},"      \"encoding\": \"utf-8\",\n",[853,1669,1671],{"class":855,"line":1670},11,[853,1672,1673],{},"      \"level\": \"DEBUG\"\n",[853,1675,1677],{"class":855,"line":1676},12,[853,1678,1679],{},"    },\n",[853,1681,1683],{"class":855,"line":1682},13,[853,1684,1685],{},"    \"console\": {\n",[853,1687,1689],{"class":855,"line":1688},14,[853,1690,1691],{},"      \"class\": \"unitelabs.cdk.logging.ConsoleHandler\",\n",[853,1693,1695],{"class":855,"line":1694},15,[853,1696,1697],{},"      \"level\": \"INFO\"\n",[853,1699,1701],{"class":855,"line":1700},16,[853,1702,1703],{},"    }\n",[853,1705,1707],{"class":855,"line":1706},17,[853,1708,1709],{},"  },\n",[853,1711,1713],{"class":855,"line":1712},18,[853,1714,1715],{},"  \"root\": {\n",[853,1717,1719],{"class":855,"line":1718},19,[853,1720,1721],{},"    \"level\": \"DEBUG\",\n",[853,1723,1725],{"class":855,"line":1724},20,[853,1726,1727],{},"    \"handlers\": [\"file\", \"console\"]\n",[853,1729,1731],{"class":855,"line":1730},21,[853,1732,1733],{},"  }\n",[853,1735,1737],{"class":855,"line":1736},22,[853,1738,1739],{},"}\n",[844,1741,1743],{"className":1605,"code":1742,"filename":1213,"language":948,"meta":849,"style":849},"\"logging\": {\n  \"version\": 1,\n  \"disable_existing_loggers\": false,\n  \"handlers\": {\n    \"console\": {\n      \"class\": \"unitelabs.cdk.logging.ConsoleHandler\"\n    }\n  },\n  \"root\": {\n    \"level\": \"DEBUG\",\n    \"handlers\": [\"console\"]\n  }\n}\n",[792,1744,1745,1749,1753,1757,1761,1765,1770,1774,1778,1782,1786,1791,1795],{"__ignoreMap":849},[853,1746,1747],{"class":855,"line":856},[853,1748,1613],{},[853,1750,1751],{"class":855,"line":1616},[853,1752,1619],{},[853,1754,1755],{"class":855,"line":1622},[853,1756,1625],{},[853,1758,1759],{"class":855,"line":1628},[853,1760,1631],{},[853,1762,1763],{"class":855,"line":1634},[853,1764,1685],{},[853,1766,1767],{"class":855,"line":1640},[853,1768,1769],{},"      \"class\": \"unitelabs.cdk.logging.ConsoleHandler\"\n",[853,1771,1772],{"class":855,"line":1646},[853,1773,1703],{},[853,1775,1776],{"class":855,"line":1652},[853,1777,1709],{},[853,1779,1780],{"class":855,"line":1658},[853,1781,1715],{},[853,1783,1784],{"class":855,"line":1664},[853,1785,1721],{},[853,1787,1788],{"class":855,"line":1670},[853,1789,1790],{},"    \"handlers\": [\"console\"]\n",[853,1792,1793],{"class":855,"line":1676},[853,1794,1733],{},[853,1796,1797],{"class":855,"line":1682},[853,1798,1739],{},[1485,1800,1802],{"id":1801},"adjusting-log-levels-per-module","Adjusting log levels per module",[781,1804,1805,1806,1809,1810,1813,1814,1817],{},"Loggers are organized hierarchically by dotted path, so any module can be tuned independently by adding a ",[792,1807,1808],{},"loggers"," entry with its own ",[792,1811,1812],{},"level",", while ",[792,1815,1816],{},"root"," sets the default for everything else:",[844,1819,1821],{"className":1605,"code":1820,"language":948,"meta":849,"style":849},"\"logging\": {\n  ...\n  \"loggers\": {\n      \"sila.server.cloud_server\": {\n        \"level\": \"INFO\"\n      },\n      \"unitelabs.cdk\": {\n        \"level\": \"WARNING\"\n      },\n      \"connector_name\": {\n        \"level\": \"DEBUG\"\n      }\n    },\n  ...\n}\n",[792,1822,1823,1827,1832,1837,1842,1847,1852,1857,1862,1866,1871,1876,1881,1885,1889],{"__ignoreMap":849},[853,1824,1825],{"class":855,"line":856},[853,1826,1613],{},[853,1828,1829],{"class":855,"line":1616},[853,1830,1831],{},"  ...\n",[853,1833,1834],{"class":855,"line":1622},[853,1835,1836],{},"  \"loggers\": {\n",[853,1838,1839],{"class":855,"line":1628},[853,1840,1841],{},"      \"sila.server.cloud_server\": {\n",[853,1843,1844],{"class":855,"line":1634},[853,1845,1846],{},"        \"level\": \"INFO\"\n",[853,1848,1849],{"class":855,"line":1640},[853,1850,1851],{},"      },\n",[853,1853,1854],{"class":855,"line":1646},[853,1855,1856],{},"      \"unitelabs.cdk\": {\n",[853,1858,1859],{"class":855,"line":1652},[853,1860,1861],{},"        \"level\": \"WARNING\"\n",[853,1863,1864],{"class":855,"line":1658},[853,1865,1851],{},[853,1867,1868],{"class":855,"line":1664},[853,1869,1870],{},"      \"connector_name\": {\n",[853,1872,1873],{"class":855,"line":1670},[853,1874,1875],{},"        \"level\": \"DEBUG\"\n",[853,1877,1878],{"class":855,"line":1676},[853,1879,1880],{},"      }\n",[853,1882,1883],{"class":855,"line":1682},[853,1884,1679],{},[853,1886,1887],{"class":855,"line":1688},[853,1888,1831],{},[853,1890,1891],{"class":855,"line":1694},[853,1892,1739],{},[781,1894,1895],{},"In the example above:",[1897,1898,1899,1912,1922],"ul",{},[1900,1901,1902,1905,1906,1908,1909,1911],"li",{},[792,1903,1904],{},"sila.server.cloud_server"," — the cloud server module emits ",[792,1907,1407],{}," and above, dropping its ",[792,1910,1392],{}," records.",[1900,1913,1914,1917,1918,1921],{},[792,1915,1916],{},"unitelabs.cdk"," — everything within the CDK emits ",[792,1919,1920],{},"WARNING"," and above only.",[1900,1923,1924,1927,1928,1930],{},[792,1925,1926],{},"connector_name"," — everything that specific connector logs, down to ",[792,1929,1392],{},", is captured.",[810,1932,1933],{"icon":812},[781,1934,1935,1936,819],{},"Building a connector yourself and want to emit logs from your own code? See the developer ",[785,1937,1939],{"href":1938},"\u002Fconnector-development\u002Fguides\u002Flogging\u002F","Logging guide",[821,1941,1943],{"id":1942},"use-the-connector","Use the connector",[781,1945,1946],{},"With your connector running, you can interact with your instrument in three ways:",[1897,1948,1949,1957,1966],{},[1900,1950,1951,1956],{},[1196,1952,1953],{},[785,1954,53],{"href":1955},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol\u002F"," — read values, trigger actions, and monitor activity directly from the edge app.",[1900,1958,1959,1965],{},[1196,1960,1961],{},[785,1962,1964],{"href":1963},"\u002Fintegrate\u002Fuse-a-connector\u002Fplatform\u002F","UniteLabs Platform"," — view, inspect, and operate the connector from the Platform UI, and add it to workflows.",[1900,1967,1968,1974],{},[1196,1969,1970],{},[785,1971,1973],{"href":1972},"\u002Fintegrate\u002Fuse-a-connector\u002Fpython\u002F","SDK & REST API"," — control the connector programmatically: discover services, explore modules and actions, and subscribe to live data.",[1976,1977,1978],"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":849,"searchDepth":856,"depth":1616,"links":1980},[1981,1982,1983,1987],{"id":823,"depth":1616,"text":824},{"id":1030,"depth":1616,"text":1031},{"id":1224,"depth":1616,"text":743,"children":1984},[1985,1986],{"id":1487,"depth":1622,"text":1488},{"id":1801,"depth":1622,"text":1802},{"id":1942,"depth":1616,"text":1943},"Generate a configuration, run a connector from its source project, and configure logging.","md",null,{},true,{"title":132,"description":1988},"eD4QCrkVRMjX35XRylN1_Omi7OZFGEk-OxnwJTP5gmo",[1996,1998],{"title":128,"path":129,"stem":130,"description":1997},"Run a connector as a standalone executable and choose which command it starts with.",{"title":136,"path":137,"stem":138,"description":1999},"Build a connector for an unsupported instrument with the UniteLabs tooling.",1784060404478]