That’s surprising… So to confirm, Custom Capabilities are supported by the platform, but using them means we cannot commercially release a product? I’m not sure what the point of Custom Capabilities is then.
Anyway, to summarize: using Custom Capabilities means we cannot obtain WWST certification, and without WWST certification, we cannot commercially launch a product with SmartThings integration — is that correct?
And here is a list of the Custom Capabilities I have created:
The highlighted area in yellow in the screenshot above represents the Custom Capability I created.
The device has three Operation Modes: CO2, Dust Detection, and Temperature. Each mode automatically adjusts the fan speed based on the sensor reading, and the Custom Capability allows the user to configure the threshold range for that adjustment.
For example, when the sensor value reaches the Min Threshold, the fan speed is set to 1 (minimum). When it reaches the Max Threshold, the fan speed is set to 100 (maximum). The values in between are linearly interpolated.
The Auto ON/OFF feature is an additional option within each mode. When enabled, the device turns off completely (fan speed = 0) when the sensor value drops to the Min Threshold, and turns back on at full speed when it rises back to the Max Threshold.
Below are the capability and presentation JSON files for the CO2 mode. The Dust and Temperature modes share the same structure with only the attribute names and units changed.
co2Settings.json
{
"name": "CO2 Settings",
"attributes": {
"carbonMin": {
"schema": {
"type": "object",
"properties": {
"value": { "type": "integer", "minimum": 0, "maximum": 900 },
"unit": { "type": "string", "enum": ["ppm"], "default": "ppm" }
},
"additionalProperties": false,
"required": ["value"]
},
"setter": "setCarbonMin",
"enumCommands": []
},
"carbonMax": {
"schema": {
"type": "object",
"properties": {
"value": { "type": "integer", "minimum": 1000, "maximum": 2000 },
"unit": { "type": "string", "enum": ["ppm"], "default": "ppm" }
},
"additionalProperties": false,
"required": ["value"]
},
"setter": "setCarbonMax",
"enumCommands": []
},
"carbonAction": {
"schema": {
"type": "object",
"properties": {
"value": { "type": "string", "enum": ["on", "off"] }
},
"additionalProperties": false,
"required": ["value"]
},
"enumCommands": []
}
},
"commands": {
"setCarbonMin": {
"name": "setCarbonMin",
"arguments": [
{
"name": "min",
"optional": false,
"schema": { "type": "integer", "minimum": 0, "maximum": 900 }
}
]
},
"setCarbonMax": {
"name": "setCarbonMax",
"arguments": [
{
"name": "max",
"optional": false,
"schema": { "type": "integer", "minimum": 1000, "maximum": 2000 }
}
]
},
"on": {
"name": "on",
"arguments": []
},
"off": {
"name": "off",
"arguments": []
}
}
}
co2Settings_presentation.json
{
"dashboard": {
"states": [],
"actions": []
},
"detailView": [
{
"label": "CO2 최솟값",
"displayType": "slider",
"slider": {
"command": "setCarbonMin",
"value": "carbonMin.value",
"unit": "carbonMin.unit",
"range": [0, 900],
"step": 100
}
},
{
"label": "CO2 최댓값",
"displayType": "slider",
"slider": {
"command": "setCarbonMax",
"value": "carbonMax.value",
"unit": "carbonMax.unit",
"range": [1000, 2000],
"step": 100
}
},
{
"label": "자동 ON/OFF",
"displayType": "standbyPowerSwitch",
"standbyPowerSwitch": {
"command": {
"on": "on",
"off": "off"
},
"state": {
"value": "carbonAction.value",
"on": "on",
"off": "off"
}
}
}
],
"automation": {
"conditions": [],
"actions": []
}
}
Devie profile
{
"deviceProfile": {
"id": "531bd3fb-e6fa-45ff-9e33-9b073a0385c1",
"name": "v2.1.2",
"metadata": {
"deviceType": "Vent",
"ocfDeviceType": "x.com.st.d.vent",
"deviceTypeId": "Vent",
"manufacturerName": "snug",
"mnId": "Uimh",
"vid": "d7f4abc9-bb6f-4eb6-b158-4f423b97fc6a",
"mnmn": "snug",
"presentationId": "snug.d7f4abc9-bb6f-4eb6-b158-4f423b97fc6a",
"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.co2Settings",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "snug.dustSettings",
"version": 1,
"optional": false,
"ephemeral": false
},
{
"id": "snug.temperatureSettings",
"version": 1,
"optional": false,
"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": "d7f4abc9-bb6f-4eb6-b158-4f423b97fc6a",
"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": true
}
},
{
"component": "main",
"capability": "snug.co2Settings",
"version": 1,
"values": [],
"patch": [],
"visibleCondition": {
"value": "fanMode.value",
"operator": "EQUALS",
"operand": "medium",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": true
}
},
{
"component": "main",
"capability": "snug.dustSettings",
"version": 1,
"values": [],
"patch": [],
"visibleCondition": {
"value": "fanMode.value",
"operator": "EQUALS",
"operand": "low",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": true
}
},
{
"component": "main",
"capability": "snug.temperatureSettings",
"version": 1,
"values": [],
"patch": [],
"visibleCondition": {
"value": "fanMode.value",
"operator": "EQUALS",
"operand": "high",
"component": "main",
"capability": "fanMode",
"version": 1,
"hideOnUnmatch": true
}
},
{
"component": "sensor",
"capability": "temperatureMeasurement",
"version": 1,
"values": [],
"patch": []
},
{
"component": "sensor",
"capability": "dustSensor",
"version": 1,
"values": [],
"patch": []
},
{
"component": "sensor",
"capability": "carbonDioxideMeasurement",
"version": 1,
"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": "main",
"capability": "snug.co2Settings",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "snug.dustSettings",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "snug.temperatureSettings",
"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": []
}
],
"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": []
},
{
"component": "main",
"capability": "snug.co2Settings",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "snug.dustSettings",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
},
{
"component": "main",
"capability": "snug.temperatureSettings",
"version": 1,
"values": [],
"patch": [],
"exclusion": []
}
]
},
"presentationId": "d7f4abc9-bb6f-4eb6-b158-4f423b97fc6a",
"manufacturerName": "snug"
}
}