Merge pull request #5 from maziggy/0.1.3

Fixed websocket bug
This commit is contained in:
MartinNYHC
2025-11-30 09:24:17 +01:00
committed by GitHub
2 changed files with 16 additions and 0 deletions
+1
View File
@@ -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(
+15
View File
@@ -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(