Macht der CAST-1 jeden Lautsprecher smart?

Kinder wollen irgendwann selbst entscheiden, was sie hören möchten. Bei unserem Jüngsten ist es gerade so weit. Ein Smart Speaker mit Mikrofon und Cloud-Anbindung kam fürs Kinderzimmer allerdings nicht infrage. Ein Handy oder Tablet ebensowenig. Da jedoch bereits eine Boombox vorhanden war, lag die Lösung nahe:

Ein Apollo CAST-1 an der Boombox, Music Assistant als Musikquelle und ein Zigbee-Schalter mit vier Tasten. In diesem Beitrag zeige ich dir, wie das alles zusammenspielt, wie die Automation aufgebaut ist und wo die Grenzen des Systems liegen.

Was genau ist der Apollo CAST-1?

Der CAST-1 ist ein extrem kompakter Audio-Streamer von Apollo Automation². Er misst gerade einmal 45 × 45 × 15 Millimeter und wird ganz einfach über USB-C mit Strom versorgt – ein handelsübliches Handynetzteil reicht hierfür völlig aus.

Die Audioausgabe erfolgt über einen 3,5-mm-Klinkenausgang. Damit kannst du ihn an jedes Gerät anschließen, das einen AUX-Eingang besitzt, egal ob Boombox, Stereoanlage, aktive Boxen oder Soundbar.

Die wichtigsten Daten laut Hersteller:

  • Prozessor: ESP32-S3 (16 MB Flash, 8 MB PSRAM)
  • DAC: Texas Instruments PCM5122, 32 Bit, 112 dB Dynamikumfang
  • Audioausgang: 3,5 mm Klinke, 2,1 V RMS
  • Netzwerk: WLAN 2,4 GHz, optional Ethernet per Zusatzplatine
  • Firmware: ESPHome, Open Source
  • Cloud: Nicht nötig, funktioniert komplett lokal
  • Preis: ca. 48 € mit Versand

Zusätzlich kannst du den CAST-1 als Bluetooth-Proxy für Home Assistant nutzen. Wenn du mehrere Geräte hast, lassen sie sich über Music Assistant sogar synchron gruppieren.

Optional: Die Ethernet-Platine

Für Standorte mit schwachem WLAN gibt es eine praktische, aufsteckbare Ethernet-Platine mit W5500-Chip. In unserem Kinderzimmer brauche ich sie nicht, da der WLAN-Empfang dort völlig ausreicht.

Wichtig für dich zu wissen: Wenn du die Ethernet-Firmware nutzt, fällt die WLAN-Funktion komplett weg. Der CAST-1 holt sich dann einfach per DHCP seine IP-Adresse und taucht ganz ohne weitere Eingaben in deinem Home Assistant auf.

Einrichtung in Home Assistant und Music Assistant

Die Einrichtung ist schnell erledigt:

  1. Versorge den CAST-1 mit Strom und verbinde ihn mit deinem WLAN.
  2. Home Assistant findet das Gerät automatisch – du musst es nur noch einmal bestätigen.
  3. In Music Assistant erscheint der CAST-1 daraufhin als Player. Die Verbindung läuft dabei über Sendspin, das hauseigene Streaming-Protokoll von Music Assistant.
  4. Stecke nun das Klinkenkabel in die Boombox.

Als Musikquellen nutze ich zwei Optionen:

  • MausRadio vom WDR: Diesen Sender habe ich in Music Assistant einfach einmalig zur Bibliothek hinzugefügt.
  • Kinderplaylist bei Spotify: Hierfür benötigt Music Assistant ein Spotify-Premium-Konto.

Hier gibt es das ganze auch als Video von mir:

Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen
Dumme Boombox smart machen für Home Assistant

Der Zigbee-Schalter: Vier Tasten, sieben Funktionen

Als Schalter verwende ich einen MOES Zigbee-Schalter mit vier Tasten, der über Zigbee2MQTT eingebunden ist. Der Clou: Jede Taste unterscheidet zwischen einfachem Druck, Doppeldruck und langem Halten.

MOES Smart Zigbee Schalter,12 Szenen Button, Home Assistant...*
  • 1. Automatisieren Sie den kabellosen Tuya ZigBee-Szenenwechsel auf...
  • 2. Drei Pairing-Modi für jede Taste, um 3 Szenen aus einem...

So habe ich die Tasten belegt:

TasteKurz drückenDoppelt drückenLang halten
1MausRadio startenPause / WeiterAus
2Kinderplaylist (Zufall)Nächster TitelAus
3Lauter (+5 %)–Aus
4Leiser (−5 %)–Aus

Die Idee dahinter ist simpel: Egal, welche Taste dein Kind lange gedrückt hält, die Musik geht immer aus. So muss sich niemand eine komplizierte Belegung merken. Die Doppeldrücke sind hingegen eher als Funktionen für uns Große gedacht.

Die Automation

Die gesamte Steuerung steckt in einer einzigen Automation. Sie reagiert auf die Aktionen, die Zigbee2MQTT bei jedem Tastendruck sendet, und entscheidet dann ganz automatisch anhand der Trigger-ID, was passieren soll.

Die Trigger

Zigbee2MQTT meldet jeden Tastendruck als Aktion – zum Beispiel 1_single für einen einfachen Druck auf Taste 1. In der Automation bekommt jede dieser Aktionen eine eigene Trigger-ID. Die vier langen Tastendrücke teilen sich dabei praktischerweise die ID „aus“.

triggers:
  - trigger: mqtt
    id: radio
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_single
  - trigger: mqtt
    id: pause
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_double
  - trigger: mqtt
    id: playlist
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_single
  - trigger: mqtt
    id: weiter
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_double
  - trigger: mqtt
    id: lauter
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 3_single
  - trigger: mqtt
    id: leiser
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 4_single
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 3_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 4_hold

Radio und Playlist starten

Für die Wiedergabe nutze ich die Aktion music_assistant.play_media. Mit dem Parameter enqueue: replace wird sichergestellt, dass der neue Inhalt das ersetzt, was gerade läuft. Ohne diese Option würde die Playlist einfach nur hinten angehängt werden.

Bevor die Playlist startet, schaltet die Automation automatisch die Zufallswiedergabe ein. Andernfalls würde jeden Tag immer wieder dasselbe erste Lied laufen.

actions:
  - choose:
      - conditions:
          - condition: trigger
            id: radio
        sequence:
          - action: music_assistant.play_media
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              media_id: Die Maus
              media_type: radio
              enqueue: replace
      - conditions:
          - condition: trigger
            id: playlist
        sequence:
          - action: media_player.shuffle_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              shuffle: true
          - action: music_assistant.play_media
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              media_id: '[SPOTIFY-PLAYLIST-URI]'
              media_type: playlist
              enqueue: replace
      - conditions:
          - condition: trigger
            id: pause
        sequence:
          - action: media_player.media_play_pause
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}
      - conditions:
          - condition: trigger
            id: weiter
        sequence:
          - action: media_player.media_next_track
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}
      - conditions:
          - condition: trigger
            id: aus
        sequence:
          - action: media_player.media_stop
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}

Lautstärke mit Obergrenze

Erfahrungsgemäß wird Taste 3 (Lauter) am häufigsten gedrückt. Genau aus diesem Grund gibt es eine Obergrenze für die Lautstärke.

Dafür habe ich einen Helfer in Home Assistant angelegt (unter Einstellungen → Geräte & Dienste → Helfer → Helfer erstellen → Zahlenwert). Bei mir heißt dieser Helfer „Kinderzimmer Maximallautstärke“ und steht auf 50 %.

Wenn man nun lauter stellt, liest die Automation die aktuelle Lautstärke aus, rechnet 5 % dazu und prüft sofort, ob dieser Wert über der Grenze liegt. Ist das der Fall, bleibt die Lautstärke bei dem Maximalwert. Liegt sie bereits darüber, ändert sich einfach nichts.

Zusätzlich habe ich zwei kleine Absicherungen eingebaut:

  • Die Automation läuft nur dann durch, wenn der Player überhaupt einen Lautstärkewert meldet. Sonst würde das System fälschlicherweise mit dem Wert 0 rechnen.
  • Nach jeder Lautstärkeänderung wartet die Automation eine halbe Sekunde. So hat Home Assistant genug Zeit, den neuen Wert zu übernehmen, bevor ein eventueller nächster Tastendruck registriert wird.
actions:
  - choose:      
      - conditions:
          - condition: trigger
            id: lauter
        sequence:
          - action: media_player.volume_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              volume_level: >
                {% set aktuell = state_attr('media_player.apollo_cast_1_21912c',
                'volume_level') | float(0) %} {% set grenze =
                states('input_number.kinderzimmer_maximallautstarke') |
                float(60) / 100 %} {{ [aktuell + 0.05, grenze] | min | round(2)
                }}
      - conditions:
          - condition: trigger
            id: leiser
        sequence:
          - action: media_player.volume_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              volume_level: >
                {% set aktuell = state_attr('media_player.apollo_cast_1_21912c',
                'volume_level') | float(0) %} {{ [aktuell - 0.05, 0] | max |
                round(2) }}

Die komplette Automation

alias: Kinderzimmer Musik-Taster
description: Steuert den CAST-1 im Kinderzimmer über den 4-Tasten-Zigbee-Schalter
triggers:
  - trigger: mqtt
    id: radio
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_single
  - trigger: mqtt
    id: pause
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_double
  - trigger: mqtt
    id: playlist
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_single
  - trigger: mqtt
    id: weiter
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_double
  - trigger: mqtt
    id: lauter
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 3_single
  - trigger: mqtt
    id: leiser
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 4_single
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 1_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 2_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 3_hold
  - trigger: mqtt
    id: aus
    options:
      topic: zigbee2mqtt/Kinderzimmer Taster/action
      payload: 4_hold
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: radio
        sequence:
          - action: music_assistant.play_media
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              media_id: Die Maus
              media_type: radio
              enqueue: replace
      - conditions:
          - condition: trigger
            id: playlist
        sequence:
          - action: media_player.shuffle_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              shuffle: true
          - action: music_assistant.play_media
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              media_id: '[SPOTIFY-PLAYLIST-URI]'
              media_type: playlist
              enqueue: replace
      - conditions:
          - condition: trigger
            id: pause
        sequence:
          - action: media_player.media_play_pause
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}
      - conditions:
          - condition: trigger
            id: weiter
        sequence:
          - action: media_player.media_next_track
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}
      - conditions:
          - condition: trigger
            id: lauter
        sequence:
          - action: media_player.volume_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              volume_level: >
                {% set aktuell = state_attr('media_player.apollo_cast_1_21912c',
                'volume_level') | float(0) %} {% set grenze =
                states('input_number.kinderzimmer_maximallautstarke') |
                float(60) / 100 %} {{ [aktuell + 0.05, grenze] | min | round(2)
                }}
      - conditions:
          - condition: trigger
            id: leiser
        sequence:
          - action: media_player.volume_set
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data:
              volume_level: >
                {% set aktuell = state_attr('media_player.apollo_cast_1_21912c',
                'volume_level') | float(0) %} {{ [aktuell - 0.05, 0] | max |
                round(2) }}
      - conditions:
          - condition: trigger
            id: aus
        sequence:
          - action: media_player.media_stop
            target:
              entity_id:
                - media_player.apollo_cast_1_21912c
            data: {}
mode: queued
max: 5

Macht der CAST-1 nun jeden Lautsprecher smart?

Fast. Bei allem, was einen Klinkeneingang hat: Ja! Bei anderen Geräten leider nicht. Hier sind noch ein paar Dinge, die du vor dem Nachbauen wissen solltest:

  • Kein eigener Lautsprecher: Der CAST-1² benötigt zwingend eine Box mit AUX-Eingang. Hast du nur passive Lautsprecher, brauchst du zusätzlich einen Verstärker.
  • WLAN mit 2,4 GHz: Das WLAN-Signal muss am Aufstellort ausreichend stark sein. Ist das nicht der Fall, hilft dir die erwähnte Ethernet-Platine weiter.
  • Streams brauchen Internet: Das Radio und Spotify kommen natürlich aus dem Internet. Die Steuerung deines Setups bleibt aber komplett lokal: Dein Schalter, Home Assistant, Music Assistant und der CAST-1 kommunizieren mit keiner fremden Cloud.
  • Obergrenze gilt nur für den Schalter: Wenn du die Lautstärke direkt in Music Assistant lauter drehst, umgehst du die einprogrammierte Obergrenze.

Was sonst noch möglich ist

Zwei weitere praktische Funktionen nutze ich im Kinderzimmer bisher noch nicht, sie bieten sich aber förmlich an:

  • Multiroom: Du kannst problemlos mehrere CAST-1 in Music Assistant² synchron zu einer Gruppe zusammenfassen.
  • Durchsagen: Wenn du Durchsagen aus Home Assistant machst, wird die Musik automatisch deutlich leiser, die Durchsage wird abgespielt und danach läuft die Musik in normaler Lautstärke weiter. Die LED am Gerät leuchtet währenddessen cyan. So kannst du ein „Abendessen ist fertig!“ direkt über die Boombox im Kinderzimmer abspielen. (Ob es dann auch wirklich gehört wird, steht natürlich auf einem anderen Blatt).

Fazit

Für eine bereits vorhandene Box mit Klinkeneingang ist der CAST-1² eine wirklich einfache Möglichkeit, diese nahtlos in Home Assistant und Music Assistant einzubinden. In Kombination mit einem günstigen Zigbee-Schalter entsteht so eine smarte Musiklösung für das Kinderzimmer, die komplett ohne Handy, Tablet und vor allem ohne störendes Mikrofon auskommt.

Wie löst du das bei dir zu Hause? Schreib es mir gerne in die Kommentare!

MOES Smart Zigbee Schalter,12 Szenen Button, Home Assistant...*
  • 1. Automatisieren Sie den kabellosen Tuya ZigBee-Szenenwechsel auf...
  • 2. Drei Pairing-Modi für jede Taste, um 3 Szenen aus einem...