From 08e47975441d4360f28cd81c11fd12a5c23a641a Mon Sep 17 00:00:00 2001 From: maziggy Date: Fri, 23 Jan 2026 07:08:48 +0100 Subject: [PATCH] Fix: Internal Model Code Detection for Camera Protocol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- backend/app/services/camera.py | 15 +++++++++- backend/app/services/printer_manager.py | 10 +++++++ .../unit/services/test_printer_manager.py | 28 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/backend/app/services/camera.py b/backend/app/services/camera.py index ecd8e328e..5f3e4d709 100644 --- a/backend/app/services/camera.py +++ b/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 diff --git a/backend/app/services/printer_manager.py b/backend/app/services/printer_manager.py index ee7645636..4a956649e 100644 --- a/backend/app/services/printer_manager.py +++ b/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 ] ) diff --git a/backend/tests/unit/services/test_printer_manager.py b/backend/tests/unit/services/test_printer_manager.py index d0a2160e5..dbff3358e 100644 --- a/backend/tests/unit/services/test_printer_manager.py +++ b/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."""