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
This commit is contained in:
maziggy
2026-01-23 07:09:22 +01:00
parent ce8968f893
commit 08e4797544
3 changed files with 52 additions and 1 deletions
+14 -1
View File
@@ -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
View File
@@ -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
]
)
@@ -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."""