Skip to content

Commit

Permalink
chore: incremental 7.0 alpha.12 into edge
Browse files Browse the repository at this point in the history
  • Loading branch information
jerader committed Sep 18, 2023
2 parents 8a72be2 + e121d3c commit e4cc6dc
Show file tree
Hide file tree
Showing 417 changed files with 7,529 additions and 3,585 deletions.
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -380,10 +380,10 @@ ssh-keygen # note the path you save the key to
make -C robot-server install-key br_ssh_pubkey=/path/to/pubkey host=${some_other_ip_address}
```

and subsequently, when you do `make term`, add the `br_ssh_key=/path/to/key` option:
and subsequently, when you do `make term`, add the `ssh_key=/path/to/key` option:

```shell
make term br_ssh_key=/path/to/privkey
make term ssh_key=/path/to/privkey
```

If you create the key as `~/.ssh/robot_key` and `~/.ssh/robot_key.pub` then `make term` and `make install-key` will work without arguments.
Expand Down
22 changes: 22 additions & 0 deletions api-client/src/instruments/__fixtures__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,25 @@ export const instrumentsResponseFixture = {
},
],
}

export const instrumentsResponseLeftPipetteFixture = {
data: { channels: 1, min_volume: 1, max_volume: 50 },
instrumentModel: 'p1000_single_v3.0',
instrumentName: 'p1000_single_flex',
instrumentType: 'pipette',
mount: 'left',
serialNumber: 'abc',
subsystem: 'pipette_left',
ok: true,
}

export const instrumentsResponseRightPipetteFixture = {
data: { channels: 1, min_volume: 1, max_volume: 50 },
instrumentModel: 'p1000_single_v3.0',
instrumentName: 'p1000_single_flex',
instrumentType: 'pipette',
mount: 'right',
serialNumber: 'cba',
subsystem: 'pipette_right',
ok: true,
}
22 changes: 0 additions & 22 deletions api-client/src/pipettes/__fixtures__/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -252,25 +252,3 @@ export const pipetteSettingsResponseFixture = {
},
},
}

export const pipetteDataLeftFixture = {
data: { channels: 1, min_volume: 1, max_volume: 50 },
instrumentModel: 'p1000_single_v3.0',
instrumentName: 'p1000_single_gen3',
instrumentType: 'pipette',
mount: 'left',
serialNumber: 'abc',
subsystem: 'pipette_left',
ok: true,
}

export const pipetteResponseRightFixture = {
data: { channels: 1, min_volume: 1, max_volume: 50 },
instrumentModel: 'p1000_single_v3.0',
instrumentName: 'p1000_single_gen3',
instrumentType: 'pipette',
mount: 'right',
serialNumber: 'cba',
subsystem: 'pipette_right',
ok: true,
}
25 changes: 13 additions & 12 deletions api/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ test_opts ?=
pypi_username ?=
pypi_password ?=

# Host key location for buildroot robot
br_ssh_key ?= $(default_ssh_key)
# Other SSH args for buildroot robots
# Host key location for robot
ssh_key ?= $(default_ssh_key)
# Other SSH args for robot
ssh_opts ?= $(default_ssh_opts)
# Helper to safely bundle ssh options
ssh_helper = $(if $(ssh_key),-i $(ssh_key)) $(ssh_opts)

twine_auth_args := --username $(pypi_username) --password $(pypi_password)
twine_repository_url ?= $(pypi_test_upload_url)
Expand Down Expand Up @@ -171,24 +173,23 @@ local-shell:

.PHONY: push-no-restart
push-no-restart: wheel
$(call push-python-package,$(host),$(br_ssh_key),$(ssh_opts),$(wheel_file))
$(call push-python-package,$(host),$(ssh_key),$(ssh_opts),$(wheel_file))

.PHONY: push
push: push-no-restart
$(call restart-service,$(host),$(br_ssh_key),$(ssh_opts),"jupyter-notebook opentrons-robot-server")
$(call restart-service,$(host),$(ssh_key),$(ssh_opts),"jupyter-notebook opentrons-robot-server")

.PHONY: push-no-restart-ot3
push-no-restart-ot3: sdist
echo $(sdist_file)
$(call push-python-sdist,$(host),,$(ssh_opts),$(sdist_file),/opt/opentrons-robot-server,opentrons,src,,$(version_file))
ssh $(ssh_opts) root@$(host) "mount -o remount,rw / && mkdir -p /usr/local/bin"
scp $(ssh_opts) ./src/opentrons/hardware_control/scripts/ot3repl root@$(host):/usr/local/bin/ot3repl
scp $(ssh_opts) ./src/opentrons/hardware_control/scripts/ot3gripper root@$(host):/usr/local/bin/ot3gripper
ssh $(ssh_opts) root@$(host) "mount -o remount,ro /"
$(call push-python-sdist,$(host),$(ssh_key),$(ssh_opts),$(sdist_file),/opt/opentrons-robot-server,opentrons,src,,$(version_file))
ssh $(ssh_helper) root@$(host) "mount -o remount,rw / && mkdir -p /usr/local/bin"
scp $(ssh_helper) ./src/opentrons/hardware_control/scripts/{ot3repl,ot3gripper} root@$(host):/usr/local/bin/
ssh $(ssh_helper) root@$(host) "mount -o remount,ro /"

.PHONY: push-ot3
push-ot3: push-no-restart-ot3
$(call restart-server,$(host),,$(ssh_opts),"opentrons-robot-server")
$(call restart-server,$(host),$(host),$(ssh_opts),"opentrons-robot-server")

.PHONY: simulate
simulate:
Expand All @@ -206,7 +207,7 @@ deploy: wheel
# User must currently specify host, e.g.: `make term host=169.254.202.176`
.PHONY: term
term:
ssh -i $(br_ssh_key) $(ssh_opts) root@$(host)
ssh $(ssh_helper) root@$(host)

.PHONY: plot-session
plot-session:
Expand Down
41 changes: 40 additions & 1 deletion api/docs/v2/new_pipette.rst
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,41 @@ The OT-2 works with the GEN1 and GEN2 pipette models. The newer GEN2 pipettes ha

The single- and multi-channel P50 GEN1 pipettes are the exceptions here. If your protocol uses a P50 GEN1 pipette, there is no backward compatibility with a related GEN2 pipette. To replace a P50 GEN1 with a corresponding GEN2 pipette, edit your protocol to load a P20 Single-Channel GEN2 (for volumes below 20 µL) or a P300 Single-Channel GEN2 (for volumes between 20 and 50 µL).

.. _pipette-volume-modes:

Volume Modes
============

The Flex 1-Channel 50 µL and Flex 8-Channel 50 µL pipettes must operate in a low-volume mode to accurately dispense 1 µL of liquid. Set low-volume mode by calling :py:meth:`.InstrumentContext.configure_for_volume` with the amount of liquid you plan to aspirate, in µL::

pipette50.configure_for_volume(1)
pipette50.pick_up_tip()
pipette50.aspirate(1, plate["A1"])
.. versionadded:: 2.15

.. note::
The pipette must not contain liquid when you call ``configure_for_volume()``, or the API will raise an error.

Also, if the pipette is in a well location that may contain liquid, it will move upward to ensure it is not immersed in liquid before changing its mode.

In a protocol that handles many different volumes, it's a good practice to call this function immediately before each :py:meth:`.transfer` or :py:meth:`.aspirate`, specifying the volume that you are about to handle. When operating with a list of volumes, nest ``configure_for_volume()`` inside a ``for`` loop to ensure that the pipette is properly configured for each volume:

.. code-block:: python
volumes = [1, 2, 3, 4, 1, 5, 2, 8]
sources = plate.columns()[0]
destinations = plate.columns()[1]
for i in range(8):
pipette50.pick_up_tip()
pipette50.configure_for_volume(volumes[i])
pipette50.aspirate(volume=volumes[i], location=sources[i])
pipette50.dispense(location=destinations[i])
pipette50.drop_tip()
If you know that all your liquid handling will take place in a specific mode, then you can call ``configure_for_volume()`` just once with a nominal volume. Or if all the volumes correspond to the pipette's default mode, you don't have to call ``configure_for_volume()`` at all.


.. _new-plunger-flow-rates:

Pipette Flow Rates
Expand Down Expand Up @@ -343,9 +378,13 @@ Now let's change the flow rates for each action::
pipette.aspirate(200, plate['A1']) # 50 µL/s
pipette.dispense(200, plate['A2']) # 100 µL/s
pipette.blow_out() # 75 µL/s
These flow rates will remain in effect until you change the ``flow_rate`` attribute again *or* call ``configure_for_volume()``. Calling ``configure_for_volume()`` always resets all pipette flow rates to the defaults for the mode that it sets.

.. TODO add mode ranges and flow defaults to sections below
.. note::
In API version 2.13 and earlier, :py:obj:`.InstrumentContext.speed` offered similar functionality. It attempted to set the plunger speed in mm/s. Due to technical limitations, that speed could only be approximate. You must use ``.flow_rate`` in version 2.14 and later, and you should consider replacing older code that sets ``.speed``.
In API version 2.13 and earlier, :py:obj:`.InstrumentContext.speed` offered similar functionality to ``.flow_rate``. It attempted to set the plunger speed in mm/s. Due to technical limitations, that speed could only be approximate. You must use ``.flow_rate`` in version 2.14 and later, and you should consider replacing older code that sets ``.speed``.

.. versionadded:: 2.0

Expand Down
4 changes: 2 additions & 2 deletions api/mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ warn_untyped_fields = True

# TODO(mc, 2021-09-08): fix and remove any / all of the
# overrides below whenever able
# ~125 errors
[mypy-opentrons.protocols.advanced_control.*,opentrons.protocols.api_support.*,opentrons.protocols.duration.*,opentrons.protocols.execution.*,opentrons.protocols.geometry.*,opentrons.protocols.models.*,opentrons.protocols.labware.*]
# ~115 errors
[mypy-opentrons.protocols.advanced_control.*,opentrons.protocols.api_support.*,opentrons.protocols.duration.*,opentrons.protocols.execution.dev_types,opentrons.protocols.execution.execute_json_v4,opentrons.protocols.execution.execute_python,opentrons.protocols.geometry.*,opentrons.protocols.models.*,opentrons.protocols.labware.*]
disallow_any_generics = False
disallow_untyped_defs = False
disallow_untyped_calls = False
Expand Down
98 changes: 58 additions & 40 deletions api/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,45 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr

Welcome to the v7.0.0 release of the Opentrons robot software! This release adds support for the Opentrons Flex robot, instruments, modules, and labware.

This update may take longer than usual. Allow **approximately 15 minutes** for your robot to restart. This delay will only happen once.

### New Features

- Flex touchscreen
- Robot dashboard: Quickly access recently run protocols.
- Manage protocols: Organize, view details, set up, and run protocols directly from the touchscreen.
- Manage instruments: View information about connected pipettes and the gripper. Attach, detach, or recalibrate instruments.
- Robot settings: Customize the behavior of your Flex, including the LED and touchscreen displays.
- Flex features
- Analyze and run protocols that use the Flex robot, Flex pipettes, and Flex tip racks.
- Move labware around the deck automatically with the Flex Gripper.
- Use the Flex Gripper to move labware onto or off of the Magnetic Block.
- Python API features
- Manually move labware around, off of, or onto the deck without ending your protocol.
- Load adapters separately from labware (to allow moving labware onto or off of the adapter).
- Use coordinate or numeric deck slot names interchangeably.
Flex touchscreen

- Robot dashboard: Quickly access recently run protocols.
- Manage protocols: Organize, view details, set up, and run protocols directly from the touchscreen.
- Manage instruments: View information about connected pipettes and the gripper. Attach, detach, or recalibrate instruments.
- Robot settings: Customize the behavior of your Flex, including the LED and touchscreen displays.

Flex features

- Analyze and run protocols that use the Flex robot, Flex pipettes, and Flex tip racks.
- Move labware around the deck automatically with the Flex Gripper.
- Use the Flex Gripper to move labware onto or off of the Magnetic Block.

Python API features

- Manually move labware around, off of, or onto the deck without ending your protocol.
- Load adapters separately from labware (to allow moving labware onto or off of the adapter).
- Use coordinate or numeric deck slot names interchangeably.

### Improved Features

- The API relaxes placement restrictions for the Heater-Shaker Module on Flex.
- Pipettes drop tips in multiple locations above the trash bin to prevent tips from stacking up.
- Pipettes drop tips in multiple locations above the fixed trash, to prevent tips from stacking up.

### Bug Fixes

- The API no longer raises an error when dropping tips into labware other than the fixed trash.
- All API versions now properly track tips, including starting at a well other than A1.

### Known Issues

- Tip tracking starting at a well other than A1 will not pick up tips from the intended locations.
Some protocols can't be simulated with the `opentrons_simulate` command-line tool:

- JSON protocols created or modified with Protocol Designer v6.0.0 or higher.
- Python protocols specifying an `apiLevel` of 2.14 or higher.

---

Expand Down Expand Up @@ -67,9 +82,10 @@ Welcome to the v6.3.0 release of the OT-2 software!

### Known Issues

- Some protocols can't be simulated with the `opentrons_simulate` command-line tool:
- JSON protocols created or modified with Protocol Designer v6.0.0 or higher
- Python protocols specifying an `apiLevel` of 2.14
Some protocols can't be simulated with the `opentrons_simulate` command-line tool:

- JSON protocols created or modified with Protocol Designer v6.0.0 or higher
- Python protocols specifying an `apiLevel` of 2.14

---
## OT-2 Software Changes in 6.2.1
Expand All @@ -91,9 +107,10 @@ Welcome to the v6.2.0 release of the OT-2 software! This release focuses on addi

### New Features

- Thermocycler GEN2 support
- Lid temperature is now available when querying module status
- Pipettes properly move to avoid the GEN2 module
Thermocycler GEN2 support

- Lid temperature is now available when querying module status
- Pipettes properly move to avoid the GEN2 module

### Bug Fixes

Expand All @@ -107,11 +124,12 @@ Welcome to the v6.1.0 release of the OT-2 software! This release adds support fo

### New Features

- Heater-Shaker support
- The OT-2 can run JSON and Python protocols that control the Heater-Shaker Module
- Implements restrictions on module and labware placement around the Heater-Shaker
- When possible, the OT-2 will automatically move its pipettes or the Heater-Shaker's labware latch to shake safely and avoid crashes
- The OT-2 can update the firmware on an attached Heater-Shaker
Heater-Shaker support

- The OT-2 can run JSON and Python protocols that control the Heater-Shaker Module
- Implements restrictions on module and labware placement around the Heater-Shaker
- When possible, the OT-2 will automatically move its pipettes or the Heater-Shaker's labware latch to shake safely and avoid crashes
- The OT-2 can update the firmware on an attached Heater-Shaker

### Bug Fixes

Expand Down Expand Up @@ -240,10 +258,11 @@ The 4.5.0 release of the OT-2 Software improves the speed of protocol uploads an

### New Features

- The OT-2 now uses a faster analysis method on protocol upload
- Thanks to everyone who beta tested this feature over the last few months!
- You may revert to the old analysis method with the **Use Older Protocol Analysis Method** in your OT-2's advanced settings
- If you encounter any issues (e.g. protocol run errors not caught during upload) please reach out to Opentrons Support or [open an issue][] in GitHub so we can continue to improve this feature
The OT-2 now uses a faster analysis method on protocol upload

- Thanks to everyone who beta tested this feature over the last few months!
- You may revert to the old analysis method with the **Use Older Protocol Analysis Method** in your OT-2's advanced settings
- If you encounter any issues (e.g. protocol run errors not caught during upload) please reach out to Opentrons Support or [open an issue][] in GitHub so we can continue to improve this feature

### Bug Fixes

Expand Down Expand Up @@ -320,8 +339,7 @@ experiencing this issue.

### Bugfixes

- Fixed an issue where tip length calibration was not being accessed correctly during a protocol run, and labware calibration.
- If you performed pipette calibration in 4.2.0, you will need to re-do that calibration upon this update.
- Fixed an issue where tip length calibration was not being accessed correctly during a protocol run, and labware calibration. If you performed pipette calibration in 4.2.0, you will need to re-do that calibration upon this update.

### Known Issues

Expand All @@ -334,8 +352,7 @@ In 4.2.1 and previous releases, the OT-2 will only use TLS 1.0 for WPA2 Enterpri
### Bugfixes

- Fixed an issue where the pipette or pipette mount would not descend far enough to access the mounting screws when changing the pipette
- Fixed an issue that would cause the left and right pipettes to be at different heights, even after executing pipette calibration
- If you are experiencing this issue, you should recalibrate your pipettes after updating.
- Fixed an issue that would cause the left and right pipettes to be at different heights, even after executing pipette calibration. If you are experiencing this issue, you should recalibrate your pipettes after updating.
- Fixed an issue where the OT-2 would be unable to connect to Wi-Fi networks using 802.1x Fast Migration.

### Known Issues
Expand Down Expand Up @@ -400,10 +417,11 @@ We consider the HTTP API a core part of the OT-2's API, and changes to it will b

### Other Changes

- New Python Protocol API version: 2.8
- You can now specify blow out locations in `transfer`, `consolidate`, and `distribute` to be the source well, destination well, or trash
- `Well` now has the method `from_center_cartesian`, which allows you to calculate positions relative to the well center in X, Y, and Z
- For more information, see [the Python Protocol API documentation](https://docs.opentrons.com/v2/versioning.html#version-2-8)
- Protocol Designer protocols will now always be executed with API Version 2.8 behaviors
- Future changes to the behavior executed in Protocol Designer protocols will be communicated here
New Python Protocol API version: 2.8

- You can now specify blow out locations in `transfer`, `consolidate`, and `distribute` to be the source well, destination well, or trash
- `transfer`, `consolidate`, and `distribute` will now do nothing if passed a 0 transfer volume.
- `Well` now has the method `from_center_cartesian`, which allows you to calculate positions relative to the well center in X, Y, and Z
- For more information, see [the Python Protocol API documentation](https://docs.opentrons.com/v2/versioning.html#version-2-8)

Protocol Designer protocols will now always be executed with API Version 2.8 behaviors. Future changes to the behavior executed in Protocol Designer protocols will be communicated here
3 changes: 2 additions & 1 deletion api/src/opentrons/calibration_storage/ot2/pipette_offset.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,13 @@ def get_pipette_offset(
**io.read_cal_file(pipette_calibration_filepath)
)
except FileNotFoundError:
log.warning(f"Calibrations for {pipette_id} on {mount} does not exist.")
log.debug(f"Calibrations for {pipette_id} on {mount} does not exist.")
return None
except (json.JSONDecodeError, ValidationError):
log.warning(
f"Malformed calibrations for {pipette_id} on {mount}. Please factory reset your calibrations."
)
# TODO: Delete the bad calibration here maybe?
return None


Expand Down
2 changes: 1 addition & 1 deletion api/src/opentrons/calibration_storage/ot2/tip_length.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def tip_lengths_for_pipette(
pass
return tip_lengths
except FileNotFoundError:
log.warning(f"Tip length calibrations not found for {pipette_id}")
log.debug(f"Tip length calibrations not found for {pipette_id}")
return tip_lengths


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def get_pipette_offset(
**io.read_cal_file(pipette_calibration_filepath)
)
except FileNotFoundError:
log.warning(f"Calibrations for {pipette_id} on {mount} does not exist.")
log.debug(f"Calibrations for {pipette_id} on {mount} does not exist.")
return None
except (json.JSONDecodeError, ValidationError):
log.warning(
Expand Down
Loading

0 comments on commit e4cc6dc

Please sign in to comment.