From f694335607407fcfcc7da5cd6474b78370cec171 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:52:42 -0400 Subject: [PATCH 01/26] PLAT-397 add module lid definition --- .../1.json | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json diff --git a/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json new file mode 100644 index 00000000000..f86bc365173 --- /dev/null +++ b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json @@ -0,0 +1,42 @@ +{ + "ordering": [], + "brand": { + "brand": "Opentrons", + "brandId": [] + }, + "metadata": { + "displayName": "Opentrons Absorbance Plate Reader Module Lid", + "displayCategory": "other", + "displayVolumeUnits": "\u00b5L", + "tags": [] + }, + "dimensions": { + "xDimension": 155.0, + "yDimension": 95.5, + "zDimension": 57.0 + }, + "wells": {}, + "groups": [ + { + "metadata": {}, + "wells": [] + } + ], + "parameters": { + "format": "irregular", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "opentrons_flex_lid_absorbance_plate_reader_module" + }, + "namespace": "opentrons", + "version": 1, + "schemaVersion": 2, + "gripForce": 20.0, + "gripHeightFromLabwareBottom": 53.0, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + } +} From ed13f7c8c56a8423d756943be0fe49318d04cd0a Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:07:51 -0400 Subject: [PATCH 02/26] PLAT-398 add module lid dock addressable area --- .../deck/definitions/5/ot3_standard.json | 62 ++++++++++++++++--- shared-data/deck/schemas/5.json | 3 +- shared-data/deck/types/schemaV5.ts | 4 ++ shared-data/js/constants.ts | 12 ++++ shared-data/js/types.ts | 1 + 5 files changed, 72 insertions(+), 10 deletions(-) diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index 0cd6c72f49d..c07aaaf7b29 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -199,7 +199,7 @@ { "id": "D4", "areaType": "stagingSlot", - "offsetFromCutoutFixture": [164.0, 0.0, 14.5], + "offsetFromCutoutFixture": [164.0, 0.0, 0.0], "matingSurfaceUnitVector": [-1, 1, -1], "boundingBox": { "xDimension": 128.0, @@ -676,7 +676,7 @@ { "id": "absorbanceReaderV1D3", "areaType": "absorbanceReader", - "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "offsetFromCutoutFixture": [2.0, 0.0, 0.65], "boundingBox": { "xDimension": 127.8, "yDimension": 85.5, @@ -687,7 +687,7 @@ { "id": "absorbanceReaderV1C3", "areaType": "absorbanceReader", - "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "offsetFromCutoutFixture": [2.0, 0.0, 0.65], "boundingBox": { "xDimension": 127.8, "yDimension": 85.5, @@ -698,7 +698,7 @@ { "id": "absorbanceReaderV1B3", "areaType": "absorbanceReader", - "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "offsetFromCutoutFixture": [2.0, 0.0, 0.65], "boundingBox": { "xDimension": 127.8, "yDimension": 85.5, @@ -709,13 +709,57 @@ { "id": "absorbanceReaderV1A3", "areaType": "absorbanceReader", - "offsetFromCutoutFixture": [0.0, 0.0, 10.65], + "offsetFromCutoutFixture": [2.0, 0.0, 0.65], "boundingBox": { "xDimension": 127.8, "yDimension": 85.5, "zDimension": 0 }, "displayName": "Absorbance Reader in A3" + }, + { + "id": "absorbanceReaderV1LidDockD4", + "areaType": "lidDock", + "offsetFromCutoutFixture": [163.075, 0.0, 0.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader Lid Dock in D4" + }, + { + "id": "absorbanceReaderV1LidDockC4", + "areaType": "lidDock", + "offsetFromCutoutFixture": [163.075, 0.0, 0.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader Lid Dock in C4" + }, + { + "id": "absorbanceReaderV1LidDockB4", + "areaType": "lidDock", + "offsetFromCutoutFixture": [163.075, 0.0, 0.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader Lid Dock in B4" + }, + { + "id": "absorbanceReaderV1LidDockA4", + "areaType": "lidDock", + "offsetFromCutoutFixture": [163.075, 0.0, 0.65], + "boundingBox": { + "xDimension": 127.8, + "yDimension": 85.5, + "zDimension": 0 + }, + "displayName": "Absorbance Reader Lid Dock in A4" } ], "cutouts": [ @@ -1074,10 +1118,10 @@ "mayMountTo": ["cutoutD3", "cutoutC3", "cutoutB3", "cutoutA3"], "displayName": "Slot With an Absorbance Reader and a Lid Dock", "providesAddressableAreas": { - "cutoutD3": ["absorbanceReaderV1D3"], - "cutoutC3": ["absorbanceReaderV1C3"], - "cutoutB3": ["absorbanceReaderV1B3"], - "cutoutA3": ["absorbanceReaderV1A3"] + "cutoutD3": ["absorbanceReaderV1D3", "absorbanceReaderV1LidDockD4"], + "cutoutC3": ["absorbanceReaderV1C3", "absorbanceReaderV1LidDockC4"], + "cutoutB3": ["absorbanceReaderV1B3", "absorbanceReaderV1LidDockB4"], + "cutoutA3": ["absorbanceReaderV1A3", "absorbanceReaderV1LidDockA4"] }, "fixtureGroup": {}, "height": 10.65 diff --git a/shared-data/deck/schemas/5.json b/shared-data/deck/schemas/5.json index da77152da13..5188cf0cc28 100644 --- a/shared-data/deck/schemas/5.json +++ b/shared-data/deck/schemas/5.json @@ -141,7 +141,8 @@ "stagingSlot", "movableTrash", "fixedTrash", - "wasteChute" + "wasteChute", + "lidDock" ] }, "offsetFromCutoutFixture": { diff --git a/shared-data/deck/types/schemaV5.ts b/shared-data/deck/types/schemaV5.ts index e558f3f44f6..acd11fbb8be 100644 --- a/shared-data/deck/types/schemaV5.ts +++ b/shared-data/deck/types/schemaV5.ts @@ -60,6 +60,10 @@ export type FlexAddressableAreaName = | 'absorbanceReaderV1B3' | 'absorbanceReaderV1C3' | 'absorbanceReaderV1D3' + | 'absorbanceReaderV1LidDockA4' + | 'absorbanceReaderV1LidDockB4' + | 'absorbanceReaderV1LidDockC4' + | 'absorbanceReaderV1LidDockD4' export type OT2AddressableAreaName = | '1' diff --git a/shared-data/js/constants.ts b/shared-data/js/constants.ts index d1ce19a8a56..15994021474 100644 --- a/shared-data/js/constants.ts +++ b/shared-data/js/constants.ts @@ -365,6 +365,14 @@ export const ABSORBANCE_READER_B3_ADDRESSABLE_AREA: 'absorbanceReaderV1B3' = 'absorbanceReaderV1B3' export const ABSORBANCE_READER_A3_ADDRESSABLE_AREA: 'absorbanceReaderV1A3' = 'absorbanceReaderV1A3' +export const ABSORBANCE_READER_LID_DOCK_A4_ADDRESSABLE_AREA: 'absorbanceReaderV1LidDockA4' = + 'absorbanceReaderV1LidDockA4' +export const ABSORBANCE_READER_LID_DOCK_B4_ADDRESSABLE_AREA: 'absorbanceReaderV1LidDockB4' = + 'absorbanceReaderV1LidDockB4' +export const ABSORBANCE_READER_LID_DOCK_C4_ADDRESSABLE_AREA: 'absorbanceReaderV1LidDockC4' = + 'absorbanceReaderV1LidDockC4' +export const ABSORBANCE_READER_LID_DOCK_D4_ADDRESSABLE_AREA: 'absorbanceReaderV1LidDockD4' = + 'absorbanceReaderV1LidDockD4' export const MAGNETIC_BLOCK_ADDRESSABLE_AREAS: AddressableAreaName[] = [ MAGNETIC_BLOCK_A1_ADDRESSABLE_AREA, @@ -408,6 +416,10 @@ export const ABSORBANCE_READER_ADDRESSABLE_AREAS: AddressableAreaName[] = [ ABSORBANCE_READER_B3_ADDRESSABLE_AREA, ABSORBANCE_READER_C3_ADDRESSABLE_AREA, ABSORBANCE_READER_D3_ADDRESSABLE_AREA, + ABSORBANCE_READER_LID_DOCK_A4_ADDRESSABLE_AREA, + ABSORBANCE_READER_LID_DOCK_B4_ADDRESSABLE_AREA, + ABSORBANCE_READER_LID_DOCK_C4_ADDRESSABLE_AREA, + ABSORBANCE_READER_LID_DOCK_D4_ADDRESSABLE_AREA, ] export const FLEX_USB_MODULE_ADDRESSABLE_AREAS: AddressableAreaName[] = [ diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index 1583c5aa372..ccd9bf8d43b 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -298,6 +298,7 @@ type AreaType = | 'wasteChute' | 'fixedTrash' | 'stagingSlot' + | 'lidDock' export interface AddressableArea { id: AddressableAreaName From 957f2468e87f5f574706df658073abe4ef044015 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:23:59 -0400 Subject: [PATCH 03/26] squash! PLAT-397 add module lid definition --- shared-data/js/getLabware.ts | 1 + shared-data/js/labware.ts | 3 +++ 2 files changed, 4 insertions(+) diff --git a/shared-data/js/getLabware.ts b/shared-data/js/getLabware.ts index 74678b91885..b4f0ec5d5af 100644 --- a/shared-data/js/getLabware.ts +++ b/shared-data/js/getLabware.ts @@ -52,6 +52,7 @@ export const PD_DO_NOT_LIST = [ 'opentrons_calibrationblock_short_side_right', 'opentrons_96_aluminumblock_biorad_wellplate_200ul', 'opentrons_96_aluminumblock_nest_wellplate_100ul', + 'opentrons_flex_lid_absorbance_plate_reader_module', ] export function getIsLabwareV1Tiprack(def: LabwareDefinition1): boolean { diff --git a/shared-data/js/labware.ts b/shared-data/js/labware.ts index fb775c1f040..c12f9419f62 100644 --- a/shared-data/js/labware.ts +++ b/shared-data/js/labware.ts @@ -110,6 +110,7 @@ import opentronsFlex96Tiprack1000UlV1Uncasted from '../labware/definitions/2/ope import opentronsFlex96Tiprack200UlV1Uncasted from '../labware/definitions/2/opentrons_flex_96_tiprack_200ul/1.json' import opentronsFlex96Tiprack50UlV1Uncasted from '../labware/definitions/2/opentrons_flex_96_tiprack_50ul/1.json' import opentronsFlex96TiprackAdapterV1Uncasted from '../labware/definitions/2/opentrons_flex_96_tiprack_adapter/1.json' +import opentronsFlexLidAbsorbancePlateReaderModuleV1Uncasted from '../labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json' import opentronsUniversalFlatAdapterV1Uncasted from '../labware/definitions/2/opentrons_universal_flat_adapter/1.json' import opentronsUniversalFlatAdapterCorning384Wellplate112UlFlatV1Uncasted from '../labware/definitions/2/opentrons_universal_flat_adapter_corning_384_wellplate_112ul_flat/1.json' import opentrons96DeepWellTempModAdapterV1Uncasted from '../labware/definitions/2/opentrons_96_deep_well_temp_mod_adapter/1.json' @@ -284,6 +285,7 @@ const opentronsFlex96Tiprack1000UlV1 = opentronsFlex96Tiprack1000UlV1Uncasted as const opentronsFlex96Tiprack200UlV1 = opentronsFlex96Tiprack200UlV1Uncasted as LabwareDefinition2 const opentronsFlex96Tiprack50UlV1 = opentronsFlex96Tiprack50UlV1Uncasted as LabwareDefinition2 const opentronsFlex96TiprackAdapterV1 = opentronsFlex96TiprackAdapterV1Uncasted as LabwareDefinition2 +const opentronsFlexLidAbsorbancePlateReaderModuleV1 = opentronsFlexLidAbsorbancePlateReaderModuleV1Uncasted as LabwareDefinition2 const opentronsUniversalFlatAdapterV1 = opentronsUniversalFlatAdapterV1Uncasted as LabwareDefinition2 const opentronsUniversalFlatAdapterCorning384Wellplate112UlFlatV1 = opentronsUniversalFlatAdapterCorning384Wellplate112UlFlatV1Uncasted as LabwareDefinition2 const thermoscientificnunc96Wellplate1300UlV1 = thermoscientificnunc96Wellplate1300UlV1Uncasted as LabwareDefinition2 @@ -450,6 +452,7 @@ const latestDefs = { opentronsFlex96Tiprack200UlV1, opentronsFlex96Tiprack50UlV1, opentronsFlex96TiprackAdapterV1, + opentronsFlexLidAbsorbancePlateReaderModuleV1, opentronsUniversalFlatAdapterV1, opentronsUniversalFlatAdapterCorning384Wellplate112UlFlatV1, thermoscientificnunc96Wellplate1300UlV1, From 6051392104da323537bcc32ceb2c163922dc41db Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:25:52 -0400 Subject: [PATCH 04/26] fixup async byonoy library get_plate_presence() --- .../drivers/absorbance_reader/async_byonoy.py | 18 +++++++++++++++++- .../drivers/absorbance_reader/hid_protocol.py | 8 ++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py index d67883cd062..2c97e7cc6f0 100644 --- a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py +++ b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py @@ -11,6 +11,7 @@ AbsorbanceHidInterface as AbsProtocol, ErrorCodeNames, DeviceStateNames, + SlotStateNames, ) from opentrons.drivers.types import ( AbsorbanceReaderLidStatus, @@ -276,7 +277,10 @@ async def get_single_measurement(self, wavelength: int) -> List[float]: ) async def get_plate_presence(self) -> AbsorbanceReaderPlatePresence: - return AbsorbanceReaderPlatePresence.UNKNOWN + presence = await self._loop.run_in_executor( + executor=self._executor, func=self._get_slot_status + ) + return self.convert_plate_presence(presence.name) async def get_device_status(self) -> AbsorbanceReaderDeviceState: status = await self._loop.run_in_executor( @@ -296,3 +300,15 @@ def convert_device_state( "BYONOY_DEVICE_STATE_ERROR": AbsorbanceReaderDeviceState.ERROR, } return state_map[device_state] + + @staticmethod + def convert_plate_presence( + slot_state: SlotStateNames, + ) -> AbsorbanceReaderPlatePresence: + state_map: Dict[SlotStateNames, AbsorbanceReaderPlatePresence] = { + "UNKNOWN": AbsorbanceReaderPlatePresence.UNKNOWN, + "EMPTY": AbsorbanceReaderPlatePresence.ABSENT, + "OCCUPIED": AbsorbanceReaderPlatePresence.PRESENT, + "UNDETERMINED": AbsorbanceReaderPlatePresence.UNKNOWN, + } + return state_map[slot_state] \ No newline at end of file diff --git a/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py index 2efee337846..17ca2cabdcc 100644 --- a/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py +++ b/api/src/opentrons/drivers/absorbance_reader/hid_protocol.py @@ -36,10 +36,10 @@ ] SlotStateNames = Literal[ - "BYONOY_SLOT_UNKNOWN", - "BYONOY_SLOT_EMPTY", - "BYONOY_SLOT_OCCUPIED", - "BYONOY_SLOT_UNDETERMINED", + "UNKNOWN", + "EMPTY", + "OCCUPIED", + "UNDETERMINED", ] DeviceStateNames = Literal[ From 29d04180be3878fcf5be4c35fa6d71b665eabe71 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:41:24 -0400 Subject: [PATCH 05/26] PLAT-215 load lid in lid dock when module is loaded --- .../protocol_api/core/engine/protocol.py | 18 +++ .../protocol_engine/commands/load_labware.py | 7 +- .../resources/fixture_validation.py | 5 + .../resources/labware_validation.py | 5 + .../protocol_engine/state/modules.py | 142 +++++++++--------- api/src/opentrons/protocol_engine/types.py | 1 + api/src/opentrons/types.py | 17 +++ 7 files changed, 119 insertions(+), 76 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 6b040243193..ab5d3561770 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -440,11 +440,29 @@ def load_module( existing_labware_ids=list(self._labware_cores_by_id.keys()), existing_module_ids=list(self._module_cores_by_id.keys()), ) + self._load_module_lid(module_core) self._module_cores_by_id[module_core.module_id] = module_core return module_core + def _load_module_lid( + self, module_core: Union[ModuleCore, NonConnectedModuleCore] + ) -> None: + if isinstance(module_core, AbsorbanceReaderCore): + lid_slot = ( + self._engine_client.state.modules.absorbance_reader_dock_location_name( + module_id=module_core.module_id + ) + ) + self.load_labware( + load_name="opentrons_flex_lid_absorbance_plate_reader_module", + location=lid_slot, + namespace="opentrons", + version=1, + label="Absorbance Reader Lid", + ) + def _create_non_connected_module_core( self, load_module_result: LoadModuleResult ) -> NonConnectedModuleCore: diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 6e37607984c..497f63d5f34 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -115,7 +115,12 @@ async def execute( if isinstance(params.location, AddressableAreaLocation): area_name = params.location.addressableAreaName - if not fixture_validation.is_deck_slot(params.location.addressableAreaName): + if not ( + fixture_validation.is_deck_slot(params.location.addressableAreaName) + or fixture_validation.is_abs_reader_lid_dock( + params.location.addressableAreaName + ) + ): raise LabwareIsNotAllowedInLocationError( f"Cannot load {params.loadName} onto addressable area {area_name}" ) diff --git a/api/src/opentrons/protocol_engine/resources/fixture_validation.py b/api/src/opentrons/protocol_engine/resources/fixture_validation.py index 9807cc6beaa..a6b301e0c7d 100644 --- a/api/src/opentrons/protocol_engine/resources/fixture_validation.py +++ b/api/src/opentrons/protocol_engine/resources/fixture_validation.py @@ -46,3 +46,8 @@ def is_deck_slot(addressable_area_name: str) -> bool: except ValueError: return False return True + + +def is_abs_reader_lid_dock(addressable_area_name: str) -> bool: + """Check if an addressable area is an absorbance plate reader lid dock.""" + return "absorbanceReaderV1LidDock" in addressable_area_name diff --git a/api/src/opentrons/protocol_engine/resources/labware_validation.py b/api/src/opentrons/protocol_engine/resources/labware_validation.py index 75cb46e4cdd..3b4ed14166c 100644 --- a/api/src/opentrons/protocol_engine/resources/labware_validation.py +++ b/api/src/opentrons/protocol_engine/resources/labware_validation.py @@ -9,6 +9,11 @@ def is_flex_trash(load_name: str) -> bool: return load_name == "opentrons_1_trash_3200ml_fixed" +def is_absorbance_reader_lid(load_name: str) -> bool: + """Check if a labware is an absorbance reader lid.""" + return load_name == "opentrons_flex_lid_absorbance_plate_reader_module" + + def validate_definition_is_labware(definition: LabwareDefinition) -> bool: """Validate that one of the definition's allowed roles is `labware`. diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 49794ce329d..dcd63f65efa 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -24,11 +24,12 @@ from opentrons.motion_planning.adjacent_slots_getters import ( get_east_slot, get_west_slot, + get_adjacent_staging_slot, ) from opentrons.protocol_engine.commands.calibration.calibrate_module import ( CalibrateModuleResult, ) -from opentrons.types import DeckSlotName, MountType +from opentrons.types import DeckSlotName, MountType, StagingSlotName from ..errors import ModuleNotConnectedError from ..types import ( @@ -39,12 +40,14 @@ ModuleType, ModuleDefinition, DeckSlotLocation, + StagingSlotLocation, ModuleDimensions, LabwareOffsetVector, HeaterShakerLatchStatus, HeaterShakerMovementRestrictors, DeckType, LabwareMovementOffsetData, + AddressableAreaLocation, ) from .addressable_areas import AddressableAreaView from .. import errors @@ -269,6 +272,8 @@ def _handle_command(self, command: Command) -> None: if isinstance( command.result, ( + absorbance_reader.CloseLidResult, + absorbance_reader.OpenLidResult, absorbance_reader.InitializeResult, absorbance_reader.MeasureAbsorbanceResult, ), @@ -338,6 +343,7 @@ def _add_module_substate( module_id=AbsorbanceReaderId(module_id), configured=False, measured=False, + is_lid_on=False, data=None, configured_wavelength=None, ) @@ -534,6 +540,8 @@ def _handle_absorbance_reader_commands( command: Union[ absorbance_reader.Initialize, absorbance_reader.MeasureAbsorbance, + absorbance_reader.CloseLid, + absorbance_reader.OpenLid, ], ) -> None: module_id = command.params.moduleId @@ -545,12 +553,14 @@ def _handle_absorbance_reader_commands( # Get current values configured = absorbance_reader_substate.configured configured_wavelength = absorbance_reader_substate.configured_wavelength + is_lid_on = absorbance_reader_substate.is_lid_on if isinstance(command.result, absorbance_reader.InitializeResult): self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( module_id=AbsorbanceReaderId(module_id), configured=True, measured=False, + is_lid_on=is_lid_on, data=None, configured_wavelength=command.params.sampleWavelength, ) @@ -559,10 +569,31 @@ def _handle_absorbance_reader_commands( module_id=AbsorbanceReaderId(module_id), configured=configured, configured_wavelength=configured_wavelength, + is_lid_on=is_lid_on, measured=True, data=command.result.data, ) + elif isinstance(command.result, absorbance_reader.OpenLidResult): + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=configured, + configured_wavelength=configured_wavelength, + is_lid_on=False, + measured=True, + data=None, + ) + + elif isinstance(command.result, absorbance_reader.CloseLidResult): + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=configured, + configured_wavelength=configured_wavelength, + is_lid_on=True, + measured=True, + data=None, + ) + class ModuleView(HasState[ModuleState]): """Read-only view of computed module state.""" @@ -711,7 +742,7 @@ def get_absorbance_reader_substate( return self._get_module_substate( module_id=module_id, expected_type=AbsorbanceReaderSubState, - expected_name="Thermocycler Module", + expected_name="Absorbance Reader", ) def get_location(self, module_id: str) -> DeckSlotLocation: @@ -1194,84 +1225,45 @@ def ensure_and_convert_module_fixture_location( f"Invalid Deck Type: {deck_type.name} - Does not support modules as fixtures." ) + assert deck_slot in DeckSlotName.ot3_slots() if model == ModuleModel.MAGNETIC_BLOCK_V1: - valid_slots = [ - slot - for slot in [ - "A1", - "B1", - "C1", - "D1", - "A2", - "B2", - "C2", - "D2", - "A3", - "B3", - "C3", - "D3", - ] - ] - addressable_areas = [ - "magneticBlockV1A1", - "magneticBlockV1B1", - "magneticBlockV1C1", - "magneticBlockV1D1", - "magneticBlockV1A2", - "magneticBlockV1B2", - "magneticBlockV1C2", - "magneticBlockV1D2", - "magneticBlockV1A3", - "magneticBlockV1B3", - "magneticBlockV1C3", - "magneticBlockV1D3", - ] + return f"magneticBlockV1{deck_slot.value}" elif model == ModuleModel.HEATER_SHAKER_MODULE_V1: - valid_slots = [ - slot for slot in ["A1", "B1", "C1", "D1", "A3", "B3", "C3", "D3"] - ] - addressable_areas = [ - "heaterShakerV1A1", - "heaterShakerV1B1", - "heaterShakerV1C1", - "heaterShakerV1D1", - "heaterShakerV1A3", - "heaterShakerV1B3", - "heaterShakerV1C3", - "heaterShakerV1D3", - ] + # only allowed in column 1 & 3 + assert deck_slot.value[-1] in ("1", "3") + return f"heaterShakerV1{deck_slot.value}" + elif model == ModuleModel.TEMPERATURE_MODULE_V2: - valid_slots = [ - slot for slot in ["A1", "B1", "C1", "D1", "A3", "B3", "C3", "D3"] - ] - addressable_areas = [ - "temperatureModuleV2A1", - "temperatureModuleV2B1", - "temperatureModuleV2C1", - "temperatureModuleV2D1", - "temperatureModuleV2A3", - "temperatureModuleV2B3", - "temperatureModuleV2C3", - "temperatureModuleV2D3", - ] + # only allowed in column 1 & 3 + assert deck_slot.value[-1] in ("1", "3") + return f"temperatureModuleV2{deck_slot.value}" + elif model == ModuleModel.THERMOCYCLER_MODULE_V2: return "thermocyclerModuleV2" + elif model == ModuleModel.ABSORBANCE_READER_V1: - valid_slots = ["A3", "B3", "C3", "D3"] - addressable_areas = [ - "absorbanceReaderV1A3", - "absorbanceReaderV1B3", - "absorbanceReaderV1C3", - "absorbanceReaderV1D3", - ] - else: - raise ValueError( - f"Unknown module {model.name} has no addressable areas to provide." - ) + # only allowed in column 3 + assert deck_slot.value[-1] == "3" + return f"absorbanceReaderV1{deck_slot.value}" + + raise ValueError( + f"Unknown module {model.name} has no addressable areas to provide." + ) - map_addressable_area = { - slot: addressable_area - for slot, addressable_area in zip(valid_slots, addressable_areas) - } - return map_addressable_area[deck_slot.value] + def absorbance_reader_dock_location( + self, module_id: str + ) -> AddressableAreaLocation: + """Get the addressable area for the absorbance reader dock.""" + reader_slot = self.get_location(module_id) + lid_dock_slot = get_adjacent_staging_slot(reader_slot.slotName) + assert lid_dock_slot is not None + + return AddressableAreaLocation(addressableAreaName=lid_dock_slot.id) + + def absorbance_reader_dock_location_name(self, module_id: str) -> StagingSlotName: + """Get the addressable area for the absorbance reader dock.""" + reader_slot = self.get_location(module_id) + lid_dock_slot = get_adjacent_staging_slot(reader_slot.slotName) + assert lid_dock_slot is not None + return lid_dock_slot diff --git a/api/src/opentrons/protocol_engine/types.py b/api/src/opentrons/protocol_engine/types.py index e596d2314fe..abc85e649e1 100644 --- a/api/src/opentrons/protocol_engine/types.py +++ b/api/src/opentrons/protocol_engine/types.py @@ -786,6 +786,7 @@ class AreaType(Enum): TEMPERATURE = "temperatureModule" MAGNETICBLOCK = "magneticBlock" ABSORBANCE_READER = "absorbanceReader" + LID_DOCK = "lidDock" @dataclass(frozen=True) diff --git a/api/src/opentrons/types.py b/api/src/opentrons/types.py index 44035851b35..bde056125a4 100644 --- a/api/src/opentrons/types.py +++ b/api/src/opentrons/types.py @@ -282,6 +282,23 @@ def from_primitive(cls, value: DeckLocation) -> DeckSlotName: str_val = str(value).upper() return cls(str_val) + @classmethod + def ot3_slots(cls) -> List["DeckSlotName"]: + return [ + DeckSlotName.SLOT_A1, + DeckSlotName.SLOT_A2, + DeckSlotName.SLOT_A3, + DeckSlotName.SLOT_B1, + DeckSlotName.SLOT_B2, + DeckSlotName.SLOT_B3, + DeckSlotName.SLOT_C1, + DeckSlotName.SLOT_C2, + DeckSlotName.SLOT_C3, + DeckSlotName.SLOT_D1, + DeckSlotName.SLOT_D2, + DeckSlotName.SLOT_D3, + ] + # TODO(mm, 2023-05-08): # Migrate callers off of this method. https://opentrons.atlassian.net/browse/RLAB-345 def as_int(self) -> int: From 7935c4f1eaf90046bc51bba557bf16b361ac678b Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:47:31 -0400 Subject: [PATCH 06/26] PLAT-209 & PLAT-210 add open_lid and close_lid protocol engine commands and bump required version to 2.21 --- .../protocol_api/core/engine/module_core.py | 28 +++- api/src/opentrons/protocol_api/core/module.py | 8 + .../opentrons/protocol_api/module_contexts.py | 18 ++- .../protocol_api/protocol_context.py | 11 +- .../commands/absorbance_reader/__init__.py | 31 ++++ .../commands/absorbance_reader/close_lid.py | 144 ++++++++++++++++++ .../commands/absorbance_reader/open_lid.py | 134 ++++++++++++++++ .../commands/absorbance_reader/types.py | 23 +++ .../commands/command_unions.py | 10 ++ .../protocol_engine/state/geometry.py | 20 ++- .../protocol_engine/state/labware.py | 9 ++ .../absorbance_reader_substate.py | 12 ++ .../test_absorbance_reader_context.py | 2 +- .../opentrons/protocol_engine/conftest.py | 8 + 14 files changed, 448 insertions(+), 10 deletions(-) create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py create mode 100644 api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index 2a9cff4b79e..e90ed09abe6 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -16,13 +16,15 @@ HeaterShakerLabwareLatchStatus, ThermocyclerLidStatus, ) -from opentrons.types import DeckSlotName + from opentrons.protocol_engine import commands as cmd +from opentrons.types import DeckSlotName, StagingSlotName, Point from opentrons.protocol_engine.clients import SyncClient as ProtocolEngineClient from opentrons.protocol_engine.errors.exceptions import ( LabwareNotLoadedOnModuleError, NoMagnetEngageHeightError, ) +from opentrons.protocol_engine.types import AddressableAreaLocation, LabwareOffsetVector from opentrons.protocols.api_support.types import APIVersion @@ -543,3 +545,27 @@ def initiate_read(self) -> None: moduleId=self.module_id, sampleWavelength=self._initialized_value ) ) + + def close_lid( + self, + ) -> None: + """Close the Absorbance Reader's lid.""" + self._engine_client.execute_command( + cmd.absorbance_reader.CloseLidParams( + moduleId=self.module_id, + # FIXME: using staging slot for now (wrong z), but this should be the lid dock slot + pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), + dropOffset=LabwareOffsetVector(x=14, y=0, z=0), + ) + ) + + def open_lid(self) -> None: + """Close the Absorbance Reader's lid.""" + self._engine_client.execute_command( + cmd.absorbance_reader.OpenLidParams( + moduleId=self.module_id, + pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), + # FIXME: using staging slot for now (wrong z), but this should be the lid dock slot + dropOffset=LabwareOffsetVector(x=14, y=0, z=1), + ) + ) diff --git a/api/src/opentrons/protocol_api/core/module.py b/api/src/opentrons/protocol_api/core/module.py index 004bd5c85b6..54356de0353 100644 --- a/api/src/opentrons/protocol_api/core/module.py +++ b/api/src/opentrons/protocol_api/core/module.py @@ -361,3 +361,11 @@ def initialize(self, wavelength: int) -> None: @abstractmethod def initiate_read(self) -> None: """Initiate read on the Absorbance Reader.""" + + @abstractmethod + def close_lid(self) -> None: + """Close the Absorbance Reader's lid.""" + + @abstractmethod + def open_lid(self) -> None: + """Open the Absorbance Reader's lid.""" diff --git a/api/src/opentrons/protocol_api/module_contexts.py b/api/src/opentrons/protocol_api/module_contexts.py index c8947049a96..d732ee0876a 100644 --- a/api/src/opentrons/protocol_api/module_contexts.py +++ b/api/src/opentrons/protocol_api/module_contexts.py @@ -976,23 +976,33 @@ class AbsorbanceReaderContext(ModuleContext): It should not be instantiated directly; instead, it should be created through :py:meth:`.ProtocolContext.load_module`. - .. versionadded:: 2.18 + .. versionadded:: 2.21 """ _core: AbsorbanceReaderCore @property - @requires_version(2, 18) + @requires_version(2, 21) def serial_number(self) -> str: """Get the module's unique hardware serial number.""" return self._core.get_serial_number() - @requires_version(2, 18) + @requires_version(2, 21) + def close_lid(self) -> None: + """Close the lid of the Absorbance Reader.""" + self._core.close_lid() + + @requires_version(2, 21) + def open_lid(self) -> None: + """Close the lid of the Absorbance Reader.""" + self._core.open_lid() + + @requires_version(2, 21) def initialize(self, wavelength: int) -> None: """Initialize the Absorbance Reader by taking zero reading.""" self._core.initialize(wavelength) - @requires_version(2, 18) + @requires_version(2, 21) def initiate_read(self) -> None: """Initiate read on the Absorbance Reader.""" self._core.initiate_read() diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index ad96e0c3156..4a12117dc96 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -19,7 +19,10 @@ from opentrons.types import Mount, Location, DeckLocation, DeckSlotName, StagingSlotName from opentrons.legacy_broker import LegacyBroker from opentrons.hardware_control import SyncHardwareAPI -from opentrons.hardware_control.modules.types import MagneticBlockModel +from opentrons.hardware_control.modules.types import ( + MagneticBlockModel, + AbsorbanceReaderModel, +) from opentrons.legacy_commands import protocol_commands as cmds, types as cmd_types from opentrons.legacy_commands.helpers import stringify_labware_movement_command from opentrons.legacy_commands.publisher import ( @@ -824,6 +827,12 @@ def load_module( until_version="2.15", current_version=f"{self._api_version}", ) + if isinstance( + requested_model, AbsorbanceReaderModel + ) and self._api_version < APIVersion(2, 21): + raise APIVersionError( + f"Module of type {module_name} is only available in versions 2.21 and above." + ) deck_slot = ( None diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py index 6f2db320b4f..566350e767f 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py @@ -1,4 +1,20 @@ """Command models for Absorbance Reader commands.""" +from .types import MoveLidResult +from .close_lid import ( + CloseLidCommandType, + CloseLidParams, + CloseLidResult, + CloseLid, + CloseLidCreate, +) + +from .open_lid import ( + OpenLidCommandType, + OpenLidParams, + OpenLidResult, + OpenLid, + OpenLidCreate, +) from .initialize import ( InitializeCommandType, @@ -16,7 +32,21 @@ MeasureAbsorbanceCreate, ) + __all__ = [ + "MoveLidResult", + # absorbanace_reader/closeLid + "CloseLidCommandType", + "CloseLidParams", + "CloseLidResult", + "CloseLid", + "CloseLidCreate", + # absorbanace_reader/openLid + "OpenLidCommandType", + "OpenLidParams", + "OpenLidResult", + "OpenLid", + "OpenLidCreate", # absorbanace_reader/initialize "InitializeCommandType", "InitializeParams", @@ -29,4 +59,5 @@ "MeasureAbsorbanceResult", "MeasureAbsorbance", "MeasureAbsorbanceCreate", + # union type ] diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py new file mode 100644 index 00000000000..4d17ca08e00 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -0,0 +1,144 @@ +"""Command models to close the lid on an Absorbance Reader.""" +from __future__ import annotations +from typing import Optional, Literal, TYPE_CHECKING +from typing_extensions import Type + +from pydantic import BaseModel, Field + +from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ...errors.error_occurrence import ErrorOccurrence +from opentrons.protocol_engine.types import ( + LabwareOffsetVector, + LabwareMovementOffsetData, + AddressableAreaLocation, + ModuleLocation, +) +from opentrons.protocol_engine.resources import labware_validation +from .types import MoveLidResult + +if TYPE_CHECKING: + from opentrons.protocol_engine.state import StateView + from opentrons.protocol_engine.execution import ( + EquipmentHandler, + LabwareMovementHandler, + ) + + +CloseLidCommandType = Literal["absorbanceReader/closeLid"] + + +class CloseLidParams(BaseModel): + """Input parameters to close the lid on an absorbance reading.""" + + moduleId: str = Field(..., description="Unique ID of the absorbance reader.") + pickUpOffset: Optional[LabwareOffsetVector] = Field( + None, + description="Offset to use when picking up labware. " + "Experimental param, subject to change", + ) + dropOffset: Optional[LabwareOffsetVector] = Field( + None, + description="Offset to use when dropping off labware. " + "Experimental param, subject to change", + ) + + +class CloseLidResult(MoveLidResult): + """Result data from closing the lid on an aborbance reading.""" + + +class CloseLidImpl( + AbstractCommandImpl[CloseLidParams, SuccessData[CloseLidResult, None]] +): + """Execution implementation of closing the lid on an Absorbance Reader.""" + + def __init__( + self, + state_view: StateView, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, + **unused_dependencies: object, + ) -> None: + self._state_view = state_view + self._equipment = equipment + self._labware_movement = labware_movement + + async def execute( + self, params: CloseLidParams + ) -> SuccessData[CloseLidResult, None]: + """Execute the close lid command.""" + + mod_substate = self._state_view.modules.get_absorbance_reader_substate( + module_id=params.moduleId + ) + # Make sure the lid is open + mod_substate.raise_if_lid_status_not_expected(lid_on_expected=False) + + # Allow propagation of ModuleNotAttachedError. + mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) + + # lid should currently be docked + lid_dock_slot = self._state_view.modules.absorbance_reader_dock_location_name( + mod_substate.module_id + ) + loaded_lid = self._state_view.labware.get_by_slot(lid_dock_slot) + assert ( + loaded_lid is not None + ), "Absorbance Reader lid is not present in the lid dock." + assert labware_validation.is_absorbance_reader_lid(loaded_lid.loadName) + + current_location = loaded_lid.location + validated_current_location = ( + self._state_view.geometry.ensure_valid_gripper_location(current_location) + ) + + # we need to move the lid onto the module + new_location = ModuleLocation(moduleId=mod_substate.module_id) + # new_location = self._state_view.modules.get_location(mod_substate.module_id) + validated_new_location = ( + self._state_view.geometry.ensure_valid_gripper_location(new_location) + ) + + # TODO (AA): we probably don't need this, but let's keep it until we're sure + user_offset_data = LabwareMovementOffsetData( + pickUpOffset=params.pickUpOffset or LabwareOffsetVector(x=0, y=0, z=0), + dropOffset=params.dropOffset or LabwareOffsetVector(x=0, y=0, z=0), + ) + # Skips gripper moves when using virtual gripper + await self._labware_movement.move_labware_with_gripper( + labware_id=loaded_lid.id, + current_location=validated_current_location, + new_location=validated_new_location, + user_offset_data=user_offset_data, + post_drop_slide_offset=None, + ) + + new_offset_id = self._equipment.find_applicable_labware_offset_id( + labware_definition_uri=loaded_lid.definitionUri, + labware_location=new_location, + ) + return SuccessData( + public=CloseLidResult( + lidId=loaded_lid.id, newLocation=new_location, offsetId=new_offset_id + ), + private=None, + ) + + +class CloseLid(BaseCommand[CloseLidParams, CloseLidResult, ErrorOccurrence]): + """A command to close the lid on an Absorbance Reader.""" + + commandType: CloseLidCommandType = "absorbanceReader/closeLid" + params: CloseLidParams + result: Optional[CloseLidResult] + + _ImplementationCls: Type[CloseLidImpl] = CloseLidImpl + + +class CloseLidCreate(BaseCommandCreate[CloseLidParams]): + """A request to execute an Absorbance Reader close lid command.""" + + commandType: CloseLidCommandType = "absorbanceReader/closeLid" + params: CloseLidParams + + _CommandCls: Type[CloseLid] = CloseLid diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py new file mode 100644 index 00000000000..a5b04c203e0 --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py @@ -0,0 +1,134 @@ +"""Command models to close the lid on an Absorbance Reader.""" +from __future__ import annotations +from typing import Optional, Literal, TYPE_CHECKING +from typing_extensions import Type + +from pydantic import BaseModel, Field + +from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData +from ...errors.error_occurrence import ErrorOccurrence +from opentrons.protocol_engine.types import ( + LabwareOffsetVector, + LabwareMovementOffsetData, + AddressableAreaLocation, +) +from .types import MoveLidResult +from opentrons.protocol_engine.resources import labware_validation + +if TYPE_CHECKING: + from opentrons.protocol_engine.state import StateView + from opentrons.protocol_engine.execution import ( + EquipmentHandler, + LabwareMovementHandler, + ) + + +OpenLidCommandType = Literal["absorbanceReader/openLid"] + + +class OpenLidParams(BaseModel): + """Input parameters to open the lid on an absorbance reading.""" + + moduleId: str = Field(..., description="Unique ID of the absorbance reader.") + pickUpOffset: Optional[LabwareOffsetVector] = Field( + None, + description="Offset to use when picking up labware. " + "Experimental param, subject to change", + ) + dropOffset: Optional[LabwareOffsetVector] = Field( + None, + description="Offset to use when dropping off labware. " + "Experimental param, subject to change", + ) + + +class OpenLidResult(MoveLidResult): + """Result data from opening the lid on an aborbance reading.""" + + +class OpenLidImpl(AbstractCommandImpl[OpenLidParams, SuccessData[OpenLidResult, None]]): + """Execution implementation of opening the lid on an Absorbance Reader.""" + + def __init__( + self, + state_view: StateView, + equipment: EquipmentHandler, + labware_movement: LabwareMovementHandler, + **unused_dependencies: object, + ) -> None: + self._state_view = state_view + self._equipment = equipment + self._labware_movement = labware_movement + + async def execute(self, params: OpenLidParams) -> SuccessData[OpenLidResult, None]: + """Move the absorbance reader lid from the module to the lid dock.""" + mod_substate = self._state_view.modules.get_absorbance_reader_substate( + module_id=params.moduleId + ) + # Make sure the lid is closed + mod_substate.raise_if_lid_status_not_expected(lid_on_expected=True) + + # Allow propagation of ModuleNotAttachedError. + mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) + + # lid should currently be on the module + lid_id = self._state_view.labware.get_id_by_module(mod_substate.module_id) + loaded_lid = self._state_view.labware.get(lid_id) + assert labware_validation.is_absorbance_reader_lid(loaded_lid.loadName) + + current_location = loaded_lid.location + validated_current_location = ( + self._state_view.geometry.ensure_valid_gripper_location(current_location) + ) + + # we need to move the lid to the lid dock + new_location = self._state_view.modules.absorbance_reader_dock_location( + mod_substate.module_id + ) + validated_new_location = ( + self._state_view.geometry.ensure_valid_gripper_location(new_location) + ) + # TODO (AA): we probably don't need this, but let's keep it until we're sure + user_offset_data = LabwareMovementOffsetData( + pickUpOffset=params.pickUpOffset or LabwareOffsetVector(x=0, y=0, z=0), + dropOffset=params.dropOffset or LabwareOffsetVector(x=0, y=0, z=0), + ) + # Skips gripper moves when using virtual gripper + await self._labware_movement.move_labware_with_gripper( + labware_id=loaded_lid.id, + current_location=validated_current_location, + new_location=validated_new_location, + user_offset_data=user_offset_data, + post_drop_slide_offset=None, + ) + new_offset_id = self._equipment.find_applicable_labware_offset_id( + labware_definition_uri=loaded_lid.definitionUri, + labware_location=new_location, + ) + return SuccessData( + public=OpenLidResult( + lidId=loaded_lid.id, + newLocation=validated_new_location, + offsetId=new_offset_id, + ), + private=None, + ) + + +class OpenLid(BaseCommand[OpenLidParams, OpenLidResult, ErrorOccurrence]): + """A command to open the lid on an Absorbance Reader.""" + + commandType: OpenLidCommandType = "absorbanceReader/openLid" + params: OpenLidParams + result: Optional[OpenLidResult] + + _ImplementationCls: Type[OpenLidImpl] = OpenLidImpl + + +class OpenLidCreate(BaseCommandCreate[OpenLidParams]): + """A request to execute an Absorbance Reader open lid command.""" + + commandType: OpenLidCommandType = "absorbanceReader/openLid" + params: OpenLidParams + + _CommandCls: Type[OpenLid] = OpenLid diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py new file mode 100644 index 00000000000..f23c425b1ab --- /dev/null +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py @@ -0,0 +1,23 @@ +from typing import Optional +from pydantic import BaseModel, Field +from opentrons.protocol_engine.types import LabwareLocation + + +class MoveLidResult(BaseModel): + """Input parameters to open the lid on an absorbance reading.""" + + lidId: str = Field(..., description="Unique ID of the absorbance reader lid.") + newLocation: LabwareLocation = Field(..., description="New location of the lid") + offsetId: Optional[str] = Field( + # Default `None` instead of `...` so this field shows up as non-required in + # OpenAPI. The server is allowed to omit it or make it null. + None, + description=( + "An ID referencing the labware offset that will apply to this labware" + " now that it's in the new location." + " This offset will be in effect until the labware is moved" + " with another `moveLabware` command." + " Null or undefined means no offset applies," + " so the default of (0, 0, 0) will be used." + ), + ) diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 68e59d5e3c5..970f34284eb 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -374,6 +374,8 @@ thermocycler.OpenLid, thermocycler.CloseLid, thermocycler.RunProfile, + absorbance_reader.CloseLid, + absorbance_reader.OpenLid, absorbance_reader.Initialize, absorbance_reader.MeasureAbsorbance, calibration.CalibrateGripper, @@ -442,6 +444,8 @@ thermocycler.OpenLidParams, thermocycler.CloseLidParams, thermocycler.RunProfileParams, + absorbance_reader.CloseLidParams, + absorbance_reader.OpenLidParams, absorbance_reader.InitializeParams, absorbance_reader.MeasureAbsorbanceParams, calibration.CalibrateGripperParams, @@ -508,6 +512,8 @@ thermocycler.OpenLidCommandType, thermocycler.CloseLidCommandType, thermocycler.RunProfileCommandType, + absorbance_reader.CloseLidCommandType, + absorbance_reader.OpenLidCommandType, absorbance_reader.InitializeCommandType, absorbance_reader.MeasureAbsorbanceCommandType, calibration.CalibrateGripperCommandType, @@ -575,6 +581,8 @@ thermocycler.OpenLidCreate, thermocycler.CloseLidCreate, thermocycler.RunProfileCreate, + absorbance_reader.CloseLidCreate, + absorbance_reader.OpenLidCreate, absorbance_reader.InitializeCreate, absorbance_reader.MeasureAbsorbanceCreate, calibration.CalibrateGripperCreate, @@ -643,6 +651,8 @@ thermocycler.OpenLidResult, thermocycler.CloseLidResult, thermocycler.RunProfileResult, + absorbance_reader.CloseLidResult, + absorbance_reader.OpenLidResult, absorbance_reader.InitializeResult, absorbance_reader.MeasureAbsorbanceResult, calibration.CalibrateGripperResult, diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index 112d7d60ef4..adef58c7d88 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -215,11 +215,14 @@ def get_min_travel_z( def get_labware_parent_nominal_position(self, labware_id: str) -> Point: """Get the position of the labware's uncalibrated parent slot (deck, module, or another labware).""" try: - slot_name = self.get_ancestor_slot_name(labware_id).id + addressable_area_name = self.get_ancestor_slot_name(labware_id).id except errors.LocationIsStagingSlotError: - slot_name = self._get_staging_slot_name(labware_id) - slot_pos = self._addressable_areas.get_addressable_area_position(slot_name) + addressable_area_name = self._get_staging_slot_name(labware_id) + except errors.LocationIsLidDockSlotError: + addressable_area_name = self._get_lid_dock_slot_name(labware_id) + slot_pos = self._addressable_areas.get_addressable_area_position(addressable_area_name) labware_data = self._labware.get(labware_id) + offset = self._get_labware_position_offset(labware_id, labware_data.location) return Point( @@ -558,6 +561,12 @@ def _get_staging_slot_name(self, labware_id: str) -> str: raise ValueError( "Cannot get staging slot name for labware not on staging slot." ) + + def _get_lid_dock_slot_name(self, labware_id: str) -> str: + """Get the staging slot name that the labware is on.""" + labware_location = self._labware.get(labware_id).location + assert isinstance(labware_location, AddressableAreaLocation) + return labware_location.addressableAreaName def get_ancestor_slot_name(self, labware_id: str) -> DeckSlotName: """Get the slot name of the labware or the module that the labware is on.""" @@ -576,10 +585,15 @@ def get_ancestor_slot_name(self, labware_id: str) -> DeckSlotName: area_name = labware.location.addressableAreaName # TODO we might want to eventually return some sort of staging slot name when we're ready to work through # the linting nightmare it will create + if self._labware.is_absorbance_reader_lid(labware_id): + raise errors.LocationIsLidDockSlotError( + "Cannot get ancestor slot name for labware on lid dock slot." + ) if fixture_validation.is_staging_slot(area_name): raise errors.LocationIsStagingSlotError( "Cannot get ancestor slot name for labware on staging slot." ) + raise errors.LocationIs slot_name = DeckSlotName.from_primitive(area_name) elif labware.location == OFF_DECK_LOCATION: raise errors.LabwareNotOnDeckError( diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index e9750a652b4..7b3c4962d52 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -29,6 +29,7 @@ from ..resources import DeckFixedLabware, labware_validation, fixture_validation from ..commands import ( Command, + absorbance_reader, LoadLabwareResult, MoveLabwareResult, ReloadLabwareResult, @@ -224,6 +225,14 @@ def _handle_command(self, command: Command) -> None: new_location = OFF_DECK_LOCATION self._state.labware_by_id[labware_id].location = new_location + elif isinstance(command.result, absorbance_reader.MoveLidResult): + lid_id = command.result.lidId + new_location = command.result.newLocation + new_offset_id = command.result.offsetId + + self._state.labware_by_id[lid_id].offsetId = new_offset_id + self._state.labware_by_id[lid_id].location = new_location + def _add_labware_offset(self, labware_offset: LabwareOffset) -> None: """Add a new labware offset to state. diff --git a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py index 03daa32e147..f3d2f4abf38 100644 --- a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +++ b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py @@ -2,8 +2,10 @@ from dataclasses import dataclass from typing import NewType, Optional, List +from opentrons.protocol_engine.errors import CannotPerformModuleAction AbsorbanceReaderId = NewType("AbsorbanceReaderId", str) +AbsorbanceReaderLidId = NewType("AbsorbanceReaderLidId", str) @dataclass(frozen=True) @@ -13,5 +15,15 @@ class AbsorbanceReaderSubState: module_id: AbsorbanceReaderId configured: bool measured: bool + is_lid_on: bool data: Optional[List[float]] configured_wavelength: Optional[int] + + def raise_if_lid_status_not_expected(self, lid_on_expected: bool) -> None: + """Raise if the lid status is not correct.""" + match = self.is_lid_on is lid_on_expected + if not match: + raise CannotPerformModuleAction( + "Cannot perform lid action because the lid is already " + f"{'closed' if self.is_lid_on else 'open'}" + ) diff --git a/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py index 132e6d1cae6..ffc61856b29 100644 --- a/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py +++ b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py @@ -36,7 +36,7 @@ def mock_broker(decoy: Decoy) -> LegacyBroker: @pytest.fixture def api_version() -> APIVersion: """Get an API version to apply to the interface.""" - return MAX_SUPPORTED_VERSION + return APIVersion(2, 21) @pytest.fixture diff --git a/api/tests/opentrons/protocol_engine/conftest.py b/api/tests/opentrons/protocol_engine/conftest.py index df02b53ce38..5040c24afce 100644 --- a/api/tests/opentrons/protocol_engine/conftest.py +++ b/api/tests/opentrons/protocol_engine/conftest.py @@ -98,6 +98,14 @@ def ot3_fixed_trash_def() -> LabwareDefinition: ) +@pytest.fixture(scope="session") +def ot3_absorbance_reader_lid() -> LabwareDefinition: + """Get the definition of the OT-3 plate reader lid.""" + return LabwareDefinition.parse_obj( + load_definition("opentrons_flex_lid_absorbance_plate_reader_module", 1) + ) + + @pytest.fixture(scope="session") def well_plate_def() -> LabwareDefinition: """Get the definition of a 96 well plate.""" From d6200b66815601f5a55ee1fd36099a0519aa9cf4 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:49:46 -0400 Subject: [PATCH 07/26] some changes required to get the app working --- app/src/assets/localization/en/device_details.json | 1 + .../organisms/Devices/hooks/useModuleCalibrationStatus.ts | 8 ++++++-- .../DeckConfigurator/AbsorbanceReaderFixture.tsx | 5 ++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/assets/localization/en/device_details.json b/app/src/assets/localization/en/device_details.json index 919c22212ec..70a31da2a0d 100644 --- a/app/src/assets/localization/en/device_details.json +++ b/app/src/assets/localization/en/device_details.json @@ -3,6 +3,7 @@ "about_module": "About {{name}}", "about_pipette_name": "About {{name}} Pipette", "about_pipette": "About pipette", + "abs_reader_status": "Absorbance Plate Reader Status", "add_fixture_description": "Add this hardware to your deck configuration. It will be referenced during protocol analysis.", "add_to_slot": "Add to slot {{slotName}}", "add": "Add", diff --git a/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts index 941a5b261b4..47b709a80d5 100644 --- a/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts +++ b/app/src/organisms/Devices/hooks/useModuleCalibrationStatus.ts @@ -1,5 +1,8 @@ import omitBy from 'lodash/omitBy' -import { MAGNETIC_BLOCK_TYPE } from '@opentrons/shared-data' +import { + MAGNETIC_BLOCK_TYPE, + ABSORBANCE_READER_TYPE, +} from '@opentrons/shared-data' import { useModuleRenderInfoForProtocolById } from './useModuleRenderInfoForProtocolById' import { useIsFlex } from './useIsFlex' import type { ProtocolCalibrationStatus } from './useRunCalibrationStatus' @@ -13,7 +16,8 @@ export function useModuleCalibrationStatus( const moduleRenderInfoForProtocolById = omitBy( useModuleRenderInfoForProtocolById(runId), moduleRenderInfo => - moduleRenderInfo.moduleDef.moduleType === MAGNETIC_BLOCK_TYPE + moduleRenderInfo.moduleDef.moduleType === MAGNETIC_BLOCK_TYPE || + moduleRenderInfo.moduleDef.moduleType === ABSORBANCE_READER_TYPE ) // only check module calibration for Flex diff --git a/components/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx b/components/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx index ee512436f28..2e755eacbb7 100644 --- a/components/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +++ b/components/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx @@ -9,7 +9,7 @@ import { CONFIG_STYLE_EDITABLE, CONFIG_STYLE_READ_ONLY, FIXTURE_HEIGHT, - COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH, + STAGING_AREA_FIXTURE_WIDTH, Y_ADJUSTMENT, CONFIG_STYLE_SELECTED, } from './constants' @@ -53,7 +53,6 @@ export function AbsorbanceReaderFixture( * so, to get the position of the cutout itself we must add an adjustment to the slot position * the adjustment for x is different for right side/left side */ - // TODO (AA): fix the slot length for the absorbance reader fixture const [xSlotPosition = 0, ySlotPosition = 0] = cutoutDef?.position ?? [] const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT @@ -63,7 +62,7 @@ export function AbsorbanceReaderFixture( const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE return ( Date: Wed, 10 Jul 2024 14:50:46 -0400 Subject: [PATCH 08/26] squash! PLAT-209 & PLAT-210 add open_lid and close_lid protocol engine commands and bump required version to 2.21 --- shared-data/command/schemas/8.json | 150 +++++++++++++++++++++++++++-- 1 file changed, 140 insertions(+), 10 deletions(-) diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index d6fb78e12c3..5beacba02c2 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -59,9 +59,11 @@ "thermocycler/waitForLidTemperature": "#/definitions/WaitForLidTemperatureCreate", "thermocycler/deactivateBlock": "#/definitions/DeactivateBlockCreate", "thermocycler/deactivateLid": "#/definitions/DeactivateLidCreate", - "thermocycler/openLid": "#/definitions/OpenLidCreate", - "thermocycler/closeLid": "#/definitions/CloseLidCreate", + "thermocycler/openLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate", + "thermocycler/closeLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate", "thermocycler/runProfile": "#/definitions/RunProfileCreate", + "absorbanceReader/closeLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", + "absorbanceReader/openLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", "absorbanceReader/initialize": "#/definitions/InitializeCreate", "absorbanceReader/measure": "#/definitions/MeasureAbsorbanceCreate", "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", @@ -234,14 +236,20 @@ "$ref": "#/definitions/DeactivateLidCreate" }, { - "$ref": "#/definitions/OpenLidCreate" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate" }, { - "$ref": "#/definitions/CloseLidCreate" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate" }, { "$ref": "#/definitions/RunProfileCreate" }, + { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate" + }, + { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate" + }, { "$ref": "#/definitions/InitializeCreate" }, @@ -3651,7 +3659,7 @@ }, "required": ["params"] }, - "OpenLidParams": { + "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams": { "title": "OpenLidParams", "description": "Input parameters to open a Thermocycler's lid.", "type": "object", @@ -3664,7 +3672,7 @@ }, "required": ["moduleId"] }, - "OpenLidCreate": { + "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate": { "title": "OpenLidCreate", "description": "A request to open a Thermocycler's lid.", "type": "object", @@ -3676,7 +3684,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/OpenLidParams" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", @@ -3694,7 +3702,7 @@ }, "required": ["params"] }, - "CloseLidParams": { + "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams": { "title": "CloseLidParams", "description": "Input parameters to close a Thermocycler's lid.", "type": "object", @@ -3707,7 +3715,7 @@ }, "required": ["moduleId"] }, - "CloseLidCreate": { + "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate": { "title": "CloseLidCreate", "description": "A request to close a Thermocycler's lid.", "type": "object", @@ -3719,7 +3727,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/CloseLidParams" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", @@ -3811,6 +3819,128 @@ }, "required": ["params"] }, + "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams": { + "title": "CloseLidParams", + "description": "Input parameters to close the lid on an absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the absorbance reader.", + "type": "string" + }, + "pickUpOffset": { + "title": "Pickupoffset", + "description": "Offset to use when picking up labware. Experimental param, subject to change", + "allOf": [ + { + "$ref": "#/definitions/LabwareOffsetVector" + } + ] + }, + "dropOffset": { + "title": "Dropoffset", + "description": "Offset to use when dropping off labware. Experimental param, subject to change", + "allOf": [ + { + "$ref": "#/definitions/LabwareOffsetVector" + } + ] + } + }, + "required": ["moduleId"] + }, + "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate": { + "title": "CloseLidCreate", + "description": "A request to execute an Absorbance Reader close lid command.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/closeLid", + "enum": ["absorbanceReader/closeLid"], + "type": "string" + }, + "params": { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": ["params"] + }, + "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams": { + "title": "OpenLidParams", + "description": "Input parameters to open the lid on an absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the absorbance reader.", + "type": "string" + }, + "pickUpOffset": { + "title": "Pickupoffset", + "description": "Offset to use when picking up labware. Experimental param, subject to change", + "allOf": [ + { + "$ref": "#/definitions/LabwareOffsetVector" + } + ] + }, + "dropOffset": { + "title": "Dropoffset", + "description": "Offset to use when dropping off labware. Experimental param, subject to change", + "allOf": [ + { + "$ref": "#/definitions/LabwareOffsetVector" + } + ] + } + }, + "required": ["moduleId"] + }, + "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate": { + "title": "OpenLidCreate", + "description": "A request to execute an Absorbance Reader open lid command.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/openLid", + "enum": ["absorbanceReader/openLid"], + "type": "string" + }, + "params": { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": ["params"] + }, "InitializeParams": { "title": "InitializeParams", "description": "Input parameters to initialize an absorbance reading.", From febc1d2a4995440eaa77379551f28e70f0460bb9 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:51:37 -0400 Subject: [PATCH 09/26] update absorbance module offset in definition --- .../definitions/3/absorbanceReaderV1.json | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/shared-data/module/definitions/3/absorbanceReaderV1.json b/shared-data/module/definitions/3/absorbanceReaderV1.json index 36da3585d6c..c925cc687d5 100644 --- a/shared-data/module/definitions/3/absorbanceReaderV1.json +++ b/shared-data/module/definitions/3/absorbanceReaderV1.json @@ -5,7 +5,7 @@ "labwareOffset": { "x": 0.0, "y": 0.0, - "z": 16.0 + "z": 0.65 }, "dimensions": { "bareOverallHeight": 18.5, @@ -26,20 +26,6 @@ "y": 64.93, "z": 97.8 }, - "gripperOffsets": { - "default": { - "pickUpOffset": { - "x": 0, - "y": 0, - "z": 4.6 - }, - "dropOffset": { - "x": 0, - "y": 0, - "z": 5.6 - } - } - }, "displayName": "Absorbance Plate Reader Module GEN1", "quirks": [], "slotTransforms": { @@ -47,6 +33,13 @@ "ot2_short_trash": {}, "ot3_standard": {} }, + "peripherals": [ + { + "loadName": "opentrons_flex_lid_absorbance_plate_reader_module", + "version": 1, + "namespace": "opentrons" + } + ], "compatibleWith": [], "incompatibleWithDecks": ["ot2_standard"], "twoDimensionalRendering": { @@ -55,7 +48,7 @@ "value": "", "attributes": { "version": "1.1", - "id": "magneticblock", + "id": "absorbanceReader", "xmlns": "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink", "width": "134", From d656112991d099093c43041b912917dc4f17be9f Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:05:32 -0400 Subject: [PATCH 10/26] add a protocol engine error --- .../opentrons/protocol_engine/errors/__init__.py | 2 ++ .../opentrons/protocol_engine/errors/exceptions.py | 13 +++++++++++++ api/src/opentrons/protocol_engine/state/labware.py | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/api/src/opentrons/protocol_engine/errors/__init__.py b/api/src/opentrons/protocol_engine/errors/__init__.py index 994e4cc9ed3..639648e820f 100644 --- a/api/src/opentrons/protocol_engine/errors/__init__.py +++ b/api/src/opentrons/protocol_engine/errors/__init__.py @@ -65,6 +65,7 @@ LocationIsOccupiedError, LocationNotAccessibleByPipetteError, LocationIsStagingSlotError, + LocationIsLidDockSlotError, InvalidAxisForRobotType, NotSupportedOnRobotType, CommandNotAllowedError, @@ -139,6 +140,7 @@ "LocationIsOccupiedError", "LocationNotAccessibleByPipetteError", "LocationIsStagingSlotError", + "LocationIsLidDockSlotError", "InvalidAxisForRobotType", "NotSupportedOnRobotType", # error occurrence models diff --git a/api/src/opentrons/protocol_engine/errors/exceptions.py b/api/src/opentrons/protocol_engine/errors/exceptions.py index 253c037598a..8d8ed34fb9f 100644 --- a/api/src/opentrons/protocol_engine/errors/exceptions.py +++ b/api/src/opentrons/protocol_engine/errors/exceptions.py @@ -897,6 +897,19 @@ def __init__( super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) +class LocationIsLidDockSlotError(ProtocolEngineError): + """Raised when referencing a labware on a lid dock slot when trying to get standard deck slot.""" + + def __init__( + self, + message: Optional[str] = None, + details: Optional[Dict[str, Any]] = None, + wrapping: Optional[Sequence[EnumeratedError]] = None, + ) -> None: + """Build a LocationIsLidDockSlotError.""" + super().__init__(ErrorCodes.GENERAL_ERROR, message, details, wrapping) + + class FirmwareUpdateRequired(ProtocolEngineError): """Raised when the firmware needs to be updated.""" diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 7b3c4962d52..2241d3a41f7 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -712,6 +712,10 @@ def get_fixed_trash_id(self) -> Optional[str]: def is_fixed_trash(self, labware_id: str) -> bool: """Check if labware is fixed trash.""" return self.get_has_quirk(labware_id, "fixedTrash") + + def is_absorbance_reader_lid(self, labware_id: str) -> bool: + """Check if labware is an absorbance reader lid.""" + return labware_validation.is_absorbance_reader_lid(self.get(labware_id).loadName) def raise_if_labware_inaccessible_by_pipette(self, labware_id: str) -> None: """Raise an error if the specified location cannot be reached via a pipette.""" From 262cdf20a3651d4c2a3b9e0fb9b4e94ef4145214 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:08:09 -0400 Subject: [PATCH 11/26] error handling --- .../opentrons/protocol_api/core/engine/labware.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/labware.py b/api/src/opentrons/protocol_api/core/engine/labware.py index abe6e3c70bd..aaada559950 100644 --- a/api/src/opentrons/protocol_api/core/engine/labware.py +++ b/api/src/opentrons/protocol_api/core/engine/labware.py @@ -9,7 +9,11 @@ from opentrons_shared_data.labware.labware_definition import LabwareRole from opentrons.protocol_engine import commands as cmd -from opentrons.protocol_engine.errors import LabwareNotOnDeckError, ModuleNotOnDeckError +from opentrons.protocol_engine.errors import ( + LabwareNotOnDeckError, + ModuleNotOnDeckError, + LocationIsStagingSlotError, +) from opentrons.protocol_engine.clients import SyncClient as ProtocolEngineClient from opentrons.protocol_engine.types import ( LabwareOffsetCreate, @@ -185,5 +189,9 @@ def get_deck_slot(self) -> Optional[DeckSlotName]: return self._engine_client.state.geometry.get_ancestor_slot_name( self.labware_id ) - except (LabwareNotOnDeckError, ModuleNotOnDeckError): + except ( + LabwareNotOnDeckError, + ModuleNotOnDeckError, + LocationIsStagingSlotError, + ): return None From eb053b198bb465e057cf7d1ed1e55434827ab4ce Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:08:23 -0400 Subject: [PATCH 12/26] update setup-py --- api/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/setup.py b/api/setup.py index 1b2a7dde508..92f06b49bef 100755 --- a/api/setup.py +++ b/api/setup.py @@ -65,6 +65,7 @@ def get_version(): "pyserial>=3.5", "typing-extensions>=4.0.0,<5", "click>=8.0.0,<9", + "pyusb==1.2.1", 'importlib-metadata >= 1.0 ; python_version < "3.8"', "packaging>=21.0", ] From fece1e7106a965fe4c49304a7f6e03aeb3966b46 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:09:05 -0400 Subject: [PATCH 13/26] format --- api/src/opentrons/drivers/absorbance_reader/async_byonoy.py | 2 +- api/src/opentrons/protocol_engine/state/geometry.py | 6 ++++-- api/src/opentrons/protocol_engine/state/labware.py | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py index 2c97e7cc6f0..f21010deb0f 100644 --- a/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py +++ b/api/src/opentrons/drivers/absorbance_reader/async_byonoy.py @@ -311,4 +311,4 @@ def convert_plate_presence( "OCCUPIED": AbsorbanceReaderPlatePresence.PRESENT, "UNDETERMINED": AbsorbanceReaderPlatePresence.UNKNOWN, } - return state_map[slot_state] \ No newline at end of file + return state_map[slot_state] diff --git a/api/src/opentrons/protocol_engine/state/geometry.py b/api/src/opentrons/protocol_engine/state/geometry.py index adef58c7d88..1277cff15a8 100644 --- a/api/src/opentrons/protocol_engine/state/geometry.py +++ b/api/src/opentrons/protocol_engine/state/geometry.py @@ -220,7 +220,9 @@ def get_labware_parent_nominal_position(self, labware_id: str) -> Point: addressable_area_name = self._get_staging_slot_name(labware_id) except errors.LocationIsLidDockSlotError: addressable_area_name = self._get_lid_dock_slot_name(labware_id) - slot_pos = self._addressable_areas.get_addressable_area_position(addressable_area_name) + slot_pos = self._addressable_areas.get_addressable_area_position( + addressable_area_name + ) labware_data = self._labware.get(labware_id) offset = self._get_labware_position_offset(labware_id, labware_data.location) @@ -561,7 +563,7 @@ def _get_staging_slot_name(self, labware_id: str) -> str: raise ValueError( "Cannot get staging slot name for labware not on staging slot." ) - + def _get_lid_dock_slot_name(self, labware_id: str) -> str: """Get the staging slot name that the labware is on.""" labware_location = self._labware.get(labware_id).location diff --git a/api/src/opentrons/protocol_engine/state/labware.py b/api/src/opentrons/protocol_engine/state/labware.py index 2241d3a41f7..f2cfb3b9a42 100644 --- a/api/src/opentrons/protocol_engine/state/labware.py +++ b/api/src/opentrons/protocol_engine/state/labware.py @@ -712,10 +712,12 @@ def get_fixed_trash_id(self) -> Optional[str]: def is_fixed_trash(self, labware_id: str) -> bool: """Check if labware is fixed trash.""" return self.get_has_quirk(labware_id, "fixedTrash") - + def is_absorbance_reader_lid(self, labware_id: str) -> bool: """Check if labware is an absorbance reader lid.""" - return labware_validation.is_absorbance_reader_lid(self.get(labware_id).loadName) + return labware_validation.is_absorbance_reader_lid( + self.get(labware_id).loadName + ) def raise_if_labware_inaccessible_by_pipette(self, labware_id: str) -> None: """Raise an error if the specified location cannot be reached via a pipette.""" From 58ace2d805edb38fa0fcc0dfcd8994325460ab6d Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Wed, 10 Jul 2024 18:04:12 -0400 Subject: [PATCH 14/26] AddAbsorbanceReaderLidAction to add lid id as module substate --- .../protocol_api/core/engine/protocol.py | 6 ++- .../protocol_engine/actions/__init__.py | 2 + .../protocol_engine/actions/actions.py | 12 ++++++ .../protocol_engine/clients/sync_client.py | 6 +++ .../commands/absorbance_reader/close_lid.py | 9 +---- .../commands/absorbance_reader/open_lid.py | 4 +- .../protocol_engine/protocol_engine.py | 7 ++++ .../absorbance_reader_substate.py | 1 + .../protocol_engine/state/modules.py | 39 ++++++++++++++++++- 9 files changed, 75 insertions(+), 11 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index ab5d3561770..5eefabbad7c 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -455,13 +455,17 @@ def _load_module_lid( module_id=module_core.module_id ) ) - self.load_labware( + lid = self.load_labware( load_name="opentrons_flex_lid_absorbance_plate_reader_module", location=lid_slot, namespace="opentrons", version=1, label="Absorbance Reader Lid", ) + self._engine_client.add_absorbance_reader_lid( + module_id=module_core.module_id, + lid_id=lid.labware_id, + ) def _create_non_connected_module_core( self, load_module_result: LoadModuleResult diff --git a/api/src/opentrons/protocol_engine/actions/__init__.py b/api/src/opentrons/protocol_engine/actions/__init__.py index ac3fc653976..ebcd719ef8a 100644 --- a/api/src/opentrons/protocol_engine/actions/__init__.py +++ b/api/src/opentrons/protocol_engine/actions/__init__.py @@ -27,6 +27,7 @@ DoorChangeAction, ResetTipsAction, SetPipetteMovementSpeedAction, + AddAbsorbanceReaderLidAction, ) __all__ = [ @@ -54,6 +55,7 @@ "DoorChangeAction", "ResetTipsAction", "SetPipetteMovementSpeedAction", + "AddAbsorbanceReaderLidAction", # action payload values "PauseSource", "FinishErrorDetails", diff --git a/api/src/opentrons/protocol_engine/actions/actions.py b/api/src/opentrons/protocol_engine/actions/actions.py index 146051346b7..2ba9d25a269 100644 --- a/api/src/opentrons/protocol_engine/actions/actions.py +++ b/api/src/opentrons/protocol_engine/actions/actions.py @@ -260,6 +260,17 @@ class SetPipetteMovementSpeedAction: speed: Optional[float] +@dataclass(frozen=True) +class AddAbsorbanceReaderLidAction: + """Add the absorbance reader lid id to the absorbance reader module substate. + + This action is dispatched the absorbance reader module is first loaded. + """ + + module_id: str + lid_id: str + + Action = Union[ PlayAction, PauseAction, @@ -279,4 +290,5 @@ class SetPipetteMovementSpeedAction: AddLiquidAction, ResetTipsAction, SetPipetteMovementSpeedAction, + AddAbsorbanceReaderLidAction, ] diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index f772d81cea8..e102920ad70 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -113,6 +113,12 @@ def add_addressable_area(self, addressable_area_name: str) -> None: "add_addressable_area", addressable_area_name=addressable_area_name ) + def add_absorbance_reader_lid(self, module_id: str, lid_id: str) -> None: + """Add an absorbance reader lid to the module state.""" + self._transport.call_method( + "add_absorbance_reader_lid", module_id=module_id, lid_id=lid_id + ) + def add_liquid( self, name: str, color: Optional[str], description: Optional[str] ) -> Liquid: diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 4d17ca08e00..858d8facc8b 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -78,13 +78,8 @@ async def execute( mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) # lid should currently be docked - lid_dock_slot = self._state_view.modules.absorbance_reader_dock_location_name( - mod_substate.module_id - ) - loaded_lid = self._state_view.labware.get_by_slot(lid_dock_slot) - assert ( - loaded_lid is not None - ), "Absorbance Reader lid is not present in the lid dock." + assert mod_substate.lid_id is not None + loaded_lid = self._state_view.labware.get(mod_substate.lid_id) assert labware_validation.is_absorbance_reader_lid(loaded_lid.loadName) current_location = loaded_lid.location diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py index a5b04c203e0..1ca7b6571a3 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py @@ -72,8 +72,8 @@ async def execute(self, params: OpenLidParams) -> SuccessData[OpenLidResult, Non mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) # lid should currently be on the module - lid_id = self._state_view.labware.get_id_by_module(mod_substate.module_id) - loaded_lid = self._state_view.labware.get(lid_id) + assert mod_substate.lid_id is not None + loaded_lid = self._state_view.labware.get(mod_substate.lid_id) assert labware_validation.is_absorbance_reader_lid(loaded_lid.loadName) current_location = loaded_lid.location diff --git a/api/src/opentrons/protocol_engine/protocol_engine.py b/api/src/opentrons/protocol_engine/protocol_engine.py index 1c62404da16..ab0d0ea443b 100644 --- a/api/src/opentrons/protocol_engine/protocol_engine.py +++ b/api/src/opentrons/protocol_engine/protocol_engine.py @@ -54,6 +54,7 @@ HardwareStoppedAction, ResetTipsAction, SetPipetteMovementSpeedAction, + AddAbsorbanceReaderLidAction, ) @@ -545,6 +546,12 @@ def add_addressable_area(self, addressable_area_name: str) -> None: AddAddressableAreaAction(addressable_area=area) ) + def add_absorbance_reader_lid(self, module_id: str, lid_id: str) -> None: + """Add an absorbance reader lid to the module state.""" + self._action_dispatcher.dispatch( + AddAbsorbanceReaderLidAction(module_id=module_id, lid_id=lid_id) + ) + def reset_tips(self, labware_id: str) -> None: """Reset the tip state of a given labware.""" # TODO(mm, 2023-03-10): Safely raise an error if the given labware isn't a diff --git a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py index f3d2f4abf38..255a3c752ac 100644 --- a/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +++ b/api/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py @@ -18,6 +18,7 @@ class AbsorbanceReaderSubState: is_lid_on: bool data: Optional[List[float]] configured_wavelength: Optional[int] + lid_id: Optional[str] def raise_if_lid_status_not_expected(self, lid_on_expected: bool) -> None: """Raise if the lid status is not correct.""" diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index dcd63f65efa..809c865b8ec 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -59,7 +59,12 @@ thermocycler, absorbance_reader, ) -from ..actions import Action, SucceedCommandAction, AddModuleAction +from ..actions import ( + Action, + SucceedCommandAction, + AddModuleAction, + AddAbsorbanceReaderLidAction, +) from .abstract_store import HasState, HandlesActions from .module_substates import ( MagneticModuleSubState, @@ -214,6 +219,11 @@ def handle_action(self, action: Action) -> None: requested_model=None, module_live_data=action.module_live_data, ) + elif isinstance(action, AddAbsorbanceReaderLidAction): + self._update_absorbance_reader_lid_id( + module_id=action.module_id, + lid_id=action.lid_id, + ) def _handle_command(self, command: Command) -> None: if isinstance(command.result, LoadModuleResult): @@ -280,6 +290,27 @@ def _handle_command(self, command: Command) -> None: ): self._handle_absorbance_reader_commands(command) + def _update_absorbance_reader_lid_id( + self, + module_id: str, + lid_id: str, + ) -> None: + abs_substate = self._state.substate_by_module_id.get(module_id) + assert isinstance( + abs_substate, AbsorbanceReaderSubState + ), f"{module_id} is not an absorbance plate reader." + + prev_state: AbsorbanceReaderSubState = abs_substate + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=prev_state.configured, + measured=prev_state.measured, + is_lid_on=prev_state.is_lid_on, + data=prev_state.data, + configured_wavelength=prev_state.configured_wavelength, + lid_id=lid_id, + ) + def _add_module_substate( self, module_id: str, @@ -346,6 +377,7 @@ def _add_module_substate( is_lid_on=False, data=None, configured_wavelength=None, + lid_id=None, ) def _update_additional_slots_occupied_by_thermocycler( @@ -554,6 +586,7 @@ def _handle_absorbance_reader_commands( configured = absorbance_reader_substate.configured configured_wavelength = absorbance_reader_substate.configured_wavelength is_lid_on = absorbance_reader_substate.is_lid_on + lid_id = absorbance_reader_substate.lid_id if isinstance(command.result, absorbance_reader.InitializeResult): self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( @@ -563,6 +596,7 @@ def _handle_absorbance_reader_commands( is_lid_on=is_lid_on, data=None, configured_wavelength=command.params.sampleWavelength, + lid_id=lid_id, ) elif isinstance(command.result, absorbance_reader.MeasureAbsorbanceResult): self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( @@ -572,6 +606,7 @@ def _handle_absorbance_reader_commands( is_lid_on=is_lid_on, measured=True, data=command.result.data, + lid_id=lid_id, ) elif isinstance(command.result, absorbance_reader.OpenLidResult): @@ -582,6 +617,7 @@ def _handle_absorbance_reader_commands( is_lid_on=False, measured=True, data=None, + lid_id=lid_id, ) elif isinstance(command.result, absorbance_reader.CloseLidResult): @@ -592,6 +628,7 @@ def _handle_absorbance_reader_commands( is_lid_on=True, measured=True, data=None, + lid_id=lid_id, ) From cda987a12a1bca42e787db83e80d3b1d1c03c04e Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:20:08 -0400 Subject: [PATCH 15/26] fix linter errors --- api/src/opentrons/protocol_api/core/engine/module_core.py | 4 ++-- .../protocol_engine/commands/absorbance_reader/close_lid.py | 4 +--- .../protocol_engine/commands/absorbance_reader/open_lid.py | 3 +-- .../protocol_engine/commands/absorbance_reader/types.py | 2 ++ api/src/opentrons/protocol_engine/state/modules.py | 1 - .../opentrons/protocol_api/test_absorbance_reader_context.py | 2 +- 6 files changed, 7 insertions(+), 9 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index e90ed09abe6..ac82ae4ebc2 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -18,13 +18,13 @@ ) from opentrons.protocol_engine import commands as cmd -from opentrons.types import DeckSlotName, StagingSlotName, Point +from opentrons.types import DeckSlotName from opentrons.protocol_engine.clients import SyncClient as ProtocolEngineClient from opentrons.protocol_engine.errors.exceptions import ( LabwareNotLoadedOnModuleError, NoMagnetEngageHeightError, ) -from opentrons.protocol_engine.types import AddressableAreaLocation, LabwareOffsetVector +from opentrons.protocol_engine.types import LabwareOffsetVector from opentrons.protocols.api_support.types import APIVersion diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 858d8facc8b..71a6b8cc462 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -10,7 +10,6 @@ from opentrons.protocol_engine.types import ( LabwareOffsetVector, LabwareMovementOffsetData, - AddressableAreaLocation, ModuleLocation, ) from opentrons.protocol_engine.resources import labware_validation @@ -67,7 +66,6 @@ async def execute( self, params: CloseLidParams ) -> SuccessData[CloseLidResult, None]: """Execute the close lid command.""" - mod_substate = self._state_view.modules.get_absorbance_reader_substate( module_id=params.moduleId ) @@ -75,7 +73,7 @@ async def execute( mod_substate.raise_if_lid_status_not_expected(lid_on_expected=False) # Allow propagation of ModuleNotAttachedError. - mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) + _ = self._equipment.get_module_hardware_api(mod_substate.module_id) # lid should currently be docked assert mod_substate.lid_id is not None diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py index 1ca7b6571a3..fc55b8e8152 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py @@ -10,7 +10,6 @@ from opentrons.protocol_engine.types import ( LabwareOffsetVector, LabwareMovementOffsetData, - AddressableAreaLocation, ) from .types import MoveLidResult from opentrons.protocol_engine.resources import labware_validation @@ -69,7 +68,7 @@ async def execute(self, params: OpenLidParams) -> SuccessData[OpenLidResult, Non mod_substate.raise_if_lid_status_not_expected(lid_on_expected=True) # Allow propagation of ModuleNotAttachedError. - mod_hw = self._equipment.get_module_hardware_api(mod_substate.module_id) + _ = self._equipment.get_module_hardware_api(mod_substate.module_id) # lid should currently be on the module assert mod_substate.lid_id is not None diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py index f23c425b1ab..5595502d6a1 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/types.py @@ -1,3 +1,5 @@ +"""Move Lid Result model.""" + from typing import Optional from pydantic import BaseModel, Field from opentrons.protocol_engine.types import LabwareLocation diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 809c865b8ec..d425817d50f 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -40,7 +40,6 @@ ModuleType, ModuleDefinition, DeckSlotLocation, - StagingSlotLocation, ModuleDimensions, LabwareOffsetVector, HeaterShakerLatchStatus, diff --git a/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py index ffc61856b29..61b65755350 100644 --- a/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py +++ b/api/tests/opentrons/protocol_api/test_absorbance_reader_context.py @@ -4,7 +4,7 @@ from opentrons.legacy_broker import LegacyBroker from opentrons.protocols.api_support.types import APIVersion -from opentrons.protocol_api import MAX_SUPPORTED_VERSION, AbsorbanceReaderContext +from opentrons.protocol_api import AbsorbanceReaderContext from opentrons.protocol_api.core.common import ProtocolCore, AbsorbanceReaderCore from opentrons.protocol_api.core.core_map import LoadedCoreMap From 772d913248946a29e067fde02bd410f1b207e090 Mon Sep 17 00:00:00 2001 From: ahiuchingau <20424172+ahiuchingau@users.noreply.github.com> Date: Thu, 11 Jul 2024 23:14:01 -0400 Subject: [PATCH 16/26] simplified protocol commmands --- .../protocol_api/core/engine/module_core.py | 4 +- api/src/opentrons/protocol_api/core/module.py | 4 +- .../opentrons/protocol_api/module_contexts.py | 4 +- .../commands/absorbance_reader/__init__.py | 22 +++++----- .../absorbance_reader/{measure.py => read.py} | 42 +++++++++---------- .../commands/command_unions.py | 10 ++--- .../protocol_engine/state/modules.py | 6 +-- .../engine/test_absorbance_reader_core.py | 6 +-- shared-data/command/schemas/8.json | 14 +++---- 9 files changed, 55 insertions(+), 57 deletions(-) rename api/src/opentrons/protocol_engine/commands/absorbance_reader/{measure.py => read.py} (64%) diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index ac82ae4ebc2..5bfd3a2ca79 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -537,11 +537,11 @@ def initialize(self, wavelength: int) -> None: ) self._initialized_value = wavelength - def initiate_read(self) -> None: + def read(self) -> None: """Initiate read on the Absorbance Reader.""" if self._initialized_value: self._engine_client.execute_command( - cmd.absorbance_reader.MeasureAbsorbanceParams( + cmd.absorbance_reader.ReadAbsorbanceParams( moduleId=self.module_id, sampleWavelength=self._initialized_value ) ) diff --git a/api/src/opentrons/protocol_api/core/module.py b/api/src/opentrons/protocol_api/core/module.py index 54356de0353..b4c7c263375 100644 --- a/api/src/opentrons/protocol_api/core/module.py +++ b/api/src/opentrons/protocol_api/core/module.py @@ -359,8 +359,8 @@ def initialize(self, wavelength: int) -> None: """Initialize the Absorbance Reader by taking zero reading.""" @abstractmethod - def initiate_read(self) -> None: - """Initiate read on the Absorbance Reader.""" + def read(self) -> None: + """Get an absorbance reading from the Absorbance Reader.""" @abstractmethod def close_lid(self) -> None: diff --git a/api/src/opentrons/protocol_api/module_contexts.py b/api/src/opentrons/protocol_api/module_contexts.py index d732ee0876a..adecafe248b 100644 --- a/api/src/opentrons/protocol_api/module_contexts.py +++ b/api/src/opentrons/protocol_api/module_contexts.py @@ -1003,6 +1003,6 @@ def initialize(self, wavelength: int) -> None: self._core.initialize(wavelength) @requires_version(2, 21) - def initiate_read(self) -> None: + def read(self) -> None: """Initiate read on the Absorbance Reader.""" - self._core.initiate_read() + self._core.read() diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py index 566350e767f..09307e85230 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py @@ -24,12 +24,12 @@ InitializeCreate, ) -from .measure import ( - MeasureAbsorbanceCommandType, - MeasureAbsorbanceParams, - MeasureAbsorbanceResult, - MeasureAbsorbance, - MeasureAbsorbanceCreate, +from .read import ( + ReadAbsorbanceCommandType, + ReadAbsorbanceParams, + ReadAbsorbanceResult, + ReadAbsorbance, + ReadAbsorbanceCreate, ) @@ -54,10 +54,10 @@ "Initialize", "InitializeCreate", # absorbanace_reader/measure - "MeasureAbsorbanceCommandType", - "MeasureAbsorbanceParams", - "MeasureAbsorbanceResult", - "MeasureAbsorbance", - "MeasureAbsorbanceCreate", + "ReadAbsorbanceCommandType", + "ReadAbsorbanceParams", + "ReadAbsorbanceResult", + "ReadAbsorbance", + "ReadAbsorbanceCreate", # union type ] diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py similarity index 64% rename from api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py rename to api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py index 53b87bd2649..327613dcfb2 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/measure.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/read.py @@ -1,4 +1,4 @@ -"""Command models to measure absorbance.""" +"""Command models to read absorbance.""" from __future__ import annotations from typing import List, Optional, TYPE_CHECKING from typing_extensions import Literal, Type @@ -13,17 +13,17 @@ from opentrons.protocol_engine.execution import EquipmentHandler -MeasureAbsorbanceCommandType = Literal["absorbanceReader/measure"] +ReadAbsorbanceCommandType = Literal["absorbanceReader/read"] -class MeasureAbsorbanceParams(BaseModel): +class ReadAbsorbanceParams(BaseModel): """Input parameters for a single absorbance reading.""" moduleId: str = Field(..., description="Unique ID of the Absorbance Reader.") sampleWavelength: int = Field(..., description="Sample wavelength in nm.") -class MeasureAbsorbanceResult(BaseModel): +class ReadAbsorbanceResult(BaseModel): """Result data from running an aborbance reading.""" # TODO: Transform this into a more complex model, such as a map with well names. @@ -32,10 +32,8 @@ class MeasureAbsorbanceResult(BaseModel): ) -class MeasureAbsorbanceImpl( - AbstractCommandImpl[ - MeasureAbsorbanceParams, SuccessData[MeasureAbsorbanceResult, None] - ] +class ReadAbsorbanceImpl( + AbstractCommandImpl[ReadAbsorbanceParams, SuccessData[ReadAbsorbanceResult, None]] ): """Execution implementation of an Absorbance Reader measurement.""" @@ -49,8 +47,8 @@ def __init__( self._equipment = equipment async def execute( - self, params: MeasureAbsorbanceParams - ) -> SuccessData[MeasureAbsorbanceResult, None]: + self, params: ReadAbsorbanceParams + ) -> SuccessData[ReadAbsorbanceResult, None]: """Initiate a single absorbance measurement.""" abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate( module_id=params.moduleId @@ -63,32 +61,32 @@ async def execute( if abs_reader is not None: result = await abs_reader.start_measure(wavelength=params.sampleWavelength) return SuccessData( - public=MeasureAbsorbanceResult(data=result), + public=ReadAbsorbanceResult(data=result), private=None, ) return SuccessData( - public=MeasureAbsorbanceResult(data=None), + public=ReadAbsorbanceResult(data=None), private=None, ) -class MeasureAbsorbance( - BaseCommand[MeasureAbsorbanceParams, MeasureAbsorbanceResult, ErrorOccurrence] +class ReadAbsorbance( + BaseCommand[ReadAbsorbanceParams, ReadAbsorbanceResult, ErrorOccurrence] ): """A command to execute an Absorbance Reader measurement.""" - commandType: MeasureAbsorbanceCommandType = "absorbanceReader/measure" - params: MeasureAbsorbanceParams - result: Optional[MeasureAbsorbanceResult] + commandType: ReadAbsorbanceCommandType = "absorbanceReader/read" + params: ReadAbsorbanceParams + result: Optional[ReadAbsorbanceResult] - _ImplementationCls: Type[MeasureAbsorbanceImpl] = MeasureAbsorbanceImpl + _ImplementationCls: Type[ReadAbsorbanceImpl] = ReadAbsorbanceImpl -class MeasureAbsorbanceCreate(BaseCommandCreate[MeasureAbsorbanceParams]): +class ReadAbsorbanceCreate(BaseCommandCreate[ReadAbsorbanceParams]): """A request to execute an Absorbance Reader measurement.""" - commandType: MeasureAbsorbanceCommandType = "absorbanceReader/measure" - params: MeasureAbsorbanceParams + commandType: ReadAbsorbanceCommandType = "absorbanceReader/read" + params: ReadAbsorbanceParams - _CommandCls: Type[MeasureAbsorbance] = MeasureAbsorbance + _CommandCls: Type[ReadAbsorbance] = ReadAbsorbance diff --git a/api/src/opentrons/protocol_engine/commands/command_unions.py b/api/src/opentrons/protocol_engine/commands/command_unions.py index 970f34284eb..b292d0d59b2 100644 --- a/api/src/opentrons/protocol_engine/commands/command_unions.py +++ b/api/src/opentrons/protocol_engine/commands/command_unions.py @@ -377,7 +377,7 @@ absorbance_reader.CloseLid, absorbance_reader.OpenLid, absorbance_reader.Initialize, - absorbance_reader.MeasureAbsorbance, + absorbance_reader.ReadAbsorbance, calibration.CalibrateGripper, calibration.CalibratePipette, calibration.CalibrateModule, @@ -447,7 +447,7 @@ absorbance_reader.CloseLidParams, absorbance_reader.OpenLidParams, absorbance_reader.InitializeParams, - absorbance_reader.MeasureAbsorbanceParams, + absorbance_reader.ReadAbsorbanceParams, calibration.CalibrateGripperParams, calibration.CalibratePipetteParams, calibration.CalibrateModuleParams, @@ -515,7 +515,7 @@ absorbance_reader.CloseLidCommandType, absorbance_reader.OpenLidCommandType, absorbance_reader.InitializeCommandType, - absorbance_reader.MeasureAbsorbanceCommandType, + absorbance_reader.ReadAbsorbanceCommandType, calibration.CalibrateGripperCommandType, calibration.CalibratePipetteCommandType, calibration.CalibrateModuleCommandType, @@ -584,7 +584,7 @@ absorbance_reader.CloseLidCreate, absorbance_reader.OpenLidCreate, absorbance_reader.InitializeCreate, - absorbance_reader.MeasureAbsorbanceCreate, + absorbance_reader.ReadAbsorbanceCreate, calibration.CalibrateGripperCreate, calibration.CalibratePipetteCreate, calibration.CalibrateModuleCreate, @@ -654,7 +654,7 @@ absorbance_reader.CloseLidResult, absorbance_reader.OpenLidResult, absorbance_reader.InitializeResult, - absorbance_reader.MeasureAbsorbanceResult, + absorbance_reader.ReadAbsorbanceResult, calibration.CalibrateGripperResult, calibration.CalibratePipetteResult, calibration.CalibrateModuleResult, diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index d425817d50f..4a8cc542710 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -284,7 +284,7 @@ def _handle_command(self, command: Command) -> None: absorbance_reader.CloseLidResult, absorbance_reader.OpenLidResult, absorbance_reader.InitializeResult, - absorbance_reader.MeasureAbsorbanceResult, + absorbance_reader.ReadAbsorbanceResult, ), ): self._handle_absorbance_reader_commands(command) @@ -570,7 +570,7 @@ def _handle_absorbance_reader_commands( self, command: Union[ absorbance_reader.Initialize, - absorbance_reader.MeasureAbsorbance, + absorbance_reader.ReadAbsorbance, absorbance_reader.CloseLid, absorbance_reader.OpenLid, ], @@ -597,7 +597,7 @@ def _handle_absorbance_reader_commands( configured_wavelength=command.params.sampleWavelength, lid_id=lid_id, ) - elif isinstance(command.result, absorbance_reader.MeasureAbsorbanceResult): + elif isinstance(command.result, absorbance_reader.ReadAbsorbanceResult): self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( module_id=AbsorbanceReaderId(module_id), configured=configured, diff --git a/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py b/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py index 1071e46f68c..613ee3cfbe3 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_absorbance_reader_core.py @@ -76,16 +76,16 @@ def test_initialize( assert subject._initialized_value == 123 -def test_initiate_read( +def test_read( decoy: Decoy, mock_engine_client: EngineClient, subject: AbsorbanceReaderCore ) -> None: """It should call absorbance reader to read with the engine client.""" subject._initialized_value = 123 - subject.initiate_read() + subject.read() decoy.verify( mock_engine_client.execute_command( - cmd.absorbance_reader.MeasureAbsorbanceParams( + cmd.absorbance_reader.ReadAbsorbanceParams( moduleId="1234", sampleWavelength=123, ), diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 5beacba02c2..36e097de8e7 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -65,7 +65,7 @@ "absorbanceReader/closeLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", "absorbanceReader/openLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", "absorbanceReader/initialize": "#/definitions/InitializeCreate", - "absorbanceReader/measure": "#/definitions/MeasureAbsorbanceCreate", + "absorbanceReader/measure": "#/definitions/ReadAbsorbanceCreate", "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", "calibration/calibratePipette": "#/definitions/CalibratePipetteCreate", "calibration/calibrateModule": "#/definitions/CalibrateModuleCreate", @@ -254,7 +254,7 @@ "$ref": "#/definitions/InitializeCreate" }, { - "$ref": "#/definitions/MeasureAbsorbanceCreate" + "$ref": "#/definitions/ReadAbsorbanceCreate" }, { "$ref": "#/definitions/CalibrateGripperCreate" @@ -3989,8 +3989,8 @@ }, "required": ["params"] }, - "MeasureAbsorbanceParams": { - "title": "MeasureAbsorbanceParams", + "ReadAbsorbanceParams": { + "title": "ReadAbsorbanceParams", "description": "Input parameters for a single absorbance reading.", "type": "object", "properties": { @@ -4007,8 +4007,8 @@ }, "required": ["moduleId", "sampleWavelength"] }, - "MeasureAbsorbanceCreate": { - "title": "MeasureAbsorbanceCreate", + "ReadAbsorbanceCreate": { + "title": "ReadAbsorbanceCreate", "description": "A request to execute an Absorbance Reader measurement.", "type": "object", "properties": { @@ -4019,7 +4019,7 @@ "type": "string" }, "params": { - "$ref": "#/definitions/MeasureAbsorbanceParams" + "$ref": "#/definitions/ReadAbsorbanceParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", From 6371d4d8f8f0454894fba84d9cba86740ad7c349 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Wed, 24 Jul 2024 16:29:51 -0400 Subject: [PATCH 17/26] streamline engine logic include plate reader lid as fixed labware and ensure addressable areas used exclusively --- .../protocol_api/core/engine/module_core.py | 4 +- .../protocol_api/core/engine/protocol.py | 30 +++++---- .../commands/absorbance_reader/close_lid.py | 17 +++-- .../protocol_engine/commands/load_labware.py | 4 +- .../protocol_engine/create_protocol_engine.py | 7 +- .../resources/deck_data_provider.py | 63 ++++++++++++++++-- .../resources/fixture_validation.py | 6 +- .../protocol_engine/state/modules.py | 66 ++++++++++++------- .../opentrons/protocol_engine/state/state.py | 1 + .../protocols/api_support/definitions.py | 2 +- .../resources/test_deck_data_provider.py | 66 +++++++++++++++++-- .../state/test_geometry_view.py | 4 +- .../state/test_module_store.py | 13 ++++ .../protocol_engine/state/test_module_view.py | 1 + shared-data/command/schemas/8.json | 6 +- .../deck/definitions/5/ot3_standard.json | 26 +++++++- shared-data/deck/schemas/5.json | 2 +- .../definitions/3/absorbanceReaderV1.json | 7 -- 18 files changed, 250 insertions(+), 75 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index 5bfd3a2ca79..d8577ecd910 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -553,7 +553,6 @@ def close_lid( self._engine_client.execute_command( cmd.absorbance_reader.CloseLidParams( moduleId=self.module_id, - # FIXME: using staging slot for now (wrong z), but this should be the lid dock slot pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), dropOffset=LabwareOffsetVector(x=14, y=0, z=0), ) @@ -565,7 +564,6 @@ def open_lid(self) -> None: cmd.absorbance_reader.OpenLidParams( moduleId=self.module_id, pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), - # FIXME: using staging slot for now (wrong z), but this should be the lid dock slot - dropOffset=LabwareOffsetVector(x=14, y=0, z=1), + dropOffset=LabwareOffsetVector(x=14, y=0, z=0), ) ) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 5eefabbad7c..4ee14cb6899 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -440,31 +440,35 @@ def load_module( existing_labware_ids=list(self._labware_cores_by_id.keys()), existing_module_ids=list(self._module_cores_by_id.keys()), ) - self._load_module_lid(module_core) + + # When the protocol engine is created, we add Module Lids as part of the deck fixed labware + # If a valid module exists in the deck config. For analysis, we add the labware here since + # deck fixed labware is not created under the same conditions. + if self._engine_client.state.config.use_virtual_modules: + self._load_virtual_module_lid(module_core) self._module_cores_by_id[module_core.module_id] = module_core return module_core - def _load_module_lid( + def _load_virtual_module_lid( self, module_core: Union[ModuleCore, NonConnectedModuleCore] ) -> None: if isinstance(module_core, AbsorbanceReaderCore): - lid_slot = ( - self._engine_client.state.modules.absorbance_reader_dock_location_name( - module_id=module_core.module_id + lid = self._engine_client.execute_command_without_recovery( + cmd.LoadLabwareParams( + loadName="opentrons_flex_lid_absorbance_plate_reader_module", + location=ModuleLocation(moduleId=module_core.module_id), + namespace="opentrons", + version=1, + displayName="Absorbance Reader Lid", ) ) - lid = self.load_labware( - load_name="opentrons_flex_lid_absorbance_plate_reader_module", - location=lid_slot, - namespace="opentrons", - version=1, - label="Absorbance Reader Lid", - ) + validation.ensure_definition_is_labware(lid.definition) + self._engine_client.add_absorbance_reader_lid( module_id=module_core.module_id, - lid_id=lid.labware_id, + lid_id=lid.labwareId, ) def _create_non_connected_module_core( diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 71a6b8cc462..136802db05b 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -10,7 +10,7 @@ from opentrons.protocol_engine.types import ( LabwareOffsetVector, LabwareMovementOffsetData, - ModuleLocation, + AddressableAreaLocation, ) from opentrons.protocol_engine.resources import labware_validation from .types import MoveLidResult @@ -85,9 +85,18 @@ async def execute( self._state_view.geometry.ensure_valid_gripper_location(current_location) ) - # we need to move the lid onto the module - new_location = ModuleLocation(moduleId=mod_substate.module_id) - # new_location = self._state_view.modules.get_location(mod_substate.module_id) + # we need to move the lid onto the module reader + absorbance_model = self._state_view.modules.get_requested_model(params.moduleId) + assert absorbance_model is not None + new_location = AddressableAreaLocation( + addressableAreaName=self._state_view.modules.ensure_and_convert_module_fixture_location( + deck_slot=self._state_view.modules.get_location( + params.moduleId + ).slotName, + deck_type=self._state_view.config.deck_type, + model=absorbance_model, + ) + ) validated_new_location = ( self._state_view.geometry.ensure_valid_gripper_location(new_location) ) diff --git a/api/src/opentrons/protocol_engine/commands/load_labware.py b/api/src/opentrons/protocol_engine/commands/load_labware.py index 497f63d5f34..6a4b53f4180 100644 --- a/api/src/opentrons/protocol_engine/commands/load_labware.py +++ b/api/src/opentrons/protocol_engine/commands/load_labware.py @@ -117,9 +117,7 @@ async def execute( area_name = params.location.addressableAreaName if not ( fixture_validation.is_deck_slot(params.location.addressableAreaName) - or fixture_validation.is_abs_reader_lid_dock( - params.location.addressableAreaName - ) + or fixture_validation.is_abs_reader(params.location.addressableAreaName) ): raise LabwareIsNotAllowedInLocationError( f"Cannot load {params.loadName} onto addressable area {area_name}" diff --git a/api/src/opentrons/protocol_engine/create_protocol_engine.py b/api/src/opentrons/protocol_engine/create_protocol_engine.py index fd7b1b8bd5f..c5f6017acf0 100644 --- a/api/src/opentrons/protocol_engine/create_protocol_engine.py +++ b/api/src/opentrons/protocol_engine/create_protocol_engine.py @@ -39,11 +39,10 @@ async def create_protocol_engine( """ deck_data = DeckDataProvider(config.deck_type) deck_definition = await deck_data.get_deck_definition() - deck_fixed_labware = ( - await deck_data.get_deck_fixed_labware(deck_definition) - if load_fixed_trash - else [] + deck_fixed_labware = await deck_data.get_deck_fixed_labware( + load_fixed_trash, deck_definition, deck_configuration ) + module_calibration_offsets = ModuleDataProvider.load_module_calibrations() state_store = StateStore( diff --git a/api/src/opentrons/protocol_engine/resources/deck_data_provider.py b/api/src/opentrons/protocol_engine/resources/deck_data_provider.py index 017fc58f552..2ec4a084e6c 100644 --- a/api/src/opentrons/protocol_engine/resources/deck_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/deck_data_provider.py @@ -13,8 +13,15 @@ from opentrons.protocols.models import LabwareDefinition from opentrons.types import DeckSlotName -from ..types import DeckSlotLocation, DeckType +from ..types import ( + DeckSlotLocation, + DeckType, + LabwareLocation, + AddressableAreaLocation, + DeckConfigurationType, +) from .labware_data_provider import LabwareDataProvider +from ..resources import deck_configuration_provider @final @@ -23,7 +30,7 @@ class DeckFixedLabware: """A labware fixture that is always present on a deck.""" labware_id: str - location: DeckSlotLocation + location: LabwareLocation definition: LabwareDefinition @@ -51,7 +58,9 @@ def sync() -> DeckDefinitionV5: async def get_deck_fixed_labware( self, + load_fixed_trash: bool, deck_definition: DeckDefinitionV5, + deck_configuration: Optional[DeckConfigurationType] = None, ) -> List[DeckFixedLabware]: """Get a list of all labware fixtures from a given deck definition.""" labware: List[DeckFixedLabware] = [] @@ -61,8 +70,52 @@ async def get_deck_fixed_labware( load_name = cast(Optional[str], fixture.get("labware")) slot = cast(Optional[str], fixture.get("slot")) - if load_name is not None and slot is not None: - location = DeckSlotLocation(slotName=DeckSlotName.from_primitive(slot)) + if ( + deck_configuration is not None + and load_name is not None + and slot is not None + and slot not in DeckSlotName._value2member_map_ + ): + # The provided slot is likely to be an addressable area for Module-required labware Eg: Plate Reader Lid + for ( + cutout_id, + cutout_fixture_id, + opentrons_module_serial_number, + ) in deck_configuration: + provided_addressable_areas = ( + deck_configuration_provider.get_provided_addressable_area_names( + cutout_fixture_id=cutout_fixture_id, + cutout_id=cutout_id, + deck_definition=deck_definition, + ) + ) + if slot in provided_addressable_areas: + addressable_area_location = AddressableAreaLocation( + addressableAreaName=slot + ) + definition = await self._labware_data.get_labware_definition( + load_name=load_name, + namespace="opentrons", + version=1, + ) + + labware.append( + DeckFixedLabware( + labware_id=labware_id, + definition=definition, + location=addressable_area_location, + ) + ) + + elif ( + load_fixed_trash + and load_name is not None + and slot is not None + and slot in DeckSlotName._value2member_map_ + ): + deck_slot_location = DeckSlotLocation( + slotName=DeckSlotName.from_primitive(slot) + ) definition = await self._labware_data.get_labware_definition( load_name=load_name, namespace="opentrons", @@ -73,7 +126,7 @@ async def get_deck_fixed_labware( DeckFixedLabware( labware_id=labware_id, definition=definition, - location=location, + location=deck_slot_location, ) ) diff --git a/api/src/opentrons/protocol_engine/resources/fixture_validation.py b/api/src/opentrons/protocol_engine/resources/fixture_validation.py index a6b301e0c7d..745df22d712 100644 --- a/api/src/opentrons/protocol_engine/resources/fixture_validation.py +++ b/api/src/opentrons/protocol_engine/resources/fixture_validation.py @@ -48,6 +48,6 @@ def is_deck_slot(addressable_area_name: str) -> bool: return True -def is_abs_reader_lid_dock(addressable_area_name: str) -> bool: - """Check if an addressable area is an absorbance plate reader lid dock.""" - return "absorbanceReaderV1LidDock" in addressable_area_name +def is_abs_reader(addressable_area_name: str) -> bool: + """Check if an addressable area is an absorbance plate reader area.""" + return "absorbanceReaderV1" in addressable_area_name diff --git a/api/src/opentrons/protocol_engine/state/modules.py b/api/src/opentrons/protocol_engine/state/modules.py index 4a8cc542710..137c5082eea 100644 --- a/api/src/opentrons/protocol_engine/state/modules.py +++ b/api/src/opentrons/protocol_engine/state/modules.py @@ -29,7 +29,7 @@ from opentrons.protocol_engine.commands.calibration.calibrate_module import ( CalibrateModuleResult, ) -from opentrons.types import DeckSlotName, MountType, StagingSlotName +from opentrons.types import DeckSlotName, MountType from ..errors import ModuleNotConnectedError from ..types import ( @@ -48,6 +48,8 @@ LabwareMovementOffsetData, AddressableAreaLocation, ) + +from ..resources import DeckFixedLabware from .addressable_areas import AddressableAreaView from .. import errors from ..commands import ( @@ -181,6 +183,15 @@ class ModuleState: deck_type: DeckType """Type of deck that the modules are on.""" + deck_fixed_labware: Sequence[DeckFixedLabware] + """Fixed labware from the deck which may be assigned to a module. + + The Opentrons Plate Reader module makes use of an electronic Lid labware which moves + between the Reader and Dock positions, and is pre-loaded into the engine as to persist + even when not in use. For this reason, we inject it here when an appropriate match + is identified. + """ + class ModuleStore(HasState[ModuleState], HandlesActions): """Module state container.""" @@ -190,6 +201,7 @@ class ModuleStore(HasState[ModuleState], HandlesActions): def __init__( self, config: Config, + deck_fixed_labware: Sequence[DeckFixedLabware], module_calibration_offsets: Optional[Dict[str, ModuleOffsetData]] = None, ) -> None: """Initialize a ModuleStore and its state.""" @@ -201,6 +213,7 @@ def __init__( substate_by_module_id={}, module_offset_by_serial=module_calibration_offsets or {}, deck_type=config.deck_type, + deck_fixed_labware=deck_fixed_labware, ) self._robot_type = config.robot_type @@ -310,7 +323,7 @@ def _update_absorbance_reader_lid_id( lid_id=lid_id, ) - def _add_module_substate( + def _add_module_substate( # noqa: C901 self, module_id: str, serial_number: Optional[str], @@ -369,15 +382,29 @@ def _add_module_substate( module_id=MagneticBlockId(module_id) ) elif ModuleModel.is_absorbance_reader(actual_model): - self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( - module_id=AbsorbanceReaderId(module_id), - configured=False, - measured=False, - is_lid_on=False, - data=None, - configured_wavelength=None, - lid_id=None, - ) + slot = self._state.slot_by_module_id[module_id] + if slot is not None: + reader_addressable_area = f"absorbanceReaderV1{slot.value}" + lid_labware_id = None + for labware in self._state.deck_fixed_labware: + if labware.location == AddressableAreaLocation( + addressableAreaName=reader_addressable_area + ): + lid_labware_id = labware.labware_id + break + self._state.substate_by_module_id[module_id] = AbsorbanceReaderSubState( + module_id=AbsorbanceReaderId(module_id), + configured=False, + measured=False, + is_lid_on=True, + data=None, + configured_wavelength=None, + lid_id=lid_labware_id, + ) + else: + raise errors.ModuleNotOnDeckError( + "Opentrons Plate Reader location did not return a valid Deck Slot." + ) def _update_additional_slots_occupied_by_thermocycler( self, @@ -1292,14 +1319,9 @@ def absorbance_reader_dock_location( ) -> AddressableAreaLocation: """Get the addressable area for the absorbance reader dock.""" reader_slot = self.get_location(module_id) - lid_dock_slot = get_adjacent_staging_slot(reader_slot.slotName) - assert lid_dock_slot is not None - - return AddressableAreaLocation(addressableAreaName=lid_dock_slot.id) - - def absorbance_reader_dock_location_name(self, module_id: str) -> StagingSlotName: - """Get the addressable area for the absorbance reader dock.""" - reader_slot = self.get_location(module_id) - lid_dock_slot = get_adjacent_staging_slot(reader_slot.slotName) - assert lid_dock_slot is not None - return lid_dock_slot + lid_doc_slot = get_adjacent_staging_slot(reader_slot.slotName) + assert lid_doc_slot is not None + lid_dock_area = AddressableAreaLocation( + addressableAreaName="absorbanceReaderV1LidDock" + lid_doc_slot.value + ) + return lid_dock_area diff --git a/api/src/opentrons/protocol_engine/state/state.py b/api/src/opentrons/protocol_engine/state/state.py index aa54383b379..68d7aa9cd23 100644 --- a/api/src/opentrons/protocol_engine/state/state.py +++ b/api/src/opentrons/protocol_engine/state/state.py @@ -179,6 +179,7 @@ def __init__( ) self._module_store = ModuleStore( config=config, + deck_fixed_labware=deck_fixed_labware, module_calibration_offsets=module_calibration_offsets, ) self._liquid_store = LiquidStore() diff --git a/api/src/opentrons/protocols/api_support/definitions.py b/api/src/opentrons/protocols/api_support/definitions.py index 799af1993f3..ad692e03828 100644 --- a/api/src/opentrons/protocols/api_support/definitions.py +++ b/api/src/opentrons/protocols/api_support/definitions.py @@ -1,6 +1,6 @@ from .types import APIVersion -MAX_SUPPORTED_VERSION = APIVersion(2, 20) +MAX_SUPPORTED_VERSION = APIVersion(2, 21) """The maximum supported protocol API version in this release.""" MIN_SUPPORTED_VERSION = APIVersion(2, 0) diff --git a/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py b/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py index bd720777ed6..2f44c257b1d 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_deck_data_provider.py @@ -7,7 +7,12 @@ from opentrons.protocols.models import LabwareDefinition from opentrons.types import DeckSlotName -from opentrons.protocol_engine.types import DeckSlotLocation, DeckType +from opentrons.protocol_engine.types import ( + DeckSlotLocation, + DeckType, + DeckConfigurationType, + AddressableAreaLocation, +) from opentrons.protocol_engine.resources import ( LabwareDataProvider, DeckDataProvider, @@ -61,7 +66,7 @@ async def test_get_deck_labware_fixtures_ot2_standard( ) ).then_return(ot2_fixed_trash_def) - result = await subject.get_deck_fixed_labware(ot2_standard_deck_def) + result = await subject.get_deck_fixed_labware(True, ot2_standard_deck_def, None) assert result == [ DeckFixedLabware( @@ -91,7 +96,7 @@ async def test_get_deck_labware_fixtures_ot2_short_trash( ) ).then_return(ot2_short_fixed_trash_def) - result = await subject.get_deck_fixed_labware(ot2_short_trash_deck_def) + result = await subject.get_deck_fixed_labware(True, ot2_short_trash_deck_def, None) assert result == [ DeckFixedLabware( @@ -121,7 +126,7 @@ async def test_get_deck_labware_fixtures_ot3_standard( ) ).then_return(ot3_fixed_trash_def) - result = await subject.get_deck_fixed_labware(ot3_standard_deck_def) + result = await subject.get_deck_fixed_labware(True, ot3_standard_deck_def, None) assert result == [ DeckFixedLabware( @@ -130,3 +135,56 @@ async def test_get_deck_labware_fixtures_ot3_standard( definition=ot3_fixed_trash_def, ) ] + + +def _make_deck_config_with_plate_reader() -> DeckConfigurationType: + return [ + ("cutoutA1", "singleLeftSlot", None), + ("cutoutB1", "singleLeftSlot", None), + ("cutoutC1", "singleLeftSlot", None), + ("cutoutD1", "singleLeftSlot", None), + ("cutoutA2", "singleCenterSlot", None), + ("cutoutB2", "singleCenterSlot", None), + ("cutoutC2", "singleCenterSlot", None), + ("cutoutD2", "singleCenterSlot", None), + ("cutoutA3", "singleRightSlot", None), + ("cutoutB3", "singleRightSlot", None), + ("cutoutC3", "singleRightSlot", None), + ("cutoutD3", "absorbanceReaderV1", "abc123"), + ] + + +async def test_get_deck_labware_fixtures_ot3_standard_for_plate_reader( + decoy: Decoy, + ot3_standard_deck_def: DeckDefinitionV5, + ot3_absorbance_reader_lid: LabwareDefinition, + mock_labware_data_provider: LabwareDataProvider, +) -> None: + """It should get a lis including the Plate Reader Lid for our deck fixed labware.""" + subject = DeckDataProvider( + deck_type=DeckType.OT3_STANDARD, labware_data=mock_labware_data_provider + ) + + decoy.when( + await mock_labware_data_provider.get_labware_definition( + load_name="opentrons_flex_lid_absorbance_plate_reader_module", + namespace="opentrons", + version=1, + ) + ).then_return(ot3_absorbance_reader_lid) + + deck_config = _make_deck_config_with_plate_reader() + + result = await subject.get_deck_fixed_labware( + False, ot3_standard_deck_def, deck_config + ) + + assert result == [ + DeckFixedLabware( + labware_id="absorbanceReaderV1LidD3", + location=AddressableAreaLocation( + addressableAreaName="absorbanceReaderV1D3" + ), + definition=ot3_absorbance_reader_lid, + ) + ] diff --git a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py index 58a4a49940e..05874a527c2 100644 --- a/api/tests/opentrons/protocol_engine/state/test_geometry_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_geometry_view.py @@ -147,7 +147,9 @@ def labware_view(labware_store: LabwareStore) -> LabwareView: @pytest.fixture def module_store(state_config: Config) -> ModuleStore: """Get a module store that can accept actions.""" - return ModuleStore(config=state_config, module_calibration_offsets={}) + return ModuleStore( + config=state_config, deck_fixed_labware=[], module_calibration_offsets={} + ) @pytest.fixture diff --git a/api/tests/opentrons/protocol_engine/state/test_module_store.py b/api/tests/opentrons/protocol_engine/state/test_module_store.py index e6de0a96ac0..10d74968020 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_store.py @@ -85,6 +85,7 @@ def test_initial_state() -> None: """It should initialize the module state.""" subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) assert subject.state == ModuleState( @@ -95,6 +96,7 @@ def test_initial_state() -> None: substate_by_module_id={}, module_offset_by_serial={}, additional_slots_occupied_by_module_id={}, + deck_fixed_labware=[], ) @@ -195,6 +197,7 @@ def test_load_module( subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action(action) @@ -211,6 +214,7 @@ def test_load_module( substate_by_module_id={"module-id": expected_substate}, module_offset_by_serial={}, additional_slots_occupied_by_module_id={}, + deck_fixed_labware=[], ) @@ -261,6 +265,7 @@ def test_load_thermocycler_in_thermocycler_slot( robot_type=robot_type, deck_type=deck_type, ), + deck_fixed_labware=[], ) subject.handle_action(action) @@ -341,6 +346,7 @@ def test_add_module_action( subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action(action) @@ -357,6 +363,7 @@ def test_add_module_action( substate_by_module_id={"module-id": expected_substate}, module_offset_by_serial={}, additional_slots_occupied_by_module_id={}, + deck_fixed_labware=[], ) @@ -384,6 +391,7 @@ def test_handle_hs_temperature_commands(heater_shaker_v1_def: ModuleDefinition) ) subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action( @@ -437,6 +445,7 @@ def test_handle_hs_shake_commands(heater_shaker_v1_def: ModuleDefinition) -> Non ) subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action( @@ -492,6 +501,7 @@ def test_handle_hs_labware_latch_commands( ) subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action( @@ -558,6 +568,7 @@ def test_handle_tempdeck_temperature_commands( ) subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action( @@ -619,6 +630,7 @@ def test_handle_thermocycler_temperature_commands( ) subject = ModuleStore( config=_OT2_STANDARD_CONFIG, + deck_fixed_labware=[], ) subject.handle_action( @@ -702,6 +714,7 @@ def test_handle_thermocycler_lid_commands( robot_type="OT-3 Standard", deck_type=DeckType.OT3_STANDARD, ), + deck_fixed_labware=[], ) subject.handle_action( diff --git a/api/tests/opentrons/protocol_engine/state/test_module_view.py b/api/tests/opentrons/protocol_engine/state/test_module_view.py index b840673f2e8..2da529c0efb 100644 --- a/api/tests/opentrons/protocol_engine/state/test_module_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_module_view.py @@ -115,6 +115,7 @@ def make_module_view( module_offset_by_serial=module_offset_by_serial or {}, additional_slots_occupied_by_module_id=additional_slots_occupied_by_module_id or {}, + deck_fixed_labware=[], ) return ModuleView(state=state) diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 36e097de8e7..1ff4c3e24f6 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -65,7 +65,7 @@ "absorbanceReader/closeLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", "absorbanceReader/openLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", "absorbanceReader/initialize": "#/definitions/InitializeCreate", - "absorbanceReader/measure": "#/definitions/ReadAbsorbanceCreate", + "absorbanceReader/read": "#/definitions/ReadAbsorbanceCreate", "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", "calibration/calibratePipette": "#/definitions/CalibratePipetteCreate", "calibration/calibrateModule": "#/definitions/CalibrateModuleCreate", @@ -4014,8 +4014,8 @@ "properties": { "commandType": { "title": "Commandtype", - "default": "absorbanceReader/measure", - "enum": ["absorbanceReader/measure"], + "default": "absorbanceReader/read", + "enum": ["absorbanceReader/read"], "type": "string" }, "params": { diff --git a/shared-data/deck/definitions/5/ot3_standard.json b/shared-data/deck/definitions/5/ot3_standard.json index c07aaaf7b29..c6f50c049c8 100644 --- a/shared-data/deck/definitions/5/ot3_standard.json +++ b/shared-data/deck/definitions/5/ot3_standard.json @@ -199,7 +199,7 @@ { "id": "D4", "areaType": "stagingSlot", - "offsetFromCutoutFixture": [164.0, 0.0, 0.0], + "offsetFromCutoutFixture": [164.0, 0.0, 14.5], "matingSurfaceUnitVector": [-1, 1, -1], "boundingBox": { "xDimension": 128.0, @@ -831,6 +831,30 @@ "slot": "A3", "labware": "opentrons_1_trash_3200ml_fixed", "displayName": "Fixed Trash" + }, + { + "id": "absorbanceReaderV1LidA3", + "slot": "absorbanceReaderV1A3", + "labware": "opentrons_flex_lid_absorbance_plate_reader_module", + "displayName": "Plate Reader Lid" + }, + { + "id": "absorbanceReaderV1LidB3", + "slot": "absorbanceReaderV1B3", + "labware": "opentrons_flex_lid_absorbance_plate_reader_module", + "displayName": "Plate Reader Lid" + }, + { + "id": "absorbanceReaderV1LidC3", + "slot": "absorbanceReaderV1C3", + "labware": "opentrons_flex_lid_absorbance_plate_reader_module", + "displayName": "Plate Reader Lid" + }, + { + "id": "absorbanceReaderV1LidD3", + "slot": "absorbanceReaderV1D3", + "labware": "opentrons_flex_lid_absorbance_plate_reader_module", + "displayName": "Plate Reader Lid" } ] }, diff --git a/shared-data/deck/schemas/5.json b/shared-data/deck/schemas/5.json index 5188cf0cc28..54e2f74b9bc 100644 --- a/shared-data/deck/schemas/5.json +++ b/shared-data/deck/schemas/5.json @@ -224,7 +224,7 @@ }, "legacyFixtures": { "type": "array", - "description": "Fixed position objects on the deck.", + "description": "Fixed position objects on the deck and fixture-dependant Module labware Eg Plate Reader Lid.", "items": { "type": "object", "required": ["id", "displayName"], diff --git a/shared-data/module/definitions/3/absorbanceReaderV1.json b/shared-data/module/definitions/3/absorbanceReaderV1.json index c925cc687d5..57b0bfc1b10 100644 --- a/shared-data/module/definitions/3/absorbanceReaderV1.json +++ b/shared-data/module/definitions/3/absorbanceReaderV1.json @@ -33,13 +33,6 @@ "ot2_short_trash": {}, "ot3_standard": {} }, - "peripherals": [ - { - "loadName": "opentrons_flex_lid_absorbance_plate_reader_module", - "version": 1, - "namespace": "opentrons" - } - ], "compatibleWith": [], "incompatibleWithDecks": ["ot2_standard"], "twoDimensionalRendering": { From f1ff2651c11eb7708f1635c63799f2dd6ee7e6e8 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 25 Jul 2024 10:54:23 -0400 Subject: [PATCH 18/26] labware fixture correction for app tests --- .../utils/generateCompatibleLabwareForPipette.ts | 3 ++- .../2/opentrons_flex_lid_absorbance_plate_reader_module/1.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts b/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts index 3b52d014e93..149b032cf49 100644 --- a/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts +++ b/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts @@ -14,7 +14,8 @@ export function generateCompatibleLabwareForPipette( (acc, definition) => { if ( definition.allowedRoles != null && - definition.allowedRoles.includes('adapter') + definition.allowedRoles.includes('adapter') && + definition.allowedRoles.includes('fixture') ) { return acc } else if (pipetteSpecs.channels === 1) { diff --git a/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json index f86bc365173..b6025c612c2 100644 --- a/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json +++ b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json @@ -32,6 +32,7 @@ "namespace": "opentrons", "version": 1, "schemaVersion": 2, + "allowedRoles": ["fixture"], "gripForce": 20.0, "gripHeightFromLabwareBottom": 53.0, "cornerOffsetFromSlot": { From dbb57926ec2a54113998770c811023a49b126516 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 25 Jul 2024 10:59:28 -0400 Subject: [PATCH 19/26] remove lid from app view --- shared-data/js/getLabware.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/shared-data/js/getLabware.ts b/shared-data/js/getLabware.ts index b4f0ec5d5af..792263fb938 100644 --- a/shared-data/js/getLabware.ts +++ b/shared-data/js/getLabware.ts @@ -43,6 +43,7 @@ export const LABWAREV2_DO_NOT_LIST = [ 'opentrons_ot3_96_tiprack_200ul', 'opentrons_ot3_96_tiprack_1000ul', 'opentrons_ot3_96_tiprack_50ul', + 'opentrons_flex_lid_absorbance_plate_reader_module', ] // NOTE(sa, 2020-7-14): in PD we do not want to list calibration blocks // but we still might want the rest of the labware in LABWAREV2_DO_NOT_LIST From 4ceef151f4830f305f55462995a36a37d4a9cf57 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 25 Jul 2024 11:26:25 -0400 Subject: [PATCH 20/26] correct max api version this was set to 2 21 for testing but should remain at 2 20 --- api/src/opentrons/protocols/api_support/definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/opentrons/protocols/api_support/definitions.py b/api/src/opentrons/protocols/api_support/definitions.py index ad692e03828..799af1993f3 100644 --- a/api/src/opentrons/protocols/api_support/definitions.py +++ b/api/src/opentrons/protocols/api_support/definitions.py @@ -1,6 +1,6 @@ from .types import APIVersion -MAX_SUPPORTED_VERSION = APIVersion(2, 21) +MAX_SUPPORTED_VERSION = APIVersion(2, 20) """The maximum supported protocol API version in this release.""" MIN_SUPPORTED_VERSION = APIVersion(2, 0) From 93176e3956e9fb30b97ea6e979a88d9bf220a105 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 25 Jul 2024 15:17:52 -0400 Subject: [PATCH 21/26] analysis validation fix accounting for reader lid as fixture --- api/src/opentrons/protocol_api/core/engine/protocol.py | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index ca52e9d89df..04ddaf55a48 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -464,7 +464,6 @@ def _load_virtual_module_lid( displayName="Absorbance Reader Lid", ) ) - validation.ensure_definition_is_labware(lid.definition) self._engine_client.add_absorbance_reader_lid( module_id=module_core.module_id, From acabc45c4e2a380f90d6c1474b07b6d21555506b Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 8 Aug 2024 17:08:56 -0400 Subject: [PATCH 22/26] Removal of hard coded pickup and drop offsets from open and close lid params --- .../protocol_api/core/engine/module_core.py | 5 - .../commands/absorbance_reader/close_lid.py | 29 +- .../commands/absorbance_reader/open_lid.py | 28 +- shared-data/command/schemas/8.json | 1059 ++++++++++++----- .../1.json | 14 + 5 files changed, 825 insertions(+), 310 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/module_core.py b/api/src/opentrons/protocol_api/core/engine/module_core.py index d8577ecd910..4b29874fab8 100644 --- a/api/src/opentrons/protocol_api/core/engine/module_core.py +++ b/api/src/opentrons/protocol_api/core/engine/module_core.py @@ -24,7 +24,6 @@ LabwareNotLoadedOnModuleError, NoMagnetEngageHeightError, ) -from opentrons.protocol_engine.types import LabwareOffsetVector from opentrons.protocols.api_support.types import APIVersion @@ -553,8 +552,6 @@ def close_lid( self._engine_client.execute_command( cmd.absorbance_reader.CloseLidParams( moduleId=self.module_id, - pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), - dropOffset=LabwareOffsetVector(x=14, y=0, z=0), ) ) @@ -563,7 +560,5 @@ def open_lid(self) -> None: self._engine_client.execute_command( cmd.absorbance_reader.OpenLidParams( moduleId=self.module_id, - pickUpOffset=LabwareOffsetVector(x=14, y=0, z=0), - dropOffset=LabwareOffsetVector(x=14, y=0, z=0), ) ) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py index 136802db05b..e7b7702a814 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py @@ -7,11 +7,7 @@ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence -from opentrons.protocol_engine.types import ( - LabwareOffsetVector, - LabwareMovementOffsetData, - AddressableAreaLocation, -) +from opentrons.protocol_engine.types import AddressableAreaLocation from opentrons.protocol_engine.resources import labware_validation from .types import MoveLidResult @@ -30,16 +26,6 @@ class CloseLidParams(BaseModel): """Input parameters to close the lid on an absorbance reading.""" moduleId: str = Field(..., description="Unique ID of the absorbance reader.") - pickUpOffset: Optional[LabwareOffsetVector] = Field( - None, - description="Offset to use when picking up labware. " - "Experimental param, subject to change", - ) - dropOffset: Optional[LabwareOffsetVector] = Field( - None, - description="Offset to use when dropping off labware. " - "Experimental param, subject to change", - ) class CloseLidResult(MoveLidResult): @@ -101,17 +87,20 @@ async def execute( self._state_view.geometry.ensure_valid_gripper_location(new_location) ) - # TODO (AA): we probably don't need this, but let's keep it until we're sure - user_offset_data = LabwareMovementOffsetData( - pickUpOffset=params.pickUpOffset or LabwareOffsetVector(x=0, y=0, z=0), - dropOffset=params.dropOffset or LabwareOffsetVector(x=0, y=0, z=0), + lid_gripper_offsets = self._state_view.labware.get_labware_gripper_offsets( + loaded_lid.id, None ) + if lid_gripper_offsets is None: + raise ValueError( + "Gripper Offset values for Absorbance Reader Lid labware must not be None." + ) + # Skips gripper moves when using virtual gripper await self._labware_movement.move_labware_with_gripper( labware_id=loaded_lid.id, current_location=validated_current_location, new_location=validated_new_location, - user_offset_data=user_offset_data, + user_offset_data=lid_gripper_offsets, post_drop_slide_offset=None, ) diff --git a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py index fc55b8e8152..2190813d6a4 100644 --- a/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +++ b/api/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py @@ -7,10 +7,6 @@ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData from ...errors.error_occurrence import ErrorOccurrence -from opentrons.protocol_engine.types import ( - LabwareOffsetVector, - LabwareMovementOffsetData, -) from .types import MoveLidResult from opentrons.protocol_engine.resources import labware_validation @@ -29,16 +25,6 @@ class OpenLidParams(BaseModel): """Input parameters to open the lid on an absorbance reading.""" moduleId: str = Field(..., description="Unique ID of the absorbance reader.") - pickUpOffset: Optional[LabwareOffsetVector] = Field( - None, - description="Offset to use when picking up labware. " - "Experimental param, subject to change", - ) - dropOffset: Optional[LabwareOffsetVector] = Field( - None, - description="Offset to use when dropping off labware. " - "Experimental param, subject to change", - ) class OpenLidResult(MoveLidResult): @@ -87,17 +73,21 @@ async def execute(self, params: OpenLidParams) -> SuccessData[OpenLidResult, Non validated_new_location = ( self._state_view.geometry.ensure_valid_gripper_location(new_location) ) - # TODO (AA): we probably don't need this, but let's keep it until we're sure - user_offset_data = LabwareMovementOffsetData( - pickUpOffset=params.pickUpOffset or LabwareOffsetVector(x=0, y=0, z=0), - dropOffset=params.dropOffset or LabwareOffsetVector(x=0, y=0, z=0), + + lid_gripper_offsets = self._state_view.labware.get_labware_gripper_offsets( + loaded_lid.id, None ) + if lid_gripper_offsets is None: + raise ValueError( + "Gripper Offset values for Absorbance Reader Lid labware must not be None." + ) + # Skips gripper moves when using virtual gripper await self._labware_movement.move_labware_with_gripper( labware_id=loaded_lid.id, current_location=validated_current_location, new_location=validated_new_location, - user_offset_data=user_offset_data, + user_offset_data=lid_gripper_offsets, post_drop_slide_offset=None, ) new_offset_id = self._equipment.find_applicable_labware_offset_id( diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 51a8b717171..91db93c91a3 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -277,7 +277,11 @@ "WellOrigin": { "title": "WellOrigin", "description": "Origin of WellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well", - "enum": ["top", "bottom", "center"], + "enum": [ + "top", + "bottom", + "center" + ], "type": "string" }, "WellOffset": { @@ -362,12 +366,22 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "volume", + "pipetteId" + ] }, "CommandIntent": { "title": "CommandIntent", "description": "Run intent for a given command.\n\nProps:\n PROTOCOL: the command is part of the protocol run itself.\n SETUP: the command is part of the setup phase of a run.", - "enum": ["protocol", "setup", "fixit"], + "enum": [ + "protocol", + "setup", + "fixit" + ], "type": "string" }, "AspirateCreate": { @@ -378,7 +392,9 @@ "commandType": { "title": "Commandtype", "default": "aspirate", - "enum": ["aspirate"], + "enum": [ + "aspirate" + ], "type": "string" }, "params": { @@ -398,7 +414,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AspirateInPlaceParams": { "title": "AspirateInPlaceParams", @@ -423,7 +441,11 @@ "type": "string" } }, - "required": ["flowRate", "volume", "pipetteId"] + "required": [ + "flowRate", + "volume", + "pipetteId" + ] }, "AspirateInPlaceCreate": { "title": "AspirateInPlaceCreate", @@ -433,7 +455,9 @@ "commandType": { "title": "Commandtype", "default": "aspirateInPlace", - "enum": ["aspirateInPlace"], + "enum": [ + "aspirateInPlace" + ], "type": "string" }, "params": { @@ -453,7 +477,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CommentParams": { "title": "CommentParams", @@ -466,7 +492,9 @@ "type": "string" } }, - "required": ["message"] + "required": [ + "message" + ] }, "CommentCreate": { "title": "CommentCreate", @@ -476,7 +504,9 @@ "commandType": { "title": "Commandtype", "default": "comment", - "enum": ["comment"], + "enum": [ + "comment" + ], "type": "string" }, "params": { @@ -496,7 +526,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ConfigureForVolumeParams": { "title": "ConfigureForVolumeParams", @@ -520,7 +552,10 @@ "type": "string" } }, - "required": ["pipetteId", "volume"] + "required": [ + "pipetteId", + "volume" + ] }, "ConfigureForVolumeCreate": { "title": "ConfigureForVolumeCreate", @@ -530,7 +565,9 @@ "commandType": { "title": "Commandtype", "default": "configureForVolume", - "enum": ["configureForVolume"], + "enum": [ + "configureForVolume" + ], "type": "string" }, "params": { @@ -550,7 +587,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AllNozzleLayoutConfiguration": { "title": "AllNozzleLayoutConfiguration", @@ -560,7 +599,9 @@ "style": { "title": "Style", "default": "ALL", - "enum": ["ALL"], + "enum": [ + "ALL" + ], "type": "string" } } @@ -573,17 +614,26 @@ "style": { "title": "Style", "default": "SINGLE", - "enum": ["SINGLE"], + "enum": [ + "SINGLE" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "RowNozzleLayoutConfiguration": { "title": "RowNozzleLayoutConfiguration", @@ -593,17 +643,26 @@ "style": { "title": "Style", "default": "ROW", - "enum": ["ROW"], + "enum": [ + "ROW" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "ColumnNozzleLayoutConfiguration": { "title": "ColumnNozzleLayoutConfiguration", @@ -613,17 +672,26 @@ "style": { "title": "Style", "default": "COLUMN", - "enum": ["COLUMN"], + "enum": [ + "COLUMN" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "QuadrantNozzleLayoutConfiguration": { "title": "QuadrantNozzleLayoutConfiguration", @@ -633,13 +701,20 @@ "style": { "title": "Style", "default": "QUADRANT", - "enum": ["QUADRANT"], + "enum": [ + "QUADRANT" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" }, "frontRightNozzle": { @@ -655,7 +730,11 @@ "type": "string" } }, - "required": ["primaryNozzle", "frontRightNozzle", "backLeftNozzle"] + "required": [ + "primaryNozzle", + "frontRightNozzle", + "backLeftNozzle" + ] }, "ConfigureNozzleLayoutParams": { "title": "ConfigureNozzleLayoutParams", @@ -688,7 +767,10 @@ ] } }, - "required": ["pipetteId", "configurationParams"] + "required": [ + "pipetteId", + "configurationParams" + ] }, "ConfigureNozzleLayoutCreate": { "title": "ConfigureNozzleLayoutCreate", @@ -698,7 +780,9 @@ "commandType": { "title": "Commandtype", "default": "configureNozzleLayout", - "enum": ["configureNozzleLayout"], + "enum": [ + "configureNozzleLayout" + ], "type": "string" }, "params": { @@ -718,7 +802,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CustomParams": { "title": "CustomParams", @@ -734,7 +820,9 @@ "commandType": { "title": "Commandtype", "default": "custom", - "enum": ["custom"], + "enum": [ + "custom" + ], "type": "string" }, "params": { @@ -754,7 +842,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DispenseParams": { "title": "DispenseParams", @@ -803,7 +893,13 @@ "type": "number" } }, - "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "volume", + "pipetteId" + ] }, "DispenseCreate": { "title": "DispenseCreate", @@ -813,7 +909,9 @@ "commandType": { "title": "Commandtype", "default": "dispense", - "enum": ["dispense"], + "enum": [ + "dispense" + ], "type": "string" }, "params": { @@ -833,7 +931,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DispenseInPlaceParams": { "title": "DispenseInPlaceParams", @@ -863,7 +963,11 @@ "type": "number" } }, - "required": ["flowRate", "volume", "pipetteId"] + "required": [ + "flowRate", + "volume", + "pipetteId" + ] }, "DispenseInPlaceCreate": { "title": "DispenseInPlaceCreate", @@ -873,7 +977,9 @@ "commandType": { "title": "Commandtype", "default": "dispenseInPlace", - "enum": ["dispenseInPlace"], + "enum": [ + "dispenseInPlace" + ], "type": "string" }, "params": { @@ -893,7 +999,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "BlowOutParams": { "title": "BlowOutParams", @@ -931,7 +1039,12 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "flowRate", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "pipetteId" + ] }, "BlowOutCreate": { "title": "BlowOutCreate", @@ -941,7 +1054,9 @@ "commandType": { "title": "Commandtype", "default": "blowout", - "enum": ["blowout"], + "enum": [ + "blowout" + ], "type": "string" }, "params": { @@ -961,7 +1076,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "BlowOutInPlaceParams": { "title": "BlowOutInPlaceParams", @@ -980,7 +1097,10 @@ "type": "string" } }, - "required": ["flowRate", "pipetteId"] + "required": [ + "flowRate", + "pipetteId" + ] }, "BlowOutInPlaceCreate": { "title": "BlowOutInPlaceCreate", @@ -990,7 +1110,9 @@ "commandType": { "title": "Commandtype", "default": "blowOutInPlace", - "enum": ["blowOutInPlace"], + "enum": [ + "blowOutInPlace" + ], "type": "string" }, "params": { @@ -1010,12 +1132,19 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DropTipWellOrigin": { "title": "DropTipWellOrigin", "description": "The origin of a DropTipWellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well\n DEFAULT: the default drop-tip location of the well,\n based on pipette configuration and length of the tip.", - "enum": ["top", "bottom", "center", "default"], + "enum": [ + "top", + "bottom", + "center", + "default" + ], "type": "string" }, "DropTipWellLocation": { @@ -1077,7 +1206,11 @@ "type": "boolean" } }, - "required": ["pipetteId", "labwareId", "wellName"] + "required": [ + "pipetteId", + "labwareId", + "wellName" + ] }, "DropTipCreate": { "title": "DropTipCreate", @@ -1087,7 +1220,9 @@ "commandType": { "title": "Commandtype", "default": "dropTip", - "enum": ["dropTip"], + "enum": [ + "dropTip" + ], "type": "string" }, "params": { @@ -1107,7 +1242,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DropTipInPlaceParams": { "title": "DropTipInPlaceParams", @@ -1125,7 +1262,9 @@ "type": "boolean" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "DropTipInPlaceCreate": { "title": "DropTipInPlaceCreate", @@ -1135,7 +1274,9 @@ "commandType": { "title": "Commandtype", "default": "dropTipInPlace", - "enum": ["dropTipInPlace"], + "enum": [ + "dropTipInPlace" + ], "type": "string" }, "params": { @@ -1155,7 +1296,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MotorAxis": { "title": "MotorAxis", @@ -1175,7 +1318,11 @@ "MountType": { "title": "MountType", "description": "An enumeration.", - "enum": ["left", "right", "extension"], + "enum": [ + "left", + "right", + "extension" + ], "type": "string" }, "HomeParams": { @@ -1208,7 +1355,9 @@ "commandType": { "title": "Commandtype", "default": "home", - "enum": ["home"], + "enum": [ + "home" + ], "type": "string" }, "params": { @@ -1228,7 +1377,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "RetractAxisParams": { "title": "RetractAxisParams", @@ -1244,7 +1395,9 @@ ] } }, - "required": ["axis"] + "required": [ + "axis" + ] }, "RetractAxisCreate": { "title": "RetractAxisCreate", @@ -1254,7 +1407,9 @@ "commandType": { "title": "Commandtype", "default": "retractAxis", - "enum": ["retractAxis"], + "enum": [ + "retractAxis" + ], "type": "string" }, "params": { @@ -1274,7 +1429,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeckSlotName": { "title": "DeckSlotName", @@ -1320,7 +1477,9 @@ ] } }, - "required": ["slotName"] + "required": [ + "slotName" + ] }, "ModuleLocation": { "title": "ModuleLocation", @@ -1333,7 +1492,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "OnLabwareLocation": { "title": "OnLabwareLocation", @@ -1346,7 +1507,9 @@ "type": "string" } }, - "required": ["labwareId"] + "required": [ + "labwareId" + ] }, "AddressableAreaLocation": { "title": "AddressableAreaLocation", @@ -1359,7 +1522,9 @@ "type": "string" } }, - "required": ["addressableAreaName"] + "required": [ + "addressableAreaName" + ] }, "LoadLabwareParams": { "title": "LoadLabwareParams", @@ -1380,7 +1545,9 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": ["offDeck"], + "enum": [ + "offDeck" + ], "type": "string" }, { @@ -1414,7 +1581,12 @@ "type": "string" } }, - "required": ["location", "loadName", "namespace", "version"] + "required": [ + "location", + "loadName", + "namespace", + "version" + ] }, "LoadLabwareCreate": { "title": "LoadLabwareCreate", @@ -1424,7 +1596,9 @@ "commandType": { "title": "Commandtype", "default": "loadLabware", - "enum": ["loadLabware"], + "enum": [ + "loadLabware" + ], "type": "string" }, "params": { @@ -1444,7 +1618,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ReloadLabwareParams": { "title": "ReloadLabwareParams", @@ -1457,7 +1633,9 @@ "type": "string" } }, - "required": ["labwareId"] + "required": [ + "labwareId" + ] }, "ReloadLabwareCreate": { "title": "ReloadLabwareCreate", @@ -1467,7 +1645,9 @@ "commandType": { "title": "Commandtype", "default": "reloadLabware", - "enum": ["reloadLabware"], + "enum": [ + "reloadLabware" + ], "type": "string" }, "params": { @@ -1487,7 +1667,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LoadLiquidParams": { "title": "LoadLiquidParams", @@ -1513,7 +1695,11 @@ } } }, - "required": ["liquidId", "labwareId", "volumeByWell"] + "required": [ + "liquidId", + "labwareId", + "volumeByWell" + ] }, "LoadLiquidCreate": { "title": "LoadLiquidCreate", @@ -1523,7 +1709,9 @@ "commandType": { "title": "Commandtype", "default": "loadLiquid", - "enum": ["loadLiquid"], + "enum": [ + "loadLiquid" + ], "type": "string" }, "params": { @@ -1543,7 +1731,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ModuleModel": { "title": "ModuleModel", @@ -1589,7 +1779,10 @@ "type": "string" } }, - "required": ["model", "location"] + "required": [ + "model", + "location" + ] }, "LoadModuleCreate": { "title": "LoadModuleCreate", @@ -1599,7 +1792,9 @@ "commandType": { "title": "Commandtype", "default": "loadModule", - "enum": ["loadModule"], + "enum": [ + "loadModule" + ], "type": "string" }, "params": { @@ -1619,7 +1814,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PipetteNameType": { "title": "PipetteNameType", @@ -1682,7 +1879,10 @@ "type": "boolean" } }, - "required": ["pipetteName", "mount"] + "required": [ + "pipetteName", + "mount" + ] }, "LoadPipetteCreate": { "title": "LoadPipetteCreate", @@ -1692,7 +1892,9 @@ "commandType": { "title": "Commandtype", "default": "loadPipette", - "enum": ["loadPipette"], + "enum": [ + "loadPipette" + ], "type": "string" }, "params": { @@ -1712,12 +1914,18 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LabwareMovementStrategy": { "title": "LabwareMovementStrategy", "description": "Strategy to use for labware movement.", - "enum": ["usingGripper", "manualMoveWithPause", "manualMoveWithoutPause"], + "enum": [ + "usingGripper", + "manualMoveWithPause", + "manualMoveWithoutPause" + ], "type": "string" }, "LabwareOffsetVector": { @@ -1738,7 +1946,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveLabwareParams": { "title": "MoveLabwareParams", @@ -1764,7 +1976,9 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": ["offDeck"], + "enum": [ + "offDeck" + ], "type": "string" }, { @@ -1799,7 +2013,11 @@ ] } }, - "required": ["labwareId", "newLocation", "strategy"] + "required": [ + "labwareId", + "newLocation", + "strategy" + ] }, "MoveLabwareCreate": { "title": "MoveLabwareCreate", @@ -1809,7 +2027,9 @@ "commandType": { "title": "Commandtype", "default": "moveLabware", - "enum": ["moveLabware"], + "enum": [ + "moveLabware" + ], "type": "string" }, "params": { @@ -1829,12 +2049,18 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MovementAxis": { "title": "MovementAxis", "description": "Axis on which to issue a relative movement.", - "enum": ["x", "y", "z"], + "enum": [ + "x", + "y", + "z" + ], "type": "string" }, "MoveRelativeParams": { @@ -1861,7 +2087,11 @@ "type": "number" } }, - "required": ["pipetteId", "axis", "distance"] + "required": [ + "pipetteId", + "axis", + "distance" + ] }, "MoveRelativeCreate": { "title": "MoveRelativeCreate", @@ -1871,7 +2101,9 @@ "commandType": { "title": "Commandtype", "default": "moveRelative", - "enum": ["moveRelative"], + "enum": [ + "moveRelative" + ], "type": "string" }, "params": { @@ -1891,7 +2123,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeckPoint": { "title": "DeckPoint", @@ -1911,7 +2145,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveToCoordinatesParams": { "title": "MoveToCoordinatesParams", @@ -1949,7 +2187,10 @@ ] } }, - "required": ["pipetteId", "coordinates"] + "required": [ + "pipetteId", + "coordinates" + ] }, "MoveToCoordinatesCreate": { "title": "MoveToCoordinatesCreate", @@ -1959,7 +2200,9 @@ "commandType": { "title": "Commandtype", "default": "moveToCoordinates", - "enum": ["moveToCoordinates"], + "enum": [ + "moveToCoordinates" + ], "type": "string" }, "params": { @@ -1979,7 +2222,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MoveToWellParams": { "title": "MoveToWellParams", @@ -2027,7 +2272,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "MoveToWellCreate": { "title": "MoveToWellCreate", @@ -2037,7 +2286,9 @@ "commandType": { "title": "Commandtype", "default": "moveToWell", - "enum": ["moveToWell"], + "enum": [ + "moveToWell" + ], "type": "string" }, "params": { @@ -2057,7 +2308,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AddressableOffsetVector": { "title": "AddressableOffsetVector", @@ -2077,7 +2330,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveToAddressableAreaParams": { "title": "MoveToAddressableAreaParams", @@ -2131,7 +2388,10 @@ "type": "boolean" } }, - "required": ["pipetteId", "addressableAreaName"] + "required": [ + "pipetteId", + "addressableAreaName" + ] }, "MoveToAddressableAreaCreate": { "title": "MoveToAddressableAreaCreate", @@ -2141,7 +2401,9 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableArea", - "enum": ["moveToAddressableArea"], + "enum": [ + "moveToAddressableArea" + ], "type": "string" }, "params": { @@ -2161,7 +2423,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MoveToAddressableAreaForDropTipParams": { "title": "MoveToAddressableAreaForDropTipParams", @@ -2221,7 +2485,10 @@ "type": "boolean" } }, - "required": ["pipetteId", "addressableAreaName"] + "required": [ + "pipetteId", + "addressableAreaName" + ] }, "MoveToAddressableAreaForDropTipCreate": { "title": "MoveToAddressableAreaForDropTipCreate", @@ -2231,7 +2498,9 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableAreaForDropTip", - "enum": ["moveToAddressableAreaForDropTip"], + "enum": [ + "moveToAddressableAreaForDropTip" + ], "type": "string" }, "params": { @@ -2251,7 +2520,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PrepareToAspirateParams": { "title": "PrepareToAspirateParams", @@ -2264,7 +2535,9 @@ "type": "string" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "PrepareToAspirateCreate": { "title": "PrepareToAspirateCreate", @@ -2274,7 +2547,9 @@ "commandType": { "title": "Commandtype", "default": "prepareToAspirate", - "enum": ["prepareToAspirate"], + "enum": [ + "prepareToAspirate" + ], "type": "string" }, "params": { @@ -2294,7 +2569,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForResumeParams": { "title": "WaitForResumeParams", @@ -2316,7 +2593,10 @@ "commandType": { "title": "Commandtype", "default": "waitForResume", - "enum": ["waitForResume", "pause"], + "enum": [ + "waitForResume", + "pause" + ], "type": "string" }, "params": { @@ -2336,7 +2616,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForDurationParams": { "title": "WaitForDurationParams", @@ -2354,7 +2636,9 @@ "type": "string" } }, - "required": ["seconds"] + "required": [ + "seconds" + ] }, "WaitForDurationCreate": { "title": "WaitForDurationCreate", @@ -2364,7 +2648,9 @@ "commandType": { "title": "Commandtype", "default": "waitForDuration", - "enum": ["waitForDuration"], + "enum": [ + "waitForDuration" + ], "type": "string" }, "params": { @@ -2384,7 +2670,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PickUpTipParams": { "title": "PickUpTipParams", @@ -2416,7 +2704,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "PickUpTipCreate": { "title": "PickUpTipCreate", @@ -2426,7 +2718,9 @@ "commandType": { "title": "Commandtype", "default": "pickUpTip", - "enum": ["pickUpTip"], + "enum": [ + "pickUpTip" + ], "type": "string" }, "params": { @@ -2446,7 +2740,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SavePositionParams": { "title": "SavePositionParams", @@ -2470,7 +2766,9 @@ "type": "boolean" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "SavePositionCreate": { "title": "SavePositionCreate", @@ -2480,7 +2778,9 @@ "commandType": { "title": "Commandtype", "default": "savePosition", - "enum": ["savePosition"], + "enum": [ + "savePosition" + ], "type": "string" }, "params": { @@ -2500,7 +2800,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetRailLightsParams": { "title": "SetRailLightsParams", @@ -2513,7 +2815,9 @@ "type": "boolean" } }, - "required": ["on"] + "required": [ + "on" + ] }, "SetRailLightsCreate": { "title": "SetRailLightsCreate", @@ -2523,7 +2827,9 @@ "commandType": { "title": "Commandtype", "default": "setRailLights", - "enum": ["setRailLights"], + "enum": [ + "setRailLights" + ], "type": "string" }, "params": { @@ -2543,7 +2849,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TouchTipParams": { "title": "TouchTipParams", @@ -2586,7 +2894,11 @@ "type": "number" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "TouchTipCreate": { "title": "TouchTipCreate", @@ -2596,7 +2908,9 @@ "commandType": { "title": "Commandtype", "default": "touchTip", - "enum": ["touchTip"], + "enum": [ + "touchTip" + ], "type": "string" }, "params": { @@ -2616,12 +2930,20 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "StatusBarAnimation": { "title": "StatusBarAnimation", "description": "Status Bar animation options.", - "enum": ["idle", "confirm", "updating", "disco", "off"] + "enum": [ + "idle", + "confirm", + "updating", + "disco", + "off" + ] }, "SetStatusBarParams": { "title": "SetStatusBarParams", @@ -2637,7 +2959,9 @@ ] } }, - "required": ["animation"] + "required": [ + "animation" + ] }, "SetStatusBarCreate": { "title": "SetStatusBarCreate", @@ -2647,7 +2971,9 @@ "commandType": { "title": "Commandtype", "default": "setStatusBar", - "enum": ["setStatusBar"], + "enum": [ + "setStatusBar" + ], "type": "string" }, "params": { @@ -2667,18 +2993,28 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TipPresenceStatus": { "title": "TipPresenceStatus", "description": "Tip presence status reported by a pipette.", - "enum": ["present", "absent", "unknown"], + "enum": [ + "present", + "absent", + "unknown" + ], "type": "string" }, "InstrumentSensorId": { "title": "InstrumentSensorId", "description": "Primary and secondary sensor ids.", - "enum": ["primary", "secondary", "both"], + "enum": [ + "primary", + "secondary", + "both" + ], "type": "string" }, "VerifyTipPresenceParams": { @@ -2708,7 +3044,10 @@ ] } }, - "required": ["pipetteId", "expectedState"] + "required": [ + "pipetteId", + "expectedState" + ] }, "VerifyTipPresenceCreate": { "title": "VerifyTipPresenceCreate", @@ -2718,7 +3057,9 @@ "commandType": { "title": "Commandtype", "default": "verifyTipPresence", - "enum": ["verifyTipPresence"], + "enum": [ + "verifyTipPresence" + ], "type": "string" }, "params": { @@ -2738,7 +3079,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "GetTipPresenceParams": { "title": "GetTipPresenceParams", @@ -2751,7 +3094,9 @@ "type": "string" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "GetTipPresenceCreate": { "title": "GetTipPresenceCreate", @@ -2761,7 +3106,9 @@ "commandType": { "title": "Commandtype", "default": "getTipPresence", - "enum": ["getTipPresence"], + "enum": [ + "getTipPresence" + ], "type": "string" }, "params": { @@ -2781,7 +3128,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LiquidProbeParams": { "title": "LiquidProbeParams", @@ -2813,7 +3162,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "LiquidProbeCreate": { "title": "LiquidProbeCreate", @@ -2823,7 +3176,9 @@ "commandType": { "title": "Commandtype", "default": "liquidProbe", - "enum": ["liquidProbe"], + "enum": [ + "liquidProbe" + ], "type": "string" }, "params": { @@ -2843,7 +3198,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TryLiquidProbeParams": { "title": "TryLiquidProbeParams", @@ -2875,7 +3232,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "TryLiquidProbeCreate": { "title": "TryLiquidProbeCreate", @@ -2885,7 +3246,9 @@ "commandType": { "title": "Commandtype", "default": "tryLiquidProbe", - "enum": ["tryLiquidProbe"], + "enum": [ + "tryLiquidProbe" + ], "type": "string" }, "params": { @@ -2905,7 +3268,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -2923,7 +3288,9 @@ "type": "number" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -2933,7 +3300,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/waitForTemperature", - "enum": ["heaterShaker/waitForTemperature"], + "enum": [ + "heaterShaker/waitForTemperature" + ], "type": "string" }, "params": { @@ -2953,7 +3322,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -2971,7 +3342,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -2981,7 +3355,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setTargetTemperature", - "enum": ["heaterShaker/setTargetTemperature"], + "enum": [ + "heaterShaker/setTargetTemperature" + ], "type": "string" }, "params": { @@ -3001,7 +3377,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateHeaterParams": { "title": "DeactivateHeaterParams", @@ -3014,7 +3392,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateHeaterCreate": { "title": "DeactivateHeaterCreate", @@ -3024,7 +3404,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateHeater", - "enum": ["heaterShaker/deactivateHeater"], + "enum": [ + "heaterShaker/deactivateHeater" + ], "type": "string" }, "params": { @@ -3044,7 +3426,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetAndWaitForShakeSpeedParams": { "title": "SetAndWaitForShakeSpeedParams", @@ -3062,7 +3446,10 @@ "type": "number" } }, - "required": ["moduleId", "rpm"] + "required": [ + "moduleId", + "rpm" + ] }, "SetAndWaitForShakeSpeedCreate": { "title": "SetAndWaitForShakeSpeedCreate", @@ -3072,7 +3459,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setAndWaitForShakeSpeed", - "enum": ["heaterShaker/setAndWaitForShakeSpeed"], + "enum": [ + "heaterShaker/setAndWaitForShakeSpeed" + ], "type": "string" }, "params": { @@ -3092,7 +3481,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateShakerParams": { "title": "DeactivateShakerParams", @@ -3105,7 +3496,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateShakerCreate": { "title": "DeactivateShakerCreate", @@ -3115,7 +3508,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateShaker", - "enum": ["heaterShaker/deactivateShaker"], + "enum": [ + "heaterShaker/deactivateShaker" + ], "type": "string" }, "params": { @@ -3135,7 +3530,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "OpenLabwareLatchParams": { "title": "OpenLabwareLatchParams", @@ -3148,7 +3545,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "OpenLabwareLatchCreate": { "title": "OpenLabwareLatchCreate", @@ -3158,7 +3557,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/openLabwareLatch", - "enum": ["heaterShaker/openLabwareLatch"], + "enum": [ + "heaterShaker/openLabwareLatch" + ], "type": "string" }, "params": { @@ -3178,7 +3579,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CloseLabwareLatchParams": { "title": "CloseLabwareLatchParams", @@ -3191,7 +3594,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "CloseLabwareLatchCreate": { "title": "CloseLabwareLatchCreate", @@ -3201,7 +3606,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/closeLabwareLatch", - "enum": ["heaterShaker/closeLabwareLatch"], + "enum": [ + "heaterShaker/closeLabwareLatch" + ], "type": "string" }, "params": { @@ -3221,7 +3628,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DisengageParams": { "title": "DisengageParams", @@ -3234,7 +3643,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DisengageCreate": { "title": "DisengageCreate", @@ -3244,7 +3655,9 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/disengage", - "enum": ["magneticModule/disengage"], + "enum": [ + "magneticModule/disengage" + ], "type": "string" }, "params": { @@ -3264,7 +3677,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "EngageParams": { "title": "EngageParams", @@ -3282,7 +3697,10 @@ "type": "number" } }, - "required": ["moduleId", "height"] + "required": [ + "moduleId", + "height" + ] }, "EngageCreate": { "title": "EngageCreate", @@ -3292,7 +3710,9 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/engage", - "enum": ["magneticModule/engage"], + "enum": [ + "magneticModule/engage" + ], "type": "string" }, "params": { @@ -3312,7 +3732,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3330,7 +3752,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3340,7 +3765,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/setTargetTemperature", - "enum": ["temperatureModule/setTargetTemperature"], + "enum": [ + "temperatureModule/setTargetTemperature" + ], "type": "string" }, "params": { @@ -3360,7 +3787,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3378,7 +3807,9 @@ "type": "number" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3388,7 +3819,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/waitForTemperature", - "enum": ["temperatureModule/waitForTemperature"], + "enum": [ + "temperatureModule/waitForTemperature" + ], "type": "string" }, "params": { @@ -3408,7 +3841,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateTemperatureParams": { "title": "DeactivateTemperatureParams", @@ -3421,7 +3856,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateTemperatureCreate": { "title": "DeactivateTemperatureCreate", @@ -3431,7 +3868,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/deactivate", - "enum": ["temperatureModule/deactivate"], + "enum": [ + "temperatureModule/deactivate" + ], "type": "string" }, "params": { @@ -3451,7 +3890,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetTargetBlockTemperatureParams": { "title": "SetTargetBlockTemperatureParams", @@ -3479,7 +3920,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "SetTargetBlockTemperatureCreate": { "title": "SetTargetBlockTemperatureCreate", @@ -3489,7 +3933,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetBlockTemperature", - "enum": ["thermocycler/setTargetBlockTemperature"], + "enum": [ + "thermocycler/setTargetBlockTemperature" + ], "type": "string" }, "params": { @@ -3509,7 +3955,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForBlockTemperatureParams": { "title": "WaitForBlockTemperatureParams", @@ -3522,7 +3970,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "WaitForBlockTemperatureCreate": { "title": "WaitForBlockTemperatureCreate", @@ -3532,7 +3982,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForBlockTemperature", - "enum": ["thermocycler/waitForBlockTemperature"], + "enum": [ + "thermocycler/waitForBlockTemperature" + ], "type": "string" }, "params": { @@ -3552,7 +4004,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetTargetLidTemperatureParams": { "title": "SetTargetLidTemperatureParams", @@ -3570,7 +4024,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "SetTargetLidTemperatureCreate": { "title": "SetTargetLidTemperatureCreate", @@ -3580,7 +4037,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetLidTemperature", - "enum": ["thermocycler/setTargetLidTemperature"], + "enum": [ + "thermocycler/setTargetLidTemperature" + ], "type": "string" }, "params": { @@ -3600,7 +4059,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForLidTemperatureParams": { "title": "WaitForLidTemperatureParams", @@ -3613,7 +4074,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "WaitForLidTemperatureCreate": { "title": "WaitForLidTemperatureCreate", @@ -3623,7 +4086,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForLidTemperature", - "enum": ["thermocycler/waitForLidTemperature"], + "enum": [ + "thermocycler/waitForLidTemperature" + ], "type": "string" }, "params": { @@ -3643,7 +4108,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateBlockParams": { "title": "DeactivateBlockParams", @@ -3656,7 +4123,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateBlockCreate": { "title": "DeactivateBlockCreate", @@ -3666,7 +4135,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateBlock", - "enum": ["thermocycler/deactivateBlock"], + "enum": [ + "thermocycler/deactivateBlock" + ], "type": "string" }, "params": { @@ -3686,7 +4157,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateLidParams": { "title": "DeactivateLidParams", @@ -3699,7 +4172,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateLidCreate": { "title": "DeactivateLidCreate", @@ -3709,7 +4184,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateLid", - "enum": ["thermocycler/deactivateLid"], + "enum": [ + "thermocycler/deactivateLid" + ], "type": "string" }, "params": { @@ -3729,7 +4206,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -3742,7 +4221,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -3752,7 +4233,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/openLid", - "enum": ["thermocycler/openLid"], + "enum": [ + "thermocycler/openLid" + ], "type": "string" }, "params": { @@ -3772,7 +4255,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -3785,7 +4270,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -3795,7 +4282,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/closeLid", - "enum": ["thermocycler/closeLid"], + "enum": [ + "thermocycler/closeLid" + ], "type": "string" }, "params": { @@ -3815,7 +4304,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "RunProfileStepParams": { "title": "RunProfileStepParams", @@ -3833,7 +4324,10 @@ "type": "number" } }, - "required": ["celsius", "holdSeconds"] + "required": [ + "celsius", + "holdSeconds" + ] }, "RunProfileParams": { "title": "RunProfileParams", @@ -3859,7 +4353,10 @@ "type": "number" } }, - "required": ["moduleId", "profile"] + "required": [ + "moduleId", + "profile" + ] }, "RunProfileCreate": { "title": "RunProfileCreate", @@ -3869,7 +4366,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/runProfile", - "enum": ["thermocycler/runProfile"], + "enum": [ + "thermocycler/runProfile" + ], "type": "string" }, "params": { @@ -3889,7 +4388,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -3900,27 +4401,11 @@ "title": "Moduleid", "description": "Unique ID of the absorbance reader.", "type": "string" - }, - "pickUpOffset": { - "title": "Pickupoffset", - "description": "Offset to use when picking up labware. Experimental param, subject to change", - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ] - }, - "dropOffset": { - "title": "Dropoffset", - "description": "Offset to use when dropping off labware. Experimental param, subject to change", - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ] } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -3930,7 +4415,9 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/closeLid", - "enum": ["absorbanceReader/closeLid"], + "enum": [ + "absorbanceReader/closeLid" + ], "type": "string" }, "params": { @@ -3950,7 +4437,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -3961,27 +4450,11 @@ "title": "Moduleid", "description": "Unique ID of the absorbance reader.", "type": "string" - }, - "pickUpOffset": { - "title": "Pickupoffset", - "description": "Offset to use when picking up labware. Experimental param, subject to change", - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ] - }, - "dropOffset": { - "title": "Dropoffset", - "description": "Offset to use when dropping off labware. Experimental param, subject to change", - "allOf": [ - { - "$ref": "#/definitions/LabwareOffsetVector" - } - ] } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -3991,7 +4464,9 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/openLid", - "enum": ["absorbanceReader/openLid"], + "enum": [ + "absorbanceReader/openLid" + ], "type": "string" }, "params": { @@ -4011,7 +4486,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "InitializeParams": { "title": "InitializeParams", @@ -4029,7 +4506,10 @@ "type": "integer" } }, - "required": ["moduleId", "sampleWavelength"] + "required": [ + "moduleId", + "sampleWavelength" + ] }, "InitializeCreate": { "title": "InitializeCreate", @@ -4039,7 +4519,9 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/initialize", - "enum": ["absorbanceReader/initialize"], + "enum": [ + "absorbanceReader/initialize" + ], "type": "string" }, "params": { @@ -4059,7 +4541,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ReadAbsorbanceParams": { "title": "ReadAbsorbanceParams", @@ -4077,7 +4561,10 @@ "type": "integer" } }, - "required": ["moduleId", "sampleWavelength"] + "required": [ + "moduleId", + "sampleWavelength" + ] }, "ReadAbsorbanceCreate": { "title": "ReadAbsorbanceCreate", @@ -4087,7 +4574,9 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/read", - "enum": ["absorbanceReader/read"], + "enum": [ + "absorbanceReader/read" + ], "type": "string" }, "params": { @@ -4107,12 +4596,17 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibrateGripperParamsJaw": { "title": "CalibrateGripperParamsJaw", "description": "An enumeration.", - "enum": ["front", "rear"] + "enum": [ + "front", + "rear" + ] }, "Vec3f": { "title": "Vec3f", @@ -4132,7 +4626,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "CalibrateGripperParams": { "title": "CalibrateGripperParams", @@ -4157,7 +4655,9 @@ ] } }, - "required": ["jaw"] + "required": [ + "jaw" + ] }, "CalibrateGripperCreate": { "title": "CalibrateGripperCreate", @@ -4167,7 +4667,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateGripper", - "enum": ["calibration/calibrateGripper"], + "enum": [ + "calibration/calibrateGripper" + ], "type": "string" }, "params": { @@ -4187,7 +4689,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibratePipetteParams": { "title": "CalibratePipetteParams", @@ -4203,7 +4707,9 @@ ] } }, - "required": ["mount"] + "required": [ + "mount" + ] }, "CalibratePipetteCreate": { "title": "CalibratePipetteCreate", @@ -4213,7 +4719,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibratePipette", - "enum": ["calibration/calibratePipette"], + "enum": [ + "calibration/calibratePipette" + ], "type": "string" }, "params": { @@ -4233,7 +4741,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibrateModuleParams": { "title": "CalibrateModuleParams", @@ -4259,7 +4769,11 @@ ] } }, - "required": ["moduleId", "labwareId", "mount"] + "required": [ + "moduleId", + "labwareId", + "mount" + ] }, "CalibrateModuleCreate": { "title": "CalibrateModuleCreate", @@ -4269,7 +4783,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateModule", - "enum": ["calibration/calibrateModule"], + "enum": [ + "calibration/calibrateModule" + ], "type": "string" }, "params": { @@ -4289,12 +4805,17 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MaintenancePosition": { "title": "MaintenancePosition", "description": "Maintenance position options.", - "enum": ["attachPlate", "attachInstrument"] + "enum": [ + "attachPlate", + "attachInstrument" + ] }, "MoveToMaintenancePositionParams": { "title": "MoveToMaintenancePositionParams", @@ -4319,7 +4840,9 @@ ] } }, - "required": ["mount"] + "required": [ + "mount" + ] }, "MoveToMaintenancePositionCreate": { "title": "MoveToMaintenancePositionCreate", @@ -4329,7 +4852,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/moveToMaintenancePosition", - "enum": ["calibration/moveToMaintenancePosition"], + "enum": [ + "calibration/moveToMaintenancePosition" + ], "type": "string" }, "params": { @@ -4349,7 +4874,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] } }, "$id": "opentronsCommandSchemaV8", diff --git a/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json index b6025c612c2..82b5a1f54d8 100644 --- a/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json +++ b/shared-data/labware/definitions/2/opentrons_flex_lid_absorbance_plate_reader_module/1.json @@ -39,5 +39,19 @@ "x": 0, "y": 0, "z": 0 + }, + "gripperOffsets": { + "default": { + "pickUpOffset": { + "x": 14, + "y": 0, + "z": 0 + }, + "dropOffset": { + "x": 14, + "y": 0, + "z": 0 + } + } } } From 9c26a9a2b11011bb673d640c3c8b10dfae4762e9 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Thu, 8 Aug 2024 17:40:16 -0400 Subject: [PATCH 23/26] linting fixes --- .../protocol_api/protocol_context.py | 1 - shared-data/command/schemas/8.json | 1023 ++++------------- 2 files changed, 230 insertions(+), 794 deletions(-) diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 8a0d9140c24..57dd361d54e 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -17,7 +17,6 @@ from opentrons.types import Mount, Location, DeckLocation, DeckSlotName, StagingSlotName from opentrons.legacy_broker import LegacyBroker -from opentrons.hardware_control import SyncHardwareAPI from opentrons.hardware_control.modules.types import ( MagneticBlockModel, AbsorbanceReaderModel, diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 91db93c91a3..17d314949bf 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -277,11 +277,7 @@ "WellOrigin": { "title": "WellOrigin", "description": "Origin of WellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well", - "enum": [ - "top", - "bottom", - "center" - ], + "enum": ["top", "bottom", "center"], "type": "string" }, "WellOffset": { @@ -366,22 +362,12 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "volume", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] }, "CommandIntent": { "title": "CommandIntent", "description": "Run intent for a given command.\n\nProps:\n PROTOCOL: the command is part of the protocol run itself.\n SETUP: the command is part of the setup phase of a run.", - "enum": [ - "protocol", - "setup", - "fixit" - ], + "enum": ["protocol", "setup", "fixit"], "type": "string" }, "AspirateCreate": { @@ -392,9 +378,7 @@ "commandType": { "title": "Commandtype", "default": "aspirate", - "enum": [ - "aspirate" - ], + "enum": ["aspirate"], "type": "string" }, "params": { @@ -414,9 +398,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AspirateInPlaceParams": { "title": "AspirateInPlaceParams", @@ -441,11 +423,7 @@ "type": "string" } }, - "required": [ - "flowRate", - "volume", - "pipetteId" - ] + "required": ["flowRate", "volume", "pipetteId"] }, "AspirateInPlaceCreate": { "title": "AspirateInPlaceCreate", @@ -455,9 +433,7 @@ "commandType": { "title": "Commandtype", "default": "aspirateInPlace", - "enum": [ - "aspirateInPlace" - ], + "enum": ["aspirateInPlace"], "type": "string" }, "params": { @@ -477,9 +453,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CommentParams": { "title": "CommentParams", @@ -492,9 +466,7 @@ "type": "string" } }, - "required": [ - "message" - ] + "required": ["message"] }, "CommentCreate": { "title": "CommentCreate", @@ -504,9 +476,7 @@ "commandType": { "title": "Commandtype", "default": "comment", - "enum": [ - "comment" - ], + "enum": ["comment"], "type": "string" }, "params": { @@ -526,9 +496,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ConfigureForVolumeParams": { "title": "ConfigureForVolumeParams", @@ -552,10 +520,7 @@ "type": "string" } }, - "required": [ - "pipetteId", - "volume" - ] + "required": ["pipetteId", "volume"] }, "ConfigureForVolumeCreate": { "title": "ConfigureForVolumeCreate", @@ -565,9 +530,7 @@ "commandType": { "title": "Commandtype", "default": "configureForVolume", - "enum": [ - "configureForVolume" - ], + "enum": ["configureForVolume"], "type": "string" }, "params": { @@ -587,9 +550,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AllNozzleLayoutConfiguration": { "title": "AllNozzleLayoutConfiguration", @@ -599,9 +560,7 @@ "style": { "title": "Style", "default": "ALL", - "enum": [ - "ALL" - ], + "enum": ["ALL"], "type": "string" } } @@ -614,26 +573,17 @@ "style": { "title": "Style", "default": "SINGLE", - "enum": [ - "SINGLE" - ], + "enum": ["SINGLE"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "RowNozzleLayoutConfiguration": { "title": "RowNozzleLayoutConfiguration", @@ -643,26 +593,17 @@ "style": { "title": "Style", "default": "ROW", - "enum": [ - "ROW" - ], + "enum": ["ROW"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "ColumnNozzleLayoutConfiguration": { "title": "ColumnNozzleLayoutConfiguration", @@ -672,26 +613,17 @@ "style": { "title": "Style", "default": "COLUMN", - "enum": [ - "COLUMN" - ], + "enum": ["COLUMN"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "QuadrantNozzleLayoutConfiguration": { "title": "QuadrantNozzleLayoutConfiguration", @@ -701,20 +633,13 @@ "style": { "title": "Style", "default": "QUADRANT", - "enum": [ - "QUADRANT" - ], + "enum": ["QUADRANT"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" }, "frontRightNozzle": { @@ -730,11 +655,7 @@ "type": "string" } }, - "required": [ - "primaryNozzle", - "frontRightNozzle", - "backLeftNozzle" - ] + "required": ["primaryNozzle", "frontRightNozzle", "backLeftNozzle"] }, "ConfigureNozzleLayoutParams": { "title": "ConfigureNozzleLayoutParams", @@ -767,10 +688,7 @@ ] } }, - "required": [ - "pipetteId", - "configurationParams" - ] + "required": ["pipetteId", "configurationParams"] }, "ConfigureNozzleLayoutCreate": { "title": "ConfigureNozzleLayoutCreate", @@ -780,9 +698,7 @@ "commandType": { "title": "Commandtype", "default": "configureNozzleLayout", - "enum": [ - "configureNozzleLayout" - ], + "enum": ["configureNozzleLayout"], "type": "string" }, "params": { @@ -802,9 +718,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CustomParams": { "title": "CustomParams", @@ -820,9 +734,7 @@ "commandType": { "title": "Commandtype", "default": "custom", - "enum": [ - "custom" - ], + "enum": ["custom"], "type": "string" }, "params": { @@ -842,9 +754,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DispenseParams": { "title": "DispenseParams", @@ -893,13 +803,7 @@ "type": "number" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "volume", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] }, "DispenseCreate": { "title": "DispenseCreate", @@ -909,9 +813,7 @@ "commandType": { "title": "Commandtype", "default": "dispense", - "enum": [ - "dispense" - ], + "enum": ["dispense"], "type": "string" }, "params": { @@ -931,9 +833,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DispenseInPlaceParams": { "title": "DispenseInPlaceParams", @@ -963,11 +863,7 @@ "type": "number" } }, - "required": [ - "flowRate", - "volume", - "pipetteId" - ] + "required": ["flowRate", "volume", "pipetteId"] }, "DispenseInPlaceCreate": { "title": "DispenseInPlaceCreate", @@ -977,9 +873,7 @@ "commandType": { "title": "Commandtype", "default": "dispenseInPlace", - "enum": [ - "dispenseInPlace" - ], + "enum": ["dispenseInPlace"], "type": "string" }, "params": { @@ -999,9 +893,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "BlowOutParams": { "title": "BlowOutParams", @@ -1039,12 +931,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "pipetteId"] }, "BlowOutCreate": { "title": "BlowOutCreate", @@ -1054,9 +941,7 @@ "commandType": { "title": "Commandtype", "default": "blowout", - "enum": [ - "blowout" - ], + "enum": ["blowout"], "type": "string" }, "params": { @@ -1076,9 +961,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "BlowOutInPlaceParams": { "title": "BlowOutInPlaceParams", @@ -1097,10 +980,7 @@ "type": "string" } }, - "required": [ - "flowRate", - "pipetteId" - ] + "required": ["flowRate", "pipetteId"] }, "BlowOutInPlaceCreate": { "title": "BlowOutInPlaceCreate", @@ -1110,9 +990,7 @@ "commandType": { "title": "Commandtype", "default": "blowOutInPlace", - "enum": [ - "blowOutInPlace" - ], + "enum": ["blowOutInPlace"], "type": "string" }, "params": { @@ -1132,19 +1010,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DropTipWellOrigin": { "title": "DropTipWellOrigin", "description": "The origin of a DropTipWellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well\n DEFAULT: the default drop-tip location of the well,\n based on pipette configuration and length of the tip.", - "enum": [ - "top", - "bottom", - "center", - "default" - ], + "enum": ["top", "bottom", "center", "default"], "type": "string" }, "DropTipWellLocation": { @@ -1206,11 +1077,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "labwareId", - "wellName" - ] + "required": ["pipetteId", "labwareId", "wellName"] }, "DropTipCreate": { "title": "DropTipCreate", @@ -1220,9 +1087,7 @@ "commandType": { "title": "Commandtype", "default": "dropTip", - "enum": [ - "dropTip" - ], + "enum": ["dropTip"], "type": "string" }, "params": { @@ -1242,9 +1107,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DropTipInPlaceParams": { "title": "DropTipInPlaceParams", @@ -1262,9 +1125,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "DropTipInPlaceCreate": { "title": "DropTipInPlaceCreate", @@ -1274,9 +1135,7 @@ "commandType": { "title": "Commandtype", "default": "dropTipInPlace", - "enum": [ - "dropTipInPlace" - ], + "enum": ["dropTipInPlace"], "type": "string" }, "params": { @@ -1296,9 +1155,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MotorAxis": { "title": "MotorAxis", @@ -1318,11 +1175,7 @@ "MountType": { "title": "MountType", "description": "An enumeration.", - "enum": [ - "left", - "right", - "extension" - ], + "enum": ["left", "right", "extension"], "type": "string" }, "HomeParams": { @@ -1355,9 +1208,7 @@ "commandType": { "title": "Commandtype", "default": "home", - "enum": [ - "home" - ], + "enum": ["home"], "type": "string" }, "params": { @@ -1377,9 +1228,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "RetractAxisParams": { "title": "RetractAxisParams", @@ -1395,9 +1244,7 @@ ] } }, - "required": [ - "axis" - ] + "required": ["axis"] }, "RetractAxisCreate": { "title": "RetractAxisCreate", @@ -1407,9 +1254,7 @@ "commandType": { "title": "Commandtype", "default": "retractAxis", - "enum": [ - "retractAxis" - ], + "enum": ["retractAxis"], "type": "string" }, "params": { @@ -1429,9 +1274,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeckSlotName": { "title": "DeckSlotName", @@ -1477,9 +1320,7 @@ ] } }, - "required": [ - "slotName" - ] + "required": ["slotName"] }, "ModuleLocation": { "title": "ModuleLocation", @@ -1492,9 +1333,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "OnLabwareLocation": { "title": "OnLabwareLocation", @@ -1507,9 +1346,7 @@ "type": "string" } }, - "required": [ - "labwareId" - ] + "required": ["labwareId"] }, "AddressableAreaLocation": { "title": "AddressableAreaLocation", @@ -1522,9 +1359,7 @@ "type": "string" } }, - "required": [ - "addressableAreaName" - ] + "required": ["addressableAreaName"] }, "LoadLabwareParams": { "title": "LoadLabwareParams", @@ -1545,9 +1380,7 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": [ - "offDeck" - ], + "enum": ["offDeck"], "type": "string" }, { @@ -1581,12 +1414,7 @@ "type": "string" } }, - "required": [ - "location", - "loadName", - "namespace", - "version" - ] + "required": ["location", "loadName", "namespace", "version"] }, "LoadLabwareCreate": { "title": "LoadLabwareCreate", @@ -1596,9 +1424,7 @@ "commandType": { "title": "Commandtype", "default": "loadLabware", - "enum": [ - "loadLabware" - ], + "enum": ["loadLabware"], "type": "string" }, "params": { @@ -1618,9 +1444,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ReloadLabwareParams": { "title": "ReloadLabwareParams", @@ -1633,9 +1457,7 @@ "type": "string" } }, - "required": [ - "labwareId" - ] + "required": ["labwareId"] }, "ReloadLabwareCreate": { "title": "ReloadLabwareCreate", @@ -1645,9 +1467,7 @@ "commandType": { "title": "Commandtype", "default": "reloadLabware", - "enum": [ - "reloadLabware" - ], + "enum": ["reloadLabware"], "type": "string" }, "params": { @@ -1667,9 +1487,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LoadLiquidParams": { "title": "LoadLiquidParams", @@ -1695,11 +1513,7 @@ } } }, - "required": [ - "liquidId", - "labwareId", - "volumeByWell" - ] + "required": ["liquidId", "labwareId", "volumeByWell"] }, "LoadLiquidCreate": { "title": "LoadLiquidCreate", @@ -1709,9 +1523,7 @@ "commandType": { "title": "Commandtype", "default": "loadLiquid", - "enum": [ - "loadLiquid" - ], + "enum": ["loadLiquid"], "type": "string" }, "params": { @@ -1731,9 +1543,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ModuleModel": { "title": "ModuleModel", @@ -1779,10 +1589,7 @@ "type": "string" } }, - "required": [ - "model", - "location" - ] + "required": ["model", "location"] }, "LoadModuleCreate": { "title": "LoadModuleCreate", @@ -1792,9 +1599,7 @@ "commandType": { "title": "Commandtype", "default": "loadModule", - "enum": [ - "loadModule" - ], + "enum": ["loadModule"], "type": "string" }, "params": { @@ -1814,9 +1619,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PipetteNameType": { "title": "PipetteNameType", @@ -1879,10 +1682,7 @@ "type": "boolean" } }, - "required": [ - "pipetteName", - "mount" - ] + "required": ["pipetteName", "mount"] }, "LoadPipetteCreate": { "title": "LoadPipetteCreate", @@ -1892,9 +1692,7 @@ "commandType": { "title": "Commandtype", "default": "loadPipette", - "enum": [ - "loadPipette" - ], + "enum": ["loadPipette"], "type": "string" }, "params": { @@ -1914,18 +1712,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LabwareMovementStrategy": { "title": "LabwareMovementStrategy", "description": "Strategy to use for labware movement.", - "enum": [ - "usingGripper", - "manualMoveWithPause", - "manualMoveWithoutPause" - ], + "enum": ["usingGripper", "manualMoveWithPause", "manualMoveWithoutPause"], "type": "string" }, "LabwareOffsetVector": { @@ -1946,11 +1738,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveLabwareParams": { "title": "MoveLabwareParams", @@ -1976,9 +1764,7 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": [ - "offDeck" - ], + "enum": ["offDeck"], "type": "string" }, { @@ -2013,11 +1799,7 @@ ] } }, - "required": [ - "labwareId", - "newLocation", - "strategy" - ] + "required": ["labwareId", "newLocation", "strategy"] }, "MoveLabwareCreate": { "title": "MoveLabwareCreate", @@ -2027,9 +1809,7 @@ "commandType": { "title": "Commandtype", "default": "moveLabware", - "enum": [ - "moveLabware" - ], + "enum": ["moveLabware"], "type": "string" }, "params": { @@ -2049,18 +1829,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MovementAxis": { "title": "MovementAxis", "description": "Axis on which to issue a relative movement.", - "enum": [ - "x", - "y", - "z" - ], + "enum": ["x", "y", "z"], "type": "string" }, "MoveRelativeParams": { @@ -2087,11 +1861,7 @@ "type": "number" } }, - "required": [ - "pipetteId", - "axis", - "distance" - ] + "required": ["pipetteId", "axis", "distance"] }, "MoveRelativeCreate": { "title": "MoveRelativeCreate", @@ -2101,9 +1871,7 @@ "commandType": { "title": "Commandtype", "default": "moveRelative", - "enum": [ - "moveRelative" - ], + "enum": ["moveRelative"], "type": "string" }, "params": { @@ -2123,9 +1891,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeckPoint": { "title": "DeckPoint", @@ -2145,11 +1911,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveToCoordinatesParams": { "title": "MoveToCoordinatesParams", @@ -2187,10 +1949,7 @@ ] } }, - "required": [ - "pipetteId", - "coordinates" - ] + "required": ["pipetteId", "coordinates"] }, "MoveToCoordinatesCreate": { "title": "MoveToCoordinatesCreate", @@ -2200,9 +1959,7 @@ "commandType": { "title": "Commandtype", "default": "moveToCoordinates", - "enum": [ - "moveToCoordinates" - ], + "enum": ["moveToCoordinates"], "type": "string" }, "params": { @@ -2222,9 +1979,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MoveToWellParams": { "title": "MoveToWellParams", @@ -2272,11 +2027,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "MoveToWellCreate": { "title": "MoveToWellCreate", @@ -2286,9 +2037,7 @@ "commandType": { "title": "Commandtype", "default": "moveToWell", - "enum": [ - "moveToWell" - ], + "enum": ["moveToWell"], "type": "string" }, "params": { @@ -2308,9 +2057,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AddressableOffsetVector": { "title": "AddressableOffsetVector", @@ -2330,11 +2077,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveToAddressableAreaParams": { "title": "MoveToAddressableAreaParams", @@ -2388,10 +2131,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "addressableAreaName" - ] + "required": ["pipetteId", "addressableAreaName"] }, "MoveToAddressableAreaCreate": { "title": "MoveToAddressableAreaCreate", @@ -2401,9 +2141,7 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableArea", - "enum": [ - "moveToAddressableArea" - ], + "enum": ["moveToAddressableArea"], "type": "string" }, "params": { @@ -2423,9 +2161,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MoveToAddressableAreaForDropTipParams": { "title": "MoveToAddressableAreaForDropTipParams", @@ -2485,10 +2221,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "addressableAreaName" - ] + "required": ["pipetteId", "addressableAreaName"] }, "MoveToAddressableAreaForDropTipCreate": { "title": "MoveToAddressableAreaForDropTipCreate", @@ -2498,9 +2231,7 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableAreaForDropTip", - "enum": [ - "moveToAddressableAreaForDropTip" - ], + "enum": ["moveToAddressableAreaForDropTip"], "type": "string" }, "params": { @@ -2520,9 +2251,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PrepareToAspirateParams": { "title": "PrepareToAspirateParams", @@ -2535,9 +2264,7 @@ "type": "string" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "PrepareToAspirateCreate": { "title": "PrepareToAspirateCreate", @@ -2547,9 +2274,7 @@ "commandType": { "title": "Commandtype", "default": "prepareToAspirate", - "enum": [ - "prepareToAspirate" - ], + "enum": ["prepareToAspirate"], "type": "string" }, "params": { @@ -2569,9 +2294,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForResumeParams": { "title": "WaitForResumeParams", @@ -2593,10 +2316,7 @@ "commandType": { "title": "Commandtype", "default": "waitForResume", - "enum": [ - "waitForResume", - "pause" - ], + "enum": ["waitForResume", "pause"], "type": "string" }, "params": { @@ -2616,9 +2336,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForDurationParams": { "title": "WaitForDurationParams", @@ -2636,9 +2354,7 @@ "type": "string" } }, - "required": [ - "seconds" - ] + "required": ["seconds"] }, "WaitForDurationCreate": { "title": "WaitForDurationCreate", @@ -2648,9 +2364,7 @@ "commandType": { "title": "Commandtype", "default": "waitForDuration", - "enum": [ - "waitForDuration" - ], + "enum": ["waitForDuration"], "type": "string" }, "params": { @@ -2670,9 +2384,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PickUpTipParams": { "title": "PickUpTipParams", @@ -2704,11 +2416,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "PickUpTipCreate": { "title": "PickUpTipCreate", @@ -2718,9 +2426,7 @@ "commandType": { "title": "Commandtype", "default": "pickUpTip", - "enum": [ - "pickUpTip" - ], + "enum": ["pickUpTip"], "type": "string" }, "params": { @@ -2740,9 +2446,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SavePositionParams": { "title": "SavePositionParams", @@ -2766,9 +2470,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "SavePositionCreate": { "title": "SavePositionCreate", @@ -2778,9 +2480,7 @@ "commandType": { "title": "Commandtype", "default": "savePosition", - "enum": [ - "savePosition" - ], + "enum": ["savePosition"], "type": "string" }, "params": { @@ -2800,9 +2500,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetRailLightsParams": { "title": "SetRailLightsParams", @@ -2815,9 +2513,7 @@ "type": "boolean" } }, - "required": [ - "on" - ] + "required": ["on"] }, "SetRailLightsCreate": { "title": "SetRailLightsCreate", @@ -2827,9 +2523,7 @@ "commandType": { "title": "Commandtype", "default": "setRailLights", - "enum": [ - "setRailLights" - ], + "enum": ["setRailLights"], "type": "string" }, "params": { @@ -2849,9 +2543,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TouchTipParams": { "title": "TouchTipParams", @@ -2894,11 +2586,7 @@ "type": "number" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "TouchTipCreate": { "title": "TouchTipCreate", @@ -2908,9 +2596,7 @@ "commandType": { "title": "Commandtype", "default": "touchTip", - "enum": [ - "touchTip" - ], + "enum": ["touchTip"], "type": "string" }, "params": { @@ -2930,20 +2616,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "StatusBarAnimation": { "title": "StatusBarAnimation", "description": "Status Bar animation options.", - "enum": [ - "idle", - "confirm", - "updating", - "disco", - "off" - ] + "enum": ["idle", "confirm", "updating", "disco", "off"] }, "SetStatusBarParams": { "title": "SetStatusBarParams", @@ -2959,9 +2637,7 @@ ] } }, - "required": [ - "animation" - ] + "required": ["animation"] }, "SetStatusBarCreate": { "title": "SetStatusBarCreate", @@ -2971,9 +2647,7 @@ "commandType": { "title": "Commandtype", "default": "setStatusBar", - "enum": [ - "setStatusBar" - ], + "enum": ["setStatusBar"], "type": "string" }, "params": { @@ -2993,28 +2667,18 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TipPresenceStatus": { "title": "TipPresenceStatus", "description": "Tip presence status reported by a pipette.", - "enum": [ - "present", - "absent", - "unknown" - ], + "enum": ["present", "absent", "unknown"], "type": "string" }, "InstrumentSensorId": { "title": "InstrumentSensorId", "description": "Primary and secondary sensor ids.", - "enum": [ - "primary", - "secondary", - "both" - ], + "enum": ["primary", "secondary", "both"], "type": "string" }, "VerifyTipPresenceParams": { @@ -3044,10 +2708,7 @@ ] } }, - "required": [ - "pipetteId", - "expectedState" - ] + "required": ["pipetteId", "expectedState"] }, "VerifyTipPresenceCreate": { "title": "VerifyTipPresenceCreate", @@ -3057,9 +2718,7 @@ "commandType": { "title": "Commandtype", "default": "verifyTipPresence", - "enum": [ - "verifyTipPresence" - ], + "enum": ["verifyTipPresence"], "type": "string" }, "params": { @@ -3079,9 +2738,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "GetTipPresenceParams": { "title": "GetTipPresenceParams", @@ -3094,9 +2751,7 @@ "type": "string" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "GetTipPresenceCreate": { "title": "GetTipPresenceCreate", @@ -3106,9 +2761,7 @@ "commandType": { "title": "Commandtype", "default": "getTipPresence", - "enum": [ - "getTipPresence" - ], + "enum": ["getTipPresence"], "type": "string" }, "params": { @@ -3128,9 +2781,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LiquidProbeParams": { "title": "LiquidProbeParams", @@ -3162,11 +2813,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "LiquidProbeCreate": { "title": "LiquidProbeCreate", @@ -3176,9 +2823,7 @@ "commandType": { "title": "Commandtype", "default": "liquidProbe", - "enum": [ - "liquidProbe" - ], + "enum": ["liquidProbe"], "type": "string" }, "params": { @@ -3198,9 +2843,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TryLiquidProbeParams": { "title": "TryLiquidProbeParams", @@ -3232,11 +2875,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "TryLiquidProbeCreate": { "title": "TryLiquidProbeCreate", @@ -3246,9 +2885,7 @@ "commandType": { "title": "Commandtype", "default": "tryLiquidProbe", - "enum": [ - "tryLiquidProbe" - ], + "enum": ["tryLiquidProbe"], "type": "string" }, "params": { @@ -3268,9 +2905,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3288,9 +2923,7 @@ "type": "number" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3300,9 +2933,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/waitForTemperature", - "enum": [ - "heaterShaker/waitForTemperature" - ], + "enum": ["heaterShaker/waitForTemperature"], "type": "string" }, "params": { @@ -3322,9 +2953,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3342,10 +2971,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3355,9 +2981,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setTargetTemperature", - "enum": [ - "heaterShaker/setTargetTemperature" - ], + "enum": ["heaterShaker/setTargetTemperature"], "type": "string" }, "params": { @@ -3377,9 +3001,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateHeaterParams": { "title": "DeactivateHeaterParams", @@ -3392,9 +3014,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateHeaterCreate": { "title": "DeactivateHeaterCreate", @@ -3404,9 +3024,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateHeater", - "enum": [ - "heaterShaker/deactivateHeater" - ], + "enum": ["heaterShaker/deactivateHeater"], "type": "string" }, "params": { @@ -3426,9 +3044,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetAndWaitForShakeSpeedParams": { "title": "SetAndWaitForShakeSpeedParams", @@ -3446,10 +3062,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "rpm" - ] + "required": ["moduleId", "rpm"] }, "SetAndWaitForShakeSpeedCreate": { "title": "SetAndWaitForShakeSpeedCreate", @@ -3459,9 +3072,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setAndWaitForShakeSpeed", - "enum": [ - "heaterShaker/setAndWaitForShakeSpeed" - ], + "enum": ["heaterShaker/setAndWaitForShakeSpeed"], "type": "string" }, "params": { @@ -3481,9 +3092,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateShakerParams": { "title": "DeactivateShakerParams", @@ -3496,9 +3105,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateShakerCreate": { "title": "DeactivateShakerCreate", @@ -3508,9 +3115,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateShaker", - "enum": [ - "heaterShaker/deactivateShaker" - ], + "enum": ["heaterShaker/deactivateShaker"], "type": "string" }, "params": { @@ -3530,9 +3135,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "OpenLabwareLatchParams": { "title": "OpenLabwareLatchParams", @@ -3545,9 +3148,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "OpenLabwareLatchCreate": { "title": "OpenLabwareLatchCreate", @@ -3557,9 +3158,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/openLabwareLatch", - "enum": [ - "heaterShaker/openLabwareLatch" - ], + "enum": ["heaterShaker/openLabwareLatch"], "type": "string" }, "params": { @@ -3579,9 +3178,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CloseLabwareLatchParams": { "title": "CloseLabwareLatchParams", @@ -3594,9 +3191,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "CloseLabwareLatchCreate": { "title": "CloseLabwareLatchCreate", @@ -3606,9 +3201,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/closeLabwareLatch", - "enum": [ - "heaterShaker/closeLabwareLatch" - ], + "enum": ["heaterShaker/closeLabwareLatch"], "type": "string" }, "params": { @@ -3628,9 +3221,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DisengageParams": { "title": "DisengageParams", @@ -3643,9 +3234,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DisengageCreate": { "title": "DisengageCreate", @@ -3655,9 +3244,7 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/disengage", - "enum": [ - "magneticModule/disengage" - ], + "enum": ["magneticModule/disengage"], "type": "string" }, "params": { @@ -3677,9 +3264,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "EngageParams": { "title": "EngageParams", @@ -3697,10 +3282,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "height" - ] + "required": ["moduleId", "height"] }, "EngageCreate": { "title": "EngageCreate", @@ -3710,9 +3292,7 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/engage", - "enum": [ - "magneticModule/engage" - ], + "enum": ["magneticModule/engage"], "type": "string" }, "params": { @@ -3732,9 +3312,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3752,10 +3330,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3765,9 +3340,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/setTargetTemperature", - "enum": [ - "temperatureModule/setTargetTemperature" - ], + "enum": ["temperatureModule/setTargetTemperature"], "type": "string" }, "params": { @@ -3787,9 +3360,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3807,9 +3378,7 @@ "type": "number" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3819,9 +3388,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/waitForTemperature", - "enum": [ - "temperatureModule/waitForTemperature" - ], + "enum": ["temperatureModule/waitForTemperature"], "type": "string" }, "params": { @@ -3841,9 +3408,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateTemperatureParams": { "title": "DeactivateTemperatureParams", @@ -3856,9 +3421,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateTemperatureCreate": { "title": "DeactivateTemperatureCreate", @@ -3868,9 +3431,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/deactivate", - "enum": [ - "temperatureModule/deactivate" - ], + "enum": ["temperatureModule/deactivate"], "type": "string" }, "params": { @@ -3890,9 +3451,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetTargetBlockTemperatureParams": { "title": "SetTargetBlockTemperatureParams", @@ -3920,10 +3479,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "SetTargetBlockTemperatureCreate": { "title": "SetTargetBlockTemperatureCreate", @@ -3933,9 +3489,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetBlockTemperature", - "enum": [ - "thermocycler/setTargetBlockTemperature" - ], + "enum": ["thermocycler/setTargetBlockTemperature"], "type": "string" }, "params": { @@ -3955,9 +3509,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForBlockTemperatureParams": { "title": "WaitForBlockTemperatureParams", @@ -3970,9 +3522,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "WaitForBlockTemperatureCreate": { "title": "WaitForBlockTemperatureCreate", @@ -3982,9 +3532,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForBlockTemperature", - "enum": [ - "thermocycler/waitForBlockTemperature" - ], + "enum": ["thermocycler/waitForBlockTemperature"], "type": "string" }, "params": { @@ -4004,9 +3552,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetTargetLidTemperatureParams": { "title": "SetTargetLidTemperatureParams", @@ -4024,10 +3570,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "SetTargetLidTemperatureCreate": { "title": "SetTargetLidTemperatureCreate", @@ -4037,9 +3580,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetLidTemperature", - "enum": [ - "thermocycler/setTargetLidTemperature" - ], + "enum": ["thermocycler/setTargetLidTemperature"], "type": "string" }, "params": { @@ -4059,9 +3600,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForLidTemperatureParams": { "title": "WaitForLidTemperatureParams", @@ -4074,9 +3613,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "WaitForLidTemperatureCreate": { "title": "WaitForLidTemperatureCreate", @@ -4086,9 +3623,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForLidTemperature", - "enum": [ - "thermocycler/waitForLidTemperature" - ], + "enum": ["thermocycler/waitForLidTemperature"], "type": "string" }, "params": { @@ -4108,9 +3643,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateBlockParams": { "title": "DeactivateBlockParams", @@ -4123,9 +3656,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateBlockCreate": { "title": "DeactivateBlockCreate", @@ -4135,9 +3666,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateBlock", - "enum": [ - "thermocycler/deactivateBlock" - ], + "enum": ["thermocycler/deactivateBlock"], "type": "string" }, "params": { @@ -4157,9 +3686,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateLidParams": { "title": "DeactivateLidParams", @@ -4172,9 +3699,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateLidCreate": { "title": "DeactivateLidCreate", @@ -4184,9 +3709,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateLid", - "enum": [ - "thermocycler/deactivateLid" - ], + "enum": ["thermocycler/deactivateLid"], "type": "string" }, "params": { @@ -4206,9 +3729,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -4221,9 +3742,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -4233,9 +3752,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/openLid", - "enum": [ - "thermocycler/openLid" - ], + "enum": ["thermocycler/openLid"], "type": "string" }, "params": { @@ -4255,9 +3772,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -4270,9 +3785,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -4282,9 +3795,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/closeLid", - "enum": [ - "thermocycler/closeLid" - ], + "enum": ["thermocycler/closeLid"], "type": "string" }, "params": { @@ -4304,9 +3815,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "RunProfileStepParams": { "title": "RunProfileStepParams", @@ -4324,10 +3833,7 @@ "type": "number" } }, - "required": [ - "celsius", - "holdSeconds" - ] + "required": ["celsius", "holdSeconds"] }, "RunProfileParams": { "title": "RunProfileParams", @@ -4353,10 +3859,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "profile" - ] + "required": ["moduleId", "profile"] }, "RunProfileCreate": { "title": "RunProfileCreate", @@ -4366,9 +3869,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/runProfile", - "enum": [ - "thermocycler/runProfile" - ], + "enum": ["thermocycler/runProfile"], "type": "string" }, "params": { @@ -4388,9 +3889,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -4403,9 +3902,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -4415,9 +3912,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/closeLid", - "enum": [ - "absorbanceReader/closeLid" - ], + "enum": ["absorbanceReader/closeLid"], "type": "string" }, "params": { @@ -4437,9 +3932,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -4452,9 +3945,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -4464,9 +3955,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/openLid", - "enum": [ - "absorbanceReader/openLid" - ], + "enum": ["absorbanceReader/openLid"], "type": "string" }, "params": { @@ -4486,9 +3975,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "InitializeParams": { "title": "InitializeParams", @@ -4506,10 +3993,7 @@ "type": "integer" } }, - "required": [ - "moduleId", - "sampleWavelength" - ] + "required": ["moduleId", "sampleWavelength"] }, "InitializeCreate": { "title": "InitializeCreate", @@ -4519,9 +4003,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/initialize", - "enum": [ - "absorbanceReader/initialize" - ], + "enum": ["absorbanceReader/initialize"], "type": "string" }, "params": { @@ -4541,9 +4023,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ReadAbsorbanceParams": { "title": "ReadAbsorbanceParams", @@ -4561,10 +4041,7 @@ "type": "integer" } }, - "required": [ - "moduleId", - "sampleWavelength" - ] + "required": ["moduleId", "sampleWavelength"] }, "ReadAbsorbanceCreate": { "title": "ReadAbsorbanceCreate", @@ -4574,9 +4051,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/read", - "enum": [ - "absorbanceReader/read" - ], + "enum": ["absorbanceReader/read"], "type": "string" }, "params": { @@ -4596,17 +4071,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibrateGripperParamsJaw": { "title": "CalibrateGripperParamsJaw", "description": "An enumeration.", - "enum": [ - "front", - "rear" - ] + "enum": ["front", "rear"] }, "Vec3f": { "title": "Vec3f", @@ -4626,11 +4096,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "CalibrateGripperParams": { "title": "CalibrateGripperParams", @@ -4655,9 +4121,7 @@ ] } }, - "required": [ - "jaw" - ] + "required": ["jaw"] }, "CalibrateGripperCreate": { "title": "CalibrateGripperCreate", @@ -4667,9 +4131,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateGripper", - "enum": [ - "calibration/calibrateGripper" - ], + "enum": ["calibration/calibrateGripper"], "type": "string" }, "params": { @@ -4689,9 +4151,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibratePipetteParams": { "title": "CalibratePipetteParams", @@ -4707,9 +4167,7 @@ ] } }, - "required": [ - "mount" - ] + "required": ["mount"] }, "CalibratePipetteCreate": { "title": "CalibratePipetteCreate", @@ -4719,9 +4177,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibratePipette", - "enum": [ - "calibration/calibratePipette" - ], + "enum": ["calibration/calibratePipette"], "type": "string" }, "params": { @@ -4741,9 +4197,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibrateModuleParams": { "title": "CalibrateModuleParams", @@ -4769,11 +4223,7 @@ ] } }, - "required": [ - "moduleId", - "labwareId", - "mount" - ] + "required": ["moduleId", "labwareId", "mount"] }, "CalibrateModuleCreate": { "title": "CalibrateModuleCreate", @@ -4783,9 +4233,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateModule", - "enum": [ - "calibration/calibrateModule" - ], + "enum": ["calibration/calibrateModule"], "type": "string" }, "params": { @@ -4805,17 +4253,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MaintenancePosition": { "title": "MaintenancePosition", "description": "Maintenance position options.", - "enum": [ - "attachPlate", - "attachInstrument" - ] + "enum": ["attachPlate", "attachInstrument"] }, "MoveToMaintenancePositionParams": { "title": "MoveToMaintenancePositionParams", @@ -4840,9 +4283,7 @@ ] } }, - "required": [ - "mount" - ] + "required": ["mount"] }, "MoveToMaintenancePositionCreate": { "title": "MoveToMaintenancePositionCreate", @@ -4852,9 +4293,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/moveToMaintenancePosition", - "enum": [ - "calibration/moveToMaintenancePosition" - ], + "enum": ["calibration/moveToMaintenancePosition"], "type": "string" }, "params": { @@ -4874,9 +4313,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] } }, "$id": "opentronsCommandSchemaV8", From 9639e28ef313ca8bc3bafcea5701597981a62698 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Fri, 9 Aug 2024 10:30:42 -0400 Subject: [PATCH 24/26] command schema v9 fix --- shared-data/command/schemas/9.json | 1178 ++++++++++++++++++++++------ 1 file changed, 927 insertions(+), 251 deletions(-) diff --git a/shared-data/command/schemas/9.json b/shared-data/command/schemas/9.json index 1cb30c99d69..3783fde24d2 100644 --- a/shared-data/command/schemas/9.json +++ b/shared-data/command/schemas/9.json @@ -60,11 +60,13 @@ "thermocycler/waitForLidTemperature": "#/definitions/WaitForLidTemperatureCreate", "thermocycler/deactivateBlock": "#/definitions/DeactivateBlockCreate", "thermocycler/deactivateLid": "#/definitions/DeactivateLidCreate", - "thermocycler/openLid": "#/definitions/OpenLidCreate", - "thermocycler/closeLid": "#/definitions/CloseLidCreate", + "thermocycler/openLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate", + "thermocycler/closeLid": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate", "thermocycler/runProfile": "#/definitions/RunProfileCreate", + "absorbanceReader/closeLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate", + "absorbanceReader/openLid": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate", "absorbanceReader/initialize": "#/definitions/InitializeCreate", - "absorbanceReader/measure": "#/definitions/MeasureAbsorbanceCreate", + "absorbanceReader/read": "#/definitions/ReadAbsorbanceCreate", "calibration/calibrateGripper": "#/definitions/CalibrateGripperCreate", "calibration/calibratePipette": "#/definitions/CalibratePipetteCreate", "calibration/calibrateModule": "#/definitions/CalibrateModuleCreate", @@ -241,19 +243,25 @@ "$ref": "#/definitions/DeactivateLidCreate" }, { - "$ref": "#/definitions/OpenLidCreate" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate" }, { - "$ref": "#/definitions/CloseLidCreate" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate" }, { "$ref": "#/definitions/RunProfileCreate" }, + { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate" + }, + { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate" + }, { "$ref": "#/definitions/InitializeCreate" }, { - "$ref": "#/definitions/MeasureAbsorbanceCreate" + "$ref": "#/definitions/ReadAbsorbanceCreate" }, { "$ref": "#/definitions/CalibrateGripperCreate" @@ -281,7 +289,11 @@ "WellOrigin": { "title": "WellOrigin", "description": "Origin of WellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well", - "enum": ["top", "bottom", "center"], + "enum": [ + "top", + "bottom", + "center" + ], "type": "string" }, "WellOffset": { @@ -366,12 +378,22 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "volume", + "pipetteId" + ] }, "CommandIntent": { "title": "CommandIntent", "description": "Run intent for a given command.\n\nProps:\n PROTOCOL: the command is part of the protocol run itself.\n SETUP: the command is part of the setup phase of a run.", - "enum": ["protocol", "setup", "fixit"], + "enum": [ + "protocol", + "setup", + "fixit" + ], "type": "string" }, "AspirateCreate": { @@ -382,7 +404,9 @@ "commandType": { "title": "Commandtype", "default": "aspirate", - "enum": ["aspirate"], + "enum": [ + "aspirate" + ], "type": "string" }, "params": { @@ -402,7 +426,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AspirateInPlaceParams": { "title": "AspirateInPlaceParams", @@ -427,7 +453,11 @@ "type": "string" } }, - "required": ["flowRate", "volume", "pipetteId"] + "required": [ + "flowRate", + "volume", + "pipetteId" + ] }, "AspirateInPlaceCreate": { "title": "AspirateInPlaceCreate", @@ -437,7 +467,9 @@ "commandType": { "title": "Commandtype", "default": "aspirateInPlace", - "enum": ["aspirateInPlace"], + "enum": [ + "aspirateInPlace" + ], "type": "string" }, "params": { @@ -457,7 +489,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CommentParams": { "title": "CommentParams", @@ -470,7 +504,9 @@ "type": "string" } }, - "required": ["message"] + "required": [ + "message" + ] }, "CommentCreate": { "title": "CommentCreate", @@ -480,7 +516,9 @@ "commandType": { "title": "Commandtype", "default": "comment", - "enum": ["comment"], + "enum": [ + "comment" + ], "type": "string" }, "params": { @@ -500,7 +538,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ConfigureForVolumeParams": { "title": "ConfigureForVolumeParams", @@ -524,7 +564,10 @@ "type": "string" } }, - "required": ["pipetteId", "volume"] + "required": [ + "pipetteId", + "volume" + ] }, "ConfigureForVolumeCreate": { "title": "ConfigureForVolumeCreate", @@ -534,7 +577,9 @@ "commandType": { "title": "Commandtype", "default": "configureForVolume", - "enum": ["configureForVolume"], + "enum": [ + "configureForVolume" + ], "type": "string" }, "params": { @@ -554,7 +599,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AllNozzleLayoutConfiguration": { "title": "AllNozzleLayoutConfiguration", @@ -564,7 +611,9 @@ "style": { "title": "Style", "default": "ALL", - "enum": ["ALL"], + "enum": [ + "ALL" + ], "type": "string" } } @@ -577,17 +626,26 @@ "style": { "title": "Style", "default": "SINGLE", - "enum": ["SINGLE"], + "enum": [ + "SINGLE" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "RowNozzleLayoutConfiguration": { "title": "RowNozzleLayoutConfiguration", @@ -597,17 +655,26 @@ "style": { "title": "Style", "default": "ROW", - "enum": ["ROW"], + "enum": [ + "ROW" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "ColumnNozzleLayoutConfiguration": { "title": "ColumnNozzleLayoutConfiguration", @@ -617,17 +684,26 @@ "style": { "title": "Style", "default": "COLUMN", - "enum": ["COLUMN"], + "enum": [ + "COLUMN" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" } }, - "required": ["primaryNozzle"] + "required": [ + "primaryNozzle" + ] }, "QuadrantNozzleLayoutConfiguration": { "title": "QuadrantNozzleLayoutConfiguration", @@ -637,13 +713,20 @@ "style": { "title": "Style", "default": "QUADRANT", - "enum": ["QUADRANT"], + "enum": [ + "QUADRANT" + ], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": ["A1", "H1", "A12", "H12"], + "enum": [ + "A1", + "H1", + "A12", + "H12" + ], "type": "string" }, "frontRightNozzle": { @@ -659,7 +742,11 @@ "type": "string" } }, - "required": ["primaryNozzle", "frontRightNozzle", "backLeftNozzle"] + "required": [ + "primaryNozzle", + "frontRightNozzle", + "backLeftNozzle" + ] }, "ConfigureNozzleLayoutParams": { "title": "ConfigureNozzleLayoutParams", @@ -692,7 +779,10 @@ ] } }, - "required": ["pipetteId", "configurationParams"] + "required": [ + "pipetteId", + "configurationParams" + ] }, "ConfigureNozzleLayoutCreate": { "title": "ConfigureNozzleLayoutCreate", @@ -702,7 +792,9 @@ "commandType": { "title": "Commandtype", "default": "configureNozzleLayout", - "enum": ["configureNozzleLayout"], + "enum": [ + "configureNozzleLayout" + ], "type": "string" }, "params": { @@ -722,7 +814,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CustomParams": { "title": "CustomParams", @@ -738,7 +832,9 @@ "commandType": { "title": "Commandtype", "default": "custom", - "enum": ["custom"], + "enum": [ + "custom" + ], "type": "string" }, "params": { @@ -758,7 +854,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DispenseParams": { "title": "DispenseParams", @@ -807,7 +905,13 @@ "type": "number" } }, - "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "volume", + "pipetteId" + ] }, "DispenseCreate": { "title": "DispenseCreate", @@ -817,7 +921,9 @@ "commandType": { "title": "Commandtype", "default": "dispense", - "enum": ["dispense"], + "enum": [ + "dispense" + ], "type": "string" }, "params": { @@ -837,7 +943,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DispenseInPlaceParams": { "title": "DispenseInPlaceParams", @@ -867,7 +975,11 @@ "type": "number" } }, - "required": ["flowRate", "volume", "pipetteId"] + "required": [ + "flowRate", + "volume", + "pipetteId" + ] }, "DispenseInPlaceCreate": { "title": "DispenseInPlaceCreate", @@ -877,7 +989,9 @@ "commandType": { "title": "Commandtype", "default": "dispenseInPlace", - "enum": ["dispenseInPlace"], + "enum": [ + "dispenseInPlace" + ], "type": "string" }, "params": { @@ -897,7 +1011,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "BlowOutParams": { "title": "BlowOutParams", @@ -935,7 +1051,12 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "flowRate", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "flowRate", + "pipetteId" + ] }, "BlowOutCreate": { "title": "BlowOutCreate", @@ -945,7 +1066,9 @@ "commandType": { "title": "Commandtype", "default": "blowout", - "enum": ["blowout"], + "enum": [ + "blowout" + ], "type": "string" }, "params": { @@ -965,7 +1088,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "BlowOutInPlaceParams": { "title": "BlowOutInPlaceParams", @@ -984,7 +1109,10 @@ "type": "string" } }, - "required": ["flowRate", "pipetteId"] + "required": [ + "flowRate", + "pipetteId" + ] }, "BlowOutInPlaceCreate": { "title": "BlowOutInPlaceCreate", @@ -994,7 +1122,9 @@ "commandType": { "title": "Commandtype", "default": "blowOutInPlace", - "enum": ["blowOutInPlace"], + "enum": [ + "blowOutInPlace" + ], "type": "string" }, "params": { @@ -1014,12 +1144,19 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DropTipWellOrigin": { "title": "DropTipWellOrigin", "description": "The origin of a DropTipWellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well\n DEFAULT: the default drop-tip location of the well,\n based on pipette configuration and length of the tip.", - "enum": ["top", "bottom", "center", "default"], + "enum": [ + "top", + "bottom", + "center", + "default" + ], "type": "string" }, "DropTipWellLocation": { @@ -1081,7 +1218,11 @@ "type": "boolean" } }, - "required": ["pipetteId", "labwareId", "wellName"] + "required": [ + "pipetteId", + "labwareId", + "wellName" + ] }, "DropTipCreate": { "title": "DropTipCreate", @@ -1091,7 +1232,9 @@ "commandType": { "title": "Commandtype", "default": "dropTip", - "enum": ["dropTip"], + "enum": [ + "dropTip" + ], "type": "string" }, "params": { @@ -1111,7 +1254,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DropTipInPlaceParams": { "title": "DropTipInPlaceParams", @@ -1129,7 +1274,9 @@ "type": "boolean" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "DropTipInPlaceCreate": { "title": "DropTipInPlaceCreate", @@ -1139,7 +1286,9 @@ "commandType": { "title": "Commandtype", "default": "dropTipInPlace", - "enum": ["dropTipInPlace"], + "enum": [ + "dropTipInPlace" + ], "type": "string" }, "params": { @@ -1159,7 +1308,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MotorAxis": { "title": "MotorAxis", @@ -1179,7 +1330,11 @@ "MountType": { "title": "MountType", "description": "An enumeration.", - "enum": ["left", "right", "extension"], + "enum": [ + "left", + "right", + "extension" + ], "type": "string" }, "HomeParams": { @@ -1212,7 +1367,9 @@ "commandType": { "title": "Commandtype", "default": "home", - "enum": ["home"], + "enum": [ + "home" + ], "type": "string" }, "params": { @@ -1232,7 +1389,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "RetractAxisParams": { "title": "RetractAxisParams", @@ -1248,7 +1407,9 @@ ] } }, - "required": ["axis"] + "required": [ + "axis" + ] }, "RetractAxisCreate": { "title": "RetractAxisCreate", @@ -1258,7 +1419,9 @@ "commandType": { "title": "Commandtype", "default": "retractAxis", - "enum": ["retractAxis"], + "enum": [ + "retractAxis" + ], "type": "string" }, "params": { @@ -1278,7 +1441,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeckSlotName": { "title": "DeckSlotName", @@ -1324,7 +1489,9 @@ ] } }, - "required": ["slotName"] + "required": [ + "slotName" + ] }, "ModuleLocation": { "title": "ModuleLocation", @@ -1337,7 +1504,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "OnLabwareLocation": { "title": "OnLabwareLocation", @@ -1350,7 +1519,9 @@ "type": "string" } }, - "required": ["labwareId"] + "required": [ + "labwareId" + ] }, "AddressableAreaLocation": { "title": "AddressableAreaLocation", @@ -1363,7 +1534,9 @@ "type": "string" } }, - "required": ["addressableAreaName"] + "required": [ + "addressableAreaName" + ] }, "LoadLabwareParams": { "title": "LoadLabwareParams", @@ -1384,7 +1557,9 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": ["offDeck"], + "enum": [ + "offDeck" + ], "type": "string" }, { @@ -1418,7 +1593,12 @@ "type": "string" } }, - "required": ["location", "loadName", "namespace", "version"] + "required": [ + "location", + "loadName", + "namespace", + "version" + ] }, "LoadLabwareCreate": { "title": "LoadLabwareCreate", @@ -1428,7 +1608,9 @@ "commandType": { "title": "Commandtype", "default": "loadLabware", - "enum": ["loadLabware"], + "enum": [ + "loadLabware" + ], "type": "string" }, "params": { @@ -1448,7 +1630,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ReloadLabwareParams": { "title": "ReloadLabwareParams", @@ -1461,7 +1645,9 @@ "type": "string" } }, - "required": ["labwareId"] + "required": [ + "labwareId" + ] }, "ReloadLabwareCreate": { "title": "ReloadLabwareCreate", @@ -1471,7 +1657,9 @@ "commandType": { "title": "Commandtype", "default": "reloadLabware", - "enum": ["reloadLabware"], + "enum": [ + "reloadLabware" + ], "type": "string" }, "params": { @@ -1491,7 +1679,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LoadLiquidParams": { "title": "LoadLiquidParams", @@ -1517,7 +1707,11 @@ } } }, - "required": ["liquidId", "labwareId", "volumeByWell"] + "required": [ + "liquidId", + "labwareId", + "volumeByWell" + ] }, "LoadLiquidCreate": { "title": "LoadLiquidCreate", @@ -1527,7 +1721,9 @@ "commandType": { "title": "Commandtype", "default": "loadLiquid", - "enum": ["loadLiquid"], + "enum": [ + "loadLiquid" + ], "type": "string" }, "params": { @@ -1547,7 +1743,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "ModuleModel": { "title": "ModuleModel", @@ -1593,7 +1791,10 @@ "type": "string" } }, - "required": ["model", "location"] + "required": [ + "model", + "location" + ] }, "LoadModuleCreate": { "title": "LoadModuleCreate", @@ -1603,7 +1804,9 @@ "commandType": { "title": "Commandtype", "default": "loadModule", - "enum": ["loadModule"], + "enum": [ + "loadModule" + ], "type": "string" }, "params": { @@ -1623,7 +1826,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PipetteNameType": { "title": "PipetteNameType", @@ -1686,7 +1891,10 @@ "type": "boolean" } }, - "required": ["pipetteName", "mount"] + "required": [ + "pipetteName", + "mount" + ] }, "LoadPipetteCreate": { "title": "LoadPipetteCreate", @@ -1696,7 +1904,9 @@ "commandType": { "title": "Commandtype", "default": "loadPipette", - "enum": ["loadPipette"], + "enum": [ + "loadPipette" + ], "type": "string" }, "params": { @@ -1716,12 +1926,18 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LabwareMovementStrategy": { "title": "LabwareMovementStrategy", "description": "Strategy to use for labware movement.", - "enum": ["usingGripper", "manualMoveWithPause", "manualMoveWithoutPause"], + "enum": [ + "usingGripper", + "manualMoveWithPause", + "manualMoveWithoutPause" + ], "type": "string" }, "LabwareOffsetVector": { @@ -1742,7 +1958,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveLabwareParams": { "title": "MoveLabwareParams", @@ -1768,7 +1988,9 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": ["offDeck"], + "enum": [ + "offDeck" + ], "type": "string" }, { @@ -1803,7 +2025,11 @@ ] } }, - "required": ["labwareId", "newLocation", "strategy"] + "required": [ + "labwareId", + "newLocation", + "strategy" + ] }, "MoveLabwareCreate": { "title": "MoveLabwareCreate", @@ -1813,7 +2039,9 @@ "commandType": { "title": "Commandtype", "default": "moveLabware", - "enum": ["moveLabware"], + "enum": [ + "moveLabware" + ], "type": "string" }, "params": { @@ -1833,12 +2061,18 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MovementAxis": { "title": "MovementAxis", "description": "Axis on which to issue a relative movement.", - "enum": ["x", "y", "z"], + "enum": [ + "x", + "y", + "z" + ], "type": "string" }, "MoveRelativeParams": { @@ -1865,7 +2099,11 @@ "type": "number" } }, - "required": ["pipetteId", "axis", "distance"] + "required": [ + "pipetteId", + "axis", + "distance" + ] }, "MoveRelativeCreate": { "title": "MoveRelativeCreate", @@ -1875,7 +2113,9 @@ "commandType": { "title": "Commandtype", "default": "moveRelative", - "enum": ["moveRelative"], + "enum": [ + "moveRelative" + ], "type": "string" }, "params": { @@ -1895,7 +2135,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeckPoint": { "title": "DeckPoint", @@ -1915,7 +2157,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveToCoordinatesParams": { "title": "MoveToCoordinatesParams", @@ -1953,7 +2199,10 @@ ] } }, - "required": ["pipetteId", "coordinates"] + "required": [ + "pipetteId", + "coordinates" + ] }, "MoveToCoordinatesCreate": { "title": "MoveToCoordinatesCreate", @@ -1963,7 +2212,9 @@ "commandType": { "title": "Commandtype", "default": "moveToCoordinates", - "enum": ["moveToCoordinates"], + "enum": [ + "moveToCoordinates" + ], "type": "string" }, "params": { @@ -1983,7 +2234,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MoveToWellParams": { "title": "MoveToWellParams", @@ -2031,7 +2284,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "MoveToWellCreate": { "title": "MoveToWellCreate", @@ -2041,7 +2298,9 @@ "commandType": { "title": "Commandtype", "default": "moveToWell", - "enum": ["moveToWell"], + "enum": [ + "moveToWell" + ], "type": "string" }, "params": { @@ -2061,7 +2320,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "AddressableOffsetVector": { "title": "AddressableOffsetVector", @@ -2081,7 +2342,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "MoveToAddressableAreaParams": { "title": "MoveToAddressableAreaParams", @@ -2135,7 +2400,10 @@ "type": "boolean" } }, - "required": ["pipetteId", "addressableAreaName"] + "required": [ + "pipetteId", + "addressableAreaName" + ] }, "MoveToAddressableAreaCreate": { "title": "MoveToAddressableAreaCreate", @@ -2145,7 +2413,9 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableArea", - "enum": ["moveToAddressableArea"], + "enum": [ + "moveToAddressableArea" + ], "type": "string" }, "params": { @@ -2165,7 +2435,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MoveToAddressableAreaForDropTipParams": { "title": "MoveToAddressableAreaForDropTipParams", @@ -2225,7 +2497,10 @@ "type": "boolean" } }, - "required": ["pipetteId", "addressableAreaName"] + "required": [ + "pipetteId", + "addressableAreaName" + ] }, "MoveToAddressableAreaForDropTipCreate": { "title": "MoveToAddressableAreaForDropTipCreate", @@ -2235,7 +2510,9 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableAreaForDropTip", - "enum": ["moveToAddressableAreaForDropTip"], + "enum": [ + "moveToAddressableAreaForDropTip" + ], "type": "string" }, "params": { @@ -2255,7 +2532,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PrepareToAspirateParams": { "title": "PrepareToAspirateParams", @@ -2268,7 +2547,9 @@ "type": "string" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "PrepareToAspirateCreate": { "title": "PrepareToAspirateCreate", @@ -2278,7 +2559,9 @@ "commandType": { "title": "Commandtype", "default": "prepareToAspirate", - "enum": ["prepareToAspirate"], + "enum": [ + "prepareToAspirate" + ], "type": "string" }, "params": { @@ -2298,7 +2581,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForResumeParams": { "title": "WaitForResumeParams", @@ -2320,7 +2605,10 @@ "commandType": { "title": "Commandtype", "default": "waitForResume", - "enum": ["waitForResume", "pause"], + "enum": [ + "waitForResume", + "pause" + ], "type": "string" }, "params": { @@ -2340,7 +2628,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForDurationParams": { "title": "WaitForDurationParams", @@ -2358,7 +2648,9 @@ "type": "string" } }, - "required": ["seconds"] + "required": [ + "seconds" + ] }, "WaitForDurationCreate": { "title": "WaitForDurationCreate", @@ -2368,7 +2660,9 @@ "commandType": { "title": "Commandtype", "default": "waitForDuration", - "enum": ["waitForDuration"], + "enum": [ + "waitForDuration" + ], "type": "string" }, "params": { @@ -2388,7 +2682,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "PickUpTipParams": { "title": "PickUpTipParams", @@ -2420,7 +2716,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "PickUpTipCreate": { "title": "PickUpTipCreate", @@ -2430,7 +2730,9 @@ "commandType": { "title": "Commandtype", "default": "pickUpTip", - "enum": ["pickUpTip"], + "enum": [ + "pickUpTip" + ], "type": "string" }, "params": { @@ -2450,7 +2752,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SavePositionParams": { "title": "SavePositionParams", @@ -2474,7 +2778,9 @@ "type": "boolean" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "SavePositionCreate": { "title": "SavePositionCreate", @@ -2484,7 +2790,9 @@ "commandType": { "title": "Commandtype", "default": "savePosition", - "enum": ["savePosition"], + "enum": [ + "savePosition" + ], "type": "string" }, "params": { @@ -2504,7 +2812,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetRailLightsParams": { "title": "SetRailLightsParams", @@ -2517,7 +2827,9 @@ "type": "boolean" } }, - "required": ["on"] + "required": [ + "on" + ] }, "SetRailLightsCreate": { "title": "SetRailLightsCreate", @@ -2527,7 +2839,9 @@ "commandType": { "title": "Commandtype", "default": "setRailLights", - "enum": ["setRailLights"], + "enum": [ + "setRailLights" + ], "type": "string" }, "params": { @@ -2547,7 +2861,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TouchTipParams": { "title": "TouchTipParams", @@ -2590,7 +2906,11 @@ "type": "number" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "TouchTipCreate": { "title": "TouchTipCreate", @@ -2600,7 +2920,9 @@ "commandType": { "title": "Commandtype", "default": "touchTip", - "enum": ["touchTip"], + "enum": [ + "touchTip" + ], "type": "string" }, "params": { @@ -2620,12 +2942,20 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "StatusBarAnimation": { "title": "StatusBarAnimation", "description": "Status Bar animation options.", - "enum": ["idle", "confirm", "updating", "disco", "off"] + "enum": [ + "idle", + "confirm", + "updating", + "disco", + "off" + ] }, "SetStatusBarParams": { "title": "SetStatusBarParams", @@ -2641,7 +2971,9 @@ ] } }, - "required": ["animation"] + "required": [ + "animation" + ] }, "SetStatusBarCreate": { "title": "SetStatusBarCreate", @@ -2651,7 +2983,9 @@ "commandType": { "title": "Commandtype", "default": "setStatusBar", - "enum": ["setStatusBar"], + "enum": [ + "setStatusBar" + ], "type": "string" }, "params": { @@ -2671,18 +3005,28 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TipPresenceStatus": { "title": "TipPresenceStatus", "description": "Tip presence status reported by a pipette.", - "enum": ["present", "absent", "unknown"], + "enum": [ + "present", + "absent", + "unknown" + ], "type": "string" }, "InstrumentSensorId": { "title": "InstrumentSensorId", "description": "Primary and secondary sensor ids.", - "enum": ["primary", "secondary", "both"], + "enum": [ + "primary", + "secondary", + "both" + ], "type": "string" }, "VerifyTipPresenceParams": { @@ -2712,7 +3056,10 @@ ] } }, - "required": ["pipetteId", "expectedState"] + "required": [ + "pipetteId", + "expectedState" + ] }, "VerifyTipPresenceCreate": { "title": "VerifyTipPresenceCreate", @@ -2722,7 +3069,9 @@ "commandType": { "title": "Commandtype", "default": "verifyTipPresence", - "enum": ["verifyTipPresence"], + "enum": [ + "verifyTipPresence" + ], "type": "string" }, "params": { @@ -2742,7 +3091,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "GetTipPresenceParams": { "title": "GetTipPresenceParams", @@ -2755,7 +3106,9 @@ "type": "string" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "GetTipPresenceCreate": { "title": "GetTipPresenceCreate", @@ -2765,7 +3118,9 @@ "commandType": { "title": "Commandtype", "default": "getTipPresence", - "enum": ["getTipPresence"], + "enum": [ + "getTipPresence" + ], "type": "string" }, "params": { @@ -2785,7 +3140,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "LiquidProbeParams": { "title": "LiquidProbeParams", @@ -2817,7 +3174,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "LiquidProbeCreate": { "title": "LiquidProbeCreate", @@ -2827,7 +3188,9 @@ "commandType": { "title": "Commandtype", "default": "liquidProbe", - "enum": ["liquidProbe"], + "enum": [ + "liquidProbe" + ], "type": "string" }, "params": { @@ -2847,7 +3210,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "TryLiquidProbeParams": { "title": "TryLiquidProbeParams", @@ -2879,7 +3244,11 @@ "type": "string" } }, - "required": ["labwareId", "wellName", "pipetteId"] + "required": [ + "labwareId", + "wellName", + "pipetteId" + ] }, "TryLiquidProbeCreate": { "title": "TryLiquidProbeCreate", @@ -2889,7 +3258,9 @@ "commandType": { "title": "Commandtype", "default": "tryLiquidProbe", - "enum": ["tryLiquidProbe"], + "enum": [ + "tryLiquidProbe" + ], "type": "string" }, "params": { @@ -2909,7 +3280,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -2927,7 +3300,9 @@ "type": "number" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -2937,7 +3312,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/waitForTemperature", - "enum": ["heaterShaker/waitForTemperature"], + "enum": [ + "heaterShaker/waitForTemperature" + ], "type": "string" }, "params": { @@ -2957,7 +3334,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -2975,7 +3354,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -2985,7 +3367,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setTargetTemperature", - "enum": ["heaterShaker/setTargetTemperature"], + "enum": [ + "heaterShaker/setTargetTemperature" + ], "type": "string" }, "params": { @@ -3005,7 +3389,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateHeaterParams": { "title": "DeactivateHeaterParams", @@ -3018,7 +3404,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateHeaterCreate": { "title": "DeactivateHeaterCreate", @@ -3028,7 +3416,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateHeater", - "enum": ["heaterShaker/deactivateHeater"], + "enum": [ + "heaterShaker/deactivateHeater" + ], "type": "string" }, "params": { @@ -3048,7 +3438,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetAndWaitForShakeSpeedParams": { "title": "SetAndWaitForShakeSpeedParams", @@ -3066,7 +3458,10 @@ "type": "number" } }, - "required": ["moduleId", "rpm"] + "required": [ + "moduleId", + "rpm" + ] }, "SetAndWaitForShakeSpeedCreate": { "title": "SetAndWaitForShakeSpeedCreate", @@ -3076,7 +3471,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setAndWaitForShakeSpeed", - "enum": ["heaterShaker/setAndWaitForShakeSpeed"], + "enum": [ + "heaterShaker/setAndWaitForShakeSpeed" + ], "type": "string" }, "params": { @@ -3096,7 +3493,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateShakerParams": { "title": "DeactivateShakerParams", @@ -3109,7 +3508,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateShakerCreate": { "title": "DeactivateShakerCreate", @@ -3119,7 +3520,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateShaker", - "enum": ["heaterShaker/deactivateShaker"], + "enum": [ + "heaterShaker/deactivateShaker" + ], "type": "string" }, "params": { @@ -3139,7 +3542,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "OpenLabwareLatchParams": { "title": "OpenLabwareLatchParams", @@ -3152,7 +3557,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "OpenLabwareLatchCreate": { "title": "OpenLabwareLatchCreate", @@ -3162,7 +3569,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/openLabwareLatch", - "enum": ["heaterShaker/openLabwareLatch"], + "enum": [ + "heaterShaker/openLabwareLatch" + ], "type": "string" }, "params": { @@ -3182,7 +3591,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CloseLabwareLatchParams": { "title": "CloseLabwareLatchParams", @@ -3195,7 +3606,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "CloseLabwareLatchCreate": { "title": "CloseLabwareLatchCreate", @@ -3205,7 +3618,9 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/closeLabwareLatch", - "enum": ["heaterShaker/closeLabwareLatch"], + "enum": [ + "heaterShaker/closeLabwareLatch" + ], "type": "string" }, "params": { @@ -3225,7 +3640,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DisengageParams": { "title": "DisengageParams", @@ -3238,7 +3655,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DisengageCreate": { "title": "DisengageCreate", @@ -3248,7 +3667,9 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/disengage", - "enum": ["magneticModule/disengage"], + "enum": [ + "magneticModule/disengage" + ], "type": "string" }, "params": { @@ -3268,7 +3689,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "EngageParams": { "title": "EngageParams", @@ -3286,7 +3709,10 @@ "type": "number" } }, - "required": ["moduleId", "height"] + "required": [ + "moduleId", + "height" + ] }, "EngageCreate": { "title": "EngageCreate", @@ -3296,7 +3722,9 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/engage", - "enum": ["magneticModule/engage"], + "enum": [ + "magneticModule/engage" + ], "type": "string" }, "params": { @@ -3316,7 +3744,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3334,7 +3764,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3344,7 +3777,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/setTargetTemperature", - "enum": ["temperatureModule/setTargetTemperature"], + "enum": [ + "temperatureModule/setTargetTemperature" + ], "type": "string" }, "params": { @@ -3364,7 +3799,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3382,7 +3819,9 @@ "type": "number" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3392,7 +3831,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/waitForTemperature", - "enum": ["temperatureModule/waitForTemperature"], + "enum": [ + "temperatureModule/waitForTemperature" + ], "type": "string" }, "params": { @@ -3412,7 +3853,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateTemperatureParams": { "title": "DeactivateTemperatureParams", @@ -3425,7 +3868,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateTemperatureCreate": { "title": "DeactivateTemperatureCreate", @@ -3435,7 +3880,9 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/deactivate", - "enum": ["temperatureModule/deactivate"], + "enum": [ + "temperatureModule/deactivate" + ], "type": "string" }, "params": { @@ -3455,7 +3902,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetTargetBlockTemperatureParams": { "title": "SetTargetBlockTemperatureParams", @@ -3483,7 +3932,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "SetTargetBlockTemperatureCreate": { "title": "SetTargetBlockTemperatureCreate", @@ -3493,7 +3945,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetBlockTemperature", - "enum": ["thermocycler/setTargetBlockTemperature"], + "enum": [ + "thermocycler/setTargetBlockTemperature" + ], "type": "string" }, "params": { @@ -3513,7 +3967,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForBlockTemperatureParams": { "title": "WaitForBlockTemperatureParams", @@ -3526,7 +3982,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "WaitForBlockTemperatureCreate": { "title": "WaitForBlockTemperatureCreate", @@ -3536,7 +3994,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForBlockTemperature", - "enum": ["thermocycler/waitForBlockTemperature"], + "enum": [ + "thermocycler/waitForBlockTemperature" + ], "type": "string" }, "params": { @@ -3556,7 +4016,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "SetTargetLidTemperatureParams": { "title": "SetTargetLidTemperatureParams", @@ -3574,7 +4036,10 @@ "type": "number" } }, - "required": ["moduleId", "celsius"] + "required": [ + "moduleId", + "celsius" + ] }, "SetTargetLidTemperatureCreate": { "title": "SetTargetLidTemperatureCreate", @@ -3584,7 +4049,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetLidTemperature", - "enum": ["thermocycler/setTargetLidTemperature"], + "enum": [ + "thermocycler/setTargetLidTemperature" + ], "type": "string" }, "params": { @@ -3604,7 +4071,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "WaitForLidTemperatureParams": { "title": "WaitForLidTemperatureParams", @@ -3617,7 +4086,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "WaitForLidTemperatureCreate": { "title": "WaitForLidTemperatureCreate", @@ -3627,7 +4098,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForLidTemperature", - "enum": ["thermocycler/waitForLidTemperature"], + "enum": [ + "thermocycler/waitForLidTemperature" + ], "type": "string" }, "params": { @@ -3647,7 +4120,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateBlockParams": { "title": "DeactivateBlockParams", @@ -3660,7 +4135,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateBlockCreate": { "title": "DeactivateBlockCreate", @@ -3670,7 +4147,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateBlock", - "enum": ["thermocycler/deactivateBlock"], + "enum": [ + "thermocycler/deactivateBlock" + ], "type": "string" }, "params": { @@ -3690,7 +4169,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "DeactivateLidParams": { "title": "DeactivateLidParams", @@ -3703,7 +4184,9 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, "DeactivateLidCreate": { "title": "DeactivateLidCreate", @@ -3713,7 +4196,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateLid", - "enum": ["thermocycler/deactivateLid"], + "enum": [ + "thermocycler/deactivateLid" + ], "type": "string" }, "params": { @@ -3733,9 +4218,11 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, - "OpenLidParams": { + "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams": { "title": "OpenLidParams", "description": "Input parameters to open a Thermocycler's lid.", "type": "object", @@ -3746,9 +4233,11 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, - "OpenLidCreate": { + "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate": { "title": "OpenLidCreate", "description": "A request to open a Thermocycler's lid.", "type": "object", @@ -3756,11 +4245,13 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/openLid", - "enum": ["thermocycler/openLid"], + "enum": [ + "thermocycler/openLid" + ], "type": "string" }, "params": { - "$ref": "#/definitions/OpenLidParams" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", @@ -3776,9 +4267,11 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, - "CloseLidParams": { + "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams": { "title": "CloseLidParams", "description": "Input parameters to close a Thermocycler's lid.", "type": "object", @@ -3789,9 +4282,11 @@ "type": "string" } }, - "required": ["moduleId"] + "required": [ + "moduleId" + ] }, - "CloseLidCreate": { + "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate": { "title": "CloseLidCreate", "description": "A request to close a Thermocycler's lid.", "type": "object", @@ -3799,11 +4294,13 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/closeLid", - "enum": ["thermocycler/closeLid"], + "enum": [ + "thermocycler/closeLid" + ], "type": "string" }, "params": { - "$ref": "#/definitions/CloseLidParams" + "$ref": "#/definitions/opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", @@ -3819,7 +4316,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "RunProfileStepParams": { "title": "RunProfileStepParams", @@ -3837,7 +4336,10 @@ "type": "number" } }, - "required": ["celsius", "holdSeconds"] + "required": [ + "celsius", + "holdSeconds" + ] }, "RunProfileParams": { "title": "RunProfileParams", @@ -3863,7 +4365,10 @@ "type": "number" } }, - "required": ["moduleId", "profile"] + "required": [ + "moduleId", + "profile" + ] }, "RunProfileCreate": { "title": "RunProfileCreate", @@ -3873,7 +4378,9 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/runProfile", - "enum": ["thermocycler/runProfile"], + "enum": [ + "thermocycler/runProfile" + ], "type": "string" }, "params": { @@ -3893,7 +4400,107 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] + }, + "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams": { + "title": "CloseLidParams", + "description": "Input parameters to close the lid on an absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the absorbance reader.", + "type": "string" + } + }, + "required": [ + "moduleId" + ] + }, + "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate": { + "title": "CloseLidCreate", + "description": "A request to execute an Absorbance Reader close lid command.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/closeLid", + "enum": [ + "absorbanceReader/closeLid" + ], + "type": "string" + }, + "params": { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": [ + "params" + ] + }, + "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams": { + "title": "OpenLidParams", + "description": "Input parameters to open the lid on an absorbance reading.", + "type": "object", + "properties": { + "moduleId": { + "title": "Moduleid", + "description": "Unique ID of the absorbance reader.", + "type": "string" + } + }, + "required": [ + "moduleId" + ] + }, + "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate": { + "title": "OpenLidCreate", + "description": "A request to execute an Absorbance Reader open lid command.", + "type": "object", + "properties": { + "commandType": { + "title": "Commandtype", + "default": "absorbanceReader/openLid", + "enum": [ + "absorbanceReader/openLid" + ], + "type": "string" + }, + "params": { + "$ref": "#/definitions/opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams" + }, + "intent": { + "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", + "allOf": [ + { + "$ref": "#/definitions/CommandIntent" + } + ] + }, + "key": { + "title": "Key", + "description": "A key value, unique in this run, that can be used to track the same logical command across multiple runs of the same protocol. If a value is not provided, one will be generated.", + "type": "string" + } + }, + "required": [ + "params" + ] }, "InitializeParams": { "title": "InitializeParams", @@ -3911,7 +4518,10 @@ "type": "integer" } }, - "required": ["moduleId", "sampleWavelength"] + "required": [ + "moduleId", + "sampleWavelength" + ] }, "InitializeCreate": { "title": "InitializeCreate", @@ -3921,7 +4531,9 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/initialize", - "enum": ["absorbanceReader/initialize"], + "enum": [ + "absorbanceReader/initialize" + ], "type": "string" }, "params": { @@ -3941,10 +4553,12 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, - "MeasureAbsorbanceParams": { - "title": "MeasureAbsorbanceParams", + "ReadAbsorbanceParams": { + "title": "ReadAbsorbanceParams", "description": "Input parameters for a single absorbance reading.", "type": "object", "properties": { @@ -3959,21 +4573,26 @@ "type": "integer" } }, - "required": ["moduleId", "sampleWavelength"] + "required": [ + "moduleId", + "sampleWavelength" + ] }, - "MeasureAbsorbanceCreate": { - "title": "MeasureAbsorbanceCreate", + "ReadAbsorbanceCreate": { + "title": "ReadAbsorbanceCreate", "description": "A request to execute an Absorbance Reader measurement.", "type": "object", "properties": { "commandType": { "title": "Commandtype", - "default": "absorbanceReader/measure", - "enum": ["absorbanceReader/measure"], + "default": "absorbanceReader/read", + "enum": [ + "absorbanceReader/read" + ], "type": "string" }, "params": { - "$ref": "#/definitions/MeasureAbsorbanceParams" + "$ref": "#/definitions/ReadAbsorbanceParams" }, "intent": { "description": "The reason the command was added. If not specified or `protocol`, the command will be treated as part of the protocol run itself, and added to the end of the existing command queue.\n\nIf `setup`, the command will be treated as part of run setup. A setup command may only be enqueued if the run has not started.\n\nUse setup commands for activities like pre-run calibration checks and module setup, like pre-heating.", @@ -3989,12 +4608,17 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibrateGripperParamsJaw": { "title": "CalibrateGripperParamsJaw", "description": "An enumeration.", - "enum": ["front", "rear"] + "enum": [ + "front", + "rear" + ] }, "Vec3f": { "title": "Vec3f", @@ -4014,7 +4638,11 @@ "type": "number" } }, - "required": ["x", "y", "z"] + "required": [ + "x", + "y", + "z" + ] }, "CalibrateGripperParams": { "title": "CalibrateGripperParams", @@ -4039,7 +4667,9 @@ ] } }, - "required": ["jaw"] + "required": [ + "jaw" + ] }, "CalibrateGripperCreate": { "title": "CalibrateGripperCreate", @@ -4049,7 +4679,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateGripper", - "enum": ["calibration/calibrateGripper"], + "enum": [ + "calibration/calibrateGripper" + ], "type": "string" }, "params": { @@ -4069,7 +4701,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibratePipetteParams": { "title": "CalibratePipetteParams", @@ -4085,7 +4719,9 @@ ] } }, - "required": ["mount"] + "required": [ + "mount" + ] }, "CalibratePipetteCreate": { "title": "CalibratePipetteCreate", @@ -4095,7 +4731,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibratePipette", - "enum": ["calibration/calibratePipette"], + "enum": [ + "calibration/calibratePipette" + ], "type": "string" }, "params": { @@ -4115,7 +4753,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "CalibrateModuleParams": { "title": "CalibrateModuleParams", @@ -4141,7 +4781,11 @@ ] } }, - "required": ["moduleId", "labwareId", "mount"] + "required": [ + "moduleId", + "labwareId", + "mount" + ] }, "CalibrateModuleCreate": { "title": "CalibrateModuleCreate", @@ -4151,7 +4795,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateModule", - "enum": ["calibration/calibrateModule"], + "enum": [ + "calibration/calibrateModule" + ], "type": "string" }, "params": { @@ -4171,12 +4817,17 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "MaintenancePosition": { "title": "MaintenancePosition", "description": "Maintenance position options.", - "enum": ["attachPlate", "attachInstrument"] + "enum": [ + "attachPlate", + "attachInstrument" + ] }, "MoveToMaintenancePositionParams": { "title": "MoveToMaintenancePositionParams", @@ -4201,7 +4852,9 @@ ] } }, - "required": ["mount"] + "required": [ + "mount" + ] }, "MoveToMaintenancePositionCreate": { "title": "MoveToMaintenancePositionCreate", @@ -4211,7 +4864,9 @@ "commandType": { "title": "Commandtype", "default": "calibration/moveToMaintenancePosition", - "enum": ["calibration/moveToMaintenancePosition"], + "enum": [ + "calibration/moveToMaintenancePosition" + ], "type": "string" }, "params": { @@ -4231,7 +4886,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "UnsafeBlowOutInPlaceParams": { "title": "UnsafeBlowOutInPlaceParams", @@ -4250,7 +4907,10 @@ "type": "string" } }, - "required": ["flowRate", "pipetteId"] + "required": [ + "flowRate", + "pipetteId" + ] }, "UnsafeBlowOutInPlaceCreate": { "title": "UnsafeBlowOutInPlaceCreate", @@ -4260,7 +4920,9 @@ "commandType": { "title": "Commandtype", "default": "unsafe/blowOutInPlace", - "enum": ["unsafe/blowOutInPlace"], + "enum": [ + "unsafe/blowOutInPlace" + ], "type": "string" }, "params": { @@ -4280,7 +4942,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "UnsafeDropTipInPlaceParams": { "title": "UnsafeDropTipInPlaceParams", @@ -4298,7 +4962,9 @@ "type": "boolean" } }, - "required": ["pipetteId"] + "required": [ + "pipetteId" + ] }, "UnsafeDropTipInPlaceCreate": { "title": "UnsafeDropTipInPlaceCreate", @@ -4308,7 +4974,9 @@ "commandType": { "title": "Commandtype", "default": "unsafe/dropTipInPlace", - "enum": ["unsafe/dropTipInPlace"], + "enum": [ + "unsafe/dropTipInPlace" + ], "type": "string" }, "params": { @@ -4328,7 +4996,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] }, "UpdatePositionEstimatorsParams": { "title": "UpdatePositionEstimatorsParams", @@ -4343,7 +5013,9 @@ } } }, - "required": ["axes"] + "required": [ + "axes" + ] }, "UpdatePositionEstimatorsCreate": { "title": "UpdatePositionEstimatorsCreate", @@ -4353,7 +5025,9 @@ "commandType": { "title": "Commandtype", "default": "unsafe/updatePositionEstimators", - "enum": ["unsafe/updatePositionEstimators"], + "enum": [ + "unsafe/updatePositionEstimators" + ], "type": "string" }, "params": { @@ -4373,7 +5047,9 @@ "type": "string" } }, - "required": ["params"] + "required": [ + "params" + ] } }, "$id": "opentronsCommandSchemaV9", From c77522e5278ff4cddb071175c75ffbb339f728a9 Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Fri, 9 Aug 2024 11:02:01 -0400 Subject: [PATCH 25/26] schema lint --- shared-data/command/schemas/9.json | 1060 +++++++--------------------- 1 file changed, 239 insertions(+), 821 deletions(-) diff --git a/shared-data/command/schemas/9.json b/shared-data/command/schemas/9.json index 3783fde24d2..1a310dd92ef 100644 --- a/shared-data/command/schemas/9.json +++ b/shared-data/command/schemas/9.json @@ -289,11 +289,7 @@ "WellOrigin": { "title": "WellOrigin", "description": "Origin of WellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well", - "enum": [ - "top", - "bottom", - "center" - ], + "enum": ["top", "bottom", "center"], "type": "string" }, "WellOffset": { @@ -378,22 +374,12 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "volume", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] }, "CommandIntent": { "title": "CommandIntent", "description": "Run intent for a given command.\n\nProps:\n PROTOCOL: the command is part of the protocol run itself.\n SETUP: the command is part of the setup phase of a run.", - "enum": [ - "protocol", - "setup", - "fixit" - ], + "enum": ["protocol", "setup", "fixit"], "type": "string" }, "AspirateCreate": { @@ -404,9 +390,7 @@ "commandType": { "title": "Commandtype", "default": "aspirate", - "enum": [ - "aspirate" - ], + "enum": ["aspirate"], "type": "string" }, "params": { @@ -426,9 +410,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AspirateInPlaceParams": { "title": "AspirateInPlaceParams", @@ -453,11 +435,7 @@ "type": "string" } }, - "required": [ - "flowRate", - "volume", - "pipetteId" - ] + "required": ["flowRate", "volume", "pipetteId"] }, "AspirateInPlaceCreate": { "title": "AspirateInPlaceCreate", @@ -467,9 +445,7 @@ "commandType": { "title": "Commandtype", "default": "aspirateInPlace", - "enum": [ - "aspirateInPlace" - ], + "enum": ["aspirateInPlace"], "type": "string" }, "params": { @@ -489,9 +465,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CommentParams": { "title": "CommentParams", @@ -504,9 +478,7 @@ "type": "string" } }, - "required": [ - "message" - ] + "required": ["message"] }, "CommentCreate": { "title": "CommentCreate", @@ -516,9 +488,7 @@ "commandType": { "title": "Commandtype", "default": "comment", - "enum": [ - "comment" - ], + "enum": ["comment"], "type": "string" }, "params": { @@ -538,9 +508,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ConfigureForVolumeParams": { "title": "ConfigureForVolumeParams", @@ -564,10 +532,7 @@ "type": "string" } }, - "required": [ - "pipetteId", - "volume" - ] + "required": ["pipetteId", "volume"] }, "ConfigureForVolumeCreate": { "title": "ConfigureForVolumeCreate", @@ -577,9 +542,7 @@ "commandType": { "title": "Commandtype", "default": "configureForVolume", - "enum": [ - "configureForVolume" - ], + "enum": ["configureForVolume"], "type": "string" }, "params": { @@ -599,9 +562,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AllNozzleLayoutConfiguration": { "title": "AllNozzleLayoutConfiguration", @@ -611,9 +572,7 @@ "style": { "title": "Style", "default": "ALL", - "enum": [ - "ALL" - ], + "enum": ["ALL"], "type": "string" } } @@ -626,26 +585,17 @@ "style": { "title": "Style", "default": "SINGLE", - "enum": [ - "SINGLE" - ], + "enum": ["SINGLE"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "RowNozzleLayoutConfiguration": { "title": "RowNozzleLayoutConfiguration", @@ -655,26 +605,17 @@ "style": { "title": "Style", "default": "ROW", - "enum": [ - "ROW" - ], + "enum": ["ROW"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "ColumnNozzleLayoutConfiguration": { "title": "ColumnNozzleLayoutConfiguration", @@ -684,26 +625,17 @@ "style": { "title": "Style", "default": "COLUMN", - "enum": [ - "COLUMN" - ], + "enum": ["COLUMN"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" } }, - "required": [ - "primaryNozzle" - ] + "required": ["primaryNozzle"] }, "QuadrantNozzleLayoutConfiguration": { "title": "QuadrantNozzleLayoutConfiguration", @@ -713,20 +645,13 @@ "style": { "title": "Style", "default": "QUADRANT", - "enum": [ - "QUADRANT" - ], + "enum": ["QUADRANT"], "type": "string" }, "primaryNozzle": { "title": "Primarynozzle", "description": "The primary nozzle to use in the layout configuration. This nozzle will update the critical point of the current pipette. For now, this is also the back left corner of your rectangle.", - "enum": [ - "A1", - "H1", - "A12", - "H12" - ], + "enum": ["A1", "H1", "A12", "H12"], "type": "string" }, "frontRightNozzle": { @@ -742,11 +667,7 @@ "type": "string" } }, - "required": [ - "primaryNozzle", - "frontRightNozzle", - "backLeftNozzle" - ] + "required": ["primaryNozzle", "frontRightNozzle", "backLeftNozzle"] }, "ConfigureNozzleLayoutParams": { "title": "ConfigureNozzleLayoutParams", @@ -779,10 +700,7 @@ ] } }, - "required": [ - "pipetteId", - "configurationParams" - ] + "required": ["pipetteId", "configurationParams"] }, "ConfigureNozzleLayoutCreate": { "title": "ConfigureNozzleLayoutCreate", @@ -792,9 +710,7 @@ "commandType": { "title": "Commandtype", "default": "configureNozzleLayout", - "enum": [ - "configureNozzleLayout" - ], + "enum": ["configureNozzleLayout"], "type": "string" }, "params": { @@ -814,9 +730,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CustomParams": { "title": "CustomParams", @@ -832,9 +746,7 @@ "commandType": { "title": "Commandtype", "default": "custom", - "enum": [ - "custom" - ], + "enum": ["custom"], "type": "string" }, "params": { @@ -854,9 +766,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DispenseParams": { "title": "DispenseParams", @@ -905,13 +815,7 @@ "type": "number" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "volume", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "volume", "pipetteId"] }, "DispenseCreate": { "title": "DispenseCreate", @@ -921,9 +825,7 @@ "commandType": { "title": "Commandtype", "default": "dispense", - "enum": [ - "dispense" - ], + "enum": ["dispense"], "type": "string" }, "params": { @@ -943,9 +845,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DispenseInPlaceParams": { "title": "DispenseInPlaceParams", @@ -975,11 +875,7 @@ "type": "number" } }, - "required": [ - "flowRate", - "volume", - "pipetteId" - ] + "required": ["flowRate", "volume", "pipetteId"] }, "DispenseInPlaceCreate": { "title": "DispenseInPlaceCreate", @@ -989,9 +885,7 @@ "commandType": { "title": "Commandtype", "default": "dispenseInPlace", - "enum": [ - "dispenseInPlace" - ], + "enum": ["dispenseInPlace"], "type": "string" }, "params": { @@ -1011,9 +905,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "BlowOutParams": { "title": "BlowOutParams", @@ -1051,12 +943,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "flowRate", - "pipetteId" - ] + "required": ["labwareId", "wellName", "flowRate", "pipetteId"] }, "BlowOutCreate": { "title": "BlowOutCreate", @@ -1066,9 +953,7 @@ "commandType": { "title": "Commandtype", "default": "blowout", - "enum": [ - "blowout" - ], + "enum": ["blowout"], "type": "string" }, "params": { @@ -1088,9 +973,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "BlowOutInPlaceParams": { "title": "BlowOutInPlaceParams", @@ -1109,10 +992,7 @@ "type": "string" } }, - "required": [ - "flowRate", - "pipetteId" - ] + "required": ["flowRate", "pipetteId"] }, "BlowOutInPlaceCreate": { "title": "BlowOutInPlaceCreate", @@ -1122,9 +1002,7 @@ "commandType": { "title": "Commandtype", "default": "blowOutInPlace", - "enum": [ - "blowOutInPlace" - ], + "enum": ["blowOutInPlace"], "type": "string" }, "params": { @@ -1144,19 +1022,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DropTipWellOrigin": { "title": "DropTipWellOrigin", "description": "The origin of a DropTipWellLocation offset.\n\nProps:\n TOP: the top-center of the well\n BOTTOM: the bottom-center of the well\n CENTER: the middle-center of the well\n DEFAULT: the default drop-tip location of the well,\n based on pipette configuration and length of the tip.", - "enum": [ - "top", - "bottom", - "center", - "default" - ], + "enum": ["top", "bottom", "center", "default"], "type": "string" }, "DropTipWellLocation": { @@ -1218,11 +1089,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "labwareId", - "wellName" - ] + "required": ["pipetteId", "labwareId", "wellName"] }, "DropTipCreate": { "title": "DropTipCreate", @@ -1232,9 +1099,7 @@ "commandType": { "title": "Commandtype", "default": "dropTip", - "enum": [ - "dropTip" - ], + "enum": ["dropTip"], "type": "string" }, "params": { @@ -1254,9 +1119,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DropTipInPlaceParams": { "title": "DropTipInPlaceParams", @@ -1274,9 +1137,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "DropTipInPlaceCreate": { "title": "DropTipInPlaceCreate", @@ -1286,9 +1147,7 @@ "commandType": { "title": "Commandtype", "default": "dropTipInPlace", - "enum": [ - "dropTipInPlace" - ], + "enum": ["dropTipInPlace"], "type": "string" }, "params": { @@ -1308,9 +1167,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MotorAxis": { "title": "MotorAxis", @@ -1330,11 +1187,7 @@ "MountType": { "title": "MountType", "description": "An enumeration.", - "enum": [ - "left", - "right", - "extension" - ], + "enum": ["left", "right", "extension"], "type": "string" }, "HomeParams": { @@ -1367,9 +1220,7 @@ "commandType": { "title": "Commandtype", "default": "home", - "enum": [ - "home" - ], + "enum": ["home"], "type": "string" }, "params": { @@ -1389,9 +1240,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "RetractAxisParams": { "title": "RetractAxisParams", @@ -1407,9 +1256,7 @@ ] } }, - "required": [ - "axis" - ] + "required": ["axis"] }, "RetractAxisCreate": { "title": "RetractAxisCreate", @@ -1419,9 +1266,7 @@ "commandType": { "title": "Commandtype", "default": "retractAxis", - "enum": [ - "retractAxis" - ], + "enum": ["retractAxis"], "type": "string" }, "params": { @@ -1441,9 +1286,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeckSlotName": { "title": "DeckSlotName", @@ -1489,9 +1332,7 @@ ] } }, - "required": [ - "slotName" - ] + "required": ["slotName"] }, "ModuleLocation": { "title": "ModuleLocation", @@ -1504,9 +1345,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "OnLabwareLocation": { "title": "OnLabwareLocation", @@ -1519,9 +1358,7 @@ "type": "string" } }, - "required": [ - "labwareId" - ] + "required": ["labwareId"] }, "AddressableAreaLocation": { "title": "AddressableAreaLocation", @@ -1534,9 +1371,7 @@ "type": "string" } }, - "required": [ - "addressableAreaName" - ] + "required": ["addressableAreaName"] }, "LoadLabwareParams": { "title": "LoadLabwareParams", @@ -1557,9 +1392,7 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": [ - "offDeck" - ], + "enum": ["offDeck"], "type": "string" }, { @@ -1593,12 +1426,7 @@ "type": "string" } }, - "required": [ - "location", - "loadName", - "namespace", - "version" - ] + "required": ["location", "loadName", "namespace", "version"] }, "LoadLabwareCreate": { "title": "LoadLabwareCreate", @@ -1608,9 +1436,7 @@ "commandType": { "title": "Commandtype", "default": "loadLabware", - "enum": [ - "loadLabware" - ], + "enum": ["loadLabware"], "type": "string" }, "params": { @@ -1630,9 +1456,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ReloadLabwareParams": { "title": "ReloadLabwareParams", @@ -1645,9 +1469,7 @@ "type": "string" } }, - "required": [ - "labwareId" - ] + "required": ["labwareId"] }, "ReloadLabwareCreate": { "title": "ReloadLabwareCreate", @@ -1657,9 +1479,7 @@ "commandType": { "title": "Commandtype", "default": "reloadLabware", - "enum": [ - "reloadLabware" - ], + "enum": ["reloadLabware"], "type": "string" }, "params": { @@ -1679,9 +1499,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LoadLiquidParams": { "title": "LoadLiquidParams", @@ -1707,11 +1525,7 @@ } } }, - "required": [ - "liquidId", - "labwareId", - "volumeByWell" - ] + "required": ["liquidId", "labwareId", "volumeByWell"] }, "LoadLiquidCreate": { "title": "LoadLiquidCreate", @@ -1721,9 +1535,7 @@ "commandType": { "title": "Commandtype", "default": "loadLiquid", - "enum": [ - "loadLiquid" - ], + "enum": ["loadLiquid"], "type": "string" }, "params": { @@ -1743,9 +1555,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ModuleModel": { "title": "ModuleModel", @@ -1791,10 +1601,7 @@ "type": "string" } }, - "required": [ - "model", - "location" - ] + "required": ["model", "location"] }, "LoadModuleCreate": { "title": "LoadModuleCreate", @@ -1804,9 +1611,7 @@ "commandType": { "title": "Commandtype", "default": "loadModule", - "enum": [ - "loadModule" - ], + "enum": ["loadModule"], "type": "string" }, "params": { @@ -1826,9 +1631,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PipetteNameType": { "title": "PipetteNameType", @@ -1891,10 +1694,7 @@ "type": "boolean" } }, - "required": [ - "pipetteName", - "mount" - ] + "required": ["pipetteName", "mount"] }, "LoadPipetteCreate": { "title": "LoadPipetteCreate", @@ -1904,9 +1704,7 @@ "commandType": { "title": "Commandtype", "default": "loadPipette", - "enum": [ - "loadPipette" - ], + "enum": ["loadPipette"], "type": "string" }, "params": { @@ -1926,18 +1724,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LabwareMovementStrategy": { "title": "LabwareMovementStrategy", "description": "Strategy to use for labware movement.", - "enum": [ - "usingGripper", - "manualMoveWithPause", - "manualMoveWithoutPause" - ], + "enum": ["usingGripper", "manualMoveWithPause", "manualMoveWithoutPause"], "type": "string" }, "LabwareOffsetVector": { @@ -1958,11 +1750,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveLabwareParams": { "title": "MoveLabwareParams", @@ -1988,9 +1776,7 @@ "$ref": "#/definitions/OnLabwareLocation" }, { - "enum": [ - "offDeck" - ], + "enum": ["offDeck"], "type": "string" }, { @@ -2025,11 +1811,7 @@ ] } }, - "required": [ - "labwareId", - "newLocation", - "strategy" - ] + "required": ["labwareId", "newLocation", "strategy"] }, "MoveLabwareCreate": { "title": "MoveLabwareCreate", @@ -2039,9 +1821,7 @@ "commandType": { "title": "Commandtype", "default": "moveLabware", - "enum": [ - "moveLabware" - ], + "enum": ["moveLabware"], "type": "string" }, "params": { @@ -2061,18 +1841,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MovementAxis": { "title": "MovementAxis", "description": "Axis on which to issue a relative movement.", - "enum": [ - "x", - "y", - "z" - ], + "enum": ["x", "y", "z"], "type": "string" }, "MoveRelativeParams": { @@ -2099,11 +1873,7 @@ "type": "number" } }, - "required": [ - "pipetteId", - "axis", - "distance" - ] + "required": ["pipetteId", "axis", "distance"] }, "MoveRelativeCreate": { "title": "MoveRelativeCreate", @@ -2113,9 +1883,7 @@ "commandType": { "title": "Commandtype", "default": "moveRelative", - "enum": [ - "moveRelative" - ], + "enum": ["moveRelative"], "type": "string" }, "params": { @@ -2135,9 +1903,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeckPoint": { "title": "DeckPoint", @@ -2157,11 +1923,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveToCoordinatesParams": { "title": "MoveToCoordinatesParams", @@ -2199,10 +1961,7 @@ ] } }, - "required": [ - "pipetteId", - "coordinates" - ] + "required": ["pipetteId", "coordinates"] }, "MoveToCoordinatesCreate": { "title": "MoveToCoordinatesCreate", @@ -2212,9 +1971,7 @@ "commandType": { "title": "Commandtype", "default": "moveToCoordinates", - "enum": [ - "moveToCoordinates" - ], + "enum": ["moveToCoordinates"], "type": "string" }, "params": { @@ -2234,9 +1991,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MoveToWellParams": { "title": "MoveToWellParams", @@ -2284,11 +2039,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "MoveToWellCreate": { "title": "MoveToWellCreate", @@ -2298,9 +2049,7 @@ "commandType": { "title": "Commandtype", "default": "moveToWell", - "enum": [ - "moveToWell" - ], + "enum": ["moveToWell"], "type": "string" }, "params": { @@ -2320,9 +2069,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "AddressableOffsetVector": { "title": "AddressableOffsetVector", @@ -2342,11 +2089,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "MoveToAddressableAreaParams": { "title": "MoveToAddressableAreaParams", @@ -2400,10 +2143,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "addressableAreaName" - ] + "required": ["pipetteId", "addressableAreaName"] }, "MoveToAddressableAreaCreate": { "title": "MoveToAddressableAreaCreate", @@ -2413,9 +2153,7 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableArea", - "enum": [ - "moveToAddressableArea" - ], + "enum": ["moveToAddressableArea"], "type": "string" }, "params": { @@ -2435,9 +2173,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MoveToAddressableAreaForDropTipParams": { "title": "MoveToAddressableAreaForDropTipParams", @@ -2497,10 +2233,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId", - "addressableAreaName" - ] + "required": ["pipetteId", "addressableAreaName"] }, "MoveToAddressableAreaForDropTipCreate": { "title": "MoveToAddressableAreaForDropTipCreate", @@ -2510,9 +2243,7 @@ "commandType": { "title": "Commandtype", "default": "moveToAddressableAreaForDropTip", - "enum": [ - "moveToAddressableAreaForDropTip" - ], + "enum": ["moveToAddressableAreaForDropTip"], "type": "string" }, "params": { @@ -2532,9 +2263,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PrepareToAspirateParams": { "title": "PrepareToAspirateParams", @@ -2547,9 +2276,7 @@ "type": "string" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "PrepareToAspirateCreate": { "title": "PrepareToAspirateCreate", @@ -2559,9 +2286,7 @@ "commandType": { "title": "Commandtype", "default": "prepareToAspirate", - "enum": [ - "prepareToAspirate" - ], + "enum": ["prepareToAspirate"], "type": "string" }, "params": { @@ -2581,9 +2306,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForResumeParams": { "title": "WaitForResumeParams", @@ -2605,10 +2328,7 @@ "commandType": { "title": "Commandtype", "default": "waitForResume", - "enum": [ - "waitForResume", - "pause" - ], + "enum": ["waitForResume", "pause"], "type": "string" }, "params": { @@ -2628,9 +2348,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForDurationParams": { "title": "WaitForDurationParams", @@ -2648,9 +2366,7 @@ "type": "string" } }, - "required": [ - "seconds" - ] + "required": ["seconds"] }, "WaitForDurationCreate": { "title": "WaitForDurationCreate", @@ -2660,9 +2376,7 @@ "commandType": { "title": "Commandtype", "default": "waitForDuration", - "enum": [ - "waitForDuration" - ], + "enum": ["waitForDuration"], "type": "string" }, "params": { @@ -2682,9 +2396,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "PickUpTipParams": { "title": "PickUpTipParams", @@ -2716,11 +2428,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "PickUpTipCreate": { "title": "PickUpTipCreate", @@ -2730,9 +2438,7 @@ "commandType": { "title": "Commandtype", "default": "pickUpTip", - "enum": [ - "pickUpTip" - ], + "enum": ["pickUpTip"], "type": "string" }, "params": { @@ -2752,9 +2458,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SavePositionParams": { "title": "SavePositionParams", @@ -2778,9 +2482,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "SavePositionCreate": { "title": "SavePositionCreate", @@ -2790,9 +2492,7 @@ "commandType": { "title": "Commandtype", "default": "savePosition", - "enum": [ - "savePosition" - ], + "enum": ["savePosition"], "type": "string" }, "params": { @@ -2812,9 +2512,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetRailLightsParams": { "title": "SetRailLightsParams", @@ -2827,9 +2525,7 @@ "type": "boolean" } }, - "required": [ - "on" - ] + "required": ["on"] }, "SetRailLightsCreate": { "title": "SetRailLightsCreate", @@ -2839,9 +2535,7 @@ "commandType": { "title": "Commandtype", "default": "setRailLights", - "enum": [ - "setRailLights" - ], + "enum": ["setRailLights"], "type": "string" }, "params": { @@ -2861,9 +2555,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TouchTipParams": { "title": "TouchTipParams", @@ -2906,11 +2598,7 @@ "type": "number" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "TouchTipCreate": { "title": "TouchTipCreate", @@ -2920,9 +2608,7 @@ "commandType": { "title": "Commandtype", "default": "touchTip", - "enum": [ - "touchTip" - ], + "enum": ["touchTip"], "type": "string" }, "params": { @@ -2942,20 +2628,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "StatusBarAnimation": { "title": "StatusBarAnimation", "description": "Status Bar animation options.", - "enum": [ - "idle", - "confirm", - "updating", - "disco", - "off" - ] + "enum": ["idle", "confirm", "updating", "disco", "off"] }, "SetStatusBarParams": { "title": "SetStatusBarParams", @@ -2971,9 +2649,7 @@ ] } }, - "required": [ - "animation" - ] + "required": ["animation"] }, "SetStatusBarCreate": { "title": "SetStatusBarCreate", @@ -2983,9 +2659,7 @@ "commandType": { "title": "Commandtype", "default": "setStatusBar", - "enum": [ - "setStatusBar" - ], + "enum": ["setStatusBar"], "type": "string" }, "params": { @@ -3005,28 +2679,18 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TipPresenceStatus": { "title": "TipPresenceStatus", "description": "Tip presence status reported by a pipette.", - "enum": [ - "present", - "absent", - "unknown" - ], + "enum": ["present", "absent", "unknown"], "type": "string" }, "InstrumentSensorId": { "title": "InstrumentSensorId", "description": "Primary and secondary sensor ids.", - "enum": [ - "primary", - "secondary", - "both" - ], + "enum": ["primary", "secondary", "both"], "type": "string" }, "VerifyTipPresenceParams": { @@ -3056,10 +2720,7 @@ ] } }, - "required": [ - "pipetteId", - "expectedState" - ] + "required": ["pipetteId", "expectedState"] }, "VerifyTipPresenceCreate": { "title": "VerifyTipPresenceCreate", @@ -3069,9 +2730,7 @@ "commandType": { "title": "Commandtype", "default": "verifyTipPresence", - "enum": [ - "verifyTipPresence" - ], + "enum": ["verifyTipPresence"], "type": "string" }, "params": { @@ -3091,9 +2750,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "GetTipPresenceParams": { "title": "GetTipPresenceParams", @@ -3106,9 +2763,7 @@ "type": "string" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "GetTipPresenceCreate": { "title": "GetTipPresenceCreate", @@ -3118,9 +2773,7 @@ "commandType": { "title": "Commandtype", "default": "getTipPresence", - "enum": [ - "getTipPresence" - ], + "enum": ["getTipPresence"], "type": "string" }, "params": { @@ -3140,9 +2793,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "LiquidProbeParams": { "title": "LiquidProbeParams", @@ -3174,11 +2825,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "LiquidProbeCreate": { "title": "LiquidProbeCreate", @@ -3188,9 +2835,7 @@ "commandType": { "title": "Commandtype", "default": "liquidProbe", - "enum": [ - "liquidProbe" - ], + "enum": ["liquidProbe"], "type": "string" }, "params": { @@ -3210,9 +2855,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "TryLiquidProbeParams": { "title": "TryLiquidProbeParams", @@ -3244,11 +2887,7 @@ "type": "string" } }, - "required": [ - "labwareId", - "wellName", - "pipetteId" - ] + "required": ["labwareId", "wellName", "pipetteId"] }, "TryLiquidProbeCreate": { "title": "TryLiquidProbeCreate", @@ -3258,9 +2897,7 @@ "commandType": { "title": "Commandtype", "default": "tryLiquidProbe", - "enum": [ - "tryLiquidProbe" - ], + "enum": ["tryLiquidProbe"], "type": "string" }, "params": { @@ -3280,9 +2917,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3300,9 +2935,7 @@ "type": "number" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__heater_shaker__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3312,9 +2945,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/waitForTemperature", - "enum": [ - "heaterShaker/waitForTemperature" - ], + "enum": ["heaterShaker/waitForTemperature"], "type": "string" }, "params": { @@ -3334,9 +2965,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3354,10 +2983,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "opentrons__protocol_engine__commands__heater_shaker__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3367,9 +2993,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setTargetTemperature", - "enum": [ - "heaterShaker/setTargetTemperature" - ], + "enum": ["heaterShaker/setTargetTemperature"], "type": "string" }, "params": { @@ -3389,9 +3013,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateHeaterParams": { "title": "DeactivateHeaterParams", @@ -3404,9 +3026,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateHeaterCreate": { "title": "DeactivateHeaterCreate", @@ -3416,9 +3036,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateHeater", - "enum": [ - "heaterShaker/deactivateHeater" - ], + "enum": ["heaterShaker/deactivateHeater"], "type": "string" }, "params": { @@ -3438,9 +3056,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetAndWaitForShakeSpeedParams": { "title": "SetAndWaitForShakeSpeedParams", @@ -3458,10 +3074,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "rpm" - ] + "required": ["moduleId", "rpm"] }, "SetAndWaitForShakeSpeedCreate": { "title": "SetAndWaitForShakeSpeedCreate", @@ -3471,9 +3084,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/setAndWaitForShakeSpeed", - "enum": [ - "heaterShaker/setAndWaitForShakeSpeed" - ], + "enum": ["heaterShaker/setAndWaitForShakeSpeed"], "type": "string" }, "params": { @@ -3493,9 +3104,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateShakerParams": { "title": "DeactivateShakerParams", @@ -3508,9 +3117,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateShakerCreate": { "title": "DeactivateShakerCreate", @@ -3520,9 +3127,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/deactivateShaker", - "enum": [ - "heaterShaker/deactivateShaker" - ], + "enum": ["heaterShaker/deactivateShaker"], "type": "string" }, "params": { @@ -3542,9 +3147,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "OpenLabwareLatchParams": { "title": "OpenLabwareLatchParams", @@ -3557,9 +3160,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "OpenLabwareLatchCreate": { "title": "OpenLabwareLatchCreate", @@ -3569,9 +3170,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/openLabwareLatch", - "enum": [ - "heaterShaker/openLabwareLatch" - ], + "enum": ["heaterShaker/openLabwareLatch"], "type": "string" }, "params": { @@ -3591,9 +3190,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CloseLabwareLatchParams": { "title": "CloseLabwareLatchParams", @@ -3606,9 +3203,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "CloseLabwareLatchCreate": { "title": "CloseLabwareLatchCreate", @@ -3618,9 +3213,7 @@ "commandType": { "title": "Commandtype", "default": "heaterShaker/closeLabwareLatch", - "enum": [ - "heaterShaker/closeLabwareLatch" - ], + "enum": ["heaterShaker/closeLabwareLatch"], "type": "string" }, "params": { @@ -3640,9 +3233,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DisengageParams": { "title": "DisengageParams", @@ -3655,9 +3246,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DisengageCreate": { "title": "DisengageCreate", @@ -3667,9 +3256,7 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/disengage", - "enum": [ - "magneticModule/disengage" - ], + "enum": ["magneticModule/disengage"], "type": "string" }, "params": { @@ -3689,9 +3276,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "EngageParams": { "title": "EngageParams", @@ -3709,10 +3294,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "height" - ] + "required": ["moduleId", "height"] }, "EngageCreate": { "title": "EngageCreate", @@ -3722,9 +3304,7 @@ "commandType": { "title": "Commandtype", "default": "magneticModule/engage", - "enum": [ - "magneticModule/engage" - ], + "enum": ["magneticModule/engage"], "type": "string" }, "params": { @@ -3744,9 +3324,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureParams": { "title": "SetTargetTemperatureParams", @@ -3764,10 +3342,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "opentrons__protocol_engine__commands__temperature_module__set_target_temperature__SetTargetTemperatureCreate": { "title": "SetTargetTemperatureCreate", @@ -3777,9 +3352,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/setTargetTemperature", - "enum": [ - "temperatureModule/setTargetTemperature" - ], + "enum": ["temperatureModule/setTargetTemperature"], "type": "string" }, "params": { @@ -3799,9 +3372,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureParams": { "title": "WaitForTemperatureParams", @@ -3819,9 +3390,7 @@ "type": "number" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__temperature_module__wait_for_temperature__WaitForTemperatureCreate": { "title": "WaitForTemperatureCreate", @@ -3831,9 +3400,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/waitForTemperature", - "enum": [ - "temperatureModule/waitForTemperature" - ], + "enum": ["temperatureModule/waitForTemperature"], "type": "string" }, "params": { @@ -3853,9 +3420,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateTemperatureParams": { "title": "DeactivateTemperatureParams", @@ -3868,9 +3433,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateTemperatureCreate": { "title": "DeactivateTemperatureCreate", @@ -3880,9 +3443,7 @@ "commandType": { "title": "Commandtype", "default": "temperatureModule/deactivate", - "enum": [ - "temperatureModule/deactivate" - ], + "enum": ["temperatureModule/deactivate"], "type": "string" }, "params": { @@ -3902,9 +3463,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetTargetBlockTemperatureParams": { "title": "SetTargetBlockTemperatureParams", @@ -3932,10 +3491,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "SetTargetBlockTemperatureCreate": { "title": "SetTargetBlockTemperatureCreate", @@ -3945,9 +3501,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetBlockTemperature", - "enum": [ - "thermocycler/setTargetBlockTemperature" - ], + "enum": ["thermocycler/setTargetBlockTemperature"], "type": "string" }, "params": { @@ -3967,9 +3521,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForBlockTemperatureParams": { "title": "WaitForBlockTemperatureParams", @@ -3982,9 +3534,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "WaitForBlockTemperatureCreate": { "title": "WaitForBlockTemperatureCreate", @@ -3994,9 +3544,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForBlockTemperature", - "enum": [ - "thermocycler/waitForBlockTemperature" - ], + "enum": ["thermocycler/waitForBlockTemperature"], "type": "string" }, "params": { @@ -4016,9 +3564,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "SetTargetLidTemperatureParams": { "title": "SetTargetLidTemperatureParams", @@ -4036,10 +3582,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "celsius" - ] + "required": ["moduleId", "celsius"] }, "SetTargetLidTemperatureCreate": { "title": "SetTargetLidTemperatureCreate", @@ -4049,9 +3592,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/setTargetLidTemperature", - "enum": [ - "thermocycler/setTargetLidTemperature" - ], + "enum": ["thermocycler/setTargetLidTemperature"], "type": "string" }, "params": { @@ -4071,9 +3612,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "WaitForLidTemperatureParams": { "title": "WaitForLidTemperatureParams", @@ -4086,9 +3625,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "WaitForLidTemperatureCreate": { "title": "WaitForLidTemperatureCreate", @@ -4098,9 +3635,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/waitForLidTemperature", - "enum": [ - "thermocycler/waitForLidTemperature" - ], + "enum": ["thermocycler/waitForLidTemperature"], "type": "string" }, "params": { @@ -4120,9 +3655,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateBlockParams": { "title": "DeactivateBlockParams", @@ -4135,9 +3668,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateBlockCreate": { "title": "DeactivateBlockCreate", @@ -4147,9 +3678,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateBlock", - "enum": [ - "thermocycler/deactivateBlock" - ], + "enum": ["thermocycler/deactivateBlock"], "type": "string" }, "params": { @@ -4169,9 +3698,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "DeactivateLidParams": { "title": "DeactivateLidParams", @@ -4184,9 +3711,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "DeactivateLidCreate": { "title": "DeactivateLidCreate", @@ -4196,9 +3721,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/deactivateLid", - "enum": [ - "thermocycler/deactivateLid" - ], + "enum": ["thermocycler/deactivateLid"], "type": "string" }, "params": { @@ -4218,9 +3741,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -4233,9 +3754,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__thermocycler__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -4245,9 +3764,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/openLid", - "enum": [ - "thermocycler/openLid" - ], + "enum": ["thermocycler/openLid"], "type": "string" }, "params": { @@ -4267,9 +3784,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -4282,9 +3797,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__thermocycler__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -4294,9 +3807,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/closeLid", - "enum": [ - "thermocycler/closeLid" - ], + "enum": ["thermocycler/closeLid"], "type": "string" }, "params": { @@ -4316,9 +3827,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "RunProfileStepParams": { "title": "RunProfileStepParams", @@ -4336,10 +3845,7 @@ "type": "number" } }, - "required": [ - "celsius", - "holdSeconds" - ] + "required": ["celsius", "holdSeconds"] }, "RunProfileParams": { "title": "RunProfileParams", @@ -4365,10 +3871,7 @@ "type": "number" } }, - "required": [ - "moduleId", - "profile" - ] + "required": ["moduleId", "profile"] }, "RunProfileCreate": { "title": "RunProfileCreate", @@ -4378,9 +3881,7 @@ "commandType": { "title": "Commandtype", "default": "thermocycler/runProfile", - "enum": [ - "thermocycler/runProfile" - ], + "enum": ["thermocycler/runProfile"], "type": "string" }, "params": { @@ -4400,9 +3901,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidParams": { "title": "CloseLidParams", @@ -4415,9 +3914,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__absorbance_reader__close_lid__CloseLidCreate": { "title": "CloseLidCreate", @@ -4427,9 +3924,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/closeLid", - "enum": [ - "absorbanceReader/closeLid" - ], + "enum": ["absorbanceReader/closeLid"], "type": "string" }, "params": { @@ -4449,9 +3944,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidParams": { "title": "OpenLidParams", @@ -4464,9 +3957,7 @@ "type": "string" } }, - "required": [ - "moduleId" - ] + "required": ["moduleId"] }, "opentrons__protocol_engine__commands__absorbance_reader__open_lid__OpenLidCreate": { "title": "OpenLidCreate", @@ -4476,9 +3967,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/openLid", - "enum": [ - "absorbanceReader/openLid" - ], + "enum": ["absorbanceReader/openLid"], "type": "string" }, "params": { @@ -4498,9 +3987,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "InitializeParams": { "title": "InitializeParams", @@ -4518,10 +4005,7 @@ "type": "integer" } }, - "required": [ - "moduleId", - "sampleWavelength" - ] + "required": ["moduleId", "sampleWavelength"] }, "InitializeCreate": { "title": "InitializeCreate", @@ -4531,9 +4015,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/initialize", - "enum": [ - "absorbanceReader/initialize" - ], + "enum": ["absorbanceReader/initialize"], "type": "string" }, "params": { @@ -4553,9 +4035,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "ReadAbsorbanceParams": { "title": "ReadAbsorbanceParams", @@ -4573,10 +4053,7 @@ "type": "integer" } }, - "required": [ - "moduleId", - "sampleWavelength" - ] + "required": ["moduleId", "sampleWavelength"] }, "ReadAbsorbanceCreate": { "title": "ReadAbsorbanceCreate", @@ -4586,9 +4063,7 @@ "commandType": { "title": "Commandtype", "default": "absorbanceReader/read", - "enum": [ - "absorbanceReader/read" - ], + "enum": ["absorbanceReader/read"], "type": "string" }, "params": { @@ -4608,17 +4083,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibrateGripperParamsJaw": { "title": "CalibrateGripperParamsJaw", "description": "An enumeration.", - "enum": [ - "front", - "rear" - ] + "enum": ["front", "rear"] }, "Vec3f": { "title": "Vec3f", @@ -4638,11 +4108,7 @@ "type": "number" } }, - "required": [ - "x", - "y", - "z" - ] + "required": ["x", "y", "z"] }, "CalibrateGripperParams": { "title": "CalibrateGripperParams", @@ -4667,9 +4133,7 @@ ] } }, - "required": [ - "jaw" - ] + "required": ["jaw"] }, "CalibrateGripperCreate": { "title": "CalibrateGripperCreate", @@ -4679,9 +4143,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateGripper", - "enum": [ - "calibration/calibrateGripper" - ], + "enum": ["calibration/calibrateGripper"], "type": "string" }, "params": { @@ -4701,9 +4163,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibratePipetteParams": { "title": "CalibratePipetteParams", @@ -4719,9 +4179,7 @@ ] } }, - "required": [ - "mount" - ] + "required": ["mount"] }, "CalibratePipetteCreate": { "title": "CalibratePipetteCreate", @@ -4731,9 +4189,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibratePipette", - "enum": [ - "calibration/calibratePipette" - ], + "enum": ["calibration/calibratePipette"], "type": "string" }, "params": { @@ -4753,9 +4209,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "CalibrateModuleParams": { "title": "CalibrateModuleParams", @@ -4781,11 +4235,7 @@ ] } }, - "required": [ - "moduleId", - "labwareId", - "mount" - ] + "required": ["moduleId", "labwareId", "mount"] }, "CalibrateModuleCreate": { "title": "CalibrateModuleCreate", @@ -4795,9 +4245,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/calibrateModule", - "enum": [ - "calibration/calibrateModule" - ], + "enum": ["calibration/calibrateModule"], "type": "string" }, "params": { @@ -4817,17 +4265,12 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "MaintenancePosition": { "title": "MaintenancePosition", "description": "Maintenance position options.", - "enum": [ - "attachPlate", - "attachInstrument" - ] + "enum": ["attachPlate", "attachInstrument"] }, "MoveToMaintenancePositionParams": { "title": "MoveToMaintenancePositionParams", @@ -4852,9 +4295,7 @@ ] } }, - "required": [ - "mount" - ] + "required": ["mount"] }, "MoveToMaintenancePositionCreate": { "title": "MoveToMaintenancePositionCreate", @@ -4864,9 +4305,7 @@ "commandType": { "title": "Commandtype", "default": "calibration/moveToMaintenancePosition", - "enum": [ - "calibration/moveToMaintenancePosition" - ], + "enum": ["calibration/moveToMaintenancePosition"], "type": "string" }, "params": { @@ -4886,9 +4325,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "UnsafeBlowOutInPlaceParams": { "title": "UnsafeBlowOutInPlaceParams", @@ -4907,10 +4344,7 @@ "type": "string" } }, - "required": [ - "flowRate", - "pipetteId" - ] + "required": ["flowRate", "pipetteId"] }, "UnsafeBlowOutInPlaceCreate": { "title": "UnsafeBlowOutInPlaceCreate", @@ -4920,9 +4354,7 @@ "commandType": { "title": "Commandtype", "default": "unsafe/blowOutInPlace", - "enum": [ - "unsafe/blowOutInPlace" - ], + "enum": ["unsafe/blowOutInPlace"], "type": "string" }, "params": { @@ -4942,9 +4374,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "UnsafeDropTipInPlaceParams": { "title": "UnsafeDropTipInPlaceParams", @@ -4962,9 +4392,7 @@ "type": "boolean" } }, - "required": [ - "pipetteId" - ] + "required": ["pipetteId"] }, "UnsafeDropTipInPlaceCreate": { "title": "UnsafeDropTipInPlaceCreate", @@ -4974,9 +4402,7 @@ "commandType": { "title": "Commandtype", "default": "unsafe/dropTipInPlace", - "enum": [ - "unsafe/dropTipInPlace" - ], + "enum": ["unsafe/dropTipInPlace"], "type": "string" }, "params": { @@ -4996,9 +4422,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] }, "UpdatePositionEstimatorsParams": { "title": "UpdatePositionEstimatorsParams", @@ -5013,9 +4437,7 @@ } } }, - "required": [ - "axes" - ] + "required": ["axes"] }, "UpdatePositionEstimatorsCreate": { "title": "UpdatePositionEstimatorsCreate", @@ -5025,9 +4447,7 @@ "commandType": { "title": "Commandtype", "default": "unsafe/updatePositionEstimators", - "enum": [ - "unsafe/updatePositionEstimators" - ], + "enum": ["unsafe/updatePositionEstimators"], "type": "string" }, "params": { @@ -5047,9 +4467,7 @@ "type": "string" } }, - "required": [ - "params" - ] + "required": ["params"] } }, "$id": "opentronsCommandSchemaV9", From 83fd7d04ab898e05d7c61e72dbc00ef649186e7c Mon Sep 17 00:00:00 2001 From: CaseyBatten Date: Fri, 9 Aug 2024 12:06:06 -0400 Subject: [PATCH 26/26] compatible labware pipette fix --- .../utils/generateCompatibleLabwareForPipette.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts b/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts index 149b032cf49..3b52d014e93 100644 --- a/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts +++ b/app/src/organisms/QuickTransferFlow/utils/generateCompatibleLabwareForPipette.ts @@ -14,8 +14,7 @@ export function generateCompatibleLabwareForPipette( (acc, definition) => { if ( definition.allowedRoles != null && - definition.allowedRoles.includes('adapter') && - definition.allowedRoles.includes('fixture') + definition.allowedRoles.includes('adapter') ) { return acc } else if (pipetteSpecs.channels === 1) {