opentrons 8.2.0a4__py2.py3-none-any.whl → 8.3.0a1__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/calibration_storage/deck_configuration.py +3 -3
- opentrons/calibration_storage/file_operators.py +3 -3
- opentrons/calibration_storage/helpers.py +3 -1
- opentrons/calibration_storage/ot2/models/v1.py +16 -29
- opentrons/calibration_storage/ot2/tip_length.py +7 -4
- opentrons/calibration_storage/ot3/models/v1.py +14 -23
- opentrons/cli/analyze.py +18 -6
- opentrons/config/defaults_ot3.py +1 -0
- opentrons/drivers/asyncio/communication/__init__.py +2 -0
- opentrons/drivers/asyncio/communication/errors.py +16 -3
- opentrons/drivers/asyncio/communication/serial_connection.py +24 -9
- opentrons/drivers/command_builder.py +2 -2
- opentrons/drivers/flex_stacker/__init__.py +9 -0
- opentrons/drivers/flex_stacker/abstract.py +89 -0
- opentrons/drivers/flex_stacker/driver.py +260 -0
- opentrons/drivers/flex_stacker/simulator.py +109 -0
- opentrons/drivers/flex_stacker/types.py +138 -0
- opentrons/drivers/heater_shaker/driver.py +18 -3
- opentrons/drivers/temp_deck/driver.py +13 -3
- opentrons/drivers/thermocycler/driver.py +17 -3
- opentrons/execute.py +3 -1
- opentrons/hardware_control/__init__.py +1 -2
- opentrons/hardware_control/api.py +28 -20
- opentrons/hardware_control/backends/flex_protocol.py +17 -7
- opentrons/hardware_control/backends/ot3controller.py +213 -63
- opentrons/hardware_control/backends/ot3simulator.py +18 -9
- opentrons/hardware_control/backends/ot3utils.py +43 -15
- opentrons/hardware_control/dev_types.py +4 -0
- opentrons/hardware_control/emulation/heater_shaker.py +4 -0
- opentrons/hardware_control/emulation/module_server/client.py +1 -1
- opentrons/hardware_control/emulation/module_server/server.py +5 -3
- opentrons/hardware_control/emulation/settings.py +3 -4
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +2 -1
- opentrons/hardware_control/instruments/ot2/pipette.py +15 -22
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +8 -1
- opentrons/hardware_control/instruments/ot3/gripper.py +2 -2
- opentrons/hardware_control/instruments/ot3/pipette.py +23 -22
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +10 -1
- opentrons/hardware_control/modules/mod_abc.py +2 -2
- opentrons/hardware_control/motion_utilities.py +68 -0
- opentrons/hardware_control/nozzle_manager.py +39 -41
- opentrons/hardware_control/ot3_calibration.py +1 -1
- opentrons/hardware_control/ot3api.py +60 -23
- opentrons/hardware_control/protocols/gripper_controller.py +3 -0
- opentrons/hardware_control/protocols/hardware_manager.py +5 -1
- opentrons/hardware_control/protocols/liquid_handler.py +18 -0
- opentrons/hardware_control/protocols/motion_controller.py +6 -0
- opentrons/hardware_control/robot_calibration.py +1 -1
- opentrons/hardware_control/types.py +61 -0
- opentrons/protocol_api/__init__.py +20 -1
- opentrons/protocol_api/_liquid.py +24 -49
- opentrons/protocol_api/_liquid_properties.py +754 -0
- opentrons/protocol_api/_types.py +24 -0
- opentrons/protocol_api/core/common.py +2 -0
- opentrons/protocol_api/core/engine/instrument.py +82 -10
- opentrons/protocol_api/core/engine/labware.py +29 -7
- opentrons/protocol_api/core/engine/protocol.py +130 -5
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/well.py +4 -1
- opentrons/protocol_api/core/instrument.py +46 -4
- opentrons/protocol_api/core/labware.py +13 -4
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +37 -3
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +13 -4
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +32 -1
- opentrons/protocol_api/core/legacy/legacy_robot_core.py +0 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +37 -3
- opentrons/protocol_api/core/protocol.py +34 -1
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/instrument_context.py +158 -44
- opentrons/protocol_api/labware.py +231 -7
- opentrons/protocol_api/module_contexts.py +21 -17
- opentrons/protocol_api/protocol_context.py +125 -4
- opentrons/protocol_api/robot_context.py +204 -32
- opentrons/protocol_api/validation.py +262 -3
- opentrons/protocol_engine/__init__.py +4 -0
- opentrons/protocol_engine/actions/actions.py +2 -3
- opentrons/protocol_engine/clients/sync_client.py +18 -0
- opentrons/protocol_engine/commands/__init__.py +81 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +0 -2
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +19 -5
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +0 -1
- opentrons/protocol_engine/commands/absorbance_reader/read.py +32 -9
- opentrons/protocol_engine/commands/air_gap_in_place.py +160 -0
- opentrons/protocol_engine/commands/aspirate.py +103 -53
- opentrons/protocol_engine/commands/aspirate_in_place.py +55 -51
- opentrons/protocol_engine/commands/blow_out.py +44 -39
- opentrons/protocol_engine/commands/blow_out_in_place.py +21 -32
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +13 -6
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +1 -1
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +3 -3
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +1 -1
- opentrons/protocol_engine/commands/command.py +73 -66
- opentrons/protocol_engine/commands/command_unions.py +101 -1
- opentrons/protocol_engine/commands/comment.py +1 -1
- opentrons/protocol_engine/commands/configure_for_volume.py +10 -3
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +6 -4
- opentrons/protocol_engine/commands/custom.py +6 -12
- opentrons/protocol_engine/commands/dispense.py +82 -48
- opentrons/protocol_engine/commands/dispense_in_place.py +71 -51
- opentrons/protocol_engine/commands/drop_tip.py +52 -31
- opentrons/protocol_engine/commands/drop_tip_in_place.py +13 -3
- opentrons/protocol_engine/commands/generate_command_schema.py +4 -11
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +1 -1
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +10 -4
- opentrons/protocol_engine/commands/home.py +13 -4
- opentrons/protocol_engine/commands/liquid_probe.py +67 -24
- opentrons/protocol_engine/commands/load_labware.py +29 -7
- opentrons/protocol_engine/commands/load_lid.py +146 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +189 -0
- opentrons/protocol_engine/commands/load_liquid.py +12 -4
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +31 -10
- opentrons/protocol_engine/commands/load_pipette.py +19 -8
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +1 -1
- opentrons/protocol_engine/commands/magnetic_module/engage.py +1 -1
- opentrons/protocol_engine/commands/move_labware.py +19 -6
- opentrons/protocol_engine/commands/move_relative.py +35 -25
- opentrons/protocol_engine/commands/move_to_addressable_area.py +40 -27
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +53 -32
- opentrons/protocol_engine/commands/move_to_coordinates.py +36 -22
- opentrons/protocol_engine/commands/move_to_well.py +40 -24
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +49 -27
- opentrons/protocol_engine/commands/pipetting_common.py +169 -87
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +24 -33
- opentrons/protocol_engine/commands/reload_labware.py +1 -1
- opentrons/protocol_engine/commands/retract_axis.py +1 -1
- opentrons/protocol_engine/commands/robot/__init__.py +69 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +77 -0
- opentrons/protocol_engine/commands/save_position.py +14 -5
- opentrons/protocol_engine/commands/set_rail_lights.py +1 -1
- opentrons/protocol_engine/commands/set_status_bar.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +1 -1
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +10 -4
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +8 -2
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +9 -3
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +11 -4
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +1 -1
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +1 -1
- opentrons/protocol_engine/commands/touch_tip.py +65 -16
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +4 -1
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +12 -3
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +1 -4
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +1 -4
- opentrons/protocol_engine/commands/verify_tip_presence.py +11 -4
- opentrons/protocol_engine/commands/wait_for_duration.py +10 -3
- opentrons/protocol_engine/commands/wait_for_resume.py +10 -3
- opentrons/protocol_engine/errors/__init__.py +8 -0
- opentrons/protocol_engine/errors/error_occurrence.py +19 -20
- opentrons/protocol_engine/errors/exceptions.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +1 -1
- opentrons/protocol_engine/execution/equipment.py +73 -5
- opentrons/protocol_engine/execution/gantry_mover.py +364 -8
- opentrons/protocol_engine/execution/movement.py +27 -0
- opentrons/protocol_engine/execution/pipetting.py +5 -1
- opentrons/protocol_engine/execution/tip_handler.py +4 -6
- opentrons/protocol_engine/notes/notes.py +1 -1
- opentrons/protocol_engine/protocol_engine.py +7 -6
- opentrons/protocol_engine/resources/labware_data_provider.py +1 -1
- opentrons/protocol_engine/resources/labware_validation.py +5 -0
- opentrons/protocol_engine/resources/module_data_provider.py +1 -1
- opentrons/protocol_engine/resources/pipette_data_provider.py +26 -0
- opentrons/protocol_engine/slot_standardization.py +9 -9
- opentrons/protocol_engine/state/_move_types.py +9 -5
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +25 -61
- opentrons/protocol_engine/state/command_history.py +12 -0
- opentrons/protocol_engine/state/commands.py +17 -13
- opentrons/protocol_engine/state/files.py +10 -12
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/frustum_helpers.py +57 -32
- opentrons/protocol_engine/state/geometry.py +47 -1
- opentrons/protocol_engine/state/labware.py +79 -25
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +16 -4
- opentrons/protocol_engine/state/modules.py +52 -70
- opentrons/protocol_engine/state/motion.py +6 -1
- opentrons/protocol_engine/state/pipettes.py +144 -58
- opentrons/protocol_engine/state/state.py +21 -2
- opentrons/protocol_engine/state/state_summary.py +4 -2
- opentrons/protocol_engine/state/tips.py +11 -44
- opentrons/protocol_engine/state/update_types.py +343 -48
- opentrons/protocol_engine/state/wells.py +19 -11
- opentrons/protocol_engine/types.py +176 -28
- opentrons/protocol_reader/extract_labware_definitions.py +5 -2
- opentrons/protocol_reader/file_format_validator.py +5 -5
- opentrons/protocol_runner/json_file_reader.py +9 -3
- opentrons/protocol_runner/json_translator.py +51 -25
- opentrons/protocol_runner/legacy_command_mapper.py +66 -64
- opentrons/protocol_runner/protocol_runner.py +35 -4
- opentrons/protocol_runner/python_protocol_wrappers.py +1 -1
- opentrons/protocol_runner/run_orchestrator.py +13 -3
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +1 -1
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +56 -0
- opentrons/protocols/advanced_control/{transfers.py → transfers/transfer.py} +10 -85
- opentrons/protocols/api_support/definitions.py +1 -1
- opentrons/protocols/api_support/instrument.py +1 -1
- opentrons/protocols/api_support/util.py +10 -0
- opentrons/protocols/labware.py +39 -6
- opentrons/protocols/models/json_protocol.py +5 -9
- opentrons/simulate.py +3 -1
- opentrons/types.py +162 -2
- opentrons/util/logging_config.py +1 -1
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/METADATA +16 -15
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/RECORD +229 -202
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/WHEEL +1 -1
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/LICENSE +0 -0
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/entry_points.txt +0 -0
- {opentrons-8.2.0a4.dist-info → opentrons-8.3.0a1.dist-info}/top_level.txt +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"""Models and implementation for the calibrateGripper command."""
|
|
2
2
|
|
|
3
3
|
from enum import Enum
|
|
4
|
-
from typing import Optional, Type
|
|
4
|
+
from typing import Optional, Type, Any
|
|
5
5
|
from typing_extensions import Literal
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
9
|
|
|
9
10
|
from opentrons.types import Point
|
|
10
11
|
from opentrons.hardware_control import HardwareControlAPI
|
|
@@ -22,6 +23,10 @@ from opentrons.protocol_engine.resources import ensure_ot3_hardware
|
|
|
22
23
|
CalibrateGripperCommandType = Literal["calibration/calibrateGripper"]
|
|
23
24
|
|
|
24
25
|
|
|
26
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
27
|
+
s.pop("default", None)
|
|
28
|
+
|
|
29
|
+
|
|
25
30
|
class CalibrateGripperParamsJaw(Enum): # noqa: D101
|
|
26
31
|
FRONT = "front"
|
|
27
32
|
REAR = "rear"
|
|
@@ -39,7 +44,7 @@ class CalibrateGripperParams(BaseModel):
|
|
|
39
44
|
),
|
|
40
45
|
)
|
|
41
46
|
|
|
42
|
-
otherJawOffset:
|
|
47
|
+
otherJawOffset: Vec3f | SkipJsonSchema[None] = Field(
|
|
43
48
|
None,
|
|
44
49
|
description=(
|
|
45
50
|
"If an offset for the other probe is already found, then specifying it here"
|
|
@@ -48,6 +53,7 @@ class CalibrateGripperParams(BaseModel):
|
|
|
48
53
|
" If this param is not specified then the command will only find and return"
|
|
49
54
|
" the offset for the specified probe."
|
|
50
55
|
),
|
|
56
|
+
json_schema_extra=_remove_default,
|
|
51
57
|
)
|
|
52
58
|
|
|
53
59
|
|
|
@@ -62,11 +68,12 @@ class CalibrateGripperResult(BaseModel):
|
|
|
62
68
|
),
|
|
63
69
|
)
|
|
64
70
|
|
|
65
|
-
savedCalibration:
|
|
71
|
+
savedCalibration: GripperCalibrationOffset | SkipJsonSchema[None] = Field(
|
|
66
72
|
None,
|
|
67
73
|
description=(
|
|
68
74
|
"Gripper calibration result data, when `otherJawOffset` is provided."
|
|
69
75
|
),
|
|
76
|
+
json_schema_extra=_remove_default,
|
|
70
77
|
)
|
|
71
78
|
|
|
72
79
|
|
|
@@ -118,8 +125,8 @@ class CalibrateGripperImplementation(
|
|
|
118
125
|
calibration_data = result
|
|
119
126
|
|
|
120
127
|
return SuccessData(
|
|
121
|
-
public=CalibrateGripperResult.
|
|
122
|
-
jawOffset=Vec3f.
|
|
128
|
+
public=CalibrateGripperResult.model_construct(
|
|
129
|
+
jawOffset=Vec3f.model_construct(
|
|
123
130
|
x=probe_offset.x, y=probe_offset.y, z=probe_offset.z
|
|
124
131
|
),
|
|
125
132
|
savedCalibration=calibration_data,
|
|
@@ -143,7 +150,7 @@ class CalibrateGripper(
|
|
|
143
150
|
|
|
144
151
|
commandType: CalibrateGripperCommandType = "calibration/calibrateGripper"
|
|
145
152
|
params: CalibrateGripperParams
|
|
146
|
-
result: Optional[CalibrateGripperResult]
|
|
153
|
+
result: Optional[CalibrateGripperResult] = None
|
|
147
154
|
|
|
148
155
|
_ImplementationCls: Type[
|
|
149
156
|
CalibrateGripperImplementation
|
|
@@ -101,7 +101,7 @@ class CalibrateModule(
|
|
|
101
101
|
|
|
102
102
|
commandType: CalibrateModuleCommandType = "calibration/calibrateModule"
|
|
103
103
|
params: CalibrateModuleParams
|
|
104
|
-
result: Optional[CalibrateModuleResult]
|
|
104
|
+
result: Optional[CalibrateModuleResult] = None
|
|
105
105
|
|
|
106
106
|
_ImplementationCls: Type[
|
|
107
107
|
CalibrateModuleImplementation
|
|
@@ -65,8 +65,8 @@ class CalibratePipetteImplementation(
|
|
|
65
65
|
await ot3_api.save_instrument_offset(mount=ot3_mount, delta=pipette_offset)
|
|
66
66
|
|
|
67
67
|
return SuccessData(
|
|
68
|
-
public=CalibratePipetteResult.
|
|
69
|
-
pipetteOffset=InstrumentOffsetVector.
|
|
68
|
+
public=CalibratePipetteResult.model_construct(
|
|
69
|
+
pipetteOffset=InstrumentOffsetVector.model_construct(
|
|
70
70
|
x=pipette_offset.x, y=pipette_offset.y, z=pipette_offset.z
|
|
71
71
|
)
|
|
72
72
|
),
|
|
@@ -80,7 +80,7 @@ class CalibratePipette(
|
|
|
80
80
|
|
|
81
81
|
commandType: CalibratePipetteCommandType = "calibration/calibratePipette"
|
|
82
82
|
params: CalibratePipetteParams
|
|
83
|
-
result: Optional[CalibratePipetteResult]
|
|
83
|
+
result: Optional[CalibratePipetteResult] = None
|
|
84
84
|
|
|
85
85
|
_ImplementationCls: Type[
|
|
86
86
|
CalibratePipetteImplementation
|
|
@@ -136,7 +136,7 @@ class MoveToMaintenancePosition(
|
|
|
136
136
|
"calibration/moveToMaintenancePosition"
|
|
137
137
|
)
|
|
138
138
|
params: MoveToMaintenancePositionParams
|
|
139
|
-
result: Optional[MoveToMaintenancePositionResult]
|
|
139
|
+
result: Optional[MoveToMaintenancePositionResult] = None
|
|
140
140
|
|
|
141
141
|
_ImplementationCls: Type[
|
|
142
142
|
MoveToMaintenancePositionImplementation
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"""Base command data model and type definitions."""
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
from __future__ import annotations
|
|
5
4
|
|
|
6
5
|
import dataclasses
|
|
7
6
|
from abc import ABC, abstractmethod
|
|
8
7
|
from datetime import datetime
|
|
9
|
-
|
|
8
|
+
import enum
|
|
10
9
|
from typing import (
|
|
11
10
|
TYPE_CHECKING,
|
|
12
11
|
Generic,
|
|
@@ -15,10 +14,12 @@ from typing import (
|
|
|
15
14
|
List,
|
|
16
15
|
Type,
|
|
17
16
|
Union,
|
|
17
|
+
Any,
|
|
18
|
+
Dict,
|
|
18
19
|
)
|
|
19
20
|
|
|
20
21
|
from pydantic import BaseModel, Field
|
|
21
|
-
from pydantic.
|
|
22
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
22
23
|
|
|
23
24
|
from opentrons.hardware_control import HardwareControlAPI
|
|
24
25
|
from opentrons.protocol_engine.state.update_types import StateUpdate
|
|
@@ -41,7 +42,7 @@ _ErrorT = TypeVar("_ErrorT", bound=ErrorOccurrence)
|
|
|
41
42
|
_ErrorT_co = TypeVar("_ErrorT_co", bound=ErrorOccurrence, covariant=True)
|
|
42
43
|
|
|
43
44
|
|
|
44
|
-
class CommandStatus(str, Enum):
|
|
45
|
+
class CommandStatus(str, enum.Enum):
|
|
45
46
|
"""Command execution status."""
|
|
46
47
|
|
|
47
48
|
QUEUED = "queued"
|
|
@@ -50,7 +51,7 @@ class CommandStatus(str, Enum):
|
|
|
50
51
|
FAILED = "failed"
|
|
51
52
|
|
|
52
53
|
|
|
53
|
-
class CommandIntent(str, Enum):
|
|
54
|
+
class CommandIntent(str, enum.Enum):
|
|
54
55
|
"""Run intent for a given command.
|
|
55
56
|
|
|
56
57
|
Props:
|
|
@@ -63,8 +64,12 @@ class CommandIntent(str, Enum):
|
|
|
63
64
|
FIXIT = "fixit"
|
|
64
65
|
|
|
65
66
|
|
|
67
|
+
def _pop_default(s: Dict[str, Any]) -> None:
|
|
68
|
+
s.pop("default", None)
|
|
69
|
+
|
|
70
|
+
|
|
66
71
|
class BaseCommandCreate(
|
|
67
|
-
|
|
72
|
+
BaseModel,
|
|
68
73
|
# These type parameters need to be invariant because our fields are mutable.
|
|
69
74
|
Generic[_ParamsT],
|
|
70
75
|
):
|
|
@@ -82,7 +87,7 @@ class BaseCommandCreate(
|
|
|
82
87
|
),
|
|
83
88
|
)
|
|
84
89
|
params: _ParamsT = Field(..., description="Command execution data payload")
|
|
85
|
-
intent:
|
|
90
|
+
intent: CommandIntent | SkipJsonSchema[None] = Field(
|
|
86
91
|
None,
|
|
87
92
|
description=(
|
|
88
93
|
"The reason the command was added. If not specified or `protocol`,"
|
|
@@ -95,14 +100,16 @@ class BaseCommandCreate(
|
|
|
95
100
|
"Use setup commands for activities like pre-run calibration checks"
|
|
96
101
|
" and module setup, like pre-heating."
|
|
97
102
|
),
|
|
103
|
+
json_schema_extra=_pop_default,
|
|
98
104
|
)
|
|
99
|
-
key:
|
|
105
|
+
key: str | SkipJsonSchema[None] = Field(
|
|
100
106
|
None,
|
|
101
107
|
description=(
|
|
102
108
|
"A key value, unique in this run, that can be used to track"
|
|
103
109
|
" the same logical command across multiple runs of the same protocol."
|
|
104
110
|
" If a value is not provided, one will be generated."
|
|
105
111
|
),
|
|
112
|
+
json_schema_extra=_pop_default,
|
|
106
113
|
)
|
|
107
114
|
|
|
108
115
|
|
|
@@ -144,8 +151,65 @@ class DefinedErrorData(Generic[_ErrorT_co]):
|
|
|
144
151
|
)
|
|
145
152
|
|
|
146
153
|
|
|
154
|
+
_ExecuteReturnT_co = TypeVar(
|
|
155
|
+
"_ExecuteReturnT_co",
|
|
156
|
+
bound=Union[
|
|
157
|
+
SuccessData[BaseModel],
|
|
158
|
+
DefinedErrorData[ErrorOccurrence],
|
|
159
|
+
],
|
|
160
|
+
covariant=True,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class AbstractCommandImpl(
|
|
165
|
+
ABC,
|
|
166
|
+
Generic[_ParamsT_contra, _ExecuteReturnT_co],
|
|
167
|
+
):
|
|
168
|
+
"""Abstract command creation and execution implementation.
|
|
169
|
+
|
|
170
|
+
A given command request should map to a specific command implementation,
|
|
171
|
+
which defines how to execute the command and map data from execution into the
|
|
172
|
+
result model.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
def __init__(
|
|
176
|
+
self,
|
|
177
|
+
state_view: StateView,
|
|
178
|
+
hardware_api: HardwareControlAPI,
|
|
179
|
+
equipment: execution.EquipmentHandler,
|
|
180
|
+
file_provider: execution.FileProvider,
|
|
181
|
+
movement: execution.MovementHandler,
|
|
182
|
+
gantry_mover: execution.GantryMover,
|
|
183
|
+
labware_movement: execution.LabwareMovementHandler,
|
|
184
|
+
pipetting: execution.PipettingHandler,
|
|
185
|
+
tip_handler: execution.TipHandler,
|
|
186
|
+
run_control: execution.RunControlHandler,
|
|
187
|
+
rail_lights: execution.RailLightsHandler,
|
|
188
|
+
model_utils: ModelUtils,
|
|
189
|
+
status_bar: execution.StatusBarHandler,
|
|
190
|
+
command_note_adder: CommandNoteAdder,
|
|
191
|
+
) -> None:
|
|
192
|
+
"""Initialize the command implementation with execution handlers."""
|
|
193
|
+
pass
|
|
194
|
+
|
|
195
|
+
@abstractmethod
|
|
196
|
+
async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co:
|
|
197
|
+
"""Execute the command, mapping data from execution into a response model.
|
|
198
|
+
|
|
199
|
+
This should either:
|
|
200
|
+
|
|
201
|
+
- Return a `SuccessData`, if the command completed normally.
|
|
202
|
+
- Return a `DefinedErrorData`, if the command failed with a "defined error."
|
|
203
|
+
Defined errors are errors that are documented as part of the robot's public
|
|
204
|
+
API.
|
|
205
|
+
- Raise an exception, if the command failed with any other error
|
|
206
|
+
(in other words, an undefined error).
|
|
207
|
+
"""
|
|
208
|
+
...
|
|
209
|
+
|
|
210
|
+
|
|
147
211
|
class BaseCommand(
|
|
148
|
-
|
|
212
|
+
BaseModel,
|
|
149
213
|
# These type parameters need to be invariant because our fields are mutable.
|
|
150
214
|
Generic[_ParamsT, _ResultT, _ErrorT],
|
|
151
215
|
):
|
|
@@ -242,60 +306,3 @@ class BaseCommand(
|
|
|
242
306
|
],
|
|
243
307
|
]
|
|
244
308
|
]
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
_ExecuteReturnT_co = TypeVar(
|
|
248
|
-
"_ExecuteReturnT_co",
|
|
249
|
-
bound=Union[
|
|
250
|
-
SuccessData[BaseModel],
|
|
251
|
-
DefinedErrorData[ErrorOccurrence],
|
|
252
|
-
],
|
|
253
|
-
covariant=True,
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
class AbstractCommandImpl(
|
|
258
|
-
ABC,
|
|
259
|
-
Generic[_ParamsT_contra, _ExecuteReturnT_co],
|
|
260
|
-
):
|
|
261
|
-
"""Abstract command creation and execution implementation.
|
|
262
|
-
|
|
263
|
-
A given command request should map to a specific command implementation,
|
|
264
|
-
which defines how to execute the command and map data from execution into the
|
|
265
|
-
result model.
|
|
266
|
-
"""
|
|
267
|
-
|
|
268
|
-
def __init__(
|
|
269
|
-
self,
|
|
270
|
-
state_view: StateView,
|
|
271
|
-
hardware_api: HardwareControlAPI,
|
|
272
|
-
equipment: execution.EquipmentHandler,
|
|
273
|
-
file_provider: execution.FileProvider,
|
|
274
|
-
movement: execution.MovementHandler,
|
|
275
|
-
gantry_mover: execution.GantryMover,
|
|
276
|
-
labware_movement: execution.LabwareMovementHandler,
|
|
277
|
-
pipetting: execution.PipettingHandler,
|
|
278
|
-
tip_handler: execution.TipHandler,
|
|
279
|
-
run_control: execution.RunControlHandler,
|
|
280
|
-
rail_lights: execution.RailLightsHandler,
|
|
281
|
-
model_utils: ModelUtils,
|
|
282
|
-
status_bar: execution.StatusBarHandler,
|
|
283
|
-
command_note_adder: CommandNoteAdder,
|
|
284
|
-
) -> None:
|
|
285
|
-
"""Initialize the command implementation with execution handlers."""
|
|
286
|
-
pass
|
|
287
|
-
|
|
288
|
-
@abstractmethod
|
|
289
|
-
async def execute(self, params: _ParamsT_contra) -> _ExecuteReturnT_co:
|
|
290
|
-
"""Execute the command, mapping data from execution into a response model.
|
|
291
|
-
|
|
292
|
-
This should either:
|
|
293
|
-
|
|
294
|
-
- Return a `SuccessData`, if the command completed normally.
|
|
295
|
-
- Return a `DefinedErrorData`, if the command failed with a "defined error."
|
|
296
|
-
Defined errors are errors that are documented as part of the robot's public
|
|
297
|
-
API.
|
|
298
|
-
- Raise an exception, if the command failed with any other error
|
|
299
|
-
(in other words, an undefined error).
|
|
300
|
-
"""
|
|
301
|
-
...
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
from collections.abc import Collection
|
|
4
4
|
from typing import Annotated, Type, Union, get_type_hints
|
|
5
5
|
|
|
6
|
-
from pydantic import Field
|
|
6
|
+
from pydantic import Field, TypeAdapter
|
|
7
7
|
|
|
8
8
|
from opentrons.util.get_union_elements import get_union_elements
|
|
9
9
|
|
|
@@ -13,6 +13,7 @@ from .pipetting_common import (
|
|
|
13
13
|
LiquidNotFoundError,
|
|
14
14
|
TipPhysicallyAttachedError,
|
|
15
15
|
)
|
|
16
|
+
from .movement_common import StallOrCollisionError
|
|
16
17
|
|
|
17
18
|
from . import absorbance_reader
|
|
18
19
|
from . import heater_shaker
|
|
@@ -22,6 +23,7 @@ from . import thermocycler
|
|
|
22
23
|
|
|
23
24
|
from . import calibration
|
|
24
25
|
from . import unsafe
|
|
26
|
+
from . import robot
|
|
25
27
|
|
|
26
28
|
from .set_rail_lights import (
|
|
27
29
|
SetRailLights,
|
|
@@ -31,6 +33,14 @@ from .set_rail_lights import (
|
|
|
31
33
|
SetRailLightsResult,
|
|
32
34
|
)
|
|
33
35
|
|
|
36
|
+
from .air_gap_in_place import (
|
|
37
|
+
AirGapInPlace,
|
|
38
|
+
AirGapInPlaceParams,
|
|
39
|
+
AirGapInPlaceCreate,
|
|
40
|
+
AirGapInPlaceResult,
|
|
41
|
+
AirGapInPlaceCommandType,
|
|
42
|
+
)
|
|
43
|
+
|
|
34
44
|
from .aspirate import (
|
|
35
45
|
Aspirate,
|
|
36
46
|
AspirateParams,
|
|
@@ -127,6 +137,14 @@ from .load_liquid import (
|
|
|
127
137
|
LoadLiquidCommandType,
|
|
128
138
|
)
|
|
129
139
|
|
|
140
|
+
from .load_liquid_class import (
|
|
141
|
+
LoadLiquidClass,
|
|
142
|
+
LoadLiquidClassParams,
|
|
143
|
+
LoadLiquidClassCreate,
|
|
144
|
+
LoadLiquidClassResult,
|
|
145
|
+
LoadLiquidClassCommandType,
|
|
146
|
+
)
|
|
147
|
+
|
|
130
148
|
from .load_module import (
|
|
131
149
|
LoadModule,
|
|
132
150
|
LoadModuleParams,
|
|
@@ -143,6 +161,22 @@ from .load_pipette import (
|
|
|
143
161
|
LoadPipetteCommandType,
|
|
144
162
|
)
|
|
145
163
|
|
|
164
|
+
from .load_lid_stack import (
|
|
165
|
+
LoadLidStack,
|
|
166
|
+
LoadLidStackParams,
|
|
167
|
+
LoadLidStackCreate,
|
|
168
|
+
LoadLidStackResult,
|
|
169
|
+
LoadLidStackCommandType,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
from .load_lid import (
|
|
173
|
+
LoadLid,
|
|
174
|
+
LoadLidParams,
|
|
175
|
+
LoadLidCreate,
|
|
176
|
+
LoadLidResult,
|
|
177
|
+
LoadLidCommandType,
|
|
178
|
+
)
|
|
179
|
+
|
|
146
180
|
from .move_labware import (
|
|
147
181
|
GripperMovementError,
|
|
148
182
|
MoveLabware,
|
|
@@ -305,6 +339,14 @@ from .get_tip_presence import (
|
|
|
305
339
|
GetTipPresenceCommandType,
|
|
306
340
|
)
|
|
307
341
|
|
|
342
|
+
from .get_next_tip import (
|
|
343
|
+
GetNextTip,
|
|
344
|
+
GetNextTipCreate,
|
|
345
|
+
GetNextTipParams,
|
|
346
|
+
GetNextTipResult,
|
|
347
|
+
GetNextTipCommandType,
|
|
348
|
+
)
|
|
349
|
+
|
|
308
350
|
from .liquid_probe import (
|
|
309
351
|
LiquidProbe,
|
|
310
352
|
LiquidProbeParams,
|
|
@@ -320,6 +362,7 @@ from .liquid_probe import (
|
|
|
320
362
|
|
|
321
363
|
Command = Annotated[
|
|
322
364
|
Union[
|
|
365
|
+
AirGapInPlace,
|
|
323
366
|
Aspirate,
|
|
324
367
|
AspirateInPlace,
|
|
325
368
|
Comment,
|
|
@@ -337,8 +380,11 @@ Command = Annotated[
|
|
|
337
380
|
LoadLabware,
|
|
338
381
|
ReloadLabware,
|
|
339
382
|
LoadLiquid,
|
|
383
|
+
LoadLiquidClass,
|
|
340
384
|
LoadModule,
|
|
341
385
|
LoadPipette,
|
|
386
|
+
LoadLidStack,
|
|
387
|
+
LoadLid,
|
|
342
388
|
MoveLabware,
|
|
343
389
|
MoveRelative,
|
|
344
390
|
MoveToCoordinates,
|
|
@@ -355,6 +401,7 @@ Command = Annotated[
|
|
|
355
401
|
SetStatusBar,
|
|
356
402
|
VerifyTipPresence,
|
|
357
403
|
GetTipPresence,
|
|
404
|
+
GetNextTip,
|
|
358
405
|
LiquidProbe,
|
|
359
406
|
TryLiquidProbe,
|
|
360
407
|
heater_shaker.WaitForTemperature,
|
|
@@ -393,11 +440,17 @@ Command = Annotated[
|
|
|
393
440
|
unsafe.UnsafeEngageAxes,
|
|
394
441
|
unsafe.UnsafeUngripLabware,
|
|
395
442
|
unsafe.UnsafePlaceLabware,
|
|
443
|
+
robot.MoveTo,
|
|
444
|
+
robot.MoveAxesRelative,
|
|
445
|
+
robot.MoveAxesTo,
|
|
446
|
+
robot.openGripperJaw,
|
|
447
|
+
robot.closeGripperJaw,
|
|
396
448
|
],
|
|
397
449
|
Field(discriminator="commandType"),
|
|
398
450
|
]
|
|
399
451
|
|
|
400
452
|
CommandParams = Union[
|
|
453
|
+
AirGapInPlaceParams,
|
|
401
454
|
AspirateParams,
|
|
402
455
|
AspirateInPlaceParams,
|
|
403
456
|
CommentParams,
|
|
@@ -413,8 +466,11 @@ CommandParams = Union[
|
|
|
413
466
|
HomeParams,
|
|
414
467
|
RetractAxisParams,
|
|
415
468
|
LoadLabwareParams,
|
|
469
|
+
LoadLidStackParams,
|
|
470
|
+
LoadLidParams,
|
|
416
471
|
ReloadLabwareParams,
|
|
417
472
|
LoadLiquidParams,
|
|
473
|
+
LoadLiquidClassParams,
|
|
418
474
|
LoadModuleParams,
|
|
419
475
|
LoadPipetteParams,
|
|
420
476
|
MoveLabwareParams,
|
|
@@ -433,6 +489,7 @@ CommandParams = Union[
|
|
|
433
489
|
SetStatusBarParams,
|
|
434
490
|
VerifyTipPresenceParams,
|
|
435
491
|
GetTipPresenceParams,
|
|
492
|
+
GetNextTipParams,
|
|
436
493
|
LiquidProbeParams,
|
|
437
494
|
TryLiquidProbeParams,
|
|
438
495
|
heater_shaker.WaitForTemperatureParams,
|
|
@@ -471,9 +528,15 @@ CommandParams = Union[
|
|
|
471
528
|
unsafe.UnsafeEngageAxesParams,
|
|
472
529
|
unsafe.UnsafeUngripLabwareParams,
|
|
473
530
|
unsafe.UnsafePlaceLabwareParams,
|
|
531
|
+
robot.MoveAxesRelativeParams,
|
|
532
|
+
robot.MoveAxesToParams,
|
|
533
|
+
robot.MoveToParams,
|
|
534
|
+
robot.openGripperJawParams,
|
|
535
|
+
robot.closeGripperJawParams,
|
|
474
536
|
]
|
|
475
537
|
|
|
476
538
|
CommandType = Union[
|
|
539
|
+
AirGapInPlaceCommandType,
|
|
477
540
|
AspirateCommandType,
|
|
478
541
|
AspirateInPlaceCommandType,
|
|
479
542
|
CommentCommandType,
|
|
@@ -491,8 +554,11 @@ CommandType = Union[
|
|
|
491
554
|
LoadLabwareCommandType,
|
|
492
555
|
ReloadLabwareCommandType,
|
|
493
556
|
LoadLiquidCommandType,
|
|
557
|
+
LoadLiquidClassCommandType,
|
|
494
558
|
LoadModuleCommandType,
|
|
495
559
|
LoadPipetteCommandType,
|
|
560
|
+
LoadLidStackCommandType,
|
|
561
|
+
LoadLidCommandType,
|
|
496
562
|
MoveLabwareCommandType,
|
|
497
563
|
MoveRelativeCommandType,
|
|
498
564
|
MoveToCoordinatesCommandType,
|
|
@@ -509,6 +575,7 @@ CommandType = Union[
|
|
|
509
575
|
SetStatusBarCommandType,
|
|
510
576
|
VerifyTipPresenceCommandType,
|
|
511
577
|
GetTipPresenceCommandType,
|
|
578
|
+
GetNextTipCommandType,
|
|
512
579
|
LiquidProbeCommandType,
|
|
513
580
|
TryLiquidProbeCommandType,
|
|
514
581
|
heater_shaker.WaitForTemperatureCommandType,
|
|
@@ -547,10 +614,16 @@ CommandType = Union[
|
|
|
547
614
|
unsafe.UnsafeEngageAxesCommandType,
|
|
548
615
|
unsafe.UnsafeUngripLabwareCommandType,
|
|
549
616
|
unsafe.UnsafePlaceLabwareCommandType,
|
|
617
|
+
robot.MoveAxesRelativeCommandType,
|
|
618
|
+
robot.MoveAxesToCommandType,
|
|
619
|
+
robot.MoveToCommandType,
|
|
620
|
+
robot.openGripperJawCommandType,
|
|
621
|
+
robot.closeGripperJawCommandType,
|
|
550
622
|
]
|
|
551
623
|
|
|
552
624
|
CommandCreate = Annotated[
|
|
553
625
|
Union[
|
|
626
|
+
AirGapInPlaceCreate,
|
|
554
627
|
AspirateCreate,
|
|
555
628
|
AspirateInPlaceCreate,
|
|
556
629
|
CommentCreate,
|
|
@@ -568,8 +641,11 @@ CommandCreate = Annotated[
|
|
|
568
641
|
LoadLabwareCreate,
|
|
569
642
|
ReloadLabwareCreate,
|
|
570
643
|
LoadLiquidCreate,
|
|
644
|
+
LoadLiquidClassCreate,
|
|
571
645
|
LoadModuleCreate,
|
|
572
646
|
LoadPipetteCreate,
|
|
647
|
+
LoadLidStackCreate,
|
|
648
|
+
LoadLidCreate,
|
|
573
649
|
MoveLabwareCreate,
|
|
574
650
|
MoveRelativeCreate,
|
|
575
651
|
MoveToCoordinatesCreate,
|
|
@@ -586,6 +662,7 @@ CommandCreate = Annotated[
|
|
|
586
662
|
SetStatusBarCreate,
|
|
587
663
|
VerifyTipPresenceCreate,
|
|
588
664
|
GetTipPresenceCreate,
|
|
665
|
+
GetNextTipCreate,
|
|
589
666
|
LiquidProbeCreate,
|
|
590
667
|
TryLiquidProbeCreate,
|
|
591
668
|
heater_shaker.WaitForTemperatureCreate,
|
|
@@ -624,11 +701,24 @@ CommandCreate = Annotated[
|
|
|
624
701
|
unsafe.UnsafeEngageAxesCreate,
|
|
625
702
|
unsafe.UnsafeUngripLabwareCreate,
|
|
626
703
|
unsafe.UnsafePlaceLabwareCreate,
|
|
704
|
+
robot.MoveAxesRelativeCreate,
|
|
705
|
+
robot.MoveAxesToCreate,
|
|
706
|
+
robot.MoveToCreate,
|
|
707
|
+
robot.openGripperJawCreate,
|
|
708
|
+
robot.closeGripperJawCreate,
|
|
627
709
|
],
|
|
628
710
|
Field(discriminator="commandType"),
|
|
629
711
|
]
|
|
630
712
|
|
|
713
|
+
# Each time a TypeAdapter is instantiated, it will construct a new validator and
|
|
714
|
+
# serializer. To improve performance, TypeAdapters are instantiated once.
|
|
715
|
+
# See https://docs.pydantic.dev/latest/concepts/performance/#typeadapter-instantiated-once
|
|
716
|
+
CommandCreateAdapter: TypeAdapter[CommandCreate] = TypeAdapter(CommandCreate)
|
|
717
|
+
|
|
718
|
+
CommandAdapter: TypeAdapter[Command] = TypeAdapter(Command)
|
|
719
|
+
|
|
631
720
|
CommandResult = Union[
|
|
721
|
+
AirGapInPlaceResult,
|
|
632
722
|
AspirateResult,
|
|
633
723
|
AspirateInPlaceResult,
|
|
634
724
|
CommentResult,
|
|
@@ -646,8 +736,11 @@ CommandResult = Union[
|
|
|
646
736
|
LoadLabwareResult,
|
|
647
737
|
ReloadLabwareResult,
|
|
648
738
|
LoadLiquidResult,
|
|
739
|
+
LoadLiquidClassResult,
|
|
649
740
|
LoadModuleResult,
|
|
650
741
|
LoadPipetteResult,
|
|
742
|
+
LoadLidStackResult,
|
|
743
|
+
LoadLidResult,
|
|
651
744
|
MoveLabwareResult,
|
|
652
745
|
MoveRelativeResult,
|
|
653
746
|
MoveToCoordinatesResult,
|
|
@@ -664,6 +757,7 @@ CommandResult = Union[
|
|
|
664
757
|
SetStatusBarResult,
|
|
665
758
|
VerifyTipPresenceResult,
|
|
666
759
|
GetTipPresenceResult,
|
|
760
|
+
GetNextTipResult,
|
|
667
761
|
LiquidProbeResult,
|
|
668
762
|
TryLiquidProbeResult,
|
|
669
763
|
heater_shaker.WaitForTemperatureResult,
|
|
@@ -702,6 +796,11 @@ CommandResult = Union[
|
|
|
702
796
|
unsafe.UnsafeEngageAxesResult,
|
|
703
797
|
unsafe.UnsafeUngripLabwareResult,
|
|
704
798
|
unsafe.UnsafePlaceLabwareResult,
|
|
799
|
+
robot.MoveAxesRelativeResult,
|
|
800
|
+
robot.MoveAxesToResult,
|
|
801
|
+
robot.MoveToResult,
|
|
802
|
+
robot.openGripperJawResult,
|
|
803
|
+
robot.closeGripperJawResult,
|
|
705
804
|
]
|
|
706
805
|
|
|
707
806
|
|
|
@@ -712,6 +811,7 @@ CommandDefinedErrorData = Union[
|
|
|
712
811
|
DefinedErrorData[OverpressureError],
|
|
713
812
|
DefinedErrorData[LiquidNotFoundError],
|
|
714
813
|
DefinedErrorData[GripperMovementError],
|
|
814
|
+
DefinedErrorData[StallOrCollisionError],
|
|
715
815
|
]
|
|
716
816
|
|
|
717
817
|
|
|
@@ -43,7 +43,7 @@ class Comment(BaseCommand[CommentParams, CommentResult, ErrorOccurrence]):
|
|
|
43
43
|
|
|
44
44
|
commandType: CommentCommandType = "comment"
|
|
45
45
|
params: CommentParams
|
|
46
|
-
result: Optional[CommentResult]
|
|
46
|
+
result: Optional[CommentResult] = None
|
|
47
47
|
|
|
48
48
|
_ImplementationCls: Type[CommentImplementation] = CommentImplementation
|
|
49
49
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"""Configure for volume command request, result, and implementation models."""
|
|
2
2
|
from __future__ import annotations
|
|
3
|
+
from typing import TYPE_CHECKING, Optional, Type, Any
|
|
4
|
+
|
|
3
5
|
from pydantic import BaseModel, Field
|
|
4
|
-
from
|
|
6
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
5
7
|
from typing_extensions import Literal
|
|
6
8
|
|
|
7
9
|
from .pipetting_common import PipetteIdMixin
|
|
@@ -16,6 +18,10 @@ if TYPE_CHECKING:
|
|
|
16
18
|
ConfigureForVolumeCommandType = Literal["configureForVolume"]
|
|
17
19
|
|
|
18
20
|
|
|
21
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
22
|
+
s.pop("default", None)
|
|
23
|
+
|
|
24
|
+
|
|
19
25
|
class ConfigureForVolumeParams(PipetteIdMixin):
|
|
20
26
|
"""Parameters required to configure volume for a specific pipette."""
|
|
21
27
|
|
|
@@ -25,12 +31,13 @@ class ConfigureForVolumeParams(PipetteIdMixin):
|
|
|
25
31
|
"than a pipette-specific maximum volume.",
|
|
26
32
|
ge=0,
|
|
27
33
|
)
|
|
28
|
-
tipOverlapNotAfterVersion:
|
|
34
|
+
tipOverlapNotAfterVersion: str | SkipJsonSchema[None] = Field(
|
|
29
35
|
None,
|
|
30
36
|
description="A version of tip overlap data to not exceed. The highest-versioned "
|
|
31
37
|
"tip overlap data that does not exceed this version will be used. Versions are "
|
|
32
38
|
"expressed as vN where N is an integer, counting up from v0. If None, the current "
|
|
33
39
|
"highest version will be used.",
|
|
40
|
+
json_schema_extra=_remove_default,
|
|
34
41
|
)
|
|
35
42
|
|
|
36
43
|
|
|
@@ -81,7 +88,7 @@ class ConfigureForVolume(
|
|
|
81
88
|
|
|
82
89
|
commandType: ConfigureForVolumeCommandType = "configureForVolume"
|
|
83
90
|
params: ConfigureForVolumeParams
|
|
84
|
-
result: Optional[ConfigureForVolumeResult]
|
|
91
|
+
result: Optional[ConfigureForVolumeResult] = None
|
|
85
92
|
|
|
86
93
|
_ImplementationCls: Type[
|
|
87
94
|
ConfigureForVolumeImplementation
|
|
@@ -61,9 +61,11 @@ class ConfigureNozzleLayoutImplementation(
|
|
|
61
61
|
self, params: ConfigureNozzleLayoutParams
|
|
62
62
|
) -> SuccessData[ConfigureNozzleLayoutResult]:
|
|
63
63
|
"""Check that requested pipette can support the requested nozzle layout."""
|
|
64
|
-
primary_nozzle = params.configurationParams.
|
|
65
|
-
front_right_nozzle = params.configurationParams.
|
|
66
|
-
|
|
64
|
+
primary_nozzle = params.configurationParams.model_dump().get("primaryNozzle")
|
|
65
|
+
front_right_nozzle = params.configurationParams.model_dump().get(
|
|
66
|
+
"frontRightNozzle"
|
|
67
|
+
)
|
|
68
|
+
back_left_nozzle = params.configurationParams.model_dump().get("backLeftNozzle")
|
|
67
69
|
nozzle_params = await self._tip_handler.available_for_nozzle_layout(
|
|
68
70
|
pipette_id=params.pipetteId,
|
|
69
71
|
style=params.configurationParams.style,
|
|
@@ -97,7 +99,7 @@ class ConfigureNozzleLayout(
|
|
|
97
99
|
|
|
98
100
|
commandType: ConfigureNozzleLayoutCommandType = "configureNozzleLayout"
|
|
99
101
|
params: ConfigureNozzleLayoutParams
|
|
100
|
-
result: Optional[ConfigureNozzleLayoutResult]
|
|
102
|
+
result: Optional[ConfigureNozzleLayoutResult] = None
|
|
101
103
|
|
|
102
104
|
_ImplementationCls: Type[
|
|
103
105
|
ConfigureNozzleLayoutImplementation
|