[{"data":1,"prerenderedAt":1738},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fintegrate\u002Faction":909,"\u002Fconcepts\u002Fintegrate\u002Faction-surround":1733},[4,59,188,271,445,591,760,791],{"title":5,"type":6,"device":6,"path":7,"stem":8,"children":9,"page":41},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,15,42,47,51,55],{"title":11,"path":12,"stem":13,"type":14,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome","landing",{"title":16,"type":6,"device":6,"path":17,"stem":18,"children":19,"page":41},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[20,25,29,33,37],{"title":21,"path":22,"stem":23,"type":24,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access","howto",{"title":26,"path":27,"stem":28,"type":24,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":30,"path":31,"stem":32,"type":24,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":34,"path":35,"stem":36,"type":24,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":38,"path":39,"stem":40,"type":24,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",false,{"title":43,"path":44,"stem":45,"type":46,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device","tutorial",{"title":48,"path":49,"stem":50,"type":46,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":52,"path":53,"stem":54,"type":46,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":56,"path":57,"stem":58,"type":6,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":60,"type":6,"device":6,"path":61,"stem":62,"children":63,"page":41},"How-to","\u002Fhow-to\u002F","02.how-to",[64,118,163,180],{"title":65,"type":6,"device":6,"path":66,"stem":67,"children":68,"page":41},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[69,102],{"title":70,"type":6,"device":6,"path":71,"stem":72,"children":73,"page":41},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[74,78,82,86,90,94,98],{"title":75,"path":76,"stem":77,"type":24,"device":6},"Connector Configuration","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":79,"path":80,"stem":81,"type":24,"device":6},"With an executable","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":83,"path":84,"stem":85,"type":24,"device":6},"From source","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":87,"path":88,"stem":89,"type":24,"device":6},"Build your own","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":91,"path":92,"stem":93,"type":24,"device":6},"Headless install","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":95,"path":96,"stem":97,"type":24,"device":6},"Raspberry Pi","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":99,"path":100,"stem":101,"type":24,"device":6},"Multi-device Networking","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fmultiple-devices\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F60.multiple-devices",{"title":103,"type":6,"device":6,"path":104,"stem":105,"children":106,"page":41},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[107,110,114],{"title":26,"path":108,"stem":109,"type":24,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":111,"path":112,"stem":113,"type":24,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":115,"path":116,"stem":117,"type":24,"device":6},"UniteLabs SDK & REST API","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fpython\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F30.python",{"title":119,"type":6,"device":6,"path":120,"stem":121,"children":122,"page":41},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[123,127,131,135,139,143,147,151,155,159],{"title":124,"path":125,"stem":126,"type":24,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":128,"path":129,"stem":130,"type":24,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":132,"path":133,"stem":134,"type":24,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":136,"path":137,"stem":138,"type":24,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":140,"path":141,"stem":142,"type":24,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":144,"path":145,"stem":146,"type":24,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":148,"path":149,"stem":150,"type":24,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":152,"path":153,"stem":154,"type":24,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":156,"path":157,"stem":158,"type":24,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":160,"path":161,"stem":162,"type":24,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":164,"type":6,"device":6,"path":165,"stem":166,"children":167,"page":41},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[168,172,176],{"title":169,"path":170,"stem":171,"type":24,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":173,"path":174,"stem":175,"type":24,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":177,"path":178,"stem":179,"type":24,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":111,"type":6,"device":6,"path":181,"stem":182,"children":183,"page":41},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[184],{"title":185,"path":186,"stem":187,"type":24,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":189,"type":6,"device":6,"path":190,"stem":191,"children":192},"Technical Reference","\u002Ftechnical-reference\u002F","03.technical-reference",[193,196,201,213,226,235,244,253,262],{"title":194,"path":190,"stem":195,"type":14,"device":6},"Overview","03.technical-reference\u002Findex",{"title":197,"path":198,"stem":199,"type":200,"device":6},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","03.technical-reference\u002F01.rest-api","reference",{"title":119,"type":6,"device":6,"path":202,"stem":203,"children":204,"page":41},"\u002Ftechnical-reference\u002Fautomate\u002F","03.technical-reference\u002F07.automate",[205,209],{"title":206,"path":207,"stem":208,"type":200,"device":6},"Workflow template","\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template\u002F","03.technical-reference\u002F07.automate\u002F05.workflow-template",{"title":210,"path":211,"stem":212,"type":200,"device":6},"Workflows REST API","\u002Ftechnical-reference\u002Fautomate\u002Fworkflows-api\u002F","03.technical-reference\u002F07.automate\u002F80.workflows-api",{"title":26,"type":6,"device":6,"path":214,"stem":215,"children":216},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","03.technical-reference\u002F10.groundcontrol\u002Findex",[217,218,222],{"title":194,"path":214,"stem":215,"type":14,"device":6},{"title":219,"path":220,"stem":221,"type":200,"device":6},"Network requirements","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fnetwork-requirements\u002F","03.technical-reference\u002F10.groundcontrol\u002F10.network-requirements",{"title":223,"path":224,"stem":225,"type":200,"device":6},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","03.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":227,"type":6,"device":6,"path":228,"stem":229,"children":230},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","03.technical-reference\u002F20.python-sdk\u002Findex",[231,232],{"title":194,"path":228,"stem":229,"type":14,"device":6},{"title":223,"path":233,"stem":234,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","03.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":236,"type":6,"device":6,"path":237,"stem":238,"children":239},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002Findex",[240,241],{"title":194,"path":237,"stem":238,"type":14,"device":6},{"title":223,"path":242,"stem":243,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":245,"type":6,"device":6,"path":246,"stem":247,"children":248},"Labware","\u002Ftechnical-reference\u002Flabware\u002F","03.technical-reference\u002F40.labware\u002Findex",[249,250],{"title":194,"path":246,"stem":247,"type":14,"device":6},{"title":223,"path":251,"stem":252,"type":200,"device":6},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","03.technical-reference\u002F40.labware\u002F20.changelog",{"title":254,"type":6,"device":6,"path":255,"stem":256,"children":257},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","03.technical-reference\u002F50.python-omnibus\u002Findex",[258,259],{"title":194,"path":255,"stem":256,"type":14,"device":6},{"title":223,"path":260,"stem":261,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","03.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":263,"type":6,"device":6,"path":264,"stem":265,"children":266},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","03.technical-reference\u002F60.python-cdk\u002Findex",[267,268],{"title":194,"path":264,"stem":265,"type":14,"device":6},{"title":223,"path":269,"stem":270,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","03.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":272,"type":6,"device":6,"path":273,"stem":274,"children":275,"page":41},"Concepts","\u002Fconcepts\u002F","04.concepts",[276,315,339,383,422],{"title":277,"type":6,"device":6,"path":278,"stem":279,"children":280,"page":41},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[281,286,290],{"title":282,"path":283,"stem":284,"type":285,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code","explanation",{"title":287,"path":288,"stem":289,"type":285,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":291,"type":6,"device":6,"path":292,"stem":293,"children":294,"page":41},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[295,299,303,307,311],{"title":296,"path":297,"stem":298,"type":285,"device":6},"Instrument Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Flow-level-instrument-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":300,"path":301,"stem":302,"type":285,"device":6},"Multi-device Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fmulti-device-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F20.multi-device-control",{"title":304,"path":305,"stem":306,"type":285,"device":6},"Workflow Orchestration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fworkflow-orchestration\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F30.workflow-orchestration",{"title":308,"path":309,"stem":310,"type":285,"device":6},"Custom Apps and LIMS Integration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fcustom-apps-lims\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F40.custom-apps-lims",{"title":312,"path":313,"stem":314,"type":285,"device":6},"Scale and Fleet Management","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fscale-and-fleet\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F50.scale-and-fleet",{"title":65,"type":6,"device":6,"path":316,"stem":317,"children":318,"page":41},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[319,323,327,331,335],{"title":320,"path":321,"stem":322,"type":285,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":324,"path":325,"stem":326,"type":285,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":328,"path":329,"stem":330,"type":285,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":332,"path":333,"stem":334,"type":285,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":336,"path":337,"stem":338,"type":285,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":340,"type":6,"device":6,"path":341,"stem":342,"children":343,"page":41},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[344,348,352,356,359,363,367,371,375,379],{"title":345,"path":346,"stem":347,"type":285,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":349,"path":350,"stem":351,"type":285,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":353,"path":354,"stem":355,"type":285,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":245,"path":357,"stem":358,"type":285,"device":6},"\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":360,"path":361,"stem":362,"type":285,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":364,"path":365,"stem":366,"type":285,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":368,"path":369,"stem":370,"type":285,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":372,"path":373,"stem":374,"type":285,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":376,"path":377,"stem":378,"type":285,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":380,"path":381,"stem":382,"type":285,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":119,"type":6,"device":6,"path":384,"stem":385,"children":386,"page":41},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[387,391,395,399,403,407,411,415,419],{"title":388,"path":389,"stem":390,"type":285,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":392,"path":393,"stem":394,"type":285,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":396,"path":397,"stem":398,"type":285,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":400,"path":401,"stem":402,"type":285,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":404,"path":405,"stem":406,"type":285,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":408,"path":409,"stem":410,"type":285,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":412,"path":413,"stem":414,"type":285,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":416,"path":417,"stem":418,"type":285,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":380,"path":420,"stem":421,"type":285,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":164,"type":6,"device":6,"path":423,"stem":424,"children":425,"page":41},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[426,429,433,437,441],{"title":194,"path":427,"stem":428,"type":14,"device":6},"\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":430,"path":431,"stem":432,"type":285,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":434,"path":435,"stem":436,"type":285,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":438,"path":439,"stem":440,"type":285,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":442,"path":443,"stem":444,"type":285,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":446,"type":6,"device":6,"path":447,"stem":448,"children":449,"page":41},"Devices","\u002Fdevices\u002F","05.devices",[450,453,501,514,530,567],{"title":194,"path":451,"stem":452,"type":14,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":454,"path":455,"page":41,"children":456},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[457,478,488],{"title":458,"path":459,"stem":460,"type":200,"device":461},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":462,"vendor":463,"category":464,"connector":462,"package":465,"models":466,"communication":473,"vendor_software":6,"os":474},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[467,468,469,470,471,472],"BioShake 3000 \u002F 3000 elm \u002F 3000 elm DWP","BioShake 3000-T \u002F 3000-T elm","BioShake 5000 elm","BioShake D30 \u002F D30 elm \u002F D30-T \u002F D30-T elm","BioShake Q1 \u002F Q1 (1.2 mm) \u002F Q1 (3.0 mm) \u002F Q2","HeatPlate","serial (RS-232 over USB)",[475,476,477],"windows","linux","macos",{"title":479,"path":480,"stem":481,"type":200,"device":482},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":483,"vendor":463,"category":464,"connector":462,"package":465,"models":484,"communication":473,"vendor_software":6,"os":487},"qinstruments-coldplate",[485,486],"ColdPlate","ColdPlate slim",[475,476,477],{"title":489,"path":490,"stem":491,"type":200,"device":492},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":493,"vendor":494,"category":464,"connector":495,"models":496},"inheco-thermoshake","Inheco","inheco-tec-controller",[497,498,499,500],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":502,"path":503,"page":41,"children":504},"Incubation","\u002Fdevices\u002Fincubation\u002F",[505],{"title":506,"path":507,"stem":508,"type":200,"device":509},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":510,"vendor":494,"category":502,"connector":510,"models":511},"inheco-scila",[512,513],"SCILA","SCILA MIX 2-gas mixing device",{"title":515,"path":516,"page":41,"children":517},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[518],{"title":519,"path":520,"stem":521,"type":200,"device":522},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":523,"vendor":494,"category":524,"connector":523,"models":525},"inheco-odtc","Thermal Cycler",[526,527,528,529],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":531,"path":532,"page":41,"children":533},"Readers","\u002Fdevices\u002Freaders\u002F",[534,543,552],{"title":535,"path":536,"stem":537,"type":200,"device":538},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":539,"vendor":540,"category":541,"connector":542},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":544,"path":545,"stem":546,"type":200,"device":547},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":548,"vendor":540,"category":541,"connector":549,"models":550},"biotek-synergy-h1","agilent-synergy-h1",[551],"BioTek Synergy H1",{"title":553,"path":554,"stem":555,"type":200,"device":556},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":557,"vendor":558,"category":541,"connector":557,"package":559,"models":560,"communication":564,"vendor_software":565,"os":566},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[561,562,563],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[475,476,477],{"title":568,"path":569,"page":41,"children":570},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[571,581],{"title":572,"path":573,"stem":574,"type":200,"device":575},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":576,"vendor":463,"category":577,"connector":462,"package":465,"models":578,"communication":473,"vendor_software":6,"os":580},"qinstruments-tiltstation","Plate Tilting",[579],"TiltStation",[475,476,477],{"title":582,"path":583,"stem":584,"type":200,"device":585},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":586,"vendor":463,"category":587,"connector":462,"package":465,"models":588,"communication":473,"vendor_software":6,"os":590},"qinstruments-turnstation","Plate Rotating",[589],"TurnStation",[475,476,477],{"title":592,"type":6,"device":6,"path":593,"stem":594,"children":595,"page":41},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[596,599,611,635,638,679,704,721,738],{"title":194,"path":597,"stem":598,"type":14,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":353,"type":6,"device":6,"path":600,"stem":601,"children":602,"page":41},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[603,607],{"title":604,"path":605,"stem":606,"type":24,"device":6},"Building a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fbuilding-a-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F10.building-a-deck",{"title":608,"path":609,"stem":610,"type":24,"device":6},"Save\u002FLoad a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fsave-load-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F20.save-load-deck",{"title":612,"type":6,"device":6,"path":613,"stem":614,"children":615,"page":41},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[616,620,624,628,631],{"title":617,"path":618,"stem":619,"type":24,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":621,"path":622,"stem":623,"type":24,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":625,"path":626,"stem":627,"type":24,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":364,"path":629,"stem":630,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":632,"path":633,"stem":634,"type":24,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":376,"path":636,"stem":637,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":639,"type":6,"device":6,"path":640,"stem":641,"children":642,"page":41},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[643,647,651,655,659,663,667,671,675],{"title":644,"path":645,"stem":646,"type":24,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":648,"path":649,"stem":650,"type":24,"device":6},"Gripper Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcore-gripper\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F20.core-gripper",{"title":652,"path":653,"stem":654,"type":24,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":656,"path":657,"stem":658,"type":24,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":660,"path":661,"stem":662,"type":24,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":664,"path":665,"stem":666,"type":24,"device":6},"Waste Block","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fwaste-block\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F60.waste-block",{"title":668,"path":669,"stem":670,"type":24,"device":6},"Complex Mixing","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcomplex-mixing\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F66.complex-mixing",{"title":672,"path":673,"stem":674,"type":24,"device":6},"Teaching Gripper Paddle Positions","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fgripper-positions\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F70.gripper-positions",{"title":676,"path":677,"stem":678,"type":24,"device":6},"Training a Custom Deck Position With the iSWAP","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcustom-deck-position\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F75.custom-deck-position",{"title":680,"type":6,"device":6,"path":681,"stem":682,"children":683,"page":41},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[684,688,692,696,700],{"title":685,"path":686,"stem":687,"type":24,"device":6},"Waste Configuration","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F05.waste-configuration",{"title":689,"path":690,"stem":691,"type":24,"device":6},"Covers and Lights","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F10.covers-and-lights",{"title":693,"path":694,"stem":695,"type":24,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":697,"path":698,"stem":699,"type":24,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":701,"path":702,"stem":703,"type":24,"device":6},"XL Pipettes","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fxl-channels\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F40.xl-channels",{"title":705,"type":6,"device":6,"path":706,"stem":707,"children":708,"page":41},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[709,712,715,718],{"title":625,"path":710,"stem":711,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":617,"path":713,"stem":714,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":364,"path":716,"stem":717,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":648,"path":719,"stem":720,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F30.using-the-gripper",{"title":722,"type":6,"device":6,"path":723,"stem":724,"children":725,"page":41},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[726,730,734],{"title":727,"path":728,"stem":729,"type":24,"device":6},"Connect & Run a Method","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F10.connect-and-run",{"title":731,"path":732,"stem":733,"type":24,"device":6},"Sending XML Commands","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":735,"path":736,"stem":737,"type":24,"device":6},"Full Workflow Example","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":739,"type":6,"device":6,"path":740,"stem":741,"children":742,"page":41},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[743,747,750,753,757],{"title":744,"path":745,"stem":746,"type":24,"device":6},"Deck & Carriers","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":625,"path":748,"stem":749,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F20.tip-handling",{"title":617,"path":751,"stem":752,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F30.basic-pipetting",{"title":754,"path":755,"stem":756,"type":24,"device":6},"Using the Gripper (RoMa)","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F40.using-the-gripper",{"title":364,"path":758,"stem":759,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F50.liquid-classes",{"title":245,"type":6,"device":6,"path":761,"stem":762,"children":763,"page":41},"\u002Flabware\u002F","07.labware",[764,767,771,775,779,783,787],{"title":194,"path":765,"stem":766,"type":14,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":768,"path":769,"stem":770,"type":200,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":772,"path":773,"stem":774,"type":200,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":776,"path":777,"stem":778,"type":200,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":780,"path":781,"stem":782,"type":200,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":784,"path":785,"stem":786,"type":200,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":788,"path":789,"stem":790,"type":200,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":792,"type":6,"device":6,"path":793,"stem":794,"children":795},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[796,798,822,855,863,903],{"title":194,"path":793,"stem":797,"type":14,"device":6},"20.connector-development\u002Findex",{"title":799,"path":800,"stem":801,"children":802,"page":41},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[803,806,810,814,818],{"title":194,"path":804,"stem":805,"type":285,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":807,"path":808,"stem":809,"type":24,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":811,"path":812,"stem":813,"type":24,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":815,"path":816,"stem":817,"type":24,"device":6},"Python Environment and Project Management","\u002Fconnector-development\u002Fgetting-started\u002Fpython-environments\u002F","20.connector-development\u002F10.getting-started\u002F35.python-environments",{"title":819,"path":820,"stem":821,"type":24,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":823,"path":824,"stem":825,"children":826,"page":41},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[827,831,835,839,843,847,851],{"title":828,"path":829,"stem":830,"type":46,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":832,"path":833,"stem":834,"type":46,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":836,"path":837,"stem":838,"type":46,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":840,"path":841,"stem":842,"type":46,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":844,"path":845,"stem":846,"type":46,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":848,"path":849,"stem":850,"type":46,"device":6},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":852,"path":853,"stem":854,"type":46,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":272,"type":6,"device":6,"path":856,"stem":857,"children":858,"page":41},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[859],{"title":860,"path":861,"stem":862,"type":285,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":864,"path":865,"stem":866,"children":867,"page":41},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[868,872,876,880,884,888,892,895,899],{"title":869,"path":870,"stem":871,"type":24,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":873,"path":874,"stem":875,"type":24,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":877,"path":878,"stem":879,"type":24,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":881,"path":882,"stem":883,"type":24,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":885,"path":886,"stem":887,"type":24,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":889,"path":890,"stem":891,"type":24,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":380,"path":893,"stem":894,"type":24,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":896,"path":897,"stem":898,"type":24,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":900,"path":901,"stem":902,"type":24,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":904,"path":905,"stem":906,"children":907,"type":6,"device":6},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[908],{"title":904,"path":905,"stem":906,"type":200,"device":6},{"id":910,"title":332,"body":911,"description":1727,"device":6,"extension":1728,"links":6,"meta":1729,"navigation":1049,"path":1730,"seo":1731,"stem":334,"type":285,"__hash__":1732},"docs\u002F04.concepts\u002F02.integrate\u002F30.action.md",{"type":912,"value":913,"toc":1719},"minimark",[914,932,954,962,967,973,976,996,1081,1088,1092,1097,1099,1110,1167,1181,1185,1198,1204,1215,1272,1279,1306,1332,1338,1341,1348,1359,1363,1366,1447,1457,1461,1464,1533,1536,1623,1653,1657,1660,1712,1715],[915,916,917,918,922,923,927,928,931],"p",{},"An ",[919,920,921],"strong",{},"action"," is anything you can call on a ",[924,925,926],"a",{"href":329},"module",". Reading the current temperature, subscribing to a file-system change stream, triggering a centrifuge spin — these are all actions. Every action has a ",[919,929,930],{},"type"," that tells you how to consume it:",[933,934,935,942,948],"ul",{},[936,937,938,941],"li",{},[919,939,940],{},"Property"," — read a single scalar value and complete",[936,943,944,947],{},[919,945,946],{},"Sensor"," — subscribe to a stream of values",[936,949,950,953],{},[919,951,952],{},"Control"," — trigger a change, optionally with parameters, and get a result",[915,955,956,957,961],{},"The platform UI groups actions into three sections by type. The SDK and REST API expose the type as a field on each action. See the ",[924,958,960],{"href":959},"\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F#terminology","Terminology table"," for the cross-surface mapping.",[963,964,966],"h2",{"id":965},"property-actions","Property actions",[915,968,969,970,972],{},"A ",[919,971,940],{}," reads a single value and returns it right away. Use one when you need to read something once, not follow it over time. Properties take no parameters.",[915,974,975],{},"Examples:",[933,977,978,981,984],{},[936,979,980],{},"The connector's server name or version, metadata that rarely changes",[936,982,983],{},"The target temperature a thermocycler is currently set to",[936,985,986,987,991,992,995],{},"Whether a heater-shaker is actively holding a temperature, a boolean status (",[988,989,990],"code",{},"True"," or ",[988,993,994],{},"False",")",[997,998,1003],"pre",{"className":999,"code":1000,"language":1001,"meta":1002,"style":1002},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","# Read the connector's server name\nname = await file_system.sila_service.get_server_name()\nprint(name)  # \"FileSystem\"\n\n# Read a structured value: the folder whitelist\nwhitelist = await file_system.folder_service.get_folder_whitelist()\nprint(whitelist)  # ['\u002Fopt\u002Ffs_demo']\n","python","",[988,1004,1005,1014,1031,1044,1051,1057,1070],{"__ignoreMap":1002},[1006,1007,1010],"span",{"class":1008,"line":1009},"line",1,[1006,1011,1013],{"class":1012},"sIsDC","# Read the connector's server name\n",[1006,1015,1017,1021,1025,1028],{"class":1008,"line":1016},2,[1006,1018,1020],{"class":1019},"sc-9e","name ",[1006,1022,1024],{"class":1023},"sxkbv","=",[1006,1026,1027],{"class":1023}," await",[1006,1029,1030],{"class":1019}," file_system.sila_service.get_server_name()\n",[1006,1032,1034,1038,1041],{"class":1008,"line":1033},3,[1006,1035,1037],{"class":1036},"sOiAX","print",[1006,1039,1040],{"class":1019},"(name)  ",[1006,1042,1043],{"class":1012},"# \"FileSystem\"\n",[1006,1045,1047],{"class":1008,"line":1046},4,[1006,1048,1050],{"emptyLinePlaceholder":1049},true,"\n",[1006,1052,1054],{"class":1008,"line":1053},5,[1006,1055,1056],{"class":1012},"# Read a structured value: the folder whitelist\n",[1006,1058,1060,1063,1065,1067],{"class":1008,"line":1059},6,[1006,1061,1062],{"class":1019},"whitelist ",[1006,1064,1024],{"class":1023},[1006,1066,1027],{"class":1023},[1006,1068,1069],{"class":1019}," file_system.folder_service.get_folder_whitelist()\n",[1006,1071,1073,1075,1078],{"class":1008,"line":1072},7,[1006,1074,1037],{"class":1036},[1006,1076,1077],{"class":1019},"(whitelist)  ",[1006,1079,1080],{"class":1012},"# ['\u002Fopt\u002Ffs_demo']\n",[915,1082,1083,1084,1087],{},"In the REST API, a Property is read via ",[988,1085,1086],{},"POST \u002Fv1\u002Fdata\u002F{actionId}",", which returns the value once and completes.",[963,1089,1091],{"id":1090},"sensor-actions","Sensor actions",[915,1093,969,1094,1096],{},[919,1095,946],{}," exposes a stream of values that change over time. Use one when you want to follow a value, not just read it once. A sensor keeps emitting until you stop it; it does not complete on its own.",[915,1098,975],{},[933,1100,1101,1104,1107],{},[936,1102,1103],{},"A live temperature feed from a thermocycler",[936,1105,1106],{},"The current shaking speed of a heater-shaker while it runs",[936,1108,1109],{},"A file-system watcher that emits an event whenever a folder's contents change",[997,1111,1113],{"className":999,"code":1112,"language":1001,"meta":1002,"style":1002},"# Subscribe to file-system changes\nsubscription = await file_system.folder_service.subscribe_changes()\nasync with subscription:\n    async for change in subscription:\n        print(change)\n",[988,1114,1115,1120,1132,1143,1159],{"__ignoreMap":1002},[1006,1116,1117],{"class":1008,"line":1009},[1006,1118,1119],{"class":1012},"# Subscribe to file-system changes\n",[1006,1121,1122,1125,1127,1129],{"class":1008,"line":1016},[1006,1123,1124],{"class":1019},"subscription ",[1006,1126,1024],{"class":1023},[1006,1128,1027],{"class":1023},[1006,1130,1131],{"class":1019}," file_system.folder_service.subscribe_changes()\n",[1006,1133,1134,1137,1140],{"class":1008,"line":1033},[1006,1135,1136],{"class":1023},"async",[1006,1138,1139],{"class":1023}," with",[1006,1141,1142],{"class":1019}," subscription:\n",[1006,1144,1145,1148,1151,1154,1157],{"class":1008,"line":1046},[1006,1146,1147],{"class":1023},"    async",[1006,1149,1150],{"class":1023}," for",[1006,1152,1153],{"class":1019}," change ",[1006,1155,1156],{"class":1023},"in",[1006,1158,1142],{"class":1019},[1006,1160,1161,1164],{"class":1008,"line":1053},[1006,1162,1163],{"class":1036},"        print",[1006,1165,1166],{"class":1019},"(change)\n",[915,1168,1169,1170,1172,1173,1176,1177,1180],{},"Consuming a Sensor holds open a long-lived stream. See ",[924,1171,336],{"href":337}," for lifecycle, reliability, and cancellation. In the REST API, a Sensor is consumed by creating a subscription (",[988,1174,1175],{},"POST \u002Fv1\u002Fsubscriptions",") and reading its stream of ",[988,1178,1179],{},"value"," events.",[963,1182,1184],{"id":1183},"control-actions","Control actions",[915,1186,969,1187,1189,1190,1193,1194,1197],{},[919,1188,952],{}," triggers a change on the instrument, optionally with parameters. Unlike a property, it makes something happen rather than reading a value. Controls come in two kinds, named for whether you can watch them execute. An ",[919,1191,1192],{},"unobservable"," Control offers no view into its execution: you call it, and the call returns once the command has completed. An ",[919,1195,1196],{},"observable"," Control tells you while it runs how the execution is going (its state, progress, and estimated remaining time) and can send partial results along the way.",[915,1199,1200,1203],{},[919,1201,1202],{},"Unobservable Controls."," The call returns once the instrument confirms the change; there are no updates in between. Examples:",[933,1205,1206,1209,1212],{},[936,1207,1208],{},"Set a target temperature: the setpoint is stored and the call returns; you watch the actual temperature climb through the sensor",[936,1210,1211],{},"Tare or zero a balance",[936,1213,1214],{},"Delete a file, or set the server name",[997,1216,1218],{"className":999,"code":1217,"language":1001,"meta":1002,"style":1002},"# Trigger a file deletion\nawait file_system.file_service.delete_file(path=\"\u002Fopt\u002Ffs_demo\u002Fold.txt\")\n\n# Set a parameter the server remembers afterward\nawait file_system.sila_service.set_server_name(server_name=\"FileSystem (Bench 3)\")\n",[988,1219,1220,1225,1246,1250,1255],{"__ignoreMap":1002},[1006,1221,1222],{"class":1008,"line":1009},[1006,1223,1224],{"class":1012},"# Trigger a file deletion\n",[1006,1226,1227,1230,1233,1237,1239,1243],{"class":1008,"line":1016},[1006,1228,1229],{"class":1023},"await",[1006,1231,1232],{"class":1019}," file_system.file_service.delete_file(",[1006,1234,1236],{"class":1235},"sNqAu","path",[1006,1238,1024],{"class":1023},[1006,1240,1242],{"class":1241},"sCx38","\"\u002Fopt\u002Ffs_demo\u002Fold.txt\"",[1006,1244,1245],{"class":1019},")\n",[1006,1247,1248],{"class":1008,"line":1033},[1006,1249,1050],{"emptyLinePlaceholder":1049},[1006,1251,1252],{"class":1008,"line":1046},[1006,1253,1254],{"class":1012},"# Set a parameter the server remembers afterward\n",[1006,1256,1257,1259,1262,1265,1267,1270],{"class":1008,"line":1053},[1006,1258,1229],{"class":1023},[1006,1260,1261],{"class":1019}," file_system.sila_service.set_server_name(",[1006,1263,1264],{"class":1235},"server_name",[1006,1266,1024],{"class":1023},[1006,1268,1269],{"class":1241},"\"FileSystem (Bench 3)\"",[1006,1271,1245],{"class":1019},[915,1273,1274,1275,1278],{},"When the call returns, the command succeeded; if something goes wrong, the connector raises a defined error instead. Many Controls return ",[988,1276,1277],{},"None",", but some hand back a value. Taring a balance, for instance, returns the new tare weight and its unit:",[997,1280,1282],{"className":999,"code":1281,"language":1001,"meta":1002,"style":1002},"tare_weight, unit, is_stable = await balance.weighing_service.tare()\nprint(tare_weight, unit)  # e.g. 0.0021 'g'\n",[988,1283,1284,1296],{"__ignoreMap":1002},[1006,1285,1286,1289,1291,1293],{"class":1008,"line":1009},[1006,1287,1288],{"class":1019},"tare_weight, unit, is_stable ",[1006,1290,1024],{"class":1023},[1006,1292,1027],{"class":1023},[1006,1294,1295],{"class":1019}," balance.weighing_service.tare()\n",[1006,1297,1298,1300,1303],{"class":1008,"line":1016},[1006,1299,1037],{"class":1036},[1006,1301,1302],{"class":1019},"(tare_weight, unit)  ",[1006,1304,1305],{"class":1012},"# e.g. 0.0021 'g'\n",[915,1307,1308,1311,1312,1315,1316,1319,1320,1323,1324,1327,1328,1331],{},[919,1309,1310],{},"Observable Controls."," These run for a while and report on their execution until the task finishes. While the command runs, it reports its ",[919,1313,1314],{},"Status"," (the execution state, e.g. ",[988,1317,1318],{},"running","), its ",[919,1321,1322],{},"Estimated Time Remaining"," (in seconds), and its ",[919,1325,1326],{},"Progress"," (in percent). On top of these generic updates, a command can emit ",[919,1329,1330],{},"intermediate responses",": typed partial results, delivered as the command produces them. Unlike a sensor, the stream does end: namely when the command completes.",[915,1333,1334,1335,1337],{},"For example, starting a read on a plate reader returns a Status (",[988,1336,1318],{},"), an estimated time remaining, and a progress value, plus intermediate responses with the read data per well as it is created. The final response then returns the complete data object for the full read.",[915,1339,1340],{},"Consuming these updates is optional. If you only want the final result, call the Control and await it like any other. Observable Controls can also be cancelled while they run.",[915,1342,1343,1344,1347],{},"Observable Controls are consumed as ",[924,1345,1346],{"href":337},"subscriptions","; the stream delivers the execution updates and optional intermediate responses until the command completes.",[915,1349,1350,1351,1354,1355,1358],{},"Whether a given change is modeled as an unobservable Control plus a Sensor, or as a single observable Control, is a choice the connector makes. Reaching a target temperature, for example, is often a ",[988,1352,1353],{},"set_target_temperature"," Control paired with a ",[988,1356,1357],{},"subscribe_current_temperature"," Sensor, rather than one command that blocks until the setpoint is reached.",[963,1360,1362],{"id":1361},"how-sila-maps-to-action-types","How SiLA maps to action types",[915,1364,1365],{},"Connectors built on the UniteLabs CDK expose their functionality as SiLA features. Each SiLA primitive surfaces as one of the three action types:",[1367,1368,1369,1385],"table",{},[1370,1371,1372],"thead",{},[1373,1374,1375,1379,1382],"tr",{},[1376,1377,1378],"th",{},"SiLA primitive",[1376,1380,1381],{},"Action type",[1376,1383,1384],{},"SDK method",[1386,1387,1388,1404,1419,1434],"tbody",{},[1373,1389,1390,1394,1399],{},[1391,1392,1393],"td",{},"Unobservable Property",[1391,1395,1396],{},[988,1397,1398],{},"PROPERTY",[1391,1400,1401],{},[988,1402,1403],{},"get_\u003Cname>()",[1373,1405,1406,1409,1414],{},[1391,1407,1408],{},"Observable Property",[1391,1410,1411],{},[988,1412,1413],{},"SENSOR",[1391,1415,1416],{},[988,1417,1418],{},"subscribe_\u003Cname>()",[1373,1420,1421,1424,1429],{},[1391,1422,1423],{},"Unobservable Command",[1391,1425,1426],{},[988,1427,1428],{},"CONTROL",[1391,1430,1431],{},[988,1432,1433],{},"\u003Cname>(...)",[1373,1435,1436,1439,1443],{},[1391,1437,1438],{},"Observable Command",[1391,1440,1441],{},[988,1442,1428],{},[1391,1444,1445],{},[988,1446,1433],{},[915,1448,1449,1450,1452,1453,1456],{},"Both command kinds surface as ",[988,1451,1428],{},". The difference is that an observable command runs long enough to report progress and intermediate responses while it executes. Those updates arrive as a ",[924,1454,1455],{"href":337},"subscription",", and the final result is returned when the command completes.",[963,1458,1460],{"id":1459},"discovering-actions-and-their-types","Discovering actions and their types",[915,1462,1463],{},"Ask a module what actions it has, then read each action's type:",[997,1465,1467],{"className":999,"code":1466,"language":1001,"meta":1002,"style":1002},"module = file_system.folder_service\nprint(module.actions.keys())\n# dict_keys(['get_folder_whitelist', 'subscribe_changes', 'get_folder_contents'])\n\nfor name, action in module.actions.items():\n    print(name, action.type)\n# get_folder_whitelist   PROPERTY\n# subscribe_changes      SENSOR\n# get_folder_contents    CONTROL\n",[988,1468,1469,1479,1486,1491,1495,1508,1516,1521,1527],{"__ignoreMap":1002},[1006,1470,1471,1474,1476],{"class":1008,"line":1009},[1006,1472,1473],{"class":1019},"module ",[1006,1475,1024],{"class":1023},[1006,1477,1478],{"class":1019}," file_system.folder_service\n",[1006,1480,1481,1483],{"class":1008,"line":1016},[1006,1482,1037],{"class":1036},[1006,1484,1485],{"class":1019},"(module.actions.keys())\n",[1006,1487,1488],{"class":1008,"line":1033},[1006,1489,1490],{"class":1012},"# dict_keys(['get_folder_whitelist', 'subscribe_changes', 'get_folder_contents'])\n",[1006,1492,1493],{"class":1008,"line":1046},[1006,1494,1050],{"emptyLinePlaceholder":1049},[1006,1496,1497,1500,1503,1505],{"class":1008,"line":1053},[1006,1498,1499],{"class":1023},"for",[1006,1501,1502],{"class":1019}," name, action ",[1006,1504,1156],{"class":1023},[1006,1506,1507],{"class":1019}," module.actions.items():\n",[1006,1509,1510,1513],{"class":1008,"line":1059},[1006,1511,1512],{"class":1036},"    print",[1006,1514,1515],{"class":1019},"(name, action.type)\n",[1006,1517,1518],{"class":1008,"line":1072},[1006,1519,1520],{"class":1012},"# get_folder_whitelist   PROPERTY\n",[1006,1522,1524],{"class":1008,"line":1523},8,[1006,1525,1526],{"class":1012},"# subscribe_changes      SENSOR\n",[1006,1528,1530],{"class":1008,"line":1529},9,[1006,1531,1532],{"class":1012},"# get_folder_contents    CONTROL\n",[915,1534,1535],{},"From the REST API:",[997,1537,1541],{"className":1538,"code":1539,"language":1540,"meta":1002,"style":1002},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","# All actions on a module — each record carries its type\ncurl \"$BASE_URL\u002Fv1\u002Fmodules\u002F$MODULE_ID\u002Factions\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n\n# One action in detail — type, parameters, responses, source (SiLA URI)\ncurl \"$BASE_URL\u002Fv1\u002Factions\u002F$ACTION_ID\" \\\n  -H \"Authorization: Bearer $TOKEN\"\n","bash",[988,1542,1543,1548,1571,1585,1589,1594,1613],{"__ignoreMap":1002},[1006,1544,1545],{"class":1008,"line":1009},[1006,1546,1547],{"class":1012},"# All actions on a module — each record carries its type\n",[1006,1549,1550,1553,1556,1559,1562,1565,1568],{"class":1008,"line":1016},[1006,1551,1552],{"class":1235},"curl",[1006,1554,1555],{"class":1241}," \"",[1006,1557,1558],{"class":1019},"$BASE_URL",[1006,1560,1561],{"class":1241},"\u002Fv1\u002Fmodules\u002F",[1006,1563,1564],{"class":1019},"$MODULE_ID",[1006,1566,1567],{"class":1241},"\u002Factions\"",[1006,1569,1570],{"class":1023}," \\\n",[1006,1572,1573,1576,1579,1582],{"class":1008,"line":1033},[1006,1574,1575],{"class":1036},"  -H",[1006,1577,1578],{"class":1241}," \"Authorization: Bearer ",[1006,1580,1581],{"class":1019},"$TOKEN",[1006,1583,1584],{"class":1241},"\"\n",[1006,1586,1587],{"class":1008,"line":1046},[1006,1588,1050],{"emptyLinePlaceholder":1049},[1006,1590,1591],{"class":1008,"line":1053},[1006,1592,1593],{"class":1012},"# One action in detail — type, parameters, responses, source (SiLA URI)\n",[1006,1595,1596,1598,1600,1602,1605,1608,1611],{"class":1008,"line":1059},[1006,1597,1552],{"class":1235},[1006,1599,1555],{"class":1241},[1006,1601,1558],{"class":1019},[1006,1603,1604],{"class":1241},"\u002Fv1\u002Factions\u002F",[1006,1606,1607],{"class":1019},"$ACTION_ID",[1006,1609,1610],{"class":1241},"\"",[1006,1612,1570],{"class":1023},[1006,1614,1615,1617,1619,1621],{"class":1008,"line":1072},[1006,1616,1575],{"class":1036},[1006,1618,1578],{"class":1241},[1006,1620,1581],{"class":1019},[1006,1622,1584],{"class":1241},[915,1624,1625,1626,1628,1629,1631,1632,1631,1634,1636,1637,1640,1641,1644,1645,1648,1649,1652],{},"Each action record includes its ",[988,1627,930],{}," (one of ",[988,1630,1398],{},", ",[988,1633,1413],{},[988,1635,1428],{},"), a human-readable ",[988,1638,1639],{},"name",", typed ",[988,1642,1643],{},"parameters"," and ",[988,1646,1647],{},"responses"," schemas, and a ",[988,1650,1651],{},"source"," field that identifies the underlying SiLA URI for connector developers who need it.",[963,1654,1656],{"id":1655},"introspection-parameters-and-responses","Introspection: parameters and responses",[915,1658,1659],{},"Every action carries typed schemas describing what it expects and what it returns. The schema is programmatically accessible so you can build UIs, validate payloads before sending them, or generate client code:",[997,1661,1663],{"className":999,"code":1662,"language":1001,"meta":1002,"style":1002},"# What parameters does this Control accept?\nprint(await file_system.sila_service.set_server_name.parameters)\n# {'ServerName': Parameter(name='Server Name', schema={...})}\n\n# What does it return?\nprint(await file_system.sila_service.set_server_name.responses)\n# None\n",[988,1664,1665,1670,1682,1687,1691,1696,1707],{"__ignoreMap":1002},[1006,1666,1667],{"class":1008,"line":1009},[1006,1668,1669],{"class":1012},"# What parameters does this Control accept?\n",[1006,1671,1672,1674,1677,1679],{"class":1008,"line":1016},[1006,1673,1037],{"class":1036},[1006,1675,1676],{"class":1019},"(",[1006,1678,1229],{"class":1023},[1006,1680,1681],{"class":1019}," file_system.sila_service.set_server_name.parameters)\n",[1006,1683,1684],{"class":1008,"line":1033},[1006,1685,1686],{"class":1012},"# {'ServerName': Parameter(name='Server Name', schema={...})}\n",[1006,1688,1689],{"class":1008,"line":1046},[1006,1690,1050],{"emptyLinePlaceholder":1049},[1006,1692,1693],{"class":1008,"line":1053},[1006,1694,1695],{"class":1012},"# What does it return?\n",[1006,1697,1698,1700,1702,1704],{"class":1008,"line":1059},[1006,1699,1037],{"class":1036},[1006,1701,1676],{"class":1019},[1006,1703,1229],{"class":1023},[1006,1705,1706],{"class":1019}," file_system.sila_service.set_server_name.responses)\n",[1006,1708,1709],{"class":1008,"line":1072},[1006,1710,1711],{"class":1012},"# None\n",[915,1713,1714],{},"Parameters come with names, data types, and constraints — units, min \u002F max ranges, enumerations. Responses have the same shape. The SDK uses this schema to serialize your arguments correctly; the platform UI uses it to render a parameter form on Controls and a value view on Properties.",[1716,1717,1718],"style",{},"html pre.shiki code .sIsDC, html code.shiki .sIsDC{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#8B949E}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}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 .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}",{"title":1002,"searchDepth":1009,"depth":1016,"links":1720},[1721,1722,1723,1724,1725,1726],{"id":965,"depth":1016,"text":966},{"id":1090,"depth":1016,"text":1091},{"id":1183,"depth":1016,"text":1184},{"id":1361,"depth":1016,"text":1362},{"id":1459,"depth":1016,"text":1460},{"id":1655,"depth":1016,"text":1656},"The callable primitive on a module. Every action has a type — Property, Sensor, or Control — that determines how you consume it.","md",{},"\u002Fconcepts\u002Fintegrate\u002Faction",{"title":332,"description":1727},"QRP21qEfO68kxgfExLfOF3dRDt5jfPCYjqNVztx8SUY",[1734,1736],{"title":328,"description":1735,"path":329},"How a connector groups related actions into logical modules you can discover and call.",{"title":336,"description":1737,"path":337},"How you consume Sensor-type actions (and streaming Controls) over time.",1791294177304]