UniteLabs
Reference

Agilent Bravo

Get an Agilent Bravo connected through GroundControl, initialized, and confirmed from Python, ready for calibration.

You'll go from a powered-on Bravo to an installed, initialized connector, and confirm it with one script. The Agilent manuals cover instrument installation, maintenance, and safety. To operate the instrument, see the Agilent Bravo guides.

This page applies to connector version 0.9.0 and later.

What you need

ItemDetail
InstrumentAn Agilent Bravo with a 96LT, 96ST, or 384ST head, powered on. The gripper is retracted and the deck holds no loose labware. For a 96AM head, contact UniteLabs support before you start
CableAn Ethernet cable from the Bravo to the computer, or to a network both are on
NetworkThe Bravo's IP address, and a computer on the same subnet. See Connect the Bravo to the computer
ConnectorAgilent Bravo from the UniteLabs registry, version 0.9.0 or later
Vendor softwareNone. Close VWorks and any other program connected to the Bravo. If VWorks drove the Bravo since it was last powered on, power-cycle the Bravo first
MachineWindows, Linux, or macOS running GroundControl
AccessA tenant, the SDK, and the Liquid Handling SDK installed. See Setup

Connect the Bravo to the computer

The Bravo talks to the connector over Ethernet, at a fixed IP address set on the Bravo's controller. The computer needs an address on the same subnet to reach it.

  1. Find the Bravo's IP address and subnet mask. Start with 192.168.0.8, the connector's default. If the Bravo doesn't answer there, find its address with Bravo Diagnostics, as described in Creating and managing profiles in Agilent's Bravo Platform User Guide.
  2. Connect the Bravo's Ethernet cable to the computer, or to a network switch the computer is also on.
  3. On a direct cable, give the computer's Ethernet connection a static address in the Bravo's subnet, with the same subnet mask and no gateway. For example, for a Bravo at 192.168.0.8 with the mask 255.255.255.0, use 192.168.0.10:
    • Windows: Settings, Network & internet, Ethernet, IP assignment, Edit. Choose Manual and turn on IPv4.
    • macOS: System Settings, Network, Ethernet, Details, TCP/IP. Set Configure IPv4 to Manually.
    • Linux (GNOME): Settings, Network, the wired connection, IPv4. Choose Manual.
  4. With no gateway on the Ethernet connection, internet traffic keeps using your other connection. On macOS, also keep Wi-Fi above Ethernet in the service order.

Install and configure the connector

  1. In GroundControl, add a device. Search the registry for Agilent Bravo and download the newest release (how to add a connector).
  2. Fill in the general configuration:
    FieldValue
    Simulation ModeOff for the real instrument, which is the default
    Bravo IPThe Bravo's IP address. The default is 192.168.0.8
    Head TypeThe installed head: 96LT (the default), 96ST, or 384ST
    Head AD CountsLeave empty. The connector checks the head type when it connects and logs what it reads
    Safe Z Height0, the default. Z 0 is the top of the head's travel, and the head moves in X and Y only above this height
    Gripper Y Offset0, the default. The gripper offset is set during calibration
    Teachpoint CalibrationsLeave empty. Calibration sets the teachpoints. Edit them only through calibration
    XML Config PathLeave empty. The connector uses the Agilent system configuration bundled for your head type. Set it only to a system configuration file from Agilent Service Utility for your instrument
    Position Poll Interval0.1, the default
  3. Under Local Network, note the Name. Scripts find the connector by this name. It's Bravo by default, and this page uses that.
  4. Start the connector.
  5. Check the logs. Expand the connector row in GroundControl, or open ~/.unitelabs/connectors/<connector-id>/connector.log. Look for three things:
    • Connected to Bravo successfully,
    • A line confirming the head type, for example Head type 96LT verified,
    • No errors logged during startup.

    If a move error was logged during startup, restart the connector before you continue.

To change the configuration later, edit it in the existing connector row, save it, then restart the connector. That keeps the connector's UUID, so the platform still recognizes it.

First successful test

The script initializes the Bravo with the Liquid Handling SDK and reads back where each axis is. Run it with the SDK authenticated (Connect to Platform), using the connector's name from step 3.

Initializing homes every axis that needs it, so the head and the gripper can move. Clear the deck of loose labware, and keep your hands outside the light curtain before you run the script.
first_connection.py
import asyncio

from unitelabs.liquid_handling.agilent import Bravo
from unitelabs.sdk import AsyncApiClient


async def main():
    client = AsyncApiClient()
    bravo = Bravo(name="Bravo", client=client)

    # Homes the axes that need it and switches the motors on
    await bravo.initialize()

    print("Connected:", await bravo.is_connected())
    for axis, position in (await bravo.get_all_positions()).items():
        print(f"{axis}: {position} mm")


asyncio.run(main())

Run it with uv run first_connection.py. Expected:

  • Connected: True.
  • x, y, z, and w close to 0, for example 0.0001. That's the home position and the safest place to start from.
  • gripper is the gap between the gripper jaws, and gripper_z is the gripper's height.

Next steps

A fresh Bravo has no teachpoints, the known positions of its 9 deck locations. The Liquid Handling SDK loads them from the connector when it configures the Bravo, so pipetting starts after calibration.

Known quirks and errors

You seeIt meansDo this
A move fails right after the Bravo is powered onThe axes haven't been homed since power-on. This is expectedRun await bravo.initialize(). It homes them
Refusing to move BravoX: it is ... on a move commandThe axis isn't homed or is switched off, and the connector only moves axes that are readyRun await bravo.initialize(), then await bravo.activate()
Initialization doesn't finish after VWorks ranThe Bravo still holds state from the VWorks sessionClose VWorks, power-cycle the Bravo, restart the connector, then run the script again
A move error in the connector log at startupA command from before the restart left an error on the controllerRestart the connector, then run the script again
Gripper Zg is extended past the safe planeThe head only moves with the gripper retractedRun await bravo.activate(). It parks the gripper, then try again
The Bravo stops mid-run and the status light blinks redThe light curtain was broken or the emergency stop was pressedClear the deck area, then run await bravo.initialize() and await bravo.activate(). See Recover from a stop
Head type reported by firmware and configuration do not match in the logThe Head Type in the configuration differs from the head the Bravo reportsSet Head Type to the installed head and restart the connector
The connector stops right after it startsThe Teachpoint Calibrations field holds a value the connector can't readClear the field, save, and start the connector again
The SDK finds no connector named BravoThe name in the script differs from the connector's Local Network nameUse the name from GroundControl, under Local Network
The connector stays offline, or the log shows no connection to the BravoThe computer doesn't reach the Bravo's IP addressRun ping <Bravo IP>, then check the cable, the computer's network settings, and the Bravo IP in the configuration
IncompatibleConnectorError from the Liquid Handling SDKThe connector is older than 0.9.0Update the connector in GroundControl and restart it

Connector reference

Drive the Bravo from Python through the Liquid Handling SDK's Bravo class. It runs the connector's commands in the order the Bravo needs. Use the connector's own modules in GroundControl only for calibration.

Vendor documentation

Operating limits, deck accessories, maintenance, and safety are covered by Agilent's Bravo user guide. This page only covers getting the Bravo connected and tested.

Last updated