[{"data":1,"prerenderedAt":2388},["ShallowReactive",2],{"navigation":3,"\u002Fconnector-development\u002Ftutorial\u002Fdata-types":750,"\u002Fconnector-development\u002Ftutorial\u002Fdata-types-surround":2383},[4,80,134,364,428,530,567,646],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Get Started","\u002Fget-started","01.get-started",[9,13,17,43,47],{"title":10,"path":11,"stem":12},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome","01.get-started\u002F00.welcome",{"title":14,"path":15,"stem":16},"How it works","\u002Fget-started\u002Fhow-it-works","01.get-started\u002F01.how-it-works",{"title":18,"path":19,"stem":20,"children":21,"page":42},"Use Cases","\u002Fget-started\u002Fuse-cases","01.get-started\u002F02.use-cases",[22,26,30,34,38],{"title":23,"path":24,"stem":25},"Instrument Control","\u002Fget-started\u002Fuse-cases\u002Flow-level-instrument-control","01.get-started\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":27,"path":28,"stem":29},"Multi-device Control","\u002Fget-started\u002Fuse-cases\u002Fmulti-device-control","01.get-started\u002F02.use-cases\u002F20.multi-device-control",{"title":31,"path":32,"stem":33},"Workflow Orchestration","\u002Fget-started\u002Fuse-cases\u002Fworkflow-orchestration","01.get-started\u002F02.use-cases\u002F30.workflow-orchestration",{"title":35,"path":36,"stem":37},"Custom Apps and LIMS Integration","\u002Fget-started\u002Fuse-cases\u002Fcustom-apps-lims","01.get-started\u002F02.use-cases\u002F40.custom-apps-lims",{"title":39,"path":40,"stem":41},"Scale and Fleet Management","\u002Fget-started\u002Fuse-cases\u002Fscale-and-fleet","01.get-started\u002F02.use-cases\u002F50.scale-and-fleet",false,{"title":44,"path":45,"stem":46},"Lab as Code","\u002Fget-started\u002Fwhy-code","01.get-started\u002F03.why-code",{"title":48,"path":49,"stem":50,"children":51,"page":42},"Setup","\u002Fget-started\u002Fsetup","01.get-started\u002F20.setup",[52,56,60,64,68,72,76],{"title":53,"path":54,"stem":55},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol","01.get-started\u002F20.setup\u002F10.groundcontrol",{"title":57,"path":58,"stem":59},"Network requirements","\u002Fget-started\u002Fsetup\u002Fnetwork-requirements","01.get-started\u002F20.setup\u002F20.network-requirements",{"title":61,"path":62,"stem":63},"Multi-device Networking","\u002Fget-started\u002Fsetup\u002Fmultiple-devices","01.get-started\u002F20.setup\u002F30.multiple-devices",{"title":65,"path":66,"stem":67},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform","01.get-started\u002F20.setup\u002F40.connect-to-platform",{"title":69,"path":70,"stem":71},"Headless install","\u002Fget-started\u002Fsetup\u002Fheadless-install","01.get-started\u002F20.setup\u002F50.headless-install",{"title":73,"path":74,"stem":75},"Raspberry Pi","\u002Fget-started\u002Fsetup\u002Fraspberry-pi","01.get-started\u002F20.setup\u002F55.raspberry-pi",{"title":77,"path":78,"stem":79},"Installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation","01.get-started\u002F20.setup\u002F60.sdk-installation",{"title":81,"path":82,"stem":83,"children":84,"page":42},"Integrate","\u002Fintegrate","02.integrate",[85,89,93,118],{"title":86,"path":87,"stem":88},"What is a connector?","\u002Fintegrate\u002Fwhat-is-a-connector","02.integrate\u002F00.what-is-a-connector",{"title":90,"path":91,"stem":92},"Calling a Connector","\u002Fintegrate\u002Fcontrol-with-code","02.integrate\u002F05.control-with-code",{"title":94,"path":95,"stem":96,"children":97,"page":42},"Concepts","\u002Fintegrate\u002Fconcepts","02.integrate\u002F10.concepts",[98,102,106,110,114],{"title":99,"path":100,"stem":101},"Connector","\u002Fintegrate\u002Fconcepts\u002Fconnector","02.integrate\u002F10.concepts\u002F10.connector",{"title":103,"path":104,"stem":105},"Module","\u002Fintegrate\u002Fconcepts\u002Fmodule","02.integrate\u002F10.concepts\u002F20.module",{"title":107,"path":108,"stem":109},"Action","\u002Fintegrate\u002Fconcepts\u002Faction","02.integrate\u002F10.concepts\u002F30.action",{"title":111,"path":112,"stem":113},"Subscription","\u002Fintegrate\u002Fconcepts\u002Fsubscription","02.integrate\u002F10.concepts\u002F40.subscription",{"title":115,"path":116,"stem":117},"Device","\u002Fintegrate\u002Fconcepts\u002Fdevice","02.integrate\u002F10.concepts\u002F50.device",{"title":119,"path":120,"stem":121,"children":122,"page":42},"Use a connector","\u002Fintegrate\u002Fuse-a-connector","02.integrate\u002F30.use-a-connector",[123,126,130],{"title":53,"path":124,"stem":125},"\u002Fintegrate\u002Fuse-a-connector\u002Fgroundcontrol","02.integrate\u002F30.use-a-connector\u002F10.groundcontrol",{"title":127,"path":128,"stem":129},"Platform","\u002Fintegrate\u002Fuse-a-connector\u002Fplatform","02.integrate\u002F30.use-a-connector\u002F20.platform",{"title":131,"path":132,"stem":133},"UniteLabs SDK & REST API","\u002Fintegrate\u002Fuse-a-connector\u002Fpython","02.integrate\u002F30.use-a-connector\u002F30.python",{"title":135,"path":136,"stem":137,"children":138,"page":42},"Operate","\u002Foperate","03.operate",[139,142,146,186,259],{"title":135,"path":140,"stem":141},"\u002Foperate\u002Foverview","03.operate\u002F00.overview",{"title":143,"path":144,"stem":145},"Your First Protocol","\u002Foperate\u002Fyour-first-protocol","03.operate\u002F05.your-first-protocol",{"title":94,"path":147,"stem":148,"children":149,"page":42},"\u002Foperate\u002Fconcepts","03.operate\u002F10.concepts",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"Liquid Handling","\u002Foperate\u002Fconcepts\u002Fliquid-handling","03.operate\u002F10.concepts\u002F10.liquid-handling",{"title":155,"path":156,"stem":157},"Modules","\u002Foperate\u002Fconcepts\u002Fmodules","03.operate\u002F10.concepts\u002F20.modules",{"title":159,"path":160,"stem":161},"Deck","\u002Foperate\u002Fconcepts\u002Fdeck","03.operate\u002F10.concepts\u002F30.deck",{"title":163,"path":164,"stem":165},"Labware","\u002Foperate\u002Fconcepts\u002Flabware","03.operate\u002F10.concepts\u002F40.labware",{"title":167,"path":168,"stem":169},"Liquids","\u002Foperate\u002Fconcepts\u002Fliquids","03.operate\u002F10.concepts\u002F50.liquids",{"title":171,"path":172,"stem":173},"Liquid Classes","\u002Foperate\u002Fconcepts\u002Fliquid-classes","03.operate\u002F10.concepts\u002F60.liquid-classes",{"title":175,"path":176,"stem":177},"Tips and Tip Tracking","\u002Foperate\u002Fconcepts\u002Ftips","03.operate\u002F10.concepts\u002F70.tips",{"title":179,"path":180,"stem":181},"Simulation","\u002Foperate\u002Fconcepts\u002Fsimulation","03.operate\u002F10.concepts\u002F80.simulation",{"title":183,"path":184,"stem":185},"Error Handling","\u002Foperate\u002Fconcepts\u002Ferror-handling","03.operate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":188,"stem":189,"children":190,"page":42},"Guides","\u002Foperate\u002Fguides","03.operate\u002F20.guides",[191,220,232,256],{"title":163,"path":192,"stem":193,"children":194},"\u002Foperate\u002Fguides\u002Flabware","03.operate\u002F20.guides\u002F10.labware\u002Findex",[195,196,200,204,208,212,216],{"title":163,"path":192,"stem":193},{"title":197,"path":198,"stem":199},"Standard Labware","\u002Foperate\u002Fguides\u002Flabware\u002Fstandard-labware","03.operate\u002F20.guides\u002F10.labware\u002F05.standard-labware",{"title":201,"path":202,"stem":203},"Plates","\u002Foperate\u002Fguides\u002Flabware\u002Fplates","03.operate\u002F20.guides\u002F10.labware\u002F10.plates",{"title":205,"path":206,"stem":207},"Tips and Tip Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftips-and-racks","03.operate\u002F20.guides\u002F10.labware\u002F20.tips-and-racks",{"title":209,"path":210,"stem":211},"Tubes and Tube Racks","\u002Foperate\u002Fguides\u002Flabware\u002Ftubes-and-tube-racks","03.operate\u002F20.guides\u002F10.labware\u002F30.tubes-and-tube-racks",{"title":213,"path":214,"stem":215},"Troughs","\u002Foperate\u002Fguides\u002Flabware\u002Ftroughs","03.operate\u002F20.guides\u002F10.labware\u002F35.troughs",{"title":217,"path":218,"stem":219},"Carriers and Adapters","\u002Foperate\u002Fguides\u002Flabware\u002Fcarriers-and-adapters","03.operate\u002F20.guides\u002F10.labware\u002F40.carriers-and-adapters",{"title":159,"path":221,"stem":222,"children":223,"page":42},"\u002Foperate\u002Fguides\u002Fdeck","03.operate\u002F20.guides\u002F20.deck",[224,228],{"title":225,"path":226,"stem":227},"Building a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fbuilding-a-deck","03.operate\u002F20.guides\u002F20.deck\u002F10.building-a-deck",{"title":229,"path":230,"stem":231},"Save\u002FLoad a Deck","\u002Foperate\u002Fguides\u002Fdeck\u002Fsave-load-deck","03.operate\u002F20.guides\u002F20.deck\u002F20.save-load-deck",{"title":233,"path":234,"stem":235,"children":236,"page":42},"Pipetting","\u002Foperate\u002Fguides\u002Fpipetting","03.operate\u002F20.guides\u002F30.pipetting",[237,241,245,249,252],{"title":238,"path":239,"stem":240},"Basic Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fbasic-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F10.basic-pipetting",{"title":242,"path":243,"stem":244},"Advanced Pipetting","\u002Foperate\u002Fguides\u002Fpipetting\u002Fadvanced-pipetting","03.operate\u002F20.guides\u002F30.pipetting\u002F20.advanced-pipetting",{"title":246,"path":247,"stem":248},"Tip Handling","\u002Foperate\u002Fguides\u002Fpipetting\u002Ftip-handling","03.operate\u002F20.guides\u002F30.pipetting\u002F30.tip-handling",{"title":171,"path":250,"stem":251},"\u002Foperate\u002Fguides\u002Fpipetting\u002Fliquid-classes","03.operate\u002F20.guides\u002F30.pipetting\u002F40.liquid-classes",{"title":253,"path":254,"stem":255},"Labware Transport","\u002Foperate\u002Fguides\u002Fpipetting\u002Flabware-transport","03.operate\u002F20.guides\u002F30.pipetting\u002F50.labware-transport",{"title":179,"path":257,"stem":258},"\u002Foperate\u002Fguides\u002Fsimulation","03.operate\u002F20.guides\u002F40.simulation",{"title":260,"path":261,"stem":262,"children":263,"page":42},"Liquid Handler Guides","\u002Foperate\u002Fdevices","03.operate\u002F30.devices",[264,305,330,347],{"title":265,"path":266,"stem":267,"children":268,"page":42},"Hamilton STAR","\u002Foperate\u002Fdevices\u002Fhamilton-star","03.operate\u002F30.devices\u002F10.hamilton-star",[269,273,277,281,285,289,293,297,301],{"title":270,"path":271,"stem":272},"Positioning & Movement","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fpositioning","03.operate\u002F30.devices\u002F10.hamilton-star\u002F10.positioning",{"title":274,"path":275,"stem":276},"Gripper Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcore-gripper","03.operate\u002F30.devices\u002F10.hamilton-star\u002F20.core-gripper",{"title":278,"path":279,"stem":280},"iSWAP Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fiswap","03.operate\u002F30.devices\u002F10.hamilton-star\u002F30.iswap",{"title":282,"path":283,"stem":284},"Using TADM","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Ftadm","03.operate\u002F30.devices\u002F10.hamilton-star\u002F40.tadm",{"title":286,"path":287,"stem":288},"Autoload Module","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fautoload","03.operate\u002F30.devices\u002F10.hamilton-star\u002F50.autoload",{"title":290,"path":291,"stem":292},"Waste Block","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fwaste-block","03.operate\u002F30.devices\u002F10.hamilton-star\u002F60.waste-block",{"title":294,"path":295,"stem":296},"Complex Mixing","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcomplex-mixing","03.operate\u002F30.devices\u002F10.hamilton-star\u002F66.complex-mixing",{"title":298,"path":299,"stem":300},"Teaching Gripper Paddle Positions","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fgripper-positions","03.operate\u002F30.devices\u002F10.hamilton-star\u002F70.gripper-positions",{"title":302,"path":303,"stem":304},"Training a Custom Deck Position With the iSWAP","\u002Foperate\u002Fdevices\u002Fhamilton-star\u002Fcustom-deck-position","03.operate\u002F30.devices\u002F10.hamilton-star\u002F75.custom-deck-position",{"title":306,"path":307,"stem":308,"children":309,"page":42},"Hamilton Vantage","\u002Foperate\u002Fdevices\u002Fhamilton-vantage","03.operate\u002F30.devices\u002F20.hamilton-vantage",[310,314,318,322,326],{"title":311,"path":312,"stem":313},"Waste Configuration","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fwaste-configuration","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F05.waste-configuration",{"title":315,"path":316,"stem":317},"Covers and Lights","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fcovers-and-lights","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F10.covers-and-lights",{"title":319,"path":320,"stem":321},"IDL Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fidl","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F20.idl",{"title":323,"path":324,"stem":325},"IPG Module","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fipg","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F30.ipg",{"title":327,"path":328,"stem":329},"XL Pipettes","\u002Foperate\u002Fdevices\u002Fhamilton-vantage\u002Fxl-channels","03.operate\u002F30.devices\u002F20.hamilton-vantage\u002F40.xl-channels",{"title":331,"path":332,"stem":333,"children":334,"page":42},"Agilent Bravo","\u002Foperate\u002Fdevices\u002Fagilent-bravo","03.operate\u002F30.devices\u002F30.agilent-bravo",[335,338,341,344],{"title":246,"path":336,"stem":337},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Ftip-handling","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F10.tip-handling",{"title":238,"path":339,"stem":340},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fbasic-pipetting","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F20.basic-pipetting",{"title":171,"path":342,"stem":343},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fliquid-classes","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F25.liquid-classes",{"title":274,"path":345,"stem":346},"\u002Foperate\u002Fdevices\u002Fagilent-bravo\u002Fusing-the-gripper","03.operate\u002F30.devices\u002F30.agilent-bravo\u002F30.using-the-gripper",{"title":348,"path":349,"stem":350,"children":351,"page":42},"Tecan FluentControl","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol",[352,356,360],{"title":353,"path":354,"stem":355},"Connect & Run a Method","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fconnect-and-run","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F10.connect-and-run",{"title":357,"path":358,"stem":359},"Sending XML Commands","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Fsending-xml-commands","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":361,"path":362,"stem":363},"Full Workflow Example","\u002Foperate\u002Fdevices\u002Ftecan-fluentcontrol\u002Ffull-workflow-example","03.operate\u002F30.devices\u002F40.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":365,"path":366,"stem":367,"children":368,"page":42},"Device Guides","\u002Fdevice-guides","06.device-guides",[369,372,385,402,415],{"title":365,"path":370,"stem":371},"\u002Fdevice-guides\u002Foverview","06.device-guides\u002F00.overview",{"title":373,"path":374,"stem":375,"children":376,"page":42},"Incubation","\u002Fdevice-guides\u002Fincubation","06.device-guides\u002F20.incubation",[377,381],{"title":378,"path":379,"stem":380},"Inheco ODTC","\u002Fdevice-guides\u002Fincubation\u002Finheco-odtc","06.device-guides\u002F20.incubation\u002F10.inheco-odtc",{"title":382,"path":383,"stem":384},"Inheco SCILA","\u002Fdevice-guides\u002Fincubation\u002Finheco-scila","06.device-guides\u002F20.incubation\u002F20.inheco-scila",{"title":386,"path":387,"stem":388,"children":389,"page":42},"Heater-Shakers","\u002Fdevice-guides\u002Fheater-shakers","06.device-guides\u002F30.heater-shakers",[390,394,398],{"title":391,"path":392,"stem":393},"Inheco Thermoshake","\u002Fdevice-guides\u002Fheater-shakers\u002Finheco-thermoshake","06.device-guides\u002F30.heater-shakers\u002F10.inheco-thermoshake",{"title":395,"path":396,"stem":397},"QInstruments Bioshake","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-bioshake","06.device-guides\u002F30.heater-shakers\u002F20.qinstruments-bioshake",{"title":399,"path":400,"stem":401},"QInstruments ColdPlate","\u002Fdevice-guides\u002Fheater-shakers\u002Fqinstruments-coldplate","06.device-guides\u002F30.heater-shakers\u002F30.qinstruments-coldplate",{"title":403,"path":404,"stem":405,"children":406,"page":42},"Readers","\u002Fdevice-guides\u002Freaders","06.device-guides\u002F40.readers",[407,411],{"title":408,"path":409,"stem":410},"Biotek Gen5","\u002Fdevice-guides\u002Freaders\u002Fbiotek-gen5","06.device-guides\u002F40.readers\u002F10.biotek-gen5",{"title":412,"path":413,"stem":414},"Biotek Synergy H1","\u002Fdevice-guides\u002Freaders\u002Fbiotek-synergy-h1","06.device-guides\u002F40.readers\u002F20.biotek-synergy-H1",{"title":416,"path":417,"stem":418,"children":419,"page":42},"Tilt & Turn","\u002Fdevice-guides\u002Ftilt-and-turn","06.device-guides\u002F50.tilt-and-turn",[420,424],{"title":421,"path":422,"stem":423},"TurnStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-turnstation","06.device-guides\u002F50.tilt-and-turn\u002F10.qinstruments-turnstation",{"title":425,"path":426,"stem":427},"TiltStation","\u002Fdevice-guides\u002Ftilt-and-turn\u002Fqinstruments-tiltstation","06.device-guides\u002F50.tilt-and-turn\u002F20.qinstruments-tiltstation",{"title":429,"path":430,"stem":431,"children":432,"page":42},"Automate","\u002Fautomate","07.automate",[433,437,441,445,494],{"title":434,"path":435,"stem":436},"What is a workflow?","\u002Fautomate\u002Fwhat-is-a-workflow","07.automate\u002F00.what-is-a-workflow",{"title":438,"path":439,"stem":440},"Workflow template","\u002Fautomate\u002Fworkflow-template","07.automate\u002F05.workflow-template",{"title":442,"path":443,"stem":444},"Your First Workflow","\u002Fautomate\u002Fyour-first-workflow","07.automate\u002F08.your-first-workflow",{"title":94,"pages":446,"path":456,"stem":457,"children":458,"page":42},[447,448,449,450,451,452,453,454,455],"workflow","phase","step","runs","input","artifacts","logs","human-in-the-loop","error-handling","\u002Fautomate\u002Fconcepts","07.automate\u002F10.concepts",[459,463,467,471,475,479,483,487,491],{"title":460,"path":461,"stem":462},"Workflow","\u002Fautomate\u002Fconcepts\u002Fworkflow","07.automate\u002F10.concepts\u002F10.workflow",{"title":464,"path":465,"stem":466},"Phase","\u002Fautomate\u002Fconcepts\u002Fphase","07.automate\u002F10.concepts\u002F20.phase",{"title":468,"path":469,"stem":470},"Step","\u002Fautomate\u002Fconcepts\u002Fstep","07.automate\u002F10.concepts\u002F30.step",{"title":472,"path":473,"stem":474},"Runs","\u002Fautomate\u002Fconcepts\u002Fruns","07.automate\u002F10.concepts\u002F40.runs",{"title":476,"path":477,"stem":478},"Input","\u002Fautomate\u002Fconcepts\u002Finput","07.automate\u002F10.concepts\u002F50.input",{"title":480,"path":481,"stem":482},"Artifacts","\u002Fautomate\u002Fconcepts\u002Fartifacts","07.automate\u002F10.concepts\u002F60.artifacts",{"title":484,"path":485,"stem":486},"Logs","\u002Fautomate\u002Fconcepts\u002Flogs","07.automate\u002F10.concepts\u002F70.logs",{"title":488,"path":489,"stem":490},"Human in the Loop","\u002Fautomate\u002Fconcepts\u002Fhuman-in-the-loop","07.automate\u002F10.concepts\u002F80.human-in-the-loop",{"title":183,"path":492,"stem":493},"\u002Fautomate\u002Fconcepts\u002Ferror-handling","07.automate\u002F10.concepts\u002F90.error-handling",{"title":187,"path":495,"stem":496,"children":497,"page":42},"\u002Fautomate\u002Fguides","07.automate\u002F25.guides",[498,502,506,510,514,518,522,526],{"title":499,"path":500,"stem":501},"Deploy a workflow","\u002Fautomate\u002Fguides\u002Fdeploy-a-workflow","07.automate\u002F25.guides\u002F30.deploy-a-workflow",{"title":503,"path":504,"stem":505},"Run a workflow","\u002Fautomate\u002Fguides\u002Frun-a-workflow","07.automate\u002F25.guides\u002F35.run-a-workflow",{"title":507,"path":508,"stem":509},"CI\u002FCD for workflows","\u002Fautomate\u002Fguides\u002Fcicd-for-workflows","07.automate\u002F25.guides\u002F40.cicd-for-workflows",{"title":511,"path":512,"stem":513},"HITL basics","\u002Fautomate\u002Fguides\u002Fbasic-hitl","07.automate\u002F25.guides\u002F50.basic-hitl",{"title":515,"path":516,"stem":517},"Typed operator inputs","\u002Fautomate\u002Fguides\u002Ftyped-operator-inputs","07.automate\u002F25.guides\u002F55.typed-operator-inputs",{"title":519,"path":520,"stem":521},"Error recovery","\u002Fautomate\u002Fguides\u002Fbasic-error-handling","07.automate\u002F25.guides\u002F60.basic-error-handling",{"title":523,"path":524,"stem":525},"Advanced error handling","\u002Fautomate\u002Fguides\u002Fadvanced-error-handling","07.automate\u002F25.guides\u002F70.advanced-error-handling",{"title":527,"path":528,"stem":529},"Workflows REST API","\u002Fautomate\u002Fguides\u002Fworkflows-api","07.automate\u002F25.guides\u002F80.workflows-api",{"title":531,"path":532,"stem":533,"children":534,"page":42},"Observe","\u002Fobserve","08.observe",[535,539,555],{"title":536,"path":537,"stem":538},"Overview","\u002Fobserve\u002Foverview","08.observe\u002F10.overview",{"title":94,"path":540,"stem":541,"children":542,"page":42},"\u002Fobserve\u002Fconcepts","08.observe\u002F20.concepts",[543,547,551],{"title":544,"path":545,"stem":546},"Object Storage","\u002Fobserve\u002Fconcepts\u002Fstorage","08.observe\u002F20.concepts\u002F10.storage",{"title":548,"path":549,"stem":550},"Secrets","\u002Fobserve\u002Fconcepts\u002Fsecrets","08.observe\u002F20.concepts\u002F20.secrets",{"title":552,"path":553,"stem":554},"Data sources","\u002Fobserve\u002Fconcepts\u002Fdata-sources","08.observe\u002F20.concepts\u002F30.data-sources",{"title":187,"path":556,"stem":557,"children":558,"page":42},"\u002Fobserve\u002Fguides","08.observe\u002F30.guides",[559,563],{"title":560,"path":561,"stem":562},"File System Connector","\u002Fobserve\u002Fguides\u002Ffilesystem-connector","08.observe\u002F30.guides\u002F10.filesystem-connector",{"title":564,"path":565,"stem":566},"Building an ETL","\u002Fobserve\u002Fguides\u002Fbuilding-an-etl","08.observe\u002F30.guides\u002F20.building-an-etl",{"title":568,"path":569,"stem":570,"children":571,"page":42},"Technical Reference","\u002Ftechnical-reference","10.technical-reference",[572,576,580,592,603,614,624,635],{"title":573,"path":574,"stem":575},"Introduction","\u002Ftechnical-reference\u002Fplatform-blueprint","10.technical-reference\u002F00.platform-blueprint",{"title":577,"path":578,"stem":579},"REST API","\u002Ftechnical-reference\u002Frest-api","10.technical-reference\u002F01.rest-api",{"title":53,"path":581,"stem":582,"children":583,"page":42},"\u002Ftechnical-reference\u002Fgroundcontrol","10.technical-reference\u002F10.groundcontrol",[584,588],{"title":585,"path":586,"stem":587},"Install & Setup","\u002Ftechnical-reference\u002Fgroundcontrol\u002Finstall","10.technical-reference\u002F10.groundcontrol\u002F10.install",{"title":589,"path":590,"stem":591},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog","10.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":593,"path":594,"stem":595,"children":596,"page":42},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk","10.technical-reference\u002F20.python-sdk",[597,600],{"title":585,"path":598,"stem":599},"\u002Ftechnical-reference\u002Fpython-sdk\u002Finstall","10.technical-reference\u002F20.python-sdk\u002F10.install",{"title":589,"path":601,"stem":602},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog","10.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":604,"path":605,"stem":606,"children":607,"page":42},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk","10.technical-reference\u002F30.python-liquid-handling-sdk",[608,611],{"title":585,"path":609,"stem":610},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Finstall","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F10.install",{"title":589,"path":612,"stem":613},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog","10.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":163,"path":615,"stem":616,"children":617,"page":42},"\u002Ftechnical-reference\u002Flabware","10.technical-reference\u002F40.labware",[618,621],{"title":585,"path":619,"stem":620},"\u002Ftechnical-reference\u002Flabware\u002Finstall","10.technical-reference\u002F40.labware\u002F10.install",{"title":589,"path":622,"stem":623},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog","10.technical-reference\u002F40.labware\u002F20.changelog",{"title":625,"path":626,"stem":627,"children":628,"page":42},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus","10.technical-reference\u002F50.python-omnibus",[629,632],{"title":585,"path":630,"stem":631},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Finstall","10.technical-reference\u002F50.python-omnibus\u002F10.install",{"title":589,"path":633,"stem":634},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog","10.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":636,"path":637,"stem":638,"children":639,"page":42},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk","10.technical-reference\u002F60.python-cdk",[640,643],{"title":585,"path":641,"stem":642},"\u002Ftechnical-reference\u002Fpython-cdk\u002Finstall","10.technical-reference\u002F60.python-cdk\u002F10.install",{"title":589,"path":644,"stem":645},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog","10.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":647,"path":648,"stem":649,"children":650},"Connector Development (CDK)","\u002Fconnector-development","20.connector-development",[651,653,672,705,713,744],{"title":647,"path":648,"stem":652},"20.connector-development\u002Findex",{"title":654,"path":655,"stem":656,"children":657,"page":42},"Getting Started","\u002Fconnector-development\u002Fgetting-started","20.connector-development\u002F10.getting-started",[658,661,665,668],{"title":536,"path":659,"stem":660},"\u002Fconnector-development\u002Fgetting-started\u002Foverview","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":662,"path":663,"stem":664},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":77,"path":666,"stem":667},"\u002Fconnector-development\u002Fgetting-started\u002Finstallation","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":669,"path":670,"stem":671},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":673,"path":674,"stem":675,"children":676,"page":42},"Tutorial","\u002Fconnector-development\u002Ftutorial","20.connector-development\u002F20.tutorial",[677,681,685,689,693,697,701],{"title":678,"path":679,"stem":680},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":682,"path":683,"stem":684},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":686,"path":687,"stem":688},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":690,"path":691,"stem":692},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":694,"path":695,"stem":696},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":698,"path":699,"stem":700},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":702,"path":703,"stem":704},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":94,"path":706,"stem":707,"children":708,"page":42},"\u002Fconnector-development\u002Fconcepts","20.connector-development\u002F30.concepts",[709],{"title":710,"path":711,"stem":712},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila","20.connector-development\u002F30.concepts\u002Fsila",{"title":187,"path":714,"stem":715,"children":716,"page":42},"\u002Fconnector-development\u002Fguides","20.connector-development\u002F40.guides",[717,721,725,729,733,736,740],{"title":718,"path":719,"stem":720},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration","20.connector-development\u002F40.guides\u002F20.configuration",{"title":722,"path":723,"stem":724},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment","20.connector-development\u002F40.guides\u002F30.deployment",{"title":726,"path":727,"stem":728},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity","20.connector-development\u002F40.guides\u002F40.security",{"title":730,"path":731,"stem":732},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":183,"path":734,"stem":735},"\u002Fconnector-development\u002Fguides\u002Ferror-handling","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":737,"path":738,"stem":739},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":741,"path":742,"stem":743},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting","20.connector-development\u002F40.guides\u002F80.testing",{"title":745,"path":746,"stem":747,"children":748},"References","\u002Fconnector-development\u002Freference","20.connector-development\u002F50.reference\u002Findex",[749],{"title":745,"path":746,"stem":747},{"id":751,"title":694,"body":752,"description":2377,"extension":2378,"links":2379,"meta":2380,"navigation":1157,"path":695,"seo":2381,"stem":696,"__hash__":2382},"docs\u002F20.connector-development\u002F20.tutorial\u002F40.data-types.md",{"type":753,"value":754,"toc":2366},"minimark",[755,759,762,774,788,793,796,897,901,904,936,939,950,955,958,961,970,977,1103,1110,1213,1217,1220,1223,1357,1361,1364,1367,1562,1565,1568,1651,1661,1740,1746,1758,1854,1857,1871,1875,1890,2172,2183,2187,2200,2348,2362],[756,757,758],"p",{},"Typing is an essential part of any API design, and SiLA is no exception.",[756,760,761],{},"The SiLA 2 Standard Part A defines a set of basic and derived data types which can be used to define the parameters and return values of SiLA endpoints.",[756,763,764,765,773],{},"Data types are declared according to ",[766,767,772],"a",{"href":768,"rel":769,"target":771},"https:\u002F\u002Fpeps.python.org\u002Fpep-0484\u002F",[770],"nofollow","_blank","PEP 484",". When using the UniteLabs CDK, our signature type hints are automatically converted to the respective SiLA data types by the SiLA decorators.",[756,775,776,777,782,783,787],{},"The data types, as specified by the SiLA 2 Standard, and their respective counterparts are defined in the ",[766,778,781],{"href":779,"rel":780,"target":771},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fpython-cdk\u002F-\u002Ftree\u002Fmain\u002Fsrc\u002Funitelabs\u002Fcdk\u002Fsila\u002Fdata_types?ref_type=heads",[770],"data_types module"," of the CDK and in the ",[766,784,694],{"href":785,"rel":786,"target":771},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1nGGEwbx45ZpKeKYH18VnNysREbr1EXH6FqlCo03yASM\u002Fedit?tab=t.0#heading=h.mnzohomp656",[770]," section of the SiLA2 Specification.",[789,790,792],"h2",{"id":791},"basic-data-types","Basic Data Types",[756,794,795],{},"The CDK wraps python native types and converts them into their respective SiLA data types when used as type hints in SiLA endpoints. The data types defined by the SiLA 2 Standard Part A and their respective python counterparts are as follows:",[797,798,799,812],"table",{},[800,801,802],"thead",{},[803,804,805,809],"tr",{},[806,807,808],"th",{},"SiLA Data Type",[806,810,811],{},"Python Type",[813,814,815,827,837,847,857,867,877,887],"tbody",{},[803,816,817,821],{},[818,819,820],"td",{},"String",[818,822,823],{},[824,825,826],"code",{},"str",[803,828,829,832],{},[818,830,831],{},"Binary",[818,833,834],{},[824,835,836],{},"bytes",[803,838,839,842],{},[818,840,841],{},"Integer",[818,843,844],{},[824,845,846],{},"int",[803,848,849,852],{},[818,850,851],{},"Real",[818,853,854],{},[824,855,856],{},"float",[803,858,859,862],{},[818,860,861],{},"Boolean",[818,863,864],{},[824,865,866],{},"bool",[803,868,869,872],{},[818,870,871],{},"Time",[818,873,874],{},[824,875,876],{},"datetime.time",[803,878,879,882],{},[818,880,881],{},"Date",[818,883,884],{},[824,885,886],{},"datetime.date",[803,888,889,892],{},[818,890,891],{},"Timestamp",[818,893,894],{},[824,895,896],{},"datetime.datetime",[789,898,900],{"id":899},"derived-data-types","Derived Data Types",[756,902,903],{},"Derived data types are those which combine multiple values or inner data types into a single type. The SiLA 2 Standard Part A defines two derived data types which we will focus on here: List and Structure.",[797,905,906,914],{},[800,907,908],{},[803,909,910,912],{},[806,911,808],{},[806,913,811],{},[813,915,916,926],{},[803,917,918,921],{},[818,919,920],{},"List",[818,922,923],{},[824,924,925],{},"list",[803,927,928,931],{},[818,929,930],{},"Structure",[818,932,933],{},[824,934,935],{},"dataclasses.dataclass",[756,937,938],{},"Derived data types can contain any of the basic data types and additionally utilize constraints to further specify the data.",[940,941,943],"callout",{"icon":942},"i-heroicons-exclamation-triangle",[756,944,945,949],{},[946,947,948],"strong",{},"Technical Hint",": Lists cannot be nested in SiLA, i.e. you cannot have a List of Lists. If you need to represent nested list data, you can utilize a Structure to wrap the inner list and then create a List of that Structure.",[951,952,954],"h3",{"id":953},"structures","Structures",[756,956,957],{},"Up to this point in the tutorials all of our function signatures have utilized basic data types. It is, however, important that we be able to define or derive our own complex types to keep our data well structured and human-readable.",[756,959,960],{},"Structures may be composed of any mixture of valid SiLA data types, including other Structures.",[756,962,963,964,969],{},"Let's take as an example the ",[766,965,968],{"href":966,"rel":967,"target":771},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fcdk\u002Fpython-cdk\u002F-\u002Ftree\u002Fmain\u002Fsrc\u002Funitelabs\u002Fcdk\u002Ffeatures\u002Frobot\u002Flabware_transfer_manipulator_controller?ref_type=heads",[770],"LabwareTransferFeature"," in the feature library.",[756,971,972,973,976],{},"In the ",[824,974,975],{},"LabwareTransferManipulatorControllerBase"," we see the following method:",[978,979,984],"pre",{"className":980,"code":981,"language":982,"meta":983,"style":983},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@sila.UnobservableCommand()\nasync def prepare_for_input(\n    self,\n    handover_position: HandoverPosition,\n    internal_position: PositionIndex,\n    labware_type: str,\n    labware_unique_ID: str,\n) -> str:\n","python","",[824,985,986,1008,1024,1034,1050,1063,1077,1089],{"__ignoreMap":983},[987,988,991,995,999,1002,1005],"span",{"class":989,"line":990},"line",1,[987,992,994],{"class":993},"sMK4o","@",[987,996,998],{"class":997},"s2Zo4","sila",[987,1000,1001],{"class":993},".",[987,1003,1004],{"class":997},"UnobservableCommand",[987,1006,1007],{"class":993},"()\n",[987,1009,1011,1015,1018,1021],{"class":989,"line":1010},2,[987,1012,1014],{"class":1013},"spNyl","async",[987,1016,1017],{"class":1013}," def",[987,1019,1020],{"class":997}," prepare_for_input",[987,1022,1023],{"class":993},"(\n",[987,1025,1027,1031],{"class":989,"line":1026},3,[987,1028,1030],{"class":1029},"s5tWE","    self",[987,1032,1033],{"class":993},",\n",[987,1035,1037,1041,1044,1048],{"class":989,"line":1036},4,[987,1038,1040],{"class":1039},"sHdIc","    handover_position",[987,1042,1043],{"class":993},":",[987,1045,1047],{"class":1046},"sTEyZ"," HandoverPosition",[987,1049,1033],{"class":993},[987,1051,1053,1056,1058,1061],{"class":989,"line":1052},5,[987,1054,1055],{"class":1039},"    internal_position",[987,1057,1043],{"class":993},[987,1059,1060],{"class":1046}," PositionIndex",[987,1062,1033],{"class":993},[987,1064,1066,1069,1071,1075],{"class":989,"line":1065},6,[987,1067,1068],{"class":1039},"    labware_type",[987,1070,1043],{"class":993},[987,1072,1074],{"class":1073},"sBMFI"," str",[987,1076,1033],{"class":993},[987,1078,1080,1083,1085,1087],{"class":989,"line":1079},7,[987,1081,1082],{"class":1039},"    labware_unique_ID",[987,1084,1043],{"class":993},[987,1086,1074],{"class":1073},[987,1088,1033],{"class":993},[987,1090,1092,1095,1098,1100],{"class":989,"line":1091},8,[987,1093,1094],{"class":993},")",[987,1096,1097],{"class":993}," ->",[987,1099,1074],{"class":1073},[987,1101,1102],{"class":993},":\n",[756,1104,1105,1106,1109],{},"This method utilizes a Structure to specify how the complex data required by the method can be supplied by the user with ",[824,1107,1108],{},"HandoverPosition"," defined as follows:",[978,1111,1113],{"className":980,"code":1112,"language":982,"meta":983,"style":983},"@dataclasses.dataclass\nclass HandoverPosition:\n    \"\"\"\n    Specifies one of the possible positions of a device where labware items can be handed over.\n    Can contain a sub-position, e.g. for specifying a position in a rack.\n\n    Attributes:\n      Position: The position where the labware will be handed over.\n      SubPosition: A sub-specification of the position for more precise locations,\n        e.g. a position within a rack, where the rack's position is specified with `position`.\n    \"\"\"\n\n    position: str\n    sub_position: PositionIndex\n",[824,1114,1115,1127,1136,1142,1148,1153,1159,1164,1169,1175,1181,1186,1191,1202],{"__ignoreMap":983},[987,1116,1117,1119,1122,1124],{"class":989,"line":990},[987,1118,994],{"class":993},[987,1120,1121],{"class":997},"dataclasses",[987,1123,1001],{"class":993},[987,1125,1126],{"class":997},"dataclass\n",[987,1128,1129,1132,1134],{"class":989,"line":1010},[987,1130,1131],{"class":1013},"class",[987,1133,1047],{"class":1073},[987,1135,1102],{"class":993},[987,1137,1138],{"class":989,"line":1026},[987,1139,1141],{"class":1140},"s7zQu","    \"\"\"\n",[987,1143,1144],{"class":989,"line":1036},[987,1145,1147],{"class":1146},"sHwdD","    Specifies one of the possible positions of a device where labware items can be handed over.\n",[987,1149,1150],{"class":989,"line":1052},[987,1151,1152],{"class":1146},"    Can contain a sub-position, e.g. for specifying a position in a rack.\n",[987,1154,1155],{"class":989,"line":1065},[987,1156,1158],{"emptyLinePlaceholder":1157},true,"\n",[987,1160,1161],{"class":989,"line":1079},[987,1162,1163],{"class":1146},"    Attributes:\n",[987,1165,1166],{"class":989,"line":1091},[987,1167,1168],{"class":1146},"      Position: The position where the labware will be handed over.\n",[987,1170,1172],{"class":989,"line":1171},9,[987,1173,1174],{"class":1146},"      SubPosition: A sub-specification of the position for more precise locations,\n",[987,1176,1178],{"class":989,"line":1177},10,[987,1179,1180],{"class":1146},"        e.g. a position within a rack, where the rack's position is specified with `position`.\n",[987,1182,1184],{"class":989,"line":1183},11,[987,1185,1141],{"class":1140},[987,1187,1189],{"class":989,"line":1188},12,[987,1190,1158],{"emptyLinePlaceholder":1157},[987,1192,1194,1197,1199],{"class":989,"line":1193},13,[987,1195,1196],{"class":1046},"    position",[987,1198,1043],{"class":993},[987,1200,1201],{"class":1073}," str\n",[987,1203,1205,1208,1210],{"class":989,"line":1204},14,[987,1206,1207],{"class":1046},"    sub_position",[987,1209,1043],{"class":993},[987,1211,1212],{"class":1046}," PositionIndex\n",[789,1214,1216],{"id":1215},"command-vs-property-data-types","Command vs Property Data Types",[756,1218,1219],{},"In addition to the basic data types, SiLA Commands may also return tuples of values. Per the SiLA 2 Standard, Commands may return multiple values, while Properties may only return a single value. This means that if you want to return multiple values from a Property, you will need to define a complex structure to wrap those values.",[756,1221,1222],{},"When defining a Command that returns multiple values, you can simply return a tuple of those values. Each value returned should be annotated in the docstring of the method with a name and description to make it clear to the user what each value represents. For example:",[978,1224,1226],{"className":980,"code":1225,"language":982,"meta":983,"style":983},"@sila.UnobservableCommand()\nasync def echo_string_and_integer(self, my_string: str, my_integer: int) -> tuple[str, int]:\n    \"\"\"\n    Echo a string and an integer value.\n\n    Args:\n      MyString: A string value.\n      MyInteger: An integer value.\n\n    Returns:\n      EchoString: The string value that was provided as `my_string`.\n      EchoInteger: The integer value that was provided as `my_integer`.\n    \"\"\"\n    return my_string, my_integer\n",[824,1227,1228,1240,1294,1298,1303,1307,1312,1317,1322,1326,1331,1336,1341,1345],{"__ignoreMap":983},[987,1229,1230,1232,1234,1236,1238],{"class":989,"line":990},[987,1231,994],{"class":993},[987,1233,998],{"class":997},[987,1235,1001],{"class":993},[987,1237,1004],{"class":997},[987,1239,1007],{"class":993},[987,1241,1242,1244,1246,1249,1252,1255,1258,1261,1263,1265,1267,1270,1272,1275,1277,1279,1282,1285,1287,1289,1291],{"class":989,"line":1010},[987,1243,1014],{"class":1013},[987,1245,1017],{"class":1013},[987,1247,1248],{"class":997}," echo_string_and_integer",[987,1250,1251],{"class":993},"(",[987,1253,1254],{"class":1029},"self",[987,1256,1257],{"class":993},",",[987,1259,1260],{"class":1039}," my_string",[987,1262,1043],{"class":993},[987,1264,1074],{"class":1073},[987,1266,1257],{"class":993},[987,1268,1269],{"class":1039}," my_integer",[987,1271,1043],{"class":993},[987,1273,1274],{"class":1073}," int",[987,1276,1094],{"class":993},[987,1278,1097],{"class":993},[987,1280,1281],{"class":1046}," tuple",[987,1283,1284],{"class":993},"[",[987,1286,826],{"class":1073},[987,1288,1257],{"class":993},[987,1290,1274],{"class":1073},[987,1292,1293],{"class":993},"]:\n",[987,1295,1296],{"class":989,"line":1026},[987,1297,1141],{"class":1140},[987,1299,1300],{"class":989,"line":1036},[987,1301,1302],{"class":1146},"    Echo a string and an integer value.\n",[987,1304,1305],{"class":989,"line":1052},[987,1306,1158],{"emptyLinePlaceholder":1157},[987,1308,1309],{"class":989,"line":1065},[987,1310,1311],{"class":1146},"    Args:\n",[987,1313,1314],{"class":989,"line":1079},[987,1315,1316],{"class":1146},"      MyString: A string value.\n",[987,1318,1319],{"class":989,"line":1091},[987,1320,1321],{"class":1146},"      MyInteger: An integer value.\n",[987,1323,1324],{"class":989,"line":1171},[987,1325,1158],{"emptyLinePlaceholder":1157},[987,1327,1328],{"class":989,"line":1177},[987,1329,1330],{"class":1146},"    Returns:\n",[987,1332,1333],{"class":989,"line":1183},[987,1334,1335],{"class":1146},"      EchoString: The string value that was provided as `my_string`.\n",[987,1337,1338],{"class":989,"line":1188},[987,1339,1340],{"class":1146},"      EchoInteger: The integer value that was provided as `my_integer`.\n",[987,1342,1343],{"class":989,"line":1193},[987,1344,1141],{"class":1140},[987,1346,1347,1350,1352,1354],{"class":989,"line":1204},[987,1348,1349],{"class":1140},"    return",[987,1351,1260],{"class":1046},[987,1353,1257],{"class":993},[987,1355,1356],{"class":1046}," my_integer\n",[789,1358,1360],{"id":1359},"constraints","Constraints",[756,1362,1363],{},"Each of the basic data types can be further constrained by the addition of Constraints to the type hint. Constraints are a way to specify limitations on the values that can be accepted for a given parameter or return value. For example, you may want to specify that an integer parameter must be within a certain range, or that a string parameter must match a certain regex pattern.",[756,1365,1366],{},"The basic data types and their respective constraints are as follows:",[797,1368,1369,1380],{},[800,1370,1371],{},[803,1372,1373,1375,1378],{},[806,1374,808],{},[806,1376,1377],{},"Python Native Type",[806,1379,1360],{},[813,1381,1382,1408,1434,1461,1483,1503,1523,1543],{},[803,1383,1384,1386,1390],{},[818,1385,831],{},[818,1387,1388],{},[824,1389,836],{},[818,1391,1392,1395,1396,1395,1399,1395,1402,1395,1405],{},[824,1393,1394],{},"ContentType",", ",[824,1397,1398],{},"Length",[824,1400,1401],{},"MinimalLength",[824,1403,1404],{},"MaximalLength",[824,1406,1407],{},"Schema",[803,1409,1410,1412,1416],{},[818,1411,820],{},[818,1413,1414],{},[824,1415,826],{},[818,1417,1418,1395,1420,1395,1422,1395,1424,1395,1426,1395,1428,1395,1431],{},[824,1419,1394],{},[824,1421,1398],{},[824,1423,1401],{},[824,1425,1404],{},[824,1427,1407],{},[824,1429,1430],{},"Pattern",[824,1432,1433],{},"Set",[803,1435,1436,1438,1442],{},[818,1437,841],{},[818,1439,1440],{},[824,1441,846],{},[818,1443,1444,1395,1447,1395,1450,1395,1453,1395,1456,1395,1458],{},[824,1445,1446],{},"MinimalInclusive",[824,1448,1449],{},"MaximalInclusive",[824,1451,1452],{},"MinimalExclusive",[824,1454,1455],{},"MaximalExclusive",[824,1457,1433],{},[824,1459,1460],{},"Unit",[803,1462,1463,1465,1469],{},[818,1464,851],{},[818,1466,1467],{},[824,1468,856],{},[818,1470,1471,1395,1473,1395,1475,1395,1477,1395,1479,1395,1481],{},[824,1472,1446],{},[824,1474,1449],{},[824,1476,1452],{},[824,1478,1455],{},[824,1480,1433],{},[824,1482,1460],{},[803,1484,1485,1487,1491],{},[818,1486,881],{},[818,1488,1489],{},[824,1490,886],{},[818,1492,1493,1395,1495,1395,1497,1395,1499,1395,1501],{},[824,1494,1446],{},[824,1496,1449],{},[824,1498,1452],{},[824,1500,1455],{},[824,1502,1433],{},[803,1504,1505,1507,1511],{},[818,1506,871],{},[818,1508,1509],{},[824,1510,876],{},[818,1512,1513,1395,1515,1395,1517,1395,1519,1395,1521],{},[824,1514,1446],{},[824,1516,1449],{},[824,1518,1452],{},[824,1520,1455],{},[824,1522,1433],{},[803,1524,1525,1527,1531],{},[818,1526,891],{},[818,1528,1529],{},[824,1530,896],{},[818,1532,1533,1395,1535,1395,1537,1395,1539,1395,1541],{},[824,1534,1446],{},[824,1536,1449],{},[824,1538,1452],{},[824,1540,1455],{},[824,1542,1433],{},[803,1544,1545,1547,1551],{},[818,1546,920],{},[818,1548,1549],{},[824,1550,925],{},[818,1552,1553,1395,1556,1257,1559],{},[824,1554,1555],{},"ElementCount",[824,1557,1558],{},"MinimalElementCount",[824,1560,1561],{},"MaximalElementCount",[756,1563,1564],{},"We can also enforce limitations on standard data types through the addition of Constraint annotations to our type-hints.",[756,1566,1567],{},"Let's say that we have a function that takes a string input:",[978,1569,1571],{"className":980,"code":1570,"language":982,"meta":983,"style":983},"def my_func(input: string) -> None:\n    if input == \"a\":\n        do_a()\n    elif input == \"b\":\n        do_b()\n",[824,1572,1573,1597,1619,1626,1644],{"__ignoreMap":983},[987,1574,1575,1578,1581,1583,1585,1587,1590,1592,1594],{"class":989,"line":990},[987,1576,1577],{"class":1013},"def",[987,1579,1580],{"class":997}," my_func",[987,1582,1251],{"class":993},[987,1584,451],{"class":1039},[987,1586,1043],{"class":993},[987,1588,1589],{"class":1046}," string",[987,1591,1094],{"class":993},[987,1593,1097],{"class":993},[987,1595,1596],{"class":993}," None:\n",[987,1598,1599,1602,1605,1608,1611,1614,1617],{"class":989,"line":1010},[987,1600,1601],{"class":1140},"    if",[987,1603,1604],{"class":997}," input",[987,1606,1607],{"class":993}," ==",[987,1609,1610],{"class":993}," \"",[987,1612,766],{"class":1613},"sfazB",[987,1615,1616],{"class":993},"\"",[987,1618,1102],{"class":993},[987,1620,1621,1624],{"class":989,"line":1026},[987,1622,1623],{"class":997},"        do_a",[987,1625,1007],{"class":993},[987,1627,1628,1631,1633,1635,1637,1640,1642],{"class":989,"line":1036},[987,1629,1630],{"class":1140},"    elif",[987,1632,1604],{"class":997},[987,1634,1607],{"class":993},[987,1636,1610],{"class":993},[987,1638,1639],{"class":1613},"b",[987,1641,1616],{"class":993},[987,1643,1102],{"class":993},[987,1645,1646,1649],{"class":989,"line":1052},[987,1647,1648],{"class":997},"        do_b",[987,1650,1007],{"class":993},[756,1652,1653,1654,1656,1657,1660],{},"Here we only have two valid ",[824,1655,451],{}," values, so we might want to limit the inputs that a user can provide to this function. With constraints this is simply a matter of wrapping the current parameter type-hint in ",[824,1658,1659],{},"typing.Annotated"," and adding as many constraints as desired.",[978,1662,1664],{"className":980,"code":1663,"language":982,"meta":983,"style":983},"def my_func(\n  input: typing.Annotated[str, sila.constraints.Set([\"a\", \"b\"])]\n) -> None:\n  ...\n",[824,1665,1666,1674,1727,1735],{"__ignoreMap":983},[987,1667,1668,1670,1672],{"class":989,"line":990},[987,1669,1577],{"class":1013},[987,1671,1580],{"class":997},[987,1673,1023],{"class":993},[987,1675,1676,1679,1681,1684,1686,1690,1692,1694,1696,1699,1701,1703,1705,1707,1710,1712,1714,1716,1718,1720,1722,1724],{"class":989,"line":1010},[987,1677,1678],{"class":1039},"  input",[987,1680,1043],{"class":993},[987,1682,1683],{"class":1046}," typing",[987,1685,1001],{"class":993},[987,1687,1689],{"class":1688},"swJcz","Annotated",[987,1691,1284],{"class":993},[987,1693,826],{"class":1073},[987,1695,1257],{"class":993},[987,1697,1698],{"class":1688}," sila",[987,1700,1001],{"class":993},[987,1702,1359],{"class":1688},[987,1704,1001],{"class":993},[987,1706,1433],{"class":997},[987,1708,1709],{"class":993},"([",[987,1711,1616],{"class":993},[987,1713,766],{"class":1613},[987,1715,1616],{"class":993},[987,1717,1257],{"class":993},[987,1719,1610],{"class":993},[987,1721,1639],{"class":1613},[987,1723,1616],{"class":993},[987,1725,1726],{"class":993},"])]\n",[987,1728,1729,1731,1733],{"class":989,"line":1026},[987,1730,1094],{"class":993},[987,1732,1097],{"class":993},[987,1734,1596],{"class":993},[987,1736,1737],{"class":989,"line":1036},[987,1738,1739],{"class":1046},"  ...\n",[756,1741,1742,1743,1001],{},"Now any value supplied which is not \"a\" or \"b\" will automatically raise a ",[824,1744,1745],{},"ValidationError",[756,1747,1748,1749,1751,1752,1755,1756,1043],{},"Constraints can be used in SiLA endpoints directly as part of the parameter type hinting or can be built into ",[824,1750,954],{},"s, like the ",[824,1753,1754],{},"PositionIndex"," from the ",[824,1757,975],{},[978,1759,1761],{"className":980,"code":1760,"language":982,"meta":983,"style":983},"@dataclasses.dataclass\nclass PositionIndex:\n    \"\"\"Specifies a position via an index number, starting at 1.\n\n    Attributes:\n      PositionIndex: A number indicating the position's index, starting at 1.\n    \"\"\"\n\n    position_index: typing.Annotated[int, sila.constraints.MinimalInclusive(value=1)]\n",[824,1762,1763,1773,1781,1789,1793,1797,1802,1806,1810],{"__ignoreMap":983},[987,1764,1765,1767,1769,1771],{"class":989,"line":990},[987,1766,994],{"class":993},[987,1768,1121],{"class":997},[987,1770,1001],{"class":993},[987,1772,1126],{"class":997},[987,1774,1775,1777,1779],{"class":989,"line":1010},[987,1776,1131],{"class":1013},[987,1778,1060],{"class":1073},[987,1780,1102],{"class":993},[987,1782,1783,1786],{"class":989,"line":1026},[987,1784,1785],{"class":1140},"    \"\"\"",[987,1787,1788],{"class":1146},"Specifies a position via an index number, starting at 1.\n",[987,1790,1791],{"class":989,"line":1036},[987,1792,1158],{"emptyLinePlaceholder":1157},[987,1794,1795],{"class":989,"line":1052},[987,1796,1163],{"class":1146},[987,1798,1799],{"class":989,"line":1065},[987,1800,1801],{"class":1146},"      PositionIndex: A number indicating the position's index, starting at 1.\n",[987,1803,1804],{"class":989,"line":1079},[987,1805,1141],{"class":1140},[987,1807,1808],{"class":989,"line":1091},[987,1809,1158],{"emptyLinePlaceholder":1157},[987,1811,1812,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1844,1847,1851],{"class":989,"line":1171},[987,1813,1814],{"class":1046},"    position_index",[987,1816,1043],{"class":993},[987,1818,1683],{"class":1046},[987,1820,1001],{"class":993},[987,1822,1689],{"class":1688},[987,1824,1284],{"class":993},[987,1826,846],{"class":1073},[987,1828,1257],{"class":993},[987,1830,1698],{"class":1688},[987,1832,1001],{"class":993},[987,1834,1359],{"class":1688},[987,1836,1001],{"class":993},[987,1838,1446],{"class":997},[987,1840,1251],{"class":993},[987,1842,1843],{"class":1039},"value",[987,1845,1846],{"class":993},"=",[987,1848,1850],{"class":1849},"sbssI","1",[987,1852,1853],{"class":993},")]\n",[756,1855,1856],{},"Constraints come with pre-existing validations that are applied automatically before submission when data is provided by end-users.",[756,1858,1859,1860,1865,1866,1001],{},"Read up on available constraints in the installed ",[766,1861,1864],{"href":1862,"rel":1863,"target":771},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fsila2\u002Fsila-python\u002F-\u002Ftree\u002Fmain\u002Fsrc\u002Fsila\u002Fframework\u002Fconstraints",[770],"Python SiLA library"," or in the ",[766,1867,1870],{"href":1868,"rel":1869,"target":771},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1nGGEwbx45ZpKeKYH18VnNysREbr1EXH6FqlCo03yASM\u002Fedit?tab=t.0#heading=h.bqqrpk93qnmv",[770],"SiLA2 Core Specification",[951,1872,1874],{"id":1873},"runtime-constraints","Runtime Constraints",[756,1876,1877,1878,1881,1882,1885,1886,1889],{},"Sometimes the valid constraints for a command parameter or return value depend on the specific device, and may vary across different configurations of the same device.\nConsider for example a robotic arm that comes in different configurations which have different reach ranges.\nInstead of writing different features or endpoints for each of these configurations, we can query an endpoint on the machine, and then dynamically set the constraints during the connector's startup.\nThis can be achieved by using two methods of the ",[824,1879,1880],{},"sila.Feature"," class: the ",[824,1883,1884],{},"on_before_start"," hook and the ",[824,1887,1888],{},"add_constraint"," method:",[978,1891,1893],{"className":980,"code":1892,"language":982,"meta":983,"style":983},"from ..io import get_device_range # a helper method in your io layer that retrieves the range from the device\n\nclass ArmMovementController(sila.Feature):\n\n    @typing.override\n    async def on_before_start(self) -> None:\n        min_range, max_range = await get_device_range()\n        self.add_constraint(\n            self.move_absolute,\n            \"position\",\n            [\n                sila.constraints.MinimalInclusive(min_range),\n                sila.constraints.MaximalInclusive(max_range),\n            ]\n        )\n\n    @sila.UnobservableCommand()\n    async def move_absolute(self, position: int) -> None:\n        \"\"\"\n        Move the arm on the x-axis.\n\n        Args:\n          Position: Where to move the arm to\n        \"\"\"\n        ...\n",[824,1894,1895,1915,1919,1937,1941,1954,1974,1994,2005,2017,2029,2034,2055,2074,2079,2085,2090,2103,2132,2138,2144,2149,2155,2161,2166],{"__ignoreMap":983},[987,1896,1897,1900,1903,1906,1909,1912],{"class":989,"line":990},[987,1898,1899],{"class":1140},"from",[987,1901,1902],{"class":993}," ..",[987,1904,1905],{"class":1046},"io ",[987,1907,1908],{"class":1140},"import",[987,1910,1911],{"class":1046}," get_device_range ",[987,1913,1914],{"class":1146},"# a helper method in your io layer that retrieves the range from the device\n",[987,1916,1917],{"class":989,"line":1010},[987,1918,1158],{"emptyLinePlaceholder":1157},[987,1920,1921,1923,1926,1928,1930,1932,1934],{"class":989,"line":1026},[987,1922,1131],{"class":1013},[987,1924,1925],{"class":1073}," ArmMovementController",[987,1927,1251],{"class":993},[987,1929,998],{"class":1073},[987,1931,1001],{"class":993},[987,1933,698],{"class":1073},[987,1935,1936],{"class":993},"):\n",[987,1938,1939],{"class":989,"line":1036},[987,1940,1158],{"emptyLinePlaceholder":1157},[987,1942,1943,1946,1949,1951],{"class":989,"line":1052},[987,1944,1945],{"class":993},"    @",[987,1947,1948],{"class":997},"typing",[987,1950,1001],{"class":993},[987,1952,1953],{"class":997},"override\n",[987,1955,1956,1959,1961,1964,1966,1968,1970,1972],{"class":989,"line":1065},[987,1957,1958],{"class":1013},"    async",[987,1960,1017],{"class":1013},[987,1962,1963],{"class":997}," on_before_start",[987,1965,1251],{"class":993},[987,1967,1254],{"class":1029},[987,1969,1094],{"class":993},[987,1971,1097],{"class":993},[987,1973,1596],{"class":993},[987,1975,1976,1979,1981,1984,1986,1989,1992],{"class":989,"line":1079},[987,1977,1978],{"class":1046},"        min_range",[987,1980,1257],{"class":993},[987,1982,1983],{"class":1046}," max_range ",[987,1985,1846],{"class":993},[987,1987,1988],{"class":1140}," await",[987,1990,1991],{"class":997}," get_device_range",[987,1993,1007],{"class":993},[987,1995,1996,1999,2001,2003],{"class":989,"line":1091},[987,1997,1998],{"class":1046},"        self",[987,2000,1001],{"class":993},[987,2002,1888],{"class":997},[987,2004,1023],{"class":993},[987,2006,2007,2010,2012,2015],{"class":989,"line":1171},[987,2008,2009],{"class":1046},"            self",[987,2011,1001],{"class":993},[987,2013,2014],{"class":1688},"move_absolute",[987,2016,1033],{"class":993},[987,2018,2019,2022,2025,2027],{"class":989,"line":1177},[987,2020,2021],{"class":993},"            \"",[987,2023,2024],{"class":1613},"position",[987,2026,1616],{"class":993},[987,2028,1033],{"class":993},[987,2030,2031],{"class":989,"line":1183},[987,2032,2033],{"class":993},"            [\n",[987,2035,2036,2039,2041,2043,2045,2047,2049,2052],{"class":989,"line":1188},[987,2037,2038],{"class":997},"                sila",[987,2040,1001],{"class":993},[987,2042,1359],{"class":1688},[987,2044,1001],{"class":993},[987,2046,1446],{"class":997},[987,2048,1251],{"class":993},[987,2050,2051],{"class":997},"min_range",[987,2053,2054],{"class":993},"),\n",[987,2056,2057,2059,2061,2063,2065,2067,2069,2072],{"class":989,"line":1193},[987,2058,2038],{"class":997},[987,2060,1001],{"class":993},[987,2062,1359],{"class":1688},[987,2064,1001],{"class":993},[987,2066,1449],{"class":997},[987,2068,1251],{"class":993},[987,2070,2071],{"class":997},"max_range",[987,2073,2054],{"class":993},[987,2075,2076],{"class":989,"line":1204},[987,2077,2078],{"class":993},"            ]\n",[987,2080,2082],{"class":989,"line":2081},15,[987,2083,2084],{"class":993},"        )\n",[987,2086,2088],{"class":989,"line":2087},16,[987,2089,1158],{"emptyLinePlaceholder":1157},[987,2091,2093,2095,2097,2099,2101],{"class":989,"line":2092},17,[987,2094,1945],{"class":993},[987,2096,998],{"class":997},[987,2098,1001],{"class":993},[987,2100,1004],{"class":997},[987,2102,1007],{"class":993},[987,2104,2106,2108,2110,2113,2115,2117,2119,2122,2124,2126,2128,2130],{"class":989,"line":2105},18,[987,2107,1958],{"class":1013},[987,2109,1017],{"class":1013},[987,2111,2112],{"class":997}," move_absolute",[987,2114,1251],{"class":993},[987,2116,1254],{"class":1029},[987,2118,1257],{"class":993},[987,2120,2121],{"class":1039}," position",[987,2123,1043],{"class":993},[987,2125,1274],{"class":1073},[987,2127,1094],{"class":993},[987,2129,1097],{"class":993},[987,2131,1596],{"class":993},[987,2133,2135],{"class":989,"line":2134},19,[987,2136,2137],{"class":1140},"        \"\"\"\n",[987,2139,2141],{"class":989,"line":2140},20,[987,2142,2143],{"class":1146},"        Move the arm on the x-axis.\n",[987,2145,2147],{"class":989,"line":2146},21,[987,2148,1158],{"emptyLinePlaceholder":1157},[987,2150,2152],{"class":989,"line":2151},22,[987,2153,2154],{"class":1146},"        Args:\n",[987,2156,2158],{"class":989,"line":2157},23,[987,2159,2160],{"class":1146},"          Position: Where to move the arm to\n",[987,2162,2164],{"class":989,"line":2163},24,[987,2165,2137],{"class":1140},[987,2167,2169],{"class":989,"line":2168},25,[987,2170,2171],{"class":1046},"        ...\n",[756,2173,2174,2175,2177,2178,2180,2181,1001],{},"After startup, the ",[824,2176,2014],{}," command will be visible to a SiLA client with the constraints of ",[824,2179,2051],{}," and ",[824,2182,2071],{},[789,2184,2186],{"id":2185},"enumerations","Enumerations",[756,2188,2189,2190,2193,2194,2196,2197,2199],{},"For convenience, the CDK also supports the use of python ",[824,2191,2192],{},"Enum"," classes as a way to define a set of valid values for a given parameter or return value. This is particularly useful for parameters that can only take on a limited set of values, such as a parameter that specifies the mode of operation for a device. To use an ",[824,2195,2192],{}," as a type hint, simply define your ",[824,2198,2192],{}," class and use it as the type hint for your parameter or return value. For example:",[978,2201,2203],{"className":980,"code":2202,"language":982,"meta":983,"style":983},"from enum import IntEnum\n\nclass OperationMode(IntEnum):\n    MODE_A = 0\n    MODE_B = 1\n    MODE_C = 2\n\n@sila.UnobservableCommand()\nasync def set_operation_mode(self, mode: OperationMode) -> int:\n    \"\"\"\n    Set the operation mode for the device.\n\n    Args:\n      Mode: The operation mode to set for the device.\n    \"\"\"\n    return mode.value\n",[824,2204,2205,2217,2221,2235,2245,2255,2265,2269,2281,2311,2315,2320,2324,2328,2333,2337],{"__ignoreMap":983},[987,2206,2207,2209,2212,2214],{"class":989,"line":990},[987,2208,1899],{"class":1140},[987,2210,2211],{"class":1046}," enum ",[987,2213,1908],{"class":1140},[987,2215,2216],{"class":1046}," IntEnum\n",[987,2218,2219],{"class":989,"line":1010},[987,2220,1158],{"emptyLinePlaceholder":1157},[987,2222,2223,2225,2228,2230,2233],{"class":989,"line":1026},[987,2224,1131],{"class":1013},[987,2226,2227],{"class":1073}," OperationMode",[987,2229,1251],{"class":993},[987,2231,2232],{"class":1073},"IntEnum",[987,2234,1936],{"class":993},[987,2236,2237,2240,2242],{"class":989,"line":1036},[987,2238,2239],{"class":1046},"    MODE_A ",[987,2241,1846],{"class":993},[987,2243,2244],{"class":1849}," 0\n",[987,2246,2247,2250,2252],{"class":989,"line":1052},[987,2248,2249],{"class":1046},"    MODE_B ",[987,2251,1846],{"class":993},[987,2253,2254],{"class":1849}," 1\n",[987,2256,2257,2260,2262],{"class":989,"line":1065},[987,2258,2259],{"class":1046},"    MODE_C ",[987,2261,1846],{"class":993},[987,2263,2264],{"class":1849}," 2\n",[987,2266,2267],{"class":989,"line":1079},[987,2268,1158],{"emptyLinePlaceholder":1157},[987,2270,2271,2273,2275,2277,2279],{"class":989,"line":1091},[987,2272,994],{"class":993},[987,2274,998],{"class":997},[987,2276,1001],{"class":993},[987,2278,1004],{"class":997},[987,2280,1007],{"class":993},[987,2282,2283,2285,2287,2290,2292,2294,2296,2299,2301,2303,2305,2307,2309],{"class":989,"line":1171},[987,2284,1014],{"class":1013},[987,2286,1017],{"class":1013},[987,2288,2289],{"class":997}," set_operation_mode",[987,2291,1251],{"class":993},[987,2293,1254],{"class":1029},[987,2295,1257],{"class":993},[987,2297,2298],{"class":1039}," mode",[987,2300,1043],{"class":993},[987,2302,2227],{"class":1046},[987,2304,1094],{"class":993},[987,2306,1097],{"class":993},[987,2308,1274],{"class":1073},[987,2310,1102],{"class":993},[987,2312,2313],{"class":989,"line":1177},[987,2314,1141],{"class":1140},[987,2316,2317],{"class":989,"line":1183},[987,2318,2319],{"class":1146},"    Set the operation mode for the device.\n",[987,2321,2322],{"class":989,"line":1188},[987,2323,1158],{"emptyLinePlaceholder":1157},[987,2325,2326],{"class":989,"line":1193},[987,2327,1311],{"class":1146},[987,2329,2330],{"class":989,"line":1204},[987,2331,2332],{"class":1146},"      Mode: The operation mode to set for the device.\n",[987,2334,2335],{"class":989,"line":2081},[987,2336,1141],{"class":1140},[987,2338,2339,2341,2343,2345],{"class":989,"line":2087},[987,2340,1349],{"class":1140},[987,2342,2298],{"class":1046},[987,2344,1001],{"class":993},[987,2346,2347],{"class":1688},"value\n",[756,2349,2350,2351,2353,2354,2357,2358,2361],{},"Enumerations in the CDK are automatically converted to strings with a ",[824,2352,1433],{}," constraints. The names of the Enum members are lowercased and separated by the ",[824,2355,2356],{},"_"," character to generate the user-facing string values. In the above example, the valid input values for the ",[824,2359,2360],{},"mode"," parameter would be \"mode a\", \"mode b\", and \"mode c\".",[2363,2364,2365],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s5tWE, html code.shiki .s5tWE{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#F07178;--shiki-default-font-style:italic;--shiki-dark:#F07178;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .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}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":983,"searchDepth":990,"depth":1010,"links":2367},[2368,2369,2372,2373,2376],{"id":791,"depth":1010,"text":792},{"id":899,"depth":1010,"text":900,"children":2370},[2371],{"id":953,"depth":1026,"text":954},{"id":1215,"depth":1010,"text":1216},{"id":1359,"depth":1010,"text":1360,"children":2374},[2375],{"id":1873,"depth":1026,"text":1874},{"id":2185,"depth":1010,"text":2186},"Introduction to the basic data types in SiLA and their constraints.","md",null,{},{"title":694,"description":2377},"WXcgB-EO7pHzBQHFKWcbFLLPPPV271_T0Xa-Gtbe7UI",[2384,2386],{"title":690,"path":691,"stem":692,"description":2385},"Triggering actions on a device.",{"title":698,"path":699,"stem":700,"description":2387},"What is a feature and how to create one.",1783607810480]