1 """The Soundavo WS66i 6-Zone Amplifier integration."""
3 from __future__
import annotations
7 from pyws66i
import WS66i, get_ws66i
14 from .const
import CONF_SOURCES, DOMAIN
15 from .coordinator
import Ws66iDataUpdateCoordinator
16 from .models
import SourceRep, Ws66iData
18 _LOGGER = logging.getLogger(__name__)
20 PLATFORMS = [Platform.MEDIA_PLAYER]
25 sources_config = data[CONF_SOURCES]
28 source_id_name = {
int(index): name
for index, name
in sources_config.items()}
31 source_name_id = {v: k
for k, v
in source_id_name.items()}
34 source_names = sorted(source_name_id.keys(), key=
lambda v: source_name_id[v])
36 return SourceRep(source_id_name, source_name_id, source_names)
39 def _find_zones(hass: HomeAssistant, ws66i: WS66i) -> list[int]:
40 """Generate zones list by searching for presence of zones."""
44 for amp_num
in range(1, 4):
47 status = ws66i.zone_status(amp_num * 10 + 1)
51 for zone_num
in range(1, 7):
52 zone_id = (amp_num * 10) + zone_num
53 zone_list.append(zone_id)
55 _LOGGER.debug(
"Detected %d amp(s)", amp_num - 1)
60 """Set up Soundavo WS66i 6-Zone Amplifier from a config entry."""
62 options: dict[str, dict[str, str]]
63 options = {CONF_SOURCES: entry.options[CONF_SOURCES]}
65 ws66i = get_ws66i(entry.data[CONF_IP_ADDRESS])
67 await hass.async_add_executor_job(ws66i.open)
68 except ConnectionError
as err:
76 zones = await hass.async_add_executor_job(_find_zones, hass, ws66i)
86 await coordinator.async_config_entry_first_refresh()
89 hass.data.setdefault(DOMAIN, {})[entry.entry_id] =
Ws66iData(
90 host_ip=entry.data[CONF_IP_ADDRESS],
93 coordinator=coordinator,
99 """Close the WS66i connection to the amplifier."""
102 entry.async_on_unload(entry.add_update_listener(_update_listener))
103 entry.async_on_unload(
104 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, shutdown)
107 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
113 """Unload a config entry."""
114 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
116 ws66i: WS66i = hass.data[DOMAIN][entry.entry_id].device
118 hass.data[DOMAIN].pop(entry.entry_id)
124 """Handle options update."""
125 await hass.config_entries.async_reload(entry.entry_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
None _update_listener(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
list[int] _find_zones(HomeAssistant hass, WS66i ws66i)
SourceRep _get_sources_from_dict(data)