Our lab runs a LI-COR Odyssey Classic (model 9120) for Western blots. We couldn’t get the vendor’s Image Studio software running on Windows 11, which left us looking at either freezing a Windows 7 box forever or finding another way in. The Odyssey ships an embedded Linux server (Apache 1.3.27 / mod_perl) with a CGI API that covers every operation the desktop software exposes; scan setup, status polling, TIFF download.
PR: odyssey PR (against v1b1).
pylabrobot/li_cor/odyssey/driver + 3 capability backends + chatterbox.- Three new capabilities under
pylabrobot/capabilities/scanning/:Scanning,ImageRetrieval,InstrumentStatus. Odyssey is the first implementation of each. The split reflects real lifecycle differences (scan control is exclusive; image retrieval is a read on persistent state; status is generic).
The PR also adds a small architectural piece tied to the FAIR / provenance threads I’ve raised here before: a DeviceCard (pylabrobot/device_card.py) attached via a HasDeviceCard mixin that follows the existing HasLoadingTray shape. Two-tier, a model-base card ships with the device package, each lab populates an instance card with their unit’s PIDInst Handle URI. The merged card carries identity into TIFF tag 270 / PNG tEXt chunks, so a scan lifted out of its surrounding context still resolves back to the instrument that produced it. Our Odyssey is registered at b2inst as B2INST and that handle now travels with every TIFF the lab writes.
DeviceCard is opt-in, devices that don’t want a card don’t mix in HasDeviceCard.
The reference deployment is at odyssey-app-hap, the FastAPI app the lab actually uses, end-to-end with PIDInst-aware tagging.