TeddyRemote ist eine moderne native Android-App zur Fernsteuerung von Toniebox-2-Geräten über TeddyCloud. Die App gibt selbst kein Audio wieder: Sie zeigt den aktuellen Zustand der Boxen an und sendet Steuerbefehle über die TeddyCloud-API.
- adaptive TB2-Karten mit Boxname, Boxbild, Onlinezustand und „Zuletzt gesehen“
- Akku-, Kopfhörer- und sekundengenauer Bedtime-Status
- physischer Tonie mit Bild, optionaler RUID, Titel, Kapitel und Laufzeit
- Previous, Play/Pause, Next und Kapitelauswahl
- Lautstärkeregelung von 1 bis 12
- Bedtime starten, neu setzen oder abbrechen, die Bedtime-Ringhelligkeit steuern sowie bestätigt zweistufig schlafen legen
- optionale Ringhelligkeit
- Android-Mediensteuerung für aktive TB2 – ohne lokale Audiowiedergabe
- mehrere speicherbare TeddyCloud-/MQTT-Verbindungsprofile
- automatischer Reconnect mit begrenzbarem exponentiellem Backoff
- Livezustände über einen externen MQTT-Broker; API-Polling als Fallback
- lokaler Cache für Box- und Toniebilder
- Light-, Dark- und System-Theme
TeddyRemote unterstützt ausschließlich Toniebox 2. TB1-Geräte werden bewusst nicht angezeigt.
| Boxübersicht | Einstellungen |
|---|---|
![]() |
![]() |
| Player | Sperrbildschirm |
![]() |
![]() |
- Android 10 oder neuer (
minSdk 29) - TeddyCloud mit TB2-Live-State- und Control-API
- Netzwerkzugriff des Android-Geräts auf TeddyCloud
- optional: ein externer MQTT-3.1.1-Broker für schnelle Live-Updates
Der unter MQTT und Home Assistant konfigurierte TeddyCloud-MQTT-Client veröffentlicht Zustände an den externen Broker. Der interne ICI-MQTT-Server (mqtt_server.*) ist dafür ausdrücklich nicht vorgesehen.
TeddyRemote abonniert:
<prefix>/status
<prefix>/box/+/+
Ohne MQTT bleibt die App über angepasstes API-Polling nutzbar. MQTT reduziert die Verzögerung und vermeidet unnötige Abfragen.
Beim ersten Start wird ein Serverprofil angelegt. Erforderlich ist mindestens die TeddyCloud-Basis-URL, zum Beispiel:
https://192.168.1.100:8443/
192.168.1.100 ist nur eine neutrale Beispieladresse und muss durch die tatsächliche Adresse des eigenen TeddyCloud-Hosts ersetzt werden.
Ein Profil kann zusätzlich Host, Port, Prefix, TLS, Benutzername und Passwort des externen MQTT-Brokers enthalten. API und MQTT lassen sich im Profildialog getrennt prüfen.
Die App enthält unter Einstellungen → Anleitungen → MQTT-Server konfigurieren eine lokale HTML-Anleitung für einen kleinen TLS-gesicherten Mosquitto-Broker. Sie wird direkt im installierten Browser geöffnet und benötigt keine Internetverbindung.
app/src/main/java/de/teddycloud/teddyremote/
├── data/ Profile und verschlüsselte Zugangsdaten
├── model/ Verbindungs-, API- und UI-Modelle
├── mqtt/ MQTT-Verbindung und Topic-Auswertung
├── network/ TeddyCloud-API und TLS-Fingerprint-Pinning
├── repository/ Zustandszusammenführung, Polling und Reconnect
├── service/ Foreground-Service und Android-MediaSessions
└── ui/ Jetpack-Compose-Oberfläche
Die App verwendet Kotlin, Jetpack Compose, Material 3, Retrofit/OkHttp, Kotlin Serialization, HiveMQ MQTT Client, DataStore, Coroutines/StateFlow und Coil.
Benötigt werden:
- JDK 17
- Android SDK 36
- Android Build Tools und Platform Tools
PowerShell:
$env:JAVA_HOME='C:\Program Files\Eclipse Adoptium\jdk-17.0.19.10-hotspot'
./gradlew.bat test
./gradlew.bat lint
./gradlew.bat assembleReleaseDie APK entsteht unter:
app/build/outputs/apk/release/app-release.apk
Die Signaturdaten liegen absichtlich außerhalb des Projekts unter:
%USERPROFILE%\.teddyremote\signing.properties
Ein lokaler Keystore kann vorbereitet werden mit:
./scripts/prepare-signing.ps1Fehlt die externe Release-Konfiguration, signiert Gradle den lokalen Release-Build zu Entwicklungszwecken mit der Debug-Signatur. Keystore und Passwörter dürfen nicht in das Projekt übernommen werden.
- MQTT-Passwörter werden per AES-GCM mit einem nicht exportierbaren Android-Keystore-Schlüssel verschlüsselt.
- Selbst signierte API- und MQTT-Zertifikate müssen anhand ihres SHA-256-Fingerprints bestätigt werden.
- Bestätigte Fingerprints werden pro Profil gepinnt. Ein Zertifikatswechsel blockiert die Verbindung bis zur erneuten Bestätigung.
- HTTP bleibt für lokale Testsysteme möglich, wird aber deutlich als unverschlüsselt markiert.
- Zugangsdaten und Zertifikatsinhalte werden nicht protokolliert.
- Die App besitzt keine Audio-Engine, fordert keinen Audiofokus an und spielt keine lokalen Audiodateien ab.
- Übersicht zeigt spielende Onlineboxen zuerst, danach weitere Onlineboxen und Offlineboxen nach letztem Kontakt. Offlinekarten sind standardmäßig kompakt und lassen sich durch Antippen aufklappen.
- Verbinden/Trennen ist direkt in der Übersicht verfügbar. Serverprofile mit API-/MQTT-Details befinden sich zusammen mit der separaten WLAN-Anzeige in den Einstellungen.
- Die Tonie-ID ist auf Boxkarten standardmäßig verborgen und lässt sich unter Darstellung einblenden. Der Wiedergabeverlauf ist einklappbar und nach Name oder ID durchsuchbar.
- Kapitelzuordnung und Dauern werden unabhängig von Figurennamen aufgelöst. Die letzte TAF-Dauer benötigt explizite Kapiteldauern oder das additive API-Feld
totalSeconds; ohne diese Daten erscheint—. - Beenden stoppt Verbindungen und Mediensteuerungen. Beim nächsten bewussten App-Start gilt wieder die gespeicherte Autostartoption; normales Trennen löst keinen automatischen Wiederaufbau durch einen Seitenwechsel aus.
Die separate TeddyCloud-API-Anleitung beschreibt die noch serverseitig erforderliche Ergänzung. TeddyRemote spielt weiterhin selbst kein Audio ab.
TeddyRemote befindet sich in aktiver Entwicklung. Die App setzt die im verwendeten TeddyCloud-TB2-Branch bereitgestellten Zustands- und Steuerendpunkte voraus; andere TeddyCloud-Versionen können noch nicht alle angezeigten Funktionen liefern.



