Skip to content

Add Synergy HT absorbance support and share BioTek reader code - #1512

Merged
rickwierenga merged 8 commits into
mainfrom
feat/biotek-synergy-ht
Oct 20, 2026
Merged

rickwierenga merged 8 commits into
mainfrom
feat/biotek-synergy-ht

Conversation

@rickwierenga

@rickwierenga rickwierenga commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Add a SynergyHT interface supporting endpoint absorbance, built-in 24- and 96-well plate presets, well selection, tray movement, incubation, and shaking before reads.

results = await reader.read_absorbance(
  wavelength=600,
  plate_type="96-well",
  wells=["A1", "B2"],
  shake_duration=10,
  shake_intensity="fast",
)
data = results[0].data

Shake intensity accepts "slow", "medium", "fast", or "variable". A zero duration disables shaking; each read uses its own settings.

Measurements return the same AbsorbanceResult class used by H1 and Cytation, including wavelength, temperature, and timestamp. Unselected wells contain None; instrument overflow produces NaN.

Synergy HT uses the legacy V/S measurement protocol. Share connection lifecycle, command framing, identity queries, tray commands, temperature queries, and operation locking through an internal BioTek base, while keeping assay encoding and parsing specific to each protocol. Existing result-type imports remain compatible.

Includes a hello-world notebook, API documentation, and device registration. Fluorescence, luminescence, standalone shaking, kinetics, 384-well plates, and custom plate geometry are not implemented.

Hardware testing covers basecode 7090202, firmware 2.24: notebook operations and all four shaking intensities and shake duration.

Validation: BioTek unit tests, Ruff, mypy, notebook validation, and the offline documentation build.

@rickwierenga
rickwierenga requested a review from a team as a code owner October 18, 2026 18:10
@harley-pioneer

Copy link
Copy Markdown
Contributor

Just tested out on our Synergy HT and it works great! All the steps in the hello-world notebook worked as expected. What would it take to add shaking commands into this? That is really the last piece to enable the reader to do endpoint and kinetic experiments. I'm playing around with it too

@rickwierenga

Copy link
Copy Markdown
Member Author

thanks for testing @harley-pioneer !

see the latest PR for shaking based on the pcaps you shared

@harley-pioneer

Copy link
Copy Markdown
Contributor

Awesome you beat me to it. Is this something I can also edit? The shake_intensity numbers do have names:

  • 0 = slow
  • 1 = medium
  • 2 = fast
  • 3 = variable

I will have another chance to test this in lab tomorrow

@rickwierenga

Copy link
Copy Markdown
Member Author

hm, not sure what's the easiest way for you to edit here... just send me your prompts and I'll have it executed

@rickwierenga

Copy link
Copy Markdown
Member Author

@harley-pioneer lmk when you think this is ready to merge. also feel free to make follow on PRs in the future!

@harley-pioneer

harley-pioneer commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

ok great!

  • I confirmed the 4 shaking intensities are correct and correspond to 0, 1, 2, and 3
  • Confirmed the shaking time pre-read works

Could be merged as is

Things I can do in a PR I will do today or this week

  • I tried power cycling and the .setup() failed to connect with an error of ValueError: Malformed BioTek status: b'\x1e000\x03' causing _check_status to reject the setup sequence. I made SynergyHT accept \x1e000 as "no error" (a \x1e status with a nonzero error code still raises), and setup() now also discards any replies left over from an earlier connection before sending e
2026-10-20 10:14:56,840 - pylabrobot.io.ftdi - INFO - Successfully opened FTDI device: FTNE6HGA
2026-10-20 10:14:57,402 - pylabrobot.agilent.biotek.synergy_ht - WARNING - Discarded 30 stale bytes from an earlier Synergy HT session: b'\x067090202  Version 2.24   \x1e000\x03'
2026-10-20 10:14:58,008 - pylabrobot.agilent.biotek._reader - INFO - Connected to SynergyHT, firmware 2.24
  • update the hello-world notebook with updated shaking intensity string options jk i see you already did that
  • i would like to update the read_absorbance with an optional flag for it to open the door after reading; default is open door after reading but if doing a loop of readings on the same plate don't want to door to open after every reading

@rickwierenga
rickwierenga merged commit 078983a into main Oct 20, 2026
22 of 23 checks passed
@rickwierenga

Copy link
Copy Markdown
Member Author

thanks for the pr @harley-pioneer ! I merged this into main. feel free to add follow on PRs onto main

@rickwierenga
rickwierenga deleted the feat/biotek-synergy-ht branch October 20, 2026 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants