Skip to main content

Lager CLI

A powerful command-line interface for controlling embedded hardware, test equipment, and development boards through Lager Data box devices.

PyPI version Python 3.10+ License: Apache-2.0

Features

Hardware Control

  • Power Management: Control power supplies, battery simulators, solar simulators, and electronic loads
  • I/O Operations: ADC/DAC, GPIO, thermocouple sensors
  • Test Instruments: Oscilloscopes, logic analyzers, multimeters, signal generators

Embedded Development

  • Debugging: ARM Cortex-M debugging with J-Link, CMSIS-DAP, ST-Link support
  • Firmware Flashing: Flash firmware via debug probes
  • Serial Communication: UART terminal with test framework integration
  • Robotics: Robot arm control for automated testing

Wireless & Connectivity

  • Bluetooth LE: Scan, connect, and interact with BLE devices
  • USB: Programmable USB hub control
  • Webcam: Video streaming from box devices

Installation

Install the Lager CLI using pip:

pip install lager-cli

Or upgrade to the latest version:

pip install -U lager-cli

Quick Start

  1. Configure your box:

    lager defaults set box <your-box-id>
    
  2. Test connectivity:

    lager hello
    
  3. List available instruments:

    lager instruments
    
  4. Control a power supply:

    lager supply <net> voltage 3.3 --box <box-id>
    

Core Commands

Power Supply Control

# Set voltage and enable output
lager supply <net> voltage 3.3 --yes

# Set current limit
lager supply <net> current 0.5

# Check power state
lager supply <net> state

ADC/DAC Operations

# Read ADC voltage
lager adc <net>

# Set DAC output
lager dac <net> 1.8

Embedded Debugging

# Connect to debug probe
lager debug <net> connect --box <box>

# Flash firmware (auto-connects if needed)
lager debug <net> flash --hex firmware.hex --box <box>

# Reset and halt target
lager debug <net> reset --halt --box <box>

# Stream RTT logs
lager debug <net> rtt --box <box>

# Read memory
lager debug <net> memrd 0x08000000 256 --box <box>

Oscilloscope & Logic Analyzer

# Measure frequency on scope channel
lager scope <net> measure freq

# Configure edge trigger
lager logic <net> trigger edge --slope rising --level 1.8

Battery & Solar Simulation

# Set battery state of charge
lager battery <net> soc 80

# Configure solar irradiance
lager solar <net> irradiance 1000

Serial Communication

# Connect to UART
lager uart --baudrate 115200

# Interactive mode with test runner
lager uart -i --test-runner unity

# Show the tty path for a UART net
lager uart <net> serial-port

# Create a UART net for an adapter without a USB serial number (store /dev path directly)
lager nets add <net> uart /dev/ttyUSB0 <label> --box <box>
# Warning: tty names can change after reboot; prefer device-serial mode when available

Bluetooth LE

# Scan for BLE devices
lager ble scan --timeout 5.0

# Connect to device
lager ble connect <address>

Configuration

Box Setup

The CLI connects to boxes via:

  • Direct IP: Using Tailscale or VPN IP addresses

Create a .lager file in your project directory:

{
  "boxes": {
    "my-box": "box-abc123",
    "local-box": "<BOX_IP>"
  }
}

Direct IP Access

For direct IP connections, ensure SSH key authentication is configured:

# Configure SSH key for a box
ssh-copy-id lagerdata@<box-ip>

# Then connect via the CLI
lager ssh --box <box-ip>

Environment Variables

  • LAGER_BOX: Default box ID or IP address
  • LAGER_DEBUG: Enable debug output
  • LAGER_COMMAND_DATA: Command data (used internally)

Net Management

Lager uses "nets" to represent physical test points or signals on your PCB:

# List all configured nets
lager nets

# Create a new power supply net
lager nets add VDD_3V3 supply 1 USB0::0x1AB1::0x0E11::DP8C0000001

# Auto-discover and create all nets
lager nets add-all

# Interactive TUI for net management
lager nets tui

Advanced Features

Remote Python Execution

# Run a Python script on the box
lager python my_script.py --box <box-id>

# Run with port forwarding
lager python --port 5000:5000/tcp server.py

Development Environment

# Create a development environment
lager devenv create --image python:3.10

# Open interactive terminal
lager devenv terminal

Package Management

# Add a package to the box's declarative config
lager box-config pip add numpy

# Apply the change (restarts the lager container, runs pip install)
lager box-config apply

Supported Hardware

Debug Probes

  • SEGGER J-Link
  • ARM CMSIS-DAP
  • ST-Link v2/v3
  • Xilinx XDS110

Power Supplies

  • Rigol DP800 series
  • Keysight E36200/E36300 series
  • Keithley 2200/2280 series

Battery Simulators

  • Keithley 2281S

Solar Simulators

  • EA PSI/EL series (two-quadrant)

Oscilloscopes

  • Rigol MSO5000 series

I/O Hardware

  • LabJack T7 (ADC/DAC/GPIO)
  • MCC USB-202 (ADC/DAC/GPIO)

USB Hubs

  • Acroname USBHub3+
  • YKUSH

Robotics

  • Rotrics Dexarm

Temperature

  • Phidget Thermocouples

Target Microcontrollers

Supports debugging and flashing for:

  • STM32 (F0/F1/F2/F3/F4/F7/G0/G4/H7/L0/L1/L4/WB/WL series)
  • Nordic nRF52/nRF91
  • Atmel/Microchip SAM D/E/4S/70
  • Texas Instruments CC32xx
  • NXP i.MX RT, LPC54xx/55xx
  • Silicon Labs EFM32
  • Microchip PIC32MM

Authentication & Access

The CLI authenticates to boxes via VPN access (Tailscale or similar). Access control is managed by your VPN permissions - if you have VPN access to a box, you can control it with the CLI.

Prerequisites

  1. VPN Access: Connect to your organization's VPN (Tailscale, etc.)
  2. SSH Keys: Configure SSH key authentication for direct box access:
    ssh-copy-id lagerdata@<box-ip>
    
  3. SSH to Box: Use the CLI to connect:
    lager ssh --box <box-ip-or-name>
    

Verify Connectivity

# Test box connectivity
lager hello --box <box-id-or-ip>

# Check box status
lager boxes

Documentation

For detailed documentation, visit: https://docs.lagerdata.com

Command Help

Every command has built-in help:

lager --help                 # Show all commands
lager supply --help          # Show supply command options
lager debug --help           # Show debug command options

Examples

Automated Test Script

#!/bin/bash

BOX="my-box"

# Configure power supply
lager supply VDD voltage 3.3 --box $BOX --yes

# Flash firmware
lager debug DEBUG_SWD flash --hex build/firmware.hex --box $BOX

# Reset and start
lager debug DEBUG_SWD reset --box $BOX

# Monitor UART output
lager uart --baudrate 115200 --test-runner unity --box $BOX

# Read sensor values
voltage=$(lager adc SENSOR_OUT --box $BOX)
temp=$(lager thermocouple TEMP1 --box $BOX)

echo "Voltage: $voltage V"
echo "Temperature: $temp °C"

# Disable power
lager supply VDD disable --box $BOX

Interactive Python Control

# example_test.py - Run on box with: lager python example_test.py
from lager import Net, NetType

# Access hardware through net abstraction
supply_net = Net("VDD_3V3", NetType.SUPPLY)
adc_net = Net("VOUT", NetType.ADC)

# Set power supply voltage and enable
supply_net.set_voltage(3.3)
supply_net.enable()

import time
time.sleep(0.1)

# Measure voltage
voltage = adc_net.read()
print(f"Output voltage: {voltage:.3f} V")

# Disable supply
supply_net.disable()

Troubleshooting

Connection Issues

# Test box connectivity
lager hello --box <box-id>

# Check box status
lager hello --box <box-id>

Permission Errors

For Tailscale/direct IP connections, ensure SSH keys are configured:

# Set up SSH keys
ssh-copy-id lagerdata@<box-ip>

# Test SSH access
lager ssh --box <box-ip-or-name>

Debug Probe Not Found

Verify J-Link GDB Server is installed on the box:

# Download J-Link to /tmp/ on your local machine
# Visit: https://www.segger.com/downloads/jlink/
# Download: JLink_Linux_V794a_x86_64.tgz to /tmp/

# Deploy box (J-Link will be installed automatically)
lager install --ip <box-ip>

Authentication Issues

If you encounter connection issues:

  1. Verify VPN connection: Ensure you're connected to the correct VPN
  2. Check SSH keys: Verify SSH key authentication is configured
    ssh-copy-id lagerdata@<box-ip>
    
  3. Test SSH access: Try connecting to the box
    lager ssh --box <box-ip-or-name>
    
  4. Test connectivity: Use lager hello to verify the box is reachable
    lager hello --box <box-ip-or-name>
    

Contributing

We welcome contributions! Please see CONTRIBUTING.md for more information.

Support

License

Apache License 2.0 - Copyright (c) Lager Data

Testing

Comprehensive test suites are available in the test/ directory:

# Hardware-dependent tests (require instruments)
./test/integration/power/supply.sh <BOX> <NET>
./test/integration/power/battery.sh <BOX> <NET>
./test/integration/debug/debug.sh <BOX> <NET> <HEXFILE> <ELFFILE>
./test/integration/io/labjack.sh <BOX> <NET>

See test/README.md for test format and how to write new tests.

Changelog

Recent Updates

  • Renamed test scripts for clarity (test_*_commands.sh*.sh)
  • Unified box deployment script (setup_and_deploy_box.sh)
  • Added comprehensive test documentation (test/README.md)
  • Enhanced debug command with RTT streaming and memory operations
  • Improved error handling and validation across all commands

See full changelog in the releases.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lager_cli-0.47.1.tar.gz (577.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lager_cli-0.47.1-py3-none-any.whl (613.0 kB view details)

Uploaded Python 3

File details

Details for the file lager_cli-0.47.1.tar.gz.

File metadata

  • Download URL: lager_cli-0.47.1.tar.gz
  • Upload date:
  • Size: 577.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for lager_cli-0.47.1.tar.gz
Algorithm Hash digest
SHA256 f4c4decf11ec905cf916c63879cd9bfb6276d6dd31179452214f72fda3d8fd03
MD5 8f5651d6175d24e898d8bd14c00b1ef5
BLAKE2b-256 abd2a9c7284268777622a97a2f9b446192bcd49ae77368247645fbc316d05505

See more details on using hashes here.

File details

Details for the file lager_cli-0.47.1-py3-none-any.whl.

File metadata

  • Download URL: lager_cli-0.47.1-py3-none-any.whl
  • Upload date:
  • Size: 613.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for lager_cli-0.47.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4158c5a511014e2e751f54d9f8e8ab5a29f1b5a1cb8e0e869442307413b4d434
MD5 891516e8440421c58c8a4648381a5372
BLAKE2b-256 9e8dbfb6f1b6ab88072a8c03cdd73ad23ab1acfefbdd616af0a97e36546217f7

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.47.1 This release

2 files

0.47.0

2 files

0.46.2

2 files

0.46.1

2 files

0.46.0

2 files

0.45.1

2 files

0.45.0

2 files

0.44.0

2 files

0.43.0

2 files

0.42.0

2 files

0.41.0

2 files

0.40.0

2 files

0.39.1

2 files

0.39.0

2 files

0.38.0

2 files

0.37.2

2 files

0.37.1

2 files

0.37.0

2 files

0.36.2

2 files

0.36.1

2 files

0.36.0

2 files

0.35.0

2 files

0.34.4

2 files

0.34.3

2 files

0.34.2

2 files

0.34.1

2 files

0.34.0

2 files

0.33.1

2 files

0.33.0

2 files

0.32.6

2 files

0.32.5

2 files

0.32.4

2 files

0.32.3

2 files

0.32.2

2 files

0.32.1

2 files

0.32.0

2 files

0.31.16

2 files

0.31.15

2 files

0.31.14

2 files

0.31.13

2 files

0.31.12

2 files

0.31.11

2 files

0.31.10

2 files

0.31.9

2 files

0.31.8

2 files

0.31.7

2 files

0.31.6

2 files

0.31.5

2 files

0.31.4

2 files

0.31.3

2 files

0.31.2

2 files

0.31.1

2 files

0.31.0

2 files

0.30.0

2 files

0.29.0

2 files

0.28.5

2 files

0.28.4

2 files

0.28.3

2 files

0.28.2

2 files

0.28.1

2 files

0.28.0

2 files

0.27.1

2 files

0.27.0

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.2

2 files

0.22.1

2 files

0.22.0

2 files

0.21.3

2 files

0.21.2

2 files

0.21.1

2 files

0.21.0

2 files

0.20.1

2 files

0.20.0

2 files

0.19.2

2 files

0.19.1

2 files

0.19.0

2 files

0.18.5

2 files

0.18.4

2 files

0.18.3

2 files

0.18.2

2 files

0.18.1

2 files

0.18.0

2 files

0.17.0

2 files

0.16.10

2 files

0.16.9

2 files

0.16.8

2 files

0.16.7

2 files

0.16.6

2 files

0.16.5

2 files

0.16.4

2 files

0.16.3

2 files

0.16.2

2 files

0.16.1

2 files

0.16.0

2 files

0.15.2

2 files

0.15.1

2 files

0.15.0

2 files

0.14.4

2 files

0.14.3

2 files

0.14.2

2 files

0.14.1

2 files

0.14.0

2 files

0.13.4

2 files

0.13.3

2 files

0.13.2

2 files

0.13.1

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.28

2 files

0.3.27

2 files

0.3.26

2 files

0.3.25

2 files

0.3.24

2 files

0.3.23

2 files

0.3.22

2 files

0.3.21

2 files

0.3.20

2 files

0.3.19

2 files

0.3.18

2 files

0.3.17

2 files

0.3.16

2 files

0.3.15

2 files

0.3.14

2 files

0.3.13

2 files

0.3.12

2 files

0.3.11

2 files

0.3.10

2 files

0.3.9

2 files

0.3.8

2 files

0.3.7

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.2.35

2 files

0.2.34

2 files

0.2.33

2 files

0.2.32

2 files

0.2.31

2 files

0.2.30

2 files

0.2.29

2 files

0.2.28

2 files

0.2.27

2 files

0.2.26

2 files

0.2.25

2 files

0.2.24

2 files

0.2.23

2 files

0.2.22

2 files

0.2.21

2 files

0.2.20

2 files

0.2.19

2 files

0.2.18

2 files

0.2.17

2 files

0.2.16

2 files

0.2.15

2 files

0.2.14

2 files

0.2.13

2 files

0.2.12

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

0.2.8

2 files

0.2.7

2 files

0.2.6

2 files

0.2.5

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.242

1 file

0.1.241

1 file

0.1.239

1 file

0.1.238

1 file

0.1.237

1 file

0.1.236

1 file

0.1.235

1 file

0.1.234

1 file

0.1.233

1 file

0.1.232

1 file

0.1.231

1 file

0.1.230

1 file

0.1.229

1 file

0.1.228

1 file

0.1.227

1 file

0.1.226

1 file

0.1.225

1 file

0.1.224

1 file

0.1.223

1 file

0.1.222

1 file

0.1.221

1 file

0.1.220

1 file

0.1.219

1 file

0.1.218

1 file

0.1.217

1 file

0.1.216

1 file

0.1.215

1 file

0.1.214

1 file

0.1.213

1 file

0.1.212

1 file

0.1.211

1 file

0.1.210

1 file

0.1.209

1 file

0.1.208

1 file

0.1.207

1 file

0.1.206

1 file

0.1.205

1 file

0.1.204

1 file

0.1.203

1 file

0.1.202

1 file

0.1.201

1 file

0.1.200

1 file

0.1.199

1 file

0.1.198

1 file

0.1.197

1 file

0.1.196

1 file

0.1.195

1 file

0.1.194

1 file

0.1.193

1 file

0.1.192

1 file

0.1.191

1 file

0.1.190

1 file

0.1.189

1 file

0.1.188

1 file

0.1.187

1 file

0.1.186

1 file

0.1.185

1 file

0.1.184

1 file

0.1.183

1 file

0.1.182

1 file

0.1.181

1 file

0.1.180

1 file

0.1.179

1 file

0.1.178

1 file

0.1.177

1 file

0.1.176

1 file

0.1.175

2 files

0.1.174

2 files

0.1.173

2 files

0.1.172

2 files

0.1.171

2 files

0.1.170

2 files

0.1.169

2 files

0.1.167

2 files

0.1.166

2 files

0.1.165

2 files

0.1.164

1 file

0.1.163

1 file

0.1.162

1 file

0.1.161

2 files

0.1.160

2 files

0.1.159

2 files

0.1.158

2 files

0.1.157

2 files

0.1.156

2 files

0.1.155

2 files

0.1.154

2 files

0.1.153

2 files

0.1.152

2 files

0.1.151

2 files

0.1.150

2 files

0.1.149

2 files

0.1.148

2 files

0.1.147

2 files

0.1.146

2 files

0.1.145

2 files

0.1.144

2 files

0.1.143

2 files

0.1.142

2 files

0.1.141

2 files

0.1.140

2 files

0.1.139

2 files

0.1.138

2 files

0.1.137

2 files

0.1.136

2 files

0.1.135

2 files

0.1.134

2 files

0.1.133

2 files

0.1.132

2 files

0.1.131

2 files

0.1.130

2 files

0.1.129

2 files

0.1.128

2 files

0.1.127

2 files

0.1.126

2 files

0.1.125

2 files

0.1.124

2 files

0.1.123

2 files

0.1.122

2 files

0.1.121

2 files

0.1.120

2 files

0.1.119

2 files

0.1.118

2 files

0.1.117

2 files

0.1.116

2 files

0.1.115

2 files

0.1.114

2 files

0.1.113

2 files

0.1.112

2 files

0.1.111

2 files

0.1.110

2 files

0.1.109

2 files

0.1.108

2 files

0.1.107

2 files

0.1.106

2 files

0.1.105

2 files

0.1.104

2 files

0.1.103

2 files

0.1.102

2 files

0.1.101

2 files

0.1.100

2 files

0.1.99

2 files

0.1.98

2 files

0.1.97

2 files

0.1.96

2 files

0.1.95

2 files

0.1.94

2 files

0.1.93

2 files

0.1.92

2 files

0.1.91

2 files

0.1.90

2 files

0.1.89

2 files

0.1.88

2 files

0.1.87

2 files

0.1.86

2 files

0.1.85

2 files

0.1.84

2 files

0.1.83

2 files

0.1.82

2 files

0.1.81

2 files

0.1.80

2 files

0.1.79

2 files

0.1.78

2 files

0.1.77

2 files

0.1.76

2 files

0.1.75

2 files

0.1.74

2 files

0.1.73

2 files

0.1.72

2 files

0.1.71

2 files

0.1.70

2 files

0.1.69

2 files

0.1.68

2 files

0.1.67

2 files

0.1.66

2 files

0.1.65

2 files

0.1.64

2 files

0.1.63

2 files

0.1.62

2 files

0.1.61

2 files

0.1.60

2 files

0.1.57

2 files

0.1.56

2 files

0.1.55

2 files

0.1.54

2 files

0.1.53

2 files

0.1.52

2 files

0.1.51

2 files

0.1.50

2 files

0.1.49

2 files

0.1.48

2 files

0.1.47

2 files

0.1.46

2 files

0.1.45

2 files

0.1.44

2 files

0.1.43

2 files

0.1.42

2 files

0.1.41

2 files

0.1.40

2 files

0.1.39

2 files

0.1.38

2 files

0.1.37

2 files

0.1.36

2 files

0.1.35

2 files

0.1.34

2 files

0.1.33

2 files

0.1.32

2 files

0.1.31

2 files

0.1.30

2 files

0.1.29

2 files

0.1.28

2 files

0.1.27

2 files

0.1.26

2 files

0.1.25

2 files

0.1.24

2 files

0.1.23

2 files

0.1.22

2 files

0.1.21

2 files

0.1.20

2 files

0.1.19

2 files

0.1.18

2 files

0.1.17

2 files

0.1.16

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page