Pumps
CENTRIS syringe pump driver-level control.
All endpoints are under the /pumps/ prefix.
The openculture SDK is a typed REST client — it calls the same
endpoints as the REST tab.
Namespace: h.pumps — 19 endpoints.
from openculture import HabitatClient
from openculture.client.habitat.models.pumps import InitRequest, PlungerMoveRequest
with HabitatClient("http://mistyforest.local:8000") as h:
# List all pumps
pumps = h.pumps.list()
# Get a single pump by address
pump = h.pumps.get(0)
print(pump.addr, pump.name, pump.ready)
# Initialize (homes plunger and valve)
result = h.pumps.initialize_pump(0, request=InitRequest())
assert result.success
# Driver-level dispense and aspirate
# (for workflow-level operations use h.atomics / h.routines instead)
h.pumps.dispense(0, request=PlungerMoveRequest(...))
h.pumps.aspirate(0, request=PlungerMoveRequest(...))
All request and response shapes are in openculture.client.habitat.models.
Endpoint reference
Habitat API — centris 0.1.0
REST API for the Habitat tissue-culture automation platform by Open Culture Science. All endpoints accept and return JSON.
centris
GET /pumps/
List all pumps
Description
Get status for all configured pumps.
Served from the driver's in-memory cache (get_cached_status) so this
polled endpoint stays off the shared serial lock. The 1 Hz telemetry
source keeps the cache fresh; a single live read happens only at cold
start. The single-pump GET /pumps/{addr} remains a live read.
Responses
[
{
"addr": 0,
"name": "string",
"ready": true,
"initialized": true,
"error_code": 0,
"error_message": "string",
"plunger_position_increments": 0,
"plunger_position_ul": null,
"valve_position": 0,
"valve_type": "string",
"syringe_volume_ul": 0,
"top_speed_inc_per_s": 10.12,
"start_speed_inc_per_s": 0,
"cutoff_speed_inc_per_s": 0,
"temperature_f": null,
"voltage": null,
"operating_time_min": null,
"firmware": null
}
]
GET /pumps/{addr}
Pump status
Description
Get detailed status for a single pump.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
{
"addr": 0,
"name": "string",
"ready": true,
"initialized": true,
"error_code": 0,
"error_message": "string",
"plunger_position_increments": 0,
"plunger_position_ul": null,
"valve_position": 0,
"valve_type": "string",
"syringe_volume_ul": 0,
"top_speed_inc_per_s": 10.12,
"start_speed_inc_per_s": 0,
"cutoff_speed_inc_per_s": 0,
"temperature_f": null,
"voltage": null,
"operating_time_min": null,
"firmware": null
}
Schema of the response body
{
"properties": {
"addr": {
"type": "integer",
"title": "Addr"
},
"name": {
"type": "string",
"title": "Name",
"default": ""
},
"ready": {
"type": "boolean",
"title": "Ready"
},
"initialized": {
"type": "boolean",
"title": "Initialized"
},
"error_code": {
"type": "integer",
"title": "Error Code"
},
"error_message": {
"type": "string",
"title": "Error Message"
},
"plunger_position_increments": {
"type": "integer",
"title": "Plunger Position Increments"
},
"plunger_position_ul": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Plunger Position Ul"
},
"valve_position": {
"type": "integer",
"title": "Valve Position"
},
"valve_type": {
"type": "string",
"title": "Valve Type"
},
"syringe_volume_ul": {
"type": "integer",
"title": "Syringe Volume Ul"
},
"top_speed_inc_per_s": {
"type": "number",
"title": "Top Speed Inc Per S",
"default": 0
},
"start_speed_inc_per_s": {
"type": "integer",
"title": "Start Speed Inc Per S",
"default": 0
},
"cutoff_speed_inc_per_s": {
"type": "integer",
"title": "Cutoff Speed Inc Per S",
"default": 0
},
"temperature_f": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Temperature F"
},
"voltage": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Voltage"
},
"operating_time_min": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Operating Time Min"
},
"firmware": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Firmware"
}
},
"type": "object",
"required": [
"addr",
"ready",
"initialized",
"error_code",
"error_message",
"plunger_position_increments",
"valve_position",
"valve_type",
"syringe_volume_ul"
],
"title": "PumpStatus",
"description": "Full pump status returned to API consumers."
}
GET /pumps/{addr}/ready
Check pump ready state
Description
Quick check if pump is ready (not busy).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
POST /pumps/{addr}/initialize
Initialize pump
Description
Initialize a pump (home plunger and valve).
When input_port / init_port is 0 or omitted, the driver picks
a port from the pump YAML port_map: first waste role, then first
unmapped port, then 1.
When init_gap_increments is provided, set_init_gap is invoked
BEFORE the Z homing command for this initialization run. This path
enforces the same SAFE_FLOOR rule as POST /pumps/{addr}/init-gap
but does not offer an override — values below the floor are
rejected with HTTP 400. To persist a sub-floor value, call the
dedicated /init-gap endpoint with override_safety_floor=true
first, then call this endpoint without init_gap_increments.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
Schema of the request body
{
"properties": {
"direction": {
"$ref": "#/components/schemas/habitat__models__centris__InitDirection",
"default": "cw"
},
"speed": {
"type": "integer",
"maximum": 25.0,
"minimum": 4.0,
"title": "Speed",
"description": "Init speed code",
"default": 10
},
"input_port": {
"type": "integer",
"minimum": 0.0,
"title": "Input Port",
"description": "Distribution-valve input port for homing. Use ``0`` (or omit) for auto-selection from the pump YAML ``port_map``: first waste role, else first port not listed in the map, else port 1. JSON may use the field name ``init_port`` as an alias.",
"default": 0
},
"output_port": {
"type": "integer",
"minimum": 0.0,
"title": "Output Port",
"description": "Init output port (0=default)",
"default": 0
},
"init_gap_increments": {
"anyOf": [
{
"type": "integer",
"minimum": 0.0
},
{
"type": "null"
}
],
"title": "Init Gap Increments",
"description": "Optional one-shot post-init plunger gap in increments. If provided, ``set_init_gap`` is called BEFORE the Z command on this initialization only. ``None`` means use the previously-configured gap (firmware default ~1600 if never set). DANGER: see ``POST /pumps/{addr}/init-gap`` for hazard details. This path requires ``gap_increments >= 100`` (the safety floor) — there is no override field on this endpoint. Use the dedicated ``/init-gap`` endpoint with ``override_safety_floor=true`` if you must persist a sub-floor value before initialization."
}
},
"type": "object",
"title": "InitRequest",
"description": "Request body for pump initialization."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
POST /pumps/initialize-all
Initialize all pumps
Description
Initialize all configured pumps sequentially.
Responses
GET /pumps/{addr}/init-gap
Read configured post-init plunger gap
Description
Return the configured post-init plunger gap (driver-side cached state).
The gap is the increment offset where the plunger lands after the next
Z (home) command. None indicates no gap has been configured on
this driver session — the firmware default (~1600 increments) applies.
This endpoint is read-only and performs no hardware I/O. It is the
canonical way to inspect the current gap before issuing
POST /pumps/{addr}/init-gap.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
POST /pumps/{addr}/valve
Rotate the distribution valve to a port
Description
Rotates the pump's rotary distribution valve to the requested port. The pump must be initialised (POST /pumps/{addr}/initialize) first. Blocks until the firmware reports the rotation complete (typically ~300 ms). The direction parameter (cw default, ccw alt) picks shortest-path rotation; the firmware will pick the natural direction when not specified.
Cross-contamination hazard: rotating a valve while there is fluid in the line can carry trace volume into the new port. Compose with a dispense-to-waste between dissimilar reagents.
Returns CommandResponse{success, message, error_code}. Successful response carries the new port in data.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
Schema of the request body
{
"properties": {
"port": {
"type": "integer",
"maximum": 12.0,
"minimum": 1.0,
"title": "Port",
"description": "Target port number"
},
"direction": {
"type": "string",
"title": "Direction",
"description": "Rotation direction: 'cw' (I command) or 'ccw' (O command)",
"default": "cw"
}
},
"type": "object",
"required": [
"port"
],
"title": "ValveMoveRequest",
"description": "Request body for valve movement."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
GET /pumps/{addr}/valve
Query valve position
Description
Query the current valve port position.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
POST /pumps/{addr}/aspirate
Aspirate fluid into the syringe
Description
Aspirates (draws in) a fluid volume into the syringe. Body accepts either volume_ul (preferred) or increments; supplying both is an error. The driver converts µL → increments using OUR config's syringe volume (never the NVRAM value — see ADR 002), so the move is always sized for the physically installed syringe.
Preconditions:
* Pump initialised.
* Valve already rotated to the source port (POST /pumps/{addr}/valve).
* Requested volume + current plunger position ≤ syringe capacity.
Returns 200 with success=true on a successful firmware ack. On firmware error the response carries success=false and error_code / error_message set.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
Schema of the request body
{
"properties": {
"volume_ul": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Volume Ul",
"description": "Volume in microliters"
},
"increments": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Increments",
"description": "Position in increments"
}
},
"type": "object",
"title": "PlungerMoveRequest",
"description": "Request body for aspirate, dispense, or absolute move.\n\nProvide exactly one of volume_ul or increments."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
POST /pumps/{addr}/dispense
Dispense fluid from the syringe
Description
Dispenses (pushes out) a fluid volume from the syringe. Mirror of aspirate, but pushes the plunger toward 0 instead of toward syringe capacity. Body accepts either volume_ul (preferred) or increments; supplying both is an error.
Preconditions: * Pump initialised. * Valve already rotated to the destination port. * Requested volume ≤ current plunger position (no negative position).
Returns 200 with success=true on a successful firmware ack.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
Schema of the request body
{
"properties": {
"volume_ul": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Volume Ul",
"description": "Volume in microliters"
},
"increments": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Increments",
"description": "Position in increments"
}
},
"type": "object",
"title": "PlungerMoveRequest",
"description": "Request body for aspirate, dispense, or absolute move.\n\nProvide exactly one of volume_ul or increments."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
POST /pumps/{addr}/move-absolute
Move plunger to an absolute position
Description
Drives the plunger to an absolute position (in µL or increments). Combines a speed-set + move-absolute in one atomic call: when top_speed_ul_per_s is supplied, the driver applies it via set_speed (snapped to the nearest S-code) immediately before the move so the slider value the GUI shows and the rate the move executes at are guaranteed consistent.
Preconditions: * Pump initialised. * Target position in [0, syringe_volume_ul].
If the speed-set fails the move still proceeds with the previously-set speed — the speed-set failure is logged but doesn't block the motion. The response reflects the move result only.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
Schema of the request body
{
"properties": {
"position_ul": {
"anyOf": [
{
"type": "number",
"minimum": 0.0
},
{
"type": "null"
}
],
"title": "Position Ul",
"description": "Absolute position in microliters"
},
"position_increments": {
"anyOf": [
{
"type": "integer",
"minimum": 0.0
},
{
"type": "null"
}
],
"title": "Position Increments",
"description": "Absolute position in increments"
},
"top_speed_ul_per_s": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Top Speed Ul Per S",
"description": "Optional top plunger speed in µL/s to apply before the move. When omitted, the firmware's previously-set speed is used."
}
},
"type": "object",
"title": "AbsoluteMoveRequest",
"description": "Request body for absolute plunger positioning.\n\nProvide exactly one of position_ul or position_increments.\n\nThe optional ``top_speed_ul_per_s`` lets a caller pin the speed\nthat will govern the move in a single round-trip. When set, the\nendpoint calls ``set_speed`` with that value immediately before\nissuing the absolute-position command. Behaviourally this is\nequivalent to ``POST /pumps/{addr}/speed`` followed by\n``POST /pumps/{addr}/move-absolute`` but atomic — the operator's\nGUI slider value can travel with the drag instead of relying on\na separate poll cycle to converge."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
GET /pumps/{addr}/position
Query plunger position
Description
Query the current plunger position.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
POST /pumps/{addr}/speed
Set speed profile
Description
Set the plunger top-speed profile. Body accepts one of three ways to express the target speed:
speed_code(int, 0–50): the firmware-native discrete S code. 0 is fastest (200,000 inc/s), 50 is slowest (1 inc/s). Used as-is.top_speed_inc_per_s(float): arbitrary inc/s sent via the firmwareV<n>Rcommand. Not snapped — accepts any value the firmware allows.top_speed_ul_per_s(float): the operator-friendly form. The driver converts µL/s → inc/s using the config's syringe volume (never the NVRAM value — see ADR 002) and then snaps to the nearest discrete speed code before issuingS<n>R. The response'sdatafield carries the appliedspeed_codeandtop_speed_inc_per_sso the caller can verify the snapped result.
Returns success: true whenever the firmware accepts the speed write (the snap-to-code path is guaranteed to succeed for any code 0–50).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Request body
{
"speed_code": null,
"top_speed_inc_per_s": null,
"top_speed_ul_per_s": null,
"start_speed_inc_per_s": null,
"cutoff_speed_inc_per_s": null,
"slope_up": null,
"slope_down": null
}
Schema of the request body
{
"properties": {
"speed_code": {
"anyOf": [
{
"type": "integer",
"maximum": 50.0,
"minimum": 0.0
},
{
"type": "null"
}
],
"title": "Speed Code",
"description": "Predefined speed code (0-50)"
},
"top_speed_inc_per_s": {
"anyOf": [
{
"type": "number",
"maximum": 200000.0,
"minimum": 1.0
},
{
"type": "null"
}
],
"title": "Top Speed Inc Per S",
"description": "Top speed in increments/second"
},
"top_speed_ul_per_s": {
"anyOf": [
{
"type": "number",
"exclusiveMinimum": 0.0
},
{
"type": "null"
}
],
"title": "Top Speed Ul Per S",
"description": "Top speed in microliters/second"
},
"start_speed_inc_per_s": {
"anyOf": [
{
"type": "integer",
"maximum": 32000.0,
"minimum": 800.0
},
{
"type": "null"
}
],
"title": "Start Speed Inc Per S",
"description": "Start speed in inc/s"
},
"cutoff_speed_inc_per_s": {
"anyOf": [
{
"type": "integer",
"maximum": 64000.0,
"minimum": 800.0
},
{
"type": "null"
}
],
"title": "Cutoff Speed Inc Per S",
"description": "Cutoff speed in inc/s"
},
"slope_up": {
"anyOf": [
{
"type": "integer",
"maximum": 40.0,
"minimum": 1.0
},
{
"type": "null"
}
],
"title": "Slope Up",
"description": "Ramp-up slope code"
},
"slope_down": {
"anyOf": [
{
"type": "integer",
"maximum": 40.0,
"minimum": 1.0
},
{
"type": "null"
}
],
"title": "Slope Down",
"description": "Ramp-down slope code"
}
},
"type": "object",
"title": "SpeedRequest",
"description": "Request body for setting plunger speed."
}
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
GET /pumps/{addr}/speed
Query speed settings
Description
Query the current speed settings (from cached state).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
POST /pumps/{addr}/terminate
Graceful stop
Description
Graceful stop (T command).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
POST /pumps/{addr}/reset
Software reset
Description
Software reset (! command). Pump will need re-initialization.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
{
"success": true,
"addr": 0,
"message": "string",
"data": null,
"error_code": 0,
"error_message": "string"
}
Schema of the response body
{
"properties": {
"success": {
"type": "boolean",
"title": "Success"
},
"addr": {
"type": "integer",
"title": "Addr"
},
"message": {
"type": "string",
"title": "Message",
"default": ""
},
"data": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Data"
},
"error_code": {
"type": "integer",
"title": "Error Code",
"default": 0
},
"error_message": {
"type": "string",
"title": "Error Message",
"default": ""
}
},
"type": "object",
"required": [
"success",
"addr"
],
"title": "CommandResponse",
"description": "Generic response from a pump command."
}
POST /pumps/terminate-all
Emergency stop all pumps
Description
Emergency stop all configured pumps.
Responses
GET /pumps/{addr}/diagnostics
Pump diagnostics
Description
Get diagnostic information: temperature, voltage, operating time, firmware.
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
GET /pumps/{addr}/configuration
Hardware configuration
Description
Query hardware configuration register (?76).
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
addr |
path | integer | No |
Responses
Schema of the response body
{
"properties": {
"addr": {
"type": "integer",
"title": "Addr"
},
"register": {
"anyOf": [
{
"type": "integer"
},
{
"type": "string"
}
],
"title": "Register",
"description": "Register identifier"
},
"raw_value": {
"type": "string",
"title": "Raw Value"
},
"parsed_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "integer"
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Parsed Value"
}
},
"type": "object",
"required": [
"addr",
"register",
"raw_value"
],
"title": "QueryResponse",
"description": "Response for report/query commands.\n\nThe wire-level field is ``register`` (preserved via the alias) but the\nPython attribute is ``register_number`` to avoid Pydantic's \"field\nshadows BaseModel attribute\" warning for the bare ``register`` name."
}
Schemas
AbsoluteMoveRequest
| Name | Type | Description |
|---|---|---|
position_increments |
Absolute position in increments | |
position_ul |
Absolute position in microliters | |
top_speed_ul_per_s |
Optional top plunger speed in µL/s to apply before the move. When omitted, the firmware's previously-set speed is used. |
AtomicCallRequest
| Name | Type | Description |
|---|---|---|
params |
Atomic parameters keyed by the names declared in the manifest. |
AtomicManifest
| Name | Type | Description |
|---|---|---|
authored_by |
string | |
belongs_to_routines |
Array<string> | |
blocking |
||
description |
string | |
device_kind |
string | |
emits_metrics |
Array<string> | Advisory list of metric names this atomic is expected to emit. Not populated by any atomic today and not enforced or cross-checked against the telemetry layer -- agent-read-only metadata, not a live emission guarantee. |
estimated_fluid_volume_ul |
||
estimated_wear |
string | Advisory relative wear estimate. Not derived from any measurement and not read by the runtime -- agent-read-only metadata for planning, not a calibrated cost model. |
expected_duration_ms |
||
failure_modes |
Array<FailureMode> | |
hazards |
Array<Hazard> | |
idempotent |
boolean | |
interrupted_state |
string | |
kind |
string | |
last_calibrated |
||
mutates |
Array<string> | |
name |
string | |
params |
Array<ParamSpec> | |
postconditions |
Array<Postcondition> | |
preconditions |
Array<Precondition> | |
requires_human_confirmation |
boolean | |
requires_state |
||
reverse_atomic |
Advisory pointer to the atomic that would undo this one. Not populated by any atomic today and not enforced or invoked by the runtime -- agent-read-only metadata, not a guarantee a reverse operation exists or is registered. | |
reversible |
boolean | |
side_effects |
Array<string> | |
summary |
string | |
tier |
string | |
typical_predecessors |
Array<string> | |
typical_successors |
Array<string> | |
validated_on_hardware |
Array<string> | |
version |
string |
CreateEventRequest
| Name | Type | Description |
|---|---|---|
action |
string | Action type (e.g. 'feed', 'wash') |
color |
string | |
duration_min |
number | |
notes |
string | |
parameters |
||
sample_id |
string | Target sample ID |
series_id |
||
start_time |
string | Scheduled start (ISO 8601) |
CurrentLimitRequest
| Name | Type | Description |
|---|---|---|
current_limit_ma |
integer | Current limit in mA (Tic 36v4 max: 4000) |
DeviceRef
| Name | Type | Description |
|---|---|---|
id |
string | |
kind |
string |
DoseRequest
| Name | Type | Description |
|---|---|---|
block |
boolean | Wait for motion to complete before returning |
direction |
FlowDirection | Flow direction |
volume_ml |
number | Volume to pump in mL |
ExecuteRoutineRequest
| Name | Type | Description |
|---|---|---|
params |
Routine parameters keyed by the names declared in the manifest. |
FailureMode
| Name | Type | Description |
|---|---|---|
error_class |
string | |
recommended_recovery |
Array<RecoveryStep> | |
when |
string |
FlowDirection
Type: string
ForeachBlock-Input
| Name | Type | Description |
|---|---|---|
as_var |
string | Loop variable name. Body placeholders ``{ |
list_param |
string | Placeholder name (without braces) for the list parameter, e.g. 'samples' resolves to the value of bound_params['samples']. |
steps |
Array<RoutineStep-Input> | Step body executed once per list element. |
ForeachBlock-Output
| Name | Type | Description |
|---|---|---|
as_var |
string | Loop variable name. Body placeholders ``{ |
list_param |
string | Placeholder name (without braces) for the list parameter, e.g. 'samples' resolves to the value of bound_params['samples']. |
steps |
Array<RoutineStep-Output> | Step body executed once per list element. |
habitat__models__centris__CommandResponse
| Name | Type | Description |
|---|---|---|
addr |
integer | |
data |
||
error_code |
integer | |
error_message |
string | |
message |
string | |
success |
boolean |
habitat__models__centris__InitDirection
Type: string
habitat__models__centris__InitRequest
| Name | Type | Description |
|---|---|---|
direction |
habitat__models__centris__InitDirection | |
init_gap_increments |
Optional one-shot post-init plunger gap in increments. If provided, ``set_init_gap`` is called BEFORE the Z command on this initialization only. ``None`` means use the previously-configured gap (firmware default ~1600 if never set). DANGER: see ``POST /pumps/{addr}/init-gap`` for hazard details. This path requires ``gap_increments >= 100`` (the safety floor) — there is no override field on this endpoint. Use the dedicated ``/init-gap`` endpoint with ``override_safety_floor=true`` if you must persist a sub-floor value before initialization. | |
input_port |
integer | Distribution-valve input port for homing. Use ``0`` (or omit) for auto-selection from the pump YAML ``port_map``: first waste role, else first port not listed in the map, else port 1. JSON may use the field name ``init_port`` as an alias. |
output_port |
integer | Init output port (0=default) |
speed |
integer | Init speed code |
habitat__models__peristaltic__CommandResponse
| Name | Type | Description |
|---|---|---|
error |
||
message |
string | |
pump_name |
string | |
success |
boolean |
habitat__models__smartvalve__CommandResponse
| Name | Type | Description |
|---|---|---|
addr |
integer | |
data |
||
error_code |
integer | |
error_message |
string | |
message |
string | |
success |
boolean |
habitat__models__smartvalve__InitDirection
Type: string
habitat__models__smartvalve__InitRequest
| Name | Type | Description |
|---|---|---|
direction |
habitat__models__smartvalve__InitDirection | |
input_port |
integer | Init input port (0=default) |
output_port |
integer | Init output port (0=default) |
speed |
integer | Init speed code |
Hazard
| Name | Type | Description |
|---|---|---|
agent_guidance |
string | |
condition |
string | |
id |
string | |
severity |
string |
HTTPValidationError
| Name | Type | Description |
|---|---|---|
detail |
Array<ValidationError> |
Job
| Name | Type | Description |
|---|---|---|
cancel_requested |
boolean | |
created_at |
string(date-time) | |
created_by |
||
error |
||
finished_at |
||
id |
string | |
idempotency_key |
||
params |
||
parent_id |
||
progress |
||
request_id |
string | |
result |
||
started_at |
||
status |
JobStatus | |
targets |
Array<DeviceRef> | |
type |
string |
JobProgress
| Name | Type | Description |
|---|---|---|
current_step |
string | |
note |
||
step_index |
||
total_steps |
JobStatus
Type: string
JobSubmissionBody
| Name | Type | Description |
|---|---|---|
params |
Runnable-specific request body | |
targets |
Optional list of device references the job acts on. If omitted, the runnable receives an empty target list. | |
type |
string | Registered runnable name (e.g. 'actions.wash') |
LoopBlock-Input
| Name | Type | Description |
|---|---|---|
count |
Iteration count. Integer literal or ``{ |
|
steps |
Array<RoutineStep-Input> | Step body executed once per iteration. |
LoopBlock-Output
| Name | Type | Description |
|---|---|---|
count |
Iteration count. Integer literal or ``{ |
|
steps |
Array<RoutineStep-Output> | Step body executed once per iteration. |
MoveRequest
| Name | Type | Description |
|---|---|---|
block |
boolean | Wait for motion to complete before returning |
relative |
boolean | If True, move relative to current position. If False, absolute. |
steps |
integer | Number of microsteps (positive = forward, negative = reverse) |
ParallelBlock-Input
| Name | Type | Description |
|---|---|---|
steps |
Array<RoutineStep-Input> | Steps executed concurrently. |
ParallelBlock-Output
| Name | Type | Description |
|---|---|---|
steps |
Array<RoutineStep-Output> | Steps executed concurrently. |
ParamSpec
| Name | Type | Description |
|---|---|---|
default |
||
name |
string | |
range |
||
required |
boolean | |
semantic_role |
string | |
type |
string | |
unit |
PeristalticStatus
| Name | Type | Description |
|---|---|---|
current_limit_ma |
||
current_position |
integer | |
current_velocity |
integer | |
energized |
boolean | |
errors |
string | |
flow_rate_ul_min |
number | |
max_speed |
||
name |
string | |
operation_state |
string | |
planning_mode |
string | |
ready |
boolean | |
serial_number |
||
step_mode |
integer | |
target_position |
integer | |
vin_voltage |
PlungerMoveRequest
| Name | Type | Description |
|---|---|---|
increments |
Position in increments | |
volume_ul |
Volume in microliters |
Postcondition
| Name | Type | Description |
|---|---|---|
description |
string | |
state |
Precondition
| Name | Type | Description |
|---|---|---|
check_id |
string | |
description |
string | |
on_fail_atomic |
PrimeRequest
| Name | Type | Description |
|---|---|---|
seconds |
number | Duration to run in seconds (max 5 minutes) |
velocity |
integer | Velocity in microsteps per 10,000 seconds |
ProblemDetails
| Name | Type | Description |
|---|---|---|
detail |
||
instance |
||
request_id |
||
status |
integer | HTTP status code |
title |
string | Short human-readable summary |
type |
string | Problem type URI |
ProtocolDefaults
| Name | Type | Description |
|---|---|---|
chip_id |
||
pump_name |
||
sample_id |
||
speed_code |
||
timeout_s |
ProtocolManifest
| Name | Type | Description |
|---|---|---|
author |
string | |
color |
||
composes_atomics |
Array<string> | |
composes_routines |
Array<string> | |
created_at |
||
defaults |
ProtocolDefaults | |
description |
string | |
device_kinds |
Array<string> | |
device_name |
||
emits_metrics |
Array<string> | |
estimated_duration_ms |
||
estimated_wear |
string | |
failure_modes |
Array<FailureMode> | |
file_path |
||
hazards |
Array<Hazard> | |
icon |
||
last_calibrated |
||
library |
string | |
name |
string | |
params |
Array<ParamSpec> | |
postconditions |
Array<Postcondition> | |
preconditions |
Array<Precondition> | |
requires_human_confirmation |
boolean | |
requires_state |
||
schedule_items |
Array<ProtocolScheduleItem> | |
scope |
string | |
side_effects |
Array<string> | |
status |
string | |
summary |
string | |
tags |
Array<string> | |
tier |
string | |
updated_at |
||
validated_on_hardware |
Array<string> | |
version |
string |
ProtocolPlan
| Name | Type | Description |
|---|---|---|
anchor_time |
string | |
bound_params |
||
ended_at |
||
protocol_name |
string | |
protocol_version |
string | |
run_id |
string | |
started_at |
string(date-time) | |
status |
string | |
step_results |
Array<ScheduleSubmission> | |
submissions |
Array<ScheduleSubmission> |
ProtocolScheduleItem
| Name | Type | Description |
|---|---|---|
atomic |
||
item_id |
string | |
label |
string | |
params |
||
routine |
||
sample_id |
||
schedule |
ScheduleSpec |
PumpStatus
| Name | Type | Description |
|---|---|---|
addr |
integer | |
cutoff_speed_inc_per_s |
integer | |
error_code |
integer | |
error_message |
string | |
firmware |
||
initialized |
boolean | |
name |
string | |
operating_time_min |
||
plunger_position_increments |
integer | |
plunger_position_ul |
||
ready |
boolean | |
start_speed_inc_per_s |
integer | |
syringe_volume_ul |
integer | |
temperature_f |
||
top_speed_inc_per_s |
number | |
valve_position |
integer | |
valve_type |
string | |
voltage |
QueryResponse
| Name | Type | Description |
|---|---|---|
addr |
integer | |
parsed_value |
||
raw_value |
string | |
register |
Register identifier |
RecoveryStep
| Name | Type | Description |
|---|---|---|
atomic_name |
string | |
delay_ms_between_attempts |
integer | |
expected_postcondition |
||
max_attempts |
integer | |
params |
||
rationale |
string | |
verify_with |
RoutineManifest-Input
| Name | Type | Description |
|---|---|---|
authored_by |
string | |
blocking |
boolean | |
chip_aware |
boolean | |
composes |
Array<string> | |
created_at |
||
description |
string | |
device_kinds |
Array<string> | |
device_name |
||
emits_metrics |
Array<string> | |
estimated_fluid_volume_ul |
||
estimated_wear |
string | |
expected_duration_ms |
||
failure_modes |
Array<FailureMode> | |
file_path |
||
hazards |
Array<Hazard> | |
idempotent |
boolean | |
interrupted_state |
string | |
last_calibrated |
||
library |
string | |
mutates |
Array<string> | |
name |
string | |
params |
Array<ParamSpec> | |
postconditions |
Array<Postcondition> | |
preconditions |
Array<Precondition> | |
requires_human_confirmation |
boolean | |
requires_state |
||
reversible |
boolean | |
side_effects |
Array<string> | |
steps |
Array<RoutineStep-Input> | |
summary |
string | |
tier |
string | |
typical_predecessors |
Array<string> | |
typical_successors |
Array<string> | |
updated_at |
||
validated_on_hardware |
Array<string> | |
version |
string |
RoutineManifest-Output
| Name | Type | Description |
|---|---|---|
authored_by |
string | |
blocking |
boolean | |
chip_aware |
boolean | |
composes |
Array<string> | |
created_at |
||
description |
string | |
device_kinds |
Array<string> | |
device_name |
||
emits_metrics |
Array<string> | |
estimated_fluid_volume_ul |
||
estimated_wear |
string | |
expected_duration_ms |
||
failure_modes |
Array<FailureMode> | |
file_path |
||
hazards |
Array<Hazard> | |
idempotent |
boolean | |
interrupted_state |
string | |
last_calibrated |
||
library |
string | |
mutates |
Array<string> | |
name |
string | |
params |
Array<ParamSpec> | |
postconditions |
Array<Postcondition> | |
preconditions |
Array<Precondition> | |
requires_human_confirmation |
boolean | |
requires_state |
||
reversible |
boolean | |
side_effects |
Array<string> | |
steps |
Array<RoutineStep-Output> | |
summary |
string | |
tier |
string | |
typical_predecessors |
Array<string> | |
typical_successors |
Array<string> | |
updated_at |
||
validated_on_hardware |
Array<string> | |
version |
string |
RoutineStep-Input
| Name | Type | Description |
|---|---|---|
atomic |
||
delay_after_ms |
integer | |
foreach |
||
label |
string | |
loop |
||
max_retries |
integer | |
on_error |
string | |
parallel |
||
params |
||
routine |
RoutineStep-Output
| Name | Type | Description |
|---|---|---|
atomic |
||
delay_after_ms |
integer | |
foreach |
||
label |
string | |
loop |
||
max_retries |
integer | |
on_error |
string | |
parallel |
||
params |
||
routine |
RoutineValidationReport
| Name | Type | Description |
|---|---|---|
is_valid |
boolean | |
issues |
Array<ValidationIssue> | |
manifest |
RunProtocolRequest
| Name | Type | Description |
|---|---|---|
bound_params |
Bindings for the protocol's declared params. |
ScheduleSpec
| Name | Type | Description |
|---|---|---|
duration_min |
||
event_duration_min |
||
interval_min |
||
kind |
string | |
offset_min |
ScheduleSubmission
| Name | Type | Description |
|---|---|---|
atomic |
||
duration_ms |
integer | |
error |
||
event_id |
string | |
fire_at |
string | |
job_id |
||
label |
string | |
params |
||
routine |
||
status |
string | |
step_id |
string | |
step_index |
integer | |
target_kind |
string | |
target_name |
string |
SensorListEntry
| Name | Type | Description |
|---|---|---|
connected |
boolean | |
driver_mode |
string | |
id |
string | |
label |
string |
SensorListResponse
| Name | Type | Description |
|---|---|---|
sensors |
Array<SensorListEntry> |
SensorReading
| Name | Type | Description |
|---|---|---|
co2_pct |
||
humidity_pct |
||
sample_count |
integer | |
sample_rate_hz |
number | |
temperature_c |
||
timestamp |
||
warming_up |
boolean |
SensorStatus
| Name | Type | Description |
|---|---|---|
connected |
boolean | |
csv_path |
||
driver_mode |
string | |
id |
string | |
label |
string | |
last_reading_at |
||
malformed_frame_count |
integer | |
port |
||
sample_count |
integer | |
sample_rate_hz |
number | |
warming_up |
boolean |
SpeedConfigRequest
| Name | Type | Description |
|---|---|---|
max_accel |
Maximum acceleration in microsteps/s per 100 s | |
max_decel |
Maximum deceleration in microsteps/s per 100 s | |
max_speed |
Maximum speed in microsteps per 10,000 seconds | |
starting_speed |
Starting speed in microsteps per 10,000 seconds |
SpeedRequest
| Name | Type | Description |
|---|---|---|
cutoff_speed_inc_per_s |
Cutoff speed in inc/s | |
slope_down |
Ramp-down slope code | |
slope_up |
Ramp-up slope code | |
speed_code |
Predefined speed code (0-50) | |
start_speed_inc_per_s |
Start speed in inc/s | |
top_speed_inc_per_s |
Top speed in increments/second | |
top_speed_ul_per_s |
Top speed in microliters/second |
SpinRequest
| Name | Type | Description |
|---|---|---|
velocity |
integer | Velocity in microsteps per 10,000 seconds (negative = reverse) |
StepMode
Type: integer
StepModeRequest
| Name | Type | Description |
|---|---|---|
step_mode |
StepMode | Microstepping divisor |
StopRequest
| Name | Type | Description |
|---|---|---|
hold |
boolean | If True, hold position (energized). If False, de-energize (freewheel). |
TestRunRoutineRequest
| Name | Type | Description |
|---|---|---|
params |
Routine parameters. Merged on top of the routine's manifest defaults before the executor walks the steps. |
ValidateProtocolRequest
| Name | Type | Description |
|---|---|---|
yaml_text |
string | Raw YAML text of the protocol manifest to validate. |
ValidateRoutineRequest
| Name | Type | Description |
|---|---|---|
yaml_text |
string | Raw YAML text of the routine manifest to validate. |
ValidationError
| Name | Type | Description |
|---|---|---|
ctx |
||
input |
||
loc |
Array<> | |
msg |
string | |
type |
string |
ValidationIssue
| Name | Type | Description |
|---|---|---|
code |
string | |
location |
string | |
message |
string | |
severity |
string | |
suggested_fix |
ValidationReport
| Name | Type | Description |
|---|---|---|
is_valid |
boolean | |
issues |
Array<ValidationIssue> | |
manifest |
ValveMoveRequest
| Name | Type | Description |
|---|---|---|
direction |
string | Rotation direction: 'cw' (I command) or 'ccw' (O command) |
port |
integer | Target port number |
ValveStatus
| Name | Type | Description |
|---|---|---|
addr |
integer | |
error_code |
integer | |
error_message |
string | |
firmware |
||
initialized |
boolean | |
name |
string | |
operating_time_min |
||
ready |
boolean | |
temperature_f |
||
valve_position |
integer | |
valve_type |
string | |
voltage |