Compare commits

..

10 Commits

Author SHA1 Message Date
octoturge 053f1d3ec4 feat: Added unload filament schema 2026-08-31 21:42:43 +00:00
octoturge d4b9f62de0 feat: Added new schemas 2026-08-31 21:18:49 +00:00
octoturge 51dba8e896 Fix broken v2 bambulab schema refs, wire up v2 dispatchers, fix PrintJobStatus JSON mismatch
- v2/common/device/device.schema.json: stray backtick in bed $ref broke resolution
- v2/report/print/print.schema.json: ams $ref pointed at wrong path (missing ams/ subdir)
- v2/common/device/plate.schema.json: $id was copy-pasted from bed.schema.json
- Add v2/request.schema.json and v2/report.schema.json dispatchers - v2's leaf
  schemas were unreachable without them, same oneOf convention as v1
- Rewrite schemas/bambulab/README.md layout section, which still described
  v1's pre-rename paths and claimed v2 was removed
- PrintJob.status serialized as a raw i32 in Rust (prost stores proto3 enums
  as i32) while ts-types' TypeBox schema validates full enum name strings -
  add serde with= on the field so Rust JSON matches TS and protobuf's own
  canonical JSON enum mapping, plus a regression test
2026-08-31 13:50:51 +00:00
octoturge 1b23c58eb6 feat: push_status report for Bambu MQTT v2 2026-08-31 13:41:56 +00:00
octoturge 20ecc1e8bd chore: schema reorganization 2026-08-31 11:02:55 +00:00
octoturge fe735c310b Added v1 schema for PushStatusReport 2026-08-31 07:03:43 +00:00
octoturge 4cc40c913c Fix broken $refs from the bambulab schema underscore-rename, remove stale v2/
- print.schema.json, _ams.schema.json, _ams_unit.schema.json still
  pointed at the pre-rename filenames (ams.schema.json, ams_unit.schema.json,
  ams_tray.schema.json) after the underscore-prefix split - fixed all
  three, verified with a full jsonschema + referencing validation run
  against real captures (get_version, pushall, a full print/ams/xcam
  report with both empty and loaded trays) plus negative tests.
- _upgrade_state.schema.json: fixed its $id (pointed at report/info/,
  file lives under report/print/) and its title (said "ModuleInfo",
  clearly copy-pasted from _module_info.schema.json). Wired it into
  print.schema.json as the print report's `upgrade_state` property -
  the file existed but nothing referenced it yet.
- Deleted schemas/bambulab/v2/, which had been recreated as stale,
  broken copies of an older v1 (missing the envelope allOf, missing
  the underscore renames, $ids still pointing at v1/ paths) - the
  repo's own README documents v2 as intentionally removed until V2's
  wire format is known to differ from V1's.
- Updated schemas/bambulab/README.md's layout tree and inheritance-
  example reference, both stale after the underscore rename.
- Removed stray tsc -b build output (packages/ts-types/src/*.d.ts/js)
  that isn't meant to be committed (outDir is dist/, gitignored).

Verified: cargo check clean (continuum-proxy, continuum-ai-worker,
rust-types), tsc clean (continuum-backend, continuum-common ts-core),
10/10 JSON Schema validation cases passing.
2026-08-29 08:13:49 +00:00
octoturge cd18337e12 Category subdirectories for request/report; ams/xcam split; print vs pushing fix
Each root JSON key ('info', 'pushing', 'print') now gets its own category
folder under request/ and report/, so a category can hold multiple command
schemas without flattening them into one directory - v1/request.schema.json
and v1/report.schema.json route into these via oneOf per category (also
future-proofs for a category ever needing more than one shape).

Split pushall's ams/xcam fields the same way module_info was already
split: ams.schema.json/ams_unit.schema.json/ams_tray.schema.json/
xcam.schema.json/print.schema.json, each referencing the next by relative
$ref. ams_tray.schema.json uses oneOf for the empty-vs-loaded tray shapes
- verified (and initially got wrong, then fixed) that LoadedTray needs
every field required, not just id, or a bare {"id":"0"} validates
against both branches and oneOf fails, since oneOf demands exactly one
match.

Real correction: the report/ category for what a pushall request
triggers is "print", not "pushing" - re-reading the original examples,
pushall's REQUEST goes to "pushing", but the resulting state-push stream
arrives under "print", a different root key. report/pushing/ (my
original mistake) is removed; report/print/ holds the corrected content.
request/pushing/ is untouched - that side was correct.

Also: v2/ removed (found as broken copy-pasted stubs still pointing at
v1 $ids - no real V2-specific content yet, better to have nothing than
broken duplicates); all $ids switched to real, verified Gitea raw-file
URLs (raw/branch/main/<path> - confirmed this is the correct pattern,
not raw/<path>) instead of a placeholder domain; fixed a broken relative
$ref in the request-side files left over from an earlier move (still
pointing 2 levels up instead of 3 after nesting one level deeper).

Re-validated everything against real examples after restructuring,
including the full ams/xcam print report and two negative cases -
see schemas/bambulab/README.md for the validation script.
2026-08-28 23:17:32 +00:00
octoturge 8d4a08e36d Move bambulab JSON Schemas here from continuum-proxy; restructure
Schemas (any notation - proto, JSON Schema) belong in the schemas repo
regardless of how many languages currently consume them; that's what
makes this 'the schemas repo'. Rust-only code (the hand-written structs
in continuum-proxy's bambu_commands/) is a different category and stays
where it was.

Also restructured per readability feedback:
- envelope.schema.json moved out of v1/ to the bambulab/ root - it's
  shared across protocol generations, not v1-specific, same principle
  already applied to the (now-removed) proto/bambulab/common.proto.
- v1/ split into v1/request/ and v1/report/, one file per command in
  each, instead of *.request.schema.json / *.response.schema.json
  filename suffixes doing the same job less clearly. The two top-level
  dispatcher schemas (matching BambuRequest/BambuReport) stay at the v1/
  root since they aren't themselves a single command's schema.

Re-verified after restructuring, not just moved and assumed still
correct:  resolution now has to handle a real basename collision
(get_version.schema.json exists in both request/ and report/) — switched
the validation approach to register schemas by  (their actual base
URI) rather than by filename, which is what makes relative  resolve
correctly here. All three real examples plus the negative tests from the
original version still pass.
2026-08-28 22:58:18 +00:00
octoturge bc4ee8690a Drop proto/bambulab/ — plain hand-written Rust structs instead
Reconsidered after actually feeling the friction: this data is JSON over
MQTT (not binary protobuf), only continuum-proxy ever parses it (raw
vendor wire format, never crosses into TS), so none of protobuf's actual
value (cross-language codegen, binary wire efficiency) applied here.
Every gotcha hit while building this (field_attribute's oneof/variant
path collision, needing .bambulab-scoped type_attribute calls, explicit
#[serde(default)] per not-always-present field) came from forcing
prost-build's codegen model onto a plain-JSON, Rust-only use case.

Verified the replacement is strictly simpler, not just smaller: a
hand-written struct's Option<T> field needs zero extra attributes to
handle a missing JSON key (prost's generated String needed an explicit
field_attribute call per field), and #[serde(flatten)] on a hand-written
field has no ambiguity at all (prost-build's oneof/variant path collision
doesn't exist without prost-build's codegen in the picture).

The replacement lives in continuum-proxy: src/printer/bambu_commands/.
continuum.v1 is unaffected — that schema is genuinely cross-language and
proto still earns its keep there.
2026-08-28 22:48:48 +00:00
96 changed files with 2361 additions and 121 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# continuum-schemas has no runtime it only emits generated types/structs. # continuum-schemas has no runtime - it only emits generated types/structs.
# This file is kept for consistency with the other Continuum repos. # This file is kept for consistency with the other Continuum repos.
# Optional: private registry token, only needed if packages/* are ever # Optional: private registry token, only needed if packages/* are ever
+2 -2
View File
@@ -3,11 +3,11 @@
Single source of truth for the Continuum data model. Protobuf definitions in Single source of truth for the Continuum data model. Protobuf definitions in
`proto/` are compiled into two consumer packages: `proto/` are compiled into two consumer packages:
- `packages/ts-types` TypeScript types generated via `ts-proto`, plus - `packages/ts-types` - TypeScript types generated via `ts-proto`, plus
hand-written [TypeBox](https://github.com/sinclairzx81/typebox) schemas hand-written [TypeBox](https://github.com/sinclairzx81/typebox) schemas
under `src/schemas/` used for runtime validation in `continuum-backend`'s under `src/schemas/` used for runtime validation in `continuum-backend`'s
ElysiaJS routes. ElysiaJS routes.
- `packages/rust-types` a Rust crate (`continuum-rust-types`) that compiles - `packages/rust-types` - a Rust crate (`continuum-rust-types`) that compiles
the same `.proto` files with `prost-build` (via `build.rs`), producing the same `.proto` files with `prost-build` (via `build.rs`), producing
`serde`-derived structs for `continuum-proxy` and `continuum-ai-worker`. `serde`-derived structs for `continuum-proxy` and `continuum-ai-worker`.
+3
View File
@@ -13,3 +13,6 @@ serde = { version = "1", features = ["derive"] }
[build-dependencies] [build-dependencies]
prost-build = "0.13" prost-build = "0.13"
[dev-dependencies]
serde_json = "1"
+12 -39
View File
@@ -11,11 +11,6 @@ fn main() {
proto_root.join("continuum/v1/print_params.proto"), proto_root.join("continuum/v1/print_params.proto"),
proto_root.join("continuum/v1/template.proto"), proto_root.join("continuum/v1/template.proto"),
proto_root.join("continuum/v1/print_job.proto"), proto_root.join("continuum/v1/print_job.proto"),
proto_root.join("bambulab/common.proto"),
proto_root.join("bambulab/v1/request.proto"),
proto_root.join("bambulab/v1/report.proto"),
proto_root.join("bambulab/v2/request.proto"),
proto_root.join("bambulab/v2/report.proto"),
]; ];
for file in &proto_files { for file in &proto_files {
@@ -23,41 +18,19 @@ fn main() {
} }
let mut config = prost_build::Config::new(); let mut config = prost_build::Config::new();
config.type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]");
config.type_attribute(".", "#[serde(rename_all = \"camelCase\")]");
// continuum.v1 — Continuum's own cross-service API. camelCase to match // prost stores proto3 enums as plain `i32` fields (not the generated
// the TS side's existing convention (this is a schema we designed // enum type), so the blanket type_attribute above never actually runs
// ourselves, so we get to pick the convention). // for `status` - it'd serialize as a bare number, disagreeing with
config.type_attribute(".continuum", "#[derive(serde::Serialize, serde::Deserialize)]"); // TypeBox's full-name string literals in ts-types. Route the field
config.type_attribute(".continuum", "#[serde(rename_all = \"camelCase\")]"); // through PrintJobStatus's own as_str_name()/from_str_name() instead,
// matching protobuf's own canonical JSON enum representation.
// bambulab.* — mirrors Bambu's actual MQTT wire JSON exactly config.field_attribute(
// (snake_case), because this isn't a schema we get to design: it's ".continuum.v1.PrintJob.status",
// edge-only traffic (continuum-proxy only, never crosses into TS) that "#[serde(with = \"crate::print_job_status_serde\")]",
// has to match whatever the printer actually sends, byte for byte. );
//
// IMPORTANT: these two type_attribute calls are scoped to ".bambulab"
// specifically, not "." (global) — type_attribute calls are cumulative,
// so a "." blanket rule here would stack a second, conflicting
// #[serde(rename_all = ...)] onto every bambulab type alongside this
// one and fail to compile. Verified: see commit history for this file.
config.type_attribute(".bambulab", "#[derive(serde::Serialize, serde::Deserialize)]");
config.type_attribute(".bambulab", "#[serde(rename_all = \"snake_case\")]");
// Some Bambu response fields aren't always present (e.g. `result`/
// `reason` on some info responses) — serde requires every struct field
// present in the JSON unless told otherwise. Add one line per such
// field as you find them, e.g.:
// config.field_attribute(".bambulab.v1.InfoResponse.result", "#[serde(default)]");
//
// Do NOT try to model the top-level {"info": {...}} / {"pushing": {...}}
// envelope as a proto `oneof` here — prost-build's field/variant
// attribute matching can't distinguish "the oneof field" from "the
// variants inside it" (both match the same path prefix), so
// `#[serde(flatten)]` lands in the wrong place and won't compile. Write
// the envelope as a plain Rust enum instead, in continuum-proxy —
// serde's default enum representation already produces exactly
// {"info": {...}} with no configuration at all. See
// continuum-proxy/src/printer/bambu_protocol.rs.
config config
.compile_protos(&proto_files, &[proto_root]) .compile_protos(&proto_files, &[proto_root])
+34 -15
View File
@@ -8,20 +8,39 @@ pub use continuum::v1::{
MaterialProfile, PrintJob, PrintJobStatus, PrintParameters, Template, MaterialProfile, PrintJob, PrintJobStatus, PrintParameters, Template,
}; };
pub mod bambulab { // PrintJob.status is generated as a plain i32 (see build.rs's comment) -
// common.proto and bambulab/v2/*.proto have no messages yet, so // (de)serialize it via PrintJobStatus's full proto name strings
// there's nothing for prost to emit for them — `include!` against a // (e.g. "PRINT_JOB_STATUS_QUEUED") so Rust's JSON matches ts-types'
// nonexistent file breaks the build. Uncomment each once it has real // TypeBox schema and protobuf's own canonical JSON enum mapping.
// content: mod print_job_status_serde {
// use super::PrintJobStatus;
// include!(concat!(env!("OUT_DIR"), "/bambulab.rs")); // common.proto's messages use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub mod v1 {
// request.proto + report.proto both declare `package bambulab.v1;`, pub fn serialize<S: Serializer>(value: &i32, serializer: S) -> Result<S::Ok, S::Error> {
// so prost combines them into one output file, regardless of which let status = PrintJobStatus::try_from(*value).unwrap_or(PrintJobStatus::Unspecified);
// input file each message came from. status.as_str_name().serialize(serializer)
include!(concat!(env!("OUT_DIR"), "/bambulab.v1.rs"));
} }
// pub mod v2 {
// include!(concat!(env!("OUT_DIR"), "/bambulab.v2.rs")); pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<i32, D::Error> {
// } let name = String::deserialize(deserializer)?;
PrintJobStatus::from_str_name(&name)
.map(|status| status as i32)
.ok_or_else(|| serde::de::Error::custom(format!("unknown PrintJobStatus: {name}")))
} }
}
// Bambu's raw MQTT command/report structs are NOT modeled here - they're
// plain hand-written Rust + serde in continuum-proxy's
// src/printer/bambu_commands/, not proto. That data is JSON-over-MQTT
// (not binary protobuf), and only continuum-proxy ever needs to parse it
// - none of protobuf's actual value (cross-language codegen, binary wire
// efficiency) applies, and forcing it through prost-build's codegen model
// anyway produced real, avoidable friction (see this crate's git history
// for the specifics: a field/variant attribute-matching collision on
// `oneof`, needing package-scoped `type_attribute` calls, explicit
// `field_attribute(..., "#[serde(default)]")` for fields that aren't
// always present - every one of these disappears with a hand-written
// struct, where `Option<T>` and `#[serde(flatten)]` just work with zero
// configuration). Proto stays for continuum.v1 above, which - unlike
// this - is a schema we designed ourselves and that both TS and Rust
// genuinely need.
@@ -0,0 +1,32 @@
use continuum_types::{PrintJob, PrintJobStatus};
fn sample(status: PrintJobStatus) -> PrintJob {
PrintJob {
id: "job-1".into(),
farm_id: "farm-1".into(),
printer_id: "printer-1".into(),
template_id: "template-1".into(),
status: status as i32,
progress_percent: 50.0,
started_at_unix: 0,
completed_at_unix: 0,
gcode_file_key: "key".into(),
}
}
// Regression test: PrintJob.status must serialize as the full proto enum
// name (matching ts-types' TypeBox schema), not the raw i32 prost stores
// it as internally.
#[test]
fn status_serializes_as_full_proto_enum_name() {
let json = serde_json::to_value(sample(PrintJobStatus::Printing)).unwrap();
assert_eq!(json["status"], "PRINT_JOB_STATUS_PRINTING");
}
#[test]
fn status_round_trips_through_json() {
let original = sample(PrintJobStatus::Completed);
let json = serde_json::to_string(&original).unwrap();
let restored: PrintJob = serde_json::from_str(&json).unwrap();
assert_eq!(restored.status, PrintJobStatus::Completed as i32);
}
-9
View File
@@ -1,9 +0,0 @@
syntax = "proto3";
package bambulab;
// Fields/messages genuinely shared between v1 and v2 (unversioned, since
// they don't change across generations) go here — composition, embedded as
// a field in v1/v2 messages via `import "bambulab/common.proto";`, not
// inheritance. e.g. every Bambu command/response shares sequence_id +
// command; that's a good candidate for a message here.
-15
View File
@@ -1,15 +0,0 @@
syntax = "proto3";
package bambulab.v1;
// import "bambulab/common.proto"; once common.proto has a shared message
// worth embedding (composition, not inheritance — see that file).
// Your report/response messages go here, e.g.:
//
// message InfoResponse {
// string sequence_id = 1;
// string command = 2;
// string result = 3; // not always present — see build.rs field_attribute
// string reason = 4; // not always present — see build.rs field_attribute
// }
-23
View File
@@ -1,23 +0,0 @@
syntax = "proto3";
package bambulab.v1;
// One real, fully-wired example — copy this shape for every other command
// (pushing/pushall, print control, etc.). sequence_id is `string`, not
// int64: Bambu sends it as a JSON string ("0"), and this crosses the wire
// as JSON over MQTT, not binary protobuf — the Rust type needs to match
// what serde_json actually produces, not what "feels more correct" for a
// counter.
message InfoCommand {
string sequence_id = 1;
string command = 2;
}
// Add your next message here, e.g.:
//
// message PushingCommand {
// string sequence_id = 1;
// string command = 2;
// int32 version = 3;
// int32 push_target = 4;
// }
-9
View File
@@ -1,9 +0,0 @@
syntax = "proto3";
package bambulab.v2;
// import "bambulab/common.proto"; once common.proto has a shared message
// worth embedding (composition, not inheritance — see that file).
// V2-generation (X1/H2 series) report/response messages go here — e.g.
// whatever AMS/report-schema fields V2 has that V1 doesn't.
-8
View File
@@ -1,8 +0,0 @@
syntax = "proto3";
package bambulab.v2;
// import "bambulab/common.proto"; once common.proto has a shared message
// worth embedding (composition, not inheritance — see that file).
// V2-generation (X1/H2 series) command messages go here.
+158
View File
@@ -0,0 +1,158 @@
# bambulab/ JSON Schemas
Documentation/validation schemas for Bambu's raw MQTT wire format, mirroring
continuum-proxy's `src/printer/bambu_commands/` - not used for codegen (the
Rust structs there are hand-written; see that module's doc comment for why),
but genuinely useful on their own: language-agnostic documentation of the
wire format, and usable to validate a captured MQTT payload without writing
any Rust to do it.
## Layout
```
bambulab/
common/
envelope.schema.json the base - sequence_id + command, shared by
every command in every generation, so it lives
here unversioned, not duplicated under v1/v2
v1/
request.schema.json BambuRequest dispatcher - one key per category
("info", "pushing", ...), each a oneOf (a
category can have more than one request shape)
report.schema.json BambuReport dispatcher, same idea
common/ shapes shared across v1's request/ and report/
ams/
ams.schema.json
ams_unit.schema.json
ams_tray.schema.json
vt_tray.schema.json shared base for AmsTray + the virtual/
external spool slot, via allOf + $ref
module_info.schema.json
hms.schema.json, net.schema.json, online.schema.json,
upload.schema.json, upgrade_state.schema.json, xcam.schema.json,
ipcam.schema.json, lights_report.schema.json, nozzle_type.schema.json,
nozzle_diameter.schema.json
request/
info/
get_version.schema.json
pushing/
pushall.schema.json
report/
info/
get_version.schema.json
print/
print.schema.json the ongoing print-state push
v2/ same split as v1, once the wire format actually
diverges per field - built out below as that's
been confirmed, not copy-pasted speculatively
request.schema.json dispatcher, same shape as v1's
report.schema.json dispatcher, same shape as v1's
common/ v2 grew a much larger shared shape set than v1
(device/, job/, care, info, ...) because more
of the wire format has been captured/confirmed
ams/, device/, job/, and the same flat common/*.schema.json files
as v1 (hms, net, online, upload, upgrade_state, xcam, ipcam,
lights_report, nozzle_type, nozzle_diameter, vt_tray)
request/
info/
get_version.schema.json
report/
info/
get_version.schema.json
_module_info.schema.json
print/
print.schema.json the ongoing print-state push (command
"push_status")
_2d_report.schema.json, _3d_report.schema.json,
_nozzle_type.schema.json
```
Add a category to a dispatcher (`v1|v2/request.schema.json` or
`report.schema.json`) whenever a new `request/<category>/` or
`report/<category>/` schema is added on disk - an unwired leaf schema is
unreachable from validation even though it parses fine on its own.
**One real correction baked into this layout**: the report category for
whatever a `pushall` request triggers is `report/print/`, not
`report/pushing/`. Sending `pushall` (which *does* go to the `pushing` key
on the request side) makes the printer start/refresh an ongoing state-push
stream, and that stream arrives under the `print` key - a different root
key from the request that triggered it. A category folder here means
"what root key does this arrive under", not "what request caused it" - the
first version of this schema got that wrong (see git history) before a
closer read of the real capture caught it.
## The "inheritance" pattern
Every command/response schema *extends* `envelope.schema.json` with
`allOf` + `$ref`:
```json
{
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{ "type": "object", "properties": { "command": { "const": "get_version" } } }
]
}
```
This is genuinely closer to real inheritance than anything else in this
project's schema stack (proto, Rust): the instance must satisfy the base
schema *and* the extension schema simultaneously, and - verified with
negative test cases, not just asserted - `envelope.schema.json`'s
`required: ["sequence_id", "command"]` is actually enforced on every
schema that extends it, not just copy-pasted as documentation.
`v1/report/print/_ams_tray.schema.json` is the other JSON-Schema-specific
tool worth knowing: `oneOf`, for "this is exactly one of several
genuinely different shapes" (an AMS tray slot is either empty - just
`id` - or loaded - the full field set - never something in between).
`oneOf` requires exactly one branch to match; watch out for a base-style
branch (like `EmptyTray`) accidentally also matching a more specific
branch's instance if the specific branch doesn't require enough fields -
verified and fixed once already here, see that file's description.
**One gotcha if you add a new base-style schema**: don't set
`"additionalProperties": false` on something meant to be `allOf`-extended.
`allOf` validates every sub-schema against the *whole* instance
independently - it doesn't merge object schemas - so a closed base schema
would reject every field the extending schema adds. Leave
`additionalProperties` unset (defaults to allowed) on anything used as a
base; enforce closedness only on the top-level dispatcher schemas
(`v1/request.schema.json`/`v1/report.schema.json` do this correctly -
check their `additionalProperties: false`).
## `$id` convention
Every schema's `$id` is its real Gitea raw-file URL:
`https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/...`
- a genuinely dereferenceable URI (verified: `raw/branch/main/<path>` is
the correct Gitea pattern, not `raw/<path>` or `raw/<branch>/<path>`),
rather than a made-up placeholder domain. `$ref`s between files stay
relative paths; `$id` is what a validator uses as the base URI to resolve
those relative refs, and it's also what lets a schema be fetched
standalone by anything that wants to dereference it directly.
## Validating something
`$ref` resolution here relies on each schema's `$id` as the base URI for
its own relative refs (standard JSON Schema behavior) - register schemas
by `$id`, not by filename, or you'll hit collisions (`get_version.schema.json`
exists under both `request/info/` and `report/info/`):
```python
from referencing import Registry, Resource
from jsonschema import Draft202012Validator
import json, glob
resources = [
(json.load(open(p))["$id"], Resource.from_contents(json.load(open(p))))
for p in glob.glob("**/*.schema.json", recursive=True)
]
registry = Registry().with_resources(resources)
schema = json.load(open("v1/request.schema.json"))
Draft202012Validator(schema, registry=registry).validate(
{"info": {"sequence_id": "0", "command": "get_version"}}
)
```
@@ -0,0 +1,31 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/common/envelope.schema.json",
"title": "CommandEnvelope",
"description": "Fields every Bambu MQTT command/response shares, across both protocol generations - unversioned, at the bambulab/ root, not duplicated under v1/ or v2/. This is the 'base class' - other schemas extend it via allOf + $ref. JSON Schema doesn't have inheritance either, strictly speaking (no 'extends' keyword) - allOf is composition: it says the instance must satisfy THIS schema AND whatever else is listed alongside it. It's the closest thing to real inheritance ergonomics of anything used across this project's schema stack (proto, Rust), because $ref + allOf lets you name and reuse a shape without re-declaring its fields, which proto/Rust composition can't quite do (there you still write `common: PrinterReportCommon` by hand on every struct). Additionally, any field not defined by the schema will be returned by the printer int the original form - useful when making telemetrics.",
"type": "object",
"properties": {
"sequence_id": {
"type": "string",
"description": "Sequence ID matching the original request"
},
"command": {
"type": "string",
"description": "Command being reported on"
},
"result": {
"type": "string",
"enum": ["success", "fail", "SUCCESS", "FAIL"],
"description": "Result status (case-insensitive)"
},
"reason": {
"type": "string",
"description": "Optional reason or error message"
},
"is_from_mqtt": {
"type": "boolean",
"description": "Used by BambuMQTT v2"
}
},
"required": ["sequence_id", "command"]
}
@@ -0,0 +1,25 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/ams/ams.schema.json",
"title": "AmsState",
"description": "Bambu's own naming has the outer container and the inner array both called `ams` - print.ams.ams, not a typo here, just what the printer actually sends.",
"type": "object",
"properties": {
"ams": {
"type": "array",
"items": { "$ref": "./ams_unit.schema.json" }
},
"ams_exists_bits": { "type": "string" },
"tray_exist_bits": { "type": "string" },
"tray_is_bbl_bits": { "type": "string" },
"tray_tar": { "type": "string" },
"tray_now": { "type": "string" },
"tray_pre": { "type": "string" },
"tray_read_done_bits": { "type": "string" },
"tray_reading_bits": { "type": "string" },
"version": { "type": "integer" },
"insert_flag": { "type": "boolean" },
"power_on_flag": { "type": "boolean" }
},
"required": ["ams"]
}
@@ -0,0 +1,37 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/ams/ams_tray.schema.json",
"title": "AmsTray",
"description": "A tray slot is either empty (just `id`) or loaded (the full field set) - two genuinely different shapes for the same slot, not one shape with optional fields. oneOf says the instance must match EXACTLY one of these. Note LoadedTray requires every field it lists, not just `id` - with only `id` required, a bare {\"id\":\"0\"} would validate against BOTH branches at once (it trivially satisfies Loaded's single requirement too) and oneOf would fail, since oneOf demands exactly one match. Verified this the hard way - see git history. The Rust equivalent is an untagged enum with #[serde(deny_unknown_fields)] on the Empty variant, for the same reason in reverse: without it, a loaded tray's extra fields wouldn't be rejected by Empty, and untagged enums try variants in order - see bambu_commands/print.rs. `drying_time` and `drying_temp` fields are only available for AMS 2 and AMS HT - AMS 1 doesn't have the drying option.",
"oneOf": [
{
"title": "EmptyTray",
"type": "object",
"properties": {
"id": { "type": "string" }
},
"required": ["id"],
"additionalProperties": false
},
{
"allOf": [
{ "$ref": "../vt_tray.schema.json" },
{
"title": "LoadedTray",
"type": "object",
"properties": {
"state": { "type": "integer" },
"total_len": { "type": "number", "minimum": 0 },
"ctype": { "type": "integer" },
"cols": { "type": "array", "items": { "type": "string" } },
"drying_time": { "type": "string" },
"drying_temp": { "type": "string" }
},
"required": [
"state", "total_len", "ctype", "cols"
]
}
]
}
]
}
@@ -0,0 +1,23 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/ams/ams_unit.schema.json",
"title": "AmsUnit",
"description": "One physical AMS unit (Bambu's numbering starts at 0 via `id`).",
"type": "object",
"properties": {
"tray": {
"type": "array",
"items": { "$ref": "./ams_tray.schema.json" }
},
"chip_id": { "type": "string" },
"ams_id": { "type": "string" },
"check": { "type": "integer" },
"id": { "type": "string" },
"humidity": { "type": "string" },
"humidity_raw": { "type": "string" },
"temp": { "type": "string" },
"dry_time": { "type": "integer" },
"info": { "type": "string" }
},
"required": ["humidity", "id", "temp", "tray"]
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/hms.schema.json",
"title": "HMS",
"description": "HMS Error Report",
"type": "array",
"items": {
"type": "object",
"properties": {
"attr": { "type": "integer" },
"code": { "type": "integer" }
}
}
}
@@ -0,0 +1,46 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/ipcam.schema.json",
"title": "Ipcam",
"description": "Report about the in-built IP camera",
"type": "object",
"properties": {
"ipcam_dev": {
"type": "string"
},
"ipcam_record": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"timelapse": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"resolution": {
"type": "string"
},
"tutk_server": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"mode_bits": {
"type": "integer",
"minimum": 0
}
}
}
@@ -0,0 +1,29 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/lights_report.schema.json",
"title": "LightsReport",
"description": "Report status of printer lights",
"type": "array",
"items": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"on",
"off",
"ON",
"OFF"
]
},
"node": {
"type": "string",
"enum": [
"chamber_light",
"work_light",
"chamber_light2"
]
}
}
}
}
@@ -0,0 +1,26 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/module_info.schema.json",
"title": "ModuleInfo",
"type": "object",
"properties": {
"name": { "type": "string" },
"sw_ver": { "type": "string" },
"hw_ver": { "type": "string" },
"loader_ver": { "type": "string" },
"product_name": { "type": "string" },
"sn": { "type": "string" },
"visible": { "type": "boolean" },
"flag": { "type": "integer" }
},
"required": [
"name",
"sw_ver",
"hw_ver",
"loader_ver",
"sn",
"product_name",
"visible",
"flag"
]
}
@@ -0,0 +1,30 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/net.schema.json",
"title": "Net",
"description": "Network status",
"type": "object",
"properties": {
"conf": {
"type": "integer"
},
"info": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"type": "integer"
},
"mask": {
"type": "integer"
}
},
"required": [
"ip",
"mask"
]
}
}
}
}
@@ -0,0 +1,13 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/nozzle_diameter.schema.json",
"title": "NozzleDiameter",
"description": "Common schema for nozzle diameter",
"type": "string",
"enum": [
"0.2",
"0.4",
"0.6",
"0.8"
]
}
@@ -0,0 +1,11 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/nozzle_type.schema.json",
"title": "NozzleType",
"description": "Common schema for nozzle type",
"type": "string",
"enum": [
"stainless_steel",
"hardened_steel"
]
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/online.schema.json",
"title": "Online",
"description": "Printer online/offline status",
"type": "object",
"properties": {
"ahb": {
"type": "boolean"
},
"rfid": {
"type": "boolean"
},
"version": {
"type": "integer"
}
}
}
@@ -0,0 +1,21 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/upgrade_state.schema.json",
"title": "UpgradeState",
"type": "object",
"properties": {
"sequence": { "type": "string" },
"progress": { "type": "string" },
"status": { "type": "string", "enum": ["idle", "IDLE"]},
"consistency_request": { "type": "boolean" },
"dis_state": { "type": "integer" },
"err_code": { "type": "integer" },
"force_upgrade": { "type": "boolean" },
"message": { "type": "string" },
"module": { "type": "string" },
"new_version_state": { "type": "integer" },
"cur_state_code": { "type": "integer" },
"idx2": { "type": "integer" },
"new_ver_list": { "type": "array", "items": { "type": "string" } }
}
}
@@ -0,0 +1,65 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/upload.schema.json",
"title": "Upload",
"description": "File upload progress",
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"idle",
"IDLE"
]
},
"progress": {
"type": "integer"
},
"message": {
"type": "string"
}
}
},
{
"type": "object",
"properties": {
"file_size": {
"type": "integer"
},
"finish_size": {
"type": "integer"
},
"message": {
"type": "string"
},
"oss_url": {
"type": "string"
},
"progress": {
"type": "integer"
},
"speed": {
"type": "integer"
},
"status": {
"type": "string",
"enum": [
"idle",
"IDLE"
]
},
"task_id": {
"type": "string"
},
"time_remaining": {
"type": "integer"
},
"trouble_id": {
"type": "string"
}
}
}
]
}
@@ -0,0 +1,36 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/vt_tray.schema.json",
"title": "VtTray",
"description": "This schema is used as Virtual Tray (external spool) or as a base for AmsTray. When empty, all values are zeroed and `tray_color` field is set to \"FFFFFF00\".",
"type": "object",
"properties": {
"id": { "type": "string" },
"tag_uid": { "type": "string" },
"tray_id_name": { "type": "string" },
"tray_info_idx": { "type": "string" },
"tray_type": { "type": "string" },
"tray_sub_brands": { "type": "string" },
"tray_color": { "type": "string" },
"tray_weight": { "type": "string" },
"tray_diameter": { "type": "string" },
"tray_temp": { "type": "string" },
"tray_time": { "type": "string" },
"bed_temp_type": { "type": "string" },
"bed_temp": { "type": "string" },
"nozzle_temp_min": { "type": "string" },
"nozzle_temp_max": { "type": "string" },
"xcam_info": { "type": "string" },
"tray_uuid": { "type": "string" },
"remain": { "type": "integer", "minimum": 0 },
"k": { "type": "number" },
"n": { "type": "number" },
"cali_idx": { "type": "number" }
},
"required": [
"id", "remain", "bed_temp", "bed_temp_type",
"nozzle_temp_max", "nozzle_temp_min", "tag_uid", "tray_color",
"tray_diameter", "tray_id_name", "tray_info_idx", "tray_sub_brands",
"tray_type", "tray_uuid", "tray_weight", "xcam_info", "k", "n"
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/common/xcam.schema.json",
"title": "XcamSettings",
"description": "Camera-based AI print monitoring settings (spaghetti detection, first-layer inspection, etc.).",
"type": "object",
"properties": {
"allow_skip_parts": { "type": "boolean" },
"buildplate_marker_detector": { "type": "boolean" },
"first_layer_inspector": { "type": "boolean" },
"halt_print_sensitivity": { "type": "string" },
"print_halt": { "type": "boolean" },
"printing_monitor": { "type": "boolean" },
"spaghetti_detector": { "type": "boolean" }
},
"required": [
"allow_skip_parts", "buildplate_marker_detector", "first_layer_inspector",
"halt_print_sensitivity", "print_halt", "printing_monitor", "spaghetti_detector"
]
}
+22
View File
@@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report.schema.json",
"title": "BambuReport",
"description": "Matches continuum-proxy's src/printer/bambu_commands::BambuReport. Note the category here is \"print\", not \"pushing\" - sending a pushall request (which does go to \"pushing\", see request.schema.json) makes the printer start/refresh the ongoing state-push stream, which itself arrives under \"print\". They're different root keys because a report category means 'what key does this arrive under', not 'what request caused it'. Each category's value is a oneOf for the same reason as request.schema.json: room for more than one shape per category without a rewrite later.",
"type": "object",
"minProperties": 1,
"maxProperties": 1,
"properties": {
"info": {
"oneOf": [
{ "$ref": "report/info/get_version.schema.json" }
]
},
"print": {
"oneOf": [
{ "$ref": "report/print/print.schema.json" }
]
}
},
"additionalProperties": false
}
@@ -0,0 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/info/get_version.schema.json",
"title": "GetVersionReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "get_version" },
"module": {
"type": "array",
"items": { "$ref": "../../common/module_info.schema.json" }
}
},
"required": ["module"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/print/gcode_file.schema.json",
"title": "GcodeFileRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_file" },
"param": { "description": "Full path to GCODE file in printer's FS", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/print/gcode_line.schema.json",
"title": "GcodeLineReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_line" },
"param": { "description": "use \n for multiple lines", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,82 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/print/print.schema.json",
"title": "PrintReport",
"description": "The ongoing print-state push (root key \"print\") - NOT a direct reply to the pushall request (that goes to \"pushing\", see request/pushing/pushall.schema.json). Sending pushall makes the printer start/refresh this stream; it isn't itself request/response, which is also why this is its own category folder rather than sitting under pushing/ - a category here is 'what root key does this arrive under', not 'what triggered it'.",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "push_status" },
"upgrade_state": { "$ref": "../../common/upgrade_state.schema.json" },
"ipcam": { "$ref": "../../common/ipcam.schema.json" },
"upload": { "$ref": "../../common/upload.schema.json" },
"net": { "$ref": "../../common/net.schema.json" },
"hms": { "$ref": "../../common/hms.schema.json" },
"online": { "$ref": "../../common/online.schema.json" },
"ams": { "$ref": "../../common/ams/ams.schema.json" },
"vt_tray": { "$ref": "../../common/vt_tray.schema.json" },
"lights_report": { "$ref": "../../common/lights_report.schema.json" },
"xcam": { "$ref": "../../common/xcam.schema.json" },
"nozzle_diameter": { "$ref": "../../common/nozzle_diameter.schema.json" },
"nozzle_type": { "$ref": "../../common/nozzle_type.schema.json" },
"nozzle_temper": { "type": "number" },
"nozzle_target_temper": { "type": "number" },
"bed_temper": { "type": "number" },
"bed_target_temper": { "type": "number" },
"chamber_temper": { "type": "number" },
"chamber_target_temper": { "type": "number" },
"fan_gear": { "type": "integer" },
"heatbreak_fan_speed": { "type": "string" },
"cooling_fan_speed": { "type": "string" },
"big_fan1_speed": { "type": "string" },
"big_fan2_speed": { "type": "string" },
"s_obj": { "type": "array", "items": {} },
"filam_bak": { "type": "array", "items": {} },
"stg": { "type": "array", "items": { "type": "number" } },
"mc_print_stage": { "type": "string" },
"mc_percent": { "type": "integer" },
"mc_remaining_time": { "type": "integer" },
"ams_status": { "type": "integer" },
"ams_rfid_status": { "type": "integer" },
"hw_switch_state": { "type": "integer" },
"spd_mag": { "type": "integer", "minimum": 0, "maximum": 100 },
"spd_lvl": { "type": "integer", "minimum": 1, "maximum": 4 },
"print_error": { "type": "integer" },
"lifecycle": { "type": "string", "enum": ["product"] },
"wifi_signal": { "type": "string", "pattern": "^-([0-9]{1,2}|100)dBm$" },
"gcode_state": { "type": "string", "enum": [ "idle", "IDLE", "finish", "FINISH", "running", "RUNNING" ] },
"gcode_file_prepare_percent": { "type": "string" },
"queue_number": { "type": "integer" },
"queue_total": { "type": "integer" },
"queue_est": { "type": "integer" },
"queue_sts": { "type": "integer" },
"project_id": { "type": "string" },
"profile_id": { "type": "string" },
"task_id": { "type": "string" },
"subtask_id": { "type": "string" },
"subtask_name": { "type": "string" },
"gcode_file": { "type": "string" },
"stg_cur": { "type": "integer" },
"print_type": { "type": "string", "enum": [ "", "idle", "IDLE" ] },
"home_flag": { "type": "integer" },
"mc_print_line_number": { "type": "string" },
"mc_print_sub_stage": { "type": "integer" },
"sdcard": { "type": "boolean" },
"force_upgrade": { "type": "boolean" },
"mess_production_state": { "type": "string", "enum": [ "active", "inactive", "ACTIVE", "INACTIVE" ] },
"layer_num": { "type": "integer" },
"total_layer_num": { "type": "integer" },
"cali_version": { "type": "integer" },
"k": { "type": "string" },
"flag3": { "type": "integer" }
}
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/print/print_speed.schema.json",
"title": "PrintSpeedReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "print_speed" },
"param": {
"description": "1 - silent (50%), 2 - standard (100%), 3 - sport (124%), 4 - ludicrous (166%)",
"type": "string",
"enum": ["1", "2", "3", "4"]
}
},
"required": ["param"]
}
]
}
@@ -0,0 +1,15 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/report/print/unload_filament.schema.json",
"title": "UnloadFilamentReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "unload_filament" }
},
"required": ["param"]
}
]
}
+22
View File
@@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request.schema.json",
"title": "BambuRequest",
"description": "Matches continuum-proxy's src/printer/bambu_commands::BambuRequest - one JSON key naming the category ('info', 'pushing', ...). Each category's value is a oneOf, not a single $ref: a category can have more than one possible request shape (e.g. 'info' might grow a second command besides get_version) - oneOf leaves room for that from the start instead of needing a rewrite the day it happens.",
"type": "object",
"minProperties": 1,
"maxProperties": 1,
"properties": {
"info": {
"oneOf": [
{ "$ref": "request/info/get_version.schema.json" }
]
},
"pushing": {
"oneOf": [
{ "$ref": "request/pushing/pushall.schema.json" }
]
}
},
"additionalProperties": false
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/info/get_version.schema.json",
"title": "GetVersionRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "get_version" }
}
}
]
}
@@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/print/calibration.schema.json",
"title": "CalibrationRequest",
"description": "Printer responds with `push_status` instead of `calibration` with following fields set: `{ \"mc_print_stage\": 2, \"gcode_state\": \"RUNNING\", \"gcode_file_prepare_percent\": 100, \"subtask_name\": \"auto_cali_for_user_param.gcode\", \"gcode_file\": \"auto_cali_for_user_param.gcode\", \"print_type\": \"system\" }`",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "calibration" },
"option": {
"description": "Following bitmask is required for the `option` field: `if (lidarCalibration) bitmask |= 1; if (bedLevelling) bitmask |= 1 << 1; if (vibrationCompensation) bitmask |= 1 << 2; if (motorCancellation) bitmask |= 1 << 3;`",
"type": "integer",
"minimum": 0,
"maximum": 15
}
},
"required": ["option"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/print/gcode_file.schema.json",
"title": "GcodeFileRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_file" },
"param": { "description": "Full path to GCODE file in printer's FS", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/print/gcode_line.schema.json",
"title": "GcodeLineRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_line" },
"param": { "description": "use \n for multiple lines", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/print/print_speed.schema.json",
"title": "PrintSpeedRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "print_speed" },
"param": {
"description": "1 - silent (50%), 2 - standard (100%), 3 - sport (124%), 4 - ludicrous (166%)",
"type": "string",
"enum": ["1", "2", "3", "4"]
}
},
"required": ["param"]
}
]
}
@@ -0,0 +1,15 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/print/unload_filament.schema.json",
"title": "UnloadFilamentRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "unload_filament" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,17 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v1/request/pushing/pushall.schema.json",
"title": "PushallRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "pushall" },
"version": { "type": "integer", "minimum": 1, "maximum": 1 },
"push_target": { "type": "integer" }
},
"required": ["version", "push_target"]
}
]
}
@@ -0,0 +1,34 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/ams/ams.schema.json",
"title": "AmsState",
"description": "Bambu's own naming has the outer container and the inner array both called `ams` - print.ams.ams, not a typo here, just what the printer actually sends.",
"type": "object",
"properties": {
"ams": {
"type": "array",
"items": { "$ref": "./ams_unit.schema.json" }
},
"ams_exists_bits": { "type": "string" },
"ams_exist_bits_raw": { "type": "string" },
"cali_id": { "type": "integer" },
"cali_stat": { "type": "integer" },
"insert_flag": { "type": "boolean" },
"power_on_flag": { "type": "boolean" },
"tray_exist_bits": { "type": "string" },
"tray_is_bbl_bits": { "type": "string" },
"tray_now": { "type": "string" },
"tray_pre": { "type": "string" },
"tray_read_done_bits": { "type": "string" },
"tray_reading_bits": { "type": "string" },
"tray_tar": { "type": "string" },
"unbind_ams_stat": { "type": "integer" },
"version": { "type": "integer" }
},
"required": [
"ams", "ams_exists_bits", "ams_exist_bits_raw", "cali_id",
"cali_stat", "insert_flag", "power_on_flag", "tray_exist_bits",
"tray_is_bbl_bits", "tray_now", "tray_pre", "tray_read_done_bits",
"tray_reading_bits", "tray_tar", "unbind_ams_stat", "version"
]
}
@@ -0,0 +1,33 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/ams/ams_tray.schema.json",
"title": "AmsTray",
"description": "A tray slot is either empty (just `id`) or loaded (the full field set) - two genuinely different shapes for the same slot, not one shape with optional fields. oneOf says the instance must match EXACTLY one of these. Note LoadedTray requires every field it lists, not just `id` - with only `id` required, a bare {\"id\":\"0\"} would validate against BOTH branches at once (it trivially satisfies Loaded's single requirement too) and oneOf would fail, since oneOf demands exactly one match. Verified this the hard way - see git history. The Rust equivalent is an untagged enum with #[serde(deny_unknown_fields)] on the Empty variant, for the same reason in reverse: without it, a loaded tray's extra fields wouldn't be rejected by Empty, and untagged enums try variants in order - see bambu_commands/print.rs. `drying_time` and `drying_temp` fields are only available for AMS 2 and AMS HT - AMS 1 doesn't have the drying option.",
"oneOf": [
{
"title": "EmptyTray",
"type": "object",
"properties": {
"id": { "type": "string" },
"state": { "type": "integer" }
},
"required": ["id", "state"],
"additionalProperties": false
},
{
"allOf": [
{ "$ref": "../vt_tray.schema.json" },
{
"title": "LoadedTray",
"type": "object",
"properties": {
"state": { "type": "integer" }
},
"required": [
"state"
]
}
]
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/ams/ams_unit.schema.json",
"title": "AmsUnit",
"description": "One physical AMS unit (Bambu's numbering starts at 0 via `id`).",
"type": "object",
"properties": {
"tray": {
"type": "array",
"items": { "$ref": "./ams_tray.schema.json" }
},
"dry_time": { "type": "integer" },
"humidity": { "type": "string" },
"humidity_raw": { "type": "string" },
"id": { "type": "string" },
"info": { "type": "string" },
"temp": { "type": "string" }
},
"required": ["humidity", "humidity_raw", "id", "info", "temp", "tray"]
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/care.schema.json",
"title": "Care",
"description": "Printer online/offline status",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "pattern": "^[lhLH][sdrSDR]$" },
"info": { "type": "string" }
}
}
}
@@ -0,0 +1,33 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/airduct.schema.json",
"title": "DeviceAirduct",
"description": "Schema for details about the Airduct",
"type": "object",
"properties": {
"modeList": {
"type": "array",
"items": {
"$ref": "./airduct_mode.schema.json"
}
},
"parts": {
"type": "array",
"items": {
"$ref": "./airduct_part.schema.json"
}
},
"modeCur": { "type": "integer" },
"modeFunc": { "type": "integer" },
"modeVisable": { "type": "integer" },
"subFunc": { "type": "integer" },
"subMode": { "type": "integer" },
"subVisable": { "type": "integer" },
"version": { "type": "integer" }
},
"required": [
"modeCur", "modeFunc", "modeVisable",
"subFunc", "subMode", "subVisable",
"version", "modeList", "parts"
]
}
@@ -0,0 +1,13 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/airduct_mode.schema.json",
"title": "DeviceAirductMode",
"description": "Schema for available airduct modes",
"type": "object",
"properties": {
"ctrl": { "type": "array", "items": { "type": "integer", "multipleOf": 16 } },
"off": { "type": "array", "items": { "type": "integer", "multipleOf": 16 } },
"modeId": { "type": "integer" }
},
"required": ["ctrl", "off", "modeId"]
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/airduct_part.schema.json",
"title": "DeviceAirductPart",
"description": "Schema for available airduct parts",
"type": "object",
"properties": {
"func": { "type": "integer" },
"id": { "type": "integer" },
"range": { "type": "integer" },
"state": { "type": "integer" },
"tar_state": { "type": "integer" }
}
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/bed.schema.json",
"title": "DeviceBed",
"description": "Detailed info about Bed",
"type": "object",
"properties": {
"info": {
"type": "object",
"properties": {
"temp": { "type": "integer" }
},
"required": ["temp"]
},
"state": { "type": "integer" }
},
"required": ["info", "state"]
}
@@ -0,0 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/cam.schema.json",
"title": "DeviceCamera",
"description": "Detailed info about Camera",
"type": "object",
"properties": {
"laser": {
"type": "object",
"properties": {
"cond": { "type": "integer" },
"state": { "type": "integer" }
},
"required": ["cond", "state"]
},
"timelapse_path": { "type": "string" }
},
"required": ["laser", "timelapse_path"]
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/ctc.schema.json",
"title": "DeviceCTC",
"description": "Detailed info about CTC",
"type": "object",
"properties": {
"info": {
"type": "object",
"properties": {
"temp": { "type": "integer" }
},
"required": ["temp"]
},
"state": { "type": "integer" }
},
"required": ["info", "state"]
}
@@ -0,0 +1,29 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/device.schema.json",
"title": "DeviceBed",
"description": "Detailed info about all available devices",
"type": "object",
"properties": {
"airduct": { "$ref": "./airduct.schema.json" },
"bed": { "$ref": "./bed.schema.json" },
"cam": { "$ref": "./cam.schema.json" },
"ctc": { "$ref": "./ctc.schema.json" },
"ext_tool": { "$ref": "./ext_tool.schema.json" },
"extruder": { "$ref": "./extruder.schema.json" },
"fire_ext": { "$ref": "./fire_ext.schema.json" },
"holder": { "$ref": "./holder.schema.json" },
"laser": { "$ref": "./laser.schema.json" },
"nozzle": { "$ref": "./nozzle.schema.json" },
"plate": { "$ref": "./plate.schema.json" },
"bed_temp": { "type": "integer" },
"fan": { "type": "integer" },
"type": { "type": "integer" }
},
"required": [
"airduct", "bed", "cam", "ctc",
"ext_tool", "extruder", "fire_ext", "holder",
"laser", "nozzle", "plate", "bed_temp",
"fan", "type"
]
}
@@ -0,0 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/ext_tool.schema.json",
"title": "DeviceExternalTool",
"description": "Detailed info about External Tool",
"type": "object",
"properties": {
"calib": { "type": "integer" },
"low_prec": { "type": "boolean" },
"mount": { "type": "integer" },
"mount_3d": { "type": "integer" },
"th_temp": { "type": "integer" },
"type": { "type": "string" }
},
"required": [
"calib", "low_prec", "mount",
"mount_3d", "th_temp", "type"
]
}
@@ -0,0 +1,17 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/extruder.schema.json",
"title": "DeviceExtruder",
"description": "Detailed info about Extruders",
"type": "object",
"properties": {
"info": {
"type": "array",
"items": {
"$ref": "./extruder_item.schema.json"
}
},
"state": { "type": "integer" }
},
"required": ["info", "state"]
}
@@ -0,0 +1,29 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/extruder_item.schema.json",
"title": "DeviceExtruderItem",
"description": "Detailed info about specific Extruder",
"type": "object",
"properties": {
"filam_bak": {
"type": "array",
"items": { "type": "string" }
},
"hnow": { "type": "integer" },
"hpre": { "type": "integer" },
"htar": { "type": "integer" },
"id": { "type": "integer" },
"info": { "type": "integer" },
"snow": { "type": "integer" },
"spre": { "type": "integer" },
"star": { "type": "integer" },
"stat": { "type": "integer" },
"temp": { "type": "integer" }
},
"required": [
"filam_bak", "hnow", "hpre",
"htar", "id", "info",
"snow", "spre", "star",
"stat", "temp"
]
}
@@ -0,0 +1,25 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/fire_ext.schema.json",
"title": "DeviceFireExtinguisher",
"description": "Detailed info about Fire Extinguisher",
"type": "object",
"properties": {
"history": {
"type": "array"
},
"bot_err": { "type": "integer" },
"cd": { "type": "integer" },
"cd_init": { "type": "integer" },
"connect_flag": { "type": "integer" },
"drill_flag": { "type": "integer" },
"remain_time": { "type": "integer" },
"rm_init": { "type": "integer" },
"state": { "type": "integer" }
},
"required": [
"history", "bot_err", "cd",
"cd_init", "connect_flag", "drill_flag",
"remain_time", "rm_init", "state"
]
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/holder.schema.json",
"title": "DeviceHolder",
"description": "Detailed info about Holder",
"type": "object",
"properties": {
"step": {
"type": "array",
"items": { "type": "integer" }
},
"info": { "type": "integer" },
"job": { "type": "integer" },
"pos": { "type": "integer" },
"stat": { "type": "integer" }
},
"required": ["step", "info", "job", "pos", "stat"]
}
@@ -0,0 +1,11 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/laser.schema.json",
"title": "DeviceLaser",
"description": "Detailed info about Laser",
"type": "object",
"properties": {
"power": { "type": "integer" }
},
"required": ["power"]
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/nozzle.schema.json",
"title": "DeviceNozzle",
"description": "Detailed info about available Nozzles",
"type": "object",
"properties": {
"info": {
"type": "array",
"items": { "$ref": "./nozzle_item.schema.json" }
},
"exist": { "type": "integer" },
"src_id": { "type": "integer" },
"state": { "type": "integer" },
"tar_id": { "type": "integer" }
},
"required": [ "info", "exist", "src_id", "state", "tar_id" ]
}
@@ -0,0 +1,23 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/nozzle_item.schema.json",
"title": "DeviceNozzleItem",
"description": "Detailed info about specific Nozzle",
"type": "object",
"properties": {
"color_m": { "type": "string" },
"diameter": { "$ref": "../nozzle_diameter.schema.json" },
"fila_id": { "type": "integer" },
"id": { "type": "integer" },
"sn": { "type": "string" },
"stat": { "type": "integer" },
"tm": { "type": "integer" },
"type": { "$ref": "../nozzle_type.schema.json" },
"wear": { "type": "number" }
},
"required": [
"color_m", "diameter", "fila_id",
"id", "sn", "stat",
"tm", "type", "wear"
]
}
@@ -0,0 +1,21 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/device/plate.schema.json",
"title": "DevicePlate",
"description": "Detailed info about Plate",
"type": "object",
"properties": {
"base": {
"description": "NOTE: Just my guess, but for Textured PEI it was 6, for Engineering Plate it was 12",
"type": "integer"
},
"cali2d_id": { "type": "string" },
"cur_id": {
"description": "NOTE: Another guess - P0102 for Textured PEI, P0502 for Engineering Plate",
"type": "string"
},
"mat": { "type": "integer" },
"tar_id": { "type": "string" }
},
"required": ["base", "cali2d_id", "cur_id", "mat", "tar_id"]
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/hms.schema.json",
"title": "HMS",
"description": "HMS Error Report",
"type": "array",
"items": {
"type": "object",
"properties": {
"attr": { "type": "integer" },
"code": { "type": "integer" }
}
}
}
@@ -0,0 +1,11 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/info.schema.json",
"title": "Info",
"description": "General info",
"type": "object",
"properties": {
"temp": { "type": "integer" }
},
"required": ["temp"]
}
@@ -0,0 +1,73 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/ipcam.schema.json",
"title": "Ipcam",
"description": "Report about the in-built IP camera",
"type": "object",
"properties": {
"agora_service": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"brtc_service": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"bs_state": { "type": "integer" },
"cap_pic_enable": {
"type": "string",
"enum": [
"enable",
"disable",
"invalid",
"ENABLE",
"DISABLE",
"INVALID"
]
},
"ipcam_dev": { "type": "string" },
"ipcam_record": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"laser_preview_res": { "type": "integer" },
"mode_bits": { "type": "integer", "minimum": 0 },
"resolution": { "type": "string" },
"rtsp_url": { "type": "string" },
"timelapse": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
},
"tl_store_hpd_type": { "type": "integer" },
"tl_store_path_type": { "type": "integer" },
"tutk_server": {
"type": "string",
"enum": [
"enable",
"disable",
"ENABLE",
"DISABLE"
]
}
}
}
@@ -0,0 +1,24 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/job/job.schema.json",
"title": "Job",
"description": "Print job details",
"type": "object",
"properties": {
"cur_stage": {
"type": "object",
"properties": {
"idx": { "type": "number" },
"state": { "type": "number" }
},
"required": ["idx", "state"]
},
"stage": {
"type": "array",
"items": {
"$ref": "./stage.schema.json"
}
}
},
"required": ["cur_stage", "stage"]
}
@@ -0,0 +1,55 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/job/stage.schema.json",
"title": "Job",
"description": "Print job stage details",
"type": "object",
"properties": {
"clock_in": {
"type": "boolean"
},
"color": {
"type": "array",
"items": { "type": "string" }
},
"diameter": {
"type": "array",
"items": { "type": "number" }
},
"est_time": {
"type": "integer"
},
"heigh": {
"type": "number"
},
"idx": {
"type": "integer"
},
"platform": {
"type": "string"
},
"print_then": {
"type": "boolean"
},
"proc_list": {
"type": "array",
"items": { "type": "string" }
},
"tool": {
"type": "array",
"items": {
"description": "In case of 3D printing - look at `nozzle_type.schema.json`",
"type": "string"
}
},
"type": {
"type": "integer",
"minimum": 0
}
},
"required": [
"clock_in", "color", "diameter", "est_time",
"heigh", "idx", "platform", "print_then",
"proc_list", "tool", "type"
]
}
@@ -0,0 +1,29 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/lights_report.schema.json",
"title": "LightsReport",
"description": "Report status of printer lights",
"type": "array",
"items": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"on",
"off",
"ON",
"OFF"
]
},
"node": {
"type": "string",
"enum": [
"chamber_light",
"work_light",
"chamber_light2"
]
}
}
}
}
@@ -0,0 +1,30 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/net.schema.json",
"title": "Net",
"description": "Network status",
"type": "object",
"properties": {
"conf": {
"type": "integer"
},
"info": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"type": "integer"
},
"mask": {
"type": "integer"
}
},
"required": [
"ip",
"mask"
]
}
}
}
}
@@ -0,0 +1,13 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/nozzle_diameter.schema.json",
"title": "NozzleDiameter",
"description": "Common schema for nozzle diameter",
"type": "number",
"enum": [
0.2,
0.4,
0.6,
0.8
]
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/nozzle_type.schema.json",
"title": "NozzleType",
"description": "Common schema for nozzle type. HS00 - stainless steel, HS01 - hardened steel, HS05 - tungsten carbide, HH01 - high-flow hardened steel, HH05 - high-flow tungsten carbide. NOTE: format is possibly as follows: [H,X][H,S]0[0,1,5] - first character for printer series (H - H-series, possibly A-series too; X - X-series, namely X1C. Or maybe H is for hot-swap?); second character is for flow rate (S - standard; H - high-flow); third character is left as 0; fourth character is for nozzle material (0 - stainless steel; 1 - hardened steel; 5 - tungsten carbide)",
"type": "string",
"enum": [
"HS00",
"HS01",
"HS05",
"HH01",
"HH05"
]
}
@@ -0,0 +1,18 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/online.schema.json",
"title": "Online",
"description": "Printer online/offline status",
"type": "object",
"properties": {
"ahb": {
"type": "boolean"
},
"rfid": {
"type": "boolean"
},
"version": {
"type": "integer"
}
}
}
@@ -0,0 +1,28 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/upgrade_state.schema.json",
"title": "UpgradeState",
"type": "object",
"properties": {
"ahb_new_version_number": { "type": "string" },
"ams_new_version_number": { "type": "string" },
"consistency_request": { "type": "boolean" },
"dis_state": { "type": "integer" },
"err_code": { "type": "integer" },
"ext_new_version_number": { "type": "string" },
"force_upgrade": { "type": "boolean" },
"idx": { "type": "integer" },
"idx2": { "type": "integer" },
"lower_limit": { "type": "string", "pattern": "..\\...\\...\\..." },
"message": { "type": "string" },
"module": { "type": "string" },
"new_version_state": { "type": "integer" },
"ota_new_version_number": { "type": "string" },
"progress": { "type": "string" },
"sequence_id": { "type": "integer" },
"sn": { "type": "string" },
"status": { "type": "string", "enum": ["idle", "IDLE"]},
"upgrade_fail_list": { "type": "array", "items": { "type": "string" } },
"upgrade_type": { "type": "string" }
}
}
@@ -0,0 +1,43 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/upload.schema.json",
"title": "Upload",
"description": "File upload progress",
"type": "object",
"properties": {
"file_size": {
"type": "integer"
},
"finish_size": {
"type": "integer"
},
"message": {
"type": "string"
},
"oss_url": {
"type": "string"
},
"progress": {
"type": "integer"
},
"speed": {
"type": "integer"
},
"status": {
"type": "string",
"enum": [
"idle",
"IDLE"
]
},
"task_id": {
"type": "string"
},
"time_remaining": {
"type": "integer"
},
"trouble_id": {
"type": "string"
}
}
}
@@ -0,0 +1,39 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/vt_tray.schema.json",
"title": "VtTray",
"description": "This schema is used as Virtual Tray (external spool) or as a base for AmsTray. When empty, all values are zeroed and `tray_color` field is set to \"FFFFFF00\".",
"type": "object",
"properties": {
"bed_temp": { "type": "string" },
"bed_temp_type": { "type": "string" },
"cali_idx": { "type": "number" },
"cols": { "type": "array", "items": { "type": "string" } },
"ctype": { "type": "integer" },
"drying_temp": { "type": "string" },
"drying_time": { "type": "string" },
"id": { "type": "string" },
"nozzle_temp_min": { "type": "string" },
"nozzle_temp_max": { "type": "string" },
"remain": { "type": "integer", "minimum": 0 },
"tag_uid": { "type": "string" },
"total_len": { "type": "integer" },
"tray_color": { "type": "string" },
"tray_diameter": { "type": "string" },
"tray_id_name": { "type": "string" },
"tray_info_idx": { "type": "string" },
"tray_sub_brands": { "type": "string" },
"tray_type": { "type": "string" },
"tray_uuid": { "type": "string" },
"tray_weight": { "type": "string" },
"xcam_info": { "type": "string" }
},
"required": [
"bed_temp", "bed_temp_type", "cali_idx", "cols",
"ctype", "drying_temp", "drying_time", "id",
"nozzle_temp_max", "nozzle_temp_min", "remain", "tag_uid",
"total_len", "tray_color", "tray_diameter", "tray_id_name",
"tray_info_idx", "tray_sub_brands", "tray_type", "tray_uuid",
"tray_weight", "xcam_info"
]
}
@@ -0,0 +1,21 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/common/xcam.schema.json",
"title": "XcamSettings",
"description": "Camera-based AI print monitoring settings (spaghetti detection, first-layer inspection, etc.).",
"type": "object",
"properties": {
"allow_skip_parts": { "type": "boolean" },
"buildplate_marker_detector": { "type": "boolean" },
"cfg": { "type": "integer" },
"first_layer_inspector": { "type": "boolean" },
"halt_print_sensitivity": { "type": "string" },
"print_halt": { "type": "boolean" },
"printing_monitor": { "type": "boolean" },
"spaghetti_detector": { "type": "boolean" }
},
"required": [
"allow_skip_parts", "buildplate_marker_detector", "first_layer_inspector", "cfg",
"halt_print_sensitivity", "print_halt", "printing_monitor", "spaghetti_detector"
]
}
+22
View File
@@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report.schema.json",
"title": "BambuReportV2",
"description": "V2 equivalent of v1/report.schema.json - same 'what root key does this arrive under' convention (see v1/report.schema.json for the print-vs-pushing rationale). Only wires categories that actually have a v2 schema on disk; add a property here when a new v2/report/<category>/ schema is added.",
"type": "object",
"minProperties": 1,
"maxProperties": 1,
"properties": {
"info": {
"oneOf": [
{ "$ref": "report/info/get_version.schema.json" }
]
},
"print": {
"oneOf": [
{ "$ref": "report/print/print.schema.json" }
]
}
},
"additionalProperties": false
}
@@ -0,0 +1,26 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/info/_module_info.schema.json",
"title": "ModuleInfo",
"type": "object",
"properties": {
"name": { "type": "string" },
"sw_ver": { "type": "string" },
"hw_ver": { "type": "string" },
"loader_ver": { "type": "string" },
"product_name": { "type": "string" },
"sn": { "type": "string" },
"visible": { "type": "boolean" },
"flag": { "type": "integer" }
},
"required": [
"name",
"sw_ver",
"hw_ver",
"loader_ver",
"sn",
"product_name",
"visible",
"flag"
]
}
@@ -0,0 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/info/get_version.schema.json",
"title": "GetVersionReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "get_version" },
"module": {
"type": "array",
"items": { "$ref": "_module_info.schema.json" }
}
},
"required": ["module"]
}
]
}
@@ -0,0 +1,72 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/_2d_report.schema.json",
"title": "2DReport",
"description": "Details about current 2D job",
"type": "object",
"properties": {
"bs": {
"type": "object",
"properties": {
"bi": {
"type": "array",
"items": {
"type": "object",
"properties": {
"clock_in": { "type": "boolean" },
"est_time": { "type": "integer" },
"idx": { "type": "integer" },
"print_then": { "type": "boolean" },
"proc_list": { "type": "array", "items": { "type": "object" } },
"step_type": { "type": "integer" },
"tool_info": {
"type": "object",
"properties": {
"color": { "type": "string" },
"diameter": { "type": "number", "minimum": 0 },
"id": { "type": "integer" }
},
"required": ["color", "diameter", "id"]
},
"type": { "type": "integer" }
},
"required": [
"clock_in", "est_time", "idx", "print_then",
"proc_list", "step_type", "tool_info", "type"
]
}
},
"total_time": { "type": "integer" }
},
"required": ["bi", "total_time"]
},
"cond": { "type": "integer" },
"cur_stage": {
"type": "object",
"properties": {
"clock_in_time": { "type": "integer" },
"idx": { "type": "integer" },
"left_time": { "type": "integer" },
"process": { "type": "integer" },
"state": { "type": "integer" }
},
"required": ["clock_in_time", "idx", "left_time", "process", "state"]
},
"first_confirm": { "type": "boolean" },
"makeable": { "type": "boolean" },
"material": {
"type": "object",
"properties": {
"cur_id_list": { "type": "array", "items": { "type": "object" } },
"state": { "type": "integer" },
"tar_id": { "type": "string" },
"tar_name": { "type": "string" }
},
"required": ["cur_id_list", "state", "tar_id", "tar_name"]
},
"pm": { "type": "integer" }
},
"required": [
"layer_num", "print_cali_option", "total_layer_num"
]
}
@@ -0,0 +1,15 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/_3d_report.schema.json",
"title": "3DReport",
"description": "Details about current print status",
"type": "object",
"properties": {
"layer_num": { "type": "integer" },
"print_cali_option": { "type": "integer" },
"total_layer_num": { "type": "integer" }
},
"required": [
"layer_num", "print_cali_option", "total_layer_num"
]
}
@@ -0,0 +1,8 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/_nozzle_type.schema.json",
"title": "PrintReportNozzleType",
"description": "Schema for nozzle type, used only by PrintReport schema. HS00 - stainless steel, HS01 - hardened steel, HS05 - tungsten carbide, HH01 - high-flow hardened steel, HH05 - high-flow tungsten carbide. NOTE: format is possibly as follows: [H,X][H,S]0[0,1,5] - first character for printer series (H - H-series, possibly A-series too; X - X-series, namely X1C. Or maybe H is for hot-swap?); second character is for flow rate (S - standard; H - high-flow); third character is left as 0; fourth character is for nozzle material (0 - stainless steel; 1 - hardened steel; 5 - tungsten carbide)",
"type": "string",
"pattern": "^([HX][HS]0[015])-(0\\.[2468])$"
}
@@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/calibration.schema.json",
"title": "CalibrationReport",
"description": "In contrast to Bambu MQTT v1, printer responds with `calibration` command, however it will still send `push_status` with following fields set: `{\"subtask_name\":\"auto_cali_for_user_param.gcode\",\"file\":\"/usr/etc/print/O1C2/auto_cali_for_user_param.gcode\",\"gcode_file\":\"/usr/etc/print/O1C2/auto_cali_for_user_param.gcode\",\"gcode_file_prepare_percent\":\"100\",\"gcode_state\":\"FAILED\",\"mc_print_stage\":\"1\"}`",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "calibration" },
"option": {
"description": "Following bitmask is required for the `option` field: `if (lidarCalibration) bitmask |= 1; if (bedLevelling) bitmask |= 1 << 1; if (vibrationCompensation) bitmask |= 1 << 2; if (motorCancellation) bitmask |= 1 << 3;`",
"type": "integer",
"minimum": 0,
"maximum": 15
}
},
"required": ["option"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/gcode_file.schema.json",
"title": "GcodeFileRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_file" },
"param": { "description": "Full path to GCODE file in printer's FS", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/gcode_line.schema.json",
"title": "GcodeLineReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_line" },
"param": { "description": "use \n for multiple lines", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,134 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/print.schema.json",
"title": "PrintReport",
"description": "The ongoing print-state push (root key \"print\") - NOT a direct reply to the pushall request (that goes to \"pushing\", see request/pushing/pushall.schema.json). Sending pushall makes the printer start/refresh this stream; it isn't itself request/response, which is also why this is its own category folder rather than sitting under pushing/ - a category here is 'what root key does this arrive under', not 'what triggered it'.",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "push_status" },
"2D": { "$ref": "./_2d_report.schema.json" },
"3D": { "$ref": "./_3d_report.schema.json" },
"ams": { "$ref": "../../common/ams/ams.schema.json" },
"hms": { "$ref": "../../common/hms.schema.json" },
"lights_report": { "$ref": "../../common/lights_report.schema.json" },
"upgrade_state": { "$ref": "../../common/upgrade_state.schema.json" },
"info": { "$ref": "../../common/info.schema.json" },
"ipcam": { "$ref": "../../common/ipcam.schema.json" },
"online": { "$ref": "../../common/online.schema.json" },
"net": { "$ref": "../../common/net.schema.json" },
"xcam": { "$ref": "../../common/xcam.schema.json" },
"care": { "$ref": "../../common/care.schema.json" },
"upload": { "$ref": "../../common/upload.schema.json" },
"job": { "$ref": "../../common/job/job.schema.json" },
"device": { "$ref": "../../common/device/device.schema.json" },
"vir_slot": {
"type": "array",
"items": {
"$ref": "../../common/vt_tray.schema.json"
}
},
"ams_status": { "type": "integer" },
"ams_rfid_status": { "type": "integer" },
"ap_err": { "type": "integer" },
"aux": { "type": "string" },
"aux_part_fan": { "type": "boolean" },
"batch_id": { "type": "integer" },
"cali_version": { "type": "integer" },
"canvas_id": { "type": "integer" },
"cfg": { "type": "string" },
"design_id": { "type": "string" },
"nozzle_diameter": { "$ref": "../../common/nozzle_diameter.schema.json" },
"nozzle_type": { "$ref": "./_nozzle_type.schema.json" },
"nozzle_temper": { "type": "number" },
"nozzle_target_temper": { "type": "number" },
"bed_temper": { "type": "number" },
"bed_target_temper": { "type": "number" },
"fan_gear": { "type": "integer" },
"heatbreak_fan_speed": { "type": "string" },
"cooling_fan_speed": { "type": "string" },
"big_fan1_speed": { "type": "string" },
"big_fan2_speed": { "type": "string" },
"err": { "type": "string" },
"fail_reason": { "type": "string" },
"file": { "type": "string" },
"gcode_file": { "type": "string" },
"gcode_state": { "type": "string", "enum": [ "idle", "IDLE", "finish", "FINISH", "running", "RUNNING" ] },
"gcode_file_prepare_percent": { "type": "string" },
"force_upgrade": { "type": "boolean" },
"fun": { "type": "string" },
"fun2": { "type": "string" },
"home_flag": { "type": "integer" },
"hw_switch_state": { "type": "integer" },
"job_attr": { "type": "integer" },
"job_id": { "type": "string" },
"lan_task_id": { "type": "string" },
"layer_num": { "type": "integer" },
"mc_action": { "type": "integer" },
"mc_err": { "type": "integer" },
"mc_percent": { "type": "integer" },
"mc_print_error_code": { "type": "string" },
"mc_print_stage": { "type": "string" },
"mc_print_sub_stage": { "type": "integer" },
"mc_remaining_time": { "type": "integer" },
"mc_stage": { "type": "integer" },
"model_id": { "type": "string" },
"msg": { "type": "integer" },
"percent": { "type": "integer" },
"plate_cnt": { "type": "integer" },
"plate_id": { "type": "integer" },
"plate_idx": { "type": "integer" },
"prepare_per": { "type": "integer" },
"print_error": { "type": "integer" },
"print_gcode_action": { "type": "integer" },
"print_real_action": { "type": "integer" },
"print_type": { "type": "string", "enum": [ "", "idle", "IDLE" ] },
"profile_id": { "type": "string" },
"project_id": { "type": "string" },
"queue": { "type": "integer" },
"queue_est": { "type": "integer" },
"queue_number": { "type": "integer" },
"queue_sts": { "type": "integer" },
"queue_total": { "type": "integer" },
"remain_time": { "type": "integer" },
"s_obj": { "type": "array", "items": {} },
"sdcard": { "type": "boolean" },
"sequence_id": { "type": "string" },
"spd_lvl": { "type": "integer", "minimum": 1, "maximum": 4 },
"spd_mag": { "type": "integer", "minimum": 0, "maximum": 100 },
"stat": { "type": "string" },
"state": { "type": "integer" },
"stg": { "type": "array", "items": { "type": "number" } },
"stg_cur": { "type": "integer" },
"subtask_id": { "type": "string" },
"subtask_name": { "type": "string" },
"task_id": { "type": "string" },
"total_layer_num": { "type": "integer", "minimum": 0 },
"ver": { "type": "string" },
"wifi_signal": { "type": "string", "pattern": "^-([0-9]{1,2}|100)dBm$" },
"xcam_status": { "type": "string" },
"mapping": { "type": "array", "items": { "type": "number", "minimum": 0 } }
}
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/print_speed.schema.json",
"title": "PrintSpeedReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "print_speed" },
"param": {
"description": "1 - silent (50%), 2 - standard (100%), 3 - sport (124%), 4 - ludicrous (166%)",
"type": "string",
"enum": ["1", "2", "3", "4"]
}
},
"required": ["param"]
}
]
}
@@ -0,0 +1,15 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/report/print/unload_filament.schema.json",
"title": "UnloadFilamentReport",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "unload_filament" }
},
"required": ["param"]
}
]
}
+17
View File
@@ -0,0 +1,17 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request.schema.json",
"title": "BambuRequestV2",
"description": "V2 equivalent of v1/request.schema.json - one JSON key naming the category, each a oneOf to leave room for more than one request shape per category. Only wires categories that actually have a v2 schema on disk; add a property here when a new v2/request/<category>/ schema is added.",
"type": "object",
"minProperties": 1,
"maxProperties": 1,
"properties": {
"info": {
"oneOf": [
{ "$ref": "request/info/get_version.schema.json" }
]
}
},
"additionalProperties": false
}
@@ -0,0 +1,14 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/info/get_version.schema.json",
"title": "GetVersionRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "get_version" }
}
}
]
}
@@ -0,0 +1,21 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/print/calibration.schema.json",
"title": "CalibrationRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "calibration" },
"option": {
"description": "Following bitmask is required for the `option` field: `if (lidarCalibration) bitmask |= 1; if (bedLevelling) bitmask |= 1 << 1; if (vibrationCompensation) bitmask |= 1 << 2; if (motorCancellation) bitmask |= 1 << 3;`",
"type": "integer",
"minimum": 0,
"maximum": 15
}
},
"required": ["option"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/print/gcode_file.schema.json",
"title": "GcodeFileRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_file" },
"param": { "description": "Full path to GCODE file in printer's FS", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,16 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/print/gcode_line.schema.json",
"title": "GcodeLineRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "gcode_line" },
"param": { "description": "use \n for multiple lines", "type": "string" }
},
"required": ["param"]
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/print/print_speed.schema.json",
"title": "PrintSpeedRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "print_speed" },
"param": {
"description": "1 - silent (50%), 2 - standard (100%), 3 - sport (124%), 4 - ludicrous (166%)",
"type": "string",
"enum": ["1", "2", "3", "4"]
}
},
"required": ["param"]
}
]
}
@@ -0,0 +1,15 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.octoturge.com/Continuum/continuum-schemas/raw/branch/main/schemas/bambulab/v2/request/print/unload_filament.schema.json",
"title": "UnloadFilamentRequest",
"allOf": [
{ "$ref": "../../../common/envelope.schema.json" },
{
"type": "object",
"properties": {
"command": { "const": "unload_filament" }
},
"required": ["param"]
}
]
}