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.
Viewing channels as a table
The Lab view can be switched between the default card layout (channels grouped under their cycler) and a table view that renders one row per channel across every cycler in the project. Use the layout toggle at the top of the Lab view to switch modes. The choice is not saved — the view resets to cards on refresh or navigation. Use the table view when you want to:- Scan every channel in the project on a single flat list rather than a per-cycler grid.
- Filter or compare channels across cyclers — for example, show all
stalechannels or compare their electrical ratings. - Copy a channel-by-channel snapshot of what the lab is doing right now.
estimated_end_time, and the out_of_commission flag — so
nothing is hidden by switching layouts. Clicking a row opens the same
channel page as clicking a card, and the same
channel:read permission gates access.
The table reads from the same aggregation client.lab.status() exposes, so
for the equivalent flat, one-row-per-channel view from Python, flatten the
tree yourself:
Inspecting a channel
Click a channel in the Lab view to open its channel page — a dedicated view of everything that’s on (and has ever been on) that piece of hardware. The page pulls together the same data other parts of Ionworks Studio already show, so you don’t need to jump between measurements to see what a channel is doing. The channel page shows:- The channel’s current state (
free,occupied,stale, orout_of_commission) and its electrical ratings. - The active measurement, if any — the cell, protocol, start time, and estimated end time — with a Mark complete action that sets
end_timeon the measurement and frees the channel. - Recent data for the active measurement, split into two tabs:
- Time series — a trailing window of raw signals (voltage by default; add current, temperature, or any other column via the plot’s own selectors). The x-axis is a calendar-date axis anchored to the measurement’s
start_time, so the plot reads in real dates rather than elapsed seconds. - Cycles — per-cycle summary metrics across the whole measurement.
- Time series — a trailing window of raw signals (voltage by default; add current, temperature, or any other column via the plot’s own selectors). The x-axis is a calendar-date axis anchored to the measurement’s
- The history of the 100 most recent measurements that have run on this channel, ordered by start time, with links back to each measurement’s own detail page.
occupied or stale active measurement
have data to plot — a free or out_of_commission channel shows the state
badge and history but no chart.
Marking a measurement complete from the channel page is equivalent to patching
its end_time — the same operation you can do from the SDK — and moves the
channel back to free immediately:
channel:read permission — users
without it see the equipment tree in the Lab view but can’t drill into a
channel.
Querying occupancy from the SDK
client.lab wraps the same aggregation the Lab view renders from and answers
the common “what’s my lab doing right now?” questions from Python. It’s
read-only — use client.site, client.cycler, and client.channel to
mutate equipment.
Only
status() hits the network. The other methods are pure client-side views
over that payload — each fetches its own snapshot by default, so a single call
is always internally consistent.
status keyword:
free_channels when that rating
is used as a filter — an unrated channel can’t be shown to satisfy the
requirement. Drop the filter to include unrated channels.
Watching a channel
Watch a channel to follow the test that’s currently running on it. Engineers typically watch the handful of channels running their own cells; from the Lab wall you can then flip a Only watched filter to hide everything else and drill straight into the runs you care about. A watch is tied to the specific cell measurement currently on the channel, not to the channel itself — so the moment that measurement finishes (anend_time is set), the watch clears itself automatically.
Starting a new test on the same channel does not silently re-enter it into
your watchlist; opt in again when a new run begins.
Set watches from the channel page or the Lab wall — a Watch toggle appears
next to any channel that has a live occupied or stale measurement (a
free or out_of_commission channel has nothing to watch). Watches are
per-user: each teammate curates their own watchlist without affecting anyone
else.
Scheduling invariants
The server enforces a small set of scheduling invariants so the Lab view and your equipment records stay consistent. Requests that violate time-ordering or type rules are rejected with HTTP 400, while channel scheduling conflicts (overlap, out-of-commission) return HTTP 409. Nothing is written and the channel state is unchanged.
The overlap check counts only measurements without an
end_time — a completed
test never blocks a new one. To reschedule a busy channel, first close the
running measurement (patch its end_time) or move it to a different channel,
then link the new measurement.
out_of_commission
before assigning a new measurement:
Next steps
Channel service
Mark a channel out of service and review its outage history.
Planned measurements
Request a test, schedule it onto a channel, and link the real run back.