Hey guys,
I’m happy to share one of my highlight ESPHome projects:
A Spotify player control via touch screen using an ESP32 and ILI9341
The screen has the following features:
- Display current song/artist/album
- Song progress bar
- Play/pause
- Next track
- Volume Control
- Shuffle on/off
- Playlist selection (by touching the spotify icon)
Here are some screenshots:
Volume Control:
Playlist control (press Spotify button)
Things you need to create first in HA:
Add the following spotify toggles (helpers) to your HA config:
- input_boolean.esp32_spotify_playlist_menu (controls the playlist menu)
- input_boolean.esp32_wetter_screen (controls the empty start control screen. Fill it with your dashboard. )
- input_boolean.esp32_spotify_volume (controls the volume screen)
Add the following spotify sensors to your HA config:
- volume_level
- media_duration
- media_position
- media_title
- media_artist
- media_album_name
- media_playlist
Finally add a binary_sensor for the shuffle on/off.
Create scripts for “start spotify”, “play/pause”, each playlist and volume control up and down.
Start Spotify:
alias: Esp32-Spotify Open / Start
sequence:
- service: input_boolean.turn_off
data: {}
target:
entity_id:
- input_boolean.esp32_wetter_screen
- service: media_player.select_source
data:
source: HomeAssistant
target:
entity_id: media_player.spotify_xxx
- delay:
hours: 0
minutes: 0
seconds: 0
milliseconds: 500
- choose:
- conditions:
- condition: not
conditions:
- condition: state
entity_id: media_player.spotify_xxx
state: playing
sequence:
- service: media_player.volume_set
data:
volume_level: 0.5
target:
entity_id: media_player.spotify_xxx
default: []
- service: media_player.media_play
data: {}
target:
entity_id: media_player.spotify_xxx
- service: homeassistant.update_entity
data: {}
target:
entity_id: media_player.spotify_xxx
- delay:
hours: 0
minutes: 0
seconds: 0
milliseconds: 500
- service: homeassistant.update_entity
data: {}
target:
entity_id: media_player.spotify_xxx
mode: restart
icon: mdi:spotify
Here’s an example for playlists:
alias: Esp32-Spotify-Playlist-B4
sequence:
- service: media_player.play_media
target:
entity_id: media_player.spotify_xxx
data:
media_content_id: spotify:playlist:37i9dQZF1DX4jP4eebSWR9
media_content_type: spotify://playlist
metadata:
title: Hot Hits Deutschland
thumbnail: https://i.scdn.co/image/ab67706f000000032675fbb1d358045ce76f422a
media_class: playlist
children_media_class: track
navigateIds:
- {}
- media_content_type: spotify://categories
media_content_id: categories
- media_content_type: spotify://category_playlists
media_content_id: toplists
- service: input_boolean.toggle
data: {}
target:
entity_id: input_boolean.esp32_spotify_playlist_menu
mode: single
icon: mdi:playlist-play
Example script for volume control:
alias: Esp32-Spotify Volume up
sequence:
- service: input_boolean.turn_on
data: {}
target:
entity_id: input_boolean.esp32_spotify_volume
- service: media_player.volume_up
data: {}
target:
entity_id:
- media_player.spotify_xxx
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- service: input_boolean.turn_off
data: {}
target:
entity_id: input_boolean.esp32_spotify_volume
mode: restart
icon: mdi:spotify
Automations:
- toggle off the playlist screen after 7 seconds
- IMPORTANT: toogle off “wetter screen” (start screen), when spotify is playing
- toogle on “wetter screen”, when spotify is off or paused for longer than 20 seconds
I recommend to create an automation, which is updating Spotify at least every 2 seconds to keep the progress bar updated.
Big thanks for the inspiration goes to @MrChristian
https://community.home-assistant.io/t/az-touch-esp-example/383573/18
logger:
ota:
api:
captive_portal:
time:
platform: homeassistant
id: esptime
spi:
clk_pin: GPIO18
mosi_pin: GPIO23
miso_pin: GPIO19
font:
- file: 'fonts/verdana.ttf'
id: font40
size: 40
glyphs: °.0123456789-%d
- file: 'fonts/verdana.ttf'
id: font_spot_time
size: 12
glyphs: :0123456789
- file: 'fonts/verdana.ttf'
id: font21
size: 21
glyphs: ['&', '@', '<', '>', '$', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', '/', '\', '\xab', '\xc3', '\xaf', '''', 'ß' ]
- file: 'fonts/verdana.ttf'
id: font18
size: 18
glyphs: ['&', '@', '<', '>', '$', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', '/', '\', '''', 'ß' ]
- file: 'fonts/verdana.ttf'
id: font16
size: 16
glyphs: ['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', '/', '\', '''', 'ß' ]
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icon_spotify
size: 75
glyphs:
- "\U000F040C" # play-circle
- "\U000F03E5" # pause-circle
- "\U000F0661" # skip-next-circle
- "\U000F0376" # minus-circle
- "\U000F0417" # plus-circle
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icon_spotify_big
size: 80
glyphs:
- "\U000F04C7" # Spotify Icon
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icon_spotify_infobar
size: 30
glyphs:
- "\U000F04C7" # Spotify Icon
- "\U000F0595" # Wetter Icon
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icon_spotify_infobar_s
size: 24
glyphs:
- "\U000F049D" # Shuffle on Icon
- "\U000F049E" # Shuffle off Icon
color:
- id: my_red
red: 100%
green: 0%
- id: my_green
red: 0%
green: 100%
blue: 30%
- id: my_white
red: 1.0000
green: 1.0000
blue: 1.0000
- id: my_grey
red: 0.6000
green: 0.6000
blue: 0.6000
- id: my_black
red: 0.0000
green: 0.0000
blue: 0.0000
output:
# backlight
- platform: ledc
pin: 15
id: gpio_15_backlight_pwm_touch
inverted: false
light:
- platform: monochromatic
output: gpio_15_backlight_pwm_touch
name: "ILI9341 Display Backlight Touch"
id: back_light_touch
restore_mode: RESTORE_DEFAULT_ON
text_sensor:
- platform: homeassistant
id: current_title
entity_id: sensor.esp32_media_player_current_title
- platform: homeassistant
id: current_artist
entity_id: sensor.esp32_media_player_current_artist
- platform: homeassistant
id: current_playlist
entity_id: sensor.esp32_media_player_current_playlist
- platform: homeassistant
id: spotify
entity_id: sensor.esp32_media_player_status
- platform: homeassistant
id: spotpostime
entity_id: sensor.esp32_spotify_position_time
- platform: homeassistant
id: spotdur
entity_id: sensor.esp32_spotify_duration
sensor:
- platform: homeassistant
id: spotvol
entity_id: sensor.esp32_spotify_volume
filters:
- multiply: 10
- platform: homeassistant
id: spotpos
entity_id: sensor.esp32_spotify_position
- platform: homeassistant
id: spotpos2
entity_id: sensor.esp32_spotify_position
filters:
- offset: 78
binary_sensor:
- platform: homeassistant
entity_id: input_boolean.esp32_wetter_screen
id: display_wetter
- platform: homeassistant
entity_id: input_boolean.esp32_spotify_volume
id: display_volume
- platform: homeassistant
entity_id: binary_sensor.esp32_spotify_shuffle
id: spotify_shuffle
- platform: homeassistant
entity_id: input_boolean.esp32_spotify_playlist_menu
id: playlist
- platform: xpt2046
xpt2046_id: touchscreen # Start Play/Pause
id: touch_play
x_min: 35
x_max: 110
y_min: 2
y_max: 77
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: script.esp32_spotify_play_pause
- platform: xpt2046
xpt2046_id: touchscreen # Next Track
id: touch_next
x_min: 35
x_max: 110
y_min: 78
y_max: 154
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: media_player.media_next_track
data:
entity_id: media_player.spotify_xxx
- platform: xpt2046
xpt2046_id: touchscreen # Volume -
id: touch_minus
x_min: 35
x_max: 110
y_min: 155
y_max: 230
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: script.esp32_spotify_volume_down
- platform: xpt2046
xpt2046_id: touchscreen # Volume +
id: touch_plus
x_min: 35
x_max: 110
y_min: 232
y_max: 295
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: script.esp32_spotify_volume_up
- platform: xpt2046
xpt2046_id: touchscreen # Start Spotify
id: touch_info_spot
x_min: 195
x_max: 239
y_min: 275
y_max: 319
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state != "playing";'
- lambda: 'return id(spotify).state != "paused";'
- and:
- lambda: 'return id(display_wetter).state;'
then:
- homeassistant.service:
service: script.esp32_open_spotify
- platform: xpt2046
xpt2046_id: touchscreen # Turn on Display Wetter
id: touch_info_wetter
x_min: 195
x_max: 239
y_min: 275
y_max: 319
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: script.esp32_open_display_wetter
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_info_spot_shuffle_off # Touch Shuffle off
x_min: 205
x_max: 239
y_min: 75
y_max: 120
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- lambda: 'return id(spotify_shuffle).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- lambda: 'return id(spotify_shuffle).state == false;'
then:
- homeassistant.service:
service: media_player.shuffle_set
data:
shuffle: 'true'
entity_id: media_player.spotify_xxx
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_info_spot_shuffle_on # Touch Shuffle on
x_min: 205
x_max: 239
y_min: 75
y_max: 120
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- lambda: 'return id(spotify_shuffle).state;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- lambda: 'return id(spotify_shuffle).state;'
then:
- homeassistant.service:
service: media_player.shuffle_set
data:
shuffle: 'false'
entity_id: media_player.spotify_xxx
#START SPOTIFY PLAYLIST TOUCH
- platform: xpt2046
xpt2046_id: touchscreen # Spotify Icon Playlist
id: touch_playlist
x_max: 180
y_min: 3
x_min: 105
y_max: 75
on_press:
if:
condition:
or:
- and:
- lambda: 'return id(spotify).state == "playing";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
- and:
- lambda: 'return id(spotify).state == "paused";'
- lambda: 'return id(playlist).state;'
- lambda: 'return id(display_wetter).state == false;'
then:
- homeassistant.service:
service: input_boolean.toggle
data:
entity_id: input_boolean.esp32_spotify_playlist_menu
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B1
x_max: 239
y_min: 200
x_min: 201
y_max: 319
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b1
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A1
x_max: 239
y_min: 75
x_min: 201
y_max: 199
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a1
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B2
x_max: 200
y_min: 200
x_min: 161
y_max: 319
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b2
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A2
x_max: 200
y_min: 75
x_min: 161
y_max: 199
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a2
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B3
x_max: 160
y_min: 200
x_min: 121
y_max: 319
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b3
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A3
x_max: 160
y_min: 75
x_min: 121
y_max: 199
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a3
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B4
x_max: 120
y_min: 200
x_min: 81
y_max: 319
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b4
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A4
x_max: 120
y_min: 75
x_min: 81
y_max: 199
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a4
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B5
x_max: 80
y_min: 200
x_min: 41
y_max: 319
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b5
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A5
x_max: 80
y_min: 75
x_min: 41
y_max: 199
on_press:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a5
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_B6
x_max: 40
y_min: 200
x_min: 2
y_max: 319
on_state:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_b6
- platform: xpt2046
xpt2046_id: touchscreen
id: touch_A6
x_max: 40
y_min: 75
x_min: 2
y_max: 199
on_state:
if:
condition:
binary_sensor.is_off: playlist
then:
- homeassistant.service:
service: script.esp32_spotify_playlist_a6
xpt2046:
id: touchscreen
cs_pin: 14
irq_pin: 27
update_interval: 50ms
report_interval: 1s
threshold: 400
dimension_x: 240
dimension_y: 320
calibration_x_min: 3860
calibration_x_max: 280
calibration_y_min: 340
calibration_y_max: 3860
swap_x_y: false
display:
- platform: ili9341
model: TFT 2.4
id: touch_display
cs_pin: GPIO5
dc_pin: GPIO4
reset_pin: GPIO22
rotation: 270
lambda: |-
auto black = Color(0, 0, 0);
it.fill(black);
// WENN SPOTIFY SPIELT BUTTONS
if ((id(spotify).state == "playing" or id(spotify).state == "paused") and id(display_wetter).state == false) {
if (id(spotify).state == "playing")
{ it.print(0, 155, id(font_icon_spotify), id(my_green), TextAlign::TOP_LEFT, "\U000F03E5"); } // Pause Icon
else
{ it.print(0, 155, id(font_icon_spotify), id(my_white), TextAlign::TOP_LEFT, "\U000F040C"); } // Play Icon
it.print(-5, 43, id(font_icon_spotify_big), id(my_green), TextAlign::TOP_LEFT, "\U000F04C7"); // Spotify Icon gross
// WENN SPOTIFY SPIELT UND PLAYLIST GESCHLOSSEN
if (id(playlist).state) {
if (id(spotify_shuffle).state) {
it.print(98, 3, id(font_icon_spotify_infobar_s), id(my_green), TextAlign::TOP_RIGHT, "\U000F049D"); // Shuffle on
}
else {
it.print(98, 3, id(font_icon_spotify_infobar_s), id(my_white), TextAlign::TOP_RIGHT, "\U000F049E"); // Shuffle off
}
it.strftime(4, 0, id(font21), id(my_white), TextAlign::TOP_LEFT, "%H:%M", id(esptime).now());
it.filled_circle(319, 0, 40, id(my_white));
it.print(319, 1, id(font_icon_spotify_infobar), id(my_black), TextAlign::TOP_RIGHT, "\U000F0595"); // Wetter Display
it.print(78, 66, id(font21), id(my_white), TextAlign::TOP_LEFT, id(current_title).state.c_str()); // Track Infos
it.print(78, 91, id(font21), id(my_white), TextAlign::TOP_LEFT, id(current_artist).state.c_str());
it.print(78, 46, id(font18), id(my_green), TextAlign::TOP_LEFT, id(current_playlist).state.c_str());
// it.printf(78, 35, id(font18), id(my_green), TextAlign::TOP_LEFT, "%.0f", id(spotpos).state);
it.filled_rectangle(78, 130, 222, 2, id(my_grey)); // Progress Back
it.filled_rectangle(78, 130, id(spotpos).state, 2, id(my_green)); // Progress Bar
it.filled_circle(id(spotpos2).state, 130, 4, id(my_green)); // Progress Circle
it.print(78, 133, id(font_spot_time), id(my_green), TextAlign::TOP_LEFT, id(spotpostime).state.c_str()); // Position Song
it.print(300, 133, id(font_spot_time), id(my_green), TextAlign::TOP_RIGHT, id(spotdur).state.c_str()); // Duration Song
it.print(78, 155, id(font_icon_spotify), id(my_white), TextAlign::TOP_LEFT, "\U000F0661"); // Next Track
it.print(155, 155, id(font_icon_spotify), id(my_white), TextAlign::TOP_LEFT, "\U000F0376"); // Volume-
it.print(232, 155, id(font_icon_spotify), id(my_white), TextAlign::TOP_LEFT, "\U000F0417"); // Volume+
if (id(display_volume).state) { // Volume State
it.filled_circle(230, 122, 35, id(my_green));
it.printf(230, 145, id(font40), id(my_black), TextAlign::BOTTOM_CENTER, "%.0f", id(spotvol).state);
}
}
// WENN SPOTIFY SPIELT UND PLAYLIST OFFEN
else if ((id(spotify).state == "playing" or id(spotify).state == "paused") and id(playlist).state == false) {
it.line(76, 0, 76, 240);
it.line(200, 0, 200, 240);
it.line(319, 0, 319, 240);
it.line(76, 0, 319, 0);
it.line(76, 40, 319, 40);
it.line(76, 80, 319, 80);
it.line(76, 120, 319, 120);
it.line(76, 160, 319, 160);
it.line(76, 200, 319, 200);
it.line(76, 239, 319, 239);
it.print(85, 20, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Mix d.Woche");
it.print(85, 60, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Playlist W");
it.print(85, 100, id(font18), id(my_white), TextAlign::CENTER_LEFT, "me right no");
it.print(85, 140, id(font18), id(my_white), TextAlign::CENTER_LEFT, "House Party");
it.print(85, 180, id(font18), id(my_white), TextAlign::CENTER_LEFT, "News");
it.print(85, 220, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Playlist Z");
it.print(209, 20, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Playlist X");
it.print(209, 60, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Playlist Y");
it.print(209, 100, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Pool Electro");
it.print(209, 140, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Hot Hits");
it.print(209, 180, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Kaffeehaus");
it.print(209, 220, id(font18), id(my_white), TextAlign::CENTER_LEFT, "Chilled Dan");
}}
else {
// STATUSLEISTE ZEIT ODER WETTERWARNUNG
it.strftime(4, 3, id(font21), id(my_white), TextAlign::TOP_LEFT, "%H:%M", id(esptime).now());
it.filled_circle(319, 0, 40, id(my_white));
it.print(319, 1, id(font_icon_spotify_infobar), id(my_black), TextAlign::TOP_RIGHT, "\U000F04C7"); // Spotify Icon Infobar
}