Velbus test before setup (#133069)

* Velbus test before setup

* Update homeassistant/components/velbus/__init__.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Add the connect named argument to make it clear we are testing the connection

* Correctly cleanup after the test

* Sync code for velbusaio 2024.12.2

* follow up

* rename connect_task to scan_task

---------

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
This commit is contained in:
Maikel Punie 2024-12-13 16:05:20 +01:00 committed by GitHub
parent 5f91676df0
commit f03f24f036
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 20 additions and 16 deletions

View File

@ -9,11 +9,12 @@ import os
import shutil import shutil
from velbusaio.controller import Velbus from velbusaio.controller import Velbus
from velbusaio.exceptions import VelbusConnectionFailed
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_PORT, Platform from homeassistant.const import CONF_PORT, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady from homeassistant.exceptions import ConfigEntryNotReady, PlatformNotReady
from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers import config_validation as cv, device_registry as dr
from homeassistant.helpers.storage import STORAGE_DIR from homeassistant.helpers.storage import STORAGE_DIR
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
@ -44,13 +45,13 @@ class VelbusData:
"""Runtime data for the Velbus config entry.""" """Runtime data for the Velbus config entry."""
controller: Velbus controller: Velbus
connect_task: asyncio.Task scan_task: asyncio.Task
async def velbus_connect_task( async def velbus_scan_task(
controller: Velbus, hass: HomeAssistant, entry_id: str controller: Velbus, hass: HomeAssistant, entry_id: str
) -> None: ) -> None:
"""Task to offload the long running connect.""" """Task to offload the long running scan."""
try: try:
await controller.start() await controller.start()
except ConnectionError as ex: except ConnectionError as ex:
@ -85,10 +86,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: VelbusConfigEntry) -> bo
entry.data[CONF_PORT], entry.data[CONF_PORT],
cache_dir=hass.config.path(STORAGE_DIR, f"velbuscache-{entry.entry_id}"), cache_dir=hass.config.path(STORAGE_DIR, f"velbuscache-{entry.entry_id}"),
) )
await controller.connect() try:
await controller.connect()
except VelbusConnectionFailed as error:
raise ConfigEntryNotReady("Cannot connect to Velbus") from error
task = hass.async_create_task(velbus_connect_task(controller, hass, entry.entry_id)) task = hass.async_create_task(velbus_scan_task(controller, hass, entry.entry_id))
entry.runtime_data = VelbusData(controller=controller, connect_task=task) entry.runtime_data = VelbusData(controller=controller, scan_task=task)
_migrate_device_identifiers(hass, entry.entry_id) _migrate_device_identifiers(hass, entry.entry_id)

View File

@ -16,7 +16,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusBinarySensor(channel) VelbusBinarySensor(channel)
for channel in entry.runtime_data.controller.get_all_binary_sensor() for channel in entry.runtime_data.controller.get_all_binary_sensor()

View File

@ -22,7 +22,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusButton(channel) VelbusButton(channel)
for channel in entry.runtime_data.controller.get_all_button() for channel in entry.runtime_data.controller.get_all_button()

View File

@ -27,7 +27,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusClimate(channel) VelbusClimate(channel)
for channel in entry.runtime_data.controller.get_all_climate() for channel in entry.runtime_data.controller.get_all_climate()

View File

@ -24,7 +24,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusCover(channel) VelbusCover(channel)
for channel in entry.runtime_data.controller.get_all_cover() for channel in entry.runtime_data.controller.get_all_cover()

View File

@ -35,7 +35,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
entities: list[Entity] = [ entities: list[Entity] = [
VelbusLight(channel) VelbusLight(channel)
for channel in entry.runtime_data.controller.get_all_light() for channel in entry.runtime_data.controller.get_all_light()

View File

@ -25,7 +25,7 @@ rules:
has-entity-name: todo has-entity-name: todo
runtime-data: done runtime-data: done
test-before-configure: done test-before-configure: done
test-before-setup: todo test-before-setup: done
unique-config-entry: unique-config-entry:
status: todo status: todo
comment: | comment: |

View File

@ -17,7 +17,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus select based on config_entry.""" """Set up Velbus select based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusSelect(channel) VelbusSelect(channel)
for channel in entry.runtime_data.controller.get_all_select() for channel in entry.runtime_data.controller.get_all_select()

View File

@ -22,7 +22,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
entities = [] entities = []
for channel in entry.runtime_data.controller.get_all_sensor(): for channel in entry.runtime_data.controller.get_all_sensor():
entities.append(VelbusSensor(channel)) entities.append(VelbusSensor(channel))

View File

@ -18,7 +18,7 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Velbus switch based on config_entry.""" """Set up Velbus switch based on config_entry."""
await entry.runtime_data.connect_task await entry.runtime_data.scan_task
async_add_entities( async_add_entities(
VelbusSwitch(channel) VelbusSwitch(channel)
for channel in entry.runtime_data.controller.get_all_switch() for channel in entry.runtime_data.controller.get_all_switch()