That might explain why I get errors on occasion with input_number. I hadn’t looked into it much since I last posted. I’ll give your modified version a try.
Hi,
I liked the idea of controlling spotify directly from panel but I wanted it to be bidirectional not only for volume but for shuffle and source too.
Here is my approach:
As I’m working with packages, I have everything related to spotify in packages/spotify.yaml
media_player:
- platform: spotify
client_id: !secret spotify_client_id
client_secret: !secret spotify_client_secret
group:
home_spotify_player:
name: Spotify Player
entities:
- media_player.spotify
home_spotify_controls:
name: Spotify Controls
control: hidden
entities:
- input_select.spotify_playlist
- input_select.spotify_source
- script.spotify_music
- input_number.spotify_volume
- input_boolean.spotify_shuffle
homeassistant:
customize:
script.spotify_music:
friendly_name: 'Play'
icon: mdi:play
sensor:
- platform: template
sensors:
spotify_volume:
friendly_name: "Spotify Volume"
value_template: "{{ states.media_player.spotify.attributes.volume_level }}"
- platform: template
sensors:
spotify_shuffle:
friendly_name: "Spotify Shuffle"
value_template: "{{ states.media_player.spotify.attributes.shuffle }}"
- platform: template
sensors:
spotify_source:
friendly_name: "Spotify Source"
value_template: "{{ states.media_player.spotify.attributes.source }}"
input_number:
spotify_volume:
name: Volume
icon: mdi:volume-high
initial: 100
min: 0
max: 100
step: 1
input_select:
spotify_playlist:
name: 'Playlist:'
options:
- Made In Germany
- Murmel
- Chillige Bässe
- Chillstep
- Mixed Hip Hop
- Mixed Electro
- Mixed Rock
- Mixed Dub
- Good Feeling
- Nightair
- Streetbangers
icon: mdi:spotify
spotify_source:
name: 'Source:'
options:
- ECHOKUECHE
- ECHODOTBUERO
- ECHODOTAUDI
initial: ECHOKUECHE
icon: mdi:speaker-wireless
input_boolean:
spotify_shuffle:
name: Shuffle
icon: mdi:shuffle-variant
script:
spotify_music:
alias: "Play selected spotify playlist"
sequence:
- service: media_player.select_source
data_template:
entity_id: media_player.spotify
source: >
{% if is_state("input_select.spotify_source", "ECHOKUECHE") %} ECHOKUECHE
{% elif is_state("input_select.spotify_source", "ECHODOTBUERO") %} ECHODOTBUERO
{% elif is_state("input_select.spotify_source", "ECHODOTAUDI") %} ECHODOTAUDI
{% endif %}
- service: media_player.play_media
data_template:
entity_id: media_player.spotify
media_content_type: playlist
media_content_id: >
{% if is_state("input_select.spotify_playlist", "Made In Germany") %} spotify:user:playlists.germany:playlist:5M7jfvXr6fiQ21U8jfe9aE
{% elif is_state("input_select.spotify_playlist", "Murmel") %} spotify:user:1143893613:playlist:5dfbLgeesT8gixq1GTWBoU
{% elif is_state("input_select.spotify_playlist", "Chillige Bässe") %} spotify:user:spotify:playlist:37i9dQZF1DX37cXruBmbRS
{% elif is_state("input_select.spotify_playlist", "Chillstep") %} spotify:user:kent1337:playlist:6IjDl5eRczFdgZkKYXhuHZ
{% elif is_state("input_select.spotify_playlist", "Mixed Hip Hop") %} spotify:user:1143893613:playlist:4yuXhTpPFSTnRSYmAN8mse
{% elif is_state("input_select.spotify_playlist", "Mixed Electro") %} spotify:user:1143893613:playlist:1grR3x1MSPlyfS6VsaSzPn
{% elif is_state("input_select.spotify_playlist", "Mixed Rock") %} spotify:user:1143893613:playlist:2ECMyR5ovezJBGQDnL3w23
{% elif is_state("input_select.spotify_playlist", "Mixed Dub") %} spotify:user:1143893613:playlist:093q3iMD3lAA4h5oatDJPh
{% elif is_state("input_select.spotify_playlist", "Good Feeling") %} spotify:user:1143893613:playlist:0rHdZMqeSR4XVvPf6QmFM4
{% elif is_state("input_select.spotify_playlist", "Nightair") %} spotify:user:1143893613:playlist:2C4xXSYKJp0CYwIyWhODpD
{% elif is_state("input_select.spotify_playlist", "Streetbangers") %} spotify:user:1143893613:playlist:1JzR2qe9P3EOjgSyVNJ80R
{% endif %}
automation:
- alias: 'Spotify Volume (Set)'
trigger:
platform: state
entity_id: input_number.spotify_volume
action:
service: media_player.volume_set
data_template:
entity_id: media_player.spotify
volume_level: '{{ states.input_number.spotify_volume.state | int / 100 }}'
- alias: 'Spotify Volume (Sync)'
trigger:
- platform: homeassistant
event: start
- platform: state
entity_id: sensor.spotify_volume
action:
- delay:
seconds: 5
- service: input_number.set_value
data_template:
entity_id: input_number.spotify_volume
value: '{{ states.sensor.spotify_volume.state | float | round(2) * 100 }}'
- alias: 'Spotify Shuffle (Set)'
trigger:
platform: state
entity_id: input_boolean.spotify_shuffle
action:
service: media_player.shuffle_set
data_template:
entity_id: media_player.spotify
shuffle: >
{% if is_state('input_boolean.spotify_shuffle', 'off') %}
false
{% elif is_state('input_boolean.spotify_shuffle', 'on') %}
true
{% endif %}
- alias: 'Spotify Shuffle (Sync)'
trigger:
- platform: homeassistant
event: start
- platform: state
entity_id: sensor.spotify_shuffle
action:
- delay:
seconds: 5
- service_template: >
{% if states.sensor.spotify_shuffle.state == 'False' %}
input_boolean.turn_off
{% else %}
input_boolean.turn_on
{% endif %}
data:
entity_id: input_boolean.spotify_shuffle
- alias: 'Spotify Source (Sync)'
trigger:
- platform: homeassistant
event: start
- platform: state
entity_id: sensor.spotify_source
action:
service: input_select.select_option
entity_id: input_select.spotify_source
data_template:
option: '{{ states.sensor.spotify_source.state }}'
Additional Changes:
- Volume Slider goes from 0-100
- Volume Slider, Shuffle and Source are synced when Homeassistant starts or the state changed (i.e someone changed volume not in HASS)
Info:
- The delay of 5 secs is enough for volume and shuffle to not rumble around
- The (Sync) automations rely on the according sensors and if I’m right, HASS updates these attributes every 30 secs, so it might take a while to reflect in HASS
Happy Spotifying
This looks really good
Does this prevent Spotify from loosing the sources?
What do you mean?
Great project… i have just only one doubt: how to get the correct URI of my playlists to insert inside the package?
As you are in the Spotify app and on your playlist, click the three dots -> Share -> Copy Spotify URI
Thanks, and then i must put the whole link or only the last numbers?
I don’t want to open my HASS to the internet. Is it possible to use spotify without portforward and use a dyndns service ? ( I don’t even know how )
As far as I know you need to connect to a spotify developer app and this needs a redirect url to your HASS. But it might only be needed for initial connection and you can disable portforward afterwards
After configuring all without any error from checking the various configurations, i get the following error when i try to send spotify playlist to one of my media players:
Error executing service <ServiceCall media_player.volume_set: volume_level=0.4, entity_id=[‘media_player.spotify’]>
Traceback (most recent call last):
File “/srv/homeassistant/lib/python3.5/site-packages/spotipy/client.py”, line 121, in _internal_call
r.raise_for_status()
File “/srv/homeassistant/lib/python3.5/site-packages/requests/models.py”, line 935, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://api.spotify.com/v1/me/player/volume?volume_percent=40
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/core.py”, line 1002, in _event_to_service_call
await service_handler.func(service_call)
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/media_player/init.py”, line 403, in async_service_handler
yield from getattr(player, method[‘method’])(**params)
File “/usr/lib/python3.5/asyncio/futures.py”, line 380, in iter
yield self # This tells Task to wait for completion.
File “/usr/lib/python3.5/asyncio/tasks.py”, line 304, in _wakeup
future.result()
File “/usr/lib/python3.5/asyncio/futures.py”, line 293, in result
raise self._exception
File “/usr/lib/python3.5/concurrent/futures/thread.py”, line 55, in run
result = self.fn(*self.args, **self.kwargs)
File “/srv/homeassistant/lib/python3.5/site-packages/homeassistant/components/media_player/spotify.py”, line 216, in set_volume_level
self._player.volume(int(volume * 100))
File “/srv/homeassistant/lib/python3.5/site-packages/spotipy/client.py”, line 976, in volume
self._put(self._append_device_id(“me/player/volume?volume_percent=%s” % volume_percent, device_id))
File “/srv/homeassistant/lib/python3.5/site-packages/spotipy/client.py”, line 190, in _put
return self._internal_call(‘PUT’, url, payload, kwargs)
File “/srv/homeassistant/lib/python3.5/site-packages/spotipy/client.py”, line 126, in _internal_call
headers=r.headers)
spotipy.client.SpotifyException: http status: 403, code:-1 - https://api.spotify.com/v1/me/player/volume?volume_percent=40:
Not available for the current user
Can you help me in tracking and solving this?
Does the player itself work?
I’ve set up Spotify and it keeps loosing the source to play from. Meaning I can’t get any scripts or automations to work.
What you mean? I have the player on the chrome and on the phone and all of them are working… did you mean this?
I mean the media_player in HASS
Please post your config and describe your problem more exactly
I have Spotify working if I first choose a device on my phone it appears as a source on the Spotify component on HA. Yet when my device (google homes) goes to standby. The Spotify component looses them, which stops my scripts from working.
I’ll post my config when I get home
I have the same issue - isn’t it the old problem with Spotify Sources not being available until being active played from?
It’s strange some have some dont
The player in HASS seems to work as i can change source and playlists, i can raise or lower the volume, but the music doesn’t go to the chosen source. I can see the cover and the name of the song in the player only if i play spotify music from another device like browser or app in the phone. Configs are the same as yours, i changed only the media_players and i left also some of your default playlists.