Missing TemperatureLevelControl UI for Refrigerator (profile TL, Matter 1.4, ESP32-S3)
Hi everyone,
I’m working on a Matter-based refrigerator/freezer device and I’m seeing a strange inconsistency in the SmartThings app UI when using profile TL.
Summary of the Issue
- The freezer component shows the expected TemperatureLevel UI and works correctly.
- The refrigerator component, which is configured the same way (TemperatureLevelControl), does not show any UI for selecting or modifying temperature levels.
- In the exported SmartThings attributes JSON:
- freezer.temperatureLevel.supportedTemperatureLevels is populated correctly.
- refrigerator.temperatureLevel.supportedTemperatureLevels is always null.
From the user’s perspective, the freezer is fully controllable by “levels”, but the refrigerator is not, even though both are configured to use TemperatureLevelControl.
Steps to Reproduce
- Commission a refrigerator/freezer Matter device using profile TL in the SmartThings app.
- Open the device details and go to the controls related to TemperatureLevelControl.
- Check the:
- Freezer component → Temperature level UI appears and works.
- Refrigerator component → No TemperatureLevel UI at all.
Expected Behavior
- Both refrigerator and freezer components should expose a UI control (slider or selector) for TemperatureLevelControl, allowing the user to choose among the supported levels (e.g., discrete level list mapped to internal setpoints).
- The exported attributes JSON for refrigerator should also include:
- supportedTemperatureLevels
- temperatureLevel
Actual Behavior
- Freezer :
- TemperatureLevel UI appears and works as expected.
- JSON shows valid supportedTemperatureLevels and temperatureLevel.
- Refrigerator :
- No TemperatureLevel UI in the app.
- JSON shows:
- supportedTemperatureLevels: null
- temperatureLevel: null
Environment / Device Details
- Controller: ESP32-S3
- Matter Version: 1.4
- ESP-IDF Version: 5.2.3
- Profile: TL (refrigerator + freezer)
- Cluster: Matter Temperature Control cluster (0x0056 / 0x56) used for both compartments.
Example Logs – Freezer Temperature Level Command
Freezer endpoint is correctly handled by the ESP-Matter stack:
I (549763) esp_matter_command: Received command 0x00000000 for endpoint 0x0003's cluster 0x00000056
I (549773) esp_matter_attribute: ********** R : Endpoint 0x0003's Cluster 0x00000056's Attribute 0x0000FFFC is 2 **********
AppSupportedTemperatureLevelsDelegate::Size endpoint 3
AppSupportedTemperatureLevelsDelegate::Size Size of endpoint 3 is 11
I (549773) esp_matter_attribute: ********** R : Endpoint 0x0003's Cluster 0x00000056's Attribute 0x00000004 is 6 **********
Exported JSON – Example Where Freezer Works but Refrigerator Does Not
Below is a shortened example from my.smartthings export (the interesting part is the difference between freezer and refrigerator components):
[
{
"component": "freezer",
"capability": "temperatureLevel",
"attribute": "supportedTemperatureLevels",
"value": [
"-14.0°C",
"-15.0°C",
"-16.0°C",
"-17.0°C",
"-18.0°C",
"-19.0°C",
"-20.0°C",
"-21.0°C",
"-22.0°C",
"-23.0°C",
"-24.0°C"
],
"timestamp": "2024-12-11T20:19:34.176Z"
},
{
"component": "freezer",
"capability": "temperatureLevel",
"attribute": "temperatureLevel",
"value": "-20.0°C",
"timestamp": "2024-12-11T20:27:44.825Z"
},
{
"component": "refrigerator",
"capability": "temperatureLevel",
"attribute": "supportedTemperatureLevels",
"value": null
},
{
"component": "refrigerator",
"capability": "temperatureLevel",
"attribute": "temperatureLevel",
"value": null
}
]
So the freezer clearly exposes and populates supportedTemperatureLevels, while the refrigerator does not, even though both are configured with TemperatureLevelControl on the Matter side.
Step Attribute vs. UI Rendering
On the Matter side, the Step attribute in the Temperature Control cluster is reported correctly:
- The stack reads Step = 100 (signed), which corresponds to 1.0°C (centi-degrees).
Example log for the Step attribute (endpoint 0x2 / cluster 0x56):
[1746888275.811] [chip] [DMG] AttributePathIB = { Endpoint = 0x2, Cluster = 0x56, Attribute = 0x0000_0003 }
[1746888275.811] [chip] [DMG] Data = 100 (signed)
Feature map:
[1746889255.555] [chip] [DMG] AttributePathIB = { Endpoint = 0x2, Cluster = 0x56, Attribute = 0x0000_FFFC }
[1746889255.555] [chip] [DMG] Data = 5 (unsigned)
[1746889255.555] [chip] [DMG] InteractionModelRevision = 12
However, in the SmartThings JSON for the refrigerator, I see:
{
"component": "refrigerator",
"capability": "temperatureSetpoint",
"attribute": "temperatureSetpointRange",
"value": {
"minimum": 2,
"maximum": 8,
"step": 0.1
},
"timestamp": "2025-05-10T14:38:51.383Z"
}
So:
- The Matter Step attribute is 100 → 1.0°C.
- SmartThings temperatureSetpointRange.step is 0.1.
- At the same time, temperatureLevel capability for the refrigerator is null and no TemperatureLevel UI is rendered.
Questions for the Community / SmartThings Team
- Is there any known limitation or different mapping logic in SmartThings that would:
- Expose TemperatureLevel for the freezer but not for the refrigerator, even when both use the Temperature Control cluster?
- Is this behavior driven by:
- The profile ( TL ) ,
- The component mapping , or
- Some internal heuristic that prefers temperatureSetpoint over temperatureLevel for certain components?
- What is the correct way (from a SmartThings integration perspective) to:
- Ensure refrigerator.temperatureLevel.supportedTemperatureLevels is populated, and
- Make the TemperatureLevel UI appear for the refrigerator as it does for the freezer?
I can share full logs, profile definition, and screenshots of the missing UI if that helps.
