Hi,
I’m working on a Direct Connected Device (ESP32) and trying to add a custom capability to the SmartThings app. I followed the official custom capability documentation and example (perfectlife6617.customGarageDoor), but the capability is not appearing in the app at all.
What I’ve done:
Created a custom capability snug.testDoor under my organization’s namespace (snug) via CLI:
smartthings capabilities:create -i testDoor.json
Created and uploaded a capability presentation via CLI:
smartthings capabilities:presentation:create snug.testDoor --capability-version 1 -i presentation.json
Added snug.testDoor to my Device Profile (main component, optional: true) and included it in detailView and automation sections.
Uploaded the updated Device Profile via the web portal — upload succeeded.
The device firmware registers the capability handle and reports an initial door attribute value (“closed”) on connection.
What I see in the app:
The snug.testDoor capability does not appear anywhere in the device detail view. All standard capabilities (switch, fanSpeed, fanMode, etc.) are visible and working correctly.
What I’ve verified:
The capability and its presentation are correctly registered (confirmed via smartthings capabilities --namespace snug -j and smartthings capabilities:presentation snug.testDoor --capability-version 1 -j)
The Device Profile on the server correctly includes snug.testDoor in main component (confirmed via smartthings deviceprofiles:view -j)
The firmware is reporting the door attribute value on initial connection
I’m attaching the current Device Profile JSON for reference.
Question:
Is there something specific required to make a custom capability visible in the SmartThings app that I’m missing? Does the app treat custom capabilities differently from standard ones in terms of rendering?
Any guidance would be greatly appreciated. Thank you!
{
"deviceProfile": {
"id": "a101d4da-2c96-4a4c-88e2-2ccfc379eeb5",
"name": "v2.1.1",
"metadata": {
"deviceType": "Vent",
"ocfDeviceType": "x.com.st.d.vent",
"deviceTypeId": "Vent",
"manufacturerName": "snug",
"mnId": "Uimh",
"vid": "9eacfb7a-52fe-4d26-8d15-9b098a8cdbf0",
"mnmn": "snug",
"presentationId": "snug.9eacfb7a-52fe-4d26-8d15-9b098a8cdbf0",
"integrationType": "direct",
"mainState": "main~switch~1",
"ocfSpecVer": "core 1.1.0",
"mainAction": "main~switch~1",
"resourceType": "x.com.st.d.vent"
},
"migrationStatus": "NOT_MIGRATED",
"status": "DEVELOPMENT",
"preferences": [],
"components": [
{
"label": " ",
"id": "main",
"capabilities": [
{
"id": "healthCheck",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "switch",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "fanSpeed",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "mode",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "fanMode",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "snug.testDoor",
"version": 1,
"optional": true,
"ephemeral": false
}
],
"categories": [
{
"name": "Vent",
"categoryType": "manufacturer"
}
],
"optional": false
},
{
"label": " ",
"id": "sensor",
"capabilities": [
{
"id": "temperatureMeasurement",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "dustSensor",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "carbonDioxideMeasurement",
"version": 1,
"optional": false,
"ephemeral": false
}
],
"categories": [],
"optional": false
}
]
},
"deviceConfiguration": {
"mnmn": "snug",
"vid": "9eacfb7a-52fe-4d26-8d15-9b098a8cdbf0",
"version": "0.0.1",
"type": "profile",
"dashboard": {
"states": [
{
"component": "main",
"capability": "switch",
"version": 1,
"idx": 0,
"group": "main",
"values": [],
"composite": false
}
],
"actions": [
{
"component": "main",
"capability": "switch",
"version": 1,
"idx": 0,
"group": "main"
}
],
"basicPlus": []
},
"detailView": [
{
"component": "main",
"capability": "healthCheck",
"version": 1,
"values": [],
"patch": []
},
{
"component": "main",
"capability": "switch",
"version": 1,
"values": [],
"patch": []
},
{
"component": "main",
"capability": "fanSpeed",
"version": 1,
"values": [
{
"enabledValues": [],
"range": [
0,
100
],
"step": 25,
"key": "fanSpeed.value"
}
],
"patch": [
{
"op": "replace",
"path": "/0/slider/alternatives",
"value": [
{
"key": "0",
"value": "1",
"type": "active"
},
{
"key": "1",
"value": "1",
"type": "active"
},
{
"key": "2",
"value": "2",
"type": "active"
},
{
"key": "3",
"value": "3",
"type": "active"
},
{
"key": "4",
"value": "4",
"type": "active"
}
]
}
],
"visibleCondition": {
"value": "fanMode.value",
"operator": "ONE_OF",
"operand": "[\"auto\",\"turbo\"]",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": false
}
},
{
"component": "main",
"capability": "fanMode",
"version": 1,
"values": [],
"patch": [
{
"op": "replace",
"path": "/0/label",
"value": "동작모드"
},
{
"op": "replace",
"path": "/0/list/command/alternatives",
"value": [
{
"key": "auto",
"value": "수동",
"type": "active"
},
{
"key": "high",
"value": "온도",
"type": "active"
},
{
"key": "medium",
"value": "CO2감지",
"type": "active"
},
{
"key": "low",
"value": "연기감지",
"type": "active"
},
{
"key": "turbo",
"value": "주기환기",
"type": "active"
}
]
},
{
"op": "replace",
"path": "/0/list/state/alternatives",
"value": [
{
"key": "auto",
"value": "수동",
"type": "active"
},
{
"key": "high",
"value": "온도",
"type": "active"
},
{
"key": "medium",
"value": "CO2감지",
"type": "active"
},
{
"key": "low",
"value": "연기감지",
"type": "active"
},
{
"key": "turbo",
"value": "주기환기",
"type": "active"
},
{
"key": "off",
"value": "꺼짐",
"type": "inactive"
}
]
}
],
"visibleCondition": {
"value": "fanMode.value",
"operator": "ONE_OF",
"operand": "[\"auto\",\"high\",\"medium\",\"low\",\"turbo\"]",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": false
}
},
{
"component": "main",
"capability": "mode",
"version": 1,
"values": [
{
"enabledValues": [],
"label": "주기",
"key": "mode.value"
}
],
"patch": [],
"visibleCondition": {
"value": "fanMode.value",
"operator": "EQUALS",
"operand": "turbo",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": false
}
},
{
"component": "sensor",
"capability": "temperatureMeasurement",
"version": 1,
"values": [],
"patch": []
},
{
"component": "sensor",
"capability": "dustSensor",
"version": 1,
"values": [],
"patch": []
},
{
"component": "sensor",
"capability": "carbonDioxideMeasurement",
"version": 1,
"values": [],
"patch": []
},
{
"component": "main",
"capability": "snug.testDoor",
"version": 1,
"displayType": "list",
"list": {
"command": {
"name": "setDoor",
"alternatives": [
{ "key": "open", "value": "Open", "type": "active" },
{ "key": "closed", "value": "Closed", "type": "inactive" }
],
"argumentType": "string"
},
"state": {
"value": "door.value",
"valueType": "string",
"alternatives": [
{ "key": "open", "value": "Open", "type": "active" },
{ "key": "opening", "value": "Opening", "type": "active" },
{ "key": "closed", "value": "Closed", "type": "inactive" },
{ "key": "closing", "value": "Closing", "type": "active" },
{ "key": "partial", "value": "Partial", "type": "active" }
]
}
},
"values": [],
"patch": []
}
],
"automation": {
"conditions": [
{
"component": "main",
"capability": "healthCheck",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "switch",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "fanSpeed",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "mode",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "fanMode",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "sensor",
"capability": "temperatureMeasurement",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "sensor",
"capability": "dustSensor",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "sensor",
"capability": "carbonDioxideMeasurement",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "snug.testDoor",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
}
],
"actions": [
{
"component": "main",
"capability": "healthCheck",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "switch",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "fanSpeed",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "mode",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "fanMode",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
}
]
},
"presentationId": "9eacfb7a-52fe-4d26-8d15-9b098a8cdbf0",
"manufacturerName": "snug"
}
}

