GE Enbrighten Fan Controller - Incorrectly Reporting On/Off State

I have a GE Enbrighten Fan Controller (Model #55258 / ZW4002; Running Firmware 5.50). I’m using the HUBZ controller (Silicon Labs).

All of the commands that I send to the node work as expected, but I’m noticing a strange behavior in the Home Assistant UI that is related (I believe) to the Fan Controller reporting its state too fast.

The logs are attached, but what it looks like is the following:

  • HA sends an “off” command
  • Controller begins turning off
  • HA asks for the state of the fan controller
  • Fan controller has not completed turning off, and reports that it is still on
  • HA reverts the state of the on/off toggle in the UI

If I click the toggle a second time, it “sticks” in the correct position.

I am using the VirtualBox VM image, Z-Wave JS installed & configured via the Supervisor.

Logs from an attempted “off” toggle (fan started in the “on” state)

2021-08-29T18:56:37.433Z DRIVER » [Node 005] [REQ] [SendData]
                                  │ transmit options: 0x25
                                  │ callback id:      97
                                  └─[MultilevelSwitchCCSet]
                                      target value: 0
2021-08-29T18:56:37.458Z DRIVER « [RES] [SendData]
                                    was sent: true
2021-08-29T18:56:37.473Z DRIVER « [REQ] [SendData]
                                    callback id:     97
                                    transmit status: OK
2021-08-29T18:56:37.491Z CNTRLR   [Node 005] Scheduled poll canceled because value was updated
2021-08-29T18:56:37.492Z DRIVER « [Node 005] [REQ] [ApplicationCommand]
                                  └─[MultilevelSwitchCCReport]
                                      current value: 99

Now, the log after pressing the toggle again in the UI (fan is “off”, but UI thinks it is “on”):

2021-08-29T18:57:41.324Z DRIVER » [Node 005] [REQ] [SendData]
                                  │ transmit options: 0x25
                                  │ callback id:      98
                                  └─[MultilevelSwitchCCSet]
                                      target value: 0
2021-08-29T18:57:41.336Z DRIVER « [RES] [SendData]
                                    was sent: true
2021-08-29T18:57:41.351Z DRIVER « [REQ] [SendData]
                                    callback id:     98
                                    transmit status: OK
2021-08-29T18:57:41.370Z CNTRLR   [Node 005] Scheduled poll canceled because value was updated
2021-08-29T18:57:41.370Z DRIVER « [Node 005] [REQ] [ApplicationCommand]
                                  └─[MultilevelSwitchCCReport]
                                      current value: 0

Have I misconfigured something? I don’t see an obvious way to update the firmware of the fan controller, so I’m not sure how up-to-date it is either.

Your device is not well behaving. From the logs, it sends a report that it is still on (value 99). If that’s it, then it never follows up with a final value that says it’s off. Because the device reported this value on its own, zwave-js cancels a poll it had scheduled, because usually devices will report the final state correctly.

2021-08-29T18:56:37.491Z CNTRLR   [Node 005] Scheduled poll canceled because value was updated
2021-08-29T18:56:37.492Z DRIVER « [Node 005] [REQ] [ApplicationCommand]
                                  └─[MultilevelSwitchCCReport]
                                      current value: 99

You can read about a similar issue here.

The only workaround would be to manually refresh the value, you could use zwave_js.refresh_value for that. The linked issue discusses a possibility of adding a compat flag to override the cancellation of the scheduled poll, but that doesn’t exist yet.

1 Like

Well that is disappointing, especially since from what I can tell from googling regarding this line of smart devices there is no provided way to update the firmware.

Guess I’ll try a different manufacturer.

1 Like

Just noticed the similar thing happening with the same switch, except the fan doesn’t actually turn off. For the most part works fine in home assistant Lovelace, but when making an automation in node red I need to send the off command twice for it to turn off.

Or you could setup polling for the device via zwavejs2mqtt. Not ideal but it does work.

It’s kind of the opposite of my problem. Status shows fine when I use Lovelace button or whatever to turn on or off. It’s when I have an automation, that I need to trigger off twice for it to take, because the intermediate step appears to stop it from turning off.

I’ve purchased an alternate smart switch (trying the Leviton ZW4SF-1BW) which will be arriving today. If that one has the same challenge I’ll give polling a shot - but my gut tells me sticking with a hardware vendor that has a fundamental flaw like this in their firmware and hasn’t thought ahead to how they might update firmware isn’t a great long term strategy.

Thanks for the suggestion though @firstof9!

Zooz, Inovelli, and Aeotec are my go to Zwave brands for future devices.

1 Like

Yesterday I installed a Ge/Jasco Enbrighten 55258 / ZW4002/ I too noticed the issue with ON/OFF switch bouncing and problems with automatons. I found a decent work around, don’t use on/off :wink: Instead use fan.set_percentage in your automation:

For example, to turn the fan on medium:

action:
  - service: fan.set_percentage
    target:
      entity_id: fan.master_bedroom_ceiling
    data:
      percentage: 66

To turn off the fan use zero:

action:
  - service: fan.set_percentage
    target:
      entity_id: fan.master_bedroom_ceiling
    data:
      percentage: 0
1 Like

in additional to the problems referenced above, I wasn’t able to discover the fan controller in alexa using the cloud integration in 2021.10.6. I managed to resolve all of my issues with the zw4002 using two scripts:

set_fan_percentage:
  sequence:
  - service: fan.set_percentage
    target:
      entity_id: '{{ entity_id }}'
    data:
      percentage: '{{ percentage }}'
  - service: zwave_js.refresh_value
    data:
      entity_id: '{{ entity_id }}'
  mode: single
  alias: Set fan percentage
  icon: mdi:fan

set_fan_operation:
  alias: Set fan operation
  sequence:
  - service: fan.turn_{{ operation }}
    target:
      entity_id: '{{ entity_id }}'
  - service: zwave_js.refresh_value
    data:
      entity_id: '{{ entity_id }}'
  mode: single
  icon: mdi:fan

and a fan template:

- platform: template
  fans:
    living_room_fan_temp:
      unique_id: living_room_fan_temp
      friendly_name: "Living Room fan"
      value_template: >
        {{ states('fan.living_room_fan') }}
      percentage_template: >
        {{ state_attr('fan.living_room_fan', 'percentage') | int}}
      turn_on:
        service: script.set_fan_operation
        data:
          entity_id: "fan.living_room_fan"
          operation: "on"
      turn_off:
        service: script.set_fan_operation
        data:
          entity_id: "fan.living_room_fan"
          operation: "off"
      set_percentage:
        service: script.set_fan_percentage
        data:
          entity_id: "fan.living_room_fan"
          percentage: "{{ percentage }}"

2 Likes

I’m curious about your experience — would you recommend the Leviton? I’ve seen several complaints about its bulk.

I’ve been quite happy with them, but admittedly have limited frame of reference regarding their bulk. They’ve been stable and fit the boxes in my ~20 year old home, at least once I got more practice folding the romex into the enclosure.

I’ve been able to work-around this fan controller issue by using this automation. I am pursuing a better product level fix in HA or Zwave_Js.

This seem to fix it by forcing the re-poll of data when it changes.

- id: "loft_fan_2 refresh switch state"
  alias: loft_fan_2 refresh switch state
  description: "Automation to refresh switch after state changes usually caused by switch control"
  mode: queued
  trigger:
    - platform: state
      entity_id: fan.loft_fan_2_level
  condition: "{{ trigger.to_state.state != trigger.from_state.state }}"
  action:
    - service: system_log.write
      data:
        level: info
        message: 'Polling fan.loft_fan_2_level state change from {{ trigger.from_state.state }} to {{ trigger.to_state.state }}'
        logger: hvac
    - service: zwave_js.refresh_value
      data:
        entity_id: fan.loft_fan_2_level
    - delay: "00:00:01"
    - service: zwave_js.refresh_value
      data:
        entity_id: fan.loft_fan_2_level