Blue Series Fan Switch showing as light rather than fan entity in Home Assistant

It isn’t? It seems reasonable to me that a switch that is for controlling a fan could support the Zigbee fan control cluster—but even if not, the Zigbee spec mentions “The clusters specified in this document are for use typically in ZigBee HVAC applications, but MAY be used in any application domain.” (section 6.1.1). And the description of the fan control cluster is “An interface for controlling a fan in a heating / cooling system” which certainly sounds like it fits.

In any case, using the light dimmer UI works for me, but isn’t ideal… it’d be nicer if I could get discrete off/low/med/high settings, rather than a 0 to 100% slider.

Thanks for the link, I had to go looking…I was thinking of the Zigbee Devices User Guide which gives mandatory/optional clusters according to the device type -
image

I definitely prefer the discrete options as well though, if you’re willing to control it from the dashboard, the “Light Brightness Preset Row” card you can get via HACS can be set up like this -

image

image

For the purposes of HA, could there be a toggle to set the device to a “switch” rather than a “light”? If the device shows up as a switch, we could use this helper to make it into a fan.

This was addressed earlier in the thread:

I do still have a question for @chack regarding this response, though:

You can still change all the settings by going to the device page > Manage Zigbee Device > Change to Inovelli_VZM35SN_Cluster

…where exactly do I do this? I can get to “manage zigbee device”, but where do I “change” to “Inovelli_VZM35SN_Cluster”?

No way to make that a toggle option that I’m aware of, but if you are ok with running a custom quirk, I can test changing the device type there and see if that will present it as a switch instead for you. It would be an all or nothing thing and can’t guarantee everything will work the same as I haven’t tested it, etc. If you’re interested, I’ll try to get some time this weekend.

After you select “Manage zigbee device” you’ll get this popup and just select the “Clusters” line there to change it (should be on Basic by default) -

image

Ah! Thanks so much. Seems like I’m already using the VZM35SN cluster. I would be interested in testing the custom quirk if you feel like putting it together!

So same caveat as before that I haven’t tested this (beyond confirming it changes the entity’s domain) and I don’t know that it will give you the exact same behavior.

In case you haven’t done it before, these are the ZHA config parameters and you’ll have to restart HA to apply the config. You should not need to remove and re-add the device, but you will likely end up like the below image with a greyed-out light entity that you can remove if it bothers you. It’ll also get removed if you remove/re-add the device.

image

Custom Quirk Here
"""VZM35-SN Fan Switch Custom Switch Quirk."""

from zigpy.profiles import zgp, zha
from zigpy.profiles.zha import DeviceType
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import (
    Basic,
    GreenPowerProxy,
    Groups,
    Identify,
    LevelControl,
    OnOff,
    Ota,
    Scenes,
)
from zigpy.zcl.clusters.homeautomation import Diagnostic

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)
from zhaquirks.inovelli import INOVELLI_AUTOMATION_TRIGGERS, Inovelli_VZM35SN_Cluster

INOVELLI_VZM35SN_CLUSTER_ID = 64561
WWAH_CLUSTER_ID = 64599


class InovelliVZM35SN(CustomDevice):
    """VZM35-SN Fan Switch"""

    signature = {
        MODELS_INFO: [("Inovelli", "VZM35-SN")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.DIMMABLE_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Diagnostic.cluster_id,
                    INOVELLI_VZM35SN_CLUSTER_ID,
                    WWAH_CLUSTER_ID,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                ],
            },
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                ],
            },
            242: {
                PROFILE_ID: zgp.PROFILE_ID,
                DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
                INPUT_CLUSTERS: [],
                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
            },
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Diagnostic.cluster_id,
                    Inovelli_VZM35SN_Cluster,
                    WWAH_CLUSTER_ID,
                ],
                OUTPUT_CLUSTERS: [
                    Ota.cluster_id,
                ],
            },
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: DeviceType.DIMMER_SWITCH,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                ],
            },
            242: {
                PROFILE_ID: zgp.PROFILE_ID,
                DEVICE_TYPE: zgp.DeviceType.PROXY_BASIC,
                INPUT_CLUSTERS: [],
                OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id],
            },
        },
    }

    device_automation_triggers = INOVELLI_AUTOMATION_TRIGGERS

1 Like

I think this template may help some that are wanting the device to appear as a fan inside HA. You could enable this in Google Home / Alexa and disable the light entity (I believe).

VZM35-SN Zigbee Blue Series ZHA - Fan Template For Home Assistant - How To’s & Flex Zone - Inovelli Community

So, I’ve tried the custom quirk and the template, and while they work (kind of) it seems like there’s got to be a way to use the native fan entity device type in HA. Is this a Zigbee limitation?

The good news is that the custom quirk won’t be necessary as soon as the PR makes its way through to HA. The other part of the question is explained here, but maybe someone will find a workaround:

2 Likes

The device type being considered a dimmer is something HA probably still needs to look into. I haven’t seen a pull request, but wondering if anyone has made them aware? When changing to a fan type you lose the ability to modify the fan speed. (It turns into and On/Off switch). The only change I have seen was they following:

We will be releasing a firmware update that includes another endpoint that is a fan endpoint. In zha it should have a dimmer endpoint and a fan endpoint that both control the fan. Users can disable the dimmer endpoint if they would like (or the fan endpoint). The reason we keep the dimmer endpoint is so that the device can be bound to dimmer devices and control them remotely.

@EricM_Inovelli Are there any updates to this? I’ve setup a template to emulate a fan device type, but have been unable to get the switch to update to the beta firmware.

@anthony.hamill I believe if you update to the HA that came out today, the 1.07 firmware should eventually show up. We are testing their new update method in this new release.

@EricM_Inovelli I’ve updated HASS core and it now says my firmware version is “up-to-date”, but I’m still on 1.04. I’m assuming that’s because 1.07 is still in beta.

Update - the new firmware has downloaded and the device is showing the new FW version, but I’m still only seeing the light entity.

1 Like

I was able to see the fan entity when I removed it from my zigbee network, then re-added it (now that I’m on 1.07) using ZHA. The strange thing for me is when I click to turn on, it says power at 66% (even though it’s set as on/off switch and max level is set in parameters). I noticed the same for the VZM36 module, which I do have set as a ceiling fan - it turns on at 66% too.

66 = Medium Speed. You should be able to either increase it within HA or by holding up on the switch and see it go to 100 if that’s what you’re looking for?

Yes, I can get it to go to 100, by doing that, but when I turn off then later turn back on, either via switch or HA, it always comes back to displaying 66 (medium), even though the power actually is set full.

Oh I see what you’re saying, it should be going back to the previous value, but instead it looks like turning on the fan entity goes to 50% (turns on and sends a move to level 128), which would show up as 66 or Medium Speed as it’ll get rounded up with those 3 possible speeds.

Compared with using the light entity, I see the off/on behavior respecting the previously set level. That makes me think this appears to be an issue with how that fan portion has been set up. Tagging @EricM_Inovelli for follow up/tracking.

@scottb I’m not sure yet how to fix it, but it looks like ZHA is sending a command with “medium” value when you turn the fan on. It should be sending “on” I believe. I can confirm that this doesn’t happen on Z2M.

2024-05-02 19:50:44.815 DEBUG (MainThread) [zigpy.zcl] [0x0567:2:0x0202] Sending request: Write_Attributes(attributes=[Attribute(attrid=0x0000, value=TypeValue(type=FanMode, value=<FanMode.Medium: 2>))])

If it is in On/Off mode it should only use the high speed even though the level is not showing correctly. So it shouldn’t cause any problems with the fan, but I see that it is confusing an will see if I can figure out what is going on in ZHA.