Can Device Profile choose percentage or 100 fanSpeed?

Hi,

  1. We have a product combined with a fan and light. I am working with the custom Device Profile and trying to use percentage value(0~100) to present a fanSpeed UI. However, I only can find switchLevel to present the percentage.

It works but we don’t want the “Dimmer” wording which should be “Fan speed” but I don’t don’t where to modify the wording. Please help me how to change it.

  1. Maybe in the future we need to implement N speed fan control. Is there any custom device profile supporting N speed fanSpeed? Or maybe No.1 question can be treated as a 100 speed fanSpeed?

Maybe check fan capabilities, as it has Off, Low, Medium, High, Max.

I have also seen numerical values 1-5

@nayelyz or @philh30 might be able to help

2 Likes

How many speeds does the device actually have? Is it really 100 or are you mapping the percentages to a small number of discrete speeds?

The fan controllers I’ve seen have just a few discrete speeds. The common approach to those is to include the fanSpeed capability that @milandjurovic71 showed in his post above as the visible control on the detail view, and also include the switchLevel capability (but hidden from the detail view) for compatibility with voice assistants that only support percentages. By default, the fanSpeed capability has 4 speeds (Low, Medium, High, Max) but that can be changed by creating a custom device configuration and using a combination of patch and value options in the various sections.

You should also be able to change the “Dimmer” label on the switchLevel capability through the device configuration. @nayelyz has an example here. I’ve been under the impression that changing the labels like that doesn’t play well with translations though, so if this is a product that you’re wanting supported in multiple languages then that might be a consideration. Also, if you’re planning for this device to show with a fan icon, then my observation has been that the fan icon only animates if you use the fanSpeed capability as the dashboard state.

2 Likes
  1. I followed your previous example to modify the labels. When I modified the fanSpeed label as “Fan Speed 11” for example and uploaded in device profile UI. The fanSpeed label did change in the beginning.
    But I modified to another label name like “Fan Speed33” and uploaded again. I checked the label in smartThings APP. Same after I disconnect and connected again my cloud connected account. The fanSpeed label is still the previous one. I use get a device configuration API to check. It did updated. Why my device didn’t show the latest one?
    API | SmartThings Developers
    https://api.smartthings.com/v1/presentation/deviceconfig?presentationId=ST_f19d367f-93b4-48e8-88d1-fd71fb78d489&manufacturerName=0A6z

The json response:

{
	"mnmn": "0A6z",
	"vid": "ST_f19d367f-93b4-48e8-88d1-fd71fb78d489",
	"version": "0.0.1",
	"type": "profile",
	"dashboard": {
		"states": [
			{
				"component": "fan",
				"capability": "switch",
				"version": 1,
				"idx": 0,
				"group": "main",
				"values": [],
				"composite": false
			}
		],
		"actions": [
			{
				"component": "fan",
				"capability": "switch",
				"version": 1,
				"idx": 0,
				"group": "main",
				"inline": null
			}
		],
		"basicPlus": []
	},
	"detailView": [
		{
			"component": "light",
			"capability": "switch",
			"version": 1,
			"values": [],
			"patch": []
		},
		{
			"component": "light",
			"capability": "switchLevel",
			"version": 1,
			"values": [],
			"patch": []
		},
		{
			"component": "main",
			"capability": "refresh",
			"version": 1,
			"values": [],
			"patch": []
		},
		{
			"component": "main",
			"capability": "healthCheck",
			"version": 1,
			"values": [],
			"patch": []
		},
		{
			"component": "fan",
			"capability": "switch",
			"version": 1,
			"values": [],
			"patch": []
		},
		{
			"component": "fan",
			"capability": "fanSpeed",
			"version": 1,
			"values": [
				{
					"key": "fanSpeed.value",
					"enabledValues": [],
					"label": "Fan Speed33"
				}
			],
			"patch": []
		}
	],
	"automation": {
		"conditions": [
			{
				"component": "light",
				"capability": "switch",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "light",
				"capability": "switchLevel",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "main",
				"capability": "healthCheck",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "fan",
				"capability": "switch",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "fan",
				"capability": "fanSpeed",
				"version": 1,
				"values": [
					{
						"key": "fanSpeed.value",
						"enabledValues": [],
						"label": "Fan Speed33"
					}
				],
				"patch": [],
				"exclusion": []
			}
		],
		"actions": [
			{
				"component": "light",
				"capability": "switch",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "light",
				"capability": "switchLevel",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "main",
				"capability": "refresh",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "main",
				"capability": "healthCheck",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "fan",
				"capability": "switch",
				"version": 1,
				"values": [],
				"patch": [],
				"exclusion": []
			},
			{
				"component": "fan",
				"capability": "fanSpeed",
				"version": 1,
				"values": [
					{
						"key": "fanSpeed.value",
						"enabledValues": [],
						"label": "Fan Speed33"
					}
				],
				"patch": [],
				"exclusion": []
			}
		]
	},
	"presentationId": "ST_f19d367f-93b4-48e8-88d1-fd71fb78d489",
	"manufacturerName": "0A6z"
}

Modified the json file which was dowloaded from device profile UI.

{
  "mnmn": "0A6z",
  "vid": "ST_f19d367f-93b4-48e8-88d1-fd71fb78d489",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ]
  },
  "detailView": [
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "main",
      "capability": "healthCheck",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "fanSpeed",
      "version": 1,
      "values": [
        {
          "key": "fanSpeed.value",
          "label":"Fan Speed33"
        }
      ],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "label":"Fan Speed33"
          }
        ],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "label":"Fan Speed33"
          }
        ],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}

I was trying to upload the json file through smartthings cli too:

smartthings deviceprofiles:update 5ea1709c-bf0e-4d92-a695-61635652ca22 -i deviceConfigST_f19d367f-93b4-48e8-88d1-fd71fb78d489.json
But it showed the error.

    Error: Request failed with status code 422: {"requestId":"B8108C8B-AE4B-4E71-927B-78FA7B7D6821","error":{"code":"ConstraintViolationError","message":"The request is malformed.","details":[{"code":"NotEmptyError","target":"body","message":"body can not be
    empty","details":[]}]}}
  1. Is that possible I replace switchLevel label as fanSpeed label like this? Which is much easier to realize i18n. It was not working while using the switchLevel.value, what is exact the key? I have tried both switchLevel and switchLevel.value. Both were not working!!!
{
  "mnmn": "0A6z",
  "vid": "ST_f19d367f-93b4-48e8-88d1-fd71fb78d489",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ]
  },
  "detailView": [
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [
        {
          "key": "switchLevel.value",
          "label":"{{fanSpeed.value}}"
        }
      ],
      "patch": []
    },
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "main",
      "capability": "healthCheck",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "fanSpeed",
      "version": 1,
      "values": [],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [
          {
            "key": "switchLevel.value",
            "label":"{{fanSpeed.value}}"
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [
          {
            "key": "switchLevel.value",
            "label":"{{fanSpeed.value}}"
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}
  1. What is the different between:
    smartthings deviceprofiles:update 5ea1709c-bf0e-4d92-a695-61635652ca22 -i deviceConfigST_f19d367f-93b4-48e8-88d1-fd71fb78d489.json
    and
    smartthings deviceprofiles:view:update 5ea1709c-bf0e-4d92-a695-61635652ca22 -i deviceConfigST_f19d367f-93b4-48e8-88d1-fd71fb78d489.json
    ???

  2. What does this mean cannot be certificated if using custom capabilities? I cannot publish my project if using custom capabilities? For example, modify the label or modify the discrete speed of fanSpeed capability?
    Custom Capabilities | SmartThings Developers
    Devices with custom Capabilities are not supported by the Works with SmartThings certification program at this time.

The prior label is most likely cached somewhere. Caching isn’t as bad as it used to be, but it can still cause problems. If you’re viewing on an Android device, try force stopping and clearing cache for the SmartThings app.

I don’t think so. I’m not aware of a way to change a label that doesn’t break i18n. But maybe ST staff can comment on that.

You may also want to email build@smartthings.com with some of your questions, particularly those regarding certification.

Hi, sorry for the delay.

Thanks, @philh30 so much for your collaboration, it’s highly appreciated. :smiley:

@exosite, if you want to change the range of fanSpeed, please consider that the values 0-4 have alternatives configured. This means that, instead of showing the number, it shows a “speed” related text, for example: instead of the number “4”, the app will show “Max” and instead of “1” it will show “Low”. After that, the next numbers will show the number itself, so it could cause some confusion.

As @philh30 mentioned, it could be cached, this happens mostly with the text that we can set in the labels, so we suggest you make the changes carefully. If the update is not made in the presentation itself, you might have to add/remove a capability to force the refresh.
Remember the difference between these API calls:

  1. Get the device presentation’s current configuration:
    https://api.smartthings.com/v1/presentation?presentationId=ST_f19d367f-93b4-48e8-88d1-fd71fb78d489&manufacturerName=0A6z
  2. Get the device configuration used to create a device presentation:
    https://api.smartthings.com/v1/presentation/deviceconfig?presentationId=ST_f19d367f-93b4-48e8-88d1-fd71fb78d489&manufacturerName=0A6z
    Note: This call could differ from the current configuration of the device presentation, that’s why the call in #1 is better to verify the change was received.

We don’t suggest the usage of the CLI to modify the configuration of a device profile created in the Developer Workspace because it could cause a sync conflict.

No, it cannot be changed dynamically, so, this parameter wouldn’t be accepted: {{fanSpeed.value}}

We don’t suggest using deviceprofiles:view now as its functionality isn’t complete.
See this post: Device Profile created from the CLI is incomplete - #14 by andresg

It means that any capabilities you created directly using the ST API are not accepted in the certification process. Even if you made the certification request, it will be rejected.
But, as mentioned in a previous post, modifying the label of the capability would override the translation, so, the text shown there would be static for every language.
Also, other things to consider if you use a capability for a different purpose than the one it was made for are:

  1. It will confuse other integrations like voice assistants because it will use the default configuration (range and usage)
  2. In this case, the testing team for the certification would need guidance to understand the expected result from your integration and that’s not supported either.

What do you mean by this? You mentioned it is handled based on the percentage of speed, isn’t it? That means 0-100, would the range increment in other cases?

I would need to check if modifying the range of the fanSpeed capability can be accepted for certification because of the alternatives configured.

1 Like

My understanding is that he is looking to set up 5 speed, or 7 speed, or 10 speed, or how many speeds fan actually has (n). It can be expected that some fans have more then 4 speeds, or even linear speed.

Maybe his fan “goes to 11” :slightly_smiling_face:

Some fans have 3 speeds plus Breeze, which is random mix of all 3

Hi,

Let me explain in more detail.
The product is combined with a fan and a light. Both are handled based on percentage(0~100).
Let us focus on the fan. I am considering two capabilities to control the fan, switchLevel or fanSpeed.

  1. switchLevel capability

The range is between 1~100.

Since my purpose is to replace the ‘Dimmer’ word to ‘Fan Speed’ for capability switchLevel. I have successfully change the switchLevel label to ‘Fan Speed’ just by using the key of fanSpeed. Here is my deviceProfile json file.

{
  "mnmn": "0A6z",
  "vid": "ST_0632f131-2a46-4035-a135-c346f5764c73",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ],
    "basicPlus": []
  },
  "detailView": [
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switchLevel",
      "version": 1,
      "values": [
        {
          "key": "level.value",
          "label":"___PO_CODE_CAPABILITY.SMARTTHINGS.FANSPEED_DEFAULT"
        }
      ],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switchLevel",
        "version": 1,
        "values": [
          {
            "key": "level.value",
            "label":"___PO_CODE_CAPABILITY.SMARTTHINGS.FANSPEED_DEFAULT"
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switchLevel",
        "version": 1,
        "values": [
          {
            "key": "level.value",
            "label":"___PO_CODE_CAPABILITY.SMARTTHINGS.FANSPEED_DEFAULT"
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}

And the result is like this. As you can see the fan speed label is implemented and can show Traditional-Mandarin and English.


Would like to know if there’s any impact for any function? Like you mentioned voice control or certification.

The five dots represent 10% 30% 50% 70% 90% by default. Can I change to 0% 25% 50% 75% 100% for example? If it can be done. Can you provide me device profile json example?

  1. fanSpeed capability
    If using fanSpeed capability I have to do mapping percentage to discrete speed. Ex: 33% speed 1, 66% speed 2, 100% speed 3. Or 25% speed 1, 50% speed 2, 75% speed 3, 100% speed 4. Since the default of fanSpeed is 4 speed, If I would like to use 3 discrete speed I need to modify the device profile json like this? I need to do the same change in detailView, automation and actions, right?
{
  "mnmn": "0A6z",
  "vid": "ST_f19d367f-93b4-48e8-88d1-fd71fb78d489",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ]
  },
  "detailView": [
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "main",
      "capability": "healthCheck",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "fanSpeed",
      "version": 1,
      "values": [
        {
          "key": "fanSpeed.value",
          "label":"Fan Speed Label test",
          "range": [
            0.0,
            3.0
          ]
        }
      ],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "label":"Fan Speed Label test",
            "range": [
              0.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "main",
        "capability": "healthCheck",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "label":"Fan Speed Label test",
            "range": [
              0.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}

As you mentioned if OVER 4 discrete speeds will impact the voice control or certification?? If the device profile is customized to BELOW 4 speed, is it fine for certification?

Sorry, but even though you achieved this, the purpose of the switchLevel capability isn’t changing the speed of a fan.
So, it won’t be accepted in the WWST program. The same happens with changing the range of the fanSpeed capability, currently, only the values 0 - 4 are supported.

No, those extra buttons are part of the custom UI of the SwitchLevel capability.

You could use this option so you have more speeds that the user can configure. I’m checking with the team if reducing the range to lower than 4 is acceptable, I think from 4 to 3 there’s not much difference because the available values would still be Low, Medium, High.

@nayelyz
I would like to try to change the fanSpeed range to 0~3 or 1~3 and because you said after I uploaded my device profile json file, there is cache there. I would like to know for how long I need to wait? I recreated a device profile every time to try my change and uploaded json file again and again but nothing happened in SmartThings APP UI!

Could you tell me what exactly the setting is to change the range of fanSpeed capability?

  1. fanSpeed range 1~3.
{
  "mnmn": "0A6z",
  "vid": "ST_dc1b860a-b062-43d1-b1d8-f16f1259d6d2",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ],
    "basicPlus": []
  },
  "detailView": [
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "fanSpeed",
      "version": 1,
      "values": [
        {
          "range": [
            1.0,
            3.0
          ]
        }
      ],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "range": [
              1.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "range": [
              1.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}
  1. fanSpeed range 0~3. Is the "key": "fanSpeed.value" needed or not???
{
  "mnmn": "0A6z",
  "vid": "ST_3b5184cb-2b58-4c82-8dd9-ce64f9d37c3d",
  "version": "0.0.1",
  "type": "profile",
  "dashboard": {
    "states": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main",
        "composite": false
      }
    ],
    "actions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "idx": 0,
        "group": "main"
      }
    ],
    "basicPlus": []
  },
  "detailView": [
    {
      "component": "main",
      "capability": "refresh",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "fan",
      "capability": "fanSpeed",
      "version": 1,
      "values": [
        {
          "key": "fanSpeed.value",
          "range": [
            0.0,
            3.0
          ]
        }
      ],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switch",
      "version": 1,
      "values": [],
      "patch": []
    },
    {
      "component": "light",
      "capability": "switchLevel",
      "version": 1,
      "values": [],
      "patch": []
    }
  ],
  "automation": {
    "conditions": [
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "range": [
              0.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ],
    "actions": [
      {
        "component": "main",
        "capability": "refresh",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "fan",
        "capability": "fanSpeed",
        "version": 1,
        "values": [
          {
            "key": "fanSpeed.value",
            "range": [
              0.0,
              3.0
            ]
          }
        ],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switch",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      },
      {
        "component": "light",
        "capability": "switchLevel",
        "version": 1,
        "values": [],
        "patch": [],
        "exclusion": []
      }
    ]
  },
  "migration": true
}

Yes, this is the correct configuration:

{
  "component": "main",
  "capability": "fanSpeed",
  "version": 1,
  "values": [
    {
      "key": "fanSpeed.value",
      "range": [
        1,
        3
      ],
      "step": 1
    }
  ],
  "patch": []
}

I used your presentation ST_3b5184cb-2b58-4c82-8dd9-ce64f9d37c3d directly in a device and it doesn’t have the limit, so, in this case, the configuration isn’t cached, the device config is incorrect.

Hi @nayelyz

May I ask fanSpeed range 0~3 or 1~3 can pass the certification program?? Please check for us. Because someday we will apply for certification.

Hi @andresg or @nayelyz,

Still waiting…

Could you please confirm customizing fanSpeed range 0~3 or 1~3 by uploading customized device config JSON file can pass the certification program?? Our team needs to make sure it can pass the certification. Thanks.