diff --git a/package.json b/package.json index f3c1489531..5b509adecb 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "MIT", "dependencies": { - "home-assistant-js": "git+https://github.com/balloob/home-assistant-js.git#ea9bf003e0a668842f5306628ea88a9d0c1eeb50", + "home-assistant-js": "git+https://github.com/balloob/home-assistant-js.git#7dc486d2195435eca2c0e194c1f6ca7ee3163138", "lodash": "^4.8.2", "moment": "^2.12.0" }, diff --git a/src/cards/ha-card-chooser.html b/src/cards/ha-card-chooser.html index d5ab9ad31a..064693b007 100644 --- a/src/cards/ha-card-chooser.html +++ b/src/cards/ha-card-chooser.html @@ -3,3 +3,4 @@ + diff --git a/src/cards/ha-card-chooser.js b/src/cards/ha-card-chooser.js index b7de358718..bcbb06b0d1 100644 --- a/src/cards/ha-card-chooser.js +++ b/src/cards/ha-card-chooser.js @@ -5,6 +5,7 @@ import dynamicContentUpdater from '../util/dynamic-content-updater'; require('./ha-camera-card'); require('./ha-entities-card'); require('./ha-introduction-card'); +require('./ha-media_player-card'); export default new Polymer({ is: 'ha-card-chooser', diff --git a/src/cards/ha-media_player-card.html b/src/cards/ha-media_player-card.html new file mode 100644 index 0000000000..938d3c5aaa --- /dev/null +++ b/src/cards/ha-media_player-card.html @@ -0,0 +1,139 @@ + + + + + + + + diff --git a/src/cards/ha-media_player-card.js b/src/cards/ha-media_player-card.js new file mode 100644 index 0000000000..3d734533e6 --- /dev/null +++ b/src/cards/ha-media_player-card.js @@ -0,0 +1,114 @@ +import Polymer from '../polymer'; +import hass from '../util/home-assistant-js-instance'; + +const { moreInfoActions } = hass; + +export default new Polymer({ + is: 'ha-media_player-card', + + properties: { + stateObj: { + type: Object, + }, + + playerObj: { + type: Object, + computed: 'computePlayerObj(stateObj)', + observer: 'playerObjChanged', + }, + + imageLoaded: { + type: Boolean, + value: true, + }, + + playbackControlIcon: { + type: String, + computed: 'computePlaybackControlIcon(playerObj)', + }, + + /** + * The z-depth of the card, from 0-5. + */ + elevation: { + type: Number, + value: 1, + reflectToAttribute: true, + }, + }, + + playerObjChanged(playerObj) { + this.style.height = this.computeShowControls(playerObj) ? '175px' : '78px'; + this.style.backgroundImage = playerObj.stateObj.attributes.entity_picture ? + `url(${playerObj.stateObj.attributes.entity_picture})` : ''; + }, + + imageLoadSuccess() { + this.imageLoaded = true; + }, + + imageLoadFail() { + this.imageLoaded = false; + }, + + computeHidePowerOnButton(playerObj) { + return !playerObj.isOff || !playerObj.supportsTurnOn; + }, + + computePlayerObj(stateObj) { + return stateObj.domainModel(hass); + }, + + computePlaybackControlIcon(playerObj) { + if (playerObj.isPlaying) { + return playerObj.supportsPause ? 'mdi:pause' : 'mdi:stop'; + } else if (playerObj.isPaused) { + return 'mdi:play'; + } + return ''; + }, + + computeShowControls(playerObj) { + return !playerObj.isOff; + }, + + computeVolumeMuteIcon(playerObj) { + return playerObj.isMuted ? 'mdi:volume-high' : 'mdi:volume-off'; + }, + + handleNext(ev) { + ev.stopPropagation(); + this.playerObj.nextTrack(); + }, + + handleOpenMoreInfo(ev) { + ev.stopPropagation(); + this.async(() => moreInfoActions.selectEntity(this.stateObj.entityId), 1); + }, + + handlePlaybackControl(ev) { + ev.stopPropagation(); + this.playerObj.mediaPlayPause(); + }, + + handlePrevious(ev) { + ev.stopPropagation(); + this.playerObj.previousTrack(); + }, + + handlePowerOff(ev) { + ev.stopPropagation(); + this.playerObj.turnOff(); + }, + + handlePowerOn(ev) { + ev.stopPropagation(); + this.playerObj.turnOn(); + }, + + handleVolumeMute(ev) { + ev.stopPropagation(); + this.playerObj.volumeMute(!this.playerObj.isMuted); + }, + +}); diff --git a/src/components/ha-cards.js b/src/components/ha-cards.js index 7ceeb3858e..9811f97902 100644 --- a/src/components/ha-cards.js +++ b/src/components/ha-cards.js @@ -7,7 +7,7 @@ require('../cards/ha-card-chooser'); const { util } = hass; -const DOMAINS_WITH_CARD = ['camera']; +const DOMAINS_WITH_CARD = ['camera', 'media_player']; const PRIORITY = { configurator: -20,