Merge pull request #227 from deathly1987/fix/p2s-printer-support

Fix: P2S printer model support - add vibration_cali disable and FTP SSL session reuse
This commit is contained in:
MartinNYHC
2026-02-02 14:11:22 +01:00
committed by GitHub
4 changed files with 29 additions and 5 deletions
+2 -1
View File
@@ -78,7 +78,8 @@ class BambuFTPClient:
FTP_PORT = 990
DEFAULT_TIMEOUT = 30 # Default timeout in seconds (increased for A1 printers)
# Models that need SSL session reuse disabled (A1 series has FTP issues with session reuse)
SKIP_SESSION_REUSE_MODELS = ("A1", "A1 Mini", "P1S", "P1P", "P2S")
# P2S should use normal session reuse like X1C/P1S, not skip it
SKIP_SESSION_REUSE_MODELS = ("A1", "A1 Mini", "P1S", "P1P")
def __init__(
self,
+18 -1
View File
@@ -249,6 +249,7 @@ class BambuMQTTClient:
ip_address: str,
serial_number: str,
access_code: str,
model: str | None = None,
on_state_change: Callable[[PrinterState], None] | None = None,
on_print_start: Callable[[dict], None] | None = None,
on_print_complete: Callable[[dict], None] | None = None,
@@ -258,6 +259,7 @@ class BambuMQTTClient:
self.ip_address = ip_address
self.serial_number = serial_number
self.access_code = access_code
self.model = model
self.on_state_change = on_state_change
self.on_print_start = on_print_start
self.on_print_complete = on_print_complete
@@ -2075,6 +2077,12 @@ class BambuMQTTClient:
}
}
# P2S-specific parameter adjustments
# P2S printer doesn't support vibration calibration like X1/P1 series
if self.model and self.model.upper().strip() in ("P2S", "N7"):
command["print"]["vibration_cali"] = False
logger.info(f"[{self.serial_number}] P2S detected: disabling vibration_cali")
# Add AMS mapping if provided
if ams_mapping is not None:
command["print"]["ams_mapping"] = ams_mapping
@@ -2083,7 +2091,16 @@ class BambuMQTTClient:
logger.info(f"[{self.serial_number}] Sending print command: {json.dumps(command)}")
self._client.publish(self.topic_publish, json.dumps(command), qos=1)
return True
return False
else:
# Log why we couldn't send the command
if not self._client:
logger.error(f"[{self.serial_number}] Cannot start print: MQTT client not initialized")
elif not self.state.connected:
logger.error(
f"[{self.serial_number}] Cannot start print: Printer not connected (client exists but disconnected). "
f"Connection state: {self.state.connected}, Last message: {self._last_message_time}"
)
return False
def stop_print(self) -> bool:
"""Stop the current print job."""
+8 -3
View File
@@ -1004,17 +1004,22 @@ class PrintScheduler:
pass # Don't fail if MQTT fails
else:
item.status = "failed"
item.error_message = "Failed to send print command"
item.error_message = "Failed to send print command to printer"
item.completed_at = datetime.utcnow()
await db.commit()
logger.error(f"Queue item {item.id}: Failed to start print")
logger.error(
f"Queue item {item.id}: Failed to start print on {printer.name} ({printer.model}) - "
f"printer_manager.start_print() returned False. "
f"This may indicate: printer not connected, MQTT error, unsupported model configuration, or firmware issue. "
f"Check printer status and backend logs for details."
)
# Send failure notification
await notification_service.on_queue_job_failed(
job_name=filename.replace(".gcode.3mf", "").replace(".3mf", ""),
printer_id=printer.id,
printer_name=printer.name,
reason="Failed to send print command",
reason="Failed to send print command to printer - check printer connection and status",
db=db,
)
+1
View File
@@ -192,6 +192,7 @@ class PrinterManager:
ip_address=printer.ip_address,
serial_number=printer.serial_number,
access_code=printer.access_code,
model=printer.model,
on_state_change=on_state_change,
on_print_start=on_print_start,
on_print_complete=on_print_complete,