makerstash/server/services/bambuPrinterAPI.js

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;