1 """Support for interfacing with WS66i 6 zone home audio controller."""
3 from pyws66i
import WS66i, ZoneStatus
7 MediaPlayerEntityFeature,
16 from .const
import DOMAIN, MAX_VOL
17 from .coordinator
import Ws66iDataUpdateCoordinator
18 from .models
import Ws66iData
25 config_entry: ConfigEntry,
26 async_add_entities: AddEntitiesCallback,
28 """Set up the WS66i 6-zone amplifier platform from a config entry."""
29 ws66i_data: Ws66iData = hass.data[DOMAIN][config_entry.entry_id]
34 device=ws66i_data.device,
35 ws66i_data=ws66i_data,
36 entry_id=config_entry.entry_id,
39 coordinator=ws66i_data.coordinator,
41 for idx, zone_id
in enumerate(ws66i_data.zones)
46 """Representation of a WS66i amplifier zone."""
48 _attr_has_entity_name =
True
50 _attr_supported_features = (
51 MediaPlayerEntityFeature.VOLUME_MUTE
52 | MediaPlayerEntityFeature.VOLUME_SET
53 | MediaPlayerEntityFeature.VOLUME_STEP
54 | MediaPlayerEntityFeature.TURN_ON
55 | MediaPlayerEntityFeature.TURN_OFF
56 | MediaPlayerEntityFeature.SELECT_SOURCE
62 ws66i_data: Ws66iData,
66 coordinator: Ws66iDataUpdateCoordinator,
68 """Initialize a zone entity."""
70 self.
_ws66i_ws66i: WS66i = device
71 self._ws66i_data: Ws66iData = ws66i_data
72 self._zone_id: int = zone_id
73 self._zone_id_idx: int = data_idx
74 self.
_status_status: ZoneStatus = coordinator.data[data_idx]
79 name=f
"Zone {zone_id}",
80 manufacturer=
"Soundavo",
81 model=
"WS66i 6-Zone Amplifier",
87 """Handle updated data from the coordinator."""
92 self.
_status_status = self.coordinator.data[self._zone_id_idx]
101 sources = self._ws66i_data.sources.id_name
102 self.
_attr_state_attr_state = MediaPlayerState.ON
if status.power
else MediaPlayerState.OFF
113 """Set input source."""
114 idx = self._ws66i_data.sources.name_id[source]
115 await self.
hasshasshass.async_add_executor_job(
116 self.
_ws66i_ws66i.set_source, self._zone_id, idx
118 self.
_status_status.source = idx
122 """Turn the media player on."""
123 await self.
hasshasshass.async_add_executor_job(
124 self.
_ws66i_ws66i.set_power, self._zone_id,
True
126 self.
_status_status.power =
True
130 """Turn the media player off."""
131 await self.
hasshasshass.async_add_executor_job(
132 self.
_ws66i_ws66i.set_power, self._zone_id,
False
134 self.
_status_status.power =
False
138 """Mute (true) or unmute (false) media player."""
139 await self.
hasshasshass.async_add_executor_job(
140 self.
_ws66i_ws66i.set_mute, self._zone_id, mute
146 """Set volume level, range 0..1."""
151 """Volume up the media player."""
152 await self.
hasshasshass.async_add_executor_job(
158 """Volume down media player."""
159 await self.
hasshasshass.async_add_executor_job(
165 """Set the volume of the media player."""
169 self.
_ws66i_ws66i.set_mute(self._zone_id,
False)
170 self.
_status_status.mute =
False
172 self.
_ws66i_ws66i.set_volume(self._zone_id, volume)
173 self.
_status_status.volume = volume
None async_write_ha_state(self)