home-assistant component for 2011 LG TVs
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lg_2011/media_player.py

182 lines
5.2 KiB

"""
Support for LG TV from 2011
"""
from datetime import timedelta
import logging
from requests import RequestException
import voluptuous as vol
from homeassistant import util
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
from homeassistant.components.media_player.const import (
MEDIA_TYPE_CHANNEL,
SUPPORT_NEXT_TRACK,
SUPPORT_PAUSE,
SUPPORT_PLAY,
SUPPORT_PREVIOUS_TRACK,
SUPPORT_SELECT_SOURCE,
SUPPORT_TURN_OFF,
SUPPORT_VOLUME_MUTE,
SUPPORT_VOLUME_STEP,
)
from homeassistant.const import (
CONF_ACCESS_TOKEN,
CONF_HOST,
CONF_NAME,
STATE_OFF,
STATE_PAUSED,
STATE_PLAYING,
STATE_UNKNOWN,
)
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
DEFAULT_NAME = 'LG TV Remote'
MIN_TIME_BETWEEN_FORCED_SCANS = timedelta(seconds=1)
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)
SUPPORT_LGTV = SUPPORT_PAUSE | SUPPORT_VOLUME_STEP | \
SUPPORT_VOLUME_MUTE | SUPPORT_TURN_OFF | \
SUPPORT_SELECT_SOURCE | SUPPORT_PLAY
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string,
vol.Optional(CONF_ACCESS_TOKEN): vol.All(cv.string, vol.Length(max=6)),
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
})
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the LG TV platform."""
host = config.get(CONF_HOST)
access_token = config.get(CONF_ACCESS_TOKEN)
name = config.get(CONF_NAME)
add_entities([LgTVDevice(host, access_token, name)], True)
class LgTVDevice(MediaPlayerEntity):
"""Representation of a LG TV."""
def __init__(self, host, access_token, name):
"""Initialize the LG TV device."""
self._client = None
self._host = host
self._access_token = access_token
self._name = name
self._muted = False
# Assume that the TV is in Play mode
self._playing = True
self._state = STATE_PLAYING
self._volume = 0
self._source = STATE_UNKNOWN
self._sources = { "Antenna" : "ANTENNA", "USB1" : "USB1", "USB2" : "USB2", "HDMI1" : "HDMI1", "HDMI2" : "HDMI2", "HDMI3" : "HDMI3", "HDMI4" : "HDMI4", "AV1" : "AV1", "AV2" : "AV2", "AV3" : "AV3", "Component" : "COMPONENT" }
self.reconnect()
def reconnect(self):
from python_lgtv import lg
try:
self._client = lg.Remote(self._host, self._access_token)
self._state = STATE_PLAYING
except Exception as e:
pass
def send_command(self, command):
"""Send remote control commands to the TV."""
try:
self._client.send_command(command)
except Exception as e:
self._state = STATE_OFF
self.reconnect()
@util.Throttle(MIN_TIME_BETWEEN_SCANS, MIN_TIME_BETWEEN_FORCED_SCANS)
def update(self):
"""Retrieve the latest data from the LG TV."""
try:
self._client.get_session()
self._client.send_command(command)
except Exception as e:
self.reconnect()
#self._state = STATE_OFF
@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._state
@property
def is_volume_muted(self):
"""Boolean if volume is currently muted."""
return self._muted
@property
def volume_level(self):
"""Volume level of the media player (0..1)."""
return self._volume / 100.0
@property
def source(self):
"""Return the current input source."""
return self._source
@property
def source_list(self):
"""List of available input sources."""
return list(self._sources.keys())
@property
def supported_features(self):
"""Flag media player features that are supported."""
return SUPPORT_LGTV
def turn_off(self):
"""Turn off media player."""
#self.send_command(1)
pass
def volume_up(self):
"""Volume up the media player."""
self.send_command(self._client.audio_controls["VOLUME_UP"])
def volume_down(self):
"""Volume down media player."""
self.send_command(self._client.audio_controls["VOLUME_DOWN"])
def mute_volume(self, mute):
"""Send mute command."""
self.send_command(self._client.audio_controls["MUTE"])
def select_source(self, source):
"""Select input source."""
self._source = source
self.send_command(self._client.input_controls[source])
def media_play_pause(self):
"""Simulate play pause media player."""
if self._playing:
self.media_pause()
else:
self.media_play()
def media_play(self):
"""Send play command."""
self._playing = True
self._state = STATE_PLAYING
self.send_command(self._client.playback_controls["PLAY"])
def media_pause(self):
"""Send media pause command to media player."""
self._playing = False
self._state = STATE_PAUSED
self.send_command(self._client.playback_controls["PAUSE"])