1
mirror of https://github.com/home-assistant/core synced 2024-10-04 07:58:43 +02:00
ha-core/homeassistant/components/zha/silabs_multiprotocol.py
Erik Montnemery 15e5cf01bb
Add silabs_multiprotocol platform (#92904)
* Add silabs_multiprotocol platform

* Add new files

* Add ZHA tests

* Prevent ZHA from creating database during tests

* Add delay parameter to async_change_channel

* Add the updated dataset to the dataset store

* Allow MultipanProtocol.async_change_channel to return a task

* Notify user about the duration of migration

* Update tests
2023-06-01 12:32:14 +02:00

82 lines
2.2 KiB
Python

"""Silicon Labs Multiprotocol support."""
from __future__ import annotations
import asyncio
import contextlib
from homeassistant.components.homeassistant_hardware.silabs_multiprotocol_addon import (
is_multiprotocol_url,
)
from homeassistant.core import HomeAssistant
from . import api
# The approximate time it takes ZHA to change channels on SiLabs coordinators
ZHA_CHANNEL_CHANGE_TIME_S = 10.27
def _get_zha_url(hass: HomeAssistant) -> str | None:
"""Return the ZHA radio path, or None if there's no ZHA config entry."""
with contextlib.suppress(ValueError):
return api.async_get_radio_path(hass)
return None
async def _get_zha_channel(hass: HomeAssistant) -> int | None:
"""Get ZHA channel, or None if there's no ZHA config entry."""
zha_network_settings: api.NetworkBackup | None
with contextlib.suppress(ValueError):
zha_network_settings = await api.async_get_network_settings(hass)
if not zha_network_settings:
return None
channel: int = zha_network_settings.network_info.channel
# ZHA uses channel 0 when no channel is set
return channel or None
async def async_change_channel(
hass: HomeAssistant, channel: int, delay: float = 0
) -> asyncio.Task | None:
"""Set the channel to be used.
Does nothing if not configured.
"""
zha_url = _get_zha_url(hass)
if not zha_url:
# ZHA is not configured
return None
async def finish_migration() -> None:
"""Finish the channel migration."""
await asyncio.sleep(max(0, delay - ZHA_CHANNEL_CHANGE_TIME_S))
return await api.async_change_channel(hass, channel)
return hass.async_create_task(finish_migration())
async def async_get_channel(hass: HomeAssistant) -> int | None:
"""Return the channel.
Returns None if not configured.
"""
zha_url = _get_zha_url(hass)
if not zha_url:
# ZHA is not configured
return None
return await _get_zha_channel(hass)
async def async_using_multipan(hass: HomeAssistant) -> bool:
"""Return if the multiprotocol device is used.
Returns False if not configured.
"""
zha_url = _get_zha_url(hass)
if not zha_url:
# ZHA is not configured
return False
return is_multiprotocol_url(zha_url)