Add volume/mute button instead of text label, depends on new pychromecast method. Also I made the power button the only accented button.

This commit is contained in:
Hans Bakker 2015-05-31 22:27:59 +02:00
parent 5c48c87af0
commit 81245495ae
5 changed files with 107 additions and 61 deletions

View File

@ -1,2 +1,2 @@
""" DO NOT MODIFY. Auto-generated by build_frontend script """
VERSION = "3c6a5149feced6c49cb97b76fdf14fee"
VERSION = "31e33f5ec4ad4c9355af6f40213f3168"

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,8 @@
text-transform: capitalize;
}
paper-icon-button {
/* Accent the power button because the user should use that first */
paper-icon-button[icon="power-settings-new"] {
color: var(--accent-color);
}
@ -43,7 +44,8 @@
</div>
</div>
<div class='volume center horizontal layout'>
<div>Volume</div>
<paper-icon-button on-tap="handleVolumeTap"
icon="[[computeMuteVolumeIcon(stateObj)]]"></paper-icon-button>
<paper-slider
min='0' max='100' value='{{volumeSliderValue}}'
on-change='volumeSliderChanged' class='flex'>
@ -73,6 +75,11 @@
computed: 'computeIsIdle(stateObj)',
},
isMuted: {
type: Boolean,
value: false
},
volumeSliderValue: {
type: Number,
value: 0,
@ -82,6 +89,7 @@
stateObjChanged: function(newVal, oldVal) {
if (newVal) {
this.volumeSliderValue = newVal.attributes.media_volume * 100;
this.isMuted = newVal.attributes.media_is_muted;
}
this.debounce('more-info-volume-animation-finish', function() {
@ -105,6 +113,10 @@
return isIdle ? 'Turn on' : 'Turn off';
},
computeMuteVolumeIcon: function(stateObj) {
return this.isMuted ? 'av:volume-up' : 'av:av:volume-off';
},
computePlayPauseIcon: function(stateObj) {
return stateObj.attributes.media_state == 'playing' ? 'av:pause' : 'av:play-arrow';
},
@ -125,11 +137,15 @@
this.callService('media_next_track');
},
handleVolumeTap: function() {
this.callService('volume_mute', { mute: !this.isMuted });
},
volumeSliderChanged: function(ev) {
var volPercentage = parseFloat(ev.target.value);
var vol = volPercentage > 0 ? volPercentage / 100 : 0;
this.callService('volume_set', {volume: vol});
this.callService('volume_set', { volume: vol });
},
callService: function(service, data) {

View File

@ -39,6 +39,7 @@ ATTR_MEDIA_ARTIST = 'media_artist'
ATTR_MEDIA_ALBUM = 'media_album'
ATTR_MEDIA_IMAGE_URL = 'media_image_url'
ATTR_MEDIA_VOLUME = 'media_volume'
ATTR_MEDIA_IS_MUTED = 'media_is_muted'
ATTR_MEDIA_DURATION = 'media_duration'
MEDIA_STATE_UNKNOWN = 'unknown'
@ -89,14 +90,14 @@ def volume_down(hass, entity_id=None):
def volume_mute(hass, entity_id=None):
""" Send the media player the command for volume down. """
""" Send the media player the command to toggle its mute state. """
data = {ATTR_ENTITY_ID: entity_id} if entity_id else {}
hass.services.call(DOMAIN, SERVICE_VOLUME_MUTE, data)
def volume_set(hass, entity_id=None, volume=None):
""" Send the media player the command for volume down. """
""" Send the media player the command to set the volume at a given level. """
data = {
key: value for key, value in [
(ATTR_ENTITY_ID, entity_id),
@ -147,7 +148,6 @@ SERVICE_TO_METHOD = {
SERVICE_TURN_OFF: 'turn_off',
SERVICE_VOLUME_UP: 'volume_up',
SERVICE_VOLUME_DOWN: 'volume_down',
SERVICE_VOLUME_MUTE: 'volume_mute',
SERVICE_MEDIA_PLAY_PAUSE: 'media_play_pause',
SERVICE_MEDIA_PLAY: 'media_play',
SERVICE_MEDIA_PAUSE: 'media_pause',
@ -192,6 +192,18 @@ def setup(hass, config):
volume_set_service(
service, service.data.get('volume')))
def volume_mute_service(service, mute):
""" Mute (true) or unmute (false) the media player. """
target_players = component.extract_from_service(service)
for player in target_players:
player.volume_mute(mute)
hass.services.register(DOMAIN, SERVICE_VOLUME_MUTE,
lambda service:
volume_mute_service(
service, service.data.get('mute')))
def play_youtube_video_service(service, media_id):
""" Plays specified media_id on the media player. """
target_players = component.extract_from_service(service)
@ -235,8 +247,8 @@ class MediaPlayerDevice(Entity):
""" volume_down media player. """
pass
def volume_mute(self):
""" mute media player. """
def volume_mute(self, mute):
""" mute (true) or unmute (false) media player. """
pass
def volume_set(self, volume):

View File

@ -20,7 +20,8 @@ from homeassistant.const import ATTR_ENTITY_PICTURE
# ATTR_MEDIA_ARTIST,
from homeassistant.components.media_player import (
MediaPlayerDevice, STATE_NO_APP, ATTR_MEDIA_STATE, ATTR_MEDIA_TITLE,
ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_DURATION, ATTR_MEDIA_VOLUME,
ATTR_MEDIA_CONTENT_ID, ATTR_MEDIA_DURATION,
ATTR_MEDIA_VOLUME, ATTR_MEDIA_IS_MUTED,
MEDIA_STATE_PLAYING, MEDIA_STATE_PAUSED, MEDIA_STATE_STOPPED,
MEDIA_STATE_UNKNOWN)
@ -118,6 +119,9 @@ class CastDevice(MediaPlayerDevice):
if cast_status:
state_attr[ATTR_MEDIA_VOLUME] = cast_status.volume_level
if cast_status:
state_attr[ATTR_MEDIA_IS_MUTED] = cast_status.volume_muted
if media_status.content_id:
state_attr[ATTR_MEDIA_CONTENT_ID] = media_status.content_id
@ -156,12 +160,12 @@ class CastDevice(MediaPlayerDevice):
""" Service to send the chromecast the command for volume down. """
self.cast.volume_down()
def volume_mute(self):
""" Service to send the chromecast the command for volume up. """
self.cast.set_volume(0)
def volume_mute(self, mute):
""" Service to send the chromecast the command to mute (true) or unmute (false). """
self.cast.set_volume_muted(mute)
def volume_set(self, volume):
""" Service to send the chromecast the command for volume down. """
""" Service to send the chromecast the command to set the volume level. """
self.cast.set_volume(volume)
def media_play_pause(self):