Innovelli duplicate driver interfaces

I recently added three different innovelli white series switches. Both when they were initially added and every time ST is power cycled, ST generates two tiles for each. Typically, one is for light dimming and the other one is for switching. The second tile doesn’t do anything useful based upon switch configuration, but I’m curious if there is a way to prevent this from coming back when I delete it?

Those are Matter devices, right?

The driver creates child devices for each switch (endpoint?). Can please post screenshots of each device?

Yes, these are all matter devices. These switches IMO only have one end point, even if ST sees if differently. They turn on/off and two have dimmer/speed control. Below are the partial screen shots for 1) a similar screen shot for an unrelated device, similar to the duplicates I removed. and the 2) the Three devices that have this issue.

I think I understand what is happening now.

These switches actually do expose multiple Matter endpoints. Inovelli uses an additional endpoint for things such as the RGB/LED indicator, and SmartThings currently treats every non-primary endpoint that exposes an On/Off cluster as another controllable device. That’s why the Matter Switch driver creates the additional child device, and also why it comes back after you delete it.

So this isn’t really a duplicate device and deleting it won’t permanently solve it. It would need to be handled in the SmartThings Matter Switch driver.

The individual Inovelli models could be identified by their Matter Vendor ID/Product ID, but a fingerprint/profile alone probably wouldn’t be enough. The driver would also need a small device-specific exception telling it not to create a separate child for that auxiliary endpoint - or, perhaps better, map the LED endpoint into the main device as an additional component.

If you can post the device JSON for one of the affected switches, I can probably determine exactly which endpoint is becoming the extra device and what would need to be changed upstream.

Log in here, click on the device, scroll down to Raw JSON → View, paste the output here.

Ok, that sort of makes sense now. Here is one of the devices JSON:

{
  "deviceId": "55542da6-69b8-4751-a236-a1bde68d606e",
  "ownerId": "938646f4-d51c-9853-b2a5-5432c522e720",
  "name": "inovelli-vtm30-sn",
  "label": "Guest Bath Fan",
  "deviceManufacturerCode": "Inovelli",
  "manufacturerName": "SmartThingsCommunity",
  "deviceModel": "VTM30-SN",
  "presentationId": "a65b063e-1396-372a-97f3-5fb09fb0b37e",
  "locationId": "af4ecd40-c7cd-4aa3-a318-a27de3a61b38",
  "roomId": "f2de85a7-b3d1-4bc4-aa97-9f750c82e0bb",
  "components": [
    {
      "id": "main",
      "label": "main",
      "capabilities": [
        {
          "id": "switch",
          "version": 1,
          "optional": false,
          "status": {
            "switch": {
              "value": "off",
              "timestamp": "2026-08-29T13:52:50.576Z"
            }
          }
        },
        {
          "id": "switchLevel",
          "version": 1,
          "optional": false,
          "status": {
            "levelRange": {
              "value": {
                "maximum": 100,
                "minimum": 1
              },
              "unit": "%",
              "timestamp": "2026-08-27T11:55:49.582Z"
            },
            "level": {
              "value": 100,
              "unit": "%",
              "timestamp": "2026-08-29T13:45:53.556Z"
            }
          }
        },
        {
          "id": "temperatureMeasurement",
          "version": 1,
          "optional": false,
          "status": {
            "temperatureRange": {
              "value": null
            },
            "temperature": {
              "value": 73.1,
              "unit": "F",
              "timestamp": "2026-08-30T16:41:35.229Z"
            }
          }
        },
        {
          "id": "relativeHumidityMeasurement",
          "version": 1,
          "optional": false,
          "status": {
            "humidity": {
              "value": 60.49,
              "unit": "%",
              "timestamp": "2026-08-30T16:45:33.421Z"
            }
          }
        },
        {
          "id": "powerMeter",
          "version": 1,
          "optional": false,
          "status": {
            "power": {
              "value": 0,
              "unit": "W",
              "timestamp": "2026-08-30T07:32:35.280Z"
            }
          }
        },
        {
          "id": "energyMeter",
          "version": 1,
          "optional": false,
          "status": {
            "energy": {
              "value": 153.09,
              "unit": "Wh",
              "timestamp": "2026-08-29T13:52:52.769Z"
            }
          }
        },
        {
          "id": "firmwareUpdate",
          "version": 1,
          "optional": false,
          "status": {
            "lastUpdateStatusReason": {
              "value": null
            },
            "imageTransferProgress": {
              "value": null
            },
            "availableVersion": {
              "value": "1.0.3 (103)",
              "timestamp": "2026-06-16T00:27:04.789Z"
            },
            "lastUpdateStatus": {
              "value": null
            },
            "supportedCommands": {
              "value": null
            },
            "state": {
              "value": "normalOperation",
              "timestamp": "2026-06-16T00:27:04.788Z"
            },
            "estimatedTimeRemaining": {
              "value": null
            },
            "updateAvailable": {
              "value": false,
              "timestamp": "2026-06-16T00:27:04.787Z"
            },
            "currentVersion": {
              "value": "1.0.3 (103)",
              "timestamp": "2026-06-16T00:27:04.818Z"
            },
            "lastUpdateTime": {
              "value": null
            },
            "supportsProgressReports": {
              "value": null
            }
          }
        },
        {
          "id": "refresh",
          "version": 1,
          "optional": false,
          "status": {}
        }
      ],
      "categories": [
        {
          "name": "Switch",
          "categoryType": "manufacturer"
        },
        {
          "name": "Switch",
          "categoryType": "user"
        }
      ],
      "optional": false,
      "icon": "oneui/oic.d.fan"
    },
    {
      "id": "button1",
      "label": "Up Button",
      "capabilities": [
        {
          "id": "button",
          "version": 1,
          "optional": false,
          "status": {
            "button": {
              "value": "pushed",
              "timestamp": "2026-08-29T13:45:53.644Z"
            },
            "numberOfButtons": {
              "value": 1,
              "timestamp": "2026-06-16T00:27:09.894Z"
            },
            "supportedButtonValues": {
              "value": [
                "pushed",
                "held",
                "down_hold",
                "pushed_2x",
                "pushed_3x",
                "pushed_4x",
                "pushed_5x"
              ],
              "timestamp": "2026-06-16T00:27:09.896Z"
            }
          }
        }
      ],
      "categories": [
        {
          "name": "RemoteController",
          "categoryType": "manufacturer"
        }
      ],
      "optional": false
    },
    {
      "id": "button2",
      "label": "Down Button",
      "capabilities": [
        {
          "id": "button",
          "version": 1,
          "optional": false,
          "status": {
            "button": {
              "value": "pushed",
              "timestamp": "2026-08-29T13:53:20.968Z"
            },
            "numberOfButtons": {
              "value": 1,
              "timestamp": "2026-06-16T00:27:10.054Z"
            },
            "supportedButtonValues": {
              "value": [
                "pushed",
                "held",
                "down_hold",
                "pushed_2x",
                "pushed_3x",
                "pushed_4x",
                "pushed_5x"
              ],
              "timestamp": "2026-06-16T00:27:10.023Z"
            }
          }
        }
      ],
      "categories": [
        {
          "name": "RemoteController",
          "categoryType": "manufacturer"
        }
      ],
      "optional": false
    },
    {
      "id": "button3",
      "label": "Config Button",
      "capabilities": [
        {
          "id": "button",
          "version": 1,
          "optional": false,
          "status": {
            "button": {
              "value": "pushed",
              "timestamp": "2026-08-02T13:26:58.557Z"
            },
            "numberOfButtons": {
              "value": 1,
              "timestamp": "2026-06-16T00:27:09.975Z"
            },
            "supportedButtonValues": {
              "value": [
                "pushed",
                "held",
                "down_hold",
                "pushed_2x",
                "pushed_3x",
                "pushed_4x",
                "pushed_5x"
              ],
              "timestamp": "2026-06-16T00:27:09.971Z"
            }
          }
        }
      ],
      "categories": [
        {
          "name": "RemoteController",
          "categoryType": "manufacturer"
        }
      ],
      "optional": false
    }
  ],
  "createTime": "2026-06-16T00:27:03.748Z",
  "healthState": {
    "state": "ONLINE",
    "lastUpdatedDate": "2026-08-27T11:54:32.924Z"
  },
  "parentDeviceId": "6018c120-9497-4516-8abf-27d737af4d56",
  "childDevices": [],
  "profile": {
    "id": "4912e975-d098-384e-879e-8d12120cad39"
  },
  "matter": {
    "driverId": "8ec2d430-f1f0-4bb3-941d-bca78795d137",
    "hubId": "6018c120-9497-4516-8abf-27d737af4d56",
    "provisioningState": "PROVISIONED",
    "networkId": "6CEBA387042A2D0A-D52EA393A16D396F",
    "executingLocally": true,
    "uniqueId": "5A54C8C57594B34A",
    "vendorId": 4961,
    "productId": 16,
    "serialNumber": "36D94EFA5526A0FB",
    "listeningType": "ALWAYS",
    "supportedNetworkInterfaces": [
      "THREAD"
    ],
    "version": {
      "hardware": 1,
      "hardwareLabel": "2.1",
      "software": 103,
      "softwareLabel": "1.0.3"
    },
    "endpoints": [
      {
        "endpointId": 0,
        "deviceTypes": [
          {
            "deviceTypeId": 18
          },
          {
            "deviceTypeId": 22
          }
        ]
      },
      {
        "endpointId": 1,
        "deviceTypes": [
          {
            "deviceTypeId": 266
          }
        ]
      },
      {
        "endpointId": 2,
        "deviceTypes": [
          {
            "deviceTypeId": 260
          }
        ]
      },
      {
        "endpointId": 3,
        "deviceTypes": [
          {
            "deviceTypeId": 15
          }
        ]
      },
      {
        "endpointId": 4,
        "deviceTypes": [
          {
            "deviceTypeId": 15
          }
        ]
      },
      {
        "endpointId": 5,
        "deviceTypes": [
          {
            "deviceTypeId": 15
          }
        ]
      },
      {
        "endpointId": 6,
        "deviceTypes": [
          {
            "deviceTypeId": 269
          }
        ]
      },
      {
        "endpointId": 7,
        "deviceTypes": [
          {
            "deviceTypeId": 1296
          }
        ]
      },
      {
        "endpointId": 8,
        "deviceTypes": [
          {
            "deviceTypeId": 775
          }
        ]
      },
      {
        "endpointId": 9,
        "deviceTypes": [
          {
            "deviceTypeId": 770
          }
        ]
      }
    ],
    "syncDrivers": true,
    "fingerprintType": "MATTER_MANUFACTURER",
    "fingerprintId": "4961/0"
  },
  "type": "MATTER",
  "vid": "a65b063e-1396-372a-97f3-5fb09fb0b37e",
  "mnmn": "SmartThingsCommunity",
  "ocfDeviceType": "oic.d.switch",
  "restrictionTier": 0,
  "allowed": [
    "w:devices",
    "w:devices:locationId",
    "w:devices:roomId",
    "d:devices",
    "x:devices",
    "r:devices:visible"
  ],
  "indoorMap": {
    "coordinates": [
      -10,
      40,
      -238
    ],
    "rotation": [
      0,
      0,
      0
    ],
    "visible": true,
    "data": {
      "lightingGroupId": "00000000-0000-0000-0000-000000000000",
      "lastHideTime": "0.0",
      "expressionType": "only_2d"
    }
  },
  "executionContext": "LOCAL",
  "relationships": []
}

Thanks!

The switch actually has quite a few Matter endpoints, and endpoint 6 is the interesting one:

EP1 = On/Off Plug-in Unit
EP2 = Dimmable Light
EP3–5 = the three buttons
EP6 = Extended Color Light
EP7 = Mode Select
EP8 = Humidity Sensor
EP9 = Temperature Sensor

So the additional tile (child device) isn’t really a duplicate. Endpoint 6 is a genuine Matter Extended Color Light endpoint, almost certainly representing the Inovelli LED indicator. That also explains exactly why SmartThings gives the additional device On/Off, dimming and color controls.

Unfortunately, deleting it won’t solve the problem permanently because the Matter Switch driver still sees EP6 the next time it processes the device and can create the interface again. I’d just move these devices to a room called “control room” or something.

This would therefore need to be handled in the SmartThings Matter Switch driver. A dedicated fingerprint would make sense, but a profile alone wouldn’t fix this. The driver would also need device-specific logic telling it how to treat EP6.

The simplest solution would be to exclude EP6 from creation as a separate child device. An even nicer solution would be to expose it as an “LED Indicator” component of the main Inovelli device instead.

I’ve heard that the inovelli support is great, so you should contact them at tell them to get the device WWST certified.

So now we at least know exactly where the apparent duplicate comes from. :slight_smile:

Thanks for checking into this. I like the idea of moving the “dupe” to my unused room.

I’d keep these devices anyway to control the LEDs. So many possibilities…

Honestly, the extra devices don’t do anything- most of the settings are low level configurations that are hard to get set up, otherwise I’d keep them.