I see the same behavior, with the same setup (zwavejs, c8+pro) I also see the additional rub of when commanded digitally to turn on every other time it will report back as being OFF after going on for 1/2 second or so. The light remains on even though hubitat shows off.
Issue both the dim level reporting as 255, and the toggling back to off only happen when interacting with lights though hubitat not at physical switch.
This behavior is consistent between 2 different c8-pro hubs with zwavejs running on them.
This is a pretty lame work around, but what one can do is use the "Generic Z-Wave Plus Dimmer" driver. This fixes these gremlins though you lose access to a bunch of what makes inovelli switches great.
UPDATE:
Even the generic driver has this issue, however unlike the innovelli one it quickly correct to the correct value:
level 17 9/21/2025 8:16:17.468 pm
switch on 9/21/2025 8:16:17.111 pm
level 255 9/21/2025 8:16:17.110 pm
The 1/2s delay before switch reports off is caused by the innovelli's "short delay" between sending commands. When I change the "short delay" from 500ms to larger values, the false reporting of "off" is also delayed.
def on() {
if (infoEnable) log.info "${device.displayName} on()"
state.lastCommandSent = "on()"
state.lastCommandTime = nowFormatted()
def cmds = []
cmds += zwave.basicV2.basicSet(value: 0xFF)
cmds += zwave.basicV2.basicGet()
if (debugEnable) log.debug "${device.displayName} on $cmds"
return delayBetween(cmds.collect{ secureCmd(it) }, shortDelay)
}
This leads me to believe something is wrong with the basic get and basic set in ZWaveJS, as 0xFF is 255, which should map to 100%.
Here is the logs, with the short delay set to 5 seconds.
dev:13872025-09-21 08:50:18.450 PMdebugLoft track lights long wall on [BasicSet(value:255), BasicGet()]
dev:13872025-09-21 08:50:18.564 PMdebugParsed {"cc":32,"cmd":3,"ep":0,"values":[{"commandClass":32,"commandClassName":"Basic","endpoint":0,"newValue":255,"prevValue":0,"property":"targetValue","propertyName":"targetValue"}]} to BasicReport(value:0, targetValue:255, duration:0)
dev:13872025-09-21 08:50:19.935 PMdebugParsed {"cc":133,"cmd":3,"ep":0,"values":[{"request":{"args":[4],"command":"endpoint.invoke_cc_api","commandClass":133,"endpoint":0,"messageId":"expected8175","methodName":"getGroup","nodeId":162},"response":{"maxNodes":10,"nodeIds":[]}}]} to AssociationReport(groupingIdentifier: 4, maxNodesSupported: 10, reportsToFollow: 0, nodeId: [])
dev:13872025-09-21 08:50:21.587 PMdebugParsed {"cc":38,"cmd":3,"ep":0,"values":[{"commandClass":38,"commandClassName":"Multilevel Switch","endpoint":0,"newValue":99,"prevValue":0,"property":"currentValue","propertyName":"currentValue"}]} to SwitchMultilevelReport(value: 99, targetValue: null, duration: null)
dev:13872025-09-21 08:50:23.617 PMdebugParsed {"cc":32,"cmd":3,"ep":0,"values":[{"commandClass":32,"commandClassName":"Basic","endpoint":0,"newValue":255,"prevValue":255,"property":"targetValue","propertyName":"targetValue"},{"commandClass":32,"commandClassName":"Basic","endpoint":0,"newValue":99,"prevValue":0,"property":"currentValue","propertyName":"currentValue"}]} to BasicReport(value:99, targetValue:255, duration:0)
The inovelli driver uses its dimmerEvents method to parse messages from the switch. Taking the above logs We get the following 3 events
0 seconds BasicReport(value:0, targetValue:255, duration:0) // Results in On, with a level of 255
3 seconds SwitchMultilevelReport(value: 99, targetValue: null, duration: null) // Results in Off with a level of unchanged (255)
5 seconds BasicReport(value:99, targetValue:255, duration:0) // Results in On with a level of 255
private dimmerEvents(hubitat.zwave.Command cmd, type="physical") {
def value = (cmd.targetValue ? "on" : "off")
def result = [sendEvent(name: "switch", value: value, type: type)]
if (cmd.targetValue) {
result += sendEvent(name: "level", value: cmd.targetValue, unit: "%", type: type)
}
return result
}