Improve support for Yamaha receiver
diff --git a/homeassistant/components/media_player/yamaha.py b/homeassistant/components/media_player/yamaha.py
index 027fd6077309..9679c9f186c5 100644
--- a/homeassistant/components/media_player/yamaha.py
+++ b/homeassistant/components/media_player/yamaha.py
@@ -10,13 +10,15 @@
 
 from homeassistant.components.media_player import (
     SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET,
-    SUPPORT_SELECT_SOURCE, SUPPORT_PLAY_MEDIA,
+    SUPPORT_SELECT_SOURCE, SUPPORT_PLAY_MEDIA, SUPPORT_PAUSE, SUPPORT_STOP,
+    SUPPORT_NEXT_TRACK, SUPPORT_PREVIOUS_TRACK,
     MEDIA_TYPE_MUSIC,
     MediaPlayerDevice, PLATFORM_SCHEMA)
-from homeassistant.const import (CONF_NAME, CONF_HOST, STATE_OFF, STATE_ON)
+from homeassistant.const import (CONF_NAME, CONF_HOST, STATE_OFF, STATE_ON,
+                                 STATE_PLAYING, STATE_IDLE)
 import homeassistant.helpers.config_validation as cv
 
-REQUIREMENTS = ['rxv==0.2.0']
+REQUIREMENTS = ['rxv==0.3.0']
 
 _LOGGER = logging.getLogger(__name__)
 
@@ -24,6 +26,10 @@
                  SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_SELECT_SOURCE | \
                  SUPPORT_PLAY_MEDIA
 
+# Only supported by some sources
+SUPPORT_PLAYBACK = SUPPORT_PLAY_MEDIA | SUPPORT_PAUSE | SUPPORT_STOP | \
+                   SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK
+
 CONF_SOURCE_NAMES = 'source_names'
 CONF_SOURCE_IGNORE = 'source_ignore'
 
@@ -76,16 +82,25 @@ def __init__(self, name, receiver, source_ignore, source_names):
         self._source_ignore = source_ignore
         self._source_names = source_names
         self._reverse_mapping = None
+        self._is_playback_supported = False
+        self._play_status = None
         self.update()
         self._name = name
         self._zone = receiver.zone
 
     def update(self):
         """Get the latest details from the device."""
+        self._play_status = self._receiver.play_status()
         if self._receiver.on:
-            self._pwstate = STATE_ON
+            if self._play_status is None:
+                self._pwstate = STATE_ON
+            elif self._play_status.playing:
+                self._pwstate = STATE_PLAYING
+            else:
+                self._pwstate = STATE_IDLE
         else:
             self._pwstate = STATE_OFF
+
         self._muted = self._receiver.mute
         self._volume = (self._receiver.volume / 100) + 1
 
@@ -95,6 +110,8 @@ def update(self):
         current_source = self._receiver.input
         self._current_source = self._source_names.get(
             current_source, current_source)
+        self._is_playback_supported = self._receiver.is_playback_supported(
+            self._current_source)
 
     def build_source_list(self):
         """Build the source list."""
@@ -143,7 +160,10 @@ def source_list(self):
     @property
     def supported_media_commands(self):
         """Flag of media commands that are supported."""
-        return SUPPORT_YAMAHA
+        supported_commands = SUPPORT_YAMAHA
+        if self._is_playback_supported:
+            supported_commands |= SUPPORT_PLAYBACK
+        return supported_commands
 
     def turn_off(self):
         """Turn off media player."""
@@ -164,6 +184,34 @@ def turn_on(self):
         self._receiver.on = True
         self._volume = (self._receiver.volume / 100) + 1
 
+    def media_play(self):
+        """Send play commmand."""
+        self._call_playback_function(self._receiver.play, "play")
+
+    def media_pause(self):
+        """Send pause command."""
+        self._call_playback_function(self._receiver.pause, "pause")
+
+    def media_stop(self):
+        """Send stop command."""
+        self._call_playback_function(self._receiver.stop, "stop")
+
+    def media_previous_track(self):
+        """Send previous track command."""
+        self._call_playback_function(self._receiver.previous, "previous track")
+
+    def media_next_track(self):
+        """Send next track command."""
+        self._call_playback_function(self._receiver.next, "next track")
+
+    def _call_playback_function(self, function, function_text):
+        import rxv
+        try:
+            function()
+        except rxv.exceptions.ResponseException:
+            _LOGGER.warning(
+                'Failed to execute %s on %s', function_text, self._name)
+
     def select_source(self, source):
         """Select input source."""
         self._receiver.input = self._reverse_mapping.get(source, source)
@@ -179,23 +227,36 @@ def play_media(self, media_type, media_id, **kwargs):
         if media_type == "NET RADIO":
             self._receiver.net_radio(media_id)
 
+    @property
+    def media_artist(self):
+        """Artist of current playing media."""
+        if self._play_status is not None:
+            return self._play_status.artist
+
+    @property
+    def media_album_name(self):
+        """Album of current playing media."""
+        if self._play_status is not None:
+            return self._play_status.album
+
     @property
     def media_content_type(self):
-        """Return the media content type."""
-        if self.source == "NET RADIO":
+        """Content type of current playing media."""
+        # Loose assumption that if playback is supported, we are playing music
+        if self._is_playback_supported:
             return MEDIA_TYPE_MUSIC
+        return None
 
     @property
     def media_title(self):
-        """Return the media title.
-
-        This will vary by input source, as they provide different
-        information in metadata.
-
-        """
-        if self.source == "NET RADIO":
-            info = self._receiver.play_status()
-            if info.song:
-                return "%s: %s" % (info.station, info.song)
+        """Artist of current playing media."""
+        if self._play_status is not None:
+            song = self._play_status.song
+            station = self._play_status.station
+
+            # If both song and station is available, print both, otherwise
+            # just the one we have.
+            if song and station:
+                return '{}: {}'.format(station, song)
             else:
-                return info.station
+                return song or station
diff --git a/requirements_all.txt b/requirements_all.txt
index e8d7a6719432..03f8715ab221 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -447,7 +447,7 @@ radiotherm==1.2
 # rpi-rf==0.9.5
 
 # homeassistant.components.media_player.yamaha
-rxv==0.2.0
+rxv==0.3.0
 
 # homeassistant.components.media_player.samsungtv
 samsungctl==0.5.1

**Description:**
This pull request adds support for basic playback functionality like play, pause, stop, next and previous for input sources that support it in the Yamaha receiver. It also adds support for media title, artist and album if the information is available.

**Checklist:**

If user exposed functionality or configuration variables are added/changed:
- [x] Documentation added/updated in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io)

If the code communicates with devices, web services, or third-party tools:
- [x] New dependencies have been added to the `REQUIREMENTS` variable ([example](https://github.com/home-assistant/home-assistant/blob/dev/homeassistant/components/keyboard.py#L16)).
- [x] New dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`.
