opentrons 8.3.0a4__py2.py3-none-any.whl → 8.3.0a6__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.

@@ -115,8 +115,23 @@ class Well:
115
115
  @property
116
116
  @requires_version(2, 0)
117
117
  def has_tip(self) -> bool:
118
- """Whether this well contains a tip. Always ``False`` if the parent labware
119
- isn't a tip rack."""
118
+ """Whether this well contains an unused tip.
119
+
120
+ From API v2.2 on:
121
+
122
+ - Returns ``False`` if:
123
+
124
+ - the well has no tip present, or
125
+ - the well has a tip that's been used by the protocol previously
126
+
127
+ - Returns ``True`` if the well has an unused tip.
128
+
129
+ Before API v2.2:
130
+
131
+ - Returns ``True`` as long as the well has a tip, even if it is used.
132
+
133
+ Always ``False`` if the parent labware isn't a tip rack.
134
+ """
120
135
  return self._core.has_tip()
121
136
 
122
137
  @has_tip.setter
@@ -1,12 +1,17 @@
1
1
  """Drop tip in place command request, result, and implementation models."""
2
2
  from __future__ import annotations
3
3
 
4
- from typing import TYPE_CHECKING, Optional, Type, Any
4
+ from typing import TYPE_CHECKING, Optional, Type, Any, Union
5
5
 
6
6
  from pydantic import Field, BaseModel
7
7
  from pydantic.json_schema import SkipJsonSchema
8
8
  from typing_extensions import Literal
9
9
 
10
+ from opentrons_shared_data.errors.exceptions import (
11
+ PipetteOverpressureError,
12
+ StallOrCollisionDetectedError,
13
+ )
14
+
10
15
  from .command import (
11
16
  AbstractCommandImpl,
12
17
  BaseCommand,
@@ -14,7 +19,12 @@ from .command import (
14
19
  DefinedErrorData,
15
20
  SuccessData,
16
21
  )
17
- from .pipetting_common import PipetteIdMixin, TipPhysicallyAttachedError
22
+ from .movement_common import StallOrCollisionError
23
+ from .pipetting_common import (
24
+ PipetteIdMixin,
25
+ TipPhysicallyAttachedError,
26
+ OverpressureError,
27
+ )
18
28
  from ..errors.exceptions import TipAttachedError
19
29
  from ..errors.error_occurrence import ErrorOccurrence
20
30
  from ..resources.model_utils import ModelUtils
@@ -51,9 +61,12 @@ class DropTipInPlaceResult(BaseModel):
51
61
  pass
52
62
 
53
63
 
54
- _ExecuteReturn = (
55
- SuccessData[DropTipInPlaceResult] | DefinedErrorData[TipPhysicallyAttachedError]
56
- )
64
+ _ExecuteReturn = Union[
65
+ SuccessData[DropTipInPlaceResult]
66
+ | DefinedErrorData[TipPhysicallyAttachedError]
67
+ | DefinedErrorData[OverpressureError]
68
+ | DefinedErrorData[StallOrCollisionError]
69
+ ]
57
70
 
58
71
 
59
72
  class DropTipInPlaceImplementation(
@@ -105,6 +118,50 @@ class DropTipInPlaceImplementation(
105
118
  state_update=state_update,
106
119
  state_update_if_false_positive=state_update_if_false_positive,
107
120
  )
121
+ except PipetteOverpressureError as exception:
122
+ state_update_if_false_positive = update_types.StateUpdate()
123
+ state_update_if_false_positive.update_pipette_tip_state(
124
+ pipette_id=params.pipetteId, tip_geometry=None
125
+ )
126
+ state_update.set_fluid_unknown(pipette_id=params.pipetteId)
127
+ return DefinedErrorData(
128
+ public=OverpressureError(
129
+ id=self._model_utils.generate_id(),
130
+ createdAt=self._model_utils.get_timestamp(),
131
+ wrappedErrors=[
132
+ ErrorOccurrence.from_failed(
133
+ id=self._model_utils.generate_id(),
134
+ createdAt=self._model_utils.get_timestamp(),
135
+ error=exception,
136
+ )
137
+ ],
138
+ errorInfo={"retryLocation": retry_location},
139
+ ),
140
+ state_update=state_update,
141
+ state_update_if_false_positive=state_update_if_false_positive,
142
+ )
143
+ except StallOrCollisionDetectedError as exception:
144
+ state_update_if_false_positive = update_types.StateUpdate()
145
+ state_update_if_false_positive.update_pipette_tip_state(
146
+ pipette_id=params.pipetteId, tip_geometry=None
147
+ )
148
+ state_update.set_fluid_unknown(pipette_id=params.pipetteId)
149
+ return DefinedErrorData(
150
+ public=StallOrCollisionError(
151
+ id=self._model_utils.generate_id(),
152
+ createdAt=self._model_utils.get_timestamp(),
153
+ wrappedErrors=[
154
+ ErrorOccurrence.from_failed(
155
+ id=self._model_utils.generate_id(),
156
+ createdAt=self._model_utils.get_timestamp(),
157
+ error=exception,
158
+ )
159
+ ],
160
+ errorInfo={"retryLocation": retry_location},
161
+ ),
162
+ state_update=state_update,
163
+ state_update_if_false_positive=state_update_if_false_positive,
164
+ )
108
165
  else:
109
166
  state_update.set_fluid_unknown(pipette_id=params.pipetteId)
110
167
  state_update.update_pipette_tip_state(
@@ -114,7 +171,11 @@ class DropTipInPlaceImplementation(
114
171
 
115
172
 
116
173
  class DropTipInPlace(
117
- BaseCommand[DropTipInPlaceParams, DropTipInPlaceResult, TipPhysicallyAttachedError]
174
+ BaseCommand[
175
+ DropTipInPlaceParams,
176
+ DropTipInPlaceResult,
177
+ TipPhysicallyAttachedError | OverpressureError | StallOrCollisionError,
178
+ ]
118
179
  ):
119
180
  """Drop tip in place command model."""
120
181
 
@@ -44,6 +44,7 @@ EvotipSealPipetteCommandType = Literal["evotipSealPipette"]
44
44
  _PREP_DISTANCE_DEFAULT = 8.25
45
45
  _PRESS_DISTANCE_DEFAULT = 3.5
46
46
  _EJECTOR_PUSH_MM_DEFAULT = 7.0
47
+ _SAFE_TOP_VOLUME = 400
47
48
 
48
49
 
49
50
  class TipPickUpParams(BaseModel):
@@ -240,7 +241,6 @@ class EvotipSealPipetteImplementation(
240
241
  tip_geometry = self._state_view.geometry.get_nominal_tip_geometry(
241
242
  pipette_id, labware_id, well_name
242
243
  )
243
- maximum_volume = self._state_view.pipettes.get_maximum_volume(pipette_id)
244
244
  if self._state_view.pipettes.get_mount(pipette_id) == MountType.LEFT:
245
245
  await self._hardware_api.home(axes=[Axis.P_L])
246
246
  else:
@@ -281,7 +281,7 @@ class EvotipSealPipetteImplementation(
281
281
  self._tip_handler.cache_tip(pipette_id, tip_geometry)
282
282
  hw_instr = self._hardware_api.hardware_instruments[mount.to_hw_mount()]
283
283
  if hw_instr is not None:
284
- hw_instr.set_current_volume(maximum_volume)
284
+ hw_instr.set_current_volume(_SAFE_TOP_VOLUME)
285
285
 
286
286
  state_update = StateUpdate()
287
287
  state_update.update_pipette_tip_state(
@@ -291,7 +291,7 @@ class EvotipSealPipetteImplementation(
291
291
 
292
292
  state_update.set_fluid_aspirated(
293
293
  pipette_id=pipette_id,
294
- fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=maximum_volume),
294
+ fluid=AspiratedFluid(kind=FluidKind.LIQUID, volume=_SAFE_TOP_VOLUME),
295
295
  )
296
296
  return SuccessData(
297
297
  public=EvotipSealPipetteResult(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.3.0a4
3
+ Version: 8.3.0a6
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data (==8.3.0a4)
24
+ Requires-Dist: opentrons-shared-data (==8.3.0a6)
25
25
  Requires-Dist: aionotify (==0.3.1)
26
26
  Requires-Dist: anyio (<4.0.0,>=3.6.1)
27
27
  Requires-Dist: jsonschema (<4.18.0,>=3.0.1)
@@ -35,9 +35,9 @@ Requires-Dist: pyusb (==1.2.1)
35
35
  Requires-Dist: packaging (>=21.0)
36
36
  Requires-Dist: importlib-metadata (>=1.0) ; python_version < "3.8"
37
37
  Provides-Extra: flex-hardware
38
- Requires-Dist: opentrons-hardware[flex] (==8.3.0a4) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.3.0a6) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.3.0a4) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.3.0a6) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -227,7 +227,7 @@ opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau32
227
227
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
228
228
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
229
229
  opentrons/protocol_api/instrument_context.py,sha256=m6J8W5J9jy-gHU5f5A_hoFtAt1v3iP7Q0uKKgL8bEWo,107284
230
- opentrons/protocol_api/labware.py,sha256=3pTaZlk7tbhY0wU9eNoq8ivaRC1uBo1h2f7eAZoLmHY,58879
230
+ opentrons/protocol_api/labware.py,sha256=mgnk1SiiN4CnBwBUolE4C4gRaBZqAoLylsJANPCyWHU,59241
231
231
  opentrons/protocol_api/module_contexts.py,sha256=jU3IMPE5L78-KuZRfaPwB6xO0kiTup65IteqMPFOFR0,42262
232
232
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
233
233
  opentrons/protocol_api/protocol_context.py,sha256=Y9jCj1t3wzawarPyOVcp-8qUmEnIhpyVSaHujVfT9Nk,60601
@@ -303,9 +303,9 @@ opentrons/protocol_engine/commands/custom.py,sha256=vOJc7QSNnYTpLvJm98OfDKjgcvVF
303
303
  opentrons/protocol_engine/commands/dispense.py,sha256=wbDBDpc80c14AudywUoFTQYWPL8EJHirtSfrEMDZyNY,6293
304
304
  opentrons/protocol_engine/commands/dispense_in_place.py,sha256=h2ASkZW-PlrJViN7ZNBDaaklIeF5n3sZkIAdrPcTqgA,6147
305
305
  opentrons/protocol_engine/commands/drop_tip.py,sha256=2L4tGsDFh8xQwro5FKiZ6onVgo5FRpGVe708vvhsDs4,6900
306
- opentrons/protocol_engine/commands/drop_tip_in_place.py,sha256=pVC0Yh_LkRTuTjzmFJufBWDlgRyMT8sJBl3TLAZFSUc,4497
306
+ opentrons/protocol_engine/commands/drop_tip_in_place.py,sha256=gwSNEKBwds7kOTucXKSK74ozrDe7Cqhta7NR6IqKV3g,7062
307
307
  opentrons/protocol_engine/commands/evotip_dispense.py,sha256=RKnItIOHJHTa0J_SioyWI2s4DuRrbnakA6lGp6UrPXI,4847
308
- opentrons/protocol_engine/commands/evotip_seal_pipette.py,sha256=iVDD349BjD6eKCX8Oft57a51g45IXWTIDEcWUD4rt_A,11529
308
+ opentrons/protocol_engine/commands/evotip_seal_pipette.py,sha256=N2vCLnH9TQ9AuRfikHk7StJ_LU1wQFd8U3ppP-0BcD4,11474
309
309
  opentrons/protocol_engine/commands/evotip_unseal_pipette.py,sha256=JBhG8Kbu5PFrDa5b_Q8n-O582oq55ZgPn65kUAZwh0A,5363
310
310
  opentrons/protocol_engine/commands/generate_command_schema.py,sha256=OzjMuHNJ7uCyjA7XBrQ18-j0L48W2kLPDFJ6FBM5aUo,1184
311
311
  opentrons/protocol_engine/commands/get_next_tip.py,sha256=JS5hN_UScAiUIo_j7KT2cR1GDj3hDvaNPTSovWbgTHo,4828
@@ -542,9 +542,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
542
542
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
543
543
  opentrons/util/logging_config.py,sha256=UHoY7dyD6WMYNP5GKowbMxUSG_hlXeI5TaIwksR5u-U,6887
544
544
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
545
- opentrons-8.3.0a4.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
546
- opentrons-8.3.0a4.dist-info/METADATA,sha256=M5vBqNCZm84LMzjXCjdAB6wg2EcmgU4wBjc2Mb4xqok,5084
547
- opentrons-8.3.0a4.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
548
- opentrons-8.3.0a4.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
549
- opentrons-8.3.0a4.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
550
- opentrons-8.3.0a4.dist-info/RECORD,,
545
+ opentrons-8.3.0a6.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
546
+ opentrons-8.3.0a6.dist-info/METADATA,sha256=0ZetIpIpjcnrdK1c9_Av3ywG2PzAnBw7qfiHG_Yfi-c,5084
547
+ opentrons-8.3.0a6.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
548
+ opentrons-8.3.0a6.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
549
+ opentrons-8.3.0a6.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
550
+ opentrons-8.3.0a6.dist-info/RECORD,,