I do have another ESPHome IR transmitter. It's just a old ESP32 WROOM dev board with a transistor and some IR LEDs... very "DIY". But, I get the same error in the frontend with it as the emitter in HAIR. There aren't any log entries for it either.
EDIT:
I was able to find a HAIR-related log
Logger: homeassistant.util.loop
Source: util/loop.py:137
First occurred: 10:30:39 PM (2 occurrences)
Last logged: 10:30:39 PM
Detected blocking call to read_bytes with args (PosixPath('/config/custom_components/hair/frontend/dist/ha-panel-ir-devices.js'),) inside the event loop by custom integration 'hair' at custom_components/hair/__init__.py, line 122: raw = bundle_path.read_bytes() (offender: /config/custom_components/hair/__init__.py, line 122: raw = bundle_path.read_bytes()), please create a bug report at https://github.com/DAB-LABS/HAIR/issues For developers, please see https://developers.home-assistant.io/docs/asyncio_blocking_operations/#read_bytes Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "/usr/src/homeassistant/homeassistant/__main__.py", line 229, in <module> sys.exit(main()) File "/usr/src/homeassistant/homeassistant/__main__.py", line 215, in main exit_code = runner.run(runtime_conf) File "/usr/src/homeassistant/homeassistant/runner.py", line 289, in run return loop.run_until_complete(setup_and_run_hass(runtime_config)) File "/usr/local/lib/python3.14/asyncio/base_events.py", line 706, in run_until_complete self.run_forever() File "/usr/local/lib/python3.14/asyncio/base_events.py", line 677, in run_forever self._run_once() File "/usr/local/lib/python3.14/asyncio/base_events.py", line 2046, in _run_once handle._run() File "/usr/local/lib/python3.14/asyncio/events.py", line 94, in _run self._context.run(self._callback, *self._args) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 955, in async_setup_locked await self.async_setup(hass, integration=integration) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 694, in async_setup await self.__async_setup_with_context(hass, integration) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 787, in __async_setup_with_context result = await component.async_setup_entry(hass, self) File "/config/custom_components/hair/__init__.py", line 89, in async_setup_entry await _async_register_panel(hass, entry) File "/config/custom_components/hair/__init__.py", line 122, in _async_register_panel raw = bundle_path.read_bytes()
Detected blocking call to open with args (PosixPath('/config/custom_components/hair/frontend/dist/ha-panel-ir-devices.js'),) inside the event loop by custom integration 'hair' at custom_components/hair/__init__.py, line 122: raw = bundle_path.read_bytes() (offender: /usr/local/lib/python3.14/pathlib/__init__.py, line 777: with self.open(mode='rb', buffering=0) as f:), please create a bug report at https://github.com/DAB-LABS/HAIR/issues For developers, please see https://developers.home-assistant.io/docs/asyncio_blocking_operations/#open Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "/usr/src/homeassistant/homeassistant/__main__.py", line 229, in <module> sys.exit(main()) File "/usr/src/homeassistant/homeassistant/__main__.py", line 215, in main exit_code = runner.run(runtime_conf) File "/usr/src/homeassistant/homeassistant/runner.py", line 289, in run return loop.run_until_complete(setup_and_run_hass(runtime_config)) File "/usr/local/lib/python3.14/asyncio/base_events.py", line 706, in run_until_complete self.run_forever() File "/usr/local/lib/python3.14/asyncio/base_events.py", line 677, in run_forever self._run_once() File "/usr/local/lib/python3.14/asyncio/base_events.py", line 2046, in _run_once handle._run() File "/usr/local/lib/python3.14/asyncio/events.py", line 94, in _run self._context.run(self._callback, *self._args) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 955, in async_setup_locked await self.async_setup(hass, integration=integration) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 694, in async_setup await self.__async_setup_with_context(hass, integration) File "/usr/src/homeassistant/homeassistant/config_entries.py", line 787, in __async_setup_with_context result = await component.async_setup_entry(hass, self) File "/config/custom_components/hair/__init__.py", line 89, in async_setup_entry await _async_register_panel(hass, entry) File "/config/custom_components/hair/__init__.py", line 122, in _async_register_panel raw = bundle_path.read_bytes()