I’ve been working on a dedicated touchscreen controller for Music Assistant and Home Assistant media players using the ESP32-S3 4848S040 display.
The idea is simple: instead of opening the Music Assistant or Home Assistant UI every time I want to change a track, volume, playlist, or check what is currently playing, I wanted a small always-on physical music controller.
It runs entirely on the ESP32-S3 using ESPHome + LVGL and communicates with Home Assistant over the native ESPHome API.
Key Features
- Now Playing screen
Full-screen album artwork with a darkened background, track title, artist, volume and playback information. - Circular playback progress
A large LVGL progress arc around the album artwork shows the current playback position. - Touch playback controls
Previous track, Play/Pause, Next track, Volume Up/Down, Shuffle and Repeat directly from the display. - Music Assistant Playlists
A dedicated Playlists page loads playlists from Music Assistant and allows starting them directly from the touchscreen. - Music Assistant Queue
A separate Queue page shows the current playback queue and allows interaction without opening the HA or Music Assistant frontend. - Real-time Home Assistant state
Track title, artist, artwork, duration, current position and volume are synchronized from the selected Home Assistantmedia_playerentity. - Swipe Navigation
The interface supports touch gestures for moving between the Player, Playlists and Queue pages. - Album Artwork
The display dynamically loads the currententity_picture, so the controller follows whatever is playing.
Hardware
The project currently targets the ESP32-S3 4848S040 board:
- ESP32-S3
- 16 MB Flash
- Octal PSRAM
- 4" 480×480 IPS display
- ST7701S display controller
- GT911 capacitive touchscreen
- ESPHome / ESP-IDF
- LVGL interface
Music Assistant Integration
One of the more interesting parts of the project is playlist and queue synchronization.
Home Assistant provides most of the normal media-player state, while additional data from Music Assistant is synchronized to the ESP32 so the device can display things that are not conveniently available through a standard media_player entity.
For example, playlists are retrieved from the Music Assistant library and exposed to the ESP32. Selecting one on the touchscreen then calls music_assistant.play_media.
The same approach is used for keeping the current Music Assistant queue available on the controller.
So the architecture is roughly:
Music Assistant → Home Assistant → ESPHome → ESP32/LVGL
with the touchscreen sending playback commands back through Home Assistant.
Current Status
The project is functional, but I’m still actively developing and refining it.
Recent work has focused on queue handling, updating queue data when opening the Queue page, reconnect behavior, album-art refreshing, and keeping an eye on ESP32 heap/PSRAM usage as the LVGL interface grows.
There is still plenty of room for improvements and additional Music Assistant functionality.
Project Resources
GitHub Repository:
Full Build Guide:
Feedback, ideas and contributions are welcome — especially from other Music Assistant users who would find a dedicated physical touchscreen controller useful.
