VTM30-SN simulated dimming not visible to Home Assistant or other controllers

Firmware: 1.0.5 | HA: 2026.8.2 | Matter Server: 1.4.0 (matter.js 0.17.9) | Transport: Thread (SkyConnect)


Goal

I’m using a VTM30-SN to control a bathroom with smart bulbs and an exhaust fan. I chose the on/off switch over the dimmer (VTM31-SN) for two reasons: I want the load going through a real relay (these are smart bulbs, so I don’t need or want phase-cut dimming), and I need the built-in humidity sensor for fan automations.

The plan is to use Smart Bulb Mode (relay always on, so bulbs stay powered) with the switch mode set to Dimmer, so the paddle’s simulated dimming drives a brightness level that Home Assistant can pick up and forward to the bulbs via automations.

The switch itself works great in this configuration. Holding the paddle ramps a virtual brightness level (0-254), the LED bar displays it, and the level is exposed over Matter through the LevelControl cluster on endpoint 1.

Problem

Home Assistant still shows the VTM30-SN as a plain on/off switch entity when it is configured as a simulated dimmer. There is no brightness slider, no dimming control, nothing. The simulated dimming level is completely invisible.

I’ve tried re-interviewing the node, removing and re-adding the device, and toggling Smart Bulb Mode on and off. Nothing changes. The switch always appears as on/off only.

Investigation

I dug into the raw Matter attributes to figure out what’s going on.

The switch exposes a working LevelControl cluster. Endpoint 1 has a LevelControl cluster (cluster 8) with a full range of 1-254. I can write to it (MoveToLevel(100) succeeds and reads back 100), and I receive real-time push notifications when the paddle changes the level. This isn’t a stub; it’s fully functional.

The problem is the declared device type. Every Matter device declares a “device type” on each endpoint, and controllers use that to decide what kind of entity to create. Endpoint 1 declares itself as 0x010A (On/Off Plug-in Unit).

The Matter spec allows LevelControl as an optional cluster on 0x010A, but with a caveat. From the Matter Device Library Specification (section on On/Off Plug-in Unit):

The inclusion of the Level Control cluster on this device is recommended to provide a consistent user experience when the device is grouped with additional dimmable lights and the “with on/off” commands are used. For this device, since its only states are on or off, if the Level Control cluster is implemented, it SHALL NOT have any effect on the actual light level except for those commands that cause an on/off state change, that is, the “with on/off” commands.

— Matter Device Library Specification R1.4, §5.1 “On/Off Plug-in Unit”, p. 48

In other words, LevelControl on a 0x010A device is supposed to be decorative: a no-op that lets the device play along with group dimming commands without actually doing anything.

Home Assistant explicitly enforces this. In May 2024, HA merged PR #116108 to handle this exact pattern. A Leviton D215S on/off switch was showing up as a dimmable light because it had an optional LevelControl cluster, even though its dimming was decorative. The fix deliberately suppresses brightness controls on 0x010A endpoints, even when LevelControl is present:

“A Matter OnOff light device type may only be discovered as a plain light with on/off controls, so no brightness controls, even if the levelcontrol cluster is present.”

That fix was correct for the Leviton. Its LevelControl really is a no-op. But the VTM30-SN’s LevelControl is functional: the simulated dimming feature depends on it. The same rule that correctly handles the Leviton also hides the VTM30-SN’s dimmer.

Other controllers (Google Home, Apple Home, SmartThings) follow the same logic. If the device type says on/off, the dimmer is ignored.

Evidence that LevelControl is functional, not decorative
  1. MoveToLevel(100) on endpoint 1 is accepted, reads back 100
  2. A start_listening subscriber receives attribute_updated events within 1 second of paddle changes
  3. Holding the paddle moved the level from 254 down to 62, then back up. The paddle is a dimmer, not just on/off
  4. The switch’s own LED bar displays the brightness level during dimming
  5. Forcing a re-interview with Switch Mode set to Dimmer still reports 0x010A. The device type is hardcoded and doesn’t change based on the mode setting

Raw descriptor:

Endpoint 1 / Cluster 29 (Descriptor):
  DeviceTypeList: [{"0": 266, "1": 1}]   ← 266 = 0x010A
  ServerList:     [3, 4, 6, 8, 29, 64, 65, 305134641]
                             ↑ cluster 8 = LevelControl

Endpoint 1 / Cluster 8 (LevelControl):
  FeatureMap: 3 (OnOff + Lighting)
  CurrentLevel: 254, MinLevel: 1, MaxLevel: 254

Endpoint map (fw 1.0.5):

EP Device Type Role
1 0x010A On/Off Plug-in Unit Load relay + simulated dimmer (LevelControl FM=3)
2 0x0104 Dimmer Switch Binding client
3,4,5 0x000F Generic Switch Paddle up/down/config
6 0x010D Extended Color Light RGB LED bar
7 0x0510 Electrical Sensor Power/energy
8,9 0x0307, 0x0302 Humidity, temperature
20-29 0x0027 Mode Select Config parameters

Proposed Solution

Make endpoint 1’s device type reflect the current Switch Mode setting:

  • Switch Mode = On/Off → keep 0x010A (On/Off Plug-in Unit). In this mode, the LevelControl cluster really is decorative, exactly the way the spec describes. The current behavior is correct here.
  • Switch Mode = Dimmer → change to 0x010B (Dimmable Plug-in Unit). The spec defines this as a device “capable of being switched on or off and have its level adjusted.” LevelControl is mandatory on 0x010B, which matches what the switch actually does in dimmer mode.

Every major controller already maps 0x010B to a dimmable light entity. Controllers would need to re-interview the node after a mode change to pick up the new device type, but that’s the correct behavior. No controller-side code changes would be needed.

Why a Firmware Fix?

Home Assistant’s decision to suppress brightness on 0x010A endpoints is deliberate and correct per the spec. The spec says LevelControl on 0x010A “shall not have any effect on the actual light level.” HA is following the standard.

Asking HA to add a vendor-specific exception for Inovelli would be a workaround, not a fix. It wouldn’t help users on Google Home, Apple Home, SmartThings, or any other controller that follows the same logic. Every platform would need its own workaround for the same underlying issue.

The root cause is that the firmware always declares 0x010A regardless of the Switch Mode setting. When simulated dimming is active, that tells controllers “my dimmer is decorative, ignore it,” when it’s anything but decorative. Having the device type follow the Switch Mode setting fixes it everywhere, for every controller, in one place.


Thanks much for your time. I’m happy to help debug or test new firmware, just let me know.

I think this change would be an issue for users that use the White On/Off switch as (well) an actual On/Off switch to control a load directly.

Unless the flexibility to change the Matter device type in HA after pairing exists (which is a capability I have not so far seen) then existing users would have a Dimmer representation for an On/Off switch. I would consider this to be absolutely undesirable.

Now in HA that can be fixed since a dimmer can be published as an on/off switch using a template (and I do that for a number of my Dimmer switches that work in On/Off mode ) however in other platforms (Apple Home/Google etc) it cannot. I believe that removing an existing behaviour from existing users is always a really bad idea.

So I think the question is can the VTM30’s Matter device type be changed AFTER pairing (or the device type changed before pairing which then defines the paired device type). If neither cannot I would see your change as a bad idea.

I believe that you and I are in agreement. Ideally the switch would remain as it currently is when it’s in the regular on/off mode. However, once configured into dimmer mode, it would report itself via Matter as a dimmer instead. A re-negotiation (supported by Home Assistant, unsure about other platforms) or re-adding the switch would pick up this change and display it as a dimmer.

I suppose that one point I am trying to make here is that when the on/off switch is configured as a simulated dimmer, there’s no way to use that functionality in smart home apps… so what is the purpose of the mode? At present it seems to be entirely useless. Correct me if I am wrong.

As far as I’m aware, this type of re-negotiation is not supported by other platforms (or if it is I have not heard of it). If it is supported then hopefully someone here can provide some input.

The only “platform independent” way for this to be achieved as far as I can see would be configure the On/Off switch as a "dimmer’ before it was paired and have it pair that way. This would work with all platforms. However it would be a complete change from the way that Inovelli provisions their devices and I have no idea how big the software impact would be and I also don’t have any idea how practical (from a cost benefit point of view) it would be.

This is something @EricM_Inovelli and the rest of the Inovelli team would need to think on.

We have explored recomissioning as dimmer vs dimmer and have not found a way to do it. The On/Off does have the Level Control cluster with current level on EP1, but because of the device type HA and other systems do not expose it to the user. In HA there is likely a way to manually expose it, but I am not sure how to do that. It would probably require some type of device specific override.

Eric,

Have you taken a look at what it would take to change a new setting (say “Smart Bulb Enable with Simulated Dimming”) setting prior to pairing and then have the VTM30 pair as a dimmable light rather than a non-dimmable light? My thought is that once that value was set and the device paired the value would be read-only requiring a delete and re-pair to change again.

We discussed it heavily during the initial beta testing and product development but we we’re unable to find a way to do it. Product certification requires a primary device type which I believe what is being used to create its entities in HA. Changing it with something like a button combo would likely cause the device to show as unsupported during commissioning because it wouldn’t match what is in the DCL. HA might not complain, but Apple Home, Google, etc would.

I had (or maybe this has been brought up before) another idea to create another endpoint to act as a dimmer. It would show up in HA, Apple Home, etc as another controllable endpoint but you could easily disable the On/Off device or hide it and just keep the dimmable device.

I am still pretty sure you could “hack” HA to show the levelControl / currentLevel as a dimmable endpoint but that would only be a solution for HA.

@MakaniKai I had chatgpt create a custom integration that will create a light device to use in your case.

InovelliUSA/inovelli-matter-switch-to-dimmer: Inovelli Matter Switch-to-Dimmer is a Home Assistant custom integration that creates a virtual brightness light for an existing Matter endpoint, even when Home Assistant normally exposes that endpoint only as an on/off switch.

The node ID can be retrieved from the matter server interface, and the endpoint will be “1” on the VTM30-SN.

We will continue to look at a firmware solution, but this should help in the meantime.

This is excellent (and an “above and beyond” contribution) and in a quick test this morning it works as advertised!

Dimming from the “light device” matter’s Level control “CurrentLevel” lined up with the light device dimming level in HA and with the LED bar on the VTM30.

However dimming from the paddle the “CurrentLevel” did not match the position of the LED bar. This was whether the “light device” was programmed or not. Note all animations and all bindings associated with the switch were disabled/removed for the test.

The VTM30 has firmware 1.0.5, has “Smart Bulb Enabled” and the "Dimming Speed’ was set to 1 sec. The results are easily duplicated and seems to get worse the more times you dim up or down.

Here are some (not so great screenshots). The first shows the a “CurrentLevel” of 41 on the HA Matter UI but the bar position on the VTM30 is much higher than would be expected. The LED bar dims up and down as expected, however the “CurrentLevel” displayed in HA lags behind.

This is a close-up of the same LED bar (nothing changed from the first picture so the CurrentLevel in HA is still showing 41).

This is the “correct” position of the LED bar when the CurrentLevel is set to 41 manually via the MatterUI.

Let me know if I can provide further info.

One other observation. When the LED bar and “CurrentLevel” do not match, turning the switch off and back on again will return the bar to the previous position but will also change the CurrentLevel in HA to a value that matches the bar position.

Interesting, I also see this on the VTM31 (haven’t tested other devices). I think it is less obvious with a dimming speed of 3s (which is what I was initially testing). I believe the proper description of this bug would be that the “LED bar and load output (tested with multimeter) do not match what currentLevel reports”. CurrentLevel is used to determine the % in the various hubs so I am a little surprised this hasn’t been noticed yet.

I’ll give it a try at 3secs and see how it behaves.

You are correct, it’s much less visible. However the issue is still there.

@MakaniKai Have you tried the integration that @EricM_Inovelli generated?

I gave it a try and it seems to work very well for the application that you described.

Yep, we have figured out the root cause and it will be fixed in the next update.

Great… happy to try it as soon as you have something.

Should be fixed in the latest VTM30-SN update:

Index of /firmware/VTM30-SN/Beta/1.0.6r1

The whole changelog is here:

White Series On/Off Firmware Changelog | VTM30-SN - Innovation & Firmware Discussion / Firmware Development & Changelogs - Inovelli Community

Eric,

Just tried it. Seems to work just fine now. I’ll do more testing in the morning.

Andrew

Tried it again this morning. Can’t break it now. Also paddle response appears better (it was fine for me before).

Hi! Sorry for the delayed response. Yes, the plugin works great for exposing the dimming level! I have the switch controlling my lights now :slight_smile:

My current challenge is getting it to be more responsive with my Nanoleaf Matter/Thread bulbs. Currently there’s about a 1 second delay between clicking the ‘on’ button and Home Assistant turning the bulbs on. Same for turning off. I am not certain where the delay lies yet, but I am suspecting it’s on the switch somewhere because I am coming from a Lutron Caseta Pico switch which was nearly immediate when the ‘on’ button was pressed.

I also am having problems with the dimmer not reporting its level as quickly as I’d like, so holding the button down makes the lights “step” in brightness every ~0.5-1 seconds rather than gradually increase.

Do you think the beta you talked about might help with either of these? Anyway, it’s a bit out of scope of this thread so I can make a new thread later if I can’t solve the issue.

Thanks very much for all the attention on this thread! I am impressed with the support!!