{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/continuum/v1/edge/printer_command.schema.json", "title": "PrinterCommand", "description": "The closed set of things the cloud may ask a printer to do. Deliberately small, and deliberately missing the obvious one: there is no 'start a print' variant. Starting an uploaded file has now been confirmed by hand on a real P1P (2026-10-11), so the earlier reason for leaving it out is spent; what is still missing is the rest of the path around it - nothing uploads a sliced file to a gateway, and no job-dispatch route decides which printer should run which job. A start variant belongs here once there is something to start, not before.", "oneOf": [ { "type": "object", "title": "SetFanSpeed", "properties": { "action": { "const": "set_fan_speed" }, "percent": { "type": "integer", "minimum": 0, "maximum": 100, "description": "A percentage on this wire regardless of what the vendor wants. Each gateway converts: for Bambu that means an M106 PWM value over MQTT, which the printer then reports back as one of 16 fan gears - so a value set here does not read back identically." } }, "required": ["action", "percent"] }, { "type": "object", "title": "ControlPrint", "description": "Pause, resume or stop the print the printer is currently running. Confirmed live on a P1P (2026-10-11): all three are accepted and a stop during PREPARE/RUNNING moved the printer to FAILED, which is how Bambu reports an operator-cancelled print. Note what the printer's acceptance does not mean - all three answered success while it was IDLE with nothing to pause, so a caller that needs to know the state actually changed must read telemetry back rather than trust the command result.", "properties": { "action": { "const": "control_print" }, "control": { "enum": ["pause", "resume", "stop"], "description": "Stop is a cancel, not a pause: it ends the print and it cannot be undone. A UI should treat it accordingly." } }, "required": ["action", "control"] }, { "type": "object", "title": "SendGcodeLine", "properties": { "action": { "const": "send_gcode_line" }, "line": { "type": "string", "description": "A single raw gcode line. By far the most powerful variant, and the one to be most careful about ever exposing to a UI." } }, "required": ["action", "line"] } ] }