[RELEASE] Hubitat Z-Wave Firmware Updater

Hubitat Z-Wave Firmware Updater

The firmware updater is in the form of a driver. It is a utility based driver similar to the basicZwaveTool. It is designed to be switched to, used to update your devices, and then switch back to your original driver.

While released exclusively to the Hubitat platform. This is not a product of Hubitat Inc. This is a community developed and community supported feature.

Use at your own risk

I am providing this as a convenience for the community and as such make no guarantees or warranties. If you damage a device from proper or improper use of this program you are on your own.

Requirements:

  • Web server hosted OTZ or HEX update file. (can be local on your LAN or elsewhere ex: github
  • Z-wave device that is OTA capable and supports Firmware Update MD Command Class V1-4
  • Good connectivity between the device and your Hubitat hub.

Warnings:

  • Devices that are region specific, make sure you have a firmware file that is for your region.
  • Some devices will require exclude/include when complete. This has been noticed on some hardware. Most will not require this.
  • There are many provisions in this code and in the Z-wave spec that prevent this process from damaging your device. But I offer no guarantee or warranty. Use at your own risk!
  • This driver can only be used on 1 device at a time due to the shared memory requirement to enable this process.

Process:

  1. Go to the device details page for the device you want to update
  2. Under device information change the driver to Z-Wave Firmware Updater and click Save Device
  3. Type in the URL for the firmware update file in the Update Firmware command and then click Update Firmware
  4. Wait… This process can take a while
  5. Watch under Current States for progress updates.

At any time you can click Abort Process to stop the firmware update.

In the rare case of the process being locked from a previous attempt, you can click Clear Lock to clear the stale lock.

After clicking the Update Firmware button this process can take a while… The firmware must be downloaded and processed into memory. Then must be parsed for information to verify that the firmware matches the device’s firmware image. Only after all these steps will the device begin requesting parts of the firmware binary. You will see a progress indicator reporting the percentage of data that has been transferred. After the whole image has been transferred your device will verify it to and reply back with a status. And then if the status is good your device will flash itself and reboot.

Note for sleepy (battery powered) devices:

Throughout this process you may need to wake the device a few times before everything can be completed. Refer to the manual provided by the manufacturer for the wake mechanism for your device.

14 Likes

@bcopeland Do you have a donate to the developer account setup anywhere? I know you didn’t do this for money but buying you a coffee seems like the right thing to do.

2 Likes

I don’t take donations… I enjoy what I do… But I appreciate the sentiment …

11 Likes

In the past I have donated $$ to a charity in the (screen name) of the developer. I think its a nice gesture.

3 Likes

The community response has been amazing… Tons of people have updated their inovelli firmwares…

4 Likes

@bcopeland I used this to update all 14 of my Inovelli switches. It works like a champ! Thank you so much for this valuable tool.

I used “Simple HTTP Server - 1.1.10.1000” installed from the Windows 10 store to fire up an easy temporary HTTP server locally.

1 Like

@bcopeland I seem to be having a ton of problems trying to update firmware for my Inovelli Red Series switches…all of the Red Series dimmers worked perfectly, but the switches are giving me a ton of problems with your awesome tool. They all keep failing saying “please wake up your sleep device” … which doesn’t make a ton of sense since they are all wired in with neutrals and no on battery.

Any insight here?

1 Like

There have many methods… Some are pulling the air-gap switch and re-inserting right before updating… There is a lot of discussion on the main thread on this issue

Ok. I’ll go back in and look at other thread commetns. I’ve done the air gap pull a bunch and it hasn’t worked. All it does is fix the switch after I’ve tried updating and it fails (with sleep comment).

1 Like

I believe they were resetting it right before the firmware update…

Still not working…have tried all the suggestions. Here are my most recent attempt log:

dev:362020-05-13 05:17:59.931 pm debug7A03031E0201223A00002800

dev:362020-05-13 05:17:59.923 pm debugFirmware Descriptor: [wFirmWareCommonSize:32733, wFirmWareBank1Size:31900, wFirmWareBank2Size:31094, wFirmWareBank3Size:29471, manufacturerId:798, firmwareId:513, checksum:32737]

dev:362020-05-13 05:17:59.767 pm infocalculating crc…

dev:362020-05-13 05:17:59.402 pm debugOTZ Headers: [compressedLength:98032, crc16compressed:20657, unCompressedCrc16:7189, scramblingKey:a151903c6e0ff121ed0903cbeff0, firmwareDescriptorChecksum:32737, fastLzLevel:1]

dev:362020-05-13 05:17:59.391 pm infogot otz compressed image reading compression header

dev:362020-05-13 05:17:59.390 pm infofirmware total bytes: 98059

dev:362020-05-13 05:17:59.388 pm infoSorted all the bytes. cleaning up some memory…

dev:362020-05-13 05:17:59.387 pm debugParser: EOF

dev:362020-05-13 05:17:58.700 pm debugskip: MeterReport(scale: 0, rateType: 1, scale2: 0, deltaTime: 23, previousMeterValue: [0, 0, 0, 0], meterType: 1, precision: 3, size: 4, meterValue: [0, 0, 0, 2])

dev:362020-05-13 05:17:58.688 pm debugparse:zw device: 04, command: 3202, payload: 21 64 00 00 00 02 00 17 00 00 00 00 , isMulticast: false

dev:362020-05-13 05:17:56.397 pm debugParser: 16 bit shift: 0x1

dev:362020-05-13 05:17:46.397 pm debugParser: 16 bit shift: 0x0

dev:362020-05-13 05:17:46.374 pm debugpacking all the bytes…

dev:362020-05-13 05:17:43.999 pm debugfirmwareMdReport: checksum 63878 firmwareId: 513 manufacturerId: 798 maxFragmentSize: null firmwareTargets: 0

dev:362020-05-13 05:17:43.997 pm debugFirmwareMDReport: FirmwareMdReport(manufacturerId:798, firmwareId:513, checksum:63878, firmwareUpgradable:false, numberOfTargets:0, maxFragmentSize:null, firmwareIds:)

dev:362020-05-13 05:17:43.939 pm debugparse:zw device: 04, command: 7A02, payload: 03 1E 02 01 F9 86 FF 00 00 28 , isMulticast: false

dev:362020-05-13 05:17:43.701 pm infoVersionReport- applicationVersion:1.9

dev:362020-05-13 05:17:43.700 pm infoVersionReport- zWaveProtocolVersion:6.4

dev:362020-05-13 05:17:43.666 pm debugparse:zw device: 04, command: 8612, payload: 03 06 04 01 09 01 00 , isMulticast: false

dev:362020-05-13 05:17:43.388 pm infoVersionReport- applicationVersion:1.9

dev:362020-05-13 05:17:43.387 pm infoVersionReport- zWaveProtocolVersion:6.4

dev:362020-05-13 05:17:43.357 pm debugparse:zw device: 04, command: 8612, payload: 03 06 04 01 09 01 00 , isMulticast: false

dev:362020-05-13 05:17:43.256 pm infoFirmwareUpdateMd version:4

dev:362020-05-13 05:17:43.215 pm debugparse:zw device: 04, command: 8614, payload: 7A 04 , isMulticast: false

dev:362020-05-13 05:17:42.154 pm infoFirmwareUpdateMd version:4

dev:362020-05-13 05:17:41.948 pm debugparse:zw device: 04, command: 8614, payload: 7A 04 , isMulticast: false

dev:362020-05-13 05:17:40.728 pm infoFirmwareUpdateMd version:4

dev:362020-05-13 05:17:40.674 pm debugparse:zw device: 04, command: 8614, payload: 7A 04 , isMulticast: false

dev:362020-05-13 05:17:40.429 pm debuglocked by:

dev:362020-05-13 05:17:40.179 pm debuglocked by:

dev:362020-05-13 05:17:39.982 pm debuglocked by:

dev:362020-05-13 05:17:39.750 pm debuglocked by:

dev:362020-05-13 05:17:39.498 pm debuglocked by:

dev:362020-05-13 05:17:39.471 pm infoFirmwareUpdateMd version:4

dev:362020-05-13 05:17:39.460 pm debugparse:zw device: 04, command: 8614, payload: 7A 04 , isMulticast: false

dev:362020-05-13 05:17:39.019 pm debuglocked by:

dev:362020-05-13 05:17:38.531 pm debuglocked by:

dev:362020-05-13 05:17:35.703 pm debugskip: MeterReport(scale: 0, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: [0, 0, 0, 0], meterType: 1, precision: 3, size: 4, meterValue: [0, 0, 0, 0])

dev:362020-05-13 05:17:35.697 pm debugparse:zw device: 04, command: 3202, payload: 21 64 00 00 00 00 00 00 00 00 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.856 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 9, 227])

dev:362020-05-13 05:17:29.850 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 09 E3 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.812 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.807 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.739 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.734 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.660 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.636 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.553 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.547 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.463 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.459 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:29.376 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:29.370 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:28.248 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:28.240 pm debugskip: MeterReport(scale: 2, rateType: 1, scale2: 0, deltaTime: 0, previousMeterValue: , meterType: 1, precision: 1, size: 4, meterValue: [0, 0, 7, 238])

dev:362020-05-13 05:17:28.240 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:28.234 pm debugparse:zw device: 04, command: 3202, payload: 21 34 00 00 07 EE 00 00 , isMulticast: false

dev:362020-05-13 05:17:25.622 pm debugskip: SwitchBinaryReport(value:255, targetValue:0, duration:0)

dev:362020-05-13 05:17:25.619 pm debugparse:zw device: 04, command: 2503, payload: FF , isMulticast: false

dev:362020-05-13 05:17:25.566 pm debugskip: SwitchBinaryReport(value:255, targetValue:0, duration:0)

dev:362020-05-13 05:17:25.564 pm debugparse:zw device: 04, command: 2503, payload: FF , isMulticast: false

dev:362020-05-13 05:17:25.477 pm debugskip: SwitchBinaryReport(value:255, targetValue:0, duration:0)

dev:362020-05-13 05:17:25.474 pm debugparse:zw device: 04, command: 2503, payload: FF , isMulticast: false

dev:362020-05-13 05:17:24.225 pm debugskip: SwitchBinaryReport(value:255, targetValue:0, duration:0)

dev:362020-05-13 05:17:24.221 pm debugparse:zw device: 04, command: 2503, payload: FF , isMulticast: false

dev:362020-05-13 05:17:10.315 pm debuglocked by:

Thanks for creating this tool! It is amazing.
When I updated my Red Gen 2 dimmer though the tool reports back the right firmware version but I noticed in the device details for the device when I switch back the type still says the original firmware version in the current states section/ It says firmware: 1.35 but I had updated to 1.41 and now 1.44 and it still say 1.35. Is that an innovelli driver issue where it needs to update that state when the refresh happens?

I think I figured it out, if I enable debug logging in preferences on the device, it sends a request for the new firmware version and updates that attribute. Then I can turn it off again.

Where do you find the url for the drivers?

I think you can find them here: Index of /firmware

We’ll work on posting something in the forums and knowledge base shortly

Thank you

1 Like

You have a security issue there. Someone can click on the Parent Directory link and browse the directories on the site.

i just started updating, i used the OTZ file. do I push the BIN file next? I am a little confused… Hope I did not mess this one.

@eatonjb Which switch are you updating?

LZW31 Red