opentrons 8.5.0a0__py2.py3-none-any.whl → 8.5.0a2__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.

@@ -42,6 +42,7 @@ from opentrons.hardware_control.module_control import AttachedModulesControl
42
42
  from ..dev_types import OT3AttachedInstruments
43
43
  from .types import HWStopCondition
44
44
 
45
+
45
46
  Cls = TypeVar("Cls")
46
47
 
47
48
 
@@ -466,3 +467,27 @@ class FlexBackend(Protocol):
466
467
  async def increase_evo_disp_count(self, mount: OT3Mount) -> None:
467
468
  """Tell a pipette to increase it's evo-tip-dispense-count in eeprom."""
468
469
  ...
470
+
471
+ async def read_env_temp_sensor(
472
+ self, mount: OT3Mount, primary: bool
473
+ ) -> Optional[float]:
474
+ """Read and return the current sensor information."""
475
+ ...
476
+
477
+ async def read_env_hum_sensor(
478
+ self, mount: OT3Mount, primary: bool
479
+ ) -> Optional[float]:
480
+ """Read and return the current sensor information."""
481
+ ...
482
+
483
+ async def read_pressure_sensor(
484
+ self, mount: OT3Mount, primary: bool
485
+ ) -> Optional[float]:
486
+ """Read and return the current sensor information."""
487
+ ...
488
+
489
+ async def read_capacitive_sensor(
490
+ self, mount: OT3Mount, primary: bool
491
+ ) -> Optional[float]:
492
+ """Read and return the current sensor information."""
493
+ ...
@@ -215,7 +215,13 @@ from ..types import HepaFanState, HepaUVState, StatusBarState
215
215
  from .types import HWStopCondition
216
216
  from .flex_protocol import FlexBackend
217
217
  from .status_bar_state import StatusBarStateController
218
- from opentrons_hardware.sensors.types import SensorDataType
218
+ from opentrons_hardware.sensors.sensor_types import (
219
+ EnvironmentSensor,
220
+ CapacitiveSensor,
221
+ PressureSensor,
222
+ )
223
+ from opentrons_hardware.sensors.types import SensorDataType, EnvironmentSensorDataType
224
+ from opentrons_hardware.sensors.sensor_driver import SensorDriver
219
225
  from opentrons_hardware.sensors.utils import send_evo_dispense_count_increase
220
226
 
221
227
  log = logging.getLogger(__name__)
@@ -1835,3 +1841,72 @@ class OT3Controller(FlexBackend):
1835
1841
  await send_evo_dispense_count_increase(
1836
1842
  self._messenger, sensor_node_for_pipette(OT3Mount(mount.value))
1837
1843
  )
1844
+
1845
+ async def _read_env_sensor(
1846
+ self, mount: OT3Mount, primary: bool
1847
+ ) -> Optional[EnvironmentSensorDataType]:
1848
+ """Read and return the current sensor information."""
1849
+ sensor = EnvironmentSensor.build(
1850
+ sensor_id=SensorId.S0 if primary else SensorId.S1,
1851
+ node_id=sensor_node_for_mount(mount),
1852
+ )
1853
+ s_driver = SensorDriver()
1854
+ sensor_data = await s_driver.read(
1855
+ can_messenger=self._messenger,
1856
+ sensor=sensor,
1857
+ offset=False,
1858
+ )
1859
+ assert sensor_data is None or isinstance(sensor_data, EnvironmentSensorDataType)
1860
+ return sensor_data
1861
+
1862
+ async def read_env_temp_sensor(
1863
+ self, mount: OT3Mount, primary: bool
1864
+ ) -> Optional[float]:
1865
+ """Read and return the current sensor information."""
1866
+ s_data = await self._read_env_sensor(mount, primary)
1867
+ if s_data is None or s_data.temperature is None:
1868
+ return None
1869
+ return s_data.temperature.to_float()
1870
+
1871
+ async def read_env_hum_sensor(
1872
+ self, mount: OT3Mount, primary: bool
1873
+ ) -> Optional[float]:
1874
+ """Read and return the current sensor information."""
1875
+ s_data = await self._read_env_sensor(mount, primary)
1876
+ if s_data is None or s_data.humidity is None:
1877
+ return None
1878
+ return s_data.humidity.to_float()
1879
+
1880
+ async def read_pressure_sensor(
1881
+ self, mount: OT3Mount, primary: bool
1882
+ ) -> Optional[float]:
1883
+ """Read and return the current sensor information."""
1884
+ sensor = PressureSensor.build(
1885
+ sensor_id=SensorId.S0 if primary else SensorId.S1,
1886
+ node_id=sensor_node_for_mount(mount),
1887
+ )
1888
+ s_driver = SensorDriver()
1889
+ sensor_data = await s_driver.read(
1890
+ can_messenger=self._messenger,
1891
+ sensor=sensor,
1892
+ offset=False,
1893
+ )
1894
+ assert sensor_data is None or isinstance(sensor_data, SensorDataType)
1895
+ return sensor_data.to_float() if sensor_data else None
1896
+
1897
+ async def read_capacitive_sensor(
1898
+ self, mount: OT3Mount, primary: bool
1899
+ ) -> Optional[float]:
1900
+ """Read and return the current sensor information."""
1901
+ sensor = CapacitiveSensor.build(
1902
+ sensor_id=SensorId.S0 if primary else SensorId.S1,
1903
+ node_id=sensor_node_for_mount(mount),
1904
+ )
1905
+ s_driver = SensorDriver()
1906
+ sensor_data = await s_driver.read(
1907
+ can_messenger=self._messenger,
1908
+ sensor=sensor,
1909
+ offset=False,
1910
+ )
1911
+ assert sensor_data is None or isinstance(sensor_data, SensorDataType)
1912
+ return sensor_data.to_float() if sensor_data else None
@@ -67,6 +67,7 @@ from .flex_protocol import (
67
67
  FlexBackend,
68
68
  )
69
69
 
70
+
70
71
  log = logging.getLogger(__name__)
71
72
 
72
73
  AXIS_TO_SUBSYSTEM = {
@@ -874,3 +875,29 @@ class OT3Simulator(FlexBackend):
874
875
 
875
876
  async def increase_evo_disp_count(self, mount: OT3Mount) -> None:
876
877
  pass
878
+
879
+ async def read_env_temp_sensor(
880
+ self, mount: OT3Mount, primary: bool
881
+ ) -> Optional[float]:
882
+ """Read and return the current sensor information."""
883
+
884
+ return 0.0
885
+
886
+ async def read_env_hum_sensor(
887
+ self, mount: OT3Mount, primary: bool
888
+ ) -> Optional[float]:
889
+ """Read and return the current sensor information."""
890
+
891
+ return 0.0
892
+
893
+ async def read_pressure_sensor(
894
+ self, mount: OT3Mount, primary: bool
895
+ ) -> Optional[float]:
896
+ """Read and return the current sensor information."""
897
+ return 0.0
898
+
899
+ async def read_capacitive_sensor(
900
+ self, mount: OT3Mount, primary: bool
901
+ ) -> Optional[float]:
902
+ """Read and return the current sensor information."""
903
+ return 0.0
@@ -665,6 +665,7 @@ class OT3PipetteHandler:
665
665
  return None
666
666
 
667
667
  if is_full_dispense:
668
+ disp_vol = instrument.current_volume
668
669
  if push_out is None:
669
670
  push_out_ul = instrument.push_out_volume
670
671
  else:
@@ -3140,3 +3140,35 @@ class OT3API(
3140
3140
  """Tell a pipette to increase its evo-tip-dispense-count in eeprom."""
3141
3141
  realmount = OT3Mount.from_mount(mount)
3142
3142
  await self._backend.increase_evo_disp_count(realmount)
3143
+
3144
+ async def read_stem_temperature(
3145
+ self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3146
+ ) -> float:
3147
+ """Read and return the current stem temperature."""
3148
+ realmount = OT3Mount.from_mount(mount)
3149
+ s_data = await self._backend.read_env_temp_sensor(realmount, primary)
3150
+ return s_data if s_data else 0.0
3151
+
3152
+ async def read_stem_humidity(
3153
+ self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3154
+ ) -> float:
3155
+ """Read and return the current primary stem humidity."""
3156
+ realmount = OT3Mount.from_mount(mount)
3157
+ s_data = await self._backend.read_env_hum_sensor(realmount, primary)
3158
+ return s_data if s_data else 0.0
3159
+
3160
+ async def read_stem_pressure(
3161
+ self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3162
+ ) -> float:
3163
+ """Read and return the current primary stem pressure."""
3164
+ realmount = OT3Mount.from_mount(mount)
3165
+ s_data = await self._backend.read_pressure_sensor(realmount, primary)
3166
+ return s_data if s_data else 0.0
3167
+
3168
+ async def read_stem_capacitance(
3169
+ self, mount: Union[top_types.Mount, OT3Mount], primary: bool = True
3170
+ ) -> float:
3171
+ """Read and return the current primary stem capacitance."""
3172
+ realmount = OT3Mount.from_mount(mount)
3173
+ s_data = await self._backend.read_capacitive_sensor(realmount, primary)
3174
+ return s_data if s_data else 0.0
@@ -33,7 +33,7 @@ def verify_and_normalize_transfer_args(
33
33
  last_tip_picked_up_from: Optional[Well],
34
34
  tip_racks: List[Labware],
35
35
  nozzle_map: NozzleMapInterface,
36
- target_all_wells: bool,
36
+ group_wells_for_multi_channel: bool,
37
37
  current_volume: float,
38
38
  trash_location: Union[Location, Well, Labware, TrashBin, WasteChute],
39
39
  ) -> TransferInfo:
@@ -43,7 +43,7 @@ def verify_and_normalize_transfer_args(
43
43
  else:
44
44
  # If trash bin or waste chute, set this to empty to have less isinstance checks after this
45
45
  flat_dests_list = []
46
- if not target_all_wells and nozzle_map.tip_count > 1:
46
+ if group_wells_for_multi_channel and nozzle_map.tip_count > 1:
47
47
  flat_sources_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
48
48
  flat_sources_list, nozzle_map
49
49
  )
@@ -1094,8 +1094,8 @@ class ProtocolCore(
1094
1094
  display_color=(liquid.displayColor.root if liquid.displayColor else None),
1095
1095
  )
1096
1096
 
1097
- def define_liquid_class(self, name: str, version: int) -> LiquidClass:
1098
- """Define a liquid class for use in transfer functions."""
1097
+ def get_liquid_class(self, name: str, version: int) -> LiquidClass:
1098
+ """Get an instance of a built-in liquid class."""
1099
1099
  try:
1100
1100
  # Check if we have already loaded this liquid class' definition
1101
1101
  liquid_class_def = self._liquid_class_def_cache[(name, version)]
@@ -599,8 +599,8 @@ class LegacyProtocolCore(
599
599
  """Define a liquid to load into a well."""
600
600
  assert False, "define_liquid only supported on engine core"
601
601
 
602
- def define_liquid_class(self, name: str, version: int) -> LiquidClass:
603
- """Define a liquid class."""
602
+ def get_liquid_class(self, name: str, version: int) -> LiquidClass:
603
+ """Get an instance of a built-in liquid class."""
604
604
  assert False, "define_liquid_class is only supported on engine core"
605
605
 
606
606
  def get_labware_location(
@@ -311,8 +311,8 @@ class AbstractProtocol(
311
311
  """Define a liquid to load into a well."""
312
312
 
313
313
  @abstractmethod
314
- def define_liquid_class(self, name: str, version: int) -> LiquidClass:
315
- """Define a liquid class for use in transfer functions."""
314
+ def get_liquid_class(self, name: str, version: int) -> LiquidClass:
315
+ """Get an instance of a built-in liquid class."""
316
316
 
317
317
  @abstractmethod
318
318
  def get_labware_location(
@@ -1794,7 +1794,7 @@ class InstrumentContext(publisher.CommandPublisher):
1794
1794
  Union[types.Location, labware.Well, TrashBin, WasteChute]
1795
1795
  ] = None,
1796
1796
  return_tip: bool = False,
1797
- visit_every_well: bool = False,
1797
+ group_wells: bool = True,
1798
1798
  ) -> InstrumentContext:
1799
1799
  """Move a particular type of liquid from one well or group of wells to another.
1800
1800
 
@@ -1827,6 +1827,9 @@ class InstrumentContext(publisher.CommandPublisher):
1827
1827
  tips. Depending on the liquid class, the pipette may also blow out liquid here.
1828
1828
  :param return_tip: Whether to drop used tips in their original locations
1829
1829
  in the tip rack, instead of the trash.
1830
+ :param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
1831
+ given into a single transfer step, taking into account the tip configuration. If ``False``, target
1832
+ each well given with the primary nozzle. Defaults to ``True``.
1830
1833
 
1831
1834
  :meta private:
1832
1835
  """
@@ -1844,7 +1847,7 @@ class InstrumentContext(publisher.CommandPublisher):
1844
1847
  last_tip_picked_up_from=self._last_tip_picked_up_from,
1845
1848
  tip_racks=self._tip_racks,
1846
1849
  nozzle_map=self._core.get_nozzle_map(),
1847
- target_all_wells=visit_every_well,
1850
+ group_wells_for_multi_channel=group_wells,
1848
1851
  current_volume=self.current_volume,
1849
1852
  trash_location=(
1850
1853
  trash_location if trash_location is not None else self.trash_container
@@ -1913,7 +1916,7 @@ class InstrumentContext(publisher.CommandPublisher):
1913
1916
  Union[types.Location, labware.Well, TrashBin, WasteChute]
1914
1917
  ] = None,
1915
1918
  return_tip: bool = False,
1916
- visit_every_well: bool = False,
1919
+ group_wells: bool = True,
1917
1920
  ) -> InstrumentContext:
1918
1921
  """
1919
1922
  Distribute a particular type of liquid from one well to a group of wells.
@@ -1943,6 +1946,9 @@ class InstrumentContext(publisher.CommandPublisher):
1943
1946
  tips. Depending on the liquid class, the pipette may also blow out liquid here.
1944
1947
  :param return_tip: Whether to drop used tips in their original locations
1945
1948
  in the tip rack, instead of the trash.
1949
+ :param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
1950
+ given into a single transfer step, taking into account the tip configuration. If ``False``, target
1951
+ each well given with the primary nozzle. Defaults to ``True``.
1946
1952
 
1947
1953
  :meta private:
1948
1954
  """
@@ -1960,7 +1966,7 @@ class InstrumentContext(publisher.CommandPublisher):
1960
1966
  last_tip_picked_up_from=self._last_tip_picked_up_from,
1961
1967
  tip_racks=self._tip_racks,
1962
1968
  nozzle_map=self._core.get_nozzle_map(),
1963
- target_all_wells=visit_every_well,
1969
+ group_wells_for_multi_channel=group_wells,
1964
1970
  current_volume=self.current_volume,
1965
1971
  trash_location=(
1966
1972
  trash_location if trash_location is not None else self.trash_container
@@ -2035,7 +2041,7 @@ class InstrumentContext(publisher.CommandPublisher):
2035
2041
  Union[types.Location, labware.Well, TrashBin, WasteChute]
2036
2042
  ] = None,
2037
2043
  return_tip: bool = False,
2038
- visit_every_well: bool = False,
2044
+ group_wells: bool = True,
2039
2045
  ) -> InstrumentContext:
2040
2046
  """
2041
2047
  Consolidate a particular type of liquid from a group of wells to one well.
@@ -2066,6 +2072,9 @@ class InstrumentContext(publisher.CommandPublisher):
2066
2072
  tips. Depending on the liquid class, the pipette may also blow out liquid here.
2067
2073
  :param return_tip: Whether to drop used tips in their original locations
2068
2074
  in the tip rack, instead of the trash.
2075
+ :param group_wells: For multi-channel transfers only. If set to ``True``, group together contiguous wells
2076
+ given into a single transfer step, taking into account the tip configuration. If ``False``, target
2077
+ each well given with the primary nozzle. Defaults to ``True``.
2069
2078
 
2070
2079
  :meta private:
2071
2080
  """
@@ -2083,7 +2092,7 @@ class InstrumentContext(publisher.CommandPublisher):
2083
2092
  last_tip_picked_up_from=self._last_tip_picked_up_from,
2084
2093
  tip_racks=self._tip_racks,
2085
2094
  nozzle_map=self._core.get_nozzle_map(),
2086
- target_all_wells=visit_every_well,
2095
+ group_wells_for_multi_channel=group_wells,
2087
2096
  current_volume=self.current_volume,
2088
2097
  trash_location=(
2089
2098
  trash_location if trash_location is not None else self.trash_container
@@ -1371,22 +1371,23 @@ class ProtocolContext(CommandPublisher):
1371
1371
  display_color=display_color,
1372
1372
  )
1373
1373
 
1374
- @requires_version(2, 23)
1375
- def define_liquid_class(
1374
+ @requires_version(2, 24)
1375
+ def get_liquid_class(
1376
1376
  self,
1377
1377
  name: str,
1378
1378
  ) -> LiquidClass:
1379
1379
  """
1380
- Define a liquid class for use in the protocol.
1381
- ..
1382
- This is intended for Opentrons internal use only and is not a guaranteed API.
1380
+ Get an instance of a built-in liquid class for use in the protocol.
1383
1381
 
1384
- :meta private:
1382
+ Args:
1383
+ name: Name of an Opentrons-defined liquid class.
1384
+
1385
+ :raises: ``LiquidClassDefinitionDoesNotExist``: if the specified liquid class does not exist.
1385
1386
  """
1386
- return self._core.define_liquid_class(name=name, version=DEFAULT_LC_VERSION)
1387
+ return self._core.get_liquid_class(name=name, version=DEFAULT_LC_VERSION)
1387
1388
 
1388
1389
  @requires_version(2, 24)
1389
- def define_custom_liquid_class(
1390
+ def define_liquid_class(
1390
1391
  self,
1391
1392
  name: str,
1392
1393
  properties: Dict[str, Dict[str, TransferPropertiesDict]],
@@ -113,6 +113,7 @@ class AspirateWhileTrackingImplementation(
113
113
  labware_id=params.labwareId,
114
114
  well_name=params.wellName,
115
115
  well_location=params.wellLocation,
116
+ operation_volume=-params.volume,
116
117
  )
117
118
  state_update.append(move_result.state_update)
118
119
  if isinstance(move_result, DefinedErrorData):
@@ -165,25 +165,6 @@ class LoadLabwareImplementation(
165
165
  top_labware_definition=loaded_labware.definition,
166
166
  bottom_labware_id=verified_location.labwareId,
167
167
  )
168
- # Validate load location is valid for lids
169
- if labware_validation.validate_definition_is_lid(
170
- definition=loaded_labware.definition
171
- ):
172
- # This parent is assumed to be compatible, unless the lid enumerates
173
- # all its compatible parents and this parent is missing from the list.
174
- parent_is_incompatible = (
175
- loaded_labware.definition.compatibleParentLabware is not None
176
- and self._state_view.labware.get_load_name(
177
- verified_location.labwareId
178
- )
179
- not in loaded_labware.definition.compatibleParentLabware
180
- )
181
-
182
- if parent_is_incompatible:
183
- raise ValueError(
184
- f"Labware Lid {params.loadName} may not be loaded on parent labware"
185
- f" {self._state_view.labware.get_display_name(verified_location.labwareId)}."
186
- )
187
168
 
188
169
  # Validate labware for the absorbance reader
189
170
  if self._is_loading_to_module(
@@ -48,7 +48,13 @@ def validate_labware_can_be_stacked(
48
48
  top_labware_definition: LabwareDefinition, below_labware_load_name: str
49
49
  ) -> bool:
50
50
  """Validate that the labware being loaded onto is in the above labware's stackingOffsetWithLabware definition."""
51
- return below_labware_load_name in top_labware_definition.stackingOffsetWithLabware
51
+ return (
52
+ below_labware_load_name in top_labware_definition.stackingOffsetWithLabware
53
+ or (
54
+ "default" in top_labware_definition.stackingOffsetWithLabware
55
+ and top_labware_definition.compatibleParentLabware is None
56
+ )
57
+ )
52
58
 
53
59
 
54
60
  def validate_labware_can_be_ondeck(definition: LabwareDefinition) -> bool:
@@ -1131,6 +1131,18 @@ class LabwareView:
1131
1131
  raise errors.LabwareCannotBeStackedError(
1132
1132
  f"Labware {top_labware_definition.parameters.loadName} cannot be loaded onto labware {below_labware.loadName}"
1133
1133
  )
1134
+ elif (
1135
+ labware_validation.validate_definition_is_lid(top_labware_definition)
1136
+ and top_labware_definition.compatibleParentLabware is not None
1137
+ and self.get_load_name(bottom_labware_id)
1138
+ not in top_labware_definition.compatibleParentLabware
1139
+ ):
1140
+ # This parent is assumed to be compatible, unless the lid enumerates
1141
+ # all its compatible parents and this parent is missing from the list.
1142
+ raise ValueError(
1143
+ f"Labware Lid {top_labware_definition.parameters.loadName} may not be loaded on parent labware"
1144
+ f" {self.get_display_name(bottom_labware_id)}."
1145
+ )
1134
1146
  elif isinstance(below_labware.location, ModuleLocation):
1135
1147
  below_definition = self.get_definition(labware_id=below_labware.id)
1136
1148
  if not labware_validation.validate_definition_is_adapter(
@@ -27,42 +27,102 @@ class SimulatedProbeResult(BaseModel):
27
27
  return data
28
28
 
29
29
  def __add__(
30
- self, other: float | SimulatedProbeResult
30
+ self, other: float | int | SimulatedProbeResult
31
31
  ) -> float | SimulatedProbeResult:
32
32
  """Bypass addition and just return self."""
33
33
  return self
34
34
 
35
35
  def __sub__(
36
- self, other: float | SimulatedProbeResult
36
+ self, other: float | int | SimulatedProbeResult
37
37
  ) -> float | SimulatedProbeResult:
38
38
  """Bypass subtraction and just return self."""
39
39
  return self
40
40
 
41
41
  def __radd__(
42
- self, other: float | SimulatedProbeResult
42
+ self, other: float | int | SimulatedProbeResult
43
43
  ) -> float | SimulatedProbeResult:
44
44
  """Bypass addition and just return self."""
45
45
  return self
46
46
 
47
47
  def __rsub__(
48
- self, other: float | SimulatedProbeResult
48
+ self, other: float | int | SimulatedProbeResult
49
49
  ) -> float | SimulatedProbeResult:
50
50
  """Bypass subtraction and just return self."""
51
51
  return self
52
52
 
53
- def __gt__(self, other: float | SimulatedProbeResult) -> bool:
53
+ def __mul__(
54
+ self, other: float | int | SimulatedProbeResult
55
+ ) -> float | SimulatedProbeResult:
56
+ """Bypass multiplication and just return self."""
57
+ return self
58
+
59
+ def __rmul__(
60
+ self, other: float | int | SimulatedProbeResult
61
+ ) -> float | SimulatedProbeResult:
62
+ """Bypass multiplication and just return self."""
63
+ return self
64
+
65
+ def __truediv__(
66
+ self, other: float | int | SimulatedProbeResult
67
+ ) -> float | SimulatedProbeResult:
68
+ """Bypass division and just return self."""
69
+ return self
70
+
71
+ def __rtruediv__(
72
+ self, other: float | int | SimulatedProbeResult
73
+ ) -> float | SimulatedProbeResult:
74
+ """Bypass division and just return self."""
75
+ return self
76
+
77
+ def __pow__(
78
+ self, other: float | int | SimulatedProbeResult
79
+ ) -> float | SimulatedProbeResult:
80
+ """Bypass exponent math and just return self."""
81
+ return self
82
+
83
+ def __rpow__(
84
+ self, other: float | int | SimulatedProbeResult
85
+ ) -> float | SimulatedProbeResult:
86
+ """Bypass exponent math and just return self."""
87
+ return self
88
+
89
+ def __mod__(
90
+ self, other: float | int | SimulatedProbeResult
91
+ ) -> float | SimulatedProbeResult:
92
+ """Bypass modulus and just return self."""
93
+ return self
94
+
95
+ def __rmod__(
96
+ self, other: float | int | SimulatedProbeResult
97
+ ) -> float | SimulatedProbeResult:
98
+ """Bypass modulus and just return self."""
99
+ return self
100
+
101
+ def __floordiv__(
102
+ self, other: float | int | SimulatedProbeResult
103
+ ) -> float | SimulatedProbeResult:
104
+ """Bypass floor division and just return self."""
105
+ return self
106
+
107
+ def __rfloordiv__(
108
+ self, other: float | int | SimulatedProbeResult
109
+ ) -> float | SimulatedProbeResult:
110
+ """Bypass floor division and just return self."""
111
+ return self
112
+
113
+ def __gt__(self, other: float | int | SimulatedProbeResult) -> bool:
54
114
  """Bypass 'greater than' and just return self."""
55
115
  return True
56
116
 
57
- def __lt__(self, other: float | SimulatedProbeResult) -> bool:
117
+ def __lt__(self, other: float | int | SimulatedProbeResult) -> bool:
58
118
  """Bypass 'less than' and just return self."""
59
119
  return False
60
120
 
61
- def __ge__(self, other: float | SimulatedProbeResult) -> bool:
121
+ def __ge__(self, other: float | int | SimulatedProbeResult) -> bool:
62
122
  """Bypass 'greater than or eaqual to' and just return self."""
63
123
  return True
64
124
 
65
- def __le__(self, other: float | SimulatedProbeResult) -> bool:
125
+ def __le__(self, other: float | int | SimulatedProbeResult) -> bool:
66
126
  """Bypass 'less than or equal to' and just return self."""
67
127
  return False
68
128
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.5.0a0
3
+ Version: 8.5.0a2
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.5.0a0)
24
+ Requires-Dist: opentrons-shared-data (==8.5.0a2)
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.5.0a0) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.5.0a2) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.5.0a0) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.5.0a2) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -105,7 +105,7 @@ opentrons/hardware_control/module_control.py,sha256=u0RpbOgr5pV5exgKg3qvNQdwdVuy
105
105
  opentrons/hardware_control/motion_utilities.py,sha256=7VG60YQ9MSMAZ0hO-q-kRAdkcebzrx7uIPtc6FMCViE,10311
106
106
  opentrons/hardware_control/nozzle_manager.py,sha256=dqD8XlYsOu0PFFyxvmsMypBB52Gi6x-VIwhykV7JhuU,16868
107
107
  opentrons/hardware_control/ot3_calibration.py,sha256=NkR2EoNq47dkHEXAdF6PI9atuPTxW0X51TFnRrMq5JU,44723
108
- opentrons/hardware_control/ot3api.py,sha256=nrqEkElCDdsno6Ct2IROX05u3UU1pOY5OWeHpF6W8is,124577
108
+ opentrons/hardware_control/ot3api.py,sha256=Y5O80lfFveRzRYOv7ctGudV-nQbvDSUdGW4U3s-zHCA,126014
109
109
  opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
110
110
  opentrons/hardware_control/poller.py,sha256=rx6Q-UxbUIj3ek69IlYenFh7BFuasszRO-GzzhRPuHQ,3885
111
111
  opentrons/hardware_control/robot_calibration.py,sha256=ilszGjZPspKiEk8MQPaHm2B-ljeisAYflKl8UyQ_D0U,7155
@@ -118,9 +118,9 @@ opentrons/hardware_control/backends/__init__.py,sha256=u5Dg3AFZuvDV7hFqJ8I4F9D1d
118
118
  opentrons/hardware_control/backends/controller.py,sha256=MOVMq9s1rY_jHhajHB1hQ1MgXXyY54-gMrrvAuMsOFg,14622
119
119
  opentrons/hardware_control/backends/errors.py,sha256=ZiVP16exHMTWWOajxffnXEqI6NNfeTw-4RkhXE0EBJA,249
120
120
  opentrons/hardware_control/backends/estop_state.py,sha256=_GYjI6OaD3CZNduWV2_RVeOtQ4K_Fg-SP8yU01ENhCY,6554
121
- opentrons/hardware_control/backends/flex_protocol.py,sha256=jRfqqwt5OShcbJpmvdGVaqqcGsqJ3lFMQBvvDzOJP_0,12338
122
- opentrons/hardware_control/backends/ot3controller.py,sha256=e5f_9SvArE9mhCllgDJqhh3IkLEhBydfbBggQBW4MWM,67132
123
- opentrons/hardware_control/backends/ot3simulator.py,sha256=rmEKUtwwQV6Der-gqOWcfqXdVfnFR9Xx9zXG9aSH-CQ,29726
121
+ opentrons/hardware_control/backends/flex_protocol.py,sha256=yNspQsWBbL4wSLJnWHbqiKP_4Y-z89o70yASpOlUBIw,13068
122
+ opentrons/hardware_control/backends/ot3controller.py,sha256=b9xtI-bKSJzsAUYF5CVGrLSFSghSkhPoOc_bhwk_Q4U,70019
123
+ opentrons/hardware_control/backends/ot3simulator.py,sha256=W-iSqKuROba2odK_C3ETET7T1wxu1tKPhF000SsC15c,30486
124
124
  opentrons/hardware_control/backends/ot3utils.py,sha256=VYpyvaE3M9CzhgLL4ObgcXP3gmSGyaOyiRVqcbudCn0,23087
125
125
  opentrons/hardware_control/backends/simulator.py,sha256=q_9PQlBdOyCa9sj2gLqYWZ-fG9v4mddDAiScL-yHCXY,17549
126
126
  opentrons/hardware_control/backends/status_bar_state.py,sha256=ftNn2ouBhPZiFbUm79I4z6ndup7XDmcNowhb-KREspE,8529
@@ -163,7 +163,7 @@ opentrons/hardware_control/instruments/ot3/gripper.py,sha256=BuXxrkh1UC12Ki1e0X9
163
163
  opentrons/hardware_control/instruments/ot3/gripper_handler.py,sha256=GVz6QreaYSo-Vt2b-NHnMV2ehjlDxJCWaqq5ufQYCYM,6055
164
164
  opentrons/hardware_control/instruments/ot3/instrument_calibration.py,sha256=9ERAxnUHc2BBoLPloLwGoNDqssKsjzBQv1cOjwp8umk,5432
165
165
  opentrons/hardware_control/instruments/ot3/pipette.py,sha256=t3K28QLEmj3DS_KXoXbeBjEE5PfQJlSePzvSNt4GXsI,32376
166
- opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=evUNsLBhkUTSptsSWUpD_7iiTT189QaHAE88UKDW9Cw,39334
166
+ opentrons/hardware_control/instruments/ot3/pipette_handler.py,sha256=MRUMYXTVVe4kaoYYMJ2bIqb4uJwxpXP12kllkr47CnQ,39383
167
167
  opentrons/hardware_control/modules/__init__.py,sha256=9tLhyYJ4AQ2Kch8oD4-NEZ_dGC7IqY5hOdGLyKqJjLs,1549
168
168
  opentrons/hardware_control/modules/absorbance_reader.py,sha256=e1b-CxYEdFva0H5DuQ51B3hxfGlqktIvKpvkYkyGozI,13609
169
169
  opentrons/hardware_control/modules/errors.py,sha256=cREqoMc6nwGxQbLvZYDfIlq1mCv0alN42J7qxNBNiOY,165
@@ -223,17 +223,17 @@ opentrons/protocol_api/_liquid_properties.py,sha256=EdrPAyAF5hwDQb989ZJinG8OuxWf
223
223
  opentrons/protocol_api/_nozzle_layout.py,sha256=-WA71bRDISs9bLwHdWqAyM7HBc53sOA8_BOVqYsuN3g,1095
224
224
  opentrons/protocol_api/_parameter_context.py,sha256=dvGMVObWDSERrXfTKSIwc4YeIdF_RD-q8ASNaSBTcxw,12967
225
225
  opentrons/protocol_api/_parameters.py,sha256=BGH50BFawoNnh7NRDh0tRrNncdwz_Ta25tbQfwtlYoM,1298
226
- opentrons/protocol_api/_transfer_liquid_validation.py,sha256=-i45t8jS_tks7HZRLmOkagibHOaC-tk_Fsgvgc37rdE,3574
226
+ opentrons/protocol_api/_transfer_liquid_validation.py,sha256=h_ZGTMKg_DLNMs4OiIb1uIwKU--IqDKlRXCiZDRqAGQ,3596
227
227
  opentrons/protocol_api/_types.py,sha256=6tPCuOmZ5GNtu-24zyY6O-KkXEqzhTAlHlKHQH3Dvzs,1413
228
228
  opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-7cw,625
229
229
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
230
230
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
231
231
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
232
- opentrons/protocol_api/instrument_context.py,sha256=2_3PGJarFUdaxz_gh6Ch5jq2EmmLQuNZ-X1hZclGe4E,134384
232
+ opentrons/protocol_api/instrument_context.py,sha256=QXI4yFexLB-vRcsSi1XvfA97VwqZUbo284N8AhyfHUo,135290
233
233
  opentrons/protocol_api/labware.py,sha256=AhL1JX10Xt-mpB85CAnEOBvz9r5v3xncJuLMkiY1FPM,60934
234
234
  opentrons/protocol_api/module_contexts.py,sha256=3tVXj6Q7n-WuTJPU_dvIQLzzGv1P-jsMuDtMVpuhAf8,48291
235
235
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
236
- opentrons/protocol_api/protocol_context.py,sha256=lKtUn4xf85E189g51v9z0g9tJ9jqjMx8QNq1uTANin0,69577
236
+ opentrons/protocol_api/protocol_context.py,sha256=bADA5aoq-WooGMCIALOM89bhuN1fkDDgrWTbTdvNJ2s,69639
237
237
  opentrons/protocol_api/robot_context.py,sha256=D6ZdpFX30VTtVUDHitsVjabJQXD5TxOV9_Z6sik1LvE,11891
238
238
  opentrons/protocol_api/validation.py,sha256=73QwpdK5337yu9g8jvpHHizOD0Mf3m6Wr9S8eikrHIc,28993
239
239
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
@@ -242,7 +242,7 @@ opentrons/protocol_api/core/core_map.py,sha256=gq3CIYPxuPvozf8yj8FprqBfs3e4ZJGQ6
242
242
  opentrons/protocol_api/core/instrument.py,sha256=g4AU80nB_aPFCxldzyF7NRihrpxnHGQCqh0oWt3twuQ,13770
243
243
  opentrons/protocol_api/core/labware.py,sha256=-ZOjkalikXCV3ptehKCNaWGAdKxIdwne8LRFQW9NAm4,4290
244
244
  opentrons/protocol_api/core/module.py,sha256=z2STDyqqxZX3y6UyJVDnajeFXMEn1ie2NRBYHhry_XE,13838
245
- opentrons/protocol_api/core/protocol.py,sha256=GE2aU6nHsCXvTTujqU1pizTdzOH4SaxgKNNN2Uyn1jU,9101
245
+ opentrons/protocol_api/core/protocol.py,sha256=4ixn9qY0ca0GYyhTkSdKKm0slFdtzY5mXG_lgjGflns,9089
246
246
  opentrons/protocol_api/core/robot.py,sha256=QMAqj5Oqq3_IhTDyUF4jpWI4j2LRPP9crUiaYD_RUv4,1385
247
247
  opentrons/protocol_api/core/well.py,sha256=Lf89YYEyq-ahRSRIFJw42vxIP8Fw6kzIUh9K1HEijUQ,3487
248
248
  opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4zlg7Pq1Rf5Xk,1516
@@ -256,7 +256,7 @@ opentrons/protocol_api/core/engine/module_core.py,sha256=MLPgYSRJHUZPZ9rTLvsg3Gl
256
256
  opentrons/protocol_api/core/engine/overlap_versions.py,sha256=PyGvQtQUg1wzNtkuGZtxwXm019PoIjq7em2JiWaxbXc,675
257
257
  opentrons/protocol_api/core/engine/pipette_movement_conflict.py,sha256=mMns5sKw3Qpfu3IJQf1q098zSdBSOKiHAaQshovZIh8,15225
258
258
  opentrons/protocol_api/core/engine/point_calculations.py,sha256=C2eF0fvJQGMqQv3DzNhc1-m8HTAXTyTsHPJEPrEUEmo,2502
259
- opentrons/protocol_api/core/engine/protocol.py,sha256=fLMp50P615B-YiLiqGZxucVZiddghldJ19xNkTyblBs,46931
259
+ opentrons/protocol_api/core/engine/protocol.py,sha256=OvE8kDONIR0z5S-FV10KUw5v5_HskPk7aqFNyTSUasc,46919
260
260
  opentrons/protocol_api/core/engine/robot.py,sha256=bzUt23NG-clD-9-QFsV_6nm3fMgSmvYEG9DyyZI1xgw,5366
261
261
  opentrons/protocol_api/core/engine/stringify.py,sha256=GwFgEhFMk-uPfFQhQG_2mkaf4cxaItiY8RW7rZwiooQ,2794
262
262
  opentrons/protocol_api/core/engine/transfer_components_executor.py,sha256=psx9vSzvRiwaggu6sRYJGmbtbiD_DWNc9Q5YW9qLEn0,39835
@@ -267,7 +267,7 @@ opentrons/protocol_api/core/legacy/labware_offset_provider.py,sha256=2DLIby9xmUr
267
267
  opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=pe7ztzuIGThy-AXqmOfYgQEOh1-q-SKfYJg7ZxErqGE,26566
268
268
  opentrons/protocol_api/core/legacy/legacy_labware_core.py,sha256=WQOgtMlq--zv0Ch7mmraYr9rQBT4ie2zHqwgamBq9J8,8606
269
269
  opentrons/protocol_api/core/legacy/legacy_module_core.py,sha256=tUhj88NKBMjCmCg6wjh1e2HX4d5hxjh8ZeJiYXaTaGY,23111
270
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py,sha256=pyKkCKtYZaz5c8whXq1e1bkEitSQa93t-sK2qAa29d0,23684
270
+ opentrons/protocol_api/core/legacy/legacy_protocol_core.py,sha256=fodiDwsBi1_Yd6Hgf8Kx-iTvky_J6WHmGhwmeRBHqmE,23702
271
271
  opentrons/protocol_api/core/legacy/legacy_well_core.py,sha256=wxeiPBqaS8YQwRpDGwF7ykJ0s2y3bExwVGpNbUZMmFg,5560
272
272
  opentrons/protocol_api/core/legacy/load_info.py,sha256=r-WaH5ZJb3TRCp_zvbMMh0P4BhbZM8HsBs1K_pU98dk,1857
273
273
  opentrons/protocol_api/core/legacy/module_geometry.py,sha256=lvWFHZ81-JFw-1VZUW1R3yUIb59xpXT6H3jwlRintRo,21082
@@ -295,7 +295,7 @@ opentrons/protocol_engine/commands/__init__.py,sha256=b073p4seq9bnyqMydVrYl9b_yC
295
295
  opentrons/protocol_engine/commands/air_gap_in_place.py,sha256=Z1Tz2wFtEnlJBf_0xW0tEvX1yYJbA8ZmdZcHG_YIKwE,5387
296
296
  opentrons/protocol_engine/commands/aspirate.py,sha256=ZxpwQ5Zq-AS11aNfgxx6PsL_MrBEaawAxAi7jWwpIRE,7920
297
297
  opentrons/protocol_engine/commands/aspirate_in_place.py,sha256=vJiLSZqEzuMj-kuQESZevHM5g9brXAo159GhaFyEQm8,6530
298
- opentrons/protocol_engine/commands/aspirate_while_tracking.py,sha256=Xd5uTl768-0FFvCcJgTjwIDfOmJ9TnXeT2B8r8Z5P5Y,7179
298
+ opentrons/protocol_engine/commands/aspirate_while_tracking.py,sha256=se1GIJWxxVCmvYQF_nhJK11D54KKeoN5Yne5Sti93-A,7224
299
299
  opentrons/protocol_engine/commands/blow_out.py,sha256=3gboq4x5S8fq7j4ZZGNClXFDlOjcdW1v2g58GPdhaPI,4338
300
300
  opentrons/protocol_engine/commands/blow_out_in_place.py,sha256=jm2XXyJfIP9-AAFwXhD59_13nX18-i6QqpLGb-lK7sI,3391
301
301
  opentrons/protocol_engine/commands/command.py,sha256=1hWH_KWg_WDL4R4VXe1ZH2vO6pYt5SA-ZpuPPF1oV5E,10149
@@ -316,7 +316,7 @@ opentrons/protocol_engine/commands/hash_command_params.py,sha256=obWy4TbVH97SyhN
316
316
  opentrons/protocol_engine/commands/home.py,sha256=g77hewv-puMxEHFy0PPnl8-Nkbb7K-2qk36HbWG_Nik,3326
317
317
  opentrons/protocol_engine/commands/labware_handling_common.py,sha256=WtkdGIjQ5GBiBWsenyLyPLkSn6phgoesfWxCFTmG1AU,1074
318
318
  opentrons/protocol_engine/commands/liquid_probe.py,sha256=wjD-a_xUasEAQSfigexcIJ0FkjhEejlFUh6hpm-Y-JA,15899
319
- opentrons/protocol_engine/commands/load_labware.py,sha256=p02iOEbnYtq5gklOKTF2RNmYLVR4Ak7lnEUpSZjaHYc,8625
319
+ opentrons/protocol_engine/commands/load_labware.py,sha256=z919MRjzva9a7QW-brAnDu1BH0VLyyllHFmXGeBwdw8,7611
320
320
  opentrons/protocol_engine/commands/load_lid.py,sha256=8zRWBfdAQHSULLtjzYPEflkXC_rSSLZML9vJ4TJjxoQ,5484
321
321
  opentrons/protocol_engine/commands/load_lid_stack.py,sha256=WgSBr9bd4rRwv6yYztYuz-mIHMByPom6G0Vzo4znpAY,10572
322
322
  opentrons/protocol_engine/commands/load_liquid.py,sha256=KSS3Ps4PDdSrqHTStbioQP7P1xVzParlOH_AXLy2B1A,3417
@@ -435,7 +435,7 @@ opentrons/protocol_engine/resources/deck_data_provider.py,sha256=63c-Hmwy5IbVSoA
435
435
  opentrons/protocol_engine/resources/file_provider.py,sha256=6btMCDN7NsyFlV7Icy5vDO7xsgbmtkeAM_KCuQ-GvRo,5903
436
436
  opentrons/protocol_engine/resources/fixture_validation.py,sha256=WBGWFTmBwLPjOBFeqJYxnaSRHvo4pwxvdhT4XUW_FMY,1857
437
437
  opentrons/protocol_engine/resources/labware_data_provider.py,sha256=i0otj_dACWHK23mBGjXGwTJtE4sooov2_YQOMIulzJo,3836
438
- opentrons/protocol_engine/resources/labware_validation.py,sha256=fahspda2v_rrPluABTjBjbWJyrlG_qn54CkVr6iRqT8,2563
438
+ opentrons/protocol_engine/resources/labware_validation.py,sha256=6UkWktVvGNpOrRov4vEZ2A8qbjJMuKlisSQvr4Z749A,2747
439
439
  opentrons/protocol_engine/resources/model_utils.py,sha256=C3OHUi-OtuFUm3dS5rApSU3EJ0clnaCZEyBku5sTjzA,941
440
440
  opentrons/protocol_engine/resources/module_data_provider.py,sha256=DaTv3QqrlpKEXlIfBCSgXwlyOrV2YqWcxlHD0MGKWWw,1558
441
441
  opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7v5ETc8y5T_sbs-jTPxuSnooE,744
@@ -452,7 +452,7 @@ opentrons/protocol_engine/state/files.py,sha256=w8xxxg8HY0RqKKEGSfHWfrjV54Gb02O3
452
452
  opentrons/protocol_engine/state/fluid_stack.py,sha256=uwkf0qYk1UX5iU52xmk-e3yLPK8OG-TtMCcBqrkVFpM,5932
453
453
  opentrons/protocol_engine/state/frustum_helpers.py,sha256=9yUJP6YJgGxcvq2TNzR7hufB7wkd1RjiQVOlPIwUvUY,17220
454
454
  opentrons/protocol_engine/state/geometry.py,sha256=dDCrhiyYUn-0KxEVHrIoN0V_jBDV1DFJ5f3XIjp_ZLk,98690
455
- opentrons/protocol_engine/state/labware.py,sha256=rehy7R1HIhxx3DTtTHIKxqHoBQJ_1tDhhiculMJeIy8,57556
455
+ opentrons/protocol_engine/state/labware.py,sha256=qb9F2xUtoyhg2FdhBR0wFlW3aUJeHrBUh-NvYHzbM8k,58243
456
456
  opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4T3qaS0Sotq8sL7KLODP8,2990
457
457
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
458
458
  opentrons/protocol_engine/state/modules.py,sha256=OKVSXd8udbDV1UrWMvyshhRqRrVyerE5QRHrEZDEkrg,58796
@@ -486,7 +486,7 @@ opentrons/protocol_engine/types/labware_offset_vector.py,sha256=5Hhyv60I8KpZdUDn
486
486
  opentrons/protocol_engine/types/liquid.py,sha256=6Ec0fC0SEN3jKHYeFSwbQxdEAj5hxDPHlDcL1wXlx6k,810
487
487
  opentrons/protocol_engine/types/liquid_class.py,sha256=SF5WS3s38S87efUqawRGSIYqjhwa4pNx7fB1xdiGHl0,2384
488
488
  opentrons/protocol_engine/types/liquid_handling.py,sha256=Xx1GihrNRJJdJJA5zIwWvIYNydbSXAHjSUAliF18Iu0,319
489
- opentrons/protocol_engine/types/liquid_level_detection.py,sha256=0Pf9B_w6tTZ110pGbjgZVoigmOIEF0DVuXVHvhRKeNQ,4395
489
+ opentrons/protocol_engine/types/liquid_level_detection.py,sha256=hdSztrZcexko7p4lEkC8YuKlepv3j6ovKhMeQZuUHcg,6348
490
490
  opentrons/protocol_engine/types/location.py,sha256=qIYBs86RO1ws2aXStmdx0CqEVNF9enlj-ACknf75nSs,5707
491
491
  opentrons/protocol_engine/types/module.py,sha256=E2tQVGRBPL9DCbbY8dfC4PQafRz-ws6UJRkF9i-3q9Q,10249
492
492
  opentrons/protocol_engine/types/partial_tip_configuration.py,sha256=4RMtHOAX-dgpXWA737tthj_izTBnhKphBcA24LAKmhI,2760
@@ -584,9 +584,9 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
584
584
  opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
585
585
  opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
586
586
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
587
- opentrons-8.5.0a0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
- opentrons-8.5.0a0.dist-info/METADATA,sha256=_z6I47liMGgyxH5pZaHraPI3vnMNpUiwEpx78D7rpws,5084
589
- opentrons-8.5.0a0.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
- opentrons-8.5.0a0.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
- opentrons-8.5.0a0.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
- opentrons-8.5.0a0.dist-info/RECORD,,
587
+ opentrons-8.5.0a2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
588
+ opentrons-8.5.0a2.dist-info/METADATA,sha256=buRElpa7yDSgfDR1HmOjuKsSAYlgCuRqKTrMU-2SxmM,5084
589
+ opentrons-8.5.0a2.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
590
+ opentrons-8.5.0a2.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
591
+ opentrons-8.5.0a2.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
592
+ opentrons-8.5.0a2.dist-info/RECORD,,