From 6888ffdd08fd9d6d1b5cdf31f6ac833f7c1fa3ad Mon Sep 17 00:00:00 2001 From: pmoegenburg Date: Wed, 26 Jun 2024 15:27:31 -0400 Subject: [PATCH] feat(api): add liquid presence detection to load_instrument() (#15482) # Overview This PR adds a boolean argument to the load_instrument ProtocolContext method that enables liquid presence detection for the loaded pipette via an additional pipette state variable. Closes EXEC-541. # Test Plan Added tests to ensure this bool arg can only be populated in API versions 2.20 onward and when using a Flex robot. # Changelog # Review requests # Risk assessment --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: pmoegenburg --- .../protocol_api/core/engine/protocol.py | 6 +- .../core/legacy/legacy_protocol_core.py | 5 +- .../legacy_simulator/legacy_protocol_core.py | 5 +- .../opentrons/protocol_api/core/protocol.py | 5 +- .../protocol_api/protocol_context.py | 18 ++++++ .../protocol_engine/commands/load_pipette.py | 4 ++ .../protocol_engine/state/pipettes.py | 14 +++++ .../opentrons/protocols/api_support/util.py | 15 ++++- .../core/engine/test_protocol_core.py | 2 + .../protocol_api/test_protocol_context.py | 63 ++++++++++++++++++- .../state/test_pipette_store.py | 1 + .../state/test_pipette_view.py | 2 + ...B_TC_TM_DeckConfiguration1NoFixtures].json | 1 + ...300M_P20S_aspirateDispenseMix0Volume].json | 2 + ...P300M_P20S_HS_TC_TM_dispense_changes].json | 2 + ...2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 2 + ..._HS_TM_QuickZymoMagbeadRNAExtraction].json | 1 + ...IP_HS_MB_TC_TM_IlluminaDNAEnrichment].json | 2 + ..._HS_MB_TC_TM_IlluminaDNAEnrichmentv4].json | 2 + ...HS_HeaterShakerConflictWithTrashBin2].json | 2 +- ...Flex_S_v2_18_P1000_96_TipTrackingBug].json | 1 + ...TC_TM_TriggerPrepareForMountMovement].json | 1 + ...2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 2 + ...P300M_P20S_HS_TC_TM_dispense_changes].json | 2 + ...erifyNoFloatingPointErrorInPipetting].json | 1 + ...O_PIPETTES_TrashBinInStagingAreaCol4].json | 2 +- ...0MGen2_None_OT2PipetteInFlexProtocol].json | 1 + ..._PIPETTES_TM_ModuleInStagingAreaCol4].json | 2 +- ...96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json | 1 + ...HS_HeaterShakerConflictWithTrashBin1].json | 2 +- ..._HS_TC_TM_aspirateDispenseMix0Volume].json | 2 + ...x_X_v2_16_NO_PIPETTES_TrashBinInCol2].json | 2 +- ...2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 2 + ...5_P50M_P1000M_KAPALibraryQuantLongv2].json | 2 + ...tialTipPickupThermocyclerLidConflict].json | 1 + ...6_P1000_96_TC_PartialTipPickupColumn].json | 1 + ..._P300S_TC1_TC2_ThermocyclerMoamError].json | 2 +- ...1000_96_GRIP_DropLabwareIntoTrashBin].json | 1 + ...eckConfiguration1NoModulesNoFixtures].json | 1 + ...6_NO_PIPETTES_AccessToFixedTrashProp].json | 2 +- ...6_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json | 1 + ..._pipetteCollisionWithThermocyclerLid].json | 1 + ...96_TC_PartialTipPickupTryToReturnTip].json | 1 + ...P1000S_None_SimpleNormalizeLongRight].json | 1 + ..._96_GRIP_DeckConfiguration1NoModules].json | 1 + ...2_X_v4_P300M_P20S_MM_TC1_TM_e2eTests].json | 2 +- ...2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json | 2 + ...6_P1000_96_TC_PartialTipPickupSingle].json | 3 +- ...S_TC_TrashBinAndThermocyclerConflict].json | 2 +- ..._GRIP_HS_MB_TM_OmegaHDQDNAExtraction].json | 1 + ..._GRIP_HS_MB_TC_TM_IlluminaDNAPrep24x].json | 2 + ...X_v2_16_P1000_96_DropTipsWithNoTrash].json | 1 + ...2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json | 1 + ...tteCollisionWithThermocyclerLidClips].json | 1 + ..._GRIP_HS_MB_TC_TM_DeckConfiguration1].json | 1 + ...P300M_P20S_HS_TC_TM_dispense_changes].json | 2 + shared-data/command/schemas/8.json | 5 ++ .../python_protocol_generation/ast_helpers.py | 2 +- 58 files changed, 196 insertions(+), 19 deletions(-) diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 35b3494b5f2..6b040243193 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -496,7 +496,10 @@ def _get_module_core( ) def load_instrument( - self, instrument_name: PipetteNameType, mount: Mount + self, + instrument_name: PipetteNameType, + mount: Mount, + liquid_presence_detection: bool = False, ) -> InstrumentCore: """Load an instrument into the protocol. @@ -515,6 +518,7 @@ def load_instrument( tipOverlapNotAfterVersion=overlap_versions.overlap_for_api_version( self._api_version ), + liquidPresenceDetection=liquid_presence_detection, ) ) diff --git a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py index 02fc2003733..9e8912c5629 100644 --- a/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py @@ -346,7 +346,10 @@ def load_module( return module_core def load_instrument( - self, instrument_name: PipetteNameType, mount: Mount + self, + instrument_name: PipetteNameType, + mount: Mount, + liquid_presence_detection: bool = False, ) -> LegacyInstrumentCore: """Load an instrument.""" attached = { diff --git a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py index 9fb9d1a0f51..002ca5f6017 100644 --- a/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +++ b/api/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py @@ -29,7 +29,10 @@ class LegacyProtocolCoreSimulator( _instruments: Dict[Mount, Optional[LegacyInstrumentCoreSimulator]] # type: ignore[assignment] def load_instrument( # type: ignore[override] - self, instrument_name: PipetteNameType, mount: Mount + self, + instrument_name: PipetteNameType, + mount: Mount, + liquid_presence_detection: bool = False, ) -> LegacyInstrumentCoreSimulator: """Create a simulating instrument context.""" pipette_generation = convert_to_pipette_name_type( diff --git a/api/src/opentrons/protocol_api/core/protocol.py b/api/src/opentrons/protocol_api/core/protocol.py index a554c14e306..3b7aa87a5bb 100644 --- a/api/src/opentrons/protocol_api/core/protocol.py +++ b/api/src/opentrons/protocol_api/core/protocol.py @@ -124,7 +124,10 @@ def load_module( @abstractmethod def load_instrument( - self, instrument_name: PipetteNameType, mount: Mount + self, + instrument_name: PipetteNameType, + mount: Mount, + liquid_presence_detection: bool = False, ) -> InstrumentCoreType: ... diff --git a/api/src/opentrons/protocol_api/protocol_context.py b/api/src/opentrons/protocol_api/protocol_context.py index 1f724bd743b..82d5f73fbd6 100644 --- a/api/src/opentrons/protocol_api/protocol_context.py +++ b/api/src/opentrons/protocol_api/protocol_context.py @@ -38,6 +38,7 @@ AxisMaxSpeeds, requires_version, APIVersionError, + RobotTypeError, ) from ._types import OffDeckType @@ -870,6 +871,7 @@ def load_instrument( mount: Union[Mount, str, None] = None, tip_racks: Optional[List[Labware]] = None, replace: bool = False, + liquid_presence_detection: Optional[bool] = None, ) -> InstrumentContext: """Load a specific instrument for use in the protocol. @@ -897,6 +899,7 @@ def load_instrument( control ` applications. You cannot replace an instrument in the middle of a protocol being run from the Opentrons App or touchscreen. + :param bool liquid_presence_detection: If ``True``, enable liquid presence detection for instrument. Only available on Flex robots in API Version 2.20 and above. """ instrument_name = validation.ensure_lowercase_name(instrument_name) checked_instrument_name = validation.ensure_pipette_name(instrument_name) @@ -928,9 +931,24 @@ def load_instrument( f"Loading {checked_instrument_name} on {checked_mount.name.lower()} mount" ) + if ( + self._api_version < APIVersion(2, 20) + and liquid_presence_detection is not None + ): + raise APIVersionError( + "Liquid Presence Detection is only supported in API Version 2.20 and above." + ) + if ( + self._core.robot_type != "OT-3 Standard" + and liquid_presence_detection is not None + ): + raise RobotTypeError( + "Liquid presence detection only available on Flex robot." + ) instrument_core = self._core.load_instrument( instrument_name=checked_instrument_name, mount=checked_mount, + liquid_presence_detection=liquid_presence_detection or False, ) for tip_rack in tip_racks: diff --git a/api/src/opentrons/protocol_engine/commands/load_pipette.py b/api/src/opentrons/protocol_engine/commands/load_pipette.py index 5b3d1c22693..6e46e00d1d8 100644 --- a/api/src/opentrons/protocol_engine/commands/load_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/load_pipette.py @@ -56,6 +56,10 @@ class LoadPipetteParams(BaseModel): "expressed as vN where N is an integer, counting up from v0. If None, the current " "highest version will be used.", ) + liquidPresenceDetection: Optional[bool] = Field( + None, + description="Enable liquid presence detection for this pipette. Defaults to False.", + ) class LoadPipetteResult(BaseModel): diff --git a/api/src/opentrons/protocol_engine/state/pipettes.py b/api/src/opentrons/protocol_engine/state/pipettes.py index d1153e9a51e..2ddf2009adc 100644 --- a/api/src/opentrons/protocol_engine/state/pipettes.py +++ b/api/src/opentrons/protocol_engine/state/pipettes.py @@ -133,6 +133,7 @@ class PipetteState: static_config_by_id: Dict[str, StaticPipetteConfig] flow_rates_by_id: Dict[str, FlowRates] nozzle_configuration_by_id: Dict[str, Optional[NozzleMap]] + liquid_presence_detection_by_id: Dict[str, bool] class PipetteStore(HasState[PipetteState], HandlesActions): @@ -152,6 +153,7 @@ def __init__(self) -> None: static_config_by_id={}, flow_rates_by_id={}, nozzle_configuration_by_id={}, + liquid_presence_detection_by_id={}, ) def handle_action(self, action: Action) -> None: @@ -215,6 +217,9 @@ def _handle_command( # noqa: C901 pipetteName=command.params.pipetteName, mount=command.params.mount, ) + self._state.liquid_presence_detection_by_id[pipette_id] = ( + command.params.liquidPresenceDetection or False + ) self._state.aspirated_volume_by_id[pipette_id] = None self._state.movement_speed_by_id[pipette_id] = None self._state.attached_tip_by_id[pipette_id] = None @@ -801,3 +806,12 @@ def get_pipette_bounds_at_specified_move_to_position( pip_back_right_bound, pip_front_left_bound, ) + + def get_liquid_presence_detection(self, pipette_id: str) -> bool: + """Determine if liquid presence detection is enabled for this pipette.""" + try: + return self._state.liquid_presence_detection_by_id[pipette_id] + except KeyError as e: + raise errors.PipetteNotLoadedError( + f"Pipette {pipette_id} not found; unable to determine if pipette liquid presence detection enabled." + ) from e diff --git a/api/src/opentrons/protocols/api_support/util.py b/api/src/opentrons/protocols/api_support/util.py index dbe9e16f7de..d5c988b153c 100644 --- a/api/src/opentrons/protocols/api_support/util.py +++ b/api/src/opentrons/protocols/api_support/util.py @@ -22,6 +22,9 @@ from opentrons.hardware_control.types import Axis from opentrons.hardware_control.util import ot2_axis_to_string from opentrons_shared_data.robot.dev_types import RobotType +from opentrons_shared_data.errors.exceptions import ( + UnsupportedHardwareCommand, +) if TYPE_CHECKING: from opentrons.protocol_api.labware import Well, Labware @@ -37,10 +40,14 @@ MODULE_LOG = logging.getLogger(__name__) +class RobotTypeError(UnsupportedHardwareCommand): + """Error raised when a protocol attempts to access behavior not available to the robot type in use.""" + + pass + + class APIVersionError(Exception): - """ - Error raised when a protocol attempts to access behavior not implemented - """ + """Error raised when a protocol attempts to access behavior not implemented in the API in use.""" pass @@ -48,6 +55,8 @@ class APIVersionError(Exception): class UnsupportedAPIError(Exception): """Error raised when a protocol attempts to use unsupported API.""" + pass + def _assert_gzero(val: Any, message: str) -> float: try: diff --git a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py index 9a68084cc89..dc10b9bbad8 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py @@ -254,6 +254,7 @@ def test_load_instrument_pre_219( pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, tipOverlapNotAfterVersion="v0", + liquidPresenceDetection=False, ) ) ).then_return(commands.LoadPipetteResult(pipetteId="cool-pipette")) @@ -290,6 +291,7 @@ def test_load_instrument_post_219( pipetteName=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, tipOverlapNotAfterVersion="v1", + liquidPresenceDetection=False, ) ) ).then_return(commands.LoadPipetteResult(pipetteId="cool-pipette")) diff --git a/api/tests/opentrons/protocol_api/test_protocol_context.py b/api/tests/opentrons/protocol_api/test_protocol_context.py index c792fc4574c..7f00bfb9ee8 100644 --- a/api/tests/opentrons/protocol_api/test_protocol_context.py +++ b/api/tests/opentrons/protocol_api/test_protocol_context.py @@ -14,7 +14,7 @@ from opentrons.hardware_control.modules.types import ModuleType, TemperatureModuleModel from opentrons.protocols.api_support import instrument as mock_instrument_support from opentrons.protocols.api_support.types import APIVersion -from opentrons.protocols.api_support.util import APIVersionError +from opentrons.protocols.api_support.util import APIVersionError, RobotTypeError from opentrons.protocol_api import ( MAX_SUPPORTED_VERSION, ProtocolContext, @@ -178,6 +178,64 @@ def test_deck(subject: ProtocolContext) -> None: assert isinstance(result, Deck) +@pytest.mark.parametrize("api_version", [APIVersion(2, 20)]) +def test_load_instrument_robot_type( + decoy: Decoy, + mock_core: ProtocolCore, + subject: ProtocolContext, +) -> None: + """Non-Flex robot type should raise a ValueError.""" + mock_tip_racks = [decoy.mock(cls=Labware), decoy.mock(cls=Labware)] + + decoy.when(mock_validation.ensure_lowercase_name("Gandalf")).then_return("gandalf") + decoy.when(mock_validation.ensure_pipette_name("gandalf")).then_return( + PipetteNameType.P300_SINGLE + ) + decoy.when( + mock_validation.ensure_mount_for_pipette( + "shadowfax", PipetteNameType.P300_SINGLE + ) + ).then_return(Mount.LEFT) + decoy.when(mock_core.robot_type).then_return("OT-2 Standard") + + with pytest.raises(RobotTypeError): + subject.load_instrument( + instrument_name="Gandalf", + mount="shadowfax", + tip_racks=mock_tip_racks, + liquid_presence_detection=False, + ) + + +@pytest.mark.parametrize("api_version", [APIVersion(2, 14)]) +def test_load_instrument_api_version( + decoy: Decoy, + mock_core: ProtocolCore, + subject: ProtocolContext, +) -> None: + """Using an API Version prior to 2.20 should raise a APIVersionError.""" + mock_tip_racks = [decoy.mock(cls=Labware), decoy.mock(cls=Labware)] + + decoy.when(mock_validation.ensure_lowercase_name("Gandalf")).then_return("gandalf") + decoy.when(mock_validation.ensure_pipette_name("gandalf")).then_return( + PipetteNameType.P300_SINGLE + ) + decoy.when( + mock_validation.ensure_mount_for_pipette( + "shadowfax", PipetteNameType.P300_SINGLE + ) + ).then_return(Mount.LEFT) + decoy.when(mock_core.robot_type).then_return("OT-3 Standard") + + with pytest.raises(APIVersionError): + subject.load_instrument( + instrument_name="Gandalf", + mount="shadowfax", + tip_racks=mock_tip_racks, + liquid_presence_detection=False, + ) + + def test_load_instrument( decoy: Decoy, mock_core: ProtocolCore, @@ -201,6 +259,7 @@ def test_load_instrument( mock_core.load_instrument( instrument_name=PipetteNameType.P300_SINGLE, mount=Mount.LEFT, + liquid_presence_detection=False, ) ).then_return(mock_instrument_core) @@ -253,6 +312,7 @@ def test_load_instrument_replace( mock_core.load_instrument( instrument_name=matchers.IsA(PipetteNameType), mount=matchers.IsA(Mount), + liquid_presence_detection=False, ) ).then_return(mock_instrument_core) decoy.when(mock_instrument_core.get_pipette_name()).then_return("Ada Lovelace") @@ -296,6 +356,7 @@ def test_96_channel_pipette_raises_if_another_pipette_attached( mock_core.load_instrument( instrument_name=PipetteNameType.P300_SINGLE, mount=Mount.RIGHT, + liquid_presence_detection=False, ) ).then_return(mock_instrument_core) diff --git a/api/tests/opentrons/protocol_engine/state/test_pipette_store.py b/api/tests/opentrons/protocol_engine/state/test_pipette_store.py index d1b4ac29f7c..382bca58f2d 100644 --- a/api/tests/opentrons/protocol_engine/state/test_pipette_store.py +++ b/api/tests/opentrons/protocol_engine/state/test_pipette_store.py @@ -82,6 +82,7 @@ def test_sets_initial_state(subject: PipetteStore) -> None: static_config_by_id={}, flow_rates_by_id={}, nozzle_configuration_by_id={}, + liquid_presence_detection_by_id={}, ) diff --git a/api/tests/opentrons/protocol_engine/state/test_pipette_view.py b/api/tests/opentrons/protocol_engine/state/test_pipette_view.py index 8c27360ebad..ee061ce4f90 100644 --- a/api/tests/opentrons/protocol_engine/state/test_pipette_view.py +++ b/api/tests/opentrons/protocol_engine/state/test_pipette_view.py @@ -62,6 +62,7 @@ def get_pipette_view( static_config_by_id: Optional[Dict[str, StaticPipetteConfig]] = None, flow_rates_by_id: Optional[Dict[str, FlowRates]] = None, nozzle_layout_by_id: Optional[Dict[str, Optional[NozzleMap]]] = None, + liquid_presence_detection_by_id: Optional[Dict[str, bool]] = None, ) -> PipetteView: """Get a pipette view test subject with the specified state.""" state = PipetteState( @@ -74,6 +75,7 @@ def get_pipette_view( static_config_by_id=static_config_by_id or {}, flow_rates_by_id=flow_rates_by_id or {}, nozzle_configuration_by_id=nozzle_layout_by_id or {}, + liquid_presence_detection_by_id=liquid_presence_detection_by_id or {}, ) return PipetteView(state=state) diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json index 8ebc6de2c19..22bbe70db7b 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0190369ce5][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1NoFixtures].json @@ -8846,6 +8846,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json index 550231278e3..2c1628c7959 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0256665840][OT2_S_v2_16_P300M_P20S_aspirateDispenseMix0Volume].json @@ -2314,6 +2314,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2325,6 +2326,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json index 0cab55a47e3..658e9ce26e4 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[041ad55e7b][OT2_S_v2_15_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json index dbaf1c41736..d21f5dc8488 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[0c4ae179bb][OT2_S_v2_15_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10d250f82a][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtraction].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10d250f82a][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtraction].json index 64bd55e8c97..c0ad3e4c6a4 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10d250f82a][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtraction].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[10d250f82a][Flex_S_v2_15_P1000_96_GRIP_HS_TM_QuickZymoMagbeadRNAExtraction].json @@ -13208,6 +13208,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[12a2a22254][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichment].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[12a2a22254][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichment].json index f10838363e2..004fafd64c6 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[12a2a22254][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichment].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[12a2a22254][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichment].json @@ -9416,6 +9416,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_multi_flex", "tipOverlapNotAfterVersion": "v0" @@ -9427,6 +9428,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p50_multi_flex", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1960aa7a4c][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichmentv4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1960aa7a4c][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichmentv4].json index 6ae00202e99..63211f43e37 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1960aa7a4c][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichmentv4].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[1960aa7a4c][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAEnrichmentv4].json @@ -11683,6 +11683,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_multi_flex", "tipOverlapNotAfterVersion": "v0" @@ -11694,6 +11695,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p50_multi_flex", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19ffa9c839][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19ffa9c839][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2].json index bb04c84b2a3..546ccaccc6d 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19ffa9c839][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[19ffa9c839][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2].json @@ -479,7 +479,7 @@ "errorInfo": { "args": "('trash bin in slot 12 prevents heaterShakerModuleV1 from using slot 9.',)", "class": "DeckConflictError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2.py\", line 11, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 826, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 432, in load_module\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin2.py\", line 11, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 827, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 432, in load_module\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json index 189757769bb..33d08c74aa5 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2b7fcb5b23][Flex_S_v2_18_P1000_96_TipTrackingBug].json @@ -2315,6 +2315,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json index b33503630d4..b3453a123f5 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[2eaf98de6a][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_TriggerPrepareForMountMovement].json @@ -9364,6 +9364,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json index 4928e443759..ca059d8092f 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4a82419f1f][OT2_S_v2_16_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json index a9183d0ebff..4de5973817d 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[4b17883f74][OT2_S_v2_17_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json index b501a5cb5ae..1bfa3e0abdb 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[54f717cfd1][OT2_S_v2_16_P300S_None_verifyNoFloatingPointErrorInPipetting].json @@ -1518,6 +1518,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[58750bf5fb][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[58750bf5fb][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4].json index df5f77d29e3..61122c62638 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[58750bf5fb][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[58750bf5fb][Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4].json @@ -29,7 +29,7 @@ "errorInfo": { "args": "('Staging areas not permitted for trash bin.',)", "class": "ValueError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 524, in load_trash_bin\n raise ValueError(\"Staging areas not permitted for trash bin.\")\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TrashBinInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 525, in load_trash_bin\n raise ValueError(\"Staging areas not permitted for trash bin.\")\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json index 60b6ef99119..a4d092d3cfe 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[5e958b7c98][Flex_X_v2_16_P300MGen2_None_OT2PipetteInFlexProtocol].json @@ -1166,6 +1166,7 @@ }, "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6126498df7][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6126498df7][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4].json index 03f7e7d7012..578030f70c8 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6126498df7][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6126498df7][Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4].json @@ -29,7 +29,7 @@ "errorInfo": { "args": "('Cannot load a module onto a staging slot.',)", "class": "ValueError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 824, in load_module\n raise ValueError(\"Cannot load a module onto a staging slot.\")\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TM_ModuleInStagingAreaCol4.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 825, in load_module\n raise ValueError(\"Cannot load a module onto a staging slot.\")\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json index e614b9523bb..18bdaf38431 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e34343cfc][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_MagMaxRNAExtraction].json @@ -13127,6 +13127,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e5128f107][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e5128f107][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1].json index 52e04c9a33b..de024c4d49f 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e5128f107][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6e5128f107][OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1].json @@ -479,7 +479,7 @@ "errorInfo": { "args": "('trash bin in slot 12 prevents heaterShakerModuleV1 from using slot 11.',)", "class": "DeckConflictError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1.py\", line 11, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 826, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 432, in load_module\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 223, in check\n raise DeckConflictError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_16_None_None_HS_HeaterShakerConflictWithTrashBin1.py\", line 11, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 827, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 432, in load_module\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 223, in check\n raise DeckConflictError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json index 614d40ded7a..fd65e443c95 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[6f84e60cb0][OT2_S_v2_16_P300M_P20S_HS_TC_TM_aspirateDispenseMix0Volume].json @@ -2314,6 +2314,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2325,6 +2326,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[82e9853b34][Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[82e9853b34][Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2].json index 12b561b09e9..2645b8bd0d3 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[82e9853b34][Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[82e9853b34][Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2].json @@ -29,7 +29,7 @@ "errorInfo": { "args": "('Invalid location for trash bin: C2.\\nValid slots: Any slot in column 1 or 3.',)", "class": "InvalidTrashBinLocationError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 525, in load_trash_bin\n addressable_area_name = validation.ensure_and_convert_trash_bin_location(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/validation.py\", line 333, in ensure_and_convert_trash_bin_location\n raise InvalidTrashBinLocationError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TrashBinInCol2.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 526, in load_trash_bin\n addressable_area_name = validation.ensure_and_convert_trash_bin_location(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/validation.py\", line 333, in ensure_and_convert_trash_bin_location\n raise InvalidTrashBinLocationError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json index 7a5facf8aed..2814a5f0360 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8860ee702c][OT2_S_v2_14_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88a20da279][Flex_S_v2_15_P50M_P1000M_KAPALibraryQuantLongv2].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88a20da279][Flex_S_v2_15_P50M_P1000M_KAPALibraryQuantLongv2].json index 6dd9f8a87ae..a56eb2a5922 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88a20da279][Flex_S_v2_15_P50M_P1000M_KAPALibraryQuantLongv2].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[88a20da279][Flex_S_v2_15_P50M_P1000M_KAPALibraryQuantLongv2].json @@ -17856,6 +17856,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p50_multi_flex", "tipOverlapNotAfterVersion": "v0" @@ -17867,6 +17868,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p1000_multi_flex", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json index bb0c5a2f96f..229d5e8725c 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[89a8226c4e][Flex_X_v2_16_P1000_96_TC_PartialTipPickupThermocyclerLidConflict].json @@ -1163,6 +1163,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json index 396969bf7ad..fb7958c5c6e 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[8fcfd2ced0][Flex_S_v2_16_P1000_96_TC_PartialTipPickupColumn].json @@ -1163,6 +1163,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9618a6623c][OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9618a6623c][OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError].json index ed8baa02851..df4dcb23be6 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9618a6623c][OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9618a6623c][OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError].json @@ -2681,7 +2681,7 @@ "errorInfo": { "args": "('thermocyclerModuleV2 in slot 7 prevents thermocyclerModuleV1 from using slot 7.',)", "class": "DeckConflictError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError.py\", line 19, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 826, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/legacy_protocol_core.py\", line 333, in load_module\n self._deck_layout[resolved_location] = geometry\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/deck.py\", line 186, in __setitem__\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"OT2_X_v2_11_P300S_TC1_TC2_ThermocyclerMoamError.py\", line 19, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 827, in load_module\n module_core = self._core.load_module(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/legacy_protocol_core.py\", line 333, in load_module\n self._deck_layout[resolved_location] = geometry\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy/deck.py\", line 186, in __setitem__\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json index 3c5adf8c662..e0a2bc539b4 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[9e56ee92f6][Flex_X_v2_16_P1000_96_GRIP_DropLabwareIntoTrashBin].json @@ -1224,6 +1224,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json index 9e6012c9462..291d94a11a8 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a08c261369][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModulesNoFixtures].json @@ -7073,6 +7073,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a9557d762c][Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a9557d762c][Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp].json index 6d67a6effdf..96bea10b9f4 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a9557d762c][Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[a9557d762c][Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp].json @@ -29,7 +29,7 @@ "errorInfo": { "args": "('Fixed Trash is not supported on Flex protocols in API Version 2.16 and above.',)", "class": "APIVersionError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 1130, in fixed_trash\n raise APIVersionError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_AccessToFixedTrashProp.py\", line 15, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 1148, in fixed_trash\n raise APIVersionError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json index 2f023c9a10d..8215f31654f 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[ac886d7768][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TC_TM_IDTXgen96Part1to3].json @@ -10968,6 +10968,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json index 0e7581dc507..699f2a3b26a 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[adc0621263][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLid].json @@ -2376,6 +2376,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json index 7a0b43d3d7a..5c6f88cfc00 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[b0ce7dde5d][Flex_X_v2_16_P1000_96_TC_PartialTipPickupTryToReturnTip].json @@ -1163,6 +1163,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json index fd41b1d2efe..247c2e5a8d7 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[baf79d9b4a][Flex_S_v2_15_P1000S_None_SimpleNormalizeLongRight].json @@ -10685,6 +10685,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p1000_single_flex", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json index 1bda2054c5d..c6c86395482 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c745e5824a][Flex_S_v2_16_P1000_96_GRIP_DeckConfiguration1NoModules].json @@ -9377,6 +9377,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c9e6e3d59d][OT2_X_v4_P300M_P20S_MM_TC1_TM_e2eTests].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c9e6e3d59d][OT2_X_v4_P300M_P20S_MM_TC1_TM_e2eTests].json index 9e99f39b76d..878492af84e 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c9e6e3d59d][OT2_X_v4_P300M_P20S_MM_TC1_TM_e2eTests].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[c9e6e3d59d][OT2_X_v4_P300M_P20S_MM_TC1_TM_e2eTests].json @@ -6968,7 +6968,7 @@ "errorInfo": { "args": "('Cannot aspirate more than pipette max volume',)", "class": "AssertionError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 84, in _run\n await self._run_func()\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 61, in _do_run\n await func(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/protocol_runner.py\", line 235, in run_func\n await self._protocol_executor.execute(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/python_protocol_wrappers.py\", line 156, in execute\n await to_thread.run_sync(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/to_thread.py\", line 33, in run_sync\n return await get_asynclib().run_sync_in_worker_thread(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n return await future\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n result = context.run(func, *args)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute.py\", line 58, in run_protocol\n execute_json_v4.dispatch_json(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v4.py\", line 272, in dispatch_json\n pipette_command_map[command_type]( # type: ignore\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v3.py\", line 159, in _aspirate\n pipette.aspirate(volume, location)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 272, in aspirate\n self._core.aspirate(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py\", line 119, in aspirate\n new_volume <= self._pipette_dict[\"working_volume\"]\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 84, in _run\n await self._run_func()\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/task_queue.py\", line 61, in _do_run\n await func(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/protocol_runner.py\", line 235, in run_func\n await self._protocol_executor.execute(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_runner/python_protocol_wrappers.py\", line 156, in execute\n await to_thread.run_sync(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/to_thread.py\", line 33, in run_sync\n return await get_asynclib().run_sync_in_worker_thread(\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 877, in run_sync_in_worker_thread\n return await future\n\n File \"/usr/local/lib/python3.10/site-packages/anyio/_backends/_asyncio.py\", line 807, in run\n result = context.run(func, *args)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute.py\", line 58, in run_protocol\n execute_json_v4.dispatch_json(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v4.py\", line 272, in dispatch_json\n pipette_command_map[command_type]( # type: ignore\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_json_v3.py\", line 159, in _aspirate\n pipette.aspirate(volume, location)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 272, in aspirate\n self._core.aspirate(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py\", line 119, in aspirate\n new_volume <= self._pipette_dict[\"working_volume\"]\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json index 6c9c0208a1d..503b2774abe 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d48bc4f0c9][OT2_S_v2_17_P300M_P20S_HS_TC_TM_SmokeTestV3].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json index 6430b932d73..10373a08e82 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[d8cb88b3b2][Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle].json @@ -1163,6 +1163,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" @@ -3514,7 +3515,7 @@ "errorInfo": { "args": "('Nozzle layout configuration of style SINGLE is currently unsupported.',)", "class": "ValueError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle.py\", line 16, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 2006, in configure_nozzle_layout\n raise ValueError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_S_v2_16_P1000_96_TC_PartialTipPickupSingle.py\", line 16, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/instrument_context.py\", line 2006, in configure_nozzle_layout\n raise ValueError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de4249ddfb][Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de4249ddfb][Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict].json index b9f59d0a6b4..fea98278227 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de4249ddfb][Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de4249ddfb][Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict].json @@ -138,7 +138,7 @@ "errorInfo": { "args": "('thermocyclerModuleV2 in slot B1 prevents trash bin from using slot A1.',)", "class": "DeckConflictError", - "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict.py\", line 13, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 383, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 530, in load_trash_bin\n trash_bin = self._core.load_trash_bin(slot_name, addressable_area_name)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 546, in load_trash_bin\n self._add_disposal_location_to_engine(trash_bin)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 149, in _add_disposal_location_to_engine\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" + "traceback": " File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/execution/execute_python.py\", line 147, in exec_run\n exec(\"run(__context)\", new_globs)\n\n File \"\", line 1, in \n\n File \"Flex_X_v2_16_NO_PIPETTES_TC_TrashBinAndThermocyclerConflict.py\", line 13, in run\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocols/api_support/util.py\", line 392, in _check_version_wrapper\n return decorated_obj(*args, **kwargs)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/protocol_context.py\", line 531, in load_trash_bin\n trash_bin = self._core.load_trash_bin(slot_name, addressable_area_name)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 550, in load_trash_bin\n self._add_disposal_location_to_engine(trash_bin)\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/protocol.py\", line 149, in _add_disposal_location_to_engine\n deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/protocol_api/core/engine/deck_conflict.py\", line 203, in check\n wrapped_deck_conflict.check(\n\n File \"/usr/local/lib/python3.10/site-packages/opentrons/motion_planning/deck_conflict.py\", line 210, in check\n raise DeckConflictError(\n" }, "errorType": "PythonException", "isDefined": false, diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de842b7217][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_OmegaHDQDNAExtraction].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de842b7217][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_OmegaHDQDNAExtraction].json index 64607e7dfc6..5017df3e419 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de842b7217][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_OmegaHDQDNAExtraction].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[de842b7217][Flex_S_v2_15_P1000_96_GRIP_HS_MB_TM_OmegaHDQDNAExtraction].json @@ -13332,6 +13332,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e907467039][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAPrep24x].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e907467039][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAPrep24x].json index cd13180ed50..fa0d0650b0a 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e907467039][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAPrep24x].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[e907467039][Flex_S_v2_15_P1000M_P50M_GRIP_HS_MB_TC_TM_IlluminaDNAPrep24x].json @@ -8146,6 +8146,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p1000_multi_flex", "tipOverlapNotAfterVersion": "v0" @@ -8157,6 +8158,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p50_multi_flex", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json index f26f6dfc20b..c64e586c000 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f0efddcd7d][Flex_X_v2_16_P1000_96_DropTipsWithNoTrash].json @@ -1311,6 +1311,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json index 7814a25c912..7754a572173 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f51172f73b][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_Smoke].json @@ -8179,6 +8179,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json index 85e25d6cc25..a50d06f053d 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f7085d7134][Flex_X_v2_16_P1000_96_TC_pipetteCollisionWithThermocyclerLidClips].json @@ -1272,6 +1272,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json index e117b9d0f7c..0a4c04d6260 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[f834b97da1][Flex_S_v2_16_P1000_96_GRIP_HS_MB_TC_TM_DeckConfiguration1].json @@ -11150,6 +11150,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p1000_96", "tipOverlapNotAfterVersion": "v0" diff --git a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json index fbe6fcfb75d..ab79468e26a 100644 --- a/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json +++ b/app-testing/tests/__snapshots__/analyses_snapshot_test/test_analysis_snapshot[fc60ef9cbd][OT2_S_v2_16_P300M_P20S_HS_TC_TM_dispense_changes].json @@ -2350,6 +2350,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "left", "pipetteName": "p300_multi_gen2", "tipOverlapNotAfterVersion": "v0" @@ -2361,6 +2362,7 @@ "commandType": "loadPipette", "notes": [], "params": { + "liquidPresenceDetection": false, "mount": "right", "pipetteName": "p20_single_gen2", "tipOverlapNotAfterVersion": "v0" diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 586174612a1..d6fb78e12c3 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -1657,6 +1657,11 @@ "title": "Tipoverlapnotafterversion", "description": "A version of tip overlap data to not exceed. The highest-versioned tip overlap data that does not exceed this version will be used. Versions are expressed as vN where N is an integer, counting up from v0. If None, the current highest version will be used.", "type": "string" + }, + "liquidPresenceDetection": { + "title": "Liquidpresencedetection", + "description": "Enable liquid presence detection for this pipette. Defaults to False.", + "type": "boolean" } }, "required": ["pipetteName", "mount"] diff --git a/test-data-generation/src/test_data_generation/python_protocol_generation/ast_helpers.py b/test-data-generation/src/test_data_generation/python_protocol_generation/ast_helpers.py index 510406e33f9..468a8fb8546 100644 --- a/test-data-generation/src/test_data_generation/python_protocol_generation/ast_helpers.py +++ b/test-data-generation/src/test_data_generation/python_protocol_generation/ast_helpers.py @@ -123,7 +123,7 @@ def load_module( @classmethod def load_instrument( - cls, instrument_name: str, mount: typing.Literal["left", "right"] + cls, instrument_name: str, mount: typing.Literal["left", "right"], ) -> "CallFunction": """Create a CallFunction for loading an instrument.""" return cls(