name: home-assistant-music-assistant description: Control Home Assistant Music Assistant (speakers, search/library, play) with optional local "music memory". metadata: {"openclaw":{"requires":{"bins":["node"]},"os":["linux","darwin"]}}
This skill provides a small CLI wrapper around the Home Assistant REST API and the Music Assistant integration.
Configuration
The CLI reads configuration from environment variables:
HA_URL(required): Home Assistant base URL (e.g.https://homeassistant.local:8123).HA_TOKEN_FILE(optional): Path to a file containing a Home Assistant Long-Lived Access Token.HA_TOKEN_CMD(optional): Command to run that prints the token to stdout.MA_DB_PATH(optional): Path to the local SQLite database for music memory.
Token resolution order:
HA_TOKEN_CMDHA_TOKEN_FILE
Commands
List speakers
List all media_player entities from Home Assistant with enriched information.
ha-ma speakers
Output (JSON):
[
{
"entity_id": "media_player.living_room",
"friendly_name": "Living Room Speaker",
"state": "playing",
"volume": 0.5,
"area_name": "Living Room"
}
]
Fields:
entity_id: The HA entity IDfriendly_name: Human-readable namestate: Current state (playing, idle, off, etc.)volume: Volume level (0-1), if availablearea_name: Area name from HA area registry, if entity is assigned to an area
Discover Music Assistant Config
Discover and cache Music Assistant config entry IDs from Home Assistant.
# Fetch from HA API and cache
ha-ma ma-config
# Use cached entry IDs if available
ha-ma ma-config --cached
# Force refresh even if cached
ha-ma ma-config --refresh
Output (JSON):
{
"entry_ids": ["abc123def456"],
"cached": false
}
Browse Music Library
Browse artists, albums, tracks, playlists, and radio stations in the Music Assistant library.
# Browse top-level categories
ha-ma browse artists
ha-ma browse albums
ha-ma browse tracks
ha-ma browse playlists
ha-ma browse radio
# Hierarchical navigation (e.g., albums by a specific artist)
ha-ma browse albums --parent artist-1
ha-ma browse tracks --parent album-1
# Pagination
ha-ma browse artists --limit 50 --offset 100
Output (JSON):
{
"items": [
{
"item_id": "artist-1",
"name": "Daft Punk",
"media_type": "artist",
"uri": "library://artist/1"
}
]
}
Fields:
item_id: Unique identifier for the itemname: Display namemedia_type: Type of media (artist, album, track, playlist, radio)uri: URI for playbackartist: Artist name (for albums/tracks)album: Album name (for tracks)duration: Track duration in seconds (for tracks)
Search Music
Search for music using natural queries with optional filters.
# Simple text search
ha-ma search "daft punk"
ha-ma search "90s trance"
# Search with filters
ha-ma search 'artist:"daft punk"'
ha-ma search 'genre:trance decade:90s'
ha-ma search 'happy upbeat genre:pop'
# Limit results
ha-ma search "electronic" --limit 10
# Filter by media type
ha-ma search "daft" --type track
Supported filters:
artist:"name"- search by artistalbum:"name"- search by albumgenre:name- search by genredecade:90s- search by decadeyear:1999- search by yearmood:happy- search by mood keywords
Output (JSON):
{
"results": [
{
"item_id": "track-1",
"name": "One More Time",
"media_type": "track",
"uri": "library://track/1",
"artist": "Daft Punk",
"album": "Discovery",
"score": 0.95
}
]
}
Fields:
item_id: Unique identifiername: Display namemedia_type: Type (track, artist, album, playlist)uri: URI for playbackscore: Relevance score (0-1)- Optional:
artist,album,genre,year,duration
Playback Control
Control media playback on speakers.
# Play media
ha-ma play --speaker media_player.living_room --uri "library://track/123"
ha-ma play --speaker media_player.living_room --uri "library://playlist/1" --enqueue replace
# Basic controls
ha-ma pause --speaker media_player.living_room
ha-ma stop --speaker media_player.living_room
ha-ma next --speaker media_player.living_room
ha-ma prev --speaker media_player.living_room
# Volume (0-100)
ha-ma volume --speaker media_player.living_room --level 50
# Add to queue
ha-ma queue --speaker media_player.living_room --uri "library://track/456"
Enqueue modes:
play- Play immediately (default)replace- Replace current queuenext- Play nextadd- Add to end of queue
Output (JSON):
{
"success": true,
"action": "play",
"speaker": "media_player.living_room",
"uri": "library://track/123"
}
Record a play event (local DB)
ha-ma memory log --user <slug> --speaker-entity "media_player.example" --uri "library://track/123" --title "Song" --artist "Artist" --album "Album"
Show recent play events
ha-ma memory recent --user <slug> --limit 10
Manage preferences
Set, get, and clear music preferences for users or households.
# Set user preference
ha-ma prefs set --user troy --artist "Daft Punk" --score 0.9
ha-ma prefs set --user troy --genre trance --score 0.8
ha-ma prefs set --user troy --decade "90s" --score 0.7
# Set household preference
ha-ma prefs set --household home --genre jazz --score 0.6
# Get preferences
ha-ma prefs get --user troy
ha-ma prefs get --household home
# Clear preference
ha-ma prefs clear --user troy --artist "Daft Punk"
ha-ma prefs clear --household home --genre jazz
Supported entity types: --track, --artist, --album, --genre, --decade, --year
Score range: -1.0 (hate) to 1.0 (love), 0.0 = neutral
Entity IDs are normalized to lowercase kebab-case for consistency.
Manage Moods
Create, list, and manage mood-to-music mappings for personalized playback.
# Set a user mood
ha-ma mood set --user troy --name "work" --genres trance,house --decades 90s,2000s --energy high
ha-ma mood set --user troy --name "sleep" --genres ambient --energy low
# Set a household mood
ha-ma mood set --household home --name "dinner" --genres jazz,bossa-nova --energy low
# List moods
ha-ma mood list --user troy
ha-ma mood list --household home
# Get a specific mood
ha-ma mood get --user troy --name "work"
# Delete a mood
ha-ma mood delete --user troy --name "work"
Supported criteria flags:
--genres <list>- comma-separated genre list--decades <list>- comma-separated decades (e.g., "90s,2000s")--artists <list>- comma-separated artist names--energy <level>- low, medium, or high
Output (JSON):
{
"id": "mood-1",
"name": "work",
"criteria": {
"genres": ["trance", "house"],
"decades": ["90s", "2000s"],
"energy": "high"
}
}
Play History
View and manage play history, sessions, and avoid list.
# Get recent play history
ha-ma history recent --user troy --limit 20
# List listening sessions
ha-ma history sessions --user troy --limit 10
# Add track to avoid list
ha-ma history avoid --user troy --uri "library://track/123" --reason "dont like"
# Remove from avoid list
ha-ma history unavoid --user troy --uri "library://track/123"
# View avoid list
ha-ma history avoidlist --user troy
Recent history output:
[
{
"id": "event-1",
"uri": "library://track/1",
"title": "One More Time",
"artist": "Daft Punk",
"skipped": false,
"createdAt": "2024-01-01T12:00:00Z"
}
]
Sessions output includes track count and mood if applicable.
Avoid list tracks are excluded from future recommendations.
Mood resolution:
- User moods override household moods with the same name
- When playing by mood, user mood is checked first, then household fallback
Security
- Tokens are never logged or included in error messages
- Large API payloads are not dumped to logs
- All sensitive data is redacted in error output