Automatic firmware update gone?

I had automatic firmware update configured to use my local repository and it worked fine and then I didn’t add new devices for quite a while. I just added a new device (same as previous) and while I could add it, the firmware isn’t being updated and I really need it to be updated (old firmware is buggy). I am using the builtin zigby (not z2m) and have it configured like this:

zha:
  custom_quirks_path: /config/custom_zha_quirks/
  enable_quirks: true
  database_path: /config/zigbee.db
  zigpy_config:
    ota:
      otau_directory: /config/zigpy_ota
      ikea_provider: true
      inovelli_provider: true
      ledvance_provider: true
      salus_provider: true
      sonoff_provider: true
      thirdreality_provider: true

The configuration is unchanged as are the files in ./config/zigpy_ota.

Has the automatic firmware update been disabled/removed from homeassistant? If so, how do I update the firmware?

Additional information:

I upgraded to 2025.3.3 and now I see that HA reports the firmware to be this:

Installed version 0x00030a0f
Latest version 0x00030a0f

But the lastest version ix 0x00030c10 (the version my other devices use).

So HA doesn’t know there is a newer version, even though I have provided one in configuration but it also exists online here:

Apparently the configuration on how to make homeassistant away of firmwares has changed. Does anyone know any details?

I have tried to modify my configuration.yaml and the index.json file in zigpy_ota and also tried using the url to koenkk’s index.json file, but nothing worked. I have tried so many configurations but I am unable to make homeassistant pick up the new firmware, regardless of where it is.

I am going by this document and as long as I follow the syntax in it, zigpy loads, but otherwise ignores my changes:

I just don’t know how that configuration must be…

I think the syntax for zigbee in the configuration.yaml has changed but I can’t find the documentation I used to update my configuration. This is what I have for my Third Reality devices:

zha:
zigpy_config:
ota:
extra_providers: [{‘type’: ‘thirdreality’}] # thirdreality_provider: true # Auto update 3REALITY devices DEPRECATED

I know this uses OTA built into ZHA and not a local repository but maybe it will point you to a resolution in terms of syntax.

Thank you for the effort, but my devices are from Develco and are not supported by default and hence need a different configuration. I have tried various permutations, but homeassistant keeps claiming that there are no new firmware available, which I know is wrong as I have a newer locally AND there is a newer at Koenkk’s github. I will keep trying some permutations, but I hope someone having experience with the new setup including locally supplied firmwares would turn up and give some hints.

Just to give some information on what I have tried:

This is my configuration.yaml:

zha:
  custom_quirks_path: /config/custom_zha_quirks/
  enable_quirks: true
  database_path: /config/zigbee.db
  zigpy_config:
    ota:
      extra_providers:
        - type: zigpy_local
          index_file: /config/zigpy_ota/version_info.json
        - type: zigpy_local
          index_file: /config/zigpy_ota/index2.json
#        - type: zigpy_remote
#          url: "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/refs/heads/master/index.json"
#          manufacturer_ids: [ 0x1015 ]
        - type: advanced
          warning: I understand I can *destroy* my devices by enabling OTA updates from
            files. Some OTA updates can be mistakenly applied to the wrong
            device, breaking it. I am consciously using this at my own risk.
          path: /config/zigpy_ota

In the zigpy_ota I have tried with 3 different json files:

cat version_info.json
[
    {
        "binary_url": "file:///config/zigpy_ota/ZR - Smartplug New - Release-SSIG_3.12.16.zigbee",
        "file_version": 199696,
        "image_type": 736,
        "manufacturer_id": 4117,
        "changelog": "",
        "checksum": "sha3-256:c06f964e0ce748a987fdb49af325f218da526049993a8f5b3795c8b89478b46d"
    }
]
cat index.json
{
  "firmwares": [
    {
      "fileName": "ZR_Smartplug_SSIG_3.12.16.zigbee",
      "fileVersion": 199696,
      "fileSize": 181164,
      "url": "file:///config/zigpy_ota/ZR - Smartplug New - Release-SSIG_3.12.16.zigbee"
      "imageType": 736,
      "manufacturerCode": 4117,
      "sha512": "eaf4e925dbdf32f171fb8323c52b8652620dea5d62bc007e61ee61d276bdd90f097400a1c1bc48980d78c276117415e274c34529b481be82c28cd3695e2be817",
      "otaHeaderString": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
    }
  ]
}
cat index2.json
{
  "firmwares": [
    {
      "fileName": "ZR_Smartplug_SSIG_3.12.16.zigbee",
      "fileVersion": 199696,
      "fileSize": 181164,
      "path": "file:///config/zigpy_ota/ZR - Smartplug New - Release-SSIG_3.12.16.zigbee"
      "imageType": 736,
      "manufacturer_id": 4117,
      "checksum": "sha3-256:c06f964e0ce748a987fdb49af325f218da526049993a8f5b3795c8b89478b46d"
    }
  ]
}

Paths have been tried as host paths (using container version of HA) and client paths in the json files.

The configuration.yaml options where enabled one by one and also multiple at the same time. Nothing works.

The solution is this (for me):

I ended up with this configuration:

zha:
  custom_quirks_path: /config/custom_zha_quirks/
  enable_quirks: true
  database_path: /config/zigbee.db
  zigpy_config:
    ota:
      extra_providers:
        - type: z2m_local
          index_file: /config/zigpy_ota/index3.json

With my index3.json file containing this (copied directly from Koenkk’s index.json):

[
  {
    "fileName": "ZR_Smartplug_SSIG_3.12.16.zigbee",
    "fileVersion": 199696,
    "fileSize": 181164,
    "url": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Develco/ZR_Smartplug_SSIG_3.12.16.zigbee",
    "imageType": 736,
    "manufacturerCode": 4117,
    "sha512": "eaf4e925dbdf32f171fb8323c52b8652620dea5d62bc007e61ee61d276bdd90f097400a1c1bc48980d78c276117415e274c34529b481be82c28cd3695e2be817",
    "otaHeaderString": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
  }
]

And then (after a restart) go to setup/dashboard and click the Refresh button in the top right (or go to setup/updates, which may do the same). The update should be offered and you can simply start it from the GUI and even follow the update progress.