Zigbee Fan Canopy Module | Project Cheryl

Based on prior postings here, the 2.17 driver is required for the VZM31-SN to support separate bindings to the light and fan on the canopy.

I might have taken an older version and made some more current changes to it (like the fingerprint). I am looking into it with the beta testers.

1 Like

I was just able to update to 2.17 firmware

ok, it didnt take me long to see that in the main driver… the endpoint #2 (fan) ZigBee reporting bind, was commented out… and of course that means the child would never know the speed(level) and switch state of the fan… so something is up with this… i do have it working but its not polished driver
for sure, the LED stuff for the fan endpoint, needs to be removed and other parameters need clean up, like Quick Start for the fan… etc

mitch

Any help/input here, inovelli, anyone?

I know that the answer to #2 is that yes, you could use the lzw36 to control the vzm36 through scene control. (Maybe @Eric_Inovelli could help with #1). Also for #2, you could probably setup automations to set the “level” of the lzw36 to match the level of the vzm36 so that the LED bar would reflect the level. For example you could setup a rule to do something like:

When light up button is held, increase brightness on light of the vzm36 and stop increasing when released.
When light down button is held, decrease brightness on the light of the vzm36 and stop when released.

Do something similar for the fan buttons.

Then a separate rule could run a few seconds after adjusting the level to make sure the led bar is where it should be. This is a rough idea of what to do and I feel like there may be a post somewhere with more details. There also may be other ways to accomplish it that the community might be aware of.

Edit: Here is the table to use for button mappings. I am going to look some more to see if someone has a screenshot of the rule. Hubitat LZW36 Button Controller pushed/held mappings to switch taps/holds? - Switches / General Discussion - Inovelli Community

happy to report, with VZN31-SN bindings to the VZM36 work CORRECTLY now with VZN31-SN at FW 2.17
Thank you Inovelli

@EricM_Inovelli :slight_smile:

2 Likes

Yes, I will add it to the HPM. I have been researching if there is a specific way to do this with child drivers or if they are just listed as individual drivers.

2 Likes

where can one find the 2.17 firmware?

I’ve looked here:

https://github.com/InovelliUSA/Firmware/tree/main/Blue-Series/Zigbee/VZM31-SN-2-1-Switch and Blue Series 2-1 Switch • Firmware Changelog | Inovelli Help Center with no success.

Thank you!

Where do I find 2.17 firmware? I don’t see anything past 2.14 (beta folder) or 2.15 (prod folder). As an aside I can’t even get the device to update to one of those using the several different methods I’ve found in documentation (I’m on 2.08).

The whole experience with this canopy has been frustrating.

I also have a VZN31-SN that’s stuck on an older firmware (2.08) and am unable to update via ZHA on Home Assistant. I tried upgrading to 2.15 using the Inovelli guide: How to Update Firmware With Home Assistant (ZHA), but it doesn’t seem to respond. Home Assistant logs didn’t yield anything useful. As an aside, this switch is one of the refurbished models. I think it was from the batch with antenna issues, if that is of any consequence.

Additionally, I tried using the zha_toolkit to force the update, but got a Python object error:

''OTA' object has no attribute '_listeners'' for service call [...]

I don’t really have time to debug that right now.

In my searching for answers, I came across an interesting PR on the Home Assistant Github project that I think may have something to do with this. I tried using the suggested allow_advanced_ota_dir parameter, but the Blue 2-1 still ignored my manual attempts to update.

1 Like

how i got 2.17, was directly in hubitat, i clicked on the update firmware for the main device

This is the way! :slight_smile:

Forcing Zigbee2MQTT to check for an update results in “No update available”. Additionally, the table here What is the Latest Firmware Version for Your Device? | Inovelli Help Center still says that 2.15 is the latest version, and 2.17 does not appear in https://files.inovelli.com/firmware/firmware.json which is where Z2M checks for updates.

@EricM_Inovelli

Can you look into getting Blue 2-1 2.17 Firmware posted into github for users. I was able to update via Hubitat, but Home Assistant people can’t as its not in github.

Hubitat must be pulling the firmware from another source than github. (Inovelli, imageFileName:122F-0101-01020211, fileVersion:01020211)

Thanks!

Firmware has not been released yet for all users. Actually I was only trying to allow some users with the keep-alive problem on Hubitat a chance to test the solution in that firmware. There isn’t a way for Hubitat users to manually install a Zigbee firmware like there is on Z-Wave. Hang tight as it will be a little bit before I announce the firmware.

In habitat I was able to update to 2.17 using the device option update firmware button. So I am all good and up and running with the 2-1 switch and canopy. I was more for the HA people that needed it.

I know you are working hard to get this all straightened out and really appreciate all the hard work you all do. :blush:

1 Like

@almulder did you update firmware or driver? I believe the 2.17 reference is for a driver, but the latest driver available on github is still 2.15 https://github.com/InovelliUSA/Hubitat/blob/master/Drivers/inovelli-dimmer-blue-series-vzm31-sn.src/inovelli-dimmer-blue-series-vzm31-sn.groovy

Ok, I’m not sure what happened. I thought maybe a more recent driver got overwritten with an older one, but I can’t seem to sort that out with all of the changes in the beta repo. There were also two different versions of the driver floating around at one point and I am not sure if they got swapped. We will probably have to redo some of the changes if that is that case so I’ll work on that and cleaning things up. If anyone wants to give me info on any changes you have currently made let me know so I don’t have to redo them.

@ckowalski I have added the driver to Hubitat Package Manager. I just added each one (the main and the two child devices) into the manifest and it looks like HPM was able to determine that they were parent / child drivers. That was a nice surprise.

Thanks @EricM_Inovelli

I think there are 3 critical changes:

  1. Enable level reporting by the fan

and then

(Note corrected the line numbers in the quote).

  1. Fix cycleSpeed for dumb fans. :wink:
  1. Fix setSpeed to play nice with HomeBridge with “dumb fans”
def setSpeed(value) {  // FOR FAN ONLY
    if (infoEnable) log.info "${device.displayName} setSpeed(${value})"
    state.lastCommandSent =                        "setSpeed(${value})"
    state.lastCommandTime = nowFormatted()
	def currentLevel = device.currentValue("level")==null?0:device.currentValue("level").toInteger()
	if (device.currentValue("switch")=="off") currentLevel = 0
	boolean smartMode = device.currentValue("smartFan")=="Enabled"
	def newLevel = 0
    def cmds = []
    switch (value) {
        case "off":
            //cmds += zigbee.off(shortDelay) 
            cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 6 0 {}"
            break
        case "low": 
            //cmds += zigbee.setLevel(smartMode?20:33)
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(smartMode?20:33),2)} 0xFFFF}"
            break
        case "medium-low":             //placeholder since Hubitat natively supports 5-speed fans
            //cmds += zigbee.setLevel(40) 
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(smartMode?40:33),2)} 0xFFFF}"
            break
        case "medium": 
            //cmds += zigbee.setLevel(smartMode?60:66) 
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(smartMode?60:66),2)} 0xFFFF}"
            break
        case "medium-high":            //placeholder since Hubitat natively supports 5-speed fans
            //cmds += zigbee.setLevel(80)
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(smartMode?80:66),2)} 0xFFFF}"
            break
        case "high": 
            //cmds += zigbee.setLevel(100) 
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(100),2)} 0xFFFF}"
            break
        case "on":
            //cmds += zigbee.on(shortDelay)
            cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 6 1 {}"
            break
		case "up":
			if      (currentLevel<=0 )  {newLevel=20}
			else if (currentLevel<=20)  {newLevel=(smartMode?40:60)}
			else if (currentLevel<=40)  {newLevel=60}
			else if (currentLevel<=60)  {newLevel=(smartMode?80:100)}
			else if (currentLevel<=100) {newLevel=100}
            //cmds += zigbee.setLevel(newLevel)
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(newLevel),2)} 0xFFFF}"
			break
		case "down":
			if      (currentLevel>80) {newLevel=(smartMode?80:60)}
			else if (currentLevel>60) {newLevel=60}
			else if (currentLevel>40) {newLevel=(smartMode?40:20)}
			else if (currentLevel>20) {newLevel=20}
			else if (currentLevel>0)  {newLevel=currentLevel}
            //cmds += zigbee.setLevel(newLevel)
	        cmds += "he cmd 0x${parent.deviceNetworkId} 0x${device.deviceNetworkId?.substring(device.deviceNetworkId.length()-2)?:"00"} 0x0008 0x04 {${zigbee.convertToHexString(convertPercentToByte(newLevel),2)} 0xFFFF}"
			break
    }
    if (debugEnable) log.debug "${device.displayName} setSpeed $cmds"
    sendHubCommand(new HubMultiAction(delayBetween(cmds, shortDelay), Protocol.ZIGBEE))
}
2 Likes