Feature Request: Expose a Virtual Fan entity when the config button is in fan control mode

I’ve got several Blue Dimmers + Fan Canopy modules to allow for light + Fan speed control with only one hot wire. This works fantastic. The switch is bound to the canopy module for light and fan.

For the light everything is controlled via the switch. Either locally or remotely it sets the local state, which then sends the commands to the canopy and they are always in sync and you can ignore/hide the actual light state/output of the fan module. This prevents the switch and light from being out of sync.

However when you configure the config button to be fan control and you change the fan remotely they now don’t match. If you have the button on cycle for example and the fan is off, and you turn the fan on remotely to medium, and then push the button the fan will go to low, because the switch has no internal state for the fan.

I’m not sure how dynamic the endpoints of zigbee/zwave can be, but it would be amazing if there was a virtual fan endpoint that you’d use to control the switch, which would then send the zwave/zigbee commands to the bound devices as appropriate.

You might be able to do this right now, if you’re using Zigbee2MQTT and Home Assistant and you do something like this: Blue Series On/Off - Change Device Type in Home Assistant (Zigbee2MQTT) | Inovelli Help Center. There’s a bit more of an explanation of how the configuration works in How to make VZM30-SN report as a fan (or at least a switch) to Home Assistant from Zigbee2MQTT? - #5 by jones3.hardy. At least, that’s what I could glean from it, as it’s poorly documented in the Zigbee2MQTT documentation.

I don’t have a Fan Canopy module setup right now (too lazy to install it). But I do use the configuration button for some lights that are bound to it. When you press it, it generates more stuff for the MQTT discovery payload. Specifically, it’ll add something like this:

homeassistant:
  device_automation:
    "<ieee-address-of-the-device>":
      action_config_single: ...

So, I think you might get away with adding something like this to your Zigbee2MQTT configuration:

devices:
  "<ieee-address-of-the-device>":
    homeassistant:
      action_config_single:
        object_id: fan
        type: fan
      fan:
        state_topic: zigbee2mqtt/<friendly-name-for-the-fan-canopy-module>
        state_value_template: "{{ value_json.<whatever-the-fan-state-is> }}"

I don’t know if that’s actually correct, or if I’m (still) misunderstanding the Zigbee2MQTT configuration. But, you’ll want to fill in the stuff that’s in angle brackets. You might need to also set other things under devices.<ieee-address-of-the-device>.homeassistant.fan, like availability, command_topic, or anything else; since it’s referring to a different device, so the defaults might not work properly.

No, because I need the switch to be able to accept/know the new state. HomeAssistant knows the correct state of the fan output of the canopy, the issue here is the switch.

Imagine this:

You turn the fan on to high via the config button, the LED bar on the switch happily shows “full”

Now you turn the fan off via homeassisant/alexa/whatever

Now you want the fan back on and so you push the config button on the switch, which should cycle the fan from off to low, but because the switch thinks the fan is on high it now sets it to off.

From the user’s perspective nothing happens and they get annoyed.

It might seem minor, but infrastructure like “light switches” should always behave in a consistent way and the wife/spouse/child/family acceptance factor of a fan controller that (to them) doesn’t always act the same isn’t a great user experience.

Absolutely!

I originally configured mine for cycle. It sounds like the right way to do it. I mean, it basically works like a dedicated fan switch in that mode. Until another switch or the hub makes a change. Even I couldn’t deal with the inconsistency! I couldn’t even imagine the WAF, so I switched to multi-tap mode (which I dislike, but at least it’s consistent!).

And to your point about infrastructure behaving in a consistent way, I configured every config button in my house to multi-tap control the fan in that room. Even the config buttons on my fan controller switches (no canopy involved) are bound to the fan! Even if there are two Inovellis in the same box, both config buttons do the same thing. In my house it’s absolutely consistent. The “little button” always controls the fan in that room. I also turn the LED bar pink for a couple seconds to indicate you just controlled the fan rather than the light.

I sure would like to use cycle mode. It’s so much easier to explain that “it works just like the pull chain,” than to explain single, double, triple, and hold for off. But everyone’s used to it now.