Übersicht
FullScreendy zeigt ein FHEM-Dashboard im Vollbild und macht das Tablet selbst zum Gerät in FHEM. Über MQTT meldet es Akku und Bewegung, und FHEM kann es sprechen lassen, Töne abspielen, den Bildschirm schalten oder das Dashboard wechseln.
Was es kann
- Akku und Laden. Ladestand, Ladezustand und Temperatur landen als Readings in FHEM.
- Bewegung über die Kamera. Erkennt Bewegung vor dem Tablet und weckt das Display. Kein Bild verlässt das Gerät.
- Sprechen und Töne. FHEM schickt Text, das Tablet spricht ihn. Gespeicherte Sounddateien laufen im Hintergrund.
- Bildschirm steuern. Display an und aus, Helligkeit, Dashboard oder URL wechseln, neu laden, Cache leeren. Alles per MQTT.
- Bis zu drei Dashboards. Benannte Reiter im Menü. Das Standard-Dashboard kommt beim Aufwecken immer wieder.
- Läuft dauerhaft. Ein Vordergrunddienst hält die Verbindung zum Broker und verbindet sich selbst neu. PIN-Schutz für die Einstellungen ist optional.
Installation
- Die App bei F-Droid installieren oder das APK aus den GitHub-Releases auf das Tablet laden.
- App starten. Ohne URL öffnen sich direkt die Einstellungen.
- Dashboard-URL, MQTT-Broker und Geräte-ID eintragen. Das Tablet erscheint danach als Gerät in FHEM.
Dateien von Version 0.4.12
| Datei | Größe | SHA-256 |
|---|---|---|
| FullScreendy-0.4.12-release.apk | 4 MB | 2cf860567c91353ab2c20629eb9b970d60c08feb5845eed79cb50bdf38831291 |
Prüfen unter Linux mit sha256sum Dateiname, unter Windows mit certutil -hashfile Dateiname SHA256. Die Dateien liefert GitHub aus.
Technik und Aufbau
Kotlin, Android-WebView auf Chromium-Basis und ein MQTT-Client in einem Vordergrunddienst. Läuft ab Android 9 und damit auch auf Fire-HD-Tablets mit Fire OS 7. Das APK ist reproduzierbar gebaut: F-Droid baut die App aus dem Quellcode nach und prüft, dass das Ergebnis Bit für Bit dem Release auf GitHub entspricht. Die App installiert selbst keine Updates, sie prüft nur auf eine neue Version und verlinkt sie.
Änderungsverlauf
v0.4.1219.10.2026
Weitere Umsetzung aus der F-Droid-Review, danke an @linsui, @mezinster, @sookoothaii1 und @gitubpatrice.
Das WebView fragt nicht mehr bei Google nach
Android schaltet in jedem WebView standardmäßig Safe Browsing ein: Die gerade aufgerufene Adresse geht dabei an Googles Safe-Browsing-Dienst. Für ein Wandtablet, das ein Dashboard im eigenen Netz zeigt, bringt das nichts und gibt interne Adressen preis. Jetzt ist es aus, über android.webkit.WebView.EnableSafeBrowsing im Manifest und zusätzlich über safeBrowsingEnabled = false am WebView selbst. Dazu kommt android.webkit.WebView.MetricsOptOut, womit auch die WebView-Nutzungsstatistik entfällt.
Nachgemessen auf einem frischen Android 15: Vor der Einrichtung hat die App keine einzige Verbindung offen, danach genau eine, nämlich den Dashboard-Host.
Kleinigkeit
- Store-Beschreibung: Die Zeile „All files access" war seit der SAF-Umstellung in 0.4.10 falsch und beschreibt nun die Ordnerauswahl.
Drei aufeinanderfolgende clean-Builds liefern byte-identische APKs (SHA-256 2cf860567c91353ab2c20629eb9b970d60c08feb5845eed79cb50bdf38831291).
Signiert (CN=FullScreendy), installiert als Update über v0.4.x.
v0.4.1105.10.2026
Weitere Umsetzung aus der F-Droid-Review, danke an @linsui, @mezinster und @gitubpatrice.
Update-Prüfung ist ab Werk aus
Die Über-Seite fragt api.github.com nur noch nach, wenn du „Nach Updates suchen" antippst. Wer es automatisch möchte, schaltet unter Einstellungen → System „Automatisch nach Updates suchen" ein. Im Auslieferungszustand spricht die App damit ausschließlich mit dem Dashboard und dem MQTT-Broker, die du eingerichtet hast.
Weniger Berechtigungen beim Start
Beim ersten Start wird nur noch die Benachrichtigungs-Berechtigung abgefragt, die der Vordergrund-Dienst braucht. Kamera und Mikrofon gehören zu optionalen Funktionen (Bewegungserkennung, Wecken bei Ton, Sprachsteuerung) und werden dort erfragt, wo man sie einschaltet: in den Einstellungen.
Kleinigkeiten
requestLegacyExternalStorageaus dem Manifest entfernt, seit der SAF-Umstellung in 0.4.10 ohne Funktion.- Der README-Abschnitt zu Updates beschrieb noch den in 0.4.9 entfernten In-App-Download.
Zwei aufeinanderfolgende clean-Builds liefern weiterhin byte-identische APKs.
Signiert (CN=FullScreendy), installiert als Update über v0.4.x.
v0.4.1023.09.2026
Umsetzung aus der F-Droid-Review – danke an @linsui und @gitubpatrice für die gründliche Prüfung.
Keine Speicher-Berechtigung mehr
Der Ordner mit den Tondateien wird jetzt unter Einstellungen → Töne über die Android-Ordnerauswahl (Storage Access Framework) freigegeben. Die App bekommt damit genau diesen einen Ordner und sonst nichts — MANAGE_EXTERNAL_STORAGE und READ_EXTERNAL_STORAGE sind vollständig entfallen, im APK steht keine Storage-Berechtigung mehr.
- Abspielen wie gehabt:
cmd/mediaplay ding.mp3, Unterordner mit/ - Ohne Auswahl nutzt die App ihren eigenen Ordner (
Android/data/de.kewl.fullscreendy/files/sounds) - Nach dem Update einmalig den Ordner neu auswählen, wer Töne nutzt
Hinweis an der Dashboard-URL
Die aktuelle URL wird als retained MQTT-Reading veröffentlicht. Am Eingabefeld steht jetzt, dass Zugangsdaten in die Login-Felder gehören und nicht in die URL — dort landeten sie sonst im Klartext beim Broker.
Zwei aufeinanderfolgende clean-Builds liefern weiterhin byte-identische APKs.
Signiert (CN=FullScreendy) – installiert als Update über v0.4.x.
v0.4.920.08.2026
Ein Build für alle Bezugswege. Die App lädt und installiert keine APKs mehr selbst: Die Über-Seite prüft weiterhin auf neue Versionen und verlinkt die Release-Seite – installiert wird über den Browser oder künftig über F-Droid.
Damit entfällt die Berechtigung „Unbekannte Apps installieren" (REQUEST_INSTALL_PACKAGES) vollständig, und es gibt statt zweier Varianten wieder genau ein APK: dasselbe, das F-Droid nachbaut und gegen dieses Release verifiziert.
Zwei aufeinanderfolgende clean-Builds liefern byte-identische APKs – zusammen mit dem in 0.4.8 abgeschalteten dependenciesInfo ist damit die Grundlage für reproduzierbare Builds gelegt.
An den Funktionen der App ändert sich nichts.
Signiert (CN=FullScreendy) – installiert als Update über v0.4.x.
v0.4.820.08.2026
Reines Build-Release, an der App selbst ändert sich nichts gegenüber v0.4.7.
Android Gradle Plugin bettet standardmäßig einen von Google signierten, verschlüsselten Metadatenblock über die verwendeten Abhängigkeiten ins APK. Der sieht bei jedem Build anders aus und macht reproduzierbare Builds unmöglich – mit denen sich nachweisen lässt, dass die veröffentlichte App wirklich aus dem hier liegenden Quellcode entstanden ist. Der Block wird jetzt weggelassen (dependenciesInfo).
Gegenprobe: Zwei aufeinanderfolgende clean-Builds liefern byte-identische APKs.
Welches APK?
- FullScreendy-0.4.8-release.apk – die normale Variante mit In-App-Update. Die willst du.
- FullScreendy-0.4.8-fdroid.apk – dieselbe App ohne Updater und ohne die Berechtigung zum Installieren von Apps. Liegt hier, damit F-Droid den eigenen Build dagegen verifizieren kann.
Beide signiert (CN=FullScreendy) – installieren als Update über v0.4.x.
v0.4.720.08.2026
Kleines Release: PIN-Schutz ist ab Werk aus – auf einem Wandtablet zuhause stört die Abfrage bei jedem Handgriff mehr, als sie nützt. Wer sie will, schaltet sie unter System ein; bestehende Installationen behalten ihre Einstellung.
Der Rest ist Vorbereitung für F-Droid:
- Neue Flavor-Dimension
distribution: github (dieses APK) mit In-App-Update, fdroid ohne Updater und ohneREQUEST_INSTALL_PACKAGES– dort aktualisiert F-Droid. - Ohne
keystore.propertieswird keine Signier-Konfiguration mehr angelegt: Der Build läuft durch und liefert ein unsigniertes APK, statt zu scheitern. - Gradle-Wrapper liegt jetzt im Repo, die Distribution ist über
distributionSha256Sumfestgenagelt;vcsInfobleibt aus dem Release-APK (reproduzierbare Builds). - Rezept in
fdroid/und Fastlane-Metadaten samt Screenshots infastlane/.
Bau-Befehle heißen jetzt assembleGithubRelease bzw. assembleFdroidRelease.
Signiert (CN=FullScreendy) – installiert als Update über v0.4.x.
v0.4.619.08.2026
Stabiles Release – bündelt alles seit v0.4.5.
Mehrere Dashboards (bis zu 3)
- Einstellungen → Dashboards mit Reitern Dashboard 1 / 2 / 3 und „+ Hinzufügen". Je Dashboard: Anzeigename, URL, eigener Login (HTTP Basic Auth) und eigene Zertifikats-Einstellung – so lassen sich auch verschiedene Server mischen.
- Ein Dashboard ist das Standard-Dashboard (Stern): Es wird beim Start und nach jedem Aufwecken des Bildschirms wieder angezeigt.
- Das Seitenmenü listet die Dashboards zum Umschalten auf.
- MQTT: neuer Befehl
cmd/dashboard(1–3oder Name, Aliasdb) sowie die ReadingsdashboardunddashboardName. - Bestehende Einstellungen aus 0.4.5 werden automatisch zu Dashboard 1 migriert.
Behoben: Pull-to-Refresh löste beim Hochscrollen aus
Beim Scrollen nach oben lud die Seite neu, sobald der Seitenanfang erreicht war. Jetzt wird beim Aufsetzen des Fingers einmal entschieden: Hochscrollen stoppt oben, und erst ein neu begonnener Zug von oben nach unten lädt neu – mit längerem Zieh-Weg, damit es nicht aus Versehen passiert. (Danke @schwatter für den Hinweis, #1)
Sprachsteuerung im Dashboard (#1)
Die WebView lehnte bisher jede getUserMedia()-Anfrage still ab (NotAllowedError) – die Android-Berechtigung allein genügt dafür nicht.
- Neue Karte Einstellungen → Verhalten → Mikrofon mit einer Auswahl: Nichts / Wecken bei Ton / Sprachsteuerung im Dashboard. Bewusst eine Auswahl statt zweier Schalter – das Mikrofon kann immer nur einen Nutzer bedienen.
- Fehlende Mikrofon-Berechtigung lässt sich direkt dort anfordern; läuft das Dashboard über
http://, wird gewarnt (ohne Secure Context gibt es gar keingetUserMedia). - JS-Brücke: Die Android-WebView hat kein
speechSynthesis. Dashboard-Seiten können die Sprachausgabe deshalb direkt anfordern:
fullscreendy.textToSpeech("Der Keller ist zu kalt");
fullscreendy.stopSpeech();- In
tools/liegen ein Patch für das FHEM-Wiki-Skript VoiceControl: Web-STT undwebcheck.js, ein Diagnose-Panel für FHEMWEB.
Bedienung
- PIN-Schutz abschaltbar (System): Einstellungen ohne PIN-Abfrage.
- Einstellungen neu sortiert: Dashboards zuerst, Verbindung enthält nur noch MQTT/Topics.
- Modernere Menüs: Karten, Icon-Zeilen, Seitenmenü mit MQTT-Status und Gruppen, Titelleiste mit Zurück-Pfeil.
- Über-Seite neu: App-Icon, App-/Android-Version, IP und Geräte-ID, Update-Download mit Prozent-Fortschritt sowie Links zu Stern auf GitHub, Quellcode und Projekt unterstützen.
Signiert (CN=FullScreendy) – installiert als Update über v0.4.x.
v0.4.521.07.2026
Stabiles Release – bündelt alle Verbesserungen seit v0.4.3.
Dauerbetrieb & Diagnose
- Behebt den
LOW_MEMORY-Tod (App morgens da, abends „nicht aufweckbar"):largeHeap, WebView-Speicher wird bei Druck freigegeben, periodischer Dashboard-Reload (Standard 6 h), Kamera-Analyse mit kleiner Auflösung. - UI-Auto-Wiederherstellung nach einem Kill (Berechtigung „Über anderen Apps anzeigen").
- specialUse-Foreground-Service statt
dataSync(Android-15-Timeout umgangen) + optionale Akku-Optimierungs-Ausnahme. - Diagnose: MQTT-Reading
lastExit+ Log mit Speicher-Trend.
Neue Funktionen
- Android 9 (API 28): läuft jetzt auch auf Android 9 / Fire OS 7 / Fire HD (minSdk 29 → 28).
- Dashboard-Login: optionale Benutzer/Passwort-Felder (HTTP Basic Auth, z. B. FHEM
basicAuth) – keinuser:pass@in der URL mehr nötig. - Selbst-signierte HTTPS-Zertifikate zulassen (für lokales FHEM-HTTPS), standardmäßig aus.
- In-App-Update: Prüfen/Herunterladen/Installieren direkt über die Über-Seite.
Bedienung & Fehlerbehebungen
- Auto-Speichern der Einstellungen (kein Speichern-Button mehr).
- Aufwecken ohne Android-Wischcode und ohne weißen Blitz / Hintergrundbild.
- Getrennte Zeiten für Abdunkeln und Bildschirm ausschalten.
- Berechtigungs-Buttons mit Live-Status (✓); grüner MQTT-Punkt entfernt.
Signiert (CN=FullScreendy). Ab v0.3.2 andere Signatur als frühere Debug-Builds → ggf. alte Version vorher deinstallieren.
Häufige Fragen
- Brauche ich FHEM?
- Fürs Dashboard reicht jede Webseite. Die Anbindung als Gerät läuft über MQTT und ist auf FHEM zugeschnitten.
- Läuft es auf Amazon Fire HD?
- Ja, ab Fire OS 7. Das entspricht Android 9.


