Skip to main content
Manage recordings, devices, and telemetry across robot fleets from a single dashboard. The fleet dashboard provides a centralized view of all connected devices, their recordings, and aggregate fleet health metrics — so you can monitor what your robots are capturing without digging through individual recordings.
Fleet Management is in preview. APIs and features described on this page may change.

Device Registry

Every physical device in your fleet — robot arms, autonomous vehicles, drones, mobile robots — gets registered in the device registry. Each device receives a unique dev_ prefixed ID that ties it to its recordings, events, and telemetry.

Device Properties

PropertyTypeDescription
uidstringUnique device ID (dev_ prefix, auto-generated)
namestringHuman-readable device name
typestringDevice category (e.g., manipulator, vehicle, drone)
statusstringCurrent status: online, offline, or maintenance
firmware_versionstringFirmware or software version running on the device
metadataobjectArbitrary key-value pairs (location, serial number, etc.)
last_seen_atdatetimeTimestamp of the last heartbeat or recording upload
created_atdatetimeWhen the device was registered

Register a Device

from avala import Client

client = Client()

device = client.fleet.devices.register(
    name="robot-arm-01",
    type="manipulator",
    firmware_version="2.4.1",
    metadata={"location": "warehouse-b", "serial": "RA-2024-0142"}
)

print(f"Registered: {device.name} ({device.uid})")

List Devices

Filter devices by status, type, or metadata tags to find exactly what you need.
# List all online devices
devices = client.fleet.devices.list(status="online")
for device in devices:
    print(f"{device.name} ({device.uid}) -- {device.status}")

# Filter by type
manipulators = client.fleet.devices.list(type="manipulator")

# Filter by metadata
warehouse_b = client.fleet.devices.list(metadata={"location": "warehouse-b"})

Update Device Status

Set a device to maintenance before performing firmware updates or physical servicing. This suppresses alerts and pauses recording rules for the device.
client.fleet.devices.update(
    device_id="dev_abc123",
    status="maintenance",
    firmware_version="2.5.0"
)
When a device transitions from maintenance back to online, any recording rules assigned to it or its device group resume automatically.

Deregister a Device

Remove a device from the registry. Existing recordings and events are preserved — only the device entry is removed.
client.fleet.devices.deregister(device_id="dev_abc123")
Deregistering a device does not delete its recordings or events. However, the device will no longer appear in the registry and cannot receive new recordings until re-registered.

Recording Browser

The recording browser provides a filterable, sortable view of all recordings across your fleet. Recordings are automatically associated with the device that captured them based on the device ID in the upload metadata.

Filter Recordings

# List recordings from a specific device
recordings = client.fleet.recordings.list(
    device_id="dev_abc123",
    status="ready"
)

# Filter by date range
from datetime import datetime, timedelta

recordings = client.fleet.recordings.list(
    since=datetime(2026, 1, 1),
    until=datetime(2026, 2, 1),
    status="ready"
)

# Filter by tags
recordings = client.fleet.recordings.list(
    tags=["highway", "night-driving"]
)

for rec in recordings:
    print(f"{rec.uid} | {rec.device_name} | {rec.duration_seconds}s | {rec.status}")

Recording Statuses

StatusDescription
uploadingRecording is being uploaded to Avala
processingUpload complete, MCAP file is being indexed and validated
readyProcessing complete, recording is available for playback and annotation
errorProcessing failed (corrupt file, unsupported format, missing schemas)
archivedRecording has been archived and is no longer actively accessible
Recordings transition from uploading to processing to ready automatically. If a recording stays in processing for more than 15 minutes, check the file format and size against the recording best practices.

Fleet Metrics

Aggregate statistics give you a high-level view of fleet activity. Metrics update in real time on the dashboard and are available through the SDK for integration with external monitoring systems.

Available Metrics

MetricDescription
active_devicesDevices with status online
total_devicesAll registered devices (any status)
recordings_todayRecordings uploaded in the current UTC day
recordings_this_weekRecordings uploaded in the current UTC week
total_recordingsAll-time recording count
total_storage_bytesTotal storage used across all recordings
avg_recording_durationAverage recording duration in seconds
recordings_by_statusBreakdown of recordings by status
metrics = client.fleet.metrics.get()

print(f"Active devices: {metrics.active_devices}/{metrics.total_devices}")
print(f"Recordings today: {metrics.recordings_today}")
print(f"Total storage: {metrics.total_storage_bytes / 1e9:.1f} GB")
print(f"Avg duration: {metrics.avg_recording_duration:.0f}s")

# Breakdown by status
for status, count in metrics.recordings_by_status.items():
    print(f"  {status}: {count}")

Time-Series Metrics

Query metrics over time for trend analysis and reporting.
# Recordings per day over the last 30 days
timeseries = client.fleet.metrics.timeseries(
    metric="recordings",
    interval="day",
    since="2026-01-01T00:00:00Z",
    until="2026-02-01T00:00:00Z"
)

for point in timeseries:
    print(f"{point.timestamp}: {point.value} recordings")

Device Groups

Organize devices into logical groups to manage them collectively. Groups let you apply recording rules, alert policies, and metadata at the group level instead of configuring each device individually.

Create a Group

group = client.fleet.groups.create(
    name="Warehouse B - Pick & Place",
    description="Robot arms in warehouse B performing pick and place operations",
    device_ids=["dev_abc123", "dev_def456", "dev_ghi789"]
)

print(f"Group created: {group.name} ({group.uid}) with {len(group.device_ids)} devices")

Manage Group Membership

# Add devices to a group
client.fleet.groups.add_devices(
    group_id="grp_abc123",
    device_ids=["dev_jkl012"]
)

# Remove devices from a group
client.fleet.groups.remove_devices(
    group_id="grp_abc123",
    device_ids=["dev_ghi789"]
)

# List groups for a device
groups = client.fleet.groups.list(device_id="dev_abc123")
A device can belong to multiple groups. Recording rules and alerts applied to any of a device’s groups will apply to that device. If overlapping rules conflict, the most restrictive rule takes precedence.

Group-Level Metrics

Each group has its own metrics, aggregated from its member devices.
group_metrics = client.fleet.metrics.get(group_id="grp_abc123")

print(f"Group: {group_metrics.group_name}")
print(f"Active devices: {group_metrics.active_devices}/{group_metrics.total_devices}")
print(f"Recordings this week: {group_metrics.recordings_this_week}")

Next Steps