| 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_CMD
HA_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 ID
friendly_name: Human-readable name
state: Current state (playing, idle, off, etc.)
volume: Volume level (0-1), if available
area_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.
ha-ma ma-config
ha-ma ma-config --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.
ha-ma browse artists
ha-ma browse albums
ha-ma browse tracks
ha-ma browse playlists
ha-ma browse radio
ha-ma browse albums --parent artist-1
ha-ma browse tracks --parent album-1
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 item
name: Display name
media_type: Type of media (artist, album, track, playlist, radio)
uri: URI for playback
artist: 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.
ha-ma search "daft punk"
ha-ma search "90s trance"
ha-ma search 'artist:"daft punk"'
ha-ma search 'genre:trance decade:90s'
ha-ma search 'happy upbeat genre:pop'
ha-ma search "electronic" --limit 10
ha-ma search "daft" --type track
Supported filters:
artist:"name" - search by artist
album:"name" - search by album
genre:name - search by genre
decade:90s - search by decade
year:1999 - search by year
mood: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 identifier
name: Display name
media_type: Type (track, artist, album, playlist)
uri: URI for playback
score: Relevance score (0-1)
- Optional:
artist, album, genre, year, duration
Playback Control
Control media playback on speakers.
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
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
ha-ma volume --speaker media_player.living_room --level 50
ha-ma queue --speaker media_player.living_room --uri "library://track/456"
Enqueue modes:
play - Play immediately (default)
replace - Replace current queue
next - Play next
add - 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.
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
ha-ma prefs set --household home --genre jazz --score 0.6
ha-ma prefs get --user troy
ha-ma prefs get --household home
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.
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
ha-ma mood set --household home --name "dinner" --genres jazz,bossa-nova --energy low
ha-ma mood list --user troy
ha-ma mood list --household home
ha-ma mood get --user troy --name "work"
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.
ha-ma history recent --user troy --limit 20
ha-ma history sessions --user troy --limit 10
ha-ma history avoid --user troy --uri "library://track/123" --reason "dont like"
ha-ma history unavoid --user troy --uri "library://track/123"
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