When to use it
Recording equipment is optional — measurements work fine without achannel_id. Set up sites, cyclers, and channels when you want to:
- Compare data collected across cyclers or labs.
- Isolate a suspect channel when a subset of measurements looks off.
- Keep long-term provenance for regulated or published data.
- See at a glance which channels are free, in use, or out of service.
test_setup fields on
each measurement instead.
Equipment hierarchy
Test equipment mirrors the cell data hierarchy:
Only cell measurements from the same project as the channel can be linked
to it. Deleting a site cascades to its cyclers, and deleting a cycler cascades
to its channels.
Sites
A site is a lab or facility that owns cyclers. Sites are organization-scoped — a physical lab is shared infrastructure, not tied to a single project.Cyclers
A cycler is a piece of cycling equipment installed at exactly one site. Cyclers are project-scoped: each cycler is owned by one project, passed at create time. Cycler names are unique within a project (case-insensitive), so two different projects can each have a cycler named"Maccor-1".
The owning project is fixed at creation. If the same physical machine is used
across two projects, create one cycler row per project.
Channels
A channel is a physical channel on a cycler. A channel belongs to exactly one cycler and inherits that cycler’s project. Channel names are unique within a cycler (case-insensitive), so two different cyclers can each have a channel named"CH1".
Channels also carry optional electrical ratings and an
out_of_commission
flag — see Channel ratings below.
Building the equipment tree
Create the site, cycler, and channels once per lab. In steady state, you’ll only touch channels — flippingout_of_commission, adjusting ratings, or
linking measurements to them.
Names are unique per org (sites) or per project (cyclers) or per cycler
(channels), case-insensitively — but
create_or_get only resolves a
conflict back to the existing record when the name matches exactly.
Calling it again with a differently-cased name that already exists (e.g.
"boston lab" when "Boston Lab" exists) raises ValueError instead of
returning the existing record. Reuse the exact name you created it with.Linking a measurement to a channel
Every cell measurement has an optional, nullablechannel_id recording the physical channel a test ran on. Set it when
creating a measurement or attach it later with an update.
The channel must belong to the same project as the measurement (a
measurement inherits its project from its cell instance). Pointing at a
channel in another project raises an error (HTTP 400).
The link is loose on purpose: deleting the channel later sets channel_id
back to NULL and leaves the measurement intact.
end_time unset and
continue uploading fresh data — the channel reads as occupied. When the test
finishes, patch the measurement with an end_time and the channel returns to
free.
Channel occupancy
The Lab view derives each channel’s state from the measurements linked to it — there’s no live telemetry. A channel is in one of four states:
The staleness window is fixed at 48 hours. This is comfortably larger than
a typical daily cycler upload cadence, so a channel only flips to
stale after
it has skipped roughly two expected updates — the real “stopped or forgotten”
signal, not a briefly-late update.
To free a stale channel, set an end_time on the linked measurement (mark
the test complete) or delete the measurement.
Channel ratings
Channels have optional electrical ratings you can set to describe what the hardware can do. The Lab UI uses them to filter channels when picking one for a new test.
Ratings are set via the API or SDK, not the UI.
Marking a channel out of service
Toggleout_of_commission to remove a channel from the pool without deleting
it or breaking historical measurements that reference it.
out_of_commission regardless of any
in-flight measurement.
Filtering, pagination, and resolving by name
Site, cycler, and channel list endpoints share the same filtering shape used across the rest of the API — case-insensitive substring match onname,
exact match with name_exact, ISO datetime range filters
(created_after / updated_before / …), and order_by / order for sort.
client.site.detail(site_id) and
client.cycler.detail(cycler_id) return the resource together with all of its
children in a single response, walking pagination for you.
Use name_exact for a case-sensitive server-side match — it’s the easiest way
to walk from a human-readable site name down to a channel id:
list() returns a PaginatedList even when you use name_exact, so
handle the empty case if the name may not exist.
Next steps
Measurements
Create a measurement and link it to a channel via
channel_id.Python API client
Configure
client.site, client.cycler, and client.channel.