feat(api, shared-data): Add labware containment and vacuum module dock support.#20802
Open
feat(api, shared-data): Add labware containment and vacuum module dock support.#20802
Conversation
sfoster1
reviewed
Apr 9, 2026
Member
sfoster1
left a comment
There was a problem hiding this comment.
is there any way you can split this up so there's one pr per large section?
Contributor
|
Pulling edge should fix the lint issue 👍 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This PR introduces labware containment support and adds the necessary API and hardware-control functionality to enable workflows with the Vacuum Module — specifically the SLAS 2026 demo protocol that uses the Millipore vacuum manifold collar.
Key Features Added
1. Labware Containment Model
containedSpaceto the labware definition schema._is_fully_contained) to check whether a child labware fits completely inside a parent.ensure_location_not_occupiedto respect containment when determining occupancy for nested labware.get_parent_from_location()helper to recursively resolve the root location of deeply nested labware.This enables true nested labware workflows (e.g., manifold collar → filter plate) while maintaining safety and correctness in the engine.
2. Vacuum Module Dock Support
vacuumModuleV1Dockas an addressable area on the Vacuum Module fixture.load_adapter()to acceptAddressableAreaLocation(so it can target the dock).VacuumModuleContext:load_adapter_to_dock(load_name: str)— loads a compatible adapter (e.g., manifold collar) directly onto the private staging dock.move_to_dock(labware: Labware, use_gripper: bool = True)— moves a labware/adapter to the dock using the gripper.isMovableAdapterlabware definitions so the collar can be moved withctx.move_labware(..., use_gripper=True).3. Vacuum Module Improvements
create_simulating_module).start_set_vacuum(), pressure/pump state getters, and proper live data handling.4. Demo Protocol
vacuum_module_slas_2026_demo.pyas a working example of the full workflow (collar loading, gripper moves between dock and module, vacuum cycles, absorbance reading, etc.).millipore_vacuum_manifold_collar_tallwith containedSpacemillipore_vacuum_manifold_collar_standardwith containedSpaceinvitroven_filter_plateto work inside the collar viacontainedSpaceTest Plan and Hands on Testing
Changelog
moveableAdapterparameter in the defcontainedSpaceproperty to labware definition to model the space inside a labware._is_fully_containedto check if a labware is fully enclosed by another onecontainedSpacelogic toensure_location_not_occupiedto not just checkif a location is occupied, but to make sure we can geometrically fit plates inside
each other to determine occupancy.
VacuumModuleSubStateand corresponding gettersReview requests
vacuumModuleV1Dockaddressable area, it needs to be loaded, but we do have to extend load_adapter to accept AddressableAreaLocation. Is this a good idea?containedSpaceimplementation so far inensure_location_not_occupiedfunctionRisk assessment
Low, unreleased
TODO