112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
"""
|
|
Support for Onkyo Receivers.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/media_player.onkyo/
|
|
"""
|
|
import logging
|
|
|
|
from homeassistant.components.media_player import (
|
|
SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET,
|
|
SUPPORT_SELECT_SOURCE, MediaPlayerDevice)
|
|
from homeassistant.const import STATE_OFF, STATE_ON
|
|
|
|
REQUIREMENTS = ['https://github.com/danieljkemp/onkyo-eiscp/archive/'
|
|
'python3.zip#onkyo-eiscp==0.9.2']
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
SUPPORT_ONKYO = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \
|
|
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_SELECT_SOURCE
|
|
|
|
|
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
|
"""Setup the Onkyo platform."""
|
|
from eiscp import eISCP
|
|
add_devices(OnkyoDevice(receiver)
|
|
for receiver in eISCP.discover())
|
|
|
|
|
|
class OnkyoDevice(MediaPlayerDevice):
|
|
"""Representation of a Onkyo device."""
|
|
|
|
# pylint: disable=too-many-public-methods, abstract-method
|
|
def __init__(self, receiver):
|
|
"""Initialize the Onkyo Receiver."""
|
|
self._receiver = receiver
|
|
self._muted = False
|
|
self._volume = 0
|
|
self._pwstate = STATE_OFF
|
|
self.update()
|
|
self._name = '{}_{}'.format(
|
|
receiver.info['model_name'], receiver.info['identifier'])
|
|
self._current_source = None
|
|
|
|
def update(self):
|
|
"""Get the latest details from the device."""
|
|
status = self._receiver.command('system-power query')
|
|
if status[1] == 'on':
|
|
self._pwstate = STATE_ON
|
|
else:
|
|
self._pwstate = STATE_OFF
|
|
return
|
|
volume_raw = self._receiver.command('volume query')
|
|
mute_raw = self._receiver.command('audio-muting query')
|
|
current_source_raw = self._receiver.command('input-selector query')
|
|
self._current_source = '_'.join('_'.join(
|
|
[i for i in current_source_raw[1]]))
|
|
self._muted = bool(mute_raw[1] == 'on')
|
|
self._volume = int(volume_raw[1], 16)/80.0
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the device."""
|
|
return self._name
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the state of the device."""
|
|
return self._pwstate
|
|
|
|
@property
|
|
def volume_level(self):
|
|
"""Volume level of the media player (0..1)."""
|
|
return self._volume
|
|
|
|
@property
|
|
def is_volume_muted(self):
|
|
"""Boolean if volume is currently muted."""
|
|
return self._muted
|
|
|
|
@property
|
|
def supported_media_commands(self):
|
|
"""Flag of media commands that are supported."""
|
|
return SUPPORT_ONKYO
|
|
|
|
@property
|
|
def source(self):
|
|
""""Return the current input source of the device."""
|
|
return self._current_source
|
|
|
|
def turn_off(self):
|
|
"""Turn off media player."""
|
|
self._receiver.command('system-power standby')
|
|
|
|
def set_volume_level(self, volume):
|
|
"""Set volume level, input is range 0..1. Onkyo ranges from 1-80."""
|
|
self._receiver.command('volume {}'.format(int(volume*80)))
|
|
|
|
def mute_volume(self, mute):
|
|
"""Mute (true) or unmute (false) media player."""
|
|
if mute:
|
|
self._receiver.command('audio-muting on')
|
|
else:
|
|
self._receiver.command('audio-muting off')
|
|
|
|
def turn_on(self):
|
|
"""Turn the media player on."""
|
|
self._receiver.power_on()
|
|
|
|
def select_source(self, source):
|
|
"""Set the input source."""
|
|
self._receiver.command('input-selector {}'.format(source))
|