Skip to content

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
    }
]
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "items": {
        "$ref": "#/components/schemas/PumpStatus"
    },
    "type": "array",
    "title": "Response List Pumps Pumps  Get"
}

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
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Check Ready Pumps  Addr  Ready Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "direction": "cw",
    "speed": 0,
    "input_port": 0,
    "output_port": 0,
    "init_gap_increments": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /pumps/initialize-all

Initialize all pumps

Description

Initialize all configured pumps sequentially.

Responses

[
    {
        "success": true,
        "addr": 0,
        "message": "string",
        "data": null,
        "error_code": 0,
        "error_message": "string"
    }
]
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "items": {
        "$ref": "#/components/schemas/habitat__models__centris__CommandResponse"
    },
    "type": "array",
    "title": "Response Initialize All Pumps Initialize All Post"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Get Init Gap Pumps  Addr  Init Gap Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "port": 0,
    "direction": "string"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Get Valve Pumps  Addr  Valve Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "volume_ul": null,
    "increments": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "volume_ul": null,
    "increments": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "position_ul": null,
    "position_increments": null,
    "top_speed_ul_per_s": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Get Position Pumps  Addr  Position Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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 firmware V<n>R command. 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 issuing S<n>R. The response's data field carries the applied speed_code and top_speed_inc_per_s so 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
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Get Speed Pumps  Addr  Speed Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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"
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

POST /pumps/terminate-all

Emergency stop all pumps

Description

Emergency stop all configured pumps.

Responses

[
    {
        "success": true,
        "addr": 0,
        "message": "string",
        "data": null,
        "error_code": 0,
        "error_message": "string"
    }
]
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "items": {
        "$ref": "#/components/schemas/habitat__models__centris__CommandResponse"
    },
    "type": "array",
    "title": "Response Terminate All Pumps Terminate All Post"
}

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

Schema of the response body
{
    "type": "object",
    "additionalProperties": true,
    "title": "Response Get Diagnostics Pumps  Addr  Diagnostics Get"
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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

{
    "addr": 0,
    "register": null,
    "raw_value": "string",
    "parsed_value": null
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

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."
}

{
    "detail": [
        {
            "loc": [
                null
            ],
            "msg": "string",
            "type": "string",
            "input": null,
            "ctx": {}
        }
    ]
}
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.

Schema of the response body
{
    "properties": {
        "detail": {
            "items": {
                "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
        }
    },
    "type": "object",
    "title": "HTTPValidationError"
}

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 ``{}`` are replaced with the current element on each iteration.
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 ``{}`` are replaced with the current element on each iteration.
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 ``{}`` resolved against the routine scope at run time.
steps Array<RoutineStep-Input> Step body executed once per iteration.

LoopBlock-Output

Name Type Description
count Iteration count. Integer literal or ``{}`` resolved against the routine scope at run time.
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