Requesting info on speed ranges for various Z-Wave fan controllers (e.g., GE/Jasco, Leviton)

I’ve just finished with a PR to give the zwave_js fan component explicit stop-points for the actual speeds used by the HomeSeer FC-200+ Z-Wave fan controller, and it should be easy enough to extend my approach towards other fan controllers.

But I don’t have access to any other fan controllers, so I’m hoping to get some info from people who actually have them.

So if you’ve got another Z-Wave fan controller, I’d like the following info:

  • How many actual speeds does it support

  • What Z-Wave speed ranges map to those speeds (e.g., 1-33=low, 34-66=med, 67-99=high). Note that this is not exactly the same as the percentages in the UI.

  • A dump of the device info from zwave_js (from the “Download a dump of your network to help diagnose issues” link on the Z-Wave Integration config page, then pull out the info for the fan node).

If you’d be able to help test the PR once it’s ready, that’d help too.

3 Likes

GE/Jasco - In-Wall Smart Fan Control - 14287 / ZW4002

3 speeds

  • low: 1-32
  • med: 33-66
  • high: 67-99
Dump
{
    "nodeId": 24,
    "index": 0,
    "installerIcon": 1024,
    "userIcon": 1024,
    "status": 4,
    "ready": true,
    "isListening": true,
    "isRouting": true,
    "isSecure": false,
    "manufacturerId": 99,
    "productId": 12593,
    "productType": 18756,
    "firmwareVersion": "5.20",
    "zwavePlusVersion": 1,
    "location": "Office",
    "deviceConfig": {
        "filename": "/usr/src/app/store/.config-db/devices/0x0063/14287.json",
        "isEmbedded": true,
        "manufacturer": "GE/Jasco",
        "manufacturerId": 99,
        "label": "14287 / ZW4002",
        "description": "In-Wall Smart Fan Control",
        "devices": [
            {
                "productType": 18756,
                "productId": 12593
            }
        ],
        "firmwareVersion": {
            "min": "0.0",
            "max": "255.255"
        },
        "associations": {},
        "paramInformation": {
            "_map": {}
        },
        "compat": {
            "valueIdRegex": {},
            "treatBasicSetAsEvent": true,
            "removeCCs": {}
        },
        "metadata": {
            "inclusion": "1. Follow the instructions for your Z-Wave certified controller to include a device to the Z-Wave network.\n2. Once the controller is ready to include your device, press and release the top or bottom of the smart fan control switch (rocker) to include it in the network.\n3. Once your controller has confirmed the device has been included, refresh the Z-Wave network to optimize performance",
            "exclusion": "1. Follow the instructions for your Z-Wave certified controller to exclude a device from the Z-Wave network. \n2. Once the controller is ready to Exclude your device, press and release the top or bottom of the wireless smart switch (rocker) to exclude it from the network",
            "reset": "1. Quickly press ON (Top) button three (3) times then immediately press the OFF (Bottom) button three (3) times. The LED will flash ON/OFF 5 times when completed successfully.\nNote: This should only be used in the event your network’s primary controller is missing or otherwise inoperable",
            "manual": "https://products.z-wavealliance.org/ProductManual/File?folder=&filename=MarketCertificationFiles/2506/Binder2.pdf"
        }
    },
    "label": "14287 / ZW4002",
    "interviewAttempts": 0,
    "endpoints": [
        {
            "nodeId": 24,
            "index": 0,
            "installerIcon": 1024,
            "userIcon": 1024,
            "deviceClass": {
                "basic": {
                    "key": 4,
                    "label": "Routing Slave"
                },
                "generic": {
                    "key": 17,
                    "label": "Multilevel Switch"
                },
                "specific": {
                    "key": 8,
                    "label": "Fan Switch"
                },
                "mandatorySupportedCCs": [
                    32,
                    38,
                    133,
                    89,
                    114,
                    115,
                    134,
                    94
                ],
                "mandatoryControlledCCs": []
            }
        }
    ],
    "values": [
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "currentValue",
            "propertyName": "currentValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Current value",
                "min": 0,
                "max": 99
            },
            "value": 0
        },
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "targetValue",
            "propertyName": "targetValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Target value",
                "min": 0,
                "max": 99
            }
        },
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "event",
            "propertyName": "event",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Event value",
                "min": 0,
                "max": 255
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "targetValue",
            "propertyName": "targetValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Target value",
                "valueChangeOptions": [
                    "transitionDuration"
                ],
                "min": 0,
                "max": 99
            },
            "value": 66
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "duration",
            "propertyName": "duration",
            "ccVersion": 1,
            "metadata": {
                "type": "duration",
                "readable": true,
                "writeable": true,
                "label": "Transition duration"
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "currentValue",
            "propertyName": "currentValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Current value",
                "min": 0,
                "max": 99
            },
            "value": 62
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "Up",
            "propertyName": "Up",
            "ccVersion": 1,
            "metadata": {
                "type": "boolean",
                "readable": true,
                "writeable": true,
                "label": "Perform a level change (Up)",
                "ccSpecific": {
                    "switchType": 2
                }
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "Down",
            "propertyName": "Down",
            "ccVersion": 1,
            "metadata": {
                "type": "boolean",
                "readable": true,
                "writeable": true,
                "label": "Perform a level change (Down)",
                "ccSpecific": {
                    "switchType": 2
                }
            }
        },
        {
            "endpoint": 0,
            "commandClass": 43,
            "commandClassName": "Scene Activation",
            "property": "sceneId",
            "propertyName": "sceneId",
            "ccVersion": 0,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Scene ID",
                "valueChangeOptions": [
                    "transitionDuration"
                ],
                "min": 1,
                "max": 255
            }
        },
        {
            "endpoint": 0,
            "commandClass": 43,
            "commandClassName": "Scene Activation",
            "property": "dimmingDuration",
            "propertyName": "dimmingDuration",
            "ccVersion": 0,
            "metadata": {
                "type": "any",
                "readable": true,
                "writeable": true,
                "label": "Dimming duration"
            }
        },
        {
            "endpoint": 0,
            "commandClass": 112,
            "commandClassName": "Configuration",
            "property": 4,
            "propertyName": "Invert Switch",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "description": "Invert the ON/OFF Switch State",
                "label": "Invert Switch",
                "default": 0,
                "min": 0,
                "max": 1,
                "states": {
                    "0": "Default",
                    "1": "Invert"
                },
                "valueSize": 1,
                "format": 1,
                "allowManualEntry": false,
                "isFromConfig": true
            },
            "value": 0
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "manufacturerId",
            "propertyName": "manufacturerId",
            "ccVersion": 2,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Manufacturer ID",
                "min": 0,
                "max": 65535
            },
            "value": 99
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "productType",
            "propertyName": "productType",
            "ccVersion": 2,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Product type",
                "min": 0,
                "max": 65535
            },
            "value": 18756
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "productId",
            "propertyName": "productId",
            "ccVersion": 2,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Product ID",
                "min": 0,
                "max": 65535
            },
            "value": 12593
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "libraryType",
            "propertyName": "libraryType",
            "ccVersion": 2,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Library type",
                "states": {
                    "0": "Unknown",
                    "1": "Static Controller",
                    "2": "Controller",
                    "3": "Enhanced Slave",
                    "4": "Slave",
                    "5": "Installer",
                    "6": "Routing Slave",
                    "7": "Bridge Controller",
                    "8": "Device under Test",
                    "9": "N/A",
                    "10": "AV Remote",
                    "11": "AV Device"
                }
            },
            "value": 3
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "protocolVersion",
            "propertyName": "protocolVersion",
            "ccVersion": 2,
            "metadata": {
                "type": "string",
                "readable": true,
                "writeable": false,
                "label": "Z-Wave protocol version"
            },
            "value": "4.5"
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "firmwareVersions",
            "propertyName": "firmwareVersions",
            "ccVersion": 2,
            "metadata": {
                "type": "string[]",
                "readable": true,
                "writeable": false,
                "label": "Z-Wave chip firmware versions"
            },
            "value": [
                "5.20"
            ]
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "hardwareVersion",
            "propertyName": "hardwareVersion",
            "ccVersion": 2,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Z-Wave chip hardware version"
            },
            "value": 255
        }
    ],
    "isFrequentListening": false,
    "maxDataRate": 100000,
    "supportedDataRates": [
        40000,
        100000
    ],
    "protocolVersion": 3,
    "supportsBeaming": true,
    "supportsSecurity": false,
    "nodeType": 1,
    "zwavePlusNodeType": 0,
    "zwavePlusRoleType": 5,
    "deviceClass": {
        "basic": {
            "key": 4,
            "label": "Routing Slave"
        },
        "generic": {
            "key": 17,
            "label": "Multilevel Switch"
        },
        "specific": {
            "key": 8,
            "label": "Fan Switch"
        },
        "mandatorySupportedCCs": [
            32,
            38,
            133,
            89,
            114,
            115,
            134,
            94
        ],
        "mandatoryControlledCCs": []
    },
    "commandClasses": [
        {
            "id": 32,
            "name": "Basic",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 38,
            "name": "Multilevel Switch",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 43,
            "name": "Scene Activation",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 86,
            "name": "CRC-16 Encapsulation",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 89,
            "name": "Association Group Information",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 90,
            "name": "Device Reset Locally",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 94,
            "name": "Z-Wave Plus Info",
            "version": 2,
            "isSecure": false
        },
        {
            "id": 112,
            "name": "Configuration",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 114,
            "name": "Manufacturer Specific",
            "version": 2,
            "isSecure": false
        },
        {
            "id": 115,
            "name": "Powerlevel",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 122,
            "name": "Firmware Update Meta Data",
            "version": 2,
            "isSecure": false
        },
        {
            "id": 133,
            "name": "Association",
            "version": 2,
            "isSecure": false
        },
        {
            "id": 134,
            "name": "Version",
            "version": 2,
            "isSecure": false
        }
    ],
    "interviewStage": "Complete",
    "deviceDatabaseUrl": "https://devices.zwave-js.io/?jumpTo=0x0063:0x4944:0x3131:5.20",
    "statistics": {
        "commandsTX": 27,
        "commandsRX": 16,
        "commandsDroppedRX": 0,
        "commandsDroppedTX": 0,
        "timeoutResponse": 0
    },
    "highestSecurityClass": -1
}

1 Like

GE/Jasco - In-Wall Smart Fan Control - 12730 / ZW4002

3 speeds

  • low: 1-33
  • med: 34-67
  • high: 68-99

Yes, the ranges really are off by one compared to the other GE.

Dump
{
    "nodeId": 21,
    "index": 0,
    "status": 4,
    "ready": true,
    "isListening": true,
    "isRouting": true,
    "isSecure": false,
    "manufacturerId": 99,
    "productId": 12340,
    "productType": 18756,
    "firmwareVersion": "3.10",
    "location": "Master Bedroom",
    "deviceConfig": {
        "filename": "/usr/src/app/store/.config-db/devices/0x0063/ge_12730_zw4002.json",
        "isEmbedded": true,
        "manufacturer": "GE/Jasco",
        "manufacturerId": 99,
        "label": "12730  / ZW4002",
        "description": "In-Wall Smart Fan Control",
        "devices": [
            {
                "productType": 18756,
                "productId": 12340
            }
        ],
        "firmwareVersion": {
            "min": "0.0",
            "max": "255.255"
        },
        "associations": {},
        "paramInformation": {
            "_map": {}
        },
        "compat": {
            "valueIdRegex": {},
            "treatBasicSetAsEvent": true,
            "removeCCs": {}
        }
    },
    "label": "12730  / ZW4002",
    "interviewAttempts": 0,
    "endpoints": [
        {
            "nodeId": 21,
            "index": 0,
            "deviceClass": {
                "basic": {
                    "key": 4,
                    "label": "Routing Slave"
                },
                "generic": {
                    "key": 17,
                    "label": "Multilevel Switch"
                },
                "specific": {
                    "key": 1,
                    "label": "Multilevel Power Switch"
                },
                "mandatorySupportedCCs": [
                    32,
                    38,
                    39
                ],
                "mandatoryControlledCCs": []
            }
        }
    ],
    "values": [
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "currentValue",
            "propertyName": "currentValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Current value",
                "min": 0,
                "max": 99
            },
            "value": 1
        },
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "targetValue",
            "propertyName": "targetValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Target value",
                "min": 0,
                "max": 99
            }
        },
        {
            "endpoint": 0,
            "commandClass": 32,
            "commandClassName": "Basic",
            "property": "event",
            "propertyName": "event",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Event value",
                "min": 0,
                "max": 255
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "targetValue",
            "propertyName": "targetValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Target value",
                "valueChangeOptions": [
                    "transitionDuration"
                ],
                "min": 0,
                "max": 99
            },
            "value": 0
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "duration",
            "propertyName": "duration",
            "ccVersion": 1,
            "metadata": {
                "type": "duration",
                "readable": true,
                "writeable": true,
                "label": "Transition duration"
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "currentValue",
            "propertyName": "currentValue",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Current value",
                "min": 0,
                "max": 99
            },
            "value": 0
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "Up",
            "propertyName": "Up",
            "ccVersion": 1,
            "metadata": {
                "type": "boolean",
                "readable": true,
                "writeable": true,
                "label": "Perform a level change (Up)",
                "ccSpecific": {
                    "switchType": 2
                }
            }
        },
        {
            "endpoint": 0,
            "commandClass": 38,
            "commandClassName": "Multilevel Switch",
            "property": "Down",
            "propertyName": "Down",
            "ccVersion": 1,
            "metadata": {
                "type": "boolean",
                "readable": true,
                "writeable": true,
                "label": "Perform a level change (Down)",
                "ccSpecific": {
                    "switchType": 2
                }
            }
        },
        {
            "endpoint": 0,
            "commandClass": 112,
            "commandClassName": "Configuration",
            "property": 3,
            "propertyName": "LED Light",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "description": "Sets when the LED on the switch is lit.",
                "label": "LED Light",
                "default": 0,
                "min": 0,
                "max": 1,
                "states": {
                    "0": "LED on when light off",
                    "1": "LED on when light on"
                },
                "valueSize": 1,
                "format": 0,
                "allowManualEntry": false,
                "isFromConfig": true
            },
            "value": 1
        },
        {
            "endpoint": 0,
            "commandClass": 112,
            "commandClassName": "Configuration",
            "property": 4,
            "propertyName": "Invert Switch",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": true,
                "label": "Invert Switch",
                "default": 0,
                "min": 0,
                "max": 1,
                "states": {
                    "0": "No",
                    "1": "Yes"
                },
                "valueSize": 1,
                "format": 0,
                "allowManualEntry": false,
                "isFromConfig": true
            },
            "value": 0
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "manufacturerId",
            "propertyName": "manufacturerId",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Manufacturer ID",
                "min": 0,
                "max": 65535
            },
            "value": 99
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "productType",
            "propertyName": "productType",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Product type",
                "min": 0,
                "max": 65535
            },
            "value": 18756
        },
        {
            "endpoint": 0,
            "commandClass": 114,
            "commandClassName": "Manufacturer Specific",
            "property": "productId",
            "propertyName": "productId",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Product ID",
                "min": 0,
                "max": 65535
            },
            "value": 12340
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "libraryType",
            "propertyName": "libraryType",
            "ccVersion": 1,
            "metadata": {
                "type": "number",
                "readable": true,
                "writeable": false,
                "label": "Library type",
                "states": {
                    "0": "Unknown",
                    "1": "Static Controller",
                    "2": "Controller",
                    "3": "Enhanced Slave",
                    "4": "Slave",
                    "5": "Installer",
                    "6": "Routing Slave",
                    "7": "Bridge Controller",
                    "8": "Device under Test",
                    "9": "N/A",
                    "10": "AV Remote",
                    "11": "AV Device"
                }
            },
            "value": 6
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "protocolVersion",
            "propertyName": "protocolVersion",
            "ccVersion": 1,
            "metadata": {
                "type": "string",
                "readable": true,
                "writeable": false,
                "label": "Z-Wave protocol version"
            },
            "value": "3.67"
        },
        {
            "endpoint": 0,
            "commandClass": 134,
            "commandClassName": "Version",
            "property": "firmwareVersions",
            "propertyName": "firmwareVersions",
            "ccVersion": 1,
            "metadata": {
                "type": "string[]",
                "readable": true,
                "writeable": false,
                "label": "Z-Wave chip firmware versions"
            },
            "value": [
                "3.10"
            ]
        }
    ],
    "isFrequentListening": false,
    "maxDataRate": 40000,
    "supportedDataRates": [
        40000
    ],
    "protocolVersion": 3,
    "supportsBeaming": true,
    "supportsSecurity": false,
    "nodeType": 1,
    "deviceClass": {
        "basic": {
            "key": 4,
            "label": "Routing Slave"
        },
        "generic": {
            "key": 17,
            "label": "Multilevel Switch"
        },
        "specific": {
            "key": 1,
            "label": "Multilevel Power Switch"
        },
        "mandatorySupportedCCs": [
            32,
            38,
            39
        ],
        "mandatoryControlledCCs": []
    },
    "commandClasses": [
        {
            "id": 32,
            "name": "Basic",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 38,
            "name": "Multilevel Switch",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 112,
            "name": "Configuration",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 114,
            "name": "Manufacturer Specific",
            "version": 1,
            "isSecure": false
        },
        {
            "id": 134,
            "name": "Version",
            "version": 1,
            "isSecure": false
        }
    ],
    "interviewStage": "Complete",
    "deviceDatabaseUrl": "https://devices.zwave-js.io/?jumpTo=0x0063:0x4944:0x3034:3.10",
    "statistics": {
        "commandsTX": 3,
        "commandsRX": 1,
        "commandsDroppedRX": 0,
        "commandsDroppedTX": 0,
        "timeoutResponse": 0
    },
    "highestSecurityClass": -1
}

Thanks! I’ve used your info in PR #60517.

I managed to get some info from Leviton and Inovelli’s tech support.

Leviton ZW4SF:
0 is off, 1-25 is level 1, 26-50 is level 2, 51-75 is level 3, 76-99 is level 4

Inovelli LZW36:
0 is off, 1 is “breeze mode”, 2-33 is low, 34-66 is medium, 67-99 is high

1 Like

So I’ve put together PRs for both the Leviton ZW4SF and the Inovelli LZW36, but I need some help from people who have those devices.

  1. Can anyone with the Leviton ZW4SF help test Add zwave_js speed configuration for Leviton ZW4SF fans by mkowalchuk · Pull Request #60677 · home-assistant/core · GitHub?

  2. Can anyone with an Inovelli LZW36 help test Add support for preset modes in the zwave_js fan component, and enable them for the Inovelli LZW36 by mkowalchuk · Pull Request #60947 · home-assistant/core · GitHub, and provide me with a zwave_js device dump?

1 Like

Hello,

I have several of the GE 14287, and they are still reporting as 67% / high when I set speed to medium Running 2021.12.3, and I see the changes from the PR are integrated. I tried to re-interview the switch, but no improvement. Here’s a zwave-js device dump

Summary
          {
            "nodeId": 12,
            "index": 0,
            "installerIcon": 1024,
            "userIcon": 1024,
            "status": 4,
            "ready": true,
            "isListening": true,
            "isRouting": true,
            "isSecure": false,
            "manufacturerId": 99,
            "productId": 12593,
            "productType": 18756,
            "firmwareVersion": "5.24",
            "zwavePlusVersion": 1,
            "deviceConfig": {
              "filename": "/data/db/devices/0x0063/14287.json",
              "isEmbedded": true,
              "manufacturer": "GE/Jasco",
              "manufacturerId": 99,
              "label": "14287 / ZW4002",
              "description": "In-Wall Smart Fan Control",
              "devices": [
                {
                  "productType": 18756,
                  "productId": 12593
                }
              ],
              "firmwareVersion": {
                "min": "0.0",
                "max": "255.255"
              },
              "associations": {},
              "paramInformation": {
                "_map": {}
              },
              "compat": {
                "valueIdRegex": {},
                "treatBasicSetAsEvent": true,
                "removeCCs": {}
              },
              "metadata": {
                "inclusion": "1. Follow the instructions for your Z-Wave certified controller to include a device to the Z-Wave network.\n2. Once the controller is ready to include your device, press and release the top or bottom of the smart fan control switch (rocker) to include it in the network.\n3. Once your controller has confirmed the device has been included, refresh the Z-Wave network to optimize performance",
                "exclusion": "1. Follow the instructions for your Z-Wave certified controller to exclude a device from the Z-Wave network. \n2. Once the controller is ready to Exclude your device, press and release the top or bottom of the wireless smart switch (rocker) to exclude it from the network",
                "reset": "1. Quickly press ON (Top) button three (3) times then immediately press the OFF (Bottom) button three (3) times. The LED will flash ON/OFF 5 times when completed successfully.\nNote: This should only be used in the event your network\u2019s primary controller is missing or otherwise inoperable",
                "manual": "https://products.z-wavealliance.org/ProductManual/File?folder=&filename=MarketCertificationFiles/2506/Binder2.pdf"
              }
            },
            "label": "14287 / ZW4002",
            "interviewAttempts": 1,
            "endpoints": [
              {
                "nodeId": 12,
                "index": 0,
                "installerIcon": 1024,
                "userIcon": 1024,
                "deviceClass": {
                  "basic": {
                    "key": 4,
                    "label": "Routing Slave"
                  },
                  "generic": {
                    "key": 17,
                    "label": "Multilevel Switch"
                  },
                  "specific": {
                    "key": 8,
                    "label": "Fan Switch"
                  },
                  "mandatorySupportedCCs": [
                    32,
                    38,
                    133,
                    89,
                    114,
                    115,
                    134,
                    94
                  ],
                  "mandatoryControlledCCs": []
                }
              }
            ],
            "values": [
              {
                "endpoint": 0,
                "commandClass": 32,
                "commandClassName": "Basic",
                "property": "currentValue",
                "propertyName": "currentValue",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Current value",
                  "min": 0,
                  "max": 99
                },
                "value": 66
              },
              {
                "endpoint": 0,
                "commandClass": 32,
                "commandClassName": "Basic",
                "property": "targetValue",
                "propertyName": "targetValue",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": true,
                  "label": "Target value",
                  "min": 0,
                  "max": 99
                }
              },
              {
                "endpoint": 0,
                "commandClass": 32,
                "commandClassName": "Basic",
                "property": "event",
                "propertyName": "event",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Event value",
                  "min": 0,
                  "max": 255
                }
              },
              {
                "endpoint": 0,
                "commandClass": 38,
                "commandClassName": "Multilevel Switch",
                "property": "targetValue",
                "propertyName": "targetValue",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": true,
                  "label": "Target value",
                  "valueChangeOptions": [
                    "transitionDuration"
                  ],
                  "min": 0,
                  "max": 99
                },
                "value": 32
              },
              {
                "endpoint": 0,
                "commandClass": 38,
                "commandClassName": "Multilevel Switch",
                "property": "duration",
                "propertyName": "duration",
                "ccVersion": 1,
                "metadata": {
                  "type": "duration",
                  "readable": true,
                  "writeable": true,
                  "label": "Transition duration"
                }
              },
              {
                "endpoint": 0,
                "commandClass": 38,
                "commandClassName": "Multilevel Switch",
                "property": "currentValue",
                "propertyName": "currentValue",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Current value",
                  "min": 0,
                  "max": 99
                },
                "value": 99
              },
              {
                "endpoint": 0,
                "commandClass": 38,
                "commandClassName": "Multilevel Switch",
                "property": "Up",
                "propertyName": "Up",
                "ccVersion": 1,
                "metadata": {
                  "type": "boolean",
                  "readable": true,
                  "writeable": true,
                  "label": "Perform a level change (Up)",
                  "ccSpecific": {
                    "switchType": 2
                  }
                }
              },
              {
                "endpoint": 0,
                "commandClass": 38,
                "commandClassName": "Multilevel Switch",
                "property": "Down",
                "propertyName": "Down",
                "ccVersion": 1,
                "metadata": {
                  "type": "boolean",
                  "readable": true,
                  "writeable": true,
                  "label": "Perform a level change (Down)",
                  "ccSpecific": {
                    "switchType": 2
                  }
                }
              },
              {
                "endpoint": 0,
                "commandClass": 114,
                "commandClassName": "Manufacturer Specific",
                "property": "manufacturerId",
                "propertyName": "manufacturerId",
                "ccVersion": 2,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Manufacturer ID",
                  "min": 0,
                  "max": 65535
                },
                "value": 99
              },
              {
                "endpoint": 0,
                "commandClass": 114,
                "commandClassName": "Manufacturer Specific",
                "property": "productType",
                "propertyName": "productType",
                "ccVersion": 2,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Product type",
                  "min": 0,
                  "max": 65535
                },
                "value": 18756
              },
              {
                "endpoint": 0,
                "commandClass": 114,
                "commandClassName": "Manufacturer Specific",
                "property": "productId",
                "propertyName": "productId",
                "ccVersion": 2,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Product ID",
                  "min": 0,
                  "max": 65535
                },
                "value": 12593
              },
              {
                "endpoint": 0,
                "commandClass": 134,
                "commandClassName": "Version",
                "property": "libraryType",
                "propertyName": "libraryType",
                "ccVersion": 2,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Library type",
                  "states": {
                    "0": "Unknown",
                    "1": "Static Controller",
                    "2": "Controller",
                    "3": "Enhanced Slave",
                    "4": "Slave",
                    "5": "Installer",
                    "6": "Routing Slave",
                    "7": "Bridge Controller",
                    "8": "Device under Test",
                    "9": "N/A",
                    "10": "AV Remote",
                    "11": "AV Device"
                  }
                },
                "value": 3
              },
              {
                "endpoint": 0,
                "commandClass": 134,
                "commandClassName": "Version",
                "property": "protocolVersion",
                "propertyName": "protocolVersion",
                "ccVersion": 2,
                "metadata": {
                  "type": "string",
                  "readable": true,
                  "writeable": false,
                  "label": "Z-Wave protocol version"
                },
                "value": "4.54"
              },
              {
                "endpoint": 0,
                "commandClass": 134,
                "commandClassName": "Version",
                "property": "firmwareVersions",
                "propertyName": "firmwareVersions",
                "ccVersion": 2,
                "metadata": {
                  "type": "string[]",
                  "readable": true,
                  "writeable": false,
                  "label": "Z-Wave chip firmware versions"
                },
                "value": [
                  "5.24"
                ]
              },
              {
                "endpoint": 0,
                "commandClass": 134,
                "commandClassName": "Version",
                "property": "hardwareVersion",
                "propertyName": "hardwareVersion",
                "ccVersion": 2,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": false,
                  "label": "Z-Wave chip hardware version"
                },
                "value": 255
              },
              {
                "endpoint": 0,
                "commandClass": 112,
                "commandClassName": "Configuration",
                "property": 4,
                "propertyName": "Invert Switch",
                "ccVersion": 1,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": true,
                  "description": "Invert the ON/OFF Switch State",
                  "label": "Invert Switch",
                  "default": 0,
                  "min": 0,
                  "max": 1,
                  "states": {
                    "0": "Default",
                    "1": "Invert"
                  },
                  "valueSize": 1,
                  "format": 1,
                  "allowManualEntry": false,
                  "isFromConfig": true
                },
                "value": 0
              },

              {
                "endpoint": 0,
                "commandClass": 43,
                "commandClassName": "Scene Activation",
                "property": "sceneId",
                "propertyName": "sceneId",
                "ccVersion": 0,
                "metadata": {
                  "type": "number",
                  "readable": true,
                  "writeable": true,
                  "label": "Scene ID",
                  "valueChangeOptions": [
                    "transitionDuration"
                  ],
                  "min": 1,
                  "max": 255
                }
              },
              {
                "endpoint": 0,
                "commandClass": 43,
                "commandClassName": "Scene Activation",
                "property": "dimmingDuration",
                "propertyName": "dimmingDuration",
                "ccVersion": 0,
                "metadata": {
                  "type": "any",
                  "readable": true,
                  "writeable": true,
                  "label": "Dimming duration"
                }
              }
            ],
            "isFrequentListening": false,
            "maxDataRate": 100000,
            "supportedDataRates": [
              40000,
              100000
            ],
            "protocolVersion": 3,
            "supportsBeaming": true,
            "supportsSecurity": false,
            "nodeType": 1,
            "zwavePlusNodeType": 0,
            "zwavePlusRoleType": 5,
            "deviceClass": {
              "basic": {
                "key": 4,
                "label": "Routing Slave"
              },
              "generic": {
                "key": 17,
                "label": "Multilevel Switch"
              },
              "specific": {
                "key": 8,
                "label": "Fan Switch"
              },
              "mandatorySupportedCCs": [
                32,
                38,
                133,
                89,
                114,
                115,
                134,
                94
              ],
              "mandatoryControlledCCs": []
            },
            "commandClasses": [
              {
                "id": 32,
                "name": "Basic",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 38,
                "name": "Multilevel Switch",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 133,
                "name": "Association",
                "version": 2,
                "isSecure": false
              },
              {
                "id": 89,
                "name": "Association Group Information",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 114,
                "name": "Manufacturer Specific",
                "version": 2,
                "isSecure": false
              },
              {
                "id": 115,
                "name": "Powerlevel",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 134,
                "name": "Version",
                "version": 2,
                "isSecure": false
              },
              {
                "id": 94,
                "name": "Z-Wave Plus Info",
                "version": 2,
                "isSecure": false
              },
              {
                "id": 90,
                "name": "Device Reset Locally",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 112,
                "name": "Configuration",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 86,
                "name": "CRC-16 Encapsulation",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 44,
                "name": "Scene Actuator Configuration",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 43,
                "name": "Scene Activation",
                "version": 1,
                "isSecure": false
              },
              {
                "id": 122,
                "name": "Firmware Update Meta Data",
                "version": 2,
                "isSecure": false
              }
            ],
            "interviewStage": "Complete",
            "deviceDatabaseUrl": "https://devices.zwave-js.io/?jumpTo=0x0063:0x4944:0x3131:5.24",
            "statistics": {
              "commandsTX": 104,
              "commandsRX": 67,
              "commandsDroppedRX": 0,
              "commandsDroppedTX": 0,
              "timeoutResponse": 0
            },
            "highestSecurityClass": -1
          },

This change is in HA so re-interviewing won’t do anything.

It would be helpful if you went through the range of values and reported the actual fan speeds for your switches. Your 14287 has a different firmware version than mine (5.2 vs 5.4), so the range could also be different.

I’ll be happy to do that if you can point me in a direction to get you that info.

Tried creating a template to run like this, but I can’t seem to find the way to set the fan speed percentage.

{% for fanlevel in range(0,99) %}
testing level {{fanlevel}} {{state_attr('fan.office_fan','speed')}}
{% endfor %}

You need to set the raw z-wave values directly, and not go through HA’s conversion to/from percentages. I didn’t enumerate through all 99 levels, I just picked values around the edges and verified the speeds.

The easiest way is to use the zwavejs2mqtt control panel and set and observe the Multilevel Switch CC target/currentValue. If you’re not using zwavejs2mqtt, then use the HA zwave_js.set_value service call with the same parameters. The network dump (download from integration configuration) gives you all the values to specify, it would be Multilevel Switch CC targetValue to change the level…

Thank you for the guidance.

Here’s the settings that I tried and the speeds/percentages reported.

targetValue=0, speed=off, percentage=0
targetValue=1, speed=low, percentage=33
targetValue=32, speed=low, percentage=33
targetValue=33, speed=high, percentage=67
targetValue=34, speed=high, percentage=67
targetValue=65, speed=high, percentage=67
targetValue=66, speed=high, percentage=67
targetValue=67, speed=high, percentage=100
targetValue=99, speed=high, percentage=100

This doesn’t look right. The medium speed seems to be missing. You should be reporting what the targetValue does to the fan itself. Ignore HA and just report what the switch is doing.

I agree. The speed percentage is accurate, but not the reported speed. It’s like medium just went missing.

When I change manually via the paddle, I get 33/low, 67/high, 100/high
If I use fan.set_speed to medium, it reports 67/high.
All my fan_entity_row objects display “high” when pressing “med”

I don’t recall specifically if this happened on update to 2021.12.3 or if it happened when I updated to 2021.11.5 and migrated from legacy zwave to zwave-js

You’re missing the point of the exercise. We are trying to determine which targetValues correspond to low/med/high on your switch. That’s why I said ignore HA. Set a targetValue, what does your switch physically do? Does level 33 set it to low or medium? Repeat for other values. If the targetValues differ from the range of values I reported above, then a code change needs to be made in HA.

Perhaps I misunderstood your original question, but I assumed the percentages were not working. It looks like you might just be concerned about the speed settings.

Can you clarify, are the percentages setting the correct fan speed on the switch itself? Is it just the HA fan speed value that is wrong?

Sorry for the confusion.
The percentages are working. The HA fan speed is not.

Any of the targetValue=33,34,65,66 are actually the medium speed on the fan
(any time the percentage = 67)

Alternatively, targetValue 0 off, targetValue 1-32 is low speed, targetValue 33-66 medium speed, targetValue 67-99 high speed

Gotcha, sorry for the confusion on my end. The values you are reporting are the same as my switch with the different firmware. So that is good, no changes necessary.

I confirmed that I do see the same fan speed problem as you. I’ve never paid attention before because fan speeds are deprecated and will (supposedly) be removed in a future version of HA. So while this is definitely a bug of some sort, I’m not sure it will get any attention. @mkowalchuk Do you think the fan speed issue identified here was introduced by any of your changes? Is it worth fixing if so?

@freshcoast Thanks for all your feedback.

I have switched my fan entities in the UI to GitHub - finity69x2/fan-percent-button-row: Frontend plugin to control fans in Home Assistant using percent values for speeds and updated all my automatons to use percent instead of speed.

This custom card was on my todo list. Took a few minutes to install and configure. Much better now, thanks for the reminder!

@mkowalchuk Do you think the fan speed issue identified here was introduced by any of your changes? Is it worth fixing if so?

Yeah, this is definitely because of my PR. The legacy speed MEDIUM is reported as the speed only if the percentage is in [34, 66]. But for 3-speed fans the selectable percentages are 0%, 33%, 67%, and 100%, which completely bypasses the MEDIUM range.

At a glance, I think this wouldn’t be too difficult to fix by overriding speed_to_percentage and percentage_to_speed… but I’m also a bit doubtful that it’d be worth it, since they’re slated to be removed in the 2022.3 release.