{"id":1566,"date":"2026-08-05T13:00:46","date_gmt":"2026-08-05T11:00:46","guid":{"rendered":"https:\/\/www.coremind.ch\/wordpress\/?p=1566"},"modified":"2026-08-05T13:00:46","modified_gmt":"2026-08-05T11:00:46","slug":"universal-media-player-geraete-sauber-buendeln","status":"publish","type":"post","link":"https:\/\/www.coremind.ch\/wordpress\/universal-media-player-geraete-sauber-buendeln\/","title":{"rendered":"Universal Media Player: Ger\u00e4te sauber b\u00fcndeln"},"content":{"rendered":"<p>Im Wohnzimmer stehen ein HomePod, ein Chromecast und ein AV-Receiver. In Home Assistant erscheinen sie als drei <code>media_player<\/code>-Entit\u00e4ten, dazu kommt noch eine <code>remote<\/code>-Entit\u00e4t f\u00fcrs Einschalten. Auf dem Dashboard sieht das aus wie ein Mischpult f\u00fcr Fortgeschrittene \u2013 und in Automationen muss man jedes Mal raten, welches Ger\u00e4t gerade l\u00e4uft. Genau daf\u00fcr gibt es die Universal-Media-Player-Integration: Sie fasst mehrere Entit\u00e4ten zu einer einzigen zusammen, die sich immer so verh\u00e4lt wie das gerade aktive Ger\u00e4t.<\/p>\n<h2>Die Idee dahinter<\/h2>\n<p>Der Universal Media Player ist kein eigenes Ger\u00e4t, sondern eine H\u00fclle. Er bekommt eine geordnete Liste von Kind-Entit\u00e4ten (<code>children<\/code>) und imitiert immer das erste Kind aus dieser Liste, das nicht <code>off<\/code> oder <code>idle<\/code> ist. Zus\u00e4tzlich lassen sich einzelne Kommandos und Attribute gezielt umbiegen \u2013 etwa das Einschalten an eine <code>remote<\/code>-Entit\u00e4t delegieren, w\u00e4hrend die Lautst\u00e4rke vom Receiver kommt und die Titelinformation vom Streaming-Ger\u00e4t.<\/p>\n<p>Das l\u00f6st drei Probleme auf einmal: eine Karte statt vier, eine Entit\u00e4t als Ziel f\u00fcr Sprachbefehle und Automationen, und eine saubere Zustandsanzeige, die auch dann stimmt, wenn die Quelle wechselt.<\/p>\n<h2>Schritt 1: Die Basis-Konfiguration<\/h2>\n<p>Die Integration wird in YAML konfiguriert. In der <code>configuration.yaml<\/code> \u2013 oder besser in einer ausgelagerten Datei \u2013 sieht das Grundger\u00fcst so aus:<\/p>\n<pre><code>\nmedia_player:\n  - platform: universal\n    name: Wohnzimmer\n    unique_id: wohnzimmer_universal\n    children:\n      - media_player.homepod\n      - media_player.chromecast_wohnzimmer\n      - media_player.av_receiver\n    browse_media_entity: media_player.chromecast_wohnzimmer\n<\/code><\/pre>\n<p>Nach einem Neustart existiert <code>media_player.wohnzimmer<\/code>. L\u00e4uft der Chromecast, zeigt die neue Entit\u00e4t dessen Cover, Titel und Fortschritt. Ist alles aus, ist sie <code>off<\/code>.<\/p>\n<p>Die Reihenfolge in <code>children<\/code> ist die Priorit\u00e4t. Wer meistens \u00fcber den HomePod h\u00f6rt, setzt ihn nach oben. <code>browse_media_entity<\/code> legt fest, welches Kind die Medienbibliothek liefert \u2013 ohne diesen Eintrag wird das erste Kind verwendet, was bei Airplay-Ger\u00e4ten oft ins Leere f\u00fchrt.<\/p>\n<h2>Schritt 2: Kommandos umleiten<\/h2>\n<p>Interessant wird es, wenn ein Ger\u00e4t sich nicht selbst einschalten kann. Ein AV-Receiver h\u00e4ngt oft an einer <code>remote<\/code>&#8211; oder <code>switch<\/code>-Entit\u00e4t. Mit dem Block <code>commands<\/code> \u00fcberschreiben Sie einzelne Aktionen:<\/p>\n<pre><code>\nmedia_player:\n  - platform: universal\n    name: Wohnzimmer\n    unique_id: wohnzimmer_universal\n    children:\n      - media_player.chromecast_wohnzimmer\n      - media_player.homepod\n    commands:\n      turn_on:\n        action: remote.turn_on\n        target:\n          entity_id: remote.homepod\n      turn_off:\n        action: remote.turn_off\n        target:\n          entity_id: remote.homepod\n      volume_up:\n        action: media_player.volume_up\n        target:\n          entity_id: media_player.av_receiver\n      volume_down:\n        action: media_player.volume_down\n        target:\n          entity_id: media_player.av_receiver\n<\/code><\/pre>\n<p>M\u00f6glich sind unter anderem <code>turn_on<\/code>, <code>turn_off<\/code>, <code>select_source<\/code>, <code>volume_set<\/code>, <code>volume_up<\/code>, <code>volume_down<\/code>, <code>volume_mute<\/code> sowie die Transportbefehle <code>media_play<\/code>, <code>media_pause<\/code>, <code>media_next_track<\/code> und <code>media_previous_track<\/code>.<\/p>\n<h2>Schritt 3: Attribute \u00fcbersteuern<\/h2>\n<p>Der <code>attributes<\/code>-Block bestimmt, woher einzelne Zustandswerte kommen. Die Syntax ist <code>entity_id|attribut<\/code>, wobei ein Eintrag ohne Attribut den Zustand der Entit\u00e4t selbst nimmt:<\/p>\n<pre><code>\n    attributes:\n      state: remote.homepod\n      volume_level: media_player.av_receiver|volume_level\n      is_volume_muted: media_player.av_receiver|is_volume_muted\n      source: media_player.av_receiver|source\n      source_list: media_player.av_receiver|source_list\n<\/code><\/pre>\n<p>Eine Faustregel aus der Praxis: <code>turn_on<\/code>, <code>turn_off<\/code> und <code>state<\/code> geh\u00f6ren immer zusammen. Wer nur das Einschalten umleitet, aber den Zustand weiterhin von den Kindern ableiten l\u00e4sst, bekommt eine Entit\u00e4t, die nach dem Einschalten sofort wieder <code>off<\/code> meldet.<\/p>\n<p>Wer die Ausgabe anschliessend f\u00fcr Sprachdurchsagen nutzen m\u00f6chte, findet die Grundlagen dazu im Beitrag <a href=\"https:\/\/www.coremind.ch\/wordpress\/homepod-als-tts-lautsprecher-in-home-assistant\/\">HomePod als TTS-Lautsprecher in Home Assistant<\/a>.<\/p>\n<h2>Schritt 4: Der Nutzen in Automationen<\/h2>\n<p>Der eigentliche Gewinn zeigt sich, sobald nur noch eine Entit\u00e4t angesprochen werden muss. Statt in jeder Automation eine Bedingung zu bauen, welches der drei Ger\u00e4te gerade l\u00e4uft, gen\u00fcgt ein Ziel:<\/p>\n<pre><code>\nautomation:\n  - alias: Musik leiser bei T\u00fcrklingel\n    triggers:\n      - trigger: state\n        entity_id: binary_sensor.tuerklingel\n        to: \"on\"\n    conditions:\n      - condition: state\n        entity_id: media_player.wohnzimmer\n        state: playing\n    actions:\n      - action: media_player.volume_set\n        target:\n          entity_id: media_player.wohnzimmer\n        data:\n          volume_level: 0.15\n<\/code><\/pre>\n<p>Dasselbe gilt f\u00fcr Assist: Ein Sprachbefehl wie \u00abMusik im Wohnzimmer stoppen\u00bb trifft eine eindeutige Entit\u00e4t, statt an einem Ger\u00e4t zu scheitern, das gerade gar nicht spielt. Auch Dashboards profitieren \u2013 eine Media-Control-Karte ersetzt vier einzelne Karten, und der Titel wechselt automatisch mit der Quelle.<\/p>\n<h2>Troubleshooting<\/h2>\n<p>Zwei Fehlerbilder treten fast immer auf. Erstens: Die Entit\u00e4t \u00fcbernimmt keine Attribute. Meist liegt es daran, dass das gew\u00fcnschte Kind gerade <code>idle<\/code> ist und deshalb \u00fcbersprungen wird \u2013 dann hilft ein expliziter <code>attributes<\/code>-Eintrag. Zweitens: Nach einem Neustart bleibt die Entit\u00e4t <code>unavailable<\/code>. Pr\u00fcfen Sie in diesem Fall, ob alle Kind-Entit\u00e4ten tats\u00e4chlich existieren; ein Tippfehler in einer <code>entity_id<\/code> legt die ganze H\u00fclle lahm.<\/p>\n<h2>Fazit<\/h2>\n<p>Der Universal Media Player ist eine der unauff\u00e4lligsten und zugleich n\u00fctzlichsten Integrationen in Home Assistant. Er kostet zwanzig Zeilen YAML und macht aus einem Wildwuchs an Ger\u00e4ten eine Entit\u00e4t, die Automationen, Dashboards und Assist gleichermassen verstehen. Fangen Sie mit der minimalen <code>children<\/code>-Liste an, pr\u00fcfen Sie das Verhalten beim Umschalten der Quelle, und erg\u00e4nzen Sie <code>commands<\/code> und <code>attributes<\/code> erst dort, wo etwas wirklich nicht stimmt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Wohnzimmer stehen ein HomePod, ein Chromecast und ein AV-Receiver. In Home Assistant erscheinen sie als drei media_player-Entit\u00e4ten, dazu kommt noch eine remote-Entit\u00e4t f\u00fcrs Einschalten. Auf dem Dashboard sieht das aus wie ein Mischpult f\u00fcr Fortgeschrittene \u2013 und in Automationen muss man jedes Mal raten, welches Ger\u00e4t gerade l\u00e4uft. Genau daf\u00fcr gibt es die Universal-Media-Player-Integration: &#8230; <a title=\"Universal Media Player: Ger\u00e4te sauber b\u00fcndeln\" class=\"read-more\" href=\"https:\/\/www.coremind.ch\/wordpress\/universal-media-player-geraete-sauber-buendeln\/\" aria-label=\"Mehr Informationen \u00fcber Universal Media Player: Ger\u00e4te sauber b\u00fcndeln\">Weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1566","post","type-post","status-publish","format-standard","hentry","category-ha"],"_links":{"self":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/1566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/comments?post=1566"}],"version-history":[{"count":1,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/1566\/revisions"}],"predecessor-version":[{"id":1579,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/posts\/1566\/revisions\/1579"}],"wp:attachment":[{"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/media?parent=1566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/categories?post=1566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.coremind.ch\/wordpress\/wp-json\/wp\/v2\/tags?post=1566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}