bosch-thermostat / bosch-thermostat-client-python

Python3 asyncio package to talk to Bosch thermostat devices.
Apache License 2.0
23 stars 20 forks source link

Make reading of DB files async #43

Closed slovdahl closed 3 months ago

slovdahl commented 4 months ago

Should solve one of the warnings reported in https://github.com/bosch-thermostat/home-assistant-bosch-custom-component/issues/420.

Needed for fixing Home Assistant problems like:

2024-06-16 21:44:01.785 WARNING (MainThread) [homeassistant.util.loop] Detected blocking call to open inside the event loop by custom integration 'bosch' at custom_components/bosch/__init__.py, line 303: await self.gateway.check_connection() (offender: /usr/local/lib/python3.12/site-packages/bosch_thermostat_client/db/__init__.py, line 35: with open(file, "r") as db_file:), please create a bug report at https://github.com/bosch-thermostat/home-assistant-bosch-custom-component/issues
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 223, in <module>
    sys.exit(main())
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 209, in main
    exit_code = runner.run(runtime_conf)
  File "/usr/src/homeassistant/homeassistant/runner.py", line 190, in run
    return loop.run_until_complete(setup_and_run_hass(runtime_config))
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 672, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 639, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.12/asyncio/base_events.py", line 1988, in _run_once
    handle._run()
  File "/usr/local/lib/python3.12/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 165, in async_setup_component
    result = await _async_setup_component(hass, domain, config)
  File "/usr/src/homeassistant/homeassistant/setup.py", line 447, in _async_setup_component
    await asyncio.gather(
  File "/usr/src/homeassistant/homeassistant/setup.py", line 449, in <genexpr>
    create_eager_task(
  File "/usr/src/homeassistant/homeassistant/util/async_.py", line 37, in create_eager_task
    return Task(coro, loop=loop, name=name, eager_start=True)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 742, in async_setup_locked
    await self.async_setup(hass, integration=integration)
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 594, in async_setup
    result = await component.async_setup_entry(hass, self)
  File "/config/custom_components/bosch/__init__.py", line 149, in async_setup_entry
    _init_status: bool = await gateway_entry.async_init()
  File "/config/custom_components/bosch/__init__.py", line 246, in async_init
    if await self.async_init_bosch():
  File "/config/custom_components/bosch/__init__.py", line 303, in async_init_bosch
    await self.gateway.check_connection()
slovdahl commented 4 months ago

The get_*_errors methods in bosch_thermostat_client/db/__init__.py are unfortunately still not async friendly. I'm not sure how to make them async friendly, as the methods are called in field initializers. I suspect we may have to rethink it a bit to make it work fine in Home Assistant going forward.

rikroe commented 3 months ago

The get_*_errors methods in bosch_thermostat_client/db/__init__.py are unfortunately still not async friendly. I'm not sure how to make them async friendly, as the methods are called in field initializers. I suspect we may have to rethink it a bit to make it work fine in Home Assistant going forward.

I would suggest loading the errors into the BaseGateway object and reference them from there. I'll have a look if I can implement this.

EDIT: Opened https://github.com/slovdahl/bosch-thermostat-client-python/pull/1 to refactor getting the errors as well.

slovdahl commented 3 months ago

@rikroe nice, thank you!