259 lines
6.2 KiB
JavaScript
259 lines
6.2 KiB
JavaScript
/**
|
|
* Bambu Labs Printer API Integration
|
|
* Handles communication with Bambu X1/X1 Carbon printers
|
|
*/
|
|
|
|
import axios from 'axios';
|
|
|
|
const BAMBU_API_BASE = 'https://api.bambulab.com';
|
|
|
|
export class BambuPrinterAPI {
|
|
constructor(accessToken, serialNumber) {
|
|
this.accessToken = accessToken;
|
|
this.serialNumber = serialNumber;
|
|
this.apiClient = axios.create({
|
|
baseURL: BAMBU_API_BASE,
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get printer status
|
|
*/
|
|
async getPrinterStatus() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}`);
|
|
return {
|
|
success: true,
|
|
data: response.data
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching printer status:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get printer info
|
|
*/
|
|
async getPrinterInfo() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}/info`);
|
|
return {
|
|
success: true,
|
|
data: {
|
|
serialNumber: this.serialNumber,
|
|
modelName: response.data.model_name,
|
|
firmwareVersion: response.data.firmware_version,
|
|
ipAddress: response.data.ip,
|
|
status: response.data.status,
|
|
temperature: response.data.temperature
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching printer info:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get current print job status
|
|
*/
|
|
async getPrintJobStatus() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}/job`);
|
|
return {
|
|
success: true,
|
|
data: {
|
|
jobId: response.data.job_id,
|
|
fileName: response.data.file_name,
|
|
progress: response.data.progress,
|
|
timeRemaining: response.data.time_remaining,
|
|
status: response.data.status,
|
|
layer: response.data.layer,
|
|
totalLayers: response.data.total_layers
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching print job status:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message,
|
|
data: { status: 'idle' }
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get printer temperature readings
|
|
*/
|
|
async getTemperature() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}/temperature`);
|
|
return {
|
|
success: true,
|
|
data: {
|
|
nozzleTemp: response.data.nozzle_temp,
|
|
bedTemp: response.data.bed_temp,
|
|
chamberTemp: response.data.chamber_temp,
|
|
nozzleTargetTemp: response.data.nozzle_target_temp,
|
|
bedTargetTemp: response.data.bed_target_temp
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching temperature:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get print history
|
|
*/
|
|
async getPrintHistory(limit = 10) {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}/history?limit=${limit}`);
|
|
return {
|
|
success: true,
|
|
data: response.data.jobs || []
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching print history:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message,
|
|
data: []
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Send print file to printer
|
|
* Note: This typically requires the file to be uploaded to Bambu Cloud first
|
|
*/
|
|
async sendPrintFile(fileName, fileUrl, profileName = 'default') {
|
|
try {
|
|
const response = await this.apiClient.post(
|
|
`/v1/iot-service/api/printer/${this.serialNumber}/print`,
|
|
{
|
|
file_name: fileName,
|
|
file_url: fileUrl,
|
|
profile_name: profileName
|
|
}
|
|
);
|
|
return {
|
|
success: true,
|
|
data: response.data
|
|
};
|
|
} catch (error) {
|
|
console.error('Error sending print file:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Control printer (pause, resume, stop)
|
|
*/
|
|
async controlPrint(action) {
|
|
// Valid actions: 'pause', 'resume', 'stop'
|
|
if (!['pause', 'resume', 'stop'].includes(action)) {
|
|
return {
|
|
success: false,
|
|
error: 'Invalid action. Use: pause, resume, or stop'
|
|
};
|
|
}
|
|
|
|
try {
|
|
const response = await this.apiClient.post(
|
|
`/v1/iot-service/api/printer/${this.serialNumber}/print/control`,
|
|
{ action }
|
|
);
|
|
return {
|
|
success: true,
|
|
data: response.data
|
|
};
|
|
} catch (error) {
|
|
console.error(`Error controlling print (${action}):`, error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Start a print
|
|
*/
|
|
async startPrint(action = 'resume') {
|
|
return this.controlPrint(action);
|
|
}
|
|
|
|
/**
|
|
* Pause current print
|
|
*/
|
|
async pausePrint() {
|
|
return this.controlPrint('pause');
|
|
}
|
|
|
|
/**
|
|
* Stop/cancel current print
|
|
*/
|
|
async stopPrint() {
|
|
return this.controlPrint('stop');
|
|
}
|
|
|
|
/**
|
|
* Get list of available print profiles
|
|
*/
|
|
async getPrintProfiles() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/printer/${this.serialNumber}/profiles`);
|
|
return {
|
|
success: true,
|
|
data: response.data || []
|
|
};
|
|
} catch (error) {
|
|
console.error('Error fetching print profiles:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message,
|
|
data: []
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate access token
|
|
*/
|
|
async validateToken() {
|
|
try {
|
|
const response = await this.apiClient.get(`/v1/iot-service/api/user/printers`);
|
|
return {
|
|
success: true,
|
|
data: response.data
|
|
};
|
|
} catch (error) {
|
|
console.error('Error validating token:', error.message);
|
|
return {
|
|
success: false,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
export default BambuPrinterAPI;
|