1 """Silicon Labs Multiprotocol support."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Coroutine
6 from functools
import wraps
8 from typing
import TYPE_CHECKING, Any, Concatenate
11 from python_otbr_api
import tlv_parser
12 from python_otbr_api.tlv_parser
import MeshcopTLVType
21 from .const
import DOMAIN
22 from .util
import OTBRData
25 from .
import OTBRConfigEntry
27 _LOGGER = logging.getLogger(__name__)
33 [Callable[Concatenate[HomeAssistant, OTBRData, _P], Coroutine[Any, Any, _R]]],
34 Callable[Concatenate[HomeAssistant, _P], Coroutine[Any, Any, _R | _R_Def]],
36 """Decorate function to get OTBR data."""
38 def _async_get_otbr_data(
40 Concatenate[HomeAssistant, OTBRData, _P],
41 Coroutine[Any, Any, _R],
43 ) -> Callable[Concatenate[HomeAssistant, _P], Coroutine[Any, Any, _R | _R_Def]]:
44 """Decorate function to get OTBR data."""
47 async
def async_get_otbr_data_wrapper(
48 hass: HomeAssistant, *args: _P.args, **kwargs: _P.kwargs
50 """Fetch OTBR data and pass to orig_func."""
51 config_entry: OTBRConfigEntry
52 for config_entry
in hass.config_entries.async_loaded_entries(DOMAIN):
53 data = config_entry.runtime_data
55 return await orig_func(hass, data, *args, **kwargs)
59 return async_get_otbr_data_wrapper
61 return _async_get_otbr_data
64 @async_get_otbr_data(None)
71 """Set the channel to be used.
73 Does nothing if not configured.
75 await data.set_channel(channel, delay)
78 dataset_tlvs = await data.get_pending_dataset_tlvs()
79 if dataset_tlvs
is None:
81 dataset_tlvs = await data.get_active_dataset_tlvs()
82 if dataset_tlvs
is None:
86 dataset = tlv_parser.parse_tlv(dataset_tlvs.hex())
87 dataset.pop(MeshcopTLVType.DELAYTIMER,
None)
88 dataset.pop(MeshcopTLVType.PENDINGTIMESTAMP,
None)
89 dataset_tlvs_str = tlv_parser.encode_tlv(dataset)
93 @async_get_otbr_data(None)
95 """Return the channel.
97 Returns None if not configured.
100 dataset = await data.get_active_dataset()
106 _LOGGER.warning(
"Failed to communicate with OTBR %s", err)
112 return dataset.channel
115 @async_get_otbr_data(False)
117 """Return if the multiprotocol device is used.
119 Returns False if not configured.
bool is_multiprotocol_url(str url)
int|None async_get_channel(HomeAssistant hass, OTBRData data)
None async_change_channel(HomeAssistant hass, OTBRData data, int channel, float delay)
bool async_using_multipan(HomeAssistant hass, OTBRData data)
Callable[[HomeAssistant, websocket_api.ActiveConnection, dict], Coroutine[Any, Any, None]] async_get_otbr_data(Callable[[HomeAssistant, websocket_api.ActiveConnection, dict, OTBRData], Coroutine[Any, Any, None],] orig_func)
None async_add_dataset(HomeAssistant hass, str source, str tlv, *str|None preferred_border_agent_id=None, str|None preferred_extended_address=None)