1 """Utilities for the LinkPlay component."""
3 from typing
import Final
5 from aiohttp
import ClientSession
6 from linkplay.utils
import async_create_unverified_client_session
11 from .const
import DATA_SESSION, DOMAIN
13 MANUFACTURER_ARTSOUND: Final[str] =
"ArtSound"
14 MANUFACTURER_ARYLIC: Final[str] =
"Arylic"
15 MANUFACTURER_IEAST: Final[str] =
"iEAST"
16 MANUFACTURER_WIIM: Final[str] =
"WiiM"
17 MANUFACTURER_GGMM: Final[str] =
"GGMM"
18 MANUFACTURER_MEDION: Final[str] =
"Medion"
19 MANUFACTURER_GENERIC: Final[str] =
"Generic"
20 MODELS_ARTSOUND_SMART_ZONE4: Final[str] =
"Smart Zone 4 AMP"
21 MODELS_ARTSOUND_SMART_HYDE: Final[str] =
"Smart Hyde"
22 MODELS_ARYLIC_S50: Final[str] =
"S50+"
23 MODELS_ARYLIC_S50_PRO: Final[str] =
"S50 Pro"
24 MODELS_ARYLIC_A30: Final[str] =
"A30"
25 MODELS_ARYLIC_A50: Final[str] =
"A50"
26 MODELS_ARYLIC_A50S: Final[str] =
"A50+"
27 MODELS_ARYLIC_UP2STREAM_AMP: Final[str] =
"Up2Stream Amp 2.0"
28 MODELS_ARYLIC_UP2STREAM_AMP_V3: Final[str] =
"Up2Stream Amp v3"
29 MODELS_ARYLIC_UP2STREAM_AMP_V4: Final[str] =
"Up2Stream Amp v4"
30 MODELS_ARYLIC_UP2STREAM_PRO: Final[str] =
"Up2Stream Pro v1"
31 MODELS_ARYLIC_UP2STREAM_PRO_V3: Final[str] =
"Up2Stream Pro v3"
32 MODELS_ARYLIC_UP2STREAM_PLATE_AMP: Final[str] =
"Up2Stream Plate Amp"
33 MODELS_IEAST_AUDIOCAST_M5: Final[str] =
"AudioCast M5"
34 MODELS_WIIM_AMP: Final[str] =
"WiiM Amp"
35 MODELS_WIIM_MINI: Final[str] =
"WiiM Mini"
36 MODELS_GGMM_GGMM_E2: Final[str] =
"GGMM E2"
37 MODELS_MEDION_MD_43970: Final[str] =
"Life P66970 (MD 43970)"
38 MODELS_GENERIC: Final[str] =
"Generic"
40 PROJECTID_LOOKUP: Final[dict[str, tuple[str, str]]] = {
41 "SMART_ZONE4_AMP": (MANUFACTURER_ARTSOUND, MODELS_ARTSOUND_SMART_ZONE4),
42 "SMART_HYDE": (MANUFACTURER_ARTSOUND, MODELS_ARTSOUND_SMART_HYDE),
43 "ARYLIC_S50": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_S50),
44 "RP0016_S50PRO_S": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_S50_PRO),
45 "RP0011_WB60_S": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_A30),
46 "X-50": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_A50),
47 "ARYLIC_A50S": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_A50S),
48 "RP0011_WB60": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_UP2STREAM_AMP),
49 "UP2STREAM_AMP_V3": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_UP2STREAM_AMP_V3),
50 "UP2STREAM_AMP_V4": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_UP2STREAM_AMP_V4),
51 "UP2STREAM_PRO_V3": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_UP2STREAM_PRO_V3),
52 "ARYLIC_V20": (MANUFACTURER_ARYLIC, MODELS_ARYLIC_UP2STREAM_PLATE_AMP),
53 "UP2STREAM_MINI_V3": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
54 "UP2STREAM_AMP_2P1": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
55 "RP0014_A50C_S": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
56 "ARYLIC_A30": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
57 "ARYLIC_SUBWOOFER": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
58 "ARYLIC_S50A": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
59 "RP0010_D5_S": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
60 "RP0001": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
61 "RP0013_WA31S": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
62 "RP0010_D5": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
63 "RP0013_WA31S_S": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
64 "RP0014_A50D_S": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
65 "ARYLIC_A50TE": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
66 "ARYLIC_A50N": (MANUFACTURER_ARYLIC, MODELS_GENERIC),
67 "iEAST-02": (MANUFACTURER_IEAST, MODELS_IEAST_AUDIOCAST_M5),
68 "WiiM_Amp_4layer": (MANUFACTURER_WIIM, MODELS_WIIM_AMP),
69 "Muzo_Mini": (MANUFACTURER_WIIM, MODELS_WIIM_MINI),
70 "GGMM_E2A": (MANUFACTURER_GGMM, MODELS_GGMM_GGMM_E2),
71 "A16": (MANUFACTURER_MEDION, MODELS_MEDION_MD_43970),
76 """Get manufacturer and model info based on given project."""
77 return PROJECTID_LOOKUP.get(project, (MANUFACTURER_GENERIC, MODELS_GENERIC))
81 """Get a ClientSession that can be used with LinkPlay devices."""
82 hass.data.setdefault(DOMAIN, {})
83 if DATA_SESSION
not in hass.data[DOMAIN]:
84 clientsession: ClientSession = await async_create_unverified_client_session()
87 def _async_close_websession(event: Event) ->
None:
88 """Close websession."""
89 clientsession.detach()
91 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_CLOSE, _async_close_websession)
92 hass.data[DOMAIN][DATA_SESSION] = clientsession
95 session: ClientSession = hass.data[DOMAIN][DATA_SESSION]
ClientSession async_get_client_session(HomeAssistant hass)
tuple[str, str] get_info_from_project(str project)