BioTek Synergy HT#

Agilent (BioTek)
Synergy HT
Mostlyv1
plate reader
absorbanceheatingshaking
APIpylabrobot.agilent.biotek.synergy_ht.SynergyHT
NotesEndpoint absorbance with optional shaking before reads on built-in 24- and 96-well plates.

Property

Supported behavior

Interface

USB FTDI serial adapter; 9600 baud, 8 data bits, no parity, 2 stop bits

Assay

Single-wavelength endpoint absorbance

Plates

Reader’s built-in 24- and 96-well presets

Results

AbsorbanceResult with OD data, wavelength, temperature, and timestamp

Additional operations

Tray opening/closing, temperature measurement, incubation, shaking before reads

Tested on hardware with basecode 7090202, firmware 2.24, including tray movement, absorbance, and incubation and shaking before reads. Other basecodes are rejected; other firmware versions must report the required capabilities. This driver does not support Synergy H1, HTX, or Epoch.

Fluorescence, luminescence, standalone shaking, kinetics, 384-well plates, and custom geometry are not implemented.

Connection and physical setup#

Install pylabrobot[ftdi] and the platform’s libftdi runtime as described in the installation guide. Connect the reader’s serial interface through its USB FTDI adapter and power on the reader. Wait for normal boot to finish. Close Gen5 and other applications using the same adapter.

Use an unlidded, optically suitable plate matching the reader’s built-in preset. Check the plate dimensions and well spacing against that preset.

Import the driver.

from pylabrobot.agilent.biotek import SynergyHT

Connect#

Create the connection. If several FTDI adapters are attached, set device_id to the adapter’s USB serial number, which can differ from the reader’s serial number. The measurement timeout is in seconds.

reader = SynergyHT(device_id=None, read_timeout=180)

Initialize the connection and check the model and required protocol capabilities.

await reader.setup()

Inspect the reported identity and allowed incubation setpoints.

(reader.serial_number, reader.version, reader.temperature_range)

Load a plate#

Open the tray. Ensure its travel path is clear.

await reader.open()

Place a compatible, unlidded 96-well plate on the tray, with A1 aligned to the tray marking. Then close the tray.

await reader.close()

Read absorbance#

Read the full plate at 600 nm. Pass the plate type as a string: "96-well" or "24-well", matching the built-in preset for the loaded plate. The instrument validates its wavelength range.

Like the other BioTek readers, this returns a list of AbsorbanceResult objects. An HT endpoint read produces one result. Its .data matrix is indexed [row][column]: A1 is [0][0], B1 is [1][0]. Values are raw OD, without blank subtraction or pathlength correction. Unselected wells are None, and instrument overflow is NaN. Include suitable blanks and standards for your assay.

results = await reader.read_absorbance(wavelength=600, plate_type="96-well")

Inspect the first row of the endpoint result.

results[0].data[0]

Inspect the measurement metadata. The wavelength is in nm, and the reported incubator temperature is in °C (None if unavailable). The timestamp is the host’s local time when the read completed.

(results[0].wavelength, results[0].temperature, results[0].timestamp)

Shake before reading#

Shake the plate for 10 seconds before measuring absorbance. shake_duration is a whole number of seconds from 0 to 65535; zero (the default) disables shaking. shake_intensity selects one of the instrument’s four levels: "slow" (the default), "medium", "fast", or "variable". These levels are not frequencies in Hz or RPM.

The tray must be closed. The call waits for both shaking and the measurement to finish, allowing shake_duration extra seconds beyond read_timeout. Shaking settings apply only to this call; the next read uses its own settings. Standalone shaking is not supported.

shaken = await reader.read_absorbance(
  wavelength=600,
  plate_type="96-well",
  shake_duration=10,
  shake_intensity="fast",
)

Select wells#

For a partial read, provide well names. The instrument measures their bounding rectangle; selected[0].data contains the full-plate matrix, with None for all wells you did not request.

selected = await reader.read_absorbance(600, "96-well", wells=["A1", "B2"])

Optional incubation#

Enable incubation at 37 °C. This returns when the setpoint is accepted, before the plate has necessarily reached that temperature. Check reader.temperature_range for this instrument’s limits.

await reader.set_temperature(37)

Read the current incubator temperature in °C. This is not a measurement of the liquid temperature.

temperature = await reader.get_temperature()

Disable incubation when it is no longer needed.

await reader.stop_heating()

Unload and disconnect#

Open the tray and remove the plate.

await reader.open()

After removing the plate, close the empty tray.

await reader.close()

Disconnect. stop() does not disable incubation or abort a measurement. A failed or cancelled exchange closes the connection. Ensure the reader is idle before calling setup() to reconnect.

await reader.stop()