opentrons 8.7.0a4__py3-none-any.whl → 8.7.0a6__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/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '8.7.0a4'
32
- __version_tuple__ = version_tuple = (8, 7, 0, 'a4')
31
+ __version__ = version = '8.7.0a6'
32
+ __version_tuple__ = version_tuple = (8, 7, 0, 'a6')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -14,8 +14,9 @@ from opentrons_shared_data.pipette.types import (
14
14
  PipetteModel,
15
15
  PipetteName,
16
16
  ChannelCount,
17
+ PipetteTipType,
18
+ LiquidClasses,
17
19
  )
18
- from opentrons_shared_data.pipette.types import PipetteTipType
19
20
  from opentrons_shared_data.pipette.pipette_definition import (
20
21
  PipetteConfigurations,
21
22
  SupportedTipsDefinition,
@@ -104,6 +105,7 @@ class PipetteDict(InstrumentDict):
104
105
  plunger_positions: Dict[str, float]
105
106
  shaft_ul_per_mm: float
106
107
  available_sensors: AvailableSensorDefinition
108
+ volume_mode: LiquidClasses # LiquidClasses refer to volume mode in this context
107
109
 
108
110
 
109
111
  class PipetteStateDict(TypedDict):
@@ -267,6 +267,7 @@ class PipetteHandlerProvider(Generic[MountType]):
267
267
  "drop_tip": instr.plunger_positions.drop_tip,
268
268
  }
269
269
  result["shaft_ul_per_mm"] = instr.config.shaft_ul_per_mm
270
+ result["volume_mode"] = instr.liquid_class_name
270
271
  return cast(PipetteDict, result)
271
272
 
272
273
  @property
@@ -294,6 +294,7 @@ class OT3PipetteHandler:
294
294
  }
295
295
  result["shaft_ul_per_mm"] = instr.config.shaft_ul_per_mm
296
296
  result["available_sensors"] = instr.config.available_sensors
297
+ result["volume_mode"] = instr.liquid_class_name
297
298
  return cast(PipetteDict, result)
298
299
 
299
300
  @property
@@ -66,7 +66,6 @@ from opentrons.protocol_engine.types.automatic_tip_selection import (
66
66
  )
67
67
  from opentrons.protocol_engine.errors.exceptions import TipNotAttachedError
68
68
  from opentrons.protocol_engine.clients import SyncClient as EngineClient
69
- from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
70
69
  from opentrons_shared_data.pipette.types import (
71
70
  PIPETTE_API_NAMES_MAP,
72
71
  LIQUID_PROBE_START_OFFSET_FROM_WELL_TOP,
@@ -101,6 +100,9 @@ _RESIN_TIP_DEFAULT_FLOW_RATE = 10.0
101
100
  _FLEX_PIPETTE_NAMES_FIXED_IN = APIVersion(2, 23)
102
101
  """The version after which InstrumentContext.name returns the correct API-specific names of Flex pipettes."""
103
102
 
103
+ _DEFAULT_FLOW_RATE_BUG_FIXED_IN = APIVersion(2, 26)
104
+ """The version after which default flow rates correctly update when pipette tip or volume changes."""
105
+
104
106
 
105
107
  class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
106
108
  """Instrument API core using a ProtocolEngine.
@@ -122,18 +124,27 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
122
124
  self._sync_hardware_api = sync_hardware_api
123
125
  self._protocol_core = protocol_core
124
126
 
125
- # TODO(jbl 2022-11-03) flow_rates should not live in the cores, and should be moved to the protocol context
126
- # along with other rate related refactors (for the hardware API)
127
- flow_rates = self._engine_client.state.pipettes.get_flow_rates(pipette_id)
128
- self._aspirate_flow_rate = find_value_for_api_version(
129
- MAX_SUPPORTED_VERSION, flow_rates.default_aspirate
130
- )
131
- self._dispense_flow_rate = find_value_for_api_version(
132
- MAX_SUPPORTED_VERSION, flow_rates.default_dispense
133
- )
134
- self._blow_out_flow_rate = find_value_for_api_version(
135
- MAX_SUPPORTED_VERSION, flow_rates.default_blow_out
127
+ self._initial_default_flow_rates = (
128
+ self._engine_client.state.pipettes.get_flow_rates(pipette_id)
136
129
  )
130
+ self._user_aspirate_flow_rate: Optional[float] = None
131
+ self._user_dispense_flow_rate: Optional[float] = None
132
+ self._user_blow_out_flow_rate: Optional[float] = None
133
+
134
+ if self._protocol_core.api_version < _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
135
+ # Set to the initial defaults to preserve buggy behavior where the default was not correctly updated
136
+ self._user_aspirate_flow_rate = find_value_for_api_version(
137
+ self._protocol_core.api_version,
138
+ self._initial_default_flow_rates.default_aspirate,
139
+ )
140
+ self._user_dispense_flow_rate = find_value_for_api_version(
141
+ self._protocol_core.api_version,
142
+ self._initial_default_flow_rates.default_dispense,
143
+ )
144
+ self._user_blow_out_flow_rate = find_value_for_api_version(
145
+ self._protocol_core.api_version,
146
+ self._initial_default_flow_rates.default_blow_out,
147
+ )
137
148
  self._flow_rates = FlowRates(self)
138
149
 
139
150
  self.set_default_speed(speed=default_movement_speed)
@@ -1031,13 +1042,64 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1031
1042
  return self._flow_rates
1032
1043
 
1033
1044
  def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
1034
- return self._aspirate_flow_rate * rate
1045
+ """Returns the user-set aspirate flow rate if that's been modified, otherwise return the default.
1046
+
1047
+ Note that in API versions 2.25 and below `_user_aspirate_flow_rate` will automatically be set to the initial
1048
+ default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
1049
+ buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
1050
+ had its volume configuration changed.
1051
+ """
1052
+ aspirate_flow_rate = (
1053
+ self._user_aspirate_flow_rate
1054
+ or find_value_for_api_version(
1055
+ self._protocol_core.api_version,
1056
+ self._engine_client.state.pipettes.get_flow_rates(
1057
+ self._pipette_id
1058
+ ).default_aspirate,
1059
+ )
1060
+ )
1061
+
1062
+ return aspirate_flow_rate * rate
1035
1063
 
1036
1064
  def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
1037
- return self._dispense_flow_rate * rate
1065
+ """Returns the user-set dispense flow rate if that's been modified, otherwise return the default.
1066
+
1067
+ Note that in API versions 2.25 and below `_user_dispense_flow_rate` will automatically be set to the initial
1068
+ default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
1069
+ buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
1070
+ had its volume configuration changed.
1071
+ """
1072
+ dispense_flow_rate = (
1073
+ self._user_dispense_flow_rate
1074
+ or find_value_for_api_version(
1075
+ self._protocol_core.api_version,
1076
+ self._engine_client.state.pipettes.get_flow_rates(
1077
+ self._pipette_id
1078
+ ).default_dispense,
1079
+ )
1080
+ )
1081
+
1082
+ return dispense_flow_rate * rate
1038
1083
 
1039
1084
  def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
1040
- return self._blow_out_flow_rate * rate
1085
+ """Returns the user-set blow-out flow rate if that's been modified, otherwise return the default.
1086
+
1087
+ Note that in API versions 2.25 and below `_user_dispense_flow_rate` will automatically be set to the initial
1088
+ default flow rate when the pipette is loaded (which is the same as the max tip capacity). This is to preserve
1089
+ buggy behavior in which the default was never correctly updated when the pipette picked up or dropped a tip or
1090
+ had its volume configuration changed.
1091
+ """
1092
+ blow_out_flow_rate = (
1093
+ self._user_blow_out_flow_rate
1094
+ or find_value_for_api_version(
1095
+ self._protocol_core.api_version,
1096
+ self._engine_client.state.pipettes.get_flow_rates(
1097
+ self._pipette_id
1098
+ ).default_blow_out,
1099
+ )
1100
+ )
1101
+
1102
+ return blow_out_flow_rate * rate
1041
1103
 
1042
1104
  def get_nozzle_configuration(self) -> NozzleConfigurationType:
1043
1105
  return self._engine_client.state.pipettes.get_nozzle_layout_type(
@@ -1084,13 +1146,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1084
1146
  ) -> None:
1085
1147
  if aspirate is not None:
1086
1148
  assert aspirate > 0
1087
- self._aspirate_flow_rate = aspirate
1149
+ self._user_aspirate_flow_rate = aspirate
1088
1150
  if dispense is not None:
1089
1151
  assert dispense > 0
1090
- self._dispense_flow_rate = dispense
1152
+ self._user_dispense_flow_rate = dispense
1091
1153
  if blow_out is not None:
1092
1154
  assert blow_out > 0
1093
- self._blow_out_flow_rate = blow_out
1155
+ self._user_blow_out_flow_rate = blow_out
1094
1156
 
1095
1157
  def set_liquid_presence_detection(self, enable: bool) -> None:
1096
1158
  self._liquid_presence_detection = enable
@@ -1105,6 +1167,10 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1105
1167
  ),
1106
1168
  )
1107
1169
  )
1170
+ if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
1171
+ self._user_aspirate_flow_rate = None
1172
+ self._user_dispense_flow_rate = None
1173
+ self._user_blow_out_flow_rate = None
1108
1174
 
1109
1175
  def prepare_to_aspirate(self) -> None:
1110
1176
  self._engine_client.execute_command(
@@ -1273,6 +1339,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1273
1339
  tiprack_uri=tiprack_uri_for_transfer_props,
1274
1340
  )
1275
1341
 
1342
+ original_aspirate_flow_rate = self._user_aspirate_flow_rate
1343
+ original_dispense_flow_rate = self._user_dispense_flow_rate
1344
+ original_blow_out_flow_rate = self._user_blow_out_flow_rate
1345
+ in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
1346
+ self._pipette_id
1347
+ )
1348
+
1276
1349
  target_destinations: Sequence[
1277
1350
  Union[Tuple[Location, WellCore], TrashBin, WasteChute]
1278
1351
  ]
@@ -1367,6 +1440,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1367
1440
  if not keep_last_tip:
1368
1441
  self._drop_tip_for_liquid_class(trash_location, return_tip)
1369
1442
 
1443
+ if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
1444
+ self._restore_pipette_flow_rates_and_volume_mode(
1445
+ aspirate_flow_rate=original_aspirate_flow_rate,
1446
+ dispense_flow_rate=original_dispense_flow_rate,
1447
+ blow_out_flow_rate=original_blow_out_flow_rate,
1448
+ is_low_volume=in_low_volume_mode,
1449
+ )
1450
+
1370
1451
  def distribute_with_liquid_class( # noqa: C901
1371
1452
  self,
1372
1453
  liquid_class: LiquidClass,
@@ -1474,6 +1555,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1474
1555
  tiprack_uri=tiprack_uri_for_transfer_props,
1475
1556
  )
1476
1557
 
1558
+ original_aspirate_flow_rate = self._user_aspirate_flow_rate
1559
+ original_dispense_flow_rate = self._user_dispense_flow_rate
1560
+ original_blow_out_flow_rate = self._user_blow_out_flow_rate
1561
+ in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
1562
+ self._pipette_id
1563
+ )
1564
+
1477
1565
  # This will return a generator that provides pairs of destination well and
1478
1566
  # the volume to dispense into it
1479
1567
  dest_per_volume_step = (
@@ -1617,6 +1705,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1617
1705
  if not keep_last_tip:
1618
1706
  self._drop_tip_for_liquid_class(trash_location, return_tip)
1619
1707
 
1708
+ if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
1709
+ self._restore_pipette_flow_rates_and_volume_mode(
1710
+ aspirate_flow_rate=original_aspirate_flow_rate,
1711
+ dispense_flow_rate=original_dispense_flow_rate,
1712
+ blow_out_flow_rate=original_blow_out_flow_rate,
1713
+ is_low_volume=in_low_volume_mode,
1714
+ )
1715
+
1620
1716
  def _tip_can_hold_volume_for_multi_dispensing(
1621
1717
  self,
1622
1718
  transfer_volume: float,
@@ -1712,6 +1808,13 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1712
1808
  tiprack_uri=tiprack_uri_for_transfer_props,
1713
1809
  )
1714
1810
 
1811
+ original_aspirate_flow_rate = self._user_aspirate_flow_rate
1812
+ original_dispense_flow_rate = self._user_dispense_flow_rate
1813
+ original_blow_out_flow_rate = self._user_blow_out_flow_rate
1814
+ in_low_volume_mode = self._engine_client.state.pipettes.get_is_low_volume_mode(
1815
+ self._pipette_id
1816
+ )
1817
+
1715
1818
  working_volume = self.get_working_volume_for_tip_rack(tip_racks[0][1])
1716
1819
 
1717
1820
  source_per_volume_step = (
@@ -1796,6 +1899,14 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1796
1899
  if not keep_last_tip:
1797
1900
  self._drop_tip_for_liquid_class(trash_location, return_tip)
1798
1901
 
1902
+ if self._protocol_core.api_version >= _DEFAULT_FLOW_RATE_BUG_FIXED_IN:
1903
+ self._restore_pipette_flow_rates_and_volume_mode(
1904
+ aspirate_flow_rate=original_aspirate_flow_rate,
1905
+ dispense_flow_rate=original_dispense_flow_rate,
1906
+ blow_out_flow_rate=original_blow_out_flow_rate,
1907
+ is_low_volume=in_low_volume_mode,
1908
+ )
1909
+
1799
1910
  def _get_location_and_well_core_from_next_tip_info(
1800
1911
  self,
1801
1912
  tip_info: NextTipInfo,
@@ -1904,6 +2015,20 @@ class InstrumentCore(AbstractInstrument[WellCore, LabwareCore]):
1904
2015
  alternate_drop_location=True,
1905
2016
  )
1906
2017
 
2018
+ def _restore_pipette_flow_rates_and_volume_mode(
2019
+ self,
2020
+ aspirate_flow_rate: Optional[float],
2021
+ dispense_flow_rate: Optional[float],
2022
+ blow_out_flow_rate: Optional[float],
2023
+ is_low_volume: bool,
2024
+ ) -> None:
2025
+ # TODO(jbl 2025-09-17) this works for p50 low volume mode but is not guaranteed to work for future low volume
2026
+ # modes, this should be replaced with something less flaky
2027
+ self.configure_for_volume(self.get_max_volume() if not is_low_volume else 1)
2028
+ self._user_aspirate_flow_rate = aspirate_flow_rate
2029
+ self._user_dispense_flow_rate = dispense_flow_rate
2030
+ self._user_blow_out_flow_rate = blow_out_flow_rate
2031
+
1907
2032
  def aspirate_liquid_class(
1908
2033
  self,
1909
2034
  volume: float,
@@ -70,6 +70,7 @@ class LoadedStaticPipetteData:
70
70
  plunger_positions: Dict[str, float]
71
71
  shaft_ul_per_mm: float
72
72
  available_sensors: pipette_definition.AvailableSensorDefinition
73
+ volume_mode: pip_types.LiquidClasses # pip_types Liquid Classes refers to volume modes
73
74
 
74
75
 
75
76
  class VirtualPipetteDataProvider:
@@ -298,6 +299,7 @@ class VirtualPipetteDataProvider:
298
299
  shaft_ul_per_mm=config.shaft_ul_per_mm,
299
300
  available_sensors=config.available_sensors
300
301
  or pipette_definition.AvailableSensorDefinition(sensors=[]),
302
+ volume_mode=liquid_class,
301
303
  )
302
304
 
303
305
  def get_virtual_pipette_static_config(
@@ -353,6 +355,7 @@ def get_pipette_static_config(
353
355
  plunger_positions=pipette_dict["plunger_positions"],
354
356
  shaft_ul_per_mm=pipette_dict["shaft_ul_per_mm"],
355
357
  available_sensors=available_sensors,
358
+ volume_mode=pipette_dict["volume_mode"],
356
359
  )
357
360
 
358
361
 
@@ -17,7 +17,10 @@ from typing_extensions import assert_never
17
17
 
18
18
  from opentrons_shared_data.pipette import pipette_definition
19
19
  from opentrons_shared_data.pipette.ul_per_mm import calculate_ul_per_mm
20
- from opentrons_shared_data.pipette.types import UlPerMmAction
20
+ from opentrons_shared_data.pipette.types import (
21
+ UlPerMmAction,
22
+ LiquidClasses as VolumeModes,
23
+ )
21
24
 
22
25
  from opentrons.config.defaults_ot2 import Z_RETRACT_DISTANCE
23
26
  from opentrons.hardware_control.dev_types import PipetteDict
@@ -107,6 +110,7 @@ class StaticPipetteConfig:
107
110
  plunger_positions: Dict[str, float]
108
111
  shaft_ul_per_mm: float
109
112
  available_sensors: pipette_definition.AvailableSensorDefinition
113
+ volume_mode: VolumeModes
110
114
 
111
115
 
112
116
  @dataclasses.dataclass
@@ -212,7 +216,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
212
216
  # we identify tip classes - looking things up by volume is not enough.
213
217
  tip_configuration = list(
214
218
  static_config.tip_configuration_lookup_table.values()
215
- )[0]
219
+ )[-1]
216
220
  self._state.flow_rates_by_id[pipette_id] = FlowRates(
217
221
  default_blow_out=tip_configuration.default_blowout_flowrate.values_by_api_level,
218
222
  default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level,
@@ -230,7 +234,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
230
234
  # TODO(seth,9/11/2023): bad way to do defaulting, see above.
231
235
  tip_configuration = list(
232
236
  static_config.tip_configuration_lookup_table.values()
233
- )[0]
237
+ )[-1]
234
238
  self._state.flow_rates_by_id[pipette_id] = FlowRates(
235
239
  default_blow_out=tip_configuration.default_blowout_flowrate.values_by_api_level,
236
240
  default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level,
@@ -313,6 +317,7 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
313
317
  plunger_positions=config.plunger_positions,
314
318
  shaft_ul_per_mm=config.shaft_ul_per_mm,
315
319
  available_sensors=config.available_sensors,
320
+ volume_mode=config.volume_mode,
316
321
  )
317
322
  self._state.flow_rates_by_id[
318
323
  state_update.pipette_config.pipette_id
@@ -867,6 +872,10 @@ class PipetteView:
867
872
  return False
868
873
  return True
869
874
 
875
+ def get_is_low_volume_mode(self, pipette_id: str) -> bool:
876
+ """Determine if the pipette is currently in low volume mode."""
877
+ return self.get_config(pipette_id).volume_mode == VolumeModes.lowVolumeDefault
878
+
870
879
  def lookup_volume_to_mm_conversion(
871
880
  self, pipette_id: str, volume: float, action: str
872
881
  ) -> float:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opentrons
3
- Version: 8.7.0a4
3
+ Version: 8.7.0a6
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Project-URL: opentrons.com, https://www.opentrons.com
6
6
  Project-URL: Source Code On Github, https://github.com/Opentrons/opentrons/tree/edge/api
@@ -24,7 +24,7 @@ Requires-Dist: click<9,>=8.0.0
24
24
  Requires-Dist: importlib-metadata>=1.0; python_version < '3.8'
25
25
  Requires-Dist: jsonschema<4.18.0,>=3.0.1
26
26
  Requires-Dist: numpy<2,>=1.20.0
27
- Requires-Dist: opentrons-shared-data==8.7.0a4
27
+ Requires-Dist: opentrons-shared-data==8.7.0a6
28
28
  Requires-Dist: packaging>=21.0
29
29
  Requires-Dist: pydantic-settings<3,>=2
30
30
  Requires-Dist: pydantic<3,>=2.0.0
@@ -32,6 +32,6 @@ Requires-Dist: pyserial>=3.5
32
32
  Requires-Dist: pyusb==1.2.1
33
33
  Requires-Dist: typing-extensions<5,>=4.0.0
34
34
  Provides-Extra: flex-hardware
35
- Requires-Dist: opentrons-hardware[flex]==8.7.0a4; extra == 'flex-hardware'
35
+ Requires-Dist: opentrons-hardware[flex]==8.7.0a6; extra == 'flex-hardware'
36
36
  Provides-Extra: ot2-hardware
37
- Requires-Dist: opentrons-hardware==8.7.0a4; extra == 'ot2-hardware'
37
+ Requires-Dist: opentrons-hardware==8.7.0a6; extra == 'ot2-hardware'
@@ -1,5 +1,5 @@
1
1
  opentrons/__init__.py,sha256=TQ_Ca_zzAM3iLzAysWKkFkQHG8-imihxDPQbLCYrf-E,4533
2
- opentrons/_version.py,sha256=T3I_REwp7NPgVaCzUwIgqx3hZTWOkqzM02WF8JrMz1o,712
2
+ opentrons/_version.py,sha256=QWyf8tucSHUWM-f05vXVSeV8CkIBFLOTGDvxyi98YYM,712
3
3
  opentrons/execute.py,sha256=Y88qICDiHWQjU0L4Ou7DI5OXXu7zZcdkUvNUYmZqIfc,29282
4
4
  opentrons/legacy_broker.py,sha256=XnuEBBlrHCThc31RFW2UR0tGqctqWZ-CZ9vSC4L9whU,1553
5
5
  opentrons/ordered_set.py,sha256=g-SB3qA14yxHu9zjGyc2wC7d2TUCBE6fKZlHAtbPzI8,4082
@@ -98,7 +98,7 @@ opentrons/hardware_control/__main__.py,sha256=DnlYdphZKLHiLCeXmnMDer6CclhberfTk_
98
98
  opentrons/hardware_control/adapters.py,sha256=mm-gumoaF7CFrP0ad6W4xafbJRq6RaOD0GffSibWR-Q,3888
99
99
  opentrons/hardware_control/api.py,sha256=TbEKD7MtDKkvdeJ0yqsFlsM8q_0D36iwolQSclivJpw,51234
100
100
  opentrons/hardware_control/constants.py,sha256=Ku-XABo7AN9JQ0tef8oPk-JlUuhQQLeP9S0h7kx5GEA,227
101
- opentrons/hardware_control/dev_types.py,sha256=GFOe3U3Xi_SpcGm5xuMTJobLeJC0ncmRbONjRAiJLsg,3446
101
+ opentrons/hardware_control/dev_types.py,sha256=q2GU8JMkHAhNrW5A4bcyq9y5q4-X-HXxa7yxCR-olxw,3507
102
102
  opentrons/hardware_control/errors.py,sha256=NMF5_AvX22ENTHPpUlElgF-0aeaxEhYXnOq2lfIzuiM,1433
103
103
  opentrons/hardware_control/execution_manager.py,sha256=WG3NF1OJgorAmRpkx8BRnqFeQsPUQ5w7H1kVK7pC-7A,5984
104
104
  opentrons/hardware_control/module_control.py,sha256=0mmVH9fiZWNyc33ilCpJHajX1Dfhf0YsbI28mSIS2K8,12726
@@ -157,13 +157,13 @@ opentrons/hardware_control/instruments/instrument_abc.py,sha256=UqKb7_8E4ivlTV2t
157
157
  opentrons/hardware_control/instruments/ot2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
158
158
  opentrons/hardware_control/instruments/ot2/instrument_calibration.py,sha256=qyj0RWLYayq9q_9bOocgNK7xu4fCDyigSk-kN7d5YhA,4873
159
159
  opentrons/hardware_control/instruments/ot2/pipette.py,sha256=aQ3gSnjtN3OwS2-9WiRTKjrHy6Bz9gUkZwT94y2Tcdg,28200
160
- opentrons/hardware_control/instruments/ot2/pipette_handler.py,sha256=Vd8COWH7wdKKkPvXvrm_blpzXAfnc2KDez5-Tei9-A8,38045
160
+ opentrons/hardware_control/instruments/ot2/pipette_handler.py,sha256=qluMYYwui76366xsjOBKp3kpJVuKrxJEHPO45wR9jj4,38105
161
161
  opentrons/hardware_control/instruments/ot3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
162
  opentrons/hardware_control/instruments/ot3/gripper.py,sha256=xGL3dfRo1fuzMwF984h002Hi5DRbxcEiDjdkdS9C2PI,15406
163
163
  opentrons/hardware_control/instruments/ot3/gripper_handler.py,sha256=sa5GWZAzxQZk1A6RFKEg99L9Nb1UTeKeGWqnY_NA_cg,6071
164
164
  opentrons/hardware_control/instruments/ot3/instrument_calibration.py,sha256=x5hloPvJD19OUbI5IkoKYda-G7xHdzfckRaDl_GK4i4,7011
165
165
  opentrons/hardware_control/instruments/ot3/pipette.py,sha256=t3K28QLEmj3DS_KXoXbeBjEE5PfQJlSePzvSNt4GXsI,32376
166
- opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=MRUMYXTVVe4kaoYYMJ2bIqb4uJwxpXP12kllkr47CnQ,39383
166
+ opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=C8Ai5uSSuQEbcul-pkzHuywoIX-1Tppl4Xh51ADR3j0,39443
167
167
  opentrons/hardware_control/modules/__init__.py,sha256=9tLhyYJ4AQ2Kch8oD4-NEZ_dGC7IqY5hOdGLyKqJjLs,1549
168
168
  opentrons/hardware_control/modules/absorbance_reader.py,sha256=_6fcHEmsaeV3p8rFpPHB6Tdh7hvWE8buJDtUL2u0nlw,13495
169
169
  opentrons/hardware_control/modules/errors.py,sha256=cREqoMc6nwGxQbLvZYDfIlq1mCv0alN42J7qxNBNiOY,165
@@ -255,7 +255,7 @@ opentrons/protocol_api/core/engine/_default_labware_versions.py,sha256=hLKAp33c_
255
255
  opentrons/protocol_api/core/engine/_default_liquid_class_versions.py,sha256=be-eczhfOsWm4Q3fSVcjWqxteg_IGnwC-pozJUZ5u4U,1564
256
256
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=j3AJ-sYr5e-06UgeGueUldx9B3fn7AhN738kJxZO_vw,14693
257
257
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
258
- opentrons/protocol_api/core/engine/instrument.py,sha256=lDrCqOZm7ceu1E50EYiSh7qTDMci5cgw4bM-AvLyMjE,98890
258
+ opentrons/protocol_api/core/engine/instrument.py,sha256=iiiUdjdpLGxjr3iQwI6AOtfIFTFx1vwZLa6ALrpqgRM,105054
259
259
  opentrons/protocol_api/core/engine/labware.py,sha256=-2oygShyRZo1-R0UOoBtXniFOXfc3cSdGM-qa_l9wh8,8610
260
260
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=CxSbCBXVXHtBszP-3Ko8hsQTjvvogKRo0CCzCmMfIic,3003
261
261
  opentrons/protocol_api/core/engine/module_core.py,sha256=qxxcqpH-A4Zil9hHDxnvh4H8JuPvK6-sgkODU5YdjZQ,39537
@@ -449,7 +449,7 @@ opentrons/protocol_engine/resources/labware_validation.py,sha256=6UkWktVvGNpOrRo
449
449
  opentrons/protocol_engine/resources/model_utils.py,sha256=C3OHUi-OtuFUm3dS5rApSU3EJ0clnaCZEyBku5sTjzA,941
450
450
  opentrons/protocol_engine/resources/module_data_provider.py,sha256=DaTv3QqrlpKEXlIfBCSgXwlyOrV2YqWcxlHD0MGKWWw,1558
451
451
  opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7v5ETc8y5T_sbs-jTPxuSnooE,744
452
- opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=zyaasVJuWb_3Db0Qt37PgqfECQuQY_k5iosThb8qVKE,15992
452
+ opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=bsrknDnHWpp52MsQrIchPpAKktVmvCWJ5W2Myhv4OmY,16171
453
453
  opentrons/protocol_engine/state/__init__.py,sha256=hDdA4GjXbi9h7K_FMbQGT9tOw3YtRNn5LIryMdkotS8,36
454
454
  opentrons/protocol_engine/state/_abstract_store.py,sha256=b5cqKZhI6ERZj6gyL0kDutD6ogdQngR3T-JmPATvhi8,631
455
455
  opentrons/protocol_engine/state/_axis_aligned_bounding_box.py,sha256=W_fkz7vUrtWlrJIp7GoSgceCj3YRcLSUafktQdRI3xg,1373
@@ -469,7 +469,7 @@ opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4
469
469
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
470
470
  opentrons/protocol_engine/state/modules.py,sha256=UbvbJcx45n5hZRbxQMTmxrA1rFichsWNUj6SpPAsBIU,61816
471
471
  opentrons/protocol_engine/state/motion.py,sha256=pWt28-vBaO6dz_rtvoliUsGDvls_ML6sRfDOwmD0F7g,15086
472
- opentrons/protocol_engine/state/pipettes.py,sha256=nXXQqeBIArPu0rEz-Y6OqA_F23A7uxPHVC2JfaJFH_g,38186
472
+ opentrons/protocol_engine/state/pipettes.py,sha256=Q-aDiVvOVvUXq930vvMvAWhK7aZ06-8FLZB6jO95dwQ,38531
473
473
  opentrons/protocol_engine/state/state.py,sha256=X8Sb2HN01nmNBY1Rw6qeLOjSuIWTbiq4g5otsd4u6A0,15600
474
474
  opentrons/protocol_engine/state/state_summary.py,sha256=tu-xJYKbKzeLk9Z0RwSaz0tUs6blYuxSA5V2n7_zSGk,1180
475
475
  opentrons/protocol_engine/state/tips.py,sha256=kvYG3VO98VGloJiGiWNoNJ1JOfqPGWx6Yz--LXHcfK4,18307
@@ -595,8 +595,8 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
595
595
  opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
596
596
  opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
597
597
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
598
- opentrons-8.7.0a4.dist-info/METADATA,sha256=ntabhh435TWpDXq1mciHYCJwmFaDFigyOQOwR6nVe_U,1607
599
- opentrons-8.7.0a4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
600
- opentrons-8.7.0a4.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
601
- opentrons-8.7.0a4.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
602
- opentrons-8.7.0a4.dist-info/RECORD,,
598
+ opentrons-8.7.0a6.dist-info/METADATA,sha256=RU-1uPU6tiSwIoBZzbwMcTfEa8XHYGoDrwFYgFq5RbU,1607
599
+ opentrons-8.7.0a6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
600
+ opentrons-8.7.0a6.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
601
+ opentrons-8.7.0a6.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
602
+ opentrons-8.7.0a6.dist-info/RECORD,,