Skip to content

Commit 542f79e

Browse files
committed
Merge branch 'edge' into fix_tiprack-second-window
2 parents 5257d52 + 13e6b75 commit 542f79e

File tree

109 files changed

+2572
-1070
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+2572
-1070
lines changed

api/docs/v2/basic_commands/liquids.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ This example measures the liquid height in well A2 of a plate and then immediate
7575

7676
To ensure the pipette stays submerged while aspirating, set ``target="end"`` for the aspirate or use multiple location parameters. For more, see :ref:`well-meniscus`.
7777

78-
!!! note::
78+
.. note::
7979
``measure_liquid_height()`` works best with a new pipette tip each time. To save time and tips throughout your protocol, use ``Labware.load_liquid`` instead to specify starting liquid volumes.
8080

8181
Use the ``location`` and ``end_location`` parameters in combination to direct the pipette to move to specific locations while aspirating::
@@ -192,7 +192,7 @@ This example measures the liquid height in well B1 of a plate and then immediate
192192

193193
To ensure the pipette begins the dispense at the liquid meniscus, set ``target="start"``. See :ref:`well-meniscus` for more details on pipetting relative to the liquid meniscus.
194194

195-
!!! note::
195+
.. note::
196196
``measure_liquid_height()`` works best with a new pipette tip each time. To save time and tips throughout your protocol, use ``Labware.load_liquid`` instead to specify starting liquid volumes.
197197

198198

api/docs/v2/liquid_classes.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,9 @@ Next, edit individual liquid class properties based on your Flex pipette and tip
235235

236236
.. code-block:: python
237237
238-
# edit aspirate submerge speed to 80 μL/sec
238+
# edit aspirate submerge speed to 80 µL/sec
239239
custom_water_properties.aspirate.submerge.speed = 80
240-
# edit aspirate flow rate by volume for 10 μL and 20 μL volumes
240+
# edit aspirate flow rate by volume for 10 µL and 20 µL volumes
241241
custom_water_properties.aspirate.flow_rate_by_volume.set_for_volume(volume=10.0, value=40.0)
242242
custom_water_properties.aspirate.flow_rate_by_volume.set_for_volume(volume=20.0, value=30.0)
243243
# edit to delay for 1 sec before retracting after an aspirate

api/docs/v2/robot_position.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ Here, the pipette tip stays at 1 mm below the liquid meniscus, regardless of cha
117117
Detecting liquid in a well requires pipette sensors, so you can only measure liquid height with a Flex pipette.
118118

119119
.. versionadded:: 2.23
120+
.. versionchanged:: 2.27
121+
Use the optional ``end_location`` parameter to pipette relative to the liquid meniscus as it changes.
120122

121123
.. _new-default-op-positions:
122124

api/docs/v2/versioning.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ Version 2.25
170170
-------------
171171

172172
- Adds :py:class:`.FlexStackerContext` to support the :ref:`Flex Stacker Module <stacker>`. Use the load name ``flexStackerModuleV1`` with :py:meth:`.ProtocolContext.load_module` to add a Flex Stacker and automate labware storage in a protocol.
173-
- Use the load name ``flex_96channel_200`` with :py:meth:`.load_instrument` to add the Opentrons Flex 96-Channel Pipette (1–200 μL) to a protocol. Note that this pipette does not work with liquid class commands in this API version.
173+
- Use the load name ``flex_96channel_200`` with :py:meth:`.load_instrument` to add the Opentrons Flex 96-Channel Pipette (1–200 µL) to a protocol. Note that this pipette does not work with liquid class commands in this API version.
174174

175175
Version 2.24
176176
-------------

api/release-notes.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Use Opentrons Tough Universal Lids on compatible well plates and reservoirs.
3131

3232
### Improvements
3333

34-
Transfer aqueous, viscous, or volatile liquids with the Opentrons Flex 96-Channel Pipette (1–200 μL) to apply optimized, liquid class transfer behavior to volumes as low as 1 µL.
34+
Transfer aqueous, viscous, or volatile liquids with the Opentrons Flex 96-Channel Pipette (1–200 µL) to apply optimized, liquid class transfer behavior to volumes as low as 1 µL.
3535

3636
### Bug Fixes
3737

@@ -45,12 +45,12 @@ Welcome to the v8.6.0 release of the Opentrons robot software! This release adds
4545
### New Features
4646

4747
- Automate labware storage with the Flex Stacker Module. Use new commands like `retrieve()` and `store()` to move well plates, reservoirs, or Flex tip racks to and from the Stacker during a protocol.
48-
- This release adds support for the Opentrons Flex 96-Channel Pipette (1–200 μL) to transfer as little as 1 µL in a protocol.
48+
- This release adds support for the Opentrons Flex 96-Channel Pipette (1–200 µL) to transfer as little as 1 µL in a protocol.
4949
- Control individual robot motors, like the gantry, extension mount, or gripper, with new commands.
5050

5151
### Known Limitations
5252

53-
- The Opentrons Flex 96-Channel Pipette (1–200 μL) does not yet support liquid classes. Use legacy liquid-handling commands from the Python Protocol API.
53+
- The Opentrons Flex 96-Channel Pipette (1–200 µL) does not yet support liquid classes. Use legacy liquid-handling commands from the Python Protocol API.
5454
- The Flex Gripper can't currently sense if it has failed to pick up a labware lid.
5555
- Certain partial tip pickup actions adjacent to a Flex Stacker raise an error, even though no collision would occur.
5656
- Certain robot motor control commands don't appear properly in the run log. The commands are still functional.

api/src/opentrons/system/camera.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ async def update_live_stream_status(
158158
and camera_enable_settings.liveStreamEnabled
159159
):
160160
# Check to see if the camera device is available
161-
raw_device = str(contents["SOURCE"])[1:-1]
161+
raw_device = str(contents["SOURCE"])
162162
if not os.path.exists(raw_device):
163163
log.error(
164164
f"Opentrons Live Stream cannot sample the camera. No video device found with device path: {raw_device}"

app-shell/build/release-notes.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ Welcome to the v8.8.0 release of the Opentrons App! This release includes concur
2424
- An attached pipette no longer descends to attach a calibration probe for Labware Position Check, creating more clearance on the deck.
2525
- Changed runtime parameters no longer revert to their default values.
2626

27+
### Known Issues
28+
29+
- Error recovery in the app or on the Flex touchscreen can't successfully resolve overpressure errors that occur while pipetting relative to the liquid meniscus. We recommend canceling the protocol when these errors occur.
30+
- Images captured in a protocol are not available during the run via USB. Use a different connection type (Wi-Fi or Ethernet), view the images on the touchscreen, or download the images after the run is complete.
31+
2732
---
2833

2934
## Opentrons App Changes in 8.7.0

app/src/assets/localization/zh/protocol_setup.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,12 @@
9292
"deck_hardware": "甲板硬件",
9393
"deck_map": "甲板布局图",
9494
"default_values": "默认值",
95+
"disabled": "禁用",
9596
"download_files": "下载文件",
9697
"enable_camera": "启用摄像头以继续操作",
9798
"enable_camera_to_proceed": "启用摄像头以继续",
9899
"enabled": "已启用",
100+
"error_confirming_camera": "确认摄像头偏好设置时出错",
99101
"example": "示例",
100102
"exit_to_deck_configuration": "退出到甲板配置",
101103
"extension_mount": "扩展安装支架",

app/src/molecules/InterventionModal/DeckMapContent.tsx

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { useEffect } from 'react'
22
import { css } from 'styled-components'
33

44
import {
5-
AlignControlToModule,
65
BaseDeck,
76
Box,
7+
CenterLabwareInModuleChildSlot,
8+
CenterLabwareInSlot,
89
COLORS,
910
DIRECTION_COLUMN,
1011
DISPLAY_FLEX,
@@ -15,10 +16,9 @@ import {
1516
import {
1617
FLEX_STACKER_MODULE_TYPE,
1718
getDeckDefFromRobotType,
19+
getLabwareViewBox,
1820
getModuleDef,
1921
getModuleType,
20-
getSchema2CornerOffsetFromSlot,
21-
getSchema2Dimensions,
2222
} from '@opentrons/shared-data'
2323

2424
import type { ComponentProps } from 'react'
@@ -73,10 +73,16 @@ function InterventionStyleDeckMapContent(
7373
? {
7474
...labwareOnDeck,
7575
labwareChildren: (
76-
<LabwareHighlight
77-
highlight={true}
78-
definition={labwareOnDeck.definition}
79-
/>
76+
<CenterLabwareInSlot definition={labwareOnDeck.definition}>
77+
{/*
78+
LabwareHighlight is a valid "labware" in CenterLabwareInSlot because it
79+
sizes and positions itself exactly like the underlying labware definition would.
80+
*/}
81+
<LabwareHighlight
82+
highlight={true}
83+
definition={labwareOnDeck.definition}
84+
/>
85+
</CenterLabwareInSlot>
8086
),
8187
}
8288
: labwareOnDeck
@@ -96,16 +102,20 @@ function InterventionStyleDeckMapContent(
96102
...module,
97103
moduleChildren:
98104
module?.nestedLabwareDefsBottomToTop.length > 0 ? (
99-
<AlignControlToModule
100-
// todo(mm, 2025-07-14): This <AlignControlToModule> ought to be a
101-
// <AlignLabwareToModule>; right now, this will misalign the highlight
102-
// for schema-3 labware definitions. Before we can do that,
103-
// <LabwareHighlight> and probably <BaseDeck>'s labwareChildren prop
104-
// will need to be modified.
105+
<CenterLabwareInModuleChildSlot
105106
deckId={deckDef.otId}
106107
slotId={module.moduleLocation.slotName}
107108
moduleDefinition={getModuleDef(module.moduleModel)}
109+
labwareDefinition={
110+
module.nestedLabwareDefsBottomToTop[
111+
module.nestedLabwareDefsBottomToTop.length - 1
112+
]
113+
}
108114
>
115+
{/*
116+
LabwareHighlight is a valid "labware" in CenterLabwareInModuleChildSlot because it
117+
sizes and positions itself exactly like the underlying labware definition would.
118+
*/}
109119
<LabwareHighlight
110120
highlight={true}
111121
definition={
@@ -114,7 +124,7 @@ function InterventionStyleDeckMapContent(
114124
]
115125
}
116126
/>
117-
</AlignControlToModule>
127+
</CenterLabwareInModuleChildSlot>
118128
) : undefined,
119129
}
120130
: module
@@ -144,22 +154,22 @@ function DeckConfigStyleDeckMapContent({
144154
return <>{DeckLocationSelect}</>
145155
}
146156

147-
export function LabwareHighlight({
157+
function LabwareHighlight({
148158
highlight,
149159
definition,
150160
}: {
151161
highlight: boolean
152162
definition: LabwareDefinition
153163
}): JSX.Element {
154-
const { xDimension: width, yDimension: height } =
155-
getSchema2Dimensions(definition)
156-
const cornerOffsetFromSlot = getSchema2CornerOffsetFromSlot(definition)
164+
// Size and position ourselves exactly like the underlying labware.
165+
const { minX, minY, xDimension, yDimension } = getLabwareViewBox(definition)
157166

158167
return (
159168
<RobotCoordsForeignDiv
160-
x={cornerOffsetFromSlot.x}
161-
y={cornerOffsetFromSlot.y}
162-
{...{ width, height }}
169+
x={minX}
170+
y={minY}
171+
width={xDimension}
172+
height={yDimension}
163173
innerDivProps={{
164174
display: DISPLAY_FLEX,
165175
flexDirection: DIRECTION_COLUMN,

app/src/organisms/Desktop/Devices/ProtocolRun/SetupLabware/SetupLabwareMap.tsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { useMemo, useState } from 'react'
22

33
import {
4-
AlignControlToModule,
4+
AlignToModuleChildSlot,
55
BaseDeck,
66
Box,
7+
CenterLabwareInSlot,
78
DIRECTION_COLUMN,
89
Flex,
910
LabwareInfoOverlay,
@@ -89,6 +90,8 @@ export function SetupLabwareMap({
8990
: null
9091
// TODO: ja 8.27.25: find a better way to find the matching lid def without
9192
// relying on the lidDisplayNames
93+
// TODO: mm 12.3.25: deduplicate with other places where we're doing the same thing
94+
// (grep for matchingLidDef)
9295
const matchingLidDef = Object.values(labwareDefinitionsByURI).find(
9396
uri => uri.metadata.displayName === topLabwareInfo?.lidDisplayName
9497
)
@@ -142,10 +145,7 @@ export function SetupLabwareMap({
142145
cursor="pointer"
143146
>
144147
{topLabwareDefinition != null && topLabwareInfo != null ? (
145-
<AlignControlToModule
146-
// todo(mm, 2025-07-14): This <AlignControlToModule> ought to be an
147-
// <AlignLabwareToModule>. Right now, this will misalign the overlay
148-
// for schema-3 labware definitions.
148+
<AlignToModuleChildSlot
149149
deckId={deckDef.otId}
150150
slotId={slotName}
151151
moduleDefinition={moduleDefinition}
@@ -163,7 +163,7 @@ export function SetupLabwareMap({
163163
: 0
164164
}
165165
/>
166-
</AlignControlToModule>
166+
</AlignToModuleChildSlot>
167167
) : null}
168168
</g>
169169
),
@@ -178,6 +178,10 @@ export function SetupLabwareMap({
178178
topLabwareInfo != null
179179
? labwareDefinitionsByURI[topLabwareInfo.definitionUri]
180180
: null
181+
// TODO: ja 8.27.25: find a better way to find the matching lid def without
182+
// relying on the lidDisplayNames
183+
// TODO: mm 12.3.25: deduplicate with other places where we're doing the same thing
184+
// (grep for matchingLidDef)
181185
const matchingLidDef = Object.values(labwareDefinitionsByURI).find(
182186
uri => uri.metadata.displayName === topLabwareInfo?.lidDisplayName
183187
)
@@ -199,10 +203,12 @@ export function SetupLabwareMap({
199203
labwareChildren: (
200204
<>
201205
{matchingLidDef != null ? (
202-
<LabwareRender
203-
definition={matchingLidDef}
204-
positioningMode="passThrough"
205-
/>
206+
<CenterLabwareInSlot definition={matchingLidDef}>
207+
<LabwareRender
208+
definition={matchingLidDef}
209+
positioningMode="passThrough"
210+
/>
211+
</CenterLabwareInSlot>
206212
) : null}
207213
<g
208214
cursor="pointer"

0 commit comments

Comments
 (0)