/** * 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;