opentrons 8.4.0a2__py2.py3-none-any.whl → 8.4.0a4__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.

Files changed (45) hide show
  1. opentrons/legacy_commands/commands.py +83 -2
  2. opentrons/legacy_commands/helpers.py +59 -1
  3. opentrons/legacy_commands/types.py +30 -0
  4. opentrons/protocol_api/core/engine/instrument.py +158 -87
  5. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +6 -14
  6. opentrons/protocol_api/core/engine/transfer_components_executor.py +12 -23
  7. opentrons/protocol_api/core/instrument.py +7 -4
  8. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +7 -30
  9. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +7 -4
  10. opentrons/protocol_api/core/well.py +1 -1
  11. opentrons/protocol_api/instrument_context.py +189 -75
  12. opentrons/protocol_api/labware.py +7 -6
  13. opentrons/protocol_api/protocol_context.py +18 -16
  14. opentrons/protocol_engine/commands/__init__.py +38 -38
  15. opentrons/protocol_engine/commands/aspirate_while_tracking.py +0 -6
  16. opentrons/protocol_engine/commands/command_unions.py +33 -33
  17. opentrons/protocol_engine/commands/dispense_while_tracking.py +1 -6
  18. opentrons/protocol_engine/commands/flex_stacker/empty.py +6 -6
  19. opentrons/protocol_engine/commands/flex_stacker/fill.py +6 -6
  20. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +6 -6
  21. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +9 -9
  22. opentrons/protocol_engine/commands/flex_stacker/store.py +16 -13
  23. opentrons/protocol_engine/commands/labware_handling_common.py +6 -1
  24. opentrons/protocol_engine/commands/liquid_probe.py +1 -2
  25. opentrons/protocol_engine/commands/move_to_well.py +5 -11
  26. opentrons/protocol_engine/commands/{evotip_dispense.py → pressure_dispense.py} +27 -27
  27. opentrons/protocol_engine/commands/{evotip_seal_pipette.py → seal_pipette_to_tip.py} +32 -27
  28. opentrons/protocol_engine/commands/{evotip_unseal_pipette.py → unseal_pipette_from_tip.py} +22 -22
  29. opentrons/protocol_engine/labware_offset_standardization.py +22 -1
  30. opentrons/protocol_engine/resources/deck_configuration_provider.py +8 -4
  31. opentrons/protocol_engine/state/frustum_helpers.py +12 -4
  32. opentrons/protocol_engine/state/geometry.py +122 -73
  33. opentrons/protocol_engine/state/update_types.py +1 -1
  34. opentrons/protocol_engine/state/wells.py +1 -1
  35. opentrons/protocol_engine/types/__init__.py +6 -0
  36. opentrons/protocol_engine/types/location.py +2 -1
  37. opentrons/protocol_engine/types/well_position.py +18 -1
  38. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +1 -1
  39. opentrons/protocols/labware.py +23 -18
  40. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/METADATA +4 -4
  41. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/RECORD +45 -45
  42. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/LICENSE +0 -0
  43. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/WHEEL +0 -0
  44. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/entry_points.txt +0 -0
  45. {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/top_level.txt +0 -0
@@ -11,7 +11,7 @@ from opentrons.protocols.api_support.util import FlowRates
11
11
  from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
12
12
  from opentrons.protocol_api._nozzle_layout import NozzleLayout
13
13
  from opentrons.protocol_api._liquid import LiquidClass
14
- from opentrons.protocol_engine.types.liquid_level_detection import LiquidTrackingType
14
+ from opentrons.protocol_engine.types import LiquidTrackingType
15
15
 
16
16
  from ..disposal_locations import TrashBin, WasteChute
17
17
  from .well import WellCoreType
@@ -359,7 +359,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
359
359
  ...
360
360
 
361
361
  @abstractmethod
362
- def transfer_liquid(
362
+ def transfer_with_liquid_class(
363
363
  self,
364
364
  liquid_class: LiquidClass,
365
365
  volume: float,
@@ -367,6 +367,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
367
367
  dest: List[Tuple[types.Location, WellCoreType]],
368
368
  new_tip: TransferTipPolicyV2,
369
369
  tip_racks: List[Tuple[types.Location, LabwareCoreType]],
370
+ starting_tip: Optional[WellCoreType],
370
371
  trash_location: Union[types.Location, TrashBin, WasteChute],
371
372
  return_tip: bool,
372
373
  ) -> None:
@@ -374,7 +375,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
374
375
  ...
375
376
 
376
377
  @abstractmethod
377
- def distribute_liquid(
378
+ def distribute_with_liquid_class(
378
379
  self,
379
380
  liquid_class: LiquidClass,
380
381
  volume: float,
@@ -382,6 +383,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
382
383
  dest: List[Tuple[types.Location, WellCoreType]],
383
384
  new_tip: TransferTipPolicyV2,
384
385
  tip_racks: List[Tuple[types.Location, LabwareCoreType]],
386
+ starting_tip: Optional[WellCoreType],
385
387
  trash_location: Union[types.Location, TrashBin, WasteChute],
386
388
  return_tip: bool,
387
389
  ) -> None:
@@ -392,7 +394,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
392
394
  ...
393
395
 
394
396
  @abstractmethod
395
- def consolidate_liquid(
397
+ def consolidate_with_liquid_class(
396
398
  self,
397
399
  liquid_class: LiquidClass,
398
400
  volume: float,
@@ -400,6 +402,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
400
402
  dest: Tuple[types.Location, WellCoreType],
401
403
  new_tip: TransferTipPolicyV2,
402
404
  tip_racks: List[Tuple[types.Location, LabwareCoreType]],
405
+ starting_tip: Optional[WellCoreType],
403
406
  trash_location: Union[types.Location, TrashBin, WasteChute],
404
407
  return_tip: bool,
405
408
  ) -> None:
@@ -22,7 +22,7 @@ from opentrons.protocols.geometry import planning
22
22
  from opentrons.protocol_api._nozzle_layout import NozzleLayout
23
23
  from opentrons.protocol_api._liquid import LiquidClass
24
24
 
25
- from opentrons.protocol_engine.types.liquid_level_detection import LiquidTrackingType
25
+ from opentrons.protocol_engine.types import LiquidTrackingType
26
26
 
27
27
  from ...disposal_locations import TrashBin, WasteChute
28
28
  from ..instrument import AbstractInstrument
@@ -438,32 +438,6 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
438
438
  location=location, mount=location_cache_mount
439
439
  )
440
440
 
441
- def evotip_seal(
442
- self,
443
- location: types.Location,
444
- well_core: LegacyWellCore,
445
- in_place: Optional[bool] = False,
446
- ) -> None:
447
- """This will never be called because it was added in API 2.22."""
448
- assert False, "evotip_seal only supported in API 2.22 & later"
449
-
450
- def evotip_unseal(
451
- self, location: types.Location, well_core: WellCore, home_after: Optional[bool]
452
- ) -> None:
453
- """This will never be called because it was added in API 2.22."""
454
- assert False, "evotip_unseal only supported in API 2.22 & later"
455
-
456
- def evotip_dispense(
457
- self,
458
- location: types.Location,
459
- well_core: WellCore,
460
- volume: Optional[float] = None,
461
- flow_rate: Optional[float] = None,
462
- push_out: Optional[float] = None,
463
- ) -> None:
464
- """This will never be called because it was added in API 2.22."""
465
- assert False, "evotip_dispense only supported in API 2.22 & later"
466
-
467
441
  def get_mount(self) -> types.Mount:
468
442
  """Get the mount this pipette is attached to."""
469
443
  return self._mount
@@ -624,7 +598,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
624
598
  """This will never be called because it was added in API 2.16."""
625
599
  pass
626
600
 
627
- def transfer_liquid(
601
+ def transfer_with_liquid_class(
628
602
  self,
629
603
  liquid_class: LiquidClass,
630
604
  volume: float,
@@ -632,13 +606,14 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
632
606
  dest: List[Tuple[types.Location, LegacyWellCore]],
633
607
  new_tip: TransferTipPolicyV2,
634
608
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
609
+ starting_tip: Optional[LegacyWellCore],
635
610
  trash_location: Union[types.Location, TrashBin, WasteChute],
636
611
  return_tip: bool,
637
612
  ) -> None:
638
613
  """This will never be called because it was added in API 2.23"""
639
614
  assert False, "transfer_liquid is not supported in legacy context"
640
615
 
641
- def distribute_liquid(
616
+ def distribute_with_liquid_class(
642
617
  self,
643
618
  liquid_class: LiquidClass,
644
619
  volume: float,
@@ -646,13 +621,14 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
646
621
  dest: List[Tuple[types.Location, LegacyWellCore]],
647
622
  new_tip: TransferTipPolicyV2,
648
623
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
624
+ starting_tip: Optional[LegacyWellCore],
649
625
  trash_location: Union[types.Location, TrashBin, WasteChute],
650
626
  return_tip: bool,
651
627
  ) -> None:
652
628
  """This will never be called because it was added in API 2.23"""
653
629
  assert False, "distribute_liquid is not supported in legacy context"
654
630
 
655
- def consolidate_liquid(
631
+ def consolidate_with_liquid_class(
656
632
  self,
657
633
  liquid_class: LiquidClass,
658
634
  volume: float,
@@ -660,6 +636,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
660
636
  dest: Tuple[types.Location, LegacyWellCore],
661
637
  new_tip: TransferTipPolicyV2,
662
638
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
639
+ starting_tip: Optional[LegacyWellCore],
663
640
  trash_location: Union[types.Location, TrashBin, WasteChute],
664
641
  return_tip: bool,
665
642
  ) -> None:
@@ -23,7 +23,7 @@ from opentrons_shared_data.errors.exceptions import (
23
23
  UnexpectedTipAttachError,
24
24
  )
25
25
 
26
- from opentrons.protocol_engine.types.liquid_level_detection import LiquidTrackingType
26
+ from opentrons.protocol_engine.types import LiquidTrackingType
27
27
 
28
28
  from ..legacy.legacy_labware_core import LegacyLabwareCore
29
29
  from ...disposal_locations import TrashBin, WasteChute
@@ -513,7 +513,7 @@ class LegacyInstrumentCoreSimulator(
513
513
  """This will never be called because it was added in API 2.15."""
514
514
  pass
515
515
 
516
- def transfer_liquid(
516
+ def transfer_with_liquid_class(
517
517
  self,
518
518
  liquid_class: LiquidClass,
519
519
  volume: float,
@@ -521,13 +521,14 @@ class LegacyInstrumentCoreSimulator(
521
521
  dest: List[Tuple[types.Location, LegacyWellCore]],
522
522
  new_tip: TransferTipPolicyV2,
523
523
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
524
+ starting_tip: Optional[LegacyWellCore],
524
525
  trash_location: Union[types.Location, TrashBin, WasteChute],
525
526
  return_tip: bool,
526
527
  ) -> None:
527
528
  """This will never be called because it was added in API 2.23."""
528
529
  assert False, "transfer_liquid is not supported in legacy context"
529
530
 
530
- def distribute_liquid(
531
+ def distribute_with_liquid_class(
531
532
  self,
532
533
  liquid_class: LiquidClass,
533
534
  volume: float,
@@ -535,13 +536,14 @@ class LegacyInstrumentCoreSimulator(
535
536
  dest: List[Tuple[types.Location, LegacyWellCore]],
536
537
  new_tip: TransferTipPolicyV2,
537
538
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
539
+ starting_tip: Optional[LegacyWellCore],
538
540
  trash_location: Union[types.Location, TrashBin, WasteChute],
539
541
  return_tip: bool,
540
542
  ) -> None:
541
543
  """This will never be called because it was added in API 2.23."""
542
544
  assert False, "distribute_liquid is not supported in legacy context"
543
545
 
544
- def consolidate_liquid(
546
+ def consolidate_with_liquid_class(
545
547
  self,
546
548
  liquid_class: LiquidClass,
547
549
  volume: float,
@@ -549,6 +551,7 @@ class LegacyInstrumentCoreSimulator(
549
551
  dest: Tuple[types.Location, LegacyWellCore],
550
552
  new_tip: TransferTipPolicyV2,
551
553
  tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
554
+ starting_tip: Optional[LegacyWellCore],
552
555
  trash_location: Union[types.Location, TrashBin, WasteChute],
553
556
  return_tip: bool,
554
557
  ) -> None:
@@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
4
4
  from typing import TypeVar, Optional, Union
5
5
 
6
6
  from opentrons.types import Point
7
- from opentrons.protocol_engine.types.liquid_level_detection import LiquidTrackingType
7
+ from opentrons.protocol_engine.types import LiquidTrackingType
8
8
 
9
9
  from .._liquid import Liquid
10
10
 
@@ -42,7 +42,7 @@ from ..protocols.advanced_control.transfers.common import (
42
42
  TransferTipPolicyV2,
43
43
  TransferTipPolicyV2Type,
44
44
  )
45
- from ..protocol_engine.types.liquid_level_detection import LiquidTrackingType
45
+ from ..protocol_engine.types import LiquidTrackingType
46
46
 
47
47
  _DEFAULT_ASPIRATE_CLEARANCE = 1.0
48
48
  _DEFAULT_DISPENSE_CLEARANCE = 1.0
@@ -1509,7 +1509,7 @@ class InstrumentContext(publisher.CommandPublisher):
1509
1509
  getattr(self, cmd["method"])(*cmd["args"], **cmd["kwargs"])
1510
1510
 
1511
1511
  @requires_version(2, 23)
1512
- def transfer_liquid(
1512
+ def transfer_with_liquid_class(
1513
1513
  self,
1514
1514
  liquid_class: LiquidClass,
1515
1515
  volume: float,
@@ -1526,12 +1526,40 @@ class InstrumentContext(publisher.CommandPublisher):
1526
1526
  return_tip: bool = False,
1527
1527
  visit_every_well: bool = False,
1528
1528
  ) -> InstrumentContext:
1529
- """Transfer liquid from source to dest using the specified liquid class properties.
1529
+ """Move a particular type of liquid from one well or group of wells to another.
1530
1530
 
1531
- TODO: Add args description.
1531
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1532
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1533
+ source contains.
1534
+ :type liquid_class: :py:class:`.LiquidClass`
1535
+
1536
+ :param volume: The amount, in µL, to aspirate from each source and dispense to
1537
+ each destination.
1538
+ :param source: A single well or a list of wells to aspirate liquid from.
1539
+ :param dest: A single well or a list of wells to dispense liquid into.
1540
+ :param new_tip: When to pick up and drop tips during the command.
1541
+ Defaults to ``"once"``.
1542
+
1543
+ - ``"once"``: Use one tip for the entire command.
1544
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1545
+ - ``"per source"``: Use one tip for each source well, even if
1546
+ :ref:`tip refilling <complex-tip-refilling>` is required.
1547
+ - ``"never"``: Do not pick up or drop tips at all.
1548
+
1549
+ See :ref:`param-tip-handling` for details.
1550
+
1551
+ :param trash_location: A trash container, well, or other location to dispose of
1552
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1553
+ :param return_tip: Whether to drop used tips in their original locations
1554
+ in the tip rack, instead of the trash.
1555
+ """
1556
+ if volume == 0.0:
1557
+ _log.info(
1558
+ f"Transfer of {liquid_class.name} specified with a volume of 0uL."
1559
+ f" Skipping."
1560
+ )
1561
+ return self
1532
1562
 
1533
- :meta private:
1534
- """
1535
1563
  transfer_args = verify_and_normalize_transfer_args(
1536
1564
  source=source,
1537
1565
  dest=dest,
@@ -1552,29 +1580,42 @@ class InstrumentContext(publisher.CommandPublisher):
1552
1580
  " to transfer liquid onto one destinations from many sources, use 'consolidate_liquid'."
1553
1581
  )
1554
1582
 
1555
- self._core.transfer_liquid(
1556
- liquid_class=liquid_class,
1557
- volume=volume,
1558
- source=[
1559
- (types.Location(types.Point(), labware=well), well._core)
1560
- for well in transfer_args.sources_list
1561
- ],
1562
- dest=[
1563
- (types.Location(types.Point(), labware=well), well._core)
1564
- for well in transfer_args.destinations_list
1565
- ],
1566
- new_tip=transfer_args.tip_policy,
1567
- tip_racks=[
1568
- (types.Location(types.Point(), labware=rack), rack._core)
1569
- for rack in transfer_args.tip_racks
1570
- ],
1571
- trash_location=transfer_args.trash_location,
1572
- return_tip=return_tip,
1573
- )
1583
+ with publisher.publish_context(
1584
+ broker=self.broker,
1585
+ command=cmds.transfer_with_liquid_class(
1586
+ instrument=self,
1587
+ liquid_class=liquid_class,
1588
+ volume=volume,
1589
+ source=source,
1590
+ destination=dest,
1591
+ ),
1592
+ ):
1593
+ self._core.transfer_with_liquid_class(
1594
+ liquid_class=liquid_class,
1595
+ volume=volume,
1596
+ source=[
1597
+ (types.Location(types.Point(), labware=well), well._core)
1598
+ for well in transfer_args.sources_list
1599
+ ],
1600
+ dest=[
1601
+ (types.Location(types.Point(), labware=well), well._core)
1602
+ for well in transfer_args.destinations_list
1603
+ ],
1604
+ new_tip=transfer_args.tip_policy,
1605
+ tip_racks=[
1606
+ (types.Location(types.Point(), labware=rack), rack._core)
1607
+ for rack in transfer_args.tip_racks
1608
+ ],
1609
+ starting_tip=self.starting_tip._core
1610
+ if self.starting_tip is not None
1611
+ else None,
1612
+ trash_location=transfer_args.trash_location,
1613
+ return_tip=return_tip,
1614
+ )
1574
1615
  return self
1575
1616
 
1576
1617
  @requires_version(2, 23)
1577
- def distribute_liquid(
1618
+ def distribute_with_liquid_class(
1578
1619
  self,
1579
1620
  liquid_class: LiquidClass,
1580
1621
  volume: float,
@@ -1590,13 +1631,38 @@ class InstrumentContext(publisher.CommandPublisher):
1590
1631
  visit_every_well: bool = False,
1591
1632
  ) -> InstrumentContext:
1592
1633
  """
1593
- Distribute liquid from a single source to multiple destinations
1594
- using the specified liquid class properties.
1634
+ Distribute a particular type of liquid from one well to a group of wells.
1635
+
1636
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1637
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1638
+ source contains.
1639
+ :type liquid_class: :py:class:`.LiquidClass`
1640
+
1641
+ :param volume: The amount, in µL, to aspirate from the source and dispense to
1642
+ each destination.
1643
+ :param source: A single well to aspirate liquid from.
1644
+ :param dest: A list of wells to dispense liquid into.
1645
+ :param new_tip: When to pick up and drop tips during the command.
1646
+ Defaults to ``"once"``.
1595
1647
 
1596
- TODO: Add args description.
1648
+ - ``"once"`` or ``"per source"``: Use one tip for the entire command.
1649
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1650
+ - ``"never"``: Do not pick up or drop tips at all.
1597
1651
 
1598
- :meta private:
1652
+ See :ref:`param-tip-handling` for details.
1653
+
1654
+ :param trash_location: A trash container, well, or other location to dispose of
1655
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1656
+ :param return_tip: Whether to drop used tips in their original locations
1657
+ in the tip rack, instead of the trash.
1599
1658
  """
1659
+ if volume == 0.0:
1660
+ _log.info(
1661
+ f"Distribution of {liquid_class.name} specified with a volume of 0uL."
1662
+ f" Skipping."
1663
+ )
1664
+ return self
1665
+
1600
1666
  transfer_args = verify_and_normalize_transfer_args(
1601
1667
  source=source,
1602
1668
  dest=dest,
@@ -1621,29 +1687,42 @@ class InstrumentContext(publisher.CommandPublisher):
1621
1687
  )
1622
1688
 
1623
1689
  verified_source = transfer_args.sources_list[0]
1624
- self._core.distribute_liquid(
1625
- liquid_class=liquid_class,
1626
- volume=volume,
1627
- source=(
1628
- types.Location(types.Point(), labware=verified_source),
1629
- verified_source._core,
1690
+ with publisher.publish_context(
1691
+ broker=self.broker,
1692
+ command=cmds.distribute_with_liquid_class(
1693
+ instrument=self,
1694
+ liquid_class=liquid_class,
1695
+ volume=volume,
1696
+ source=source,
1697
+ destination=dest,
1630
1698
  ),
1631
- dest=[
1632
- (types.Location(types.Point(), labware=well), well._core)
1633
- for well in transfer_args.destinations_list
1634
- ],
1635
- new_tip=transfer_args.tip_policy,
1636
- tip_racks=[
1637
- (types.Location(types.Point(), labware=rack), rack._core)
1638
- for rack in transfer_args.tip_racks
1639
- ],
1640
- trash_location=transfer_args.trash_location,
1641
- return_tip=return_tip,
1642
- )
1699
+ ):
1700
+ self._core.distribute_with_liquid_class(
1701
+ liquid_class=liquid_class,
1702
+ volume=volume,
1703
+ source=(
1704
+ types.Location(types.Point(), labware=verified_source),
1705
+ verified_source._core,
1706
+ ),
1707
+ dest=[
1708
+ (types.Location(types.Point(), labware=well), well._core)
1709
+ for well in transfer_args.destinations_list
1710
+ ],
1711
+ new_tip=transfer_args.tip_policy,
1712
+ tip_racks=[
1713
+ (types.Location(types.Point(), labware=rack), rack._core)
1714
+ for rack in transfer_args.tip_racks
1715
+ ],
1716
+ starting_tip=self.starting_tip._core
1717
+ if self.starting_tip is not None
1718
+ else None,
1719
+ trash_location=transfer_args.trash_location,
1720
+ return_tip=return_tip,
1721
+ )
1643
1722
  return self
1644
1723
 
1645
1724
  @requires_version(2, 23)
1646
- def consolidate_liquid(
1725
+ def consolidate_with_liquid_class(
1647
1726
  self,
1648
1727
  liquid_class: LiquidClass,
1649
1728
  volume: float,
@@ -1659,13 +1738,39 @@ class InstrumentContext(publisher.CommandPublisher):
1659
1738
  visit_every_well: bool = False,
1660
1739
  ) -> InstrumentContext:
1661
1740
  """
1662
- Consolidate liquid from multiple sources to a single destination
1663
- using the specified liquid class properties.
1741
+ Consolidate a particular type of liquid from a group of wells to one well.
1664
1742
 
1665
- TODO: Add args description.
1743
+ :param liquid_class: The type of liquid to move. You must specify the liquid class,
1744
+ even if you have used :py:meth:`.load_liquid` to indicate what liquid the
1745
+ source contains.
1746
+ :type liquid_class: :py:class:`.LiquidClass`
1666
1747
 
1667
- :meta private:
1748
+ :param volume: The amount, in µL, to aspirate from the source and dispense to
1749
+ each destination.
1750
+ :param source: A list of wells to aspirate liquid from.
1751
+ :param dest: A single well to dispense liquid into.
1752
+ :param new_tip: When to pick up and drop tips during the command.
1753
+ Defaults to ``"once"``.
1754
+
1755
+ - ``"once"``: Use one tip for the entire command.
1756
+ - ``"always"``: Use a new tip for each set of aspirate and dispense steps.
1757
+ - ``"per source"``: Not available when consolidating.
1758
+ - ``"never"``: Do not pick up or drop tips at all.
1759
+
1760
+ See :ref:`param-tip-handling` for details.
1761
+
1762
+ :param trash_location: A trash container, well, or other location to dispose of
1763
+ tips. Depending on the liquid class, the pipette may also blow out liquid here.
1764
+ :param return_tip: Whether to drop used tips in their original locations
1765
+ in the tip rack, instead of the trash.
1668
1766
  """
1767
+ if volume == 0.0:
1768
+ _log.info(
1769
+ f"Consolidation of {liquid_class.name} specified with a volume of 0uL."
1770
+ f" Skipping."
1771
+ )
1772
+ return self
1773
+
1669
1774
  transfer_args = verify_and_normalize_transfer_args(
1670
1775
  source=source,
1671
1776
  dest=dest,
@@ -1690,25 +1795,38 @@ class InstrumentContext(publisher.CommandPublisher):
1690
1795
  )
1691
1796
 
1692
1797
  verified_dest = transfer_args.destinations_list[0]
1693
- self._core.consolidate_liquid(
1694
- liquid_class=liquid_class,
1695
- volume=volume,
1696
- source=[
1697
- (types.Location(types.Point(), labware=well), well._core)
1698
- for well in transfer_args.sources_list
1699
- ],
1700
- dest=(
1701
- types.Location(types.Point(), labware=verified_dest),
1702
- verified_dest._core,
1798
+ with publisher.publish_context(
1799
+ broker=self.broker,
1800
+ command=cmds.consolidate_with_liquid_class(
1801
+ instrument=self,
1802
+ liquid_class=liquid_class,
1803
+ volume=volume,
1804
+ source=source,
1805
+ destination=dest,
1703
1806
  ),
1704
- new_tip=transfer_args.tip_policy,
1705
- tip_racks=[
1706
- (types.Location(types.Point(), labware=rack), rack._core)
1707
- for rack in transfer_args.tip_racks
1708
- ],
1709
- trash_location=transfer_args.trash_location,
1710
- return_tip=return_tip,
1711
- )
1807
+ ):
1808
+ self._core.consolidate_with_liquid_class(
1809
+ liquid_class=liquid_class,
1810
+ volume=volume,
1811
+ source=[
1812
+ (types.Location(types.Point(), labware=well), well._core)
1813
+ for well in transfer_args.sources_list
1814
+ ],
1815
+ dest=(
1816
+ types.Location(types.Point(), labware=verified_dest),
1817
+ verified_dest._core,
1818
+ ),
1819
+ new_tip=transfer_args.tip_policy,
1820
+ tip_racks=[
1821
+ (types.Location(types.Point(), labware=rack), rack._core)
1822
+ for rack in transfer_args.tip_racks
1823
+ ],
1824
+ starting_tip=self.starting_tip._core
1825
+ if self.starting_tip is not None
1826
+ else None,
1827
+ trash_location=transfer_args.trash_location,
1828
+ return_tip=return_tip,
1829
+ )
1712
1830
  return self
1713
1831
 
1714
1832
  @requires_version(2, 0)
@@ -2522,10 +2640,6 @@ class InstrumentContext(publisher.CommandPublisher):
2522
2640
  """Check the height of the liquid within a well.
2523
2641
 
2524
2642
  :returns: The height, in mm, of the liquid from the deck.
2525
-
2526
- :meta private:
2527
-
2528
- This is intended for Opentrons internal use only and is not a guaranteed API.
2529
2643
  """
2530
2644
  self._raise_if_pressure_not_supported_by_pipette()
2531
2645
  loc = well.top()
@@ -46,7 +46,7 @@ from opentrons.protocols.api_support.util import (
46
46
  APIVersionError,
47
47
  UnsupportedAPIError,
48
48
  )
49
- from opentrons.protocol_engine.types.liquid_level_detection import LiquidTrackingType
49
+ from opentrons.protocol_engine.types import LiquidTrackingType
50
50
 
51
51
  # TODO(mc, 2022-09-02): re-exports provided for backwards compatibility
52
52
  # remove when their usage is no longer needed
@@ -684,7 +684,7 @@ class Labware:
684
684
  version: Optional[int] = None,
685
685
  ) -> Labware:
686
686
  """
687
- Load a stack of Lids onto a valid Deck Location or Adapter.
687
+ Load a stack of Opentrons Tough Auto-Sealing Lids onto a valid deck location or adapter.
688
688
 
689
689
  :param str load_name: A string to use for looking up a lid definition.
690
690
  You can find the ``load_name`` for any standard lid on the Opentrons
@@ -705,9 +705,7 @@ class Labware:
705
705
  leave this unspecified to let ``load_lid_stack()`` choose a version
706
706
  automatically.
707
707
 
708
- :return: The initialized and loaded labware object representing the Lid Stack.
709
-
710
- :meta private:
708
+ :return: The initialized and loaded labware object representing the lid stack.
711
709
  """
712
710
  if self._api_version < validation.LID_STACK_VERSION_GATE:
713
711
  raise APIVersionError(
@@ -773,11 +771,14 @@ class Labware:
773
771
  you must either use ``set_offset()`` on all of them or none of them.
774
772
  * - 2.14–2.17
775
773
  - ``set_offset()`` is not available, and the API raises an error.
776
- * - 2.18 and newer
774
+ * - 2.18--2.22
777
775
  -
778
776
  - Offsets apply to any labware of the same type, in the same on-deck location.
779
777
  - Offsets can't be set on labware that is currently off-deck.
780
778
  - Offsets do not follow a labware instance when using :py:meth:`.move_labware`.
779
+ * - 2.23 and newer
780
+ -
781
+ On Flex, offsets can apply to all labware of the same type, regardless of their on-deck location.
781
782
 
782
783
  .. note::
783
784