Browse Source

Fix: Internal Model Code Detection for Camera Protocol

Root Cause: P2S (and other newer models) may report their model as internal codes (e.g., "N7" for P2S) rather than display names in MQTT/SSDP responses. The camera code
only checked for display names like "P2S", causing it to incorrectly use the chamber image protocol (for A1/P1) instead of RTSP.

Internal Code Mapping:
BL-P001 → X1/X1C (RTSP)
C13     → X1E    (RTSP)
O1D     → H2D    (RTSP)
O1C     → H2C    (RTSP)
O1S     → H2S    (RTSP)
O1E     → H2D Pro (RTSP)
N7      → P2S    (RTSP)
C11     → P1P    (Chamber)
C12     → P1S    (Chamber)
N2S     → A1     (Chamber)
N1      → A1 Mini (Chamber)

Closes #127
maziggy 4 months ago
parent
commit
08e4797544

+ 14 - 1
backend/app/services/camera.py

@@ -66,12 +66,25 @@ def supports_rtsp(model: str | None) -> bool:
 
     RTSP supported: X1, X1C, X1E, H2C, H2D, H2DPRO, H2S, P2S
     Chamber image only: A1, A1MINI, P1P, P1S
+
+    Note: Model can be either display name (e.g., "P2S") or internal code (e.g., "N7").
+    Internal codes from MQTT/SSDP:
+      - BL-P001: X1/X1C
+      - C13: X1E
+      - O1D: H2D
+      - O1C: H2C
+      - O1S: H2S
+      - O1E: H2D Pro
+      - N7: P2S
     """
     if model:
         model_upper = model.upper()
-        # These models support RTSP on port 322
+        # Display names: X1, X1C, X1E, H2C, H2D, H2DPRO, H2S, P2S
         if model_upper.startswith(("X1", "H2", "P2")):
             return True
+        # Internal codes for RTSP models
+        if model_upper in ("BL-P001", "C13", "O1D", "O1C", "O1S", "O1E", "N7"):
+            return True
     # A1/P1 and unknown models use chamber image protocol
     return False
 

+ 10 - 0
backend/app/services/printer_manager.py

@@ -10,8 +10,10 @@ from backend.app.services.bambu_mqtt import BambuMQTTClient, MQTTLogEntry, Print
 # Models that have a real chamber temperature sensor
 # Based on Home Assistant Bambu Lab integration
 # P1P/P1S and A1/A1Mini do NOT have chamber temp sensors
+# Includes both display names and internal codes from MQTT/SSDP
 CHAMBER_TEMP_SUPPORTED_MODELS = frozenset(
     [
+        # Display names
         "X1",
         "X1C",
         "X1E",  # X1 series
@@ -20,6 +22,14 @@ CHAMBER_TEMP_SUPPORTED_MODELS = frozenset(
         "H2D",
         "H2DPRO",
         "H2S",  # H2 series
+        # Internal codes (from MQTT/SSDP)
+        "BL-P001",  # X1/X1C
+        "C13",  # X1E
+        "O1D",  # H2D
+        "O1C",  # H2C
+        "O1S",  # H2S
+        "O1E",  # H2D Pro
+        "N7",  # P2S
     ]
 )
 

+ 28 - 0
backend/tests/unit/services/test_printer_manager.py

@@ -839,6 +839,34 @@ class TestSupportsChamberTemp:
         assert supports_chamber_temp("X1c") is True
         assert supports_chamber_temp("p1s") is False
 
+    def test_internal_model_codes_supported(self):
+        """Verify internal model codes from MQTT/SSDP are recognized."""
+        # X1/X1C
+        assert supports_chamber_temp("BL-P001") is True
+        # X1E
+        assert supports_chamber_temp("C13") is True
+        # H2D
+        assert supports_chamber_temp("O1D") is True
+        # H2C
+        assert supports_chamber_temp("O1C") is True
+        # H2S
+        assert supports_chamber_temp("O1S") is True
+        # H2D Pro
+        assert supports_chamber_temp("O1E") is True
+        # P2S
+        assert supports_chamber_temp("N7") is True
+
+    def test_internal_model_codes_not_supported(self):
+        """Verify A1/P1 internal codes are NOT supported."""
+        # P1P
+        assert supports_chamber_temp("C11") is False
+        # P1S
+        assert supports_chamber_temp("C12") is False
+        # A1
+        assert supports_chamber_temp("N2S") is False
+        # A1 Mini
+        assert supports_chamber_temp("N1") is False
+
 
 class TestGetDerivedStatusName:
     """Tests for get_derived_status_name function."""