Unable to update any switches' firmware in Z2M

Attempting to update to latest 2.15 firmware from (mostly) 2.14… Every single switch “Fails to respond” to OTA request in Z2M. I’ve tried cycling the switch + Z2M to no avail.

Z2M logs:

Initial firmware version request works fine:

zigbee2mqtt  | [2024-05-04 12:04:46] info:      z2m: Updating 'Front Door Foyer Lights' to latest firmware
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:controller:endpoint: ZCL command 0x040d84fffe02b0de/1 genBasic.read(["dateCode","swBuildId"], {"timeout":10000,"disableResponse":false,"di
sableRecovery":false,"disableDefaultResponse":true,"direction":0,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false,"sendPolicy"
:"immediate"})
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack: sendZclFrameToEndpointInternal 0x040d84fffe02b0de:53992/1 (0,0,1)
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: SREQ: --> AF - dataRequest - {"dstaddr":53992,"destendpoint":1,"srcendpoint":1,"clusterid":0,"transid":105,"options":0,"radius
":30,"len":7,"data":{"type":"Buffer","data":[16,86,0,6,0,0,64]}}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:writer: --> frame [254,17,36,1,232,210,1,1,0,0,105,0,30,7,16,86,0,6,0,0,64,126]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,1,100,1,0,100]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,1,100,1,0,100]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 1 - 3 - 4 - 1 - [0] - 100
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: SRSP: <-- AF - dataRequest - {"status":0}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,3,68,128,0,1,105,175]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,3,68,128,0,1,105,175]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 3 - 2 - 4 - 128 - [0,1,105] - 175
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: AREQ: <-- AF - dataConfirm - {"status":0,"endpoint":1,"transid":105}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,3,69,196,232,210,0,184]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,3,69,196,232,210,0,184]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 3 - 2 - 5 - 196 - [232,210,0] - 184
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: AREQ: <-- ZDO - srcRtgInd - {"dstaddr":53992,"relaycount":0,"relaylist":[]}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,45,68,129,0,0,0,0,232,210,1,1,0,18,0,54,50,161,0,0,25,24,86,1,6,0,0,66,8,50,48,50,51,48,51,51,49,0,64,0,66,4,
50,46,49,52,232,210,29,69]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,45,68,129,0,0,0,0,232,210,1,1,0,18,0,54,50,161,0,0,25,24,86,1,6,0,0,66,8,50,48,50,51,48,51,51,49,0,
64,0,66,4,50,46,49,52,232,210,29,69]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 45 - 2 - 4 - 129 - [0,0,0,0,232,210,1,1,0,18,0,54,50,161,0,0,25,24,86,1,6,0,0,66,8,50,48,50,51,48,51,51,49,
0,64,0,66,4,50,46,49,52,232,210,29] - 69
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: AREQ: <-- AF - incomingMsg - {"groupid":0,"clusterid":0,"srcaddr":53992,"srcendpoint":1,"dstendpoint":1,"wasbroadcast":0,"link
quality":18,"securityuse":0,"timestamp":10564150,"transseqnumber":0,"len":25,"data":{"type":"Buffer","data":[24,86,1,6,0,0,66,8,50,48,50,51,48,51,51,49,0,64,0,66,4,50,46,49,52]}}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     z2m: Received Zigbee message from 'Front Door Foyer Lights', type 'readResponse', cluster 'genBasic', data '{"dateCode":"20230331","swBuildId":"2.14"}' from endpoint 1 with groupID 0

Z2M then sends the update request:

zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zhc:ota:common: Updating to latest '0x040d84fffe02b0de' (VZM31-SN)
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zhc:ota:common: Using endpoint '1'
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:controller:endpoint: CommandResponse 0x040d84fffe02b0de/1 genOta.imageNotify({"payloadType":0,"queryJitter":100}, {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":1,"srcEndpoint":null,"reservedBits":0,"manufacturerCode":null,"transactionSequenceNumber":null,"writeUndiv":false,"sendPolicy":"immediate"})
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack: sendZclFrameToEndpointInternal 0x040d84fffe02b0de:53992/1 (0,0,1)
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: SREQ: --> AF - dataRequest - {"dstaddr":53992,"destendpoint":1,"srcendpoint":1,"clusterid":25,"transid":106,"options":0,"radius":30,"len":5,"data":{"type":"Buffer","data":[25,87,0,0,100]}}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:writer: --> frame [254,15,36,1,232,210,1,1,25,0,106,0,30,5,25,87,0,0,100,82]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,1,100,1,0,100]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,1,100,1,0,100]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 1 - 3 - 4 - 1 - [0] - 100
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: SRSP: <-- AF - dataRequest - {"status":0}
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext []
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: <-- [254,3,68,128,0,1,106,172]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --- parseNext [254,3,68,128,0,1,106,172]
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:unpi:parser: --> parsed 3 - 2 - 4 - 128 - [0,1,106] - 172
zigbee2mqtt  | [2024-05-04 12:04:46] debug:     zh:zstack:znp: AREQ: <-- AF - dataConfirm - {"status":0,"endpoint":1,"transid":106}

And then eventually times out:

zigbee2mqtt  | [2024-05-04 12:05:46] error:     z2m: Update of 'Front Door Foyer Lights' failed (OTA: Device didn't respond to OTA request)
zigbee2mqtt  | [2024-05-04 12:05:46] debug:     z2m: Error: OTA: Device didn't respond to OTA request
zigbee2mqtt  |     at requestOTA (/app/node_modules/zigbee-herdsman-converters/src/lib/ota/common.ts:314:15)
zigbee2mqtt  |     at Object.updateToLatest (/app/node_modules/zigbee-herdsman-converters/src/lib/ota/common.ts:436:21)
zigbee2mqtt  |     at OTAUpdate.onMQTTMessage (/app/lib/extension/otaUpdate.ts:273:41)
zigbee2mqtt  |     at EventEmitter.wrappedCallback (/app/lib/eventBus.ts:174:17)

Searching the logs for theaddr=53992 yields no other response, so it doesnt look like the response is received but not being parsed correctly or something.

This happens on all of my ~20 switches around the house, so I dont suspect it’s a switch-specific issue. I’m wondering if Z2M is sending a correctly-formatted update request to the switches

Z2M config:

Zigbee2MQTT version
1.37.0 commit: 46f34c8
Coordinator type zStack3x0
Coordinator revision 20240315

Try airgapping the switch first, then sending the OTA request from Z2M and the immediately powering the switch back up. I’ve found that this can catch them sometimes when they are stuck.

No luck with airgapping, unfortunately

Hi yes, have tried running one switch at the time and am otherwise able to control the switch w/o issue, so I dont suspect interference. I’ve included the logs and the version info in the original post. Please let me know if you need anything else.

Edit: This was in response to a post from someone I think at inovelli who has since deleted the post

Yeah I’m not sure who that was, but it seemed very AI to me

The response was a new account that only posted that one message. I removed it because it was a super AI generated post and didn’t ask any new questions that you hadn’t already answered.

I don’t believe it was from anyone at Inovelli.