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.
Showing when a channel will free up
Setestimated_end_time on the measurement to advertise when the running test
is expected to finish. The Lab view surfaces it on the channel card while the
channel is occupied or stale, so you can plan the next test without opening
the measurement.
estimated_end_time is informational only — it doesn’t change the channel’s
occupancy state or the 48-hour staleness window. A partial update only sets
the fields you include, so patching just end_time leaves the stored
estimate in place — explicitly set estimated_end_time to None in that same
update to clear it.
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.
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
Lab view
Watch live occupancy, inspect a channel, and see what is running now.
Channel service
Take a channel out of service and read its incident history.