Zum Inhalt springen
Alles Automatisch

Erweiterungen

Toniebox 2 in Home Assistant steuern mit HA-Toniebox

Für alle ab
Für Mitglieder freigeschaltet

Früher Zugang für Kanalmitglieder

Das Video läuft schon, nur noch nicht für alle.

Kanalmitglieder sehen es jetzt. Für alle erscheint es am Mittwoch, 14. Oktober, um 19 Uhr. Die komplette Anleitung kannst du heute schon lesen, sie steht direkt darunter.

Mitglieder seit 6. Okt.Für alle am Mi., 14. Okt.
noch 5 Tage

Bisher ging die Toniebox in Home Assistant nur über ziemlich große Umwege. Meistens musstest du die Box dafür öffnen, und damit war die Garantie weg. Mit der HACS-Integration HA-Toniebox brauchst du das nicht mehr. Sie holt Tonieboxen, Kreativ-Tonies und Content-Tonies aus der Tonie Cloud nach Home Assistant. Bei der Toniebox 2 kommen Akku, Kopfhörer, Wiedergabe und Sleeptimer in Echtzeit an, und Play, Pause, Kapitelsprung und Lautstärke steuerst du direkt. Ich habe mir die Integration in Version 4.0.4 eingerichtet, ein Dashboard dazu gebaut und ein paar Automationen für den Abend geschrieben. Das Einrichten hat bei mir ungefähr zwei Minuten gedauert. Wichtig vorab: Die Integration ist inoffiziell und stammt nicht von Boxine, dem Hersteller der Toniebox.

Wie HA-Toniebox mit der Tonie Cloud arbeitet

Die Integration verbindet die Tonie Cloud mit Home Assistant. Dafür brauchst du nur die Integration selbst und deine ganz normalen Zugangsdaten für die Tonie Cloud. Das ist gleichzeitig der große Vorteil und der große Nachteil. Lokal läuft hier leider gar nichts, weil die Daten der Toniebox lokal (zumindest Stand jetzt) einfach nicht verfügbar sind. Alles wandert also einmal durch die Cloud und landet erst danach in Home Assistant.

Der Entwickler geht mit der Entstehung wahnsinnig transparent um. Im Repository steht überall, dass die Integration komplett gevibecodet ist, also mit Claude von Anthropic entwickelt und gegen ein echtes Tonie-Konto getestet wurde. Was dabei rausgekommen ist, funktioniert aus meiner Sicht schon ziemlich gut. Beim Einrichten bin ich allerdings auf zwei kleine Fehler gestoßen. Die habe ich auf GitHub als Issue gemeldet und gleich einen Fix als Pull Request vorgeschlagen, dazu weiter unten mehr.

Was du für die Toniebox in Home Assistant brauchst

  • Home Assistant 2026.3 oder neuer
  • HACS
  • ein Tonies-Konto, also E-Mail-Adresse und Passwort wie in der Tonies-App
  • eine Toniebox, wobei es den vollen Umfang nur mit der Toniebox 2 gibt (die Tabelle dazu kommt weiter unten)
  • einen Kreativ-Tonie für Uploads und Kapitelverwaltung, denn Content-Tonies lassen sich nicht bearbeiten

In allen Beispielen stehen meine Namen: Die Box heißt toniebox, der Kreativ-Tonie kreativ_tonie_rubie und der Haushalt daniel_haushalt. Die tauschst du später einfach gegen deine eigenen aus.

Repository in HACS hinzufügen

HA-Toniebox ist noch nicht im Standardkatalog von HACS, deshalb trägst du das Repository einmal von Hand ein.

  1. HACS öffnen und oben rechts im Drei-Punkte-Menü Benutzerdefinierte Repositories wählen.
  2. https://github.com/git4sim/HA-Toniebox eintragen, bei Typ die Option Integration wählen und auf hinzufügen klicken.

Schneller geht es über den My-Link: Repository in HACS öffnen.

Herunterladen und Home Assistant neu starten

Danach taucht die Integration in der Suche auf. In der Vorschau siehst du dasselbe wie auf GitHub, also auch, welche Entitäten, Schalter und Sensoren sie mitbringt.

  1. In HACS nach Toniebox suchen und den Eintrag öffnen.
  2. Auf Herunterladen klicken und Version 4.0.4 im Dialog mit Herunterladen bestätigen.
  3. Home Assistant neu starten, entweder über die Reparatur unter Einstellungen oder über Einstellungen → Werkzeuge → YAML → Neu starten.

Das kennst du wahrscheinlich schon von anderen HACS-Integrationen.

Toniebox-Integration mit dem Tonie-Konto verbinden

Nach dem Neustart fügst du die Integration ganz normal hinzu.

  1. Einstellungen → Geräte & Dienste → Integration hinzufügen öffnen und nach Toniebox suchen.
  2. Im Dialog Toniebox Cloud Anmeldung die E-Mail-Adresse und das Passwort eintragen.

Auch hier gibt es einen Direktlink: Toniebox-Integration einrichten. Das sind dieselben Zugangsdaten, mit denen du sonst deine Kreativ-Tonies bespielst. Meldet der Dialog „Ungültige E-Mail-Adresse oder falsches Passwort.“, dann teste die Daten einmal direkt auf my.tonies.com.

Danach war es das eigentlich schon. Pro Tonie legt die Integration ein eigenes Gerät an, dazu kommen Einträge für die Box, die Kopfhörer und den Haushalt:

GerätInhalt
HaushaltKonto, Zähler für Tonies, Tonieboxen, Kinder, Mitglieder, Benachrichtigungen, Einladungen
je TonieboxMediaplayer, Sensoren, Schalter, Einstellungen
Name der Box plus Headphones (nur Toniebox 2)Kopfhörer
je Kreativ-TonieKapitelliste, Gesamtdauer, Sortierknöpfe
je Content-TonieKapitelzahl, Gesamtdauer, Gerade aktiv, Im Haushalt sperren

Im Gerät der Toniebox findest du alles, was du sonst über die Tonies-App oder die Weboberfläche einstellst. Firmware und Seriennummer stehen da, du kannst den Altersmodus, die Sprache der Box, die Helligkeit des Rings und das Klopfen zum Vor- und Zurückspulen einstellen. Maximale Lautstärke für Box und Kopfhörer und die Einstellungen für die Schlafenszeit sind auch dabei.

Toniebox 2 oder erste Generation

Die Integration funktioniert auch mit der ersten Generation, allerdings mit deutlich weniger Funktionen. Welche Box du hast, zeigt der Sensor Generation: tng steht für die Toniebox 2, classic oder rosered für ältere Modelle.

FunktionToniebox 2erste Generation
Aktuelle Figur, Firmware, Onlinejaja
Max. Lautstärke Box, Max. Kopfhörerlautstärkejaja
Play, Pause, Kapitel vor und zurück, Kapitel auswählenjanein
Lautstärke direkt setzen, Box schlafen legenjanein
Aktuelle Batterie, Wird geladenjanein
Kopfhörer: Verbunden, Kopfhörer-Batteriejanein
Aktion Sleeptimer, Sensor Schlaftimer aktivjanein
Beim Wechsel mischen (Kreativ-Tonie)janein
Helligkeit Ring und Schlafenszeit-Einstellungenjanein
LED-Helligkeit, Klopf-Richtung, Kippen & Klopfenneinja

Bei der Erreichbarkeit gibt es auch einen Unterschied. Der Binärsensor Online reagiert bei der Toniebox 2 sofort. Die erste Generation gilt als online, wenn sie sich in den letzten 30 Minuten gemeldet hat. Der Sensor Online-Status zeigt bei der Toniebox 2 nur unsupported, den kannst du also ignorieren.

Die wichtigsten Entitäten der Toniebox

Die Integration bringt wahnsinnig viele Entitäten mit. Diese hier nutze ich im Dashboard und in den Automationen:

EntitätWas sie zeigt
media_player.tonieboxFigur, Kapitel, Fortschritt, Steuerung
sensor.toniebox_aktuelle_figurName der aufgelegten Figur
sensor.toniebox_aktuelle_figur_idID der aufgelegten Figur, gut als Auslöser
sensor.toniebox_aktuelle_batterieAkkustand in Prozent
binary_sensor.toniebox_wird_geladenan, solange die Box lädt
binary_sensor.toniebox_onlineErreichbarkeit der Box
binary_sensor.toniebox_schlaftimer_aktivläuft ein Sleeptimer, mit Attribut sleep_until
binary_sensor.toniebox_headphones_verbundenKopfhörer verbunden
sensor.toniebox_headphones_kopfhorer_batterieAkkustand der Kopfhörer
number.toniebox_max_lautstarke_boxLautstärkegrenze der Box, 25 bis 100 Prozent in 25er-Schritten

In den IDs fallen die Umlaute weg, deshalb heißt es lautstarke und kopfhorer. Läuft dein Home Assistant auf Englisch, entstehen englische IDs wie sensor.toniebox_current_battery. Deine echten IDs findest du unter Einstellungen → Geräte & Dienste → Toniebox beim jeweiligen Gerät.

Ein paar Entitäten sind ab Werk deaktiviert: Zuletzt gesehen, Features, Hinzugefügt am, Zeitzone, Setup-WLAN (SSID), Transkodierung, Freie Zeit und die Knöpfe Alle Kapitel löschen und Auf Werkseinstellungen zurücksetzen. Die beiden Knöpfe würde ich auf jeden Fall deaktiviert lassen.

Wiedergabe und Sleeptimer steuern

Bei der Toniebox 2 steuert media_player.toniebox Play, Pause, Kapitel, Lautstärke und das Ausschalten, wobei die Box dabei einschläft. Über Medien durchsuchen springst du direkt zu einem Kapitel der aufgelegten Figur. Die Reaktion ist tatsächlich ziemlich schnell. Ich drücke im Dashboard auf Pause und die Box hört praktisch sofort auf, die paar Millisekunden Latenz kann man komplett ignorieren.

Den Sleeptimer startest du über eine Aktion. Dafür gehst du auf Einstellungen → Werkzeuge → Aktionen, wechselst in den YAML-Modus, fügst den Block ein und klickst auf Aktion ausführen:

yaml
action: toniebox.sleeptimer
data:
  entity_id: media_player.toniebox
  minutes: 30

Die Box schläft dann nach 30 Minuten ein, mit minutes: 0 brichst du den Timer wieder ab. Eine Eigenheit gibt es bei allen Aktionen der Integration: entity_id gehört in den data-Block. Unter target greift sie nicht.

Kreativ-Tonies sortieren, mischen und bespielen

Jeder Kreativ-Tonie hat eigene Knöpfe: Nach Titel sortieren, Nach Dateiname sortieren, Nach Datum sortieren und Kapitel mischen. Dazu kommen die Schalter Beim Wechsel mischen, Live-Funktion und Nur in diesem Haushalt abspielen.

Sortieren geht auch per Aktion. Für sort_by gibt es title, filename, date und random:

yaml
action: toniebox.sort_chapters
data:
  entity_id: media_player.kreativ_tonie_rubie
  sort_by: title

Eine Audiodatei lädst du so hoch. Die Datei muss vorher in den Medien liegen, wie das geht, steht im nächsten Abschnitt:

yaml
action: toniebox.upload_audio
data:
  entity_id: media_player.kreativ_tonie_rubie
  file_path: /media/gute-nacht-geschichte.mp3
  title: Gute-Nacht-Geschichte

Nach einem Upload oder einer Umsortierung rechnet die Tonie Cloud den Tonie um. Das dauert meist zwischen einer Sekunde und einer Minute, und solange steht Transkodierung aktiv auf an.

Beim Wechsel mischen finde ich ein bisschen verspielt, aber ganz nett. Der Schalter mischt die Kapitel, sobald auf einer Toniebox 2 ein anderer Tonie den Kreativ-Tonie ersetzt. Abnehmen allein löst nichts aus, und Tonies mit nur einem Kapitel bleiben unverändert. Diesen Schalter gibt es nur in Home Assistant, die Tonies-App hat ihn nicht. Ein Kreativ-Tonie fasst übrigens 90 Minuten und bis zu 250 Kapitel.

Kapitel direkt in Home Assistant verwalten

Damit du einzelne Kapitel im Dashboard auswählen, verschieben und löschen kannst, braucht es ein paar Helfer. Diese Teile gehören dazu:

TeilAufgabe
input_select.rubie_chapterDropdown Kapitel wählen
Automation „Toniebox · Rubie chapter list sync“aktualisiert die Liste bei jeder Kapiteländerung in der Cloud sowie beim Start
script.rubie_uploadAudiodatei hochladen
script.rubie_chapter_up, script.rubie_chapter_downKapitel verschieben
script.rubie_chapter_removeKapitel löschen

Vor jedem Eintrag im Dropdown steht eine Nummer, zum Beispiel „2 · Der Mond“. Damit bleiben gleiche Titel unterscheidbar, und die Skripte holen sich über diese Nummer die Kapitel-ID.

Am einfachsten richtest du das als Package ein. Dafür ergänzt du in der configuration.yaml diesen Eintrag. Gibt es dort schon homeassistant:, kommt nur die Zeile packages: dazu:

yaml
homeassistant:
  packages: !include_dir_named packages

Den Block unten speicherst du als packages/toniebox_chapter_management.yaml. Ersetz media_player.kreativ_tonie_rubie durch deinen Tonie und starte dann über Einstellungen → Werkzeuge → YAML → Neu starten neu.

yaml
1# Toniebox: chapter management for one Creative Tonie (package for configuration.yaml packages: or UI equivalents).
2# Replace media_player.kreativ_tonie_rubie and the rubie_ prefix with your Creative Tonie.
3# Upload reads files from /media (Media > My media). Files outside /media are refused by the script.
4input_select:
5  rubie_chapter:
6    name: Kapitel wählen
7    icon: mdi:format-list-numbered
8    options:
9    - (keine Kapitel)
10automation:
11- id: rubie_chapter_list_sync
12  alias: Toniebox · Rubie chapter list sync
13  description: Keeps the chapter dropdown in sync with the Creative Tonie.
14  mode: queued
15  triggers:
16  - trigger: state
17    entity_id: media_player.kreativ_tonie_rubie
18    attribute: chapters
19  - trigger: homeassistant
20    event: start
21  actions:
22  - action: input_select.set_options
23    target:
24      entity_id: input_select.rubie_chapter
25    data:
26      options: '{% set ch = state_attr(''media_player.kreativ_tonie_rubie'', ''chapters'') or [] %}{% set ns = namespace(o=[]) %}{% for c in ch %}{% set ns.o = ns.o + [loop.index ~ '' · '' ~ c.title] %}{%
27        endfor %}{{ ns.o if ns.o else [''(keine Kapitel)''] }}'
28script:
29  rubie_upload:
30    alias: 'Rubie: Audio hochladen'
31    icon: mdi:upload
32    mode: single
33    description: Datei aus Medien › My media wählen oder dort hochladen. Die Tonie-Cloud wandelt sie danach um.
34    fields:
35      file:
36        name: Audiodatei
37        required: true
38        selector:
39          media:
40            accept:
41            - audio/*
42      title:
43        name: Kapiteltitel (optional)
44        required: false
45        selector:
46          text: {}
47    sequence:
48    - variables:
49        path: '{% set id = file.media_content_id if file is mapping else file %}{{ ''/media/'' ~ id.split(''media_source/local/'')[-1] | replace(''%20'', '' '') }}'
50    - condition: template
51      value_template: '{{ path.startswith(''/media/'') and ''..'' not in path }}'
52    - action: toniebox.upload_audio
53      data:
54        entity_id: media_player.kreativ_tonie_rubie
55        file_path: '{{ path }}'
56        title: '{{ title | default('''', true) if title is defined else '''' }}'
57  rubie_chapter_up:
58    alias: 'Rubie: Kapitel nach oben'
59    icon: mdi:arrow-up
60    mode: single
61    sequence:
62    - variables:
63        chapter_id: '{% set i = (states(''input_select.rubie_chapter'').split('' · '')[0] | int(0)) - 1 %}{% set ch = state_attr(''media_player.kreativ_tonie_rubie'', ''chapters'') or [] %}{{ ch[i].id if
64          0 <= i < ch | count else '''' }}'
65        pos: '{{ states(''input_select.rubie_chapter'').split('' · '')[0] | int(0) }}'
66    - condition: template
67      value_template: '{{ chapter_id != '''' }}'
68    - action: toniebox.move_chapter
69      data:
70        entity_id: media_player.kreativ_tonie_rubie
71        chapter_id: '{{ chapter_id }}'
72        direction: up
73    - wait_for_trigger:
74      - trigger: state
75        entity_id: media_player.kreativ_tonie_rubie
76        attribute: chapters
77      timeout: 30
78      continue_on_timeout: true
79    - delay: 1
80    - action: input_select.select_option
81      target:
82        entity_id: input_select.rubie_chapter
83      data:
84        option: '{% set p = pos + (-1 if ''up'' == ''up'' else 1) %}{% set o = state_attr(''input_select.rubie_chapter'', ''options'') %}{{ (o | select(''match'', p ~ '' · '') | list + [o[0]])[0] }}'
85  rubie_chapter_down:
86    alias: 'Rubie: Kapitel nach unten'
87    icon: mdi:arrow-down
88    mode: single
89    sequence:
90    - variables:
91        chapter_id: '{% set i = (states(''input_select.rubie_chapter'').split('' · '')[0] | int(0)) - 1 %}{% set ch = state_attr(''media_player.kreativ_tonie_rubie'', ''chapters'') or [] %}{{ ch[i].id if
92          0 <= i < ch | count else '''' }}'
93        pos: '{{ states(''input_select.rubie_chapter'').split('' · '')[0] | int(0) }}'
94    - condition: template
95      value_template: '{{ chapter_id != '''' }}'
96    - action: toniebox.move_chapter
97      data:
98        entity_id: media_player.kreativ_tonie_rubie
99        chapter_id: '{{ chapter_id }}'
100        direction: down
101    - wait_for_trigger:
102      - trigger: state
103        entity_id: media_player.kreativ_tonie_rubie
104        attribute: chapters
105      timeout: 30
106      continue_on_timeout: true
107    - delay: 1
108    - action: input_select.select_option
109      target:
110        entity_id: input_select.rubie_chapter
111      data:
112        option: '{% set p = pos + (-1 if ''down'' == ''up'' else 1) %}{% set o = state_attr(''input_select.rubie_chapter'', ''options'') %}{{ (o | select(''match'', p ~ '' · '') | list + [o[0]])[0] }}'
113  rubie_chapter_remove:
114    alias: 'Rubie: Kapitel löschen'
115    icon: mdi:delete-outline
116    mode: single
117    sequence:
118    - variables:
119        chapter_id: '{% set i = (states(''input_select.rubie_chapter'').split('' · '')[0] | int(0)) - 1 %}{% set ch = state_attr(''media_player.kreativ_tonie_rubie'', ''chapters'') or [] %}{{ ch[i].id if
120          0 <= i < ch | count else '''' }}'
121    - condition: template
122      value_template: '{{ chapter_id != '''' }}'
123    - action: toniebox.remove_chapter
124      data:
125        entity_id: media_player.kreativ_tonie_rubie
126        chapter_id: '{{ chapter_id }}'

Ohne Package geht es auch, das ist nur ein bisschen mehr Klickarbeit. Das Dropdown legst du unter Einstellungen → Geräte & Dienste → Helfer → Helfer erstellen → Dropdown-Menü an. Die Skripte kommen unter Einstellungen → Automationen & Szenen → Skripte → Skript erstellen → Neues Skript erstellen dazu, die Automation legst du wie bei den Automationen weiter unten an, jeweils über In YAML bearbeiten. Die Entitäts-IDs müssen dabei genau so heißen wie in der Tabelle oben.

Upload geht in v4.0.4 aktuell nicht (Stand 06.10.2026). Die Integration schickt die Datei an die falsche Stelle, deshalb legt die Tonie Cloud kein Kapitel an. Ich habe den Fix vorgeschlagen, und zwar in Issue #43 und PR #44. Mit dem Patch funktioniert der Upload bei mir. Bis er in einer neuen Version steckt, lädst du Kapitel besser über die Tonies-App oder my.tonies.com hoch. Verschieben, Sortieren und Löschen klappen in Home Assistant schon jetzt.

So lädst du ein Kapitel hoch, sobald der Fix drin ist:

  1. In Medien den Ordner My media öffnen (der heißt auch auf Deutsch so).
  2. Über Verwalten und Medien hinzufügen die Audiodatei hochladen. Unterstützt werden mp3, ogg, wav, flac, m4a, aac und opus.
  3. Im Dashboard auf Audio hochladen tippen, die Audiodatei wählen, bei Bedarf Kapiteltitel (optional) ausfüllen und das Skript starten.

Bis die Cloud die Datei umgewandelt hat, steht in der Kapiteltabelle „(wird umgewandelt)“. Das Skript nimmt nur Pfade unter /media an, weil toniebox.upload_audio selbst keinen Pfad prüft.

Das Toniebox-Dashboard

Das Dashboard nutzt nur eingebaute Karten, aus HACS brauchst du dafür nichts. Für den Bereich Kapitel verwalten müssen allerdings die Helfer aus dem vorherigen Abschnitt eingerichtet sein.

BereichInhalt
Jetzt läuftMediaplayer, aufgelegte Figur, Kopfhörer
StatusAkku, Lädt, Online, Akku der Kopfhörer, Zuletzt online. Offline erscheint ein Hinweis, bei schlafender Box steht Letzter Akkustand statt der Akkuanzeige
AbendsLautstärkeregler für Box und Kopfhörer, Schlaftimer, Sleeptimer 30 Min, Timer aus
Kreativ-TonieBild, Kapiteltabelle mit belegten und freien Minuten, Kapitel verwalten (Audio hochladen, Kapitel wählen, Nach oben, Nach unten, Löschen), Reihenfolge der Kapitel (nach Titel oder Datum sortieren, mischen, Bei Tonie-Wechsel neu mischen)
HaushaltHörfiguren, Kreativ-Tonies, Hinweise, Einladungen

Sleeptimer 30 Min, Löschen und die Knöpfe für die Reihenfolge fragen vorher noch mal nach. Bei Tonie-Wechsel neu mischen ist einfach der Schalter Beim Wechsel mischen von oben. Die freien Minuten rechnet das Dashboard selbst aus (90 minus die Summe der Kapitellängen), weil der Sensor Freie Zeit in 4.0.4 leer bleibt.

  1. Einstellungen → Dashboards → Dashboard hinzufügen öffnen und Neues Dashboard von Grund auf wählen.
  2. Als Titel Toniebox und als Seitenleistensymbol mdi:cube-outline eintragen, dann Erstellen.
  3. Das Dashboard öffnen, auf den Stift Dashboard bearbeiten klicken und über Dashboard-Menü öffnen den Raw-Konfigurationseditor starten.
  4. Den Inhalt durch den Block unten ersetzen, Speichern, den Editor schließen und auf Fertig klicken.

Heißt deine Box anders, ersetzt du toniebox durch deinen Präfix. In der Aktion toniebox.sleeptimer bleibt der Name allerdings stehen. Dazu kommen kreativ_tonie_rubie und daniel_haushalt, die du gegen deine Namen tauschst.

yaml
1# Toniebox dashboard: core cards only, no HACS cards required.
2# Replace "toniebox" with your box entity prefix if you kept another name, and "kreativ_tonie_rubie" / "rubie_" with your Creative Tonie.
3# The "Kapitel verwalten" block needs input_select.rubie_chapter, the sync automation and the four rubie_* scripts (see guide).
4title: Toniebox
5views:
6  - title: Toniebox
7    path: toniebox
8    icon: mdi:cube-outline
9    type: sections
10    max_columns: 4
11    sections:
12      - type: grid
13        cards:
14          - type: heading
15            heading: Jetzt läuft
16            icon: mdi:play-circle-outline
17          - type: media-control
18            entity: media_player.toniebox
19            grid_options:
20              columns: full
21          - type: tile
22            entity: sensor.toniebox_aktuelle_figur
23            name: Figur auf der Box
24            icon: mdi:account-music
25            grid_options:
26              columns: full
27          - type: tile
28            entity: binary_sensor.toniebox_headphones_verbunden
29            name: Kopfhörer
30            icon: mdi:headphones
31            grid_options:
32              columns: full
33
34      - type: grid
35        cards:
36          - type: heading
37            heading: Status
38            icon: mdi:battery-heart-variant
39          - type: markdown
40            content: Die Box ist gerade offline. Akku und Figur zeigt sie wieder, sobald sie aufwacht.
41            grid_options:
42              columns: full
43            visibility:
44              - condition: state
45                entity: binary_sensor.toniebox_online
46                state: "off"
47          - type: gauge
48            entity: sensor.toniebox_aktuelle_batterie
49            name: Akku
50            min: 0
51            max: 100
52            needle: true
53            severity:
54              red: 0
55              yellow: 20
56              green: 40
57            grid_options:
58              columns: full
59            visibility:
60              - condition: state
61                entity: sensor.toniebox_aktuelle_batterie
62                state_not: unknown
63              - condition: state
64                entity: sensor.toniebox_aktuelle_batterie
65                state_not: unavailable
66          - type: tile
67            entity: sensor.toniebox_letzte_batterie
68            name: Letzter Akkustand
69            icon: mdi:battery-clock-outline
70            grid_options:
71              columns: full
72            visibility:
73              - condition: or
74                conditions:
75                  - condition: state
76                    entity: sensor.toniebox_aktuelle_batterie
77                    state: unknown
78                  - condition: state
79                    entity: sensor.toniebox_aktuelle_batterie
80                    state: unavailable
81          - type: tile
82            entity: binary_sensor.toniebox_wird_geladen
83            name: Lädt
84            grid_options:
85              columns: full
86          - type: tile
87            entity: binary_sensor.toniebox_online
88            name: Online
89          - type: tile
90            entity: sensor.toniebox_headphones_kopfhorer_batterie
91            name: Akku Kopfhörer
92          - type: tile
93            entity: sensor.toniebox_zuletzt_online
94            name: Zuletzt online
95            grid_options:
96              columns: full
97
98      - type: grid
99        cards:
100          - type: heading
101            heading: Abends
102            icon: mdi:weather-night
103          - type: tile
104            entity: number.toniebox_max_lautstarke_box
105            name: Max. Lautstärke Box
106            grid_options:
107              columns: full
108            features:
109              - type: numeric-input
110                style: slider
111          - type: tile
112            entity: number.toniebox_max_kopfhorerlautstarke
113            name: Max. Lautstärke Kopfhörer
114            grid_options:
115              columns: full
116            features:
117              - type: numeric-input
118                style: slider
119          - type: tile
120            entity: binary_sensor.toniebox_schlaftimer_aktiv
121            name: Schlaftimer
122            icon: mdi:timer-sand
123            grid_options:
124              columns: full
125          - type: button
126            name: Sleeptimer 30 Min
127            icon: mdi:sleep
128            tap_action:
129              action: perform-action
130              perform_action: toniebox.sleeptimer
131              data:
132                entity_id: media_player.toniebox
133                minutes: 30
134              confirmation:
135                text: Sleeptimer auf 30 Minuten stellen?
136          - type: button
137            name: Timer aus
138            icon: mdi:timer-off-outline
139            tap_action:
140              action: perform-action
141              perform_action: toniebox.sleeptimer
142              data:
143                entity_id: media_player.toniebox
144                minutes: 0
145
146      - type: grid
147        cards:
148          - type: heading
149            heading: Kreativ-Tonie
150            icon: mdi:microphone-variant
151          - type: tile
152            entity: media_player.kreativ_tonie_rubie
153            name: Rubie
154            show_entity_picture: true
155            hide_state: true
156            grid_options:
157              columns: full
158          - type: markdown
159            grid_options:
160              columns: full
161            content: |
162              {%- set ch = state_attr('media_player.kreativ_tonie_rubie', 'chapters') or [] -%}
163              {%- if ch | count == 0 -%}
164              Noch keine Kapitel in der Tonie-Cloud. Lade unten eine Audiodatei hoch oder nutze die Tonies-App oder my.tonies.com.
165              {%- else -%}
166              | Nr. | Kapitel | Dauer |
167              |:--|:--|--:|
168              {%- for c in ch %}
169              | {{ loop.index }} | {{ c.title }}{{ ' (wird umgewandelt)' if c.transcoding else '' }} | {{ (c.duration_seconds // 60) | int }}:{{ '%02d' % ((c.duration_seconds % 60) | int) }} |
170              {%- endfor %}
171
172              {% set used = (ch | sum(attribute='duration_seconds')) / 60 -%}
173              **{{ ch | count }} Kapitel** · {{ used | round(0, 'ceil') | int }} von 90 Minuten belegt · **{{ (90 - used) | round(0, 'floor') | int }} Minuten frei**
174              {%- endif -%}
175          - type: heading
176            heading: Kapitel verwalten
177            heading_style: subtitle
178          - type: tile
179            entity: script.rubie_upload
180            name: Audio hochladen
181            icon: mdi:upload
182            hide_state: true
183            grid_options:
184              columns: full
185            tap_action:
186              action: more-info
187          - type: tile
188            entity: input_select.rubie_chapter
189            name: Kapitel wählen
190            hide_state: true
191            grid_options:
192              columns: full
193            features:
194              - type: select-options
195          - type: tile
196            entity: script.rubie_chapter_up
197            name: Nach oben
198            icon: mdi:arrow-up
199            hide_state: true
200            vertical: true
201            grid_options:
202              columns: 4
203            tap_action:
204              action: perform-action
205              perform_action: script.rubie_chapter_up
206          - type: tile
207            entity: script.rubie_chapter_down
208            name: Nach unten
209            icon: mdi:arrow-down
210            hide_state: true
211            vertical: true
212            grid_options:
213              columns: 4
214            tap_action:
215              action: perform-action
216              perform_action: script.rubie_chapter_down
217          - type: tile
218            entity: script.rubie_chapter_remove
219            name: Löschen
220            icon: mdi:delete-outline
221            hide_state: true
222            vertical: true
223            grid_options:
224              columns: 4
225            tap_action:
226              action: perform-action
227              perform_action: script.rubie_chapter_remove
228              confirmation:
229                text: Das gewählte Kapitel endgültig von Rubie löschen?
230          - type: heading
231            heading: Reihenfolge der Kapitel
232            heading_style: subtitle
233          - type: tile
234            entity: button.kreativ_tonie_rubie_nach_titel_sortieren
235            name: Nach Titel sortieren (A bis Z)
236            icon: mdi:sort-alphabetical-ascending
237            hide_state: true
238            grid_options:
239              columns: full
240            tap_action:
241              action: perform-action
242              perform_action: button.press
243              target:
244                entity_id: button.kreativ_tonie_rubie_nach_titel_sortieren
245              confirmation:
246                text: Kapitel auf Rubie nach Titel sortieren?
247          - type: tile
248            entity: button.kreativ_tonie_rubie_nach_datum_sortieren
249            name: Nach Datum sortieren
250            icon: mdi:sort-calendar-ascending
251            hide_state: true
252            grid_options:
253              columns: full
254            tap_action:
255              action: perform-action
256              perform_action: button.press
257              target:
258                entity_id: button.kreativ_tonie_rubie_nach_datum_sortieren
259              confirmation:
260                text: Kapitel auf Rubie nach Datum sortieren?
261          - type: tile
262            entity: button.kreativ_tonie_rubie_kapitel_mischen
263            name: Einmal zufällig mischen
264            icon: mdi:shuffle-variant
265            hide_state: true
266            grid_options:
267              columns: full
268            tap_action:
269              action: perform-action
270              perform_action: button.press
271              target:
272                entity_id: button.kreativ_tonie_rubie_kapitel_mischen
273              confirmation:
274                text: Kapitel auf Rubie jetzt zufällig mischen?
275          - type: tile
276            entity: switch.kreativ_tonie_rubie_beim_wechsel_mischen
277            name: Bei Tonie-Wechsel neu mischen
278            icon: mdi:shuffle
279            grid_options:
280              columns: full
281      - type: grid
282        cards:
283          - type: heading
284            heading: Haushalt
285            icon: mdi:home-heart
286          - type: tile
287            entity: sensor.daniel_haushalt_content_tonies
288            name: Hörfiguren
289            icon: mdi:account-group
290          - type: tile
291            entity: sensor.daniel_haushalt_kreativ_tonies
292            name: Kreativ-Tonies
293            icon: mdi:microphone-variant
294          - type: tile
295            entity: sensor.daniel_haushalt_benachrichtigungen
296            name: Hinweise
297            icon: mdi:bell-outline
298          - type: tile
299            entity: sensor.daniel_haushalt_offene_einladungen
300            name: Einladungen
301            icon: mdi:email-outline

Automationen für Akku, Lautstärke und Schlafenszeit

Spannend wird die Toniebox in Home Assistant natürlich erst mit Automationen. Du legst sie unter Einstellungen → Automationen → Automation erstellen → Neue Automation erstellen an, wählst im Menü In YAML bearbeiten und fügst den Block ein. notify.mobile_app_handy ersetzt du durch deinen eigenen Benachrichtigungsdienst, die übrigen Namen wie beim Dashboard.

Benachrichtigung bei niedrigem Akku

Die Automation meldet sich, wenn der Akku unter 20 Prozent fällt und die Box gerade nicht lädt.

yaml
1alias: Toniebox Akku niedrig
2description: Meldet, wenn der Akku der Toniebox unter 20 Prozent fällt.
3triggers:
4  - trigger: numeric_state
5    entity_id: sensor.toniebox_aktuelle_batterie
6    below: 20
7conditions:
8  - condition: state
9    entity_id: binary_sensor.toniebox_wird_geladen
10    state: "off"
11actions:
12  - action: notify.mobile_app_handy
13    data:
14      title: Toniebox
15      message: >-
16        Akku bei {{ states('sensor.toniebox_aktuelle_batterie') }} Prozent.
17        Ab auf die Ladestation.
18mode: single

Lautstärke abends begrenzen

Um 19 Uhr sinkt die Lautstärkegrenze auf 50 Prozent, um 7 Uhr geht sie wieder auf 100.

yaml
1alias: Toniebox Lautstärke abends begrenzen
2description: Abends Lautstärkegrenze 50 Prozent, morgens wieder 100.
3triggers:
4  - trigger: time
5    at: "19:00:00"
6    id: evening
7  - trigger: time
8    at: "07:00:00"
9    id: morning
10actions:
11  - choose:
12      - conditions:
13          - condition: trigger
14            id: evening
15        sequence:
16          - action: number.set_value
17            target:
18              entity_id: number.toniebox_max_lautstarke_box
19            data:
20              value: 50
21    default:
22      - action: number.set_value
23        target:
24          entity_id: number.toniebox_max_lautstarke_box
25        data:
26          value: 100
27mode: single

Sleeptimer am Abend automatisch

Ab 18:30 Uhr startet ein Timer von 30 Minuten, sobald die Box spielt. Läuft schon ein Timer, passiert nichts.

yaml
1alias: Toniebox Sleeptimer am Abend
2description: Ab 18:30 Uhr schläft die Box 30 Minuten nach Wiedergabestart ein.
3triggers:
4  - trigger: state
5    entity_id: media_player.toniebox
6    to: playing
7conditions:
8  - condition: time
9    after: "18:30:00"
10  - condition: state
11    entity_id: binary_sensor.toniebox_schlaftimer_aktiv
12    state: "off"
13actions:
14  - action: toniebox.sleeptimer
15    data:
16      entity_id: media_player.toniebox
17      minutes: 30
18mode: single

Kopfhörer erkannt

Sobald Kopfhörer verbunden sind, kommt eine Nachricht mit ihrem Akkustand.

yaml
1alias: Toniebox Kopfhörer verbunden
2description: Meldet verbundene Kopfhörer samt Akkustand.
3triggers:
4  - trigger: state
5    entity_id: binary_sensor.toniebox_headphones_verbunden
6    from: "off"
7    to: "on"
8actions:
9  - action: notify.mobile_app_handy
10    data:
11      title: Toniebox
12      message: >-
13        Kopfhörer verbunden, Akku bei
14        {{ states('sensor.toniebox_headphones_kopfhorer_batterie') }} Prozent.
15mode: single

Feste Schlafenszeit

Um 20:30 Uhr legt Home Assistant die Box schlafen, vorausgesetzt sie ist online.

yaml
1alias: Toniebox Schlafenszeit
2description: Legt die Toniebox um 20:30 Uhr schlafen.
3triggers:
4  - trigger: time
5    at: "20:30:00"
6conditions:
7  - condition: state
8    entity_id: binary_sensor.toniebox_online
9    state: "on"
10actions:
11  - action: media_player.turn_off
12    target:
13      entity_id: media_player.toniebox
14mode: single

Hörstatistiken im Zeitarchiv

Wer Statistiken mag, kann sich die Daten der Toniebox auch aufzeichnen. Ich habe mir dafür im Zeitarchiv ein eigenes Toniebox-Dashboard angelegt. Dort laufen die Hörminuten insgesamt, die Hörsessions, Figurenwechsel, gestartete Kapitel, Abendminuten und die Minuten über Kopfhörer auf, jeweils für heute und für die Woche. Dazu kommen die Hörzeit pro Figur, die Hörminuten pro Tag und die Tageszeiten, zu denen gehört wird.

Sicherheit und Grenzen der Integration

Die Integration spricht nur mit Servern von Tonies, und zwar login.tonies.com, api.prod.tcs.toys, ici.tonie.cloud und cdn.tonies.de. Sie prüft TLS-Zertifikate, protokolliert weder Passwort noch Token und lädt keinen Code nach. Trotzdem gibt es ein paar Punkte, die du kennen solltest.

Die Schnittstelle ist inoffiziell. Tonies kann sie jederzeit ändern oder sperren, dann fallen die Entitäten aus.

Das Passwort liegt im Klartext in .storage/core.config_entries und damit auch in jedem Backup. Nimm für das Tonies-Konto deshalb ein eigenes Passwort, das du sonst nirgends verwendest.

toniebox.clear_chapters, toniebox.remove_tune und toniebox.dismiss_all_notifications löschen ohne Rückfrage und wirken sofort. Diese Aktionen würde ich auf keinen Fall an Sprachassistenten freigeben.

toniebox.upload_audio prüft keine Pfade und schickt jede Datei in die Cloud, die Home Assistant lesen kann. Lade nur eigene Dateien aus /media hoch. Große Dateien halten Home Assistant kurz an.

sensor.toniebox_generation trägt die MAC-Adresse der Box als Attribut mac_address. Wenn du Screenshots teilst, schwärz sie vorher.

Der Sensor Freie Zeit zeigt in 4.0.4 immer „Unbekannt“, weil die Integration die Restzeit aus der Cloud nicht übernimmt. Auch dafür habe ich einen Fix vorgeschlagen: Issue #45 und PR #46.

Tipps bei Problemen mit der Toniebox

ProblemWas hilft
Sleeptimer ohne sichtbare WirkungDas ist normal, die Box schläft erst nach Ablauf ein. Kontrollieren kannst du das über binary_sensor.toniebox_schlaftimer_aktiv (Attribut sleep_until). Die erste Generation ignoriert die Aktion.
Akku zeigt „Unbekannt“Die Box ist offline oder schläft. Den letzten Wert hält sensor.toniebox_letzte_batterie.
Steuerung fehlt am MediaplayerZeigt Generation nicht tng, gibt es keine Wiedergabesteuerung.
Einstellung kommt nicht anEinstellungen übertragen zeigt, ob die Box sie übernommen hat. Eine schlafende Box übernimmt sie beim nächsten Einschalten.
Neuer Kreativ-Tonie fehlt oder zeigt 0 KapitelIntegration neu laden: Einstellungen → Geräte & Dienste → Toniebox, Drei-Punkte-Menü des Eintrags, Neu laden.
Werte veraltenDie Cloud wird alle fünf Minuten abgefragt, bei der ersten Generation sind die Werte also bis zu fünf Minuten alt. Alle aktualisieren am Haushalt holt sie sofort.
Box über Home Assistant einschaltenGeht nicht, eine schlafende Box lässt sich über die Cloud nicht wecken. Sie wacht per Druck aufs Ohr oder durch Auflegen eines Tonies auf. Schlafen legen geht bei der Toniebox 2.
Figur doppeltDie zweite Figur bekommt _2 an ihre Entitäts-IDs.
Anmeldung abgelaufenHome Assistant fragt im Dialog Erneute Anmeldung bei Toniebox neu nach.
FehlersucheIm Menü der Integration Debug-Protokoll aktivieren, das Verhalten wiederholen und unter Einstellungen → System → Protokolle nachsehen.

Weiterführende Inhalte

Hast du eine Toniebox zu Hause? Hattest du sie vorher schon auf einem etwas hackigen Weg in Home Assistant eingebunden, oder ist dieser Weg über die Cloud für dich jetzt interessant?

Diskussion im Forum

Hast du Fragen oder Ideen zu diesem Thema?

Diskutiere im Forum

Video teilen

Community

Unterstütze den Kanal

Hat dir der Beitrag geholfen? Es gibt zwei Wege, etwas zurückzugeben.