Jeg har længe drømt om at styre musikken derhjemme med én enkelt fysisk kontrol — uden at skulle finde telefonen frem, åbne en app og navigere rundt. Samtidig ville jeg gerne have, at der automatisk blev vist information om det, der spiller, på et display i stuen. Det blev til et setup, der kombinerer en Philips Hue Tap Dial, Node-RED, Home Assistant, Sonos, ChatGPT og en Google Nest Hub — og resultatet er noget af det mest tilfredsstillende smart home-automation, jeg har bygget.
Jeg har kørt setuppet i mere end et år, og længe gået og tænkt på at få det dokumenteret. I dette indlæg gennemgår jeg hele opsætningen i detaljer — fra det fysiske knaptryk på en Zigbee kompliant dial enhed til den AI-genererede danske musikbeskrivelse, der dukker op på mit Nest Hub-display.
Indhold
Philips Hue Tap Dial — fire knapper og et drejehjul
Hjertet i opsætningen er en Philips Hue Tap Dial — en lille rund Zigbee-enhed med fire knapper og et drejehjul. Den kommunikerer via en Zigbee dongle (gateway) til Zigbee2MQTT i Home Assistant (Zigbee-signalerne sendes som MQTT-beskeder på topic’et zigbee2mqtt/Phillips Tap Dial). Derfra tager Node-RED over.

De fire knapper er konfigureret til (og ja, skal have printet nogle bedre ikoner:)):
- Knap 1: Play/Pause — kalder
media_player.media_play_pause - Knap 2: Næste nummer — kalder
media_player.media_next_track(virker selvfølgelig kun på Spotify playlisten) - Knap 3: DR P8 Jazz — skifter kilde til “DR P8 Jazz” med en TTS-besked: “Spiller P8 Jazz. Øjeblik”
- Knap 4: Spotify-playliste — skifter til “My Shazam Tracks” med TTS: “Spiller Mortens fede Spotify liste. Øjeblik”
Drejehjulet styrer volume op og ned. Alle kommandoer sendes til media_player.stue, som er mine Sonos-højttalere i stuen. TTS-beskederne leveres via Nabu Casa cloud TTS, så man får en kort stemmefeedback inden kilden skifter — det giver en fornemmelse af, at systemet reagerer med det samme.
Node-RED — ét flow der binder det hele sammen
Alt logik kører i ét samlet Node-RED flow kaldet “Simple Hue dial switch”. Det håndterer både knaptryk fra dialen og den automatiske dashboard-opdatering. Flowet er delt i to hovedgrene:
Knaptryk- og dreje delen sender MQTT-events fra Zigbee2MQTT som NodeRed lytter på. En switch-node sorterer på payload.button_action — det kan være button_1_press, button_2_press, brightness_step_up og så videre. Hver gren kalder den relevante Home Assistant-service via API’et. Ved kanalskift (knap 3 og 4) sendes først TTS-beskeden, og derefter skiftes kilden.
Dashboard-delen (som jeg kalder “WhoAndWhatsPlaying”) er den mere avancerede del. Den overvåger media_player.spisestue via en server-state-changed-node og reagerer, når status skifter til “playing”.
Jeg har zippet mit flow – du kan downloade det og tilrette det til dit behov – link i bunden af artiklen.
Protokol-kæden — fra Zigbee til AI
Hele signalvejen ser sådan ud:

Den fulde protokol-kæde er: Zigbee → Zigbee2MQTT → MQTT → Node-RED → Home Assistant API → Sonos (musik) + Google Cast (dashboard) + iTunes API (artwork) + OpenAI API (beskrivelser). Det er seks forskellige protokoller og fire eksterne API’er, der alle spiller sammen i realtid.
iTunes API — fetch albumcovers
En detalje som (også) fungerer godt, er brugen af Apples iTunes Search API til at hente albumcover artwork. Når Node-RED registrerer et nyt nummer, søger den automatisk i iTunes’ database efter kunstner og titel. Det returnerer en artwork-URL, som jeg opscalerer til 600×600 pixels for at få et skarpt billede på Nest Hub’en.
Artwork-URL’en gemmes i en Home Assistant input_text-entitet (input_text.albumartworkurl), så Lovelace-dashboardet altid har adgang til det aktuelle coverbillede. Det smarte er, at iTunes API’et er gratis, kræver ingen autentificering og dækker stort set al kommerciel musik — det er perfekt til denne type integration.
ChatGPT giver kontekst om musikken — på dansk
(Update: 8. marts 2026: Har lavet en Claude integration i stedet (Opus 2.6): det giver et væsentlig bedre response)
Den del af setupet, der imponerer gæsterne mest, er ChatGPT-integrationen. Når et nyt nummer starter, bygger Node-RED en prompt baseret på kunstner, titel og album — og sender den til GPT-4o via OpenAI’s API. Svaret er en kort dansk beskrivelse af musikken på maksimalt 500 tegn.
Prompten er tilpasset kilden. For Spotify beder jeg om instrumenter, hvem der spillede dem, og album-info (titel, år, label, producer, længde). For DR P8 Jazz fokuserer prompten mere på instrumentering og musikere — da P8 ikke altid leverer komplet metadata.
DR P8 er i det hele taget en interessant udfordring. Radioen leverer ikke media_artist som Spotify gør, så Node-RED tjekker først, om der er en artist-attribut. Hvis ikke, undersøger den om det er P8’s header-tekst (“DR P8 JAZZ dr.dk/p8jazz”). Hvis det ikke er headeren, parser den titlen i formatet “titel / artist” — som er den måde, P8 ofte leverer sine metadata.
ChatGPT-beskrivelsen gemmes i en Home Assistant-sensor (FullAlbumDescriptionSensor) med en description-attribut, som dashboardet trækker på.
Google Nest Hub — det automatiske musikdashboard
Alt samles på et Google Nest Hub-display via et dedikeret Lovelace-dashboard i Home Assistant. Dashboardet er designet specifikt til at blive castet og viser:
- Albumcover artwork (fra iTunes API)
- Track-titel og artist
- AI-genereret dansk beskrivelse af musikken (fra ChatGPT)
Når DR P8 Jazz spiller sin header (stationsidentifikation), skifter dashboardet til et lilla farvetema med P8 Jazz-branding — en lille detalje, men det ser rigtig godt ud.

Det hele er fuldautomatisk: Når musik starter, trigger Node-RED script.cast_to_google_hub, som caster dashboardet til Nest Hub’en. Når musikken stopper, kaldes script.stop_cast_til_google_nest, og displayet går tilbage til sin normale tilstand.
Hvis ikke P8 Jazz sender noget sigende så præsenterer jeg et default cover billede:

Lovelace-dashboardet — det tekniske setup
Dashboardet der castes til Google Nest Hub er bygget som et Lovelace subview i Home Assistant. Det bruger to custom cards fra HACS: mini-media-player til artwork-visning og custom:sonos-card til afspilningskontrol.
Mini-media-player er konfigureret med artwork: full-cover-fit — det giver et fuldskærms albumcover der fylder hele kortet (580px højt). Alle øvrige UI-elementer er skjult: volume, source, power, play/pause, progress, ikon, navn og info. Det er ren artwork — intet andet. Det er dét der giver det rene, visuelle udtryk på Nest Hub’en.
Sonos-kortet giver adgang til player-kontrol, volumen, grupperingog mediebrowser — men player-sektionens visuelle elementer er skjult via card_mod CSS, så det ikke forstyrrer det minimalistiske look.
Nederst sidder to knapper i et grid: Cast (trigger script.cast_to_google_hub) og Stop cast (trigger script.stop_cast_til_google_nest) — så man også kan starte og stoppe cast manuelt fra HA-interfacet, ikke kun automatisk via Node-RED.
Det komplette dashboard-YAML ser sådan ud:
views:
- title: Home
cards:
- type: custom:mini-media-player
entity: media_player.spisestue
artwork: full-cover-fit
hide:
volume: true
source: true
power_state: true
play_pause: true
progress: true
power: true
prev: true
next: true
icon: true
name: true
info: true
card_mod:
style: |
ha-card {
height: 580px;
}
- type: custom:sonos-card
sections:
- player
- volumes
- groups
- grouping
- media browser
showVolumeUpAndDownButtons: true
hidePlayerControlPowerButton: false
hidePlayerControlShuffleButton: true
hidePlayerControlPrevTrackButton: false
hidePlayerControlNextTrackButton: false
hidePlayerControlRepeatButton: true
heightPercentage: auto
card_mod:
style:
sonos-player$: |
div {
display: none;
}
- square: true
type: grid
cards:
- type: button
show_name: true
show_icon: true
tap_action:
action: call-service
service: script.cast_to_google_hub
name: Cast
icon: mdi:cast
show_state: true
- type: button
show_name: true
show_icon: true
tap_action:
action: call-service
service: script.stop_cast_til_google_nest
name: Stop cast
icon: mdi:cast-off
show_state: true
columns: 2
subview: true
De to HACS-komponenter (mini-media-player og custom-sonos-card) skal installeres via HACS før dashboardet virker. card_mod bruges til CSS-tilpasning og er også en HACS-integration.
Hvad det kræver — og hvad det giver
Opsætningen kræver en del komponenter: Home Assistant med Nabu Casa-abonnement (for TSS), Zigbee2MQTT (jeg kører det som add-on), Node-RED, en Sonos-højttaler, et Google Nest Hub (Kan fås billigt på DBA), en OpenAI API-nøgle og en Philips Hue Tap Dial. Det er ikke et begynder-projekt.
Men det, man får ud af det, er en oplevelse, der føles magisk. Et tryk på en knap, og der spiller musik. Samtidig lyser Nest Hub’en op med coverbilledet og en AI-genereret beskrivelse af nummeret — på dansk. Gæster spørger altid: “Hvad er det der?” — og forklaringen er halvdelen af fornøjelsen:)
Hvis du selv kører Home Assistant og har en Node-RED-instans kørende, er det et overkommeligt projekt. Det meste af logikken ligger i Node-RED-flowet, og de eksterne API’er (iTunes og OpenAI) er lette at integrere. iTunes er gratis, og OpenAI koster få øre per forespørgsel med GPT-4o.
Der kan sagtens optimeres på løsningen (fx. Text-To-Speech), men til mit behov fungerer det pt. Helt fint.