Hey all,
I’ve been poking around at adding Echo 650 support to PLR and wanted to check in before going too far down the rabbit hole.
Some context: I’ve been working with an Echo 650 for compound management (DMSO transfers, serial dilutions, assay plate prep) and got curious about what the instrument actually does under the hood. Turns out the Echo server exposes a SOAP/XML API over HTTP on port 8000 — no encryption, no auth, just gzip-compressed XML. I captured traffic with Wireshark during a cherry pick run and was able to decompress and read every command.
So far I’ve mapped out ~42 SOAP commands covering the full workflow: instrument status queries, plate surveys, gripper control, session management, and the actual transfer execution (DoWellTransfer). The transfer command takes a straightforward XML payload — source well, destination well, volume in nL, done. It’s honestly simpler than I expected.
The thing I’m less sure about is how this would fit into PLR’s architecture. The Echo isn’t really a traditional liquid handler — there’s no tips, no aspiration/dispense cycle. The core operation is just “move X nL from source well A to destination well B using sound.” So I don’t think it maps cleanly onto the existing LiquidHandler/LiquidHandlerBackend abstraction.
I’m thinking it might need its own module (something like pylabrobot.acoustic_dispensing) with:
- An abstract backend defining survey(), transfer(), etc.
- A frontend that handles plate state, transfer validation, batch operations
- The Echo 650 as the first concrete backend
But I could also see an argument for fitting it under liquid_handling with a different set of abstract methods. Curious what people think.
A few specifics on what I’ve figured out so far:
- Protocol: SOAP XML over HTTP, gzip compressed
- Two ports: 8000 for commands, 8010 for event/log streaming
- Key commands: PlateSurvey, SetPlateMap, DoWellTransfer, BeginSession/EndSession, plus gripper and coupling fluid management
- Transfer volumes specified in nL with fractional precision (e.g. 2625, 3937.5)
- The instrument identifies as a client/server system — multiple clients can connect
Happy to share the full protocol analysis if anyone’s interested. Would also appreciate any thoughts on the architecture question before I start writing code.
Thanks!