The OTA update does appear to be completing and showing file_version=16908815 which is definitely 2.15
2023-08-24 10:40:48.861 DEBUG (MainThread) [zigpy.zcl] [0x5EC7:1:0x0019] OTA image_block handler for 'Inovelli VZM31-SN': field_control=0, manufacturer_id=4655, image_type=257, file_version=16908815, file_offset=306760, max_data_size=63, request_node_addr=None, block_request_delay=None
2023-08-24 10:40:48.861 DEBUG (MainThread) [zigpy.zcl] [0x5EC7:1:0x0019] OTA upgrade progress: 100.0
2023-08-24 10:40:48.861 DEBUG (MainThread) [zigpy.zcl] [0x5EC7:1:0x0019] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), tsn=79, command_id=5, *direction=<Direction.Client_to_Server: 1>)
2023-08-24 10:40:48.923 DEBUG (MainThread) [zigpy.zcl] [0x5EC7:1:0x0019] OTA upgrade_end handler for 'Inovelli VZM31-SN': status=Status.SUCCESS, manufacturer_id=4655, image_type=257, file_version=16908815
2023-08-24 10:40:48.924 DEBUG (MainThread) [zigpy.zcl] [0x5EC7:1:0x0019] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), tsn=80, command_id=7, *direction=<Direction.Client_to_Server: 1>)
Is there a way to force ZHA to read the same cluster as what’s being done with Z2M?
What’s happening on Z2M is that the update completes, but then you have to manually pull the firmware version for Z2M to show the right number. If the same is happening in ZHA and it’s set to not only automatically update but also to force that update, it will just continue to loop.
On an unrelated note, you do have an error with an OTA file for a different device
Error Log
2023-08-24 10:28:17.123 DEBUG (MainThread) [zigpy.ota.provider] FileStore: ImageKey(manufacturer_id=4447, image_type=14976): Preferring '/config/zigpy_ota/20221009111923_OTA_lumi.curtain.acn002_0.0.0_1530_20221009_6C9C3D.ota' over '/config/zigpy_ota/20220728181102_OTA_lumi.curtain.acn002_0.0.0_1529_20220720_47B747.ota'
2023-08-24 10:28:17.125 DEBUG (SyncWorker_1) [zigpy.ota.provider] File '/config/zigpy_ota/20211228180917_OTA_lumi.switch.b1naus01_0.0.0_0031_20211228_5689C8.ota' doesn't appear to be a OTA image
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 272, in parse_ota_image
return HueSBLOTAImage.deserialize(data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 200, in deserialize
header, remaining_data = OTAImageHeader.deserialize(data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 112, in deserialize
raise ValueError(
ValueError: Wrong magic number for OTA Image: 168430090
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/provider.py", line 515, in scan_image
parsed_image, _ = parse_ota_image(f.read())
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 274, in parse_ota_image
return OTAImage.deserialize(data)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 162, in deserialize
hdr, data = OTAImageHeader.deserialize(data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/zigpy/ota/image.py", line 112, in deserialize
raise ValueError(
ValueError: Wrong magic number for OTA Image: 168430090