""" Support for LG soundbars. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/media_player.lg_soundbar/ """ import logging from homeassistant.components.media_player import ( SUPPORT_SELECT_SOURCE, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_SELECT_SOUND_MODE, MediaPlayerDevice) from homeassistant.const import STATE_ON REQUIREMENTS = ['temescal==0.1'] _LOGGER = logging.getLogger(__name__) SUPPORT_LG = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | SUPPORT_SELECT_SOURCE \ | SUPPORT_SELECT_SOUND_MODE def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the LG platform.""" if discovery_info is not None: add_entities([LGDevice(discovery_info)], True) class LGDevice(MediaPlayerDevice): """Representation of an LG soundbar device.""" def __init__(self, discovery_info): """Initialize the LG speakers.""" import temescal host = discovery_info.get('host') port = discovery_info.get('port') self._name = "" self._volume = 0 self._volume_min = 0 self._volume_max = 0 self._function = -1 self._functions = [] self._equaliser = -1 self._equalisers = [] self._mute = 0 self._rear_volume = 0 self._rear_volume_min = 0 self._rear_volume_max = 0 self._woofer_volume = 0 self._woofer_volume_min = 0 self._woofer_volume_max = 0 self._bass = 0 self._treble = 0 self._device = temescal.temescal(host, port=port, callback=self.handle_event) self.update() def handle_event(self, response): """Handle responses from the speakers.""" data = response['data'] if response['msg'] == "EQ_VIEW_INFO": if 'i_bass' in data: self._bass = data['i_bass'] if 'i_treble' in data: self._treble = data['i_treble'] if 'ai_eq_list' in data: self._equalisers = data['ai_eq_list'] if 'i_curr_eq' in data: self._equaliser = data['i_curr_eq'] elif response['msg'] == "SPK_LIST_VIEW_INFO": if 'i_vol' in data: self._volume = data['i_vol'] if 's_user_name' in data: self._name = data['s_user_name'] if 'i_vol_min' in data: self._volume_min = data['i_vol_min'] if 'i_vol_max' in data: self._volume_max = data['i_vol_max'] if 'b_mute' in data: self._mute = data['b_mute'] if 'i_curr_func' in data: self._function = data['i_curr_func'] elif response['msg'] == "FUNC_VIEW_INFO": if 'i_curr_func' in data: self._function = data['i_curr_func'] if 'ai_func_list' in data: self._functions = data['ai_func_list'] elif response['msg'] == "SETTING_VIEW_INFO": if 'i_rear_min' in data: self._rear_volume_min = data['i_rear_min'] if 'i_rear_max' in data: self._rear_volume_max = data['i_rear_max'] if 'i_rear_level' in data: self._rear_volume = data['i_rear_level'] if 'i_woofer_min' in data: self._woofer_volume_min = data['i_woofer_min'] if 'i_woofer_max' in data: self._woofer_volume_max = data['i_woofer_max'] if 'i_woofer_level' in data: self._woofer_volume = data['i_woofer_level'] if 'i_curr_eq' in data: self._equaliser = data['i_curr_eq'] if 's_user_name' in data: self._name = data['s_user_name'] self.schedule_update_ha_state() def update(self): """Trigger updates from the device.""" self._device.get_eq() self._device.get_info() self._device.get_func() self._device.get_settings() self._device.get_product_info() @property def name(self): """Return the name of the device.""" return self._name @property def volume_level(self): """Volume level of the media player (0..1).""" if self._volume_max != 0: return self._volume/self._volume_max return 0 @property def is_volume_muted(self): """Boolean if volume is currently muted.""" return self._mute @property def state(self): """Return the state of the device.""" return STATE_ON @property def sound_mode(self): """Return the current sound mode.""" import temescal if self._equaliser == -1: return "" return temescal.equalisers[self._equaliser] @property def sound_mode_list(self): """Return the available sound modes.""" import temescal modes = [] for equaliser in self._equalisers: modes.append(temescal.equalisers[equaliser]) return sorted(modes) @property def source(self): """Return the current input source.""" import temescal if self._function == -1: return "" return temescal.functions[self._function] @property def source_list(self): """List of available input sources.""" import temescal sources = [] for function in self._functions: sources.append(temescal.functions[function]) return sorted(sources) @property def supported_features(self): """Flag media player features that are supported.""" return SUPPORT_LG def set_volume_level(self, volume): """Set volume level, range 0..1.""" volume = volume * self._volume_max self._device.set_volume(int(volume)) def mute_volume(self, mute): """Mute (true) or unmute (false) media player.""" self._device.set_mute(mute) def select_source(self, source): """Select input source.""" import temescal self._device.set_func(temescal.functions.index(source)) def select_sound_mode(self, sound_mode): """Set Sound Mode for Receiver..""" import temescal self._device.set_eq(temescal.equalisers.index(sound_mode))