Official Support for HTD is coming!

Did this Feb 2026 update break HTD for anyone else?

I updated and HTD stopped working, I restored back to Jan 2026 and it worked, updated again to 2026 and HTD broke again.

HTD is saying “This entity is no longer being provided by the htd integration. If the entity is no longer in use, delete it in settings.”
The service says it “Failed to set up: Import error”
Log file shows:

Logger: homeassistant.config_entries
Source: config_entries.py:730
First occurred: 8:01:22 AM (1 occurrence)
Last logged: 8:01:22 AM

Error importing platform config_flow from integration htd to set up htd configuration entry: Exception importing custom_components.htd.config_flow

as well as:

Logger: homeassistant.loader
Source: loader.py:1275
First occurred: 8:01:19 AM (5 occurrences)
Last logged: 8:01:45 AM

Unexpected exception importing platform custom_components.htd.config_flow
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/loader.py", line 1275, in _load_platform
    cache[full_name] = self._import_platform(platform_name)
                       ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/loader.py", line 1307, in _import_platform
    return importlib.import_module(f"{self.pkg_path}.{platform_name}")
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/util/loop.py", line 201, in protected_loop_func
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.13/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 1023, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/config/custom_components/htd/config_flow.py", line 25, in <module>
    class HtdConfigFlow(ConfigFlow, domain=DOMAIN):
    ...<111 lines>...
            )
  File "/config/custom_components/htd/config_flow.py", line 34, in HtdConfigFlow
    self, discovery_info: dhcp.DhcpServiceInfo
                          ^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'homeassistant.components.dhcp' has no attribute 'DhcpServiceInfo'

and:

Logger: homeassistant.config_entries
Source: config_entries.py:3969
First occurred: 8:01:45 AM (1 occurrence)
Last logged: 8:01:45 AM

Error occurred loading flow for integration htd: Exception importing custom_components.htd.config_flow

Anyone have an idea what this means?

Yes. I am experiencing the same problem. I am restoring to 2026.1.3 now.

Sorry all, a quick claude question fixed it. wow ai is awsome.
The DHCP discovery API was completely restructured. Try this:
/homeassistant/custom_components/htd/config_flow.py
Replace line 6:

python

from homeassistant.helpers import discovery_flow

With:

python

from homeassistant.data_entry_flow import FlowResult

Then change the async_step_dhcp method (lines 33-66) to:

python

async def async_step_dhcp(
    self, discovery_info: dict[str, Any]
) -> FlowResult:
    """Handle dhcp discovery."""
    _LOGGER.info("HTD device detected: %s %s" % (discovery_info["ip"], self.port))
    host = discovery_info["ip"]
    network_address = (host, self.port)
    model_info = await async_get_model_info(network_address=network_address)

    if model_info is None:
        return self.async_abort(reason="unknown_model")

    _LOGGER.info("Model identified as: %s" % model_info)

    unique_id = "htd-%s" % discovery_info["macaddress"]

    await self.async_set_unique_id(unique_id)

    self.unique_id = unique_id
    new_user_input = {
        CONF_HOST: discovery_info["ip"],
        CONF_PORT: self.port,
        CONF_UNIQUE_ID: unique_id,
    }

    self._abort_if_unique_id_configured()

    self.context["title_placeholders"] = {
        CONF_NAME: f"{model_info["friendly_name"]} ({host})",
    }

    return await self.async_step_custom_connection(new_user_input)

Key changes: DhcpServiceInfodict[str, Any] and discovery_info.ipdiscovery_info["ip"]

Yikes!! I will definitely fix this and push a new update this weekend. It is defintiely my intention to keep supporting this extension. Can you log an issue here please? GitHub · Where software is built - NEVERMIND - i see the issue reported here - HTD Integration uses DhcpServiceInfo constant which is getting deprecated in HA Core 26.2 · Issue #25 · hikirsch/htd-home-assistant · GitHub

Also all - I am sorry for the neglect, I do see other issues reported and I have definitely been lacking as far as updating this integration. I’ll get on fixing these problems soon!

Ok! I released 2.0.0-rc.3 - thank you UngluedChalice for this quick fix. If someone can please let me know that all is good again. I will check out some of the other issues reported soon.

You also still have the issue where all the zone sources are just title Source XX and not pulling in the actual names of the sources. Let me know if you want some help coding that.

i cannot pull the source names that the app uses. This is proprietary to the HTD app.

I’ll get you the code to do it. I’ve written it before when I was writing plugins for Homeseer. I’ll just have to dig it up.

I was looking through your repo and don’t see where you’re pulling HTD Client from. My code was written in c#, was going to convert it to python so you could plop it in, but don’t see where your client comes from.

the implementation you probably have is not going to be fully compatible I can assure you this source name issue is . much more complicated. I appreciate you’re willingness to want to support the source names but considering the complexity for how it actually works within the eco and what you get, it really is not worth it. it’s very fragmented.

The power option in back but it will not let me switch sources in app

Just tested my code it works just fine, converted it to python for you if you want it I just uploaded a repo for you. GitHub - kingfetty/htd_lync: HTD Lync Serial Controller

snippet screenshot showing source names and zone names being dumped

Hi All -

I have released a new rc.4 of this integration that should fix a few things.

  1. the version upgrade issue with 2026.2 wasn’t fixed properly with rc.3, this should be fixed with rc.4. the minimum Home Assistant version is now 2025.7.4
  2. the min/max volume issues should be resolved for both mca and lync.

i have also been focusing a lot on stability with the client. i see a lot of you are complaining about how you are clicking buttons in the UI and nothing happens. the MCA/Lync devices can lock up if you issue too many commands within a small amount of time. it is recommended that power cycle both the gateway and the receiver if this happens.

it is also possible that the client could be trying to issue a new command that hasn’t been executed yet because of a timeout or another reason and indirectly caused issues with the device.

the work i’ve been putting in the past couple of weeks has been to try and solve these issues. i look forward to more feedback and hopefully this time around, I’ll turn around fixes in a more timely fashion.

thanks everyone.

–Adam

if you think you can include this in such a way that we can maintain this, we can get it in. i would really like to keep parity between the Lync and MCA devices so I would need something like this for the MCA too. we also need to support the ability for people to update the names of the zones and sources.

if you want to create a new on the client repo (GitHub - hikirsch/python-htd) then we can get to work there and pull that into the integration when it’s ready.

Ok well, as soon as I added it to my Home Assistant it crashed. After all the testing and everything I dont know why something so simple didn’t work this time. I set the release back to preview so you all don’t get prompted to upgrade. I’ll try and get on another fix today.

HTD maintains 3 system levels: Entry-level (DMA), Mid-level (MC/MCA), and Advanced (Lync). It seems arbitrary to join two of those three at the hip and limit the advanced Lync functionality to just that available on the mid-level - yet not extend the same principle to the entry level (which would be consistent but compounding the issue). It seems cleanest to mirror what the manufacturer is doing, and recognize the three systems as distinct. And there’s nothing wrong with the more advanced system having “more better sooner” features while the mid-level falls back on the current handling.

I think the way you have it now should be able to continue to work for MCA.

Thanks so much for all this wonderful work!

I’ll fork your repo this weekend and get some work posted so we can look at how you want the direction of this to go. What I want to avoid is having competing plugins out there doing the same or similar functionality. I would much rather combine any efforts to produce a better more supported plugin.

At the same time I agree with @Chef-de-IT that we shouldn’t hamper the capabilities of the more advanced systems such as Lync vs MCA. If you’ve played with my code or toyed with it any way it has 100% feature coverage of the Lync’s capabilities. It can change zone names, source names, set bass/trouble, turn on DND, all of it. Perhaps we have the plugin query the system as to which type it is and then instantiate the proper client based on the capabilities.

I also think bringing more developers in to contribute would produce a better more maintainable product.

Thoughts?

I couldn’t agree more! As a former user of the HomeSeer plugin for HTD, it was second to none and probably the most lacking plugin when I migrated to HomeAssistant.

I appreciate everyones efforts on making this HTD Home Assisant plugin great!

ok so, i’m fine with this feature as long as it doesn’t complicate the maintenance of it going forward.

i am planning zone and source management for both Lync and MCA, that also bypasses HTD’s hardware naming restrictions and stores everything within Home Assistant instead.

Out of curiosity, which is more important, the freedom to name sources whatever you want (symbols, no max length), or the ability to load the names directly from the HTD hardware settings?

hey all -

i went ahead and released rc.5 if you can please do me a favor and try upgrading to this and let me know if everyone’s doing ok.

thanks!