From ba302394d5132f0f0d3da3f1c29ee77c41a21f9a Mon Sep 17 00:00:00 2001 From: Martin Ziegler Date: Sun, 30 Nov 2025 09:23:10 +0100 Subject: [PATCH] Fixed websocket bug --- backend/app/main.py | 1 + backend/app/services/bambu_mqtt.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/backend/app/main.py b/backend/app/main.py index f9565369a..ab7ac0d03 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -89,6 +89,7 @@ async def on_printer_status_change(printer_id: int, state: PrinterState): status_key = f"{state.connected}:{state.state}:{state.progress}:{state.layer_num}" if _last_status_broadcast.get(printer_id) == status_key: return # No change, skip broadcast + _last_status_broadcast[printer_id] = status_key await ws_manager.send_printer_status( diff --git a/backend/app/services/bambu_mqtt.py b/backend/app/services/bambu_mqtt.py index 4c3e52d55..2f0ffb0e7 100644 --- a/backend/app/services/bambu_mqtt.py +++ b/backend/app/services/bambu_mqtt.py @@ -2,6 +2,7 @@ import json import ssl import asyncio import logging +import time from collections import deque from datetime import datetime from typing import Callable @@ -75,6 +76,7 @@ class BambuMQTTClient: self._previous_gcode_file: str | None = None self._message_log: deque[MQTTLogEntry] = deque(maxlen=100) self._logging_enabled: bool = False + self._last_message_time: float = 0.0 # Track when we last received a message @property def topic_subscribe(self) -> str: @@ -94,6 +96,16 @@ class BambuMQTTClient: self.state.connected = False def _on_disconnect(self, client, userdata, disconnect_flags=None, rc=None, properties=None): + # Ignore spurious disconnect callbacks if we've received a message recently + # Paho-mqtt sometimes fires disconnect callbacks while the connection is still active + time_since_last_message = time.time() - self._last_message_time + if time_since_last_message < 30.0 and self._last_message_time > 0: + logger.debug( + f"[{self.serial_number}] Ignoring spurious disconnect (last message {time_since_last_message:.1f}s ago)" + ) + return + + logger.warning(f"[{self.serial_number}] MQTT disconnected: rc={rc}, flags={disconnect_flags}") self.state.connected = False if self.on_state_change: self.on_state_change(self.state) @@ -101,6 +113,9 @@ class BambuMQTTClient: def _on_message(self, client, userdata, msg): try: payload = json.loads(msg.payload.decode()) + # Track last message time - receiving a message proves we're connected + self._last_message_time = time.time() + self.state.connected = True # Log message if logging is enabled if self._logging_enabled: self._message_log.append(MQTTLogEntry(