home-assistant-music-assistant

star 0

Control Home Assistant Music Assistant (speakers, search/library, play) with optional local "music memory".

troykelly By troykelly schedule Updated 2/1/2026

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:

  1. HA_TOKEN_CMD
  2. 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.

# 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 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.

# 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 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.

# 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 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.

# 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
Install via CLI
npx skills add https://github.com/troykelly/openclaw-skill-music-assistant --skill home-assistant-music-assistant
Repository Details
star Stars 0
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator