Skip to main content
Ionworks Studio can track the physical lab equipment your measurements came from — sites, cyclers, and channels — so you can link a cell measurement directly to the channel it ran on. That gives you an end-to-end link from a data point back to the hardware that produced it, and it is what the Lab view renders.

When to use it

Recording equipment is optional — measurements work fine without a channel_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.
If you just have a single cycler and don’t need this level of detail, keep using the free-text 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 — flipping out_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.
Update and delete work the same way for all three resources:

Linking a measurement to a channel

Every cell measurement has an optional, nullable channel_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.
While the test is running, leave the measurement’s 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

Set estimated_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 on name, exact match with name_exact, ISO datetime range filters (created_after / updated_before / …), and order_by / order for sort.
For sites and cyclers, 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:
Each 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.