# Bundled Plugs URL: /reference/bundled-plugs The plugs that ship with OpenHTF — UserInput, ADB and Fastboot over USB (openhtf.plugs.usb), Cambrionix USB hubs, SerialCollectionPlug for serial logging, DeviceWrappingPlug — with install extras, configuration keys and usage. OpenHTF is not an instrument library, but a handful of plugs ship in `openhtf.plugs`. They cover the operator, Android devices over USB, USB hub control and serial port capture. Anything else — SCPI instruments, PLCs, your own DUT protocol — you write yourself, following the instrument guides. Plug Module Extra Purpose `UserInput` `openhtf.plugs.user_input` — Operator prompts (console and Operator UI) `AdbDevice` `openhtf.plugs.usb.adb_device` `usb-plugs` Android Debug Bridge over USB, no `adb` binary `FastbootDevice` `openhtf.plugs.usb.fastboot_device` `usb-plugs` Fastboot protocol over USB `LibUsbHandle` `openhtf.plugs.usb.local_usb` `usb-plugs` Raw USB bulk endpoints via libusb1 `EtherSync` `openhtf.plugs.cambrionix` — Cambrionix USB hub: map port → device serial, open a handle `SerialCollectionPlug` `openhtf.plugs.generic.serial_collection` `serial-collection-plug` Background capture of a serial port to a file `DeviceWrappingPlug` `openhtf.plugs.device_wrapping` — Base class that proxies attribute access to a wrapped device object The one plug every production test uses. Covered on the Plugs page (`prompt`, `text_input`, `timeout_s`, `image_url`) and on Device Under Test (`prompt_for_test_start`). `pip install "openhtf[usb-plugs]"` pulls in `libusb1` and `M2Crypto`. The plugs speak the ADB and Fastboot wire protocols directly over libusb — no platform `adb` install, no daemon fighting your test for the device. `command(cmd, raw=False, timeout_ms=None)`, `async_command(...)`, `push(local, remote)`, `pull(remote, local=None)`, `install(apk_path)`, `list(path)`, `reboot(destination='')`, `remount()`, `root()`, `get_serial()`, `get_system_type()`, `close()`. Authentication uses an RSA key via `M2CryptoSigner` when the device requires it. `connect(usb_handle)`, `get_boot_config(name)`, `set_boot_config(name, value)`, `lock()`, `close()`; flashing helpers live in `fastboot_protocol`. `open(**filters)` / `iter_open(**filters)` by `serial_number`, `port_path`, interface class/subclass/protocol; `read(length, timeout_ms)`, `write(data, timeout_ms)`, `port_path`, `is_closed()`, `close()`. `openhtf.plugs.cambrionix.EtherSync(mac_address)` talks to a Cambrionix EtherSync-capable hub and gives `get_usb_serial(port_num)` and `open_usb_handle(port_num)`, so a fixture can address "the DUT on port 3" instead of a serial number that changes with every unit. Streams everything a serial port emits — a DUT's boot log, a modem trace — to a file while other phases run. The constructor uses `@CONF.inject_positional_args`, so the two keys must be declared/loaded before the plug is instantiated. Importing the module without `pyserial` installed raises with an explicit hint to install the extra. A base class for plugs that wrap an existing driver object: set `self._device` and attribute access falls through to it, with logging of each call. Useful to expose a vendor SDK object as a plug without writing pass-through methods. Everything else is a subclass of `BasePlug` with `__init__`, methods and `tearDown()`. The instrument guides show the three most common transports: