[RELEASE] Homebridge Hubitat v2.0

Do we have a quick and dirty "best practice" guide to update HomeBridge? I'm ready to make the leap, but want to desperately avoid issues others have experienced. In my quick glance over the thread, @jtp10181, is your order of upgrade probably the best bet at this point?

Maybe? I think there was mention up above of adding a check to prevent issues if only one part was updated, so it may not matter anymore. No one has posted yet saying they had no issues but I imagine the silence of all the other users means it worked fine?

Seems like use the Controller app to make a backup first and then have some free time on your hands in case you have to rebuild some stuff.

1 Like

3 of 4 bridges worked. One gave an error.

Update: the child bridge that's not able to open, still works on the HomeBridge / Home side. The child bridge that that is showing all No Response is a HomeBridge app that opens fine.

Update 2: cleared cache for the No Response child bridge. restored from Controller backup. matched up devices. had to rearrange some device placement in Home app. Homebridge / Home appears to be working well. A couple devices not supported and a bunch of devices have capabilities that I don't want or didn't exist before. Will go through that cleaning.

At this point, I just need to fix the one broken Homebridge App in HE as shown above. Please help!

You must have a device selected in there that has been removed from the hub.

Try making this super minor mod to line 566

desc += spanSmBr("${sBULLET} ${dev?.displayName}: [${attrs.join(', ')}]", sCLR4D9)

Just added a single ? to make it null safe hopefully.

2 Likes

Everything is stable since updating, except I’m seeing one issue related to Adaptive Lighting. Whenever I reboot the child bridge, or Homebridge, I have to go into the Home app and re-enable Adaptive Lighting for all of the lights. This is something I have not had to do previous to the update.

Thanks for reporting this... I will investigate

1 Like

I will get this added to the public code

1 Like

I pushed out v3.0.5 of the app and plugin

3 Likes

I updated, but still have to re-enable Adaptive Lighting after rebooting Homebridge. Maybe it’s a HB 2.0 issue?

I got most things back to where they were by clearing the Homebridge accessory cache and applying a Controller backup - BUT - Scenes are not working (devices show as on or off, but are not). I have tried deleting and recreating the scenes, rebooting the Home hub, removing and adding back accessories, and a few other things - no joy. Anyone have any advice for how to get my scenes to work again?

Unfortunately, it did not.

I open the app, I get the upgrade page, click Done, and then get the error.

Another observation: while updating to 3.0.5, HPM told me I was on 2.9.12 or something like that. Basically, v2, which I wasn’t. Don’t think that is related.

Any other idea?

Looking back that error should not even have been possible with the original code, there was a null check right above the line I fixed, so my fix was not needed.

You are going to have to look in your apps code, first make sure there is only one instance of "Homebridge v2" code installed. Open the one that shows your installed app under "Used by" and then check line 566 and see if its the same.

If you find duplicated apps code you should delete the not in use ones, then in HPM under settings "Unmatch" the package, then run a match up to link it back up the in use code, then update or repair.

You could also add in a temporary debug line like this. I tried to make sure it would work but however I have mine configured it does not even hit those lines.

            if (dev) {
                log.debug("DEV VALUE: ${dev}")
                desc += spanSmBr("${sBULLET} ${dev?.displayName}: [${attrs.join(', ')}]", sCLR4D9)
            }

I recently reinstalled homebridge-hubitat v2 and have everything working again, except for a problem with automations.

In the previous version, automations controlled all devices as expected. Now I can’t get more than two devices to respond.

Example: I have a Z-Wave button set up with an automation to close three separate blinds. When triggered, only two blinds respond — the third never does. If I delete and recreate the automation, a different set of two blinds will work, but never all three.

I enabled DEBUG=HAP-NodeJS:* logging and confirmed that Homebridge is receiving all three commands, but Hubitat only processes two of them.

Is anyone else seeing this behavior after moving to v3?

04 E605" for events
2025-09-14T05:17:16.494Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Motion Detected" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.496Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.498Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.498Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.500Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":182,"iid":17,"ev":true},{"aid":182,"iid":16,"ev":true},{"aid":182,"iid":12,"ev":true},{"aid":182,"iid":11,"ev":true},{"aid":182,"iid":10,"ev":true}]}
2025-09-14T05:17:16.500Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Charging State" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.500Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Battery Level" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.501Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Low Battery" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.501Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Tampered" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.503Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.505Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.506Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.507Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":233,"iid":10,"ev":true},{"aid":233,"iid":11,"ev":true}]}
2025-09-14T05:17:16.507Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "On" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.508Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Brightness" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.510Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.512Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.512Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.513Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":181,"iid":11,"ev":true},{"aid":181,"iid":10,"ev":true},{"aid":181,"iid":12,"ev":true},{"aid":181,"iid":16,"ev":true},{"aid":181,"iid":17,"ev":true}]}
2025-09-14T05:17:16.514Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Tampered" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.514Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Low Battery" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.514Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Battery Level" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.515Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Charging State" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.517Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.519Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.519Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.520Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":180,"iid":16,"ev":true},{"aid":180,"iid":17,"ev":true},{"aid":180,"iid":11,"ev":true},{"aid":180,"iid":12,"ev":true},{"aid":180,"iid":10,"ev":true}]}
2025-09-14T05:17:16.521Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Battery Level" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.521Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Charging State" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.521Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Tampered" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.522Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Status Low Battery" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.524Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.526Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.527Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.528Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":231,"iid":10,"ev":true}]}
2025-09-14T05:17:16.530Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:16.532Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:16.532Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:16.533Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":170,"iid":20,"ev":true},{"aid":170,"iid":19,"ev":true},{"aid":170,"iid":10,"ev":true},{"aid":170,"iid":11,"ev":true},{"aid":170,"iid":15,"ev":true},{"aid":170,"iid":14,"ev":true}]}
2025-09-14T05:17:16.534Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Charging State" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.534Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Battery Level" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.535Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "On" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.535Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Brightness" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.535Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Volume" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.535Z HAP-NodeJS:Accessory [::ffff:192.168.1.74] Registered Characteristic "Mute" on "Homebridge A404 E605" for events
2025-09-14T05:17:16.538Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:27.162Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics
2025-09-14T05:17:27.162Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: PUT /characteristics
2025-09-14T05:17:27.163Z HAP-NodeJS:Accessory [Homebridge A404 E605] Processing characteristic set: {"characteristics":[{"aid":245,"iid":12,"value":0},{"aid":239,"iid":12,"value":0},{"aid":240,"iid":12,"value":0}]}
[13/09/2025, 22:17:27] [Hubitat-v2] Queueing Device Command: close | Name: (Kitchen Blinds) | DeviceID: (132)
2025-09-14T05:17:27.167Z HAP-NodeJS:Accessory [Homebridge A404 E605] Setting Characteristic "Target Position" to value 0
2025-09-14T05:17:27.167Z HAP-NodeJS:Accessory [Homebridge A404 E605] Setting Characteristic "Target Position" to value 0
2025-09-14T05:17:27.168Z HAP-NodeJS:Accessory [Homebridge A404 E605] Setting Characteristic "Target Position" to value 0
2025-09-14T05:17:27.170Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
[13/09/2025, 22:17:27] [Hubitat-v2] Recording command metrics for device Kitchen Blinds (132): close
[13/09/2025, 22:17:27] [Hubitat-v2] Processing batch of 1 device updates (0 remaining)
[13/09/2025, 22:17:27] [Hubitat-v2] Processing update for device Kitchen Blinds: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] WindowCovering | Kitchen Blinds | Attribute update: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] Battery | Kitchen Blinds | Attribute update: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] Recording metrics for device Kitchen Blinds (132): windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] Queueing Device Command: close | Name: (Entrance Blinds R) | DeviceID: (96)
[13/09/2025, 22:17:27] [Hubitat-v2] Recording command metrics for device Entrance Blinds R (96): close
[13/09/2025, 22:17:27] [Hubitat-v2] Processing batch of 1 device updates (0 remaining)
[13/09/2025, 22:17:27] [Hubitat-v2] Processing update for device Entrance Blinds R: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] WindowCovering | Entrance Blinds R | Attribute update: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] Battery | Entrance Blinds R | Attribute update: windowShade = closing
[13/09/2025, 22:17:27] [Hubitat-v2] Recording metrics for device Entrance Blinds R (96): windowShade = closing
2025-09-14T05:17:27.669Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] Sending HAP event notifications [ { aid: 245, iid: 11, value: 0 }, { aid: 240, iid: 11, value: 0 } ]
2025-09-14T05:17:27.683Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP request: /characteristics?id=1.7
2025-09-14T05:17:27.684Z HAP-NodeJS:HAPServer [0E:5E:42:4A:A4:04] HAP Request: GET /characteristics?id=1.7
2025-09-14T05:17:27.685Z HAP-NodeJS:Accessory [Homebridge A404 E605] Got Characteristic "Firmware Revision" value: "1.11.0"
2025-09-14T05:17:27.687Z HAP-NodeJS:EventedHTTPServer:Connection [::ffff:192.168.1.74] HTTP Response is finished
2025-09-14T05:17:28.841Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49370
2025-09-14T05:17:28.847Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.859Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.873Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49371
2025-09-14T05:17:28.891Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49372
2025-09-14T05:17:28.904Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.916Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.929Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.943Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49374
2025-09-14T05:17:28.953Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49373
2025-09-14T05:17:28.968Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.979Z HAP-NodeJS:EventedHTTPServer Currently 0 hap connections open: 
2025-09-14T05:17:28.991Z HAP-NodeJS:EventedHTTPServer Currently 1 hap connections open: ::ffff:192.168.1.74:49375
Looking at that log snippet, the important part is this line:

Processing characteristic set: {"characteristics":[
  {"aid":245,"iid":12,"value":0},
  {"aid":239,"iid":12,"value":0},
  {"aid":240,"iid":12,"value":0}
]}


That means HomeKit sent one PUT request (/characteristics) containing a batch of 3 characteristic updates — one for each blind.

You can see Homebridge then expands them:

Setting Characteristic "Target Position" to value 0
Setting Characteristic "Target Position" to value 0
Setting Characteristic "Target Position" to value 0


So in this case:

Number of commands HomeKit sent: 3 (all in a single request).

Devices targeted: three blinds (AIDs 245, 239, 240).

Hubitat plugin handling: it shows queuing commands for Kitchen Blinds (132) and Entrance Blinds R (96) in the log you shared. The third blind (the one with AID 239) is present in the request but doesn’t show a queued command in this snippet.

This sounds similar to the issue I have with Scenes. I ended up using Hubitat for the scene, and just controlling the “scene activator” via HomeKit.

Gives me:

So it's choking after Vent Powder Bath. (I put in another debug command before the suggested line in another test) . But that doesn't help me figure out which device that is. Even if I did figure it out, would I be able to do anything about it if it's missing?

My interpretation of the code is that these are custom Attributes to filter out. Is there a way to skip over this one device, and keep going? Then, when I save, that device would no longer have a filtered attribute. And all would be well?

It is supposed to be doing that already, there is a null check on line 565. if (dev) should only pass if that object exists and had data in it. However sometimes it is better to check != null in groovy so try this:

            if (dev && dev != null) {
                log.debug("DEV VALUE: ${dev}")
                desc += spanSmBr("${sBULLET} ${dev?.displayName}: [${attrs.join(', ')}]", sCLR4D9)
            }

Still no go. :frowning:

Instead of checking for null, can I precheck if "${dev?.displayName}" gives an error without it throwing an actual error and aborting? Maybe some try/catch code? I don't know how to properly code or use that.

@jtp10181 , THANK YOU for your help!

I managed to hack together this code which resolved line 566 error. Then had to do the same for line 522. HomeBridge app opened and allowed me to copy and delete the custom attributes and custom capabilities. I now have those saved so can cross check with nonexistent devices or changes to entry format.

                try {
                    if (${dev?.displayName}) {
                    }
                } catch (Exception e) {
                    log.debug("DEV VALUE: skipping errant device")
                    return
                }

Ah yes good call on the try / catch. I always forgot about using that.

This would probably be a more proper implementation of it (from line 560)

    if (perDev && perDev.keySet()?.size()) {
        setupTempDeviceSetting(perDev.keySet() as List<String>)
        desc += spanSmBldBr('Per-Device:', sCLR4D9)
        perDev.each { String devId, attrs ->
            def dev = settings.tempDeviceList?.find { it.id == devId }
            if (dev) {
                try {
                    desc += spanSmBr("${sBULLET} ${dev.displayName}: [${attrs.join(', ')}]", sCLR4D9)
                } catch { 
                    log.error("getCustAttrFilterDesc skipping errant device")
                }
            }
        }
        app.removeSetting('tempDeviceList')
    }
1 Like

thx. thats what i thought but i dont like that solution. Another alternative is to turn the automation into a shortcut and then you can add a 1s delay inbetween each accessory. That works as well.