{"id":688,"date":"2026-03-04T12:39:53","date_gmt":"2026-03-04T10:39:53","guid":{"rendered":"https:\/\/vittrup-graversen.dk\/?p=688"},"modified":"2026-03-28T12:10:32","modified_gmt":"2026-03-28T10:10:32","slug":"fra-knaptryk-til-ai-genereret-musikbeskrivelse-saadan-styrer-jeg-mit-smart-home-musik-setup","status":"publish","type":"post","link":"https:\/\/vittrup-graversen.dk\/index.php\/2026\/03\/04\/fra-knaptryk-til-ai-genereret-musikbeskrivelse-saadan-styrer-jeg-mit-smart-home-musik-setup\/","title":{"rendered":"Fra knaptryk til AI-genereret musikbeskrivelse \u2014 s\u00e5dan styrer jeg mit smart home musik-setup"},"content":{"rendered":"\n<p>Jeg har l\u00e6nge dr\u00f8mt om at styre musikken derhjemme med \u00e9n enkelt fysisk kontrol \u2014 uden at skulle finde telefonen frem, \u00e5bne en app og navigere rundt. Samtidig ville jeg gerne have, at der automatisk blev vist information om det, der spiller, p\u00e5 et display i stuen. Det blev til et setup, der kombinerer en <strong><a href=\"https:\/\/www.philips-hue.com\/da-dk\/p\/hue-tap-dial-switch\/8719514440999\" target=\"_blank\" rel=\"noreferrer noopener\">Philips Hue Tap Dial<\/a><\/strong>, <strong><a href=\"https:\/\/nodered.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Node-RED<\/a><\/strong>, <strong><a href=\"https:\/\/www.home-assistant.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Home Assistant<\/a><\/strong>, <strong><a href=\"https:\/\/www.sonos.com\/da-dk\/home\" target=\"_blank\" rel=\"noreferrer noopener\">Sonos<\/a><\/strong>, <strong><a href=\"https:\/\/openai.com\/api\/\" target=\"_blank\" rel=\"noreferrer noopener\">ChatGPT<\/a><\/strong> og en <strong><a href=\"https:\/\/www.elgiganten.dk\/product\/tv-lyd-smart-home\/hojtalere-hi-fi\/hojttalere\/google-nest-hub-2-generation-charcoal\/299862\" target=\"_blank\" rel=\"noreferrer noopener\">Google Nest Hub<\/a><\/strong> \u2014 og resultatet er noget af det mest tilfredsstillende smart home-automation, jeg har bygget.<\/p>\n\n\n\n<p>Jeg har k\u00f8rt setuppet i mere end et \u00e5r, og l\u00e6nge g\u00e5et og t\u00e6nkt p\u00e5 at f\u00e5 det dokumenteret. I dette indl\u00e6g gennemg\u00e5r jeg hele ops\u00e6tningen i detaljer \u2014 fra det fysiske knaptryk p\u00e5 en Zigbee kompliant dial enhed til den AI-genererede danske musikbeskrivelse, der dukker op p\u00e5 mit Nest Hub-display.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Indhold<\/h2><nav><ul><li class=\"\"><a href=\"#philips-hue-tap-dial-fire-knapper-og-et-drejehjul\">Philips Hue Tap Dial \u2014 fire knapper og et drejehjul<\/a><\/li><li class=\"\"><a href=\"#node-red-et-flow-der-binder-det-hele-sammen\">Node-RED \u2014 \u00e9t flow der binder det hele sammen<\/a><\/li><li class=\"\"><a href=\"#protokol-kaeden-fra-zigbee-til-ai\">Protokol-k\u00e6den \u2014 fra Zigbee til AI<\/a><\/li><li class=\"\"><a href=\"#i-tunes-api-fetch-albumcovers\">iTunes API \u2014 fetch albumcovers<\/a><\/li><li class=\"\"><a href=\"#chat-gpt-giver-kontekst-om-musikken-pa-dansk\">ChatGPT giver kontekst om musikken \u2014 p\u00e5 dansk<\/a><\/li><li class=\"\"><a href=\"#google-nest-hub-det-automatiske-musikdashboard\">Google Nest Hub \u2014 det automatiske musikdashboard<\/a><\/li><li class=\"\"><a href=\"#lovelace-dashboardet-det-tekniske-setup\">Lovelace-dashboardet \u2014 det tekniske setup<\/a><\/li><li class=\"\"><a href=\"#hvad-det-kraever-og-hvad-det-giver\">Hvad det kr\u00e6ver \u2014 og hvad det giver<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"philips-hue-tap-dial-fire-knapper-og-et-drejehjul\">Philips Hue Tap Dial \u2014 fire knapper og et drejehjul<\/h2>\n\n\n\n<p>Hjertet i ops\u00e6tningen er en <strong>Philips Hue Tap Dial<\/strong> \u2014 en lille rund Zigbee-enhed med fire knapper og et drejehjul. Den kommunikerer via en <a href=\"https:\/\/www.plusled.dk\/zigbee-dongle-sonoff-usb-dongle-zigbee-3.0-zbdongle-e-7901\/\" target=\"_blank\" rel=\"noreferrer noopener\">Zigbee dongle<\/a> (gateway) til <strong>Zigbee2MQTT<\/strong> i Home Assistant (Zigbee-signalerne sendes som MQTT-beskeder p\u00e5 topic\u2019et <code>zigbee2mqtt\/Phillips Tap Dial)<\/code>. Derfra tager Node-RED over.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1081-1024x768.jpeg\" alt=\"\" class=\"wp-image-694\" style=\"width:416px;height:auto\"\/><\/figure>\n\n\n\n<p>De fire knapper er konfigureret til (og ja, skal have printet nogle bedre ikoner:)):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Knap 1:<\/strong> Play\/Pause \u2014 kalder <code>media_player.media_play_pause<\/code><\/li>\n\n\n\n<li><strong>Knap 2:<\/strong> N\u00e6ste nummer \u2014 kalder <code>media_player.media_next_track<\/code> (virker selvf\u00f8lgelig kun p\u00e5 Spotify playlisten)<\/li>\n\n\n\n<li><strong>Knap 3:<\/strong> DR P8 Jazz \u2014 skifter kilde til &#8220;DR P8 Jazz&#8221; med en TTS-besked: <em>&#8220;Spiller P8 Jazz. \u00d8jeblik&#8221;<\/em><\/li>\n\n\n\n<li><strong>Knap 4:<\/strong> Spotify-playliste \u2014 skifter til &#8220;My Shazam Tracks&#8221; med TTS: <em>&#8220;Spiller Mortens fede Spotify liste. \u00d8jeblik&#8221;<\/em><\/li>\n<\/ul>\n\n\n\n<p>Drejehjulet styrer volume op og ned. Alle kommandoer sendes til <code>media_player.stue<\/code>, som er mine Sonos-h\u00f8jttalere i stuen. TTS-beskederne leveres via <strong>Nabu Casa cloud TTS<\/strong>, s\u00e5 man f\u00e5r en kort stemmefeedback inden kilden skifter \u2014 det giver en fornemmelse af, at systemet reagerer med det samme.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"node-red-et-flow-der-binder-det-hele-sammen\">Node-RED \u2014 \u00e9t flow der binder det hele sammen<\/h2>\n\n\n\n<p>Alt logik k\u00f8rer i \u00e9t samlet <a href=\"https:\/\/nodered.org\/\" target=\"_blank\" rel=\"noopener\">Node-RED<\/a> flow kaldet &#8220;Simple Hue dial switch&#8221;. Det h\u00e5ndterer b\u00e5de knaptryk fra dialen og den automatiske dashboard-opdatering. Flowet er delt i to hovedgrene:<\/p>\n\n\n\n<p><strong>Knaptryk- og dreje delen<\/strong> sender MQTT-events fra Zigbee2MQTT som NodeRed lytter p\u00e5. En switch-node sorterer p\u00e5 <code>payload.button_action<\/code> \u2014 det kan v\u00e6re <code>button_1_press<\/code>, <code>button_2_press<\/code>, <code>brightness_step_up<\/code> og s\u00e5 videre. Hver gren kalder den relevante Home Assistant-service via API&#8217;et. Ved kanalskift (knap 3 og 4) sendes f\u00f8rst TTS-beskeden, og derefter skiftes kilden.<\/p>\n\n\n\n<p><strong>Dashboard-delen<\/strong> (som jeg kalder &#8220;WhoAndWhatsPlaying&#8221;) er den mere avancerede del. Den overv\u00e5ger <code>media_player.spisestue<\/code> via en <code>server-state-changed<\/code>-node og reagerer, n\u00e5r status skifter til &#8220;playing&#8221;.<\/p>\n\n\n\n<p>Jeg har zippet mit flow &#8211; du kan downloade det og tilrette det til dit behov &#8211; link i bunden af artiklen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"protokol-kaeden-fra-zigbee-til-ai\">Protokol-k\u00e6den \u2014 fra Zigbee til AI<\/h2>\n\n\n\n<p>Hele signalvejen ser s\u00e5dan ud:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1184\" height=\"264\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/musik-flow-diagram.png\" alt=\"Flowdiagram: Fra Hue Tap Dial via Zigbee, MQTT og Node-RED til Sonos, iTunes API og Google Nest Hub\" class=\"wp-image-691\" srcset=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/musik-flow-diagram.png 1184w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/musik-flow-diagram-300x67.png 300w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/musik-flow-diagram-1024x228.png 1024w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/musik-flow-diagram-768x171.png 768w\" sizes=\"auto, (max-width: 1184px) 100vw, 1184px\" \/><figcaption class=\"wp-element-caption\">Signalflow: Fra knaptryk til musik og dashboard<\/figcaption><\/figure>\n\n\n\n<p>Den fulde protokol-k\u00e6de er: <strong>Zigbee \u2192 Zigbee2MQTT \u2192 MQTT \u2192 Node-RED \u2192 Home Assistant API \u2192 Sonos (musik) + Google Cast (dashboard) + iTunes API (artwork) + OpenAI API (beskrivelser)<\/strong>. Det er seks forskellige protokoller og fire eksterne API&#8217;er, der alle spiller sammen i realtid.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-tunes-api-fetch-albumcovers\">iTunes API \u2014 fetch albumcovers<\/h2>\n\n\n\n<p>En detalje som (ogs\u00e5) fungerer godt, er brugen af <a href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/AudioVideo\/Conceptual\/iTuneSearchAPI\/Searching.html#\/\/apple_ref\/doc\/uid\/TP40017632-CH5-SW1\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Apples iTunes Search API<\/strong> til at hente albumcover <\/a>artwork. N\u00e5r Node-RED registrerer et nyt nummer, s\u00f8ger den automatisk i iTunes&#8217; database efter kunstner og titel. Det returnerer en artwork-URL, som jeg opscalerer til 600&#215;600 pixels for at f\u00e5 et skarpt billede p\u00e5 Nest Hub&#8217;en.<\/p>\n\n\n\n<p>Artwork-URL&#8217;en gemmes i en Home Assistant <code>input_text<\/code>-entitet (<code>input_text.albumartworkurl<\/code>), s\u00e5 Lovelace-dashboardet altid har adgang til det aktuelle coverbillede. Det smarte er, at iTunes API&#8217;et er gratis, kr\u00e6ver ingen autentificering og d\u00e6kker stort set al kommerciel musik \u2014 det er perfekt til denne type integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"chat-gpt-giver-kontekst-om-musikken-pa-dansk\">ChatGPT giver kontekst om musikken \u2014 p\u00e5 dansk<\/h2>\n\n\n\n<p><em>(Update: 8. marts 2026: Har lavet en Claude integration i stedet (Opus 2.6): det giver et v\u00e6sentlig bedre response)<\/em><\/p>\n\n\n\n<p>Den del af setupet, der imponerer g\u00e6sterne mest, er <strong>ChatGPT-integrationen<\/strong>. N\u00e5r et nyt nummer starter, bygger Node-RED en prompt baseret p\u00e5 kunstner, titel og album \u2014 og sender den til <strong>GPT-4o<\/strong> via OpenAI&#8217;s API. Svaret er en kort dansk beskrivelse af musikken p\u00e5 maksimalt 500 tegn.<\/p>\n\n\n\n<p>Prompten er tilpasset kilden. For <strong>Spotify<\/strong> beder jeg om instrumenter, hvem der spillede dem, og album-info (titel, \u00e5r, label, producer, l\u00e6ngde). For <strong>DR P8 Jazz<\/strong> fokuserer prompten mere p\u00e5 instrumentering og musikere \u2014 da P8 ikke altid leverer komplet metadata.<\/p>\n\n\n\n<p>DR P8 er i det hele taget en interessant udfordring. Radioen leverer ikke <code>media_artist<\/code> som Spotify g\u00f8r, s\u00e5 Node-RED tjekker f\u00f8rst, om der er en artist-attribut. Hvis ikke, unders\u00f8ger den om det er P8&#8217;s header-tekst (&#8220;DR P8 JAZZ dr.dk\/p8jazz&#8221;). Hvis det ikke er headeren, parser den titlen i formatet &#8220;titel \/ artist&#8221; \u2014 som er den m\u00e5de, P8 ofte leverer sine metadata.<\/p>\n\n\n\n<p>ChatGPT-beskrivelsen gemmes i en Home Assistant-sensor (<code>FullAlbumDescriptionSensor<\/code>) med en <code>description<\/code>-attribut, som dashboardet tr\u00e6kker p\u00e5.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"google-nest-hub-det-automatiske-musikdashboard\">Google Nest Hub \u2014 det automatiske musikdashboard<\/h2>\n\n\n\n<p>Alt samles p\u00e5 et <strong>Google Nest Hub<\/strong>-display via et dedikeret <a href=\"https:\/\/www.home-assistant.io\/dashboards\/\" target=\"_blank\" rel=\"noopener\">Lovelace-dashboard<\/a> i Home Assistant. Dashboardet er designet specifikt til at blive castet og viser:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Albumcover artwork (fra iTunes API)<\/li>\n\n\n\n<li>Track-titel og artist<\/li>\n\n\n\n<li>AI-genereret dansk beskrivelse af musikken (fra ChatGPT)<\/li>\n<\/ul>\n\n\n\n<p>N\u00e5r DR P8 Jazz spiller sin header (stationsidentifikation), skifter dashboardet til et lilla farvetema med P8 Jazz-branding \u2014 en lille detalje, men det ser rigtig godt ud.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"763\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082-1024x763.jpeg\" alt=\"\" class=\"wp-image-697\" srcset=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082-1024x763.jpeg 1024w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082-300x224.jpeg 300w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082-768x572.jpeg 768w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082-1536x1145.jpeg 1536w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_1082.jpeg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Det hele er fuldautomatisk: N\u00e5r musik starter, trigger Node-RED <code>script.cast_to_google_hub<\/code>, som caster dashboardet til Nest Hub&#8217;en. N\u00e5r musikken stopper, kaldes <code>script.stop_cast_til_google_nest<\/code>, og displayet g\u00e5r tilbage til sin normale tilstand.<\/p>\n\n\n\n<p>Hvis ikke P8 Jazz sender noget sigende s\u00e5 pr\u00e6senterer jeg et default cover billede:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575-1024x768.jpeg\" alt=\"\" class=\"wp-image-699\" srcset=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575-1024x768.jpeg 1024w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575-300x225.jpeg 300w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575-768x576.jpeg 768w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575-1536x1152.jpeg 1536w, https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/IMG_4575.jpeg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lovelace-dashboardet-det-tekniske-setup\">Lovelace-dashboardet \u2014 det tekniske setup<\/h2>\n\n\n\n<p>Dashboardet der castes til Google Nest Hub er bygget som et <strong>Lovelace subview<\/strong> i Home Assistant. Det bruger to custom cards fra HACS: <a href=\"https:\/\/github.com\/kalkih\/mini-media-player\" target=\"_blank\" rel=\"noopener\">mini-media-player<\/a> til artwork-visning og <a href=\"https:\/\/github.com\/punxaphil\/custom-sonos-card\" target=\"_blank\" rel=\"noopener\">custom:sonos-card<\/a> til afspilningskontrol.<\/p>\n\n\n\n<p><strong>Mini-media-player<\/strong> er konfigureret med <code>artwork: full-cover-fit<\/code> \u2014 det giver et fuldsk\u00e6rms albumcover der fylder hele kortet (580px h\u00f8jt). Alle \u00f8vrige UI-elementer er skjult: volume, source, power, play\/pause, progress, ikon, navn og info. Det er ren artwork \u2014 intet andet. Det er d\u00e9t der giver det rene, visuelle udtryk p\u00e5 Nest Hub&#8217;en.<\/p>\n\n\n\n<p><strong>Sonos-kortet<\/strong> giver adgang til player-kontrol, volumen, grupperingog mediebrowser \u2014 men player-sektionens visuelle elementer er skjult via <code>card_mod<\/code> CSS, s\u00e5 det ikke forstyrrer det minimalistiske look.<\/p>\n\n\n\n<p>Nederst sidder to knapper i et grid: <strong>Cast<\/strong> (trigger <code>script.cast_to_google_hub<\/code>) og <strong>Stop cast<\/strong> (trigger <code>script.stop_cast_til_google_nest<\/code>) \u2014 s\u00e5 man ogs\u00e5 kan starte og stoppe cast manuelt fra HA-interfacet, ikke kun automatisk via Node-RED.<\/p>\n\n\n\n<p>Det komplette dashboard-YAML ser s\u00e5dan ud:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>views:\n  - title: Home\n    cards:\n      - type: custom:mini-media-player\n        entity: media_player.spisestue\n        artwork: full-cover-fit\n        hide:\n          volume: true\n          source: true\n          power_state: true\n          play_pause: true\n          progress: true\n          power: true\n          prev: true\n          next: true\n          icon: true\n          name: true\n          info: true\n        card_mod:\n          style: |\n            ha-card {\n              height: 580px;\n            }\n      - type: custom:sonos-card\n        sections:\n          - player\n          - volumes\n          - groups\n          - grouping\n          - media browser\n        showVolumeUpAndDownButtons: true\n        hidePlayerControlPowerButton: false\n        hidePlayerControlShuffleButton: true\n        hidePlayerControlPrevTrackButton: false\n        hidePlayerControlNextTrackButton: false\n        hidePlayerControlRepeatButton: true\n        heightPercentage: auto\n        card_mod:\n          style:\n            sonos-player$: |\n              div {\n                display: none;\n              }\n      - square: true\n        type: grid\n        cards:\n          - type: button\n            show_name: true\n            show_icon: true\n            tap_action:\n              action: call-service\n              service: script.cast_to_google_hub\n            name: Cast\n            icon: mdi:cast\n            show_state: true\n          - type: button\n            show_name: true\n            show_icon: true\n            tap_action:\n              action: call-service\n              service: script.stop_cast_til_google_nest\n            name: Stop cast\n            icon: mdi:cast-off\n            show_state: true\n        columns: 2\n    subview: true<\/code><\/pre>\n\n\n\n<p>De to HACS-komponenter (<code>mini-media-player<\/code> og <code>custom-sonos-card<\/code>) skal installeres via <a href=\"https:\/\/hacs.xyz\/\" target=\"_blank\" rel=\"noopener\">HACS<\/a> f\u00f8r dashboardet virker. <code>card_mod<\/code> bruges til CSS-tilpasning og er ogs\u00e5 en HACS-integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"hvad-det-kraever-og-hvad-det-giver\">Hvad det kr\u00e6ver \u2014 og hvad det giver<\/h2>\n\n\n\n<p>Ops\u00e6tningen kr\u00e6ver en del komponenter: Home Assistant med Nabu Casa-abonnement (for TSS), Zigbee2MQTT (jeg k\u00f8rer det som add-on), Node-RED, en Sonos-h\u00f8jttaler, et Google Nest Hub (Kan f\u00e5s billigt p\u00e5 DBA), en <a href=\"https:\/\/vittrup-graversen.dk\/index.php\/2026\/02\/24\/saadan-er-openclaw-bygget-op-en-arkitektur-der-koerer-24-7-paa-din-egen-hardware\/\">OpenAI API-n\u00f8gle<\/a> og en Philips Hue Tap Dial. Det er ikke et begynder-projekt.<\/p>\n\n\n\n<p>Men det, man f\u00e5r ud af det, er en oplevelse, der f\u00f8les <em>magisk<\/em>. Et tryk p\u00e5 en knap, og der spiller musik. Samtidig lyser Nest Hub&#8217;en op med coverbilledet og en AI-genereret beskrivelse af nummeret \u2014 p\u00e5 dansk. G\u00e6ster sp\u00f8rger altid: &#8220;Hvad er det der?&#8221; \u2014 og forklaringen er halvdelen af forn\u00f8jelsen:)<\/p>\n\n\n\n<p>Hvis du selv k\u00f8rer <a href=\"https:\/\/vittrup-graversen.dk\/index.php\/2026\/02\/28\/saadan-genererede-jeg-et-word-cloud-wordpress-blog-med-rust-og-python\/\">Home Assistant<\/a> og har en Node-RED-instans k\u00f8rende, er det et overkommeligt projekt. Det meste af logikken ligger i Node-RED-flowet, og de eksterne API&#8217;er (iTunes og OpenAI) er lette at integrere. iTunes er gratis, og OpenAI koster f\u00e5 \u00f8re per foresp\u00f8rgsel med GPT-4o.<\/p>\n\n\n\n<p>Der kan sagtens optimeres p\u00e5 l\u00f8sningen (fx. Text-To-Speech), men til mit behov fungerer det pt. Helt fint.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-704\" href=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/nodered-flows.zip\">Download Node-RED flow (ZIP)<\/a><a href=\"https:\/\/vittrup-graversen.dk\/wp-content\/uploads\/2026\/03\/nodered-flows.zip\" class=\"wp-block-file__button wp-element-button\" aria-describedby=\"wp-block-file--media-704\" download>Download<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fra knaptryk til AI-genereret musikbeskrivelse \u2014 s\u00e5dan styrer jeg mit smart home musik-setup med Home Assistant og Sonos.<\/p>\n","protected":false},"author":1,"featured_media":701,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8,18,9,5,7],"tags":[16,54,49,50,52,51,53],"class_list":["post-688","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-home-automation","category-homelab","category-music","category-techology","tag-chatgpt","tag-google-nest-hub","tag-home-assistant","tag-node-red","tag-smart-home","tag-sonos","tag-zigbee"],"acf":[],"_links":{"self":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/comments?post=688"}],"version-history":[{"count":20,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/688\/revisions"}],"predecessor-version":[{"id":1010,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/posts\/688\/revisions\/1010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/media\/701"}],"wp:attachment":[{"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/media?parent=688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/categories?post=688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vittrup-graversen.dk\/index.php\/wp-json\/wp\/v2\/tags?post=688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}