In meinem Esszimmer hängt ein Samsung Galaxy Tab A11+ an der Wand. Darauf läuft der Fully Kiosk Browser mit einem einzigen Home-Assistant-Dashboard, das sich über den Tag verändert. Morgens zeigt es Termine und Wetter, tagsüber Strom und Geräte, abends Abendessen und Musik. Nachts bleibt nur noch eine dunkle Uhr.
Die Oberfläche ist eine einzige Custom Card, die ich selbst geschrieben habe. Sie ist auf mein Haus zugeschnitten, deshalb gibt es sie nicht zum Download. Was du hier bekommst, ist alles drumherum zum Nachbauen: Tablet, Fully Kiosk, die Integration in Home Assistant, ein eigener Benutzer, die Tageszeiten als Helfer, Helligkeit und Bildschirm per Automation und eine kleine Start-Card, die du Schritt für Schritt zu deiner eigenen ausbauen kannst. Alle Bilder stammen aus einem Demo-Modus mit einer erfundenen Familie.

Was du brauchst
Viel ist es eigentlich nicht. Das hier setze ich ein:
- Tablet: Samsung Galaxy Tab A11+ Enterprise Edition, 128 GB, Wi-Fi. Die Enterprise Edition ist dieselbe Hardware (SM-X230) wie das normale Wi-Fi-Modell, dazu kommt ein Knox-Paket. Samsung nennt für das Wi-Fi-Modell mit 128 GB eine UVP von 279 € (Pressemitteilung vom 18.11.2025). Der Preis der Enterprise Edition kann davon abweichen.
- Wandhalterung: Wandhalterung zum Einschieben für Galaxy Tab A9+ und A11+, weiß, mit Kabelführung. Achte bei jeder Halterung darauf, dass Frontkamera und Lautsprecher frei bleiben. Die Kamera brauchst du für die Bewegungserkennung.
- Kabel: Fasgear USB-C auf USB-C, 90 Grad gewinkelt, 3 m, weiß. Der gewinkelte Stecker liegt flach an der Wand an, dazu kommt ein USB-C-Netzteil mit 15 bis 25 W.
- Fully Kiosk Browser PLUS: die App aus dem Play Store, die PLUS-Lizenz gibt es beim Hersteller für 8,90 € einmalig pro Gerät (Stand 24.10.2026). Kiosk-Modus und Fernverwaltung, die Home Assistant braucht, sind PLUS-Funktionen.
- Home Assistant mit Zugriff auf die Konfigurationsdateien. Ich nutze dafür die App „File editor“ unter Home Assistant OS.
- Optional ein Bewegungsmelder im Raum, falls die Tablet-Kamera im Dunkeln niemanden erkennt.
Schritt 1: Tablet an die Wand und an den Strom
Montiere die Halterung quer an die Wand und führe das Kabel durch die Kabelführung nach unten. Bei mir kommt noch ein schmaler Kabelkanal dazu, weil hinter dem Tablet leider kein Stromanschluss liegt. Das Tablet bleibt dauerhaft am Strom. Bietet dein Tablet in den Akku-Einstellungen einen Akkuschutz mit Ladegrenze an, schalte ihn ein.
Richte Android ganz normal ein und verbinde das Tablet mit dem WLAN, in dem auch dein Home Assistant läuft. Gib dem Tablet im Router eine feste IP-Adresse, die brauchst du in Schritt 3.
Schritt 2: Fully Kiosk installieren und die Fernverwaltung einschalten
Hier stellst du ein paar Dinge in Fully ein, damit Home Assistant das Tablet später steuern kann.
- Installiere Fully Kiosk Browser aus dem Play Store und kaufe die PLUS-Lizenz für dieses Gerät.
- Öffne in Fully die Einstellungen (vom linken Rand wischen, dann „Settings“). Die Menüs sind auf Englisch.
- Unter Remote Administration (PLUS) schaltest du „Enable Remote Administration“ und „Remote Admin from Local Network“ ein. Vergib ein „Remote Admin Password“. Mit diesem Passwort meldet sich gleich Home Assistant an.
- Unter Device Management schaltest du „Launch on Boot“ und „Keep in Foreground“ ein. So startet Fully nach jedem Neustart von selbst und holt sich nach einem Systemdialog zurück nach vorn.
- Unter Motion Detection schaltest du „Enable Visual Motion Detection“, „Turn Screen On on Motion“ und „Stop Screensaver on Motion“ ein. Die „Motion Sensitivity“ steht ab Werk auf 30, das reagiert kaum auf eine Person vor dem Tablet. Fully selbst empfiehlt 90 bis 95, ich nutze 92. Erlaube Fully den Zugriff auf die Kamera, wenn Android danach fragt.
- Unter Web Auto Reload schaltest du „Reload on Internet Connection“ ein und setzt „Reload on Page Error“ auf 15 Sekunden. Nach einem WLAN-Aussetzer lädt die Seite dann von selbst neu.
Den Kiosk-Modus schaltest du erst in Schritt 13 ein, sonst sperrst du dich beim Einrichten selbst aus.
Schritt 3: Fully Kiosk in Home Assistant einbinden
Geh in Home Assistant auf Einstellungen → Geräte & Dienste → Integration hinzufügen und such nach Fully Kiosk Browser. Trag die IP-Adresse des Tablets und das Remote-Admin-Passwort aus Schritt 2 ein.
Danach hast du ein Gerät mit vielen Entitäten. Bei mir heißt das Gerät „Galaxy Tab A11+“, deshalb beginnen alle IDs mit galaxy_tab_a11. Bei dir steht dort der Name deines Tablets. Diese Entitäten nutze ich in den Automationen weiter unten:
number.galaxy_tab_a11_bildschirmhelligkeit: Helligkeit von 0 bis 255number.galaxy_tab_a11_bildschirm_aus_timer: nach wie vielen Sekunden ohne Bewegung der Bildschirm ausgehtswitch.galaxy_tab_a11_bildschirm: Bildschirm an oder ausswitch.galaxy_tab_a11_kiosk_sperre: Kiosk-Modus an oder ausswitch.galaxy_tab_a11_bewegungserkennung: die Kamera-Bewegungserkennung von Fullybutton.galaxy_tab_a11_bewegungsaktivitat_auslosen: meldet Fully eine Bewegung wie von der Kamera und weckt damit den Bildschirmbutton.galaxy_tab_a11_start_url_laden: lädt die Start-URL neu, praktisch nach jeder Änderung an der Cardbutton.galaxy_tab_a11_browser_neu_starten: startet Fully neu
Schau unter Einstellungen → Geräte & Dienste → Fully Kiosk Browser nach, wie deine IDs heißen. Ersetze dann galaxy_tab_a11 in allen Blöcken unten durch deinen Namen.
Schritt 4: Ein eigener Benutzer für das Tablet
Das Tablet bekommt einen eigenen Benutzer ohne Adminrechte, der nur im Heimnetz funktioniert. Wer am Tablet steht, kommt damit nicht in deine Einstellungen.
- Einstellungen → Personen → Person hinzufügen.
- Als Namen nimmst du zum Beispiel „Wandtablet“ und schaltest „Anmeldung erlauben“ ein.
- Vergib Benutzernamen und Passwort. Schalte „Nur lokaler Zugriff“ ein und lass „Administrator“ aus.
Öffne Home Assistant einmal in Fully, melde dich mit diesem Benutzer an und setz den Haken bei „Angemeldet bleiben“. Lichter schalten und Skripte starten kann auch ein Benutzer ohne Adminrechte.
Schritt 5: Packages einschalten
Alles, was zum Tablet gehört, lege ich in eigene Dateien im Ordner packages. Jeder Block unten ist eine eigene Datei. So kommen sich mehrere Schlüssel wie automation: oder template: nicht in die Quere.
Leg im Ordner /config einen Ordner packages an und trag in deine configuration.yaml diese Zeilen ein. Gibt es dort schon einen Abschnitt homeassistant:, ergänzt du nur die Zeile packages: darin.
homeassistant:
packages: !include_dir_named packagesPrüf danach unter Einstellungen → Werkzeuge → YAML mit „Konfiguration prüfen“ und starte Home Assistant einmal neu. Bei späteren Änderungen an den Paketen reicht meistens der passende Eintrag unter „YAML-Konfiguration neu laden“, etwa „Template-Entitäten“, „Automationen“ oder „Skripte“.
Schritt 6: Die Tageszeit als Helfer
Das ganze Dashboard hängt an einem einzigen Sensor: sensor.esszimmer_phase. Er kennt vier Werte. Bis 10 Uhr ist morgen, bis 17 Uhr tag, bis 23 Uhr abend, danach bis 5 Uhr nacht. Dazu kommt ein Schalter für den Nachtmodus. Steht er auf an, ist sofort nacht, egal wie spät es ist. Das Skript „Gute Nacht“ aus Schritt 9 schaltet ihn ein, eine Automation schaltet ihn morgens um 5 Uhr wieder aus.
Speichere den Block als /config/packages/esszimmer_phase.yaml:
1input_boolean:
2 esszimmer_nacht:
3 name: Esszimmer Nachtmodus
4 icon: mdi:weather-night
5
6template:
7 - sensor:
8 - name: Esszimmer Phase
9 unique_id: esszimmer_phase
10 icon: mdi:clock-outline
11 state: >
12 {% set h = now().hour %}
13 {% if h < 5 or h >= 23 or is_state('input_boolean.esszimmer_nacht', 'on') %}
14 nacht
15 {% elif h < 10 %}
16 morgen
17 {% elif h < 17 %}
18 tag
19 {% else %}
20 abend
21 {% endif %}
22
23automation:
24 - id: esszimmer_nacht_ende
25 alias: Esszimmer Nachtmodus morgens beenden
26 mode: single
27 triggers:
28 - trigger: time
29 at: "05:00:00"
30 - trigger: homeassistant
31 event: start
32 conditions:
33 - condition: time
34 after: "05:00:00"
35 before: "20:00:00"
36 - condition: state
37 entity_id: input_boolean.esszimmer_nacht
38 state: "on"
39 actions:
40 - action: input_boolean.turn_off
41 target:
42 entity_id: input_boolean.esszimmer_nachtDer zweite Auslöser beim Start von Home Assistant fängt den Fall ab, dass der Server um 5 Uhr gerade neu gestartet hat. Die Bedingung bis 20 Uhr sorgt dafür, dass ein Neustart am Abend den Nachtmodus nicht wieder ausschaltet. Unter Einstellungen → Werkzeuge → Template siehst du mit {{ states('sensor.esszimmer_phase') }} sofort, welche Phase gerade gilt.
So sieht das bei mir aus. Am Abend zeigt die Jetzt-Ansicht statt der Tagestermine das Abendessen und schon die Termine von morgen:

Nachts bleibt nur eine dunkle Uhr mit dem Wecker für morgen und einer Zeitleiste des nächsten Tages:

Schritt 7: Helligkeit und Bildschirm-Timer nach Tageszeit
Diese Automation setzt bei jedem Phasenwechsel die Helligkeit: 178 von 255 am Morgen und am Tag, 115 am Abend, 31 in der Nacht. Damit es nicht abrupt hell oder dunkel wird, fährt sie die Helligkeit in zwölf Schritten über zwei Minuten an. Dazu geht der Bildschirm nachts schon nach 45 Sekunden ohne Bewegung aus, tagsüber nach drei Minuten.
Speichere den Block als /config/packages/esszimmer_tablet_helligkeit.yaml:
1automation:
2 - id: esszimmer_phase_tablet
3 alias: Esszimmer Tablet Helligkeit nach Tageszeit
4 mode: restart
5 triggers:
6 - trigger: state
7 entity_id: sensor.esszimmer_phase
8 id: phase
9 - trigger: homeassistant
10 event: start
11 id: start
12 - trigger: state
13 entity_id: switch.galaxy_tab_a11_bildschirm
14 to: "on"
15 id: screen
16 conditions:
17 - condition: template
18 value_template: "{{ states('sensor.esszimmer_phase') in ['morgen', 'tag', 'abend', 'nacht'] }}"
19 actions:
20 - variables:
21 phase: "{{ states('sensor.esszimmer_phase') }}"
22 goal: "{{ {'morgen': 178, 'tag': 178, 'abend': 115, 'nacht': 31}[phase] }}"
23 level: "{{ states('number.galaxy_tab_a11_bildschirmhelligkeit') | int(goal) }}"
24 - action: number.set_value
25 continue_on_error: true
26 target:
27 entity_id: number.galaxy_tab_a11_bildschirm_aus_timer
28 data:
29 value: "{{ 45 if phase == 'nacht' else 180 }}"
30 - if:
31 - condition: template
32 value_template: "{{ trigger.id == 'phase' and (goal - level) | abs > 10 }}"
33 then:
34 - repeat:
35 count: 12
36 sequence:
37 - action: number.set_value
38 target:
39 entity_id: number.galaxy_tab_a11_bildschirmhelligkeit
40 data:
41 value: "{{ (level + (goal - level) * repeat.index / 12) | float(0) | round(0) | int }}"
42 - delay:
43 seconds: 10
44 else:
45 - action: number.set_value
46 target:
47 entity_id: number.galaxy_tab_a11_bildschirmhelligkeit
48 data:
49 value: "{{ goal }}"Ein paar Details dazu:
mode: restartbricht eine laufende Rampe ab, wenn innerhalb der zwei Minuten schon der nächste Phasenwechsel kommt. Das passiert etwa, wenn du den Nachtmodus von Hand ein- und gleich wieder ausschaltest. Die Rampe läuft dann direkt auf den neuen Zielwert.- Beim Start von Home Assistant und jedes Mal, wenn der Bildschirm angeht, setzt die Automation die Helligkeit direkt ohne Rampe. So stimmt sie auch nach einem Neustart des Tablets.
continue_on_erroram Timer sorgt dafür, dass die Helligkeit auch dann gesetzt wird, wenn das Tablet in dem Moment kurz nicht erreichbar war.
Schritt 8: Bildschirm bei Bewegung wecken
Die Kamera-Bewegungserkennung aus Schritt 2 weckt den Bildschirm, sobald jemand vor dem Tablet steht. Im dunklen Raum sieht die Kamera allerdings wenig. Hast du einen Bewegungsmelder im Raum, kann er das Tablet zusätzlich wecken. Ersetze binary_sensor.bewegung_esszimmer durch deinen Bewegungsmelder.
Speichere den Block als /config/packages/esszimmer_tablet_wecken.yaml:
1automation:
2 - id: esszimmer_tablet_wecken
3 alias: Esszimmer Tablet bei Bewegung wecken
4 mode: single
5 max_exceeded: silent
6 triggers:
7 - trigger: state
8 entity_id: binary_sensor.bewegung_esszimmer
9 to: "on"
10 conditions:
11 - condition: numeric_state
12 entity_id: zone.home
13 above: 0
14 actions:
15 - action: button.press
16 target:
17 entity_id: button.galaxy_tab_a11_bewegungsaktivitat_auslosenDie Bedingung auf zone.home prüft, ob mindestens eine Person zu Hause ist. Wenn niemand da ist, bleibt der Bildschirm aus, auch wenn die Katze durchs Zimmer läuft.
Schritt 9: Das Skript „Gute Nacht“
Ein Druck auf „Gute Nacht“ lässt bei mir die Rollos runter, schaltet das Licht aus und schließt die Garage. Damit das Skript nicht jede Lampe einzeln kennen muss, arbeite ich mit Labels.
- Geh auf Einstellungen → Bereiche, Labels & Zonen → Labels → Label erstellen und leg die Labels „Hauslicht“ und „Rollos“ an.
- Gib allen Lampen, die abends ausgehen sollen, das Label „Hauslicht“. Die Rollos bekommen „Rollos“.
- Ersetze
cover.garagentordurch dein Garagentor oder lösch die letzte Aktion, wenn du keins hast.
Speichere den Block als /config/packages/esszimmer_gute_nacht.yaml:
1script:
2 esszimmer_gute_nacht:
3 alias: Gute Nacht
4 icon: mdi:weather-night
5 mode: single
6 sequence:
7 - action: cover.close_cover
8 continue_on_error: true
9 target:
10 label_id: rollos
11 - action: light.turn_off
12 target:
13 label_id: hauslicht
14 - action: input_boolean.turn_on
15 target:
16 entity_id: input_boolean.esszimmer_nacht
17 - action: cover.close_cover
18 continue_on_error: true
19 target:
20 entity_id: cover.garagentor
21
22template:
23 - sensor:
24 - name: Esszimmer Hauslicht an
25 unique_id: esszimmer_hauslicht_an
26 icon: mdi:lightbulb-group
27 state: "{{ label_entities('hauslicht') | select('is_state', 'on') | list | count }}"Der Sensor sensor.esszimmer_hauslicht_an zählt, wie viele Lampen mit dem Label gerade an sind. Meine eigene Card zeigt damit nachts einen Hinweis, wenn noch irgendwo Licht brennt. Die Start-Card aus Schritt 10 liest den Sensor allerdings nicht, er steht dir für deine eigene Card bereit. Das Skript setzt den Nachtmodus aus Schritt 6. Ab dann gilt sofort die Phase nacht und die Helligkeit aus Schritt 7 fährt herunter.
Schritt 10: Die Card in den www-Ordner
Eine eigene Card ist eine JavaScript-Datei. Home Assistant liefert alles aus /config/www unter der Adresse /local aus. Einen Marketplace (früher HACS) brauchst du dafür nicht, die Datei liegt einfach im Ordner. Installiere unter Einstellungen → Apps → App-Store die App File editor, starte sie und leg den Ordner /config/www/wandtablet an. Gab es den Ordner www vorher noch nicht, starte Home Assistant danach einmal neu, sonst findet er /local nicht.
Leg darin die Datei wandtablet-card.js mit diesem Inhalt an. Das ist eine kleine Start-Card und nicht meine komplette Card. Sie zeigt Uhr, Datum, ein paar Licht-Kacheln und einen Knopf für „Gute Nacht“. Sie färbt sich nach der Tageszeit und legt sich als Vollbild über die Home-Assistant-Oberfläche. Nachts bleibt nur die Uhr.
1// wandtablet-card.js: starter card for a wall tablet, one full-screen view.
2// Config: phase (sensor with morgen/tag/abend/nacht), lights (entity IDs to toggle),
3// scripts (script entity IDs to run).
4
5const PHASES = {
6 morgen: { bg: "#f7f3ea", fg: "#1c1b19", muted: "#6b675f", on: "#e0603f" },
7 tag: { bg: "#ffffff", fg: "#1c1b19", muted: "#6b675f", on: "#e0603f" },
8 abend: { bg: "#f1e9dc", fg: "#1c1b19", muted: "#6b675f", on: "#c8553d" },
9 nacht: { bg: "#0a0a0a", fg: "#8c8a85", muted: "#55534f", on: "#a04a35" },
10};
11
12// Escape every value that comes from Home Assistant before it goes into HTML.
13const esc = (value) =>
14 String(value ?? "").replace(/[&<>"']/g, (c) =>
15 ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]
16 );
17
18class WandtabletCard extends HTMLElement {
19 setConfig(config) {
20 this._config = { phase: "sensor.esszimmer_phase", lights: [], scripts: [], ...config };
21 }
22
23 set hass(hass) {
24 this._hass = hass;
25 this._render();
26 }
27
28 connectedCallback() {
29 // Re-render every 15 seconds so the clock moves without state changes.
30 this._timer = setInterval(() => this._render(), 15000);
31 this._render();
32 }
33
34 disconnectedCallback() {
35 clearInterval(this._timer);
36 this._removeOverlay();
37 }
38
39 getCardSize() {
40 return 1;
41 }
42
43 static getStubConfig() {
44 return { phase: "sensor.esszimmer_phase", lights: [], scripts: [] };
45 }
46
47 _isEditing() {
48 // Open the dashboard with ?edit=1 to reach the editor behind the overlay.
49 return new URLSearchParams(window.location.search).has("edit");
50 }
51
52 _ensureOverlay() {
53 if (this._overlay) return;
54 this._overlay = document.createElement("div");
55 this._overlay.style.cssText = "position:fixed;inset:0;z-index:10000;";
56 this._overlay.addEventListener("click", (ev) => this._onClick(ev));
57 document.body.appendChild(this._overlay);
58 }
59
60 _removeOverlay() {
61 this._overlay?.remove();
62 this._overlay = null;
63 this._last = null;
64 }
65
66 _onClick(ev) {
67 const run = ev.target.closest("[data-script]");
68 if (run && this._hass) {
69 this._hass.callService("script", "turn_on", { entity_id: run.dataset.script });
70 return;
71 }
72 const tile = ev.target.closest("[data-entity]");
73 if (!tile || !this._hass) return;
74 this._hass.callService("homeassistant", "toggle", { entity_id: tile.dataset.entity });
75 }
76
77 _render() {
78 if (!this._hass || !this._config || !this.isConnected) return;
79
80 if (this._isEditing()) {
81 this._removeOverlay();
82 this.innerHTML =
83 '<ha-card style="padding:16px">Wandtablet-Card: Vollbild im Bearbeiten-Modus ausgeblendet.</ha-card>';
84 return;
85 }
86 this.innerHTML = "";
87 this._ensureOverlay();
88
89 const hass = this._hass;
90 const phase = hass.states[this._config.phase]?.state ?? "tag";
91 const c = PHASES[phase] ?? PHASES.tag;
92 const now = new Date();
93 const time = now.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" });
94 const date = now.toLocaleDateString("de-DE", { weekday: "long", day: "numeric", month: "long" });
95
96 const tiles =
97 phase === "nacht"
98 ? ""
99 : this._config.lights
100 .map((id) => {
101 const st = hass.states[id];
102 if (!st) return "";
103 const on = st.state === "on";
104 const name = st.attributes.friendly_name ?? id;
105 return `<button class="tile${on ? " on" : ""}" data-entity="${esc(id)}">
106 <span class="state">${on ? "an" : "aus"}</span>
107 <span class="name">${esc(name)}</span>
108 </button>`;
109 })
110 .join("");
111
112 const scriptTiles =
113 phase === "nacht"
114 ? ""
115 : this._config.scripts
116 .map((id) => {
117 const st = hass.states[id];
118 if (!st) return "";
119 const name = st.attributes.friendly_name ?? id;
120 return `<button class="tile" data-script="${esc(id)}">
121 <span class="state">Skript</span>
122 <span class="name">${esc(name)}</span>
123 </button>`;
124 })
125 .join("");
126
127 const html = `
128 <style>
129 .wrap { box-sizing: border-box; height: 100%; padding: 4vw; display: flex;
130 flex-direction: column; justify-content: space-between;
131 background: ${c.bg}; color: ${c.fg}; font-family: system-ui, sans-serif; }
132 .time { font-size: 22vw; line-height: 0.9; font-weight: 300; letter-spacing: -0.02em; }
133 .date { font-size: 2.6vw; color: ${c.muted}; margin-top: 1.5vw; }
134 .tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(16vw, 1fr)); gap: 1.5vw; }
135 .tile { all: unset; cursor: pointer; padding: 1.6vw; border-radius: 10px;
136 border: 1px solid ${c.muted}; display: flex; flex-direction: column; gap: 1.2vw; }
137 .tile .state { font-size: 1.4vw; color: ${c.muted}; }
138 .tile .name { font-size: 2vw; }
139 .tile.on { border-color: ${c.on}; }
140 .tile.on .state { color: ${c.on}; }
141 </style>
142 <div class="wrap">
143 <div>
144 <div class="time">${esc(time)}</div>
145 <div class="date">${esc(date)}</div>
146 </div>
147 <div class="tiles">${tiles}${scriptTiles}</div>
148 </div>`;
149
150 // Only touch the DOM when something visible changed.
151 if (html === this._last) return;
152 this._last = html;
153 this._overlay.innerHTML = html;
154 }
155}
156
157if (!customElements.get("wandtablet-card")) {
158 customElements.define("wandtablet-card", WandtabletCard);
159}
160window.customCards = window.customCards || [];
161window.customCards.push({
162 type: "wandtablet-card",
163 name: "Wandtablet",
164 description: "Vollbild-Ansicht für ein Wandtablet",
165});Schritt 11: Die Card als Ressource eintragen
Damit Home Assistant die Datei lädt, trägst du sie als Ressource ein. Öffne die Seite /config/lovelace/resources deiner Home-Assistant-Adresse. Du kommst auch über ein beliebiges Dashboard hin: Stift oben rechts, dann „Dashboard-Menü öffnen“ und „Ressourcen verwalten“.
- Klick auf Ressource hinzufügen.
- Als URL trägst du
/local/wandtablet/wandtablet-card.js?v=1ein. - Als Ressourcen-Typ wählst du JavaScript-Modul und klickst auf Erstellen.
Das ?v=1 ist wichtig. Browser und Fully halten Dateien aus /local lange im Cache. Nach jeder Änderung an der Card zählst du die Zahl hoch, also auf ?v=2, danach ?v=3. Erst dann holt sich das Tablet die neue Fassung.
Schritt 12: Das Dashboard anlegen
- Einstellungen → Dashboards → Dashboard hinzufügen → Neues Dashboard von Grund auf.
- Titel „Esszimmer“, als URL
esszimmer-tablet. Die URL muss einen Bindestrich enthalten. - „Nur für Administratoren“ bleibt aus, sonst sieht der Tablet-Benutzer das Dashboard nicht. „Zur Seitenleiste hinzufügen“ kannst du ausschalten, das Dashboard ist nur fürs Tablet.
- Klick auf Erstellen und öffne das neue Dashboard. Häng in der Adresszeile
?edit=1an die Adresse und lade die Seite neu. Das ist wichtig: Sobald die Card gespeichert ist, legt sie sich als Vollbild über alles, auch über den Knopf Fertig. Mit?edit=1bleibt sie eine kleine graue Karte. - Stift oben rechts, dann „Dashboard-Menü öffnen“ und Raw-Konfigurationseditor. Ersetze den Inhalt durch diesen Block. Trag unter
lightsdeine eigenen Lampen ein. Unterscriptssteht das Skript „Gute Nacht“ aus Schritt 9, es wird zu einem eigenen Knopf:
1title: Esszimmer
2views:
3 - title: Jetzt
4 path: jetzt
5 panel: true
6 cards:
7 - type: custom:wandtablet-card
8 phase: sensor.esszimmer_phase
9 lights:
10 - light.esszimmer
11 - light.wohnzimmer_decke
12 - light.stehlampe
13 scripts:
14 - script.esszimmer_gute_nacht- Speichern, dann Fertig.
- Nimm
?edit=1wieder aus der Adresse und lade neu. Jetzt siehst du die Card im Vollbild.
panel: true ist das Layout „Panel (einzelne Karte)“: Die Card bekommt die ganze Fläche. Weil sie sich als Vollbild über alles legt, siehst du danach weder Kopfzeile noch Seitenleiste. Willst du das Dashboard wieder bearbeiten, öffnest du es am Rechner mit ?edit=1 hinter der Adresse, also /esszimmer-tablet/jetzt?edit=1. Dann blendet die Card das Vollbild aus.
Schritt 13: Fully auf das Dashboard zeigen und das Tablet sperren
Jetzt bekommt Fully seine Start-URL. Zurück in den Fully-Einstellungen auf dem Tablet:
- Unter Web Content Settings setzt du die „Start URL“ auf die Adresse des Dashboards, zum Beispiel
http://homeassistant.local:8123/esszimmer-tablet/jetzt. Löst das Tablethomeassistant.localnicht auf, nimm die IP-Adresse deines Home Assistant. - In der „URL Whitelist“ trägst du
http://homeassistant.local:8123*ein (oder die Variante mit IP). Fully öffnet dann nur noch Seiten deines Home Assistant. - Lade die Start-URL, melde dich mit dem Tablet-Benutzer aus Schritt 4 an und setz „Angemeldet bleiben“.
- Unter Kiosk Mode (PLUS) schaltest du „Enable Kiosk Mode“ ein und vergibst eine PIN. Ab jetzt kommt niemand mehr aus Fully heraus, der die PIN nicht kennt.
Den Kiosk-Modus kannst du danach auch aus Home Assistant schalten, über switch.galaxy_tab_a11_kiosk_sperre. Das ist praktisch, wenn du ein Android-Update installieren willst: Sperre aus, Update, Sperre wieder an.
Alle Einstellungen aus Schritt 2 und 13 lassen sich auch aus Home Assistant setzen, ohne das Tablet in die Hand zu nehmen. Unter Einstellungen → Werkzeuge → Aktionen wählst du die Aktion fully_kiosk.set_config, dein Tablet als Gerät und trägst Schlüssel und Wert ein:
| Fully-Einstellung | Schlüssel | Wert |
|---|---|---|
| Start URL | startURL | Adresse des Dashboards |
| URL Whitelist | urlWhitelist | http://homeassistant.local:8123* |
| Enable Visual Motion Detection | motionDetection | true |
| Motion Sensitivity | motionSensitivity | 92 |
| Turn Screen On on Motion | screenOnOnMotion | true |
| Stop Screensaver on Motion | stopScreensaverOnMotion | true |
| Reload on Internet Connection | reloadOnInternet | true |
| Reload on Page Error | reloadPageFailure | 15 |
| Launch on Boot | launchOnBoot | true |
| Keep in Foreground | runInForeground | true |
Danach drückst du button.galaxy_tab_a11_start_url_laden und das Tablet zeigt dein Dashboard.
Schritt 14: Die Card weiter ausbauen
Ab hier ist es deine Card. Alles, was du auf den Bildern siehst, folgt demselben Muster wie die Start-Card: Zustände aus hass.states lesen und Aktionen mit hass.callService auslösen, etwa cover.open_cover für ein Rollo oder script.turn_on für eine Szene. Meine Datei hat inzwischen 4.371 Zeilen, tatsächlich steckt hinter dem meisten davon nichts anderes als Zustände anzeigen und auf Knöpfe reagieren. Zur Anregung, was bei mir alles drinsteckt:
Ein Tipp auf freie Fläche holt nachts die Bedienelemente zurück, damit du Licht oder Rollos schalten kannst. Ist der Bildschirm gerade aus, weckt ihn der erste Tipp, deshalb tippe ich zweimal. Bleibt das Tablet drei Minuten unberührt, kehrt es in die Nachtansicht zurück:

Der Reiter Wohnzimmer bündelt Licht, Rollos, Stimmungen und den Fernseher:

Der Reiter Musik steuert Sender, Playlists und die Lautstärke pro Raum:

Der Reiter Kamera zeigt alle Kameras mit den erkannten Ereignissen des Tages, ein Tipp öffnet das Livebild:


Klingelt es, legt sich das Kamerabild über alles, mit Knöpfen für Vollbild und Haustürlicht. Nach kurzer Zeit schließt es sich von selbst, der Hinweis im Kopf bleibt stehen, falls du das Klingeln verpasst hast:

Das Wettersymbol im Kopf öffnet die Wetterseite mit den nächsten 24 Stunden, Warnungen und den nächsten Tagen. Ein Tipp auf einen Tag zeigt seinen Verlauf:


Aus der Energieleiste unten öffnet sich ein Fenster mit dem Solarertrag der letzten sieben Tage:

Und an Geburtstagen steht der Name unter dem Datum, dazu fällt ein wenig Konfetti:

Dazu kommen bei mir Durchsagen im ganzen Haus. Ich tippe auf das Mikrofon, wähle die Räume aus und halte den Knopf zum Sprechen gedrückt. In den gewählten Räumen läuft die Aufnahme mit einem Jingle davor. Eine laufende Wiedergabe setzt danach einfach fort.
Tipps und Troubleshooting
Die Card ändert sich nicht
Die alte Fassung liegt noch im Cache. Zähl in der Ressource ?v= hoch und drück danach button.galaxy_tab_a11_start_url_laden.
Fully zeigt eine leere oder blockierte Seite
Prüf die URL Whitelist. Ohne passenden Eintrag blockiert Fully die Seite.
Du kommst nicht mehr an die Einstellungen
Mit der PIN aus Schritt 13 verlässt du den Kiosk-Modus am Tablet. Alternativ schaltest du switch.galaxy_tab_a11_kiosk_sperre in Home Assistant aus.
Der Bildschirm geht nicht an, wenn du davorstehst
Prüf, ob Fully die Kamera nutzen darf und ob switch.galaxy_tab_a11_bewegungserkennung an ist. Steht die Empfindlichkeit noch auf 30, setz sie auf 90 bis 95. Im Dunkeln hilft die Automation aus Schritt 8.
Die Helligkeit springt nach einem Neustart
Der Auslöser auf switch.galaxy_tab_a11_bildschirm setzt sie jedes Mal neu, wenn der Bildschirm angeht. Prüf, ob die ID zu deinem Tablet passt.
Nach einem Neustart von Home Assistant hängt das Tablet auf einer Fehlerseite
„Reload on Page Error“ aus Schritt 2 lädt die Seite nach 15 Sekunden neu. Hilft das nicht, drück button.galaxy_tab_a11_browser_neu_starten.
Du willst das Dashboard bearbeiten
Öffne es am Rechner mit ?edit=1 hinter der Adresse. Am Tablet selbst bleibt das Vollbild immer an.
Die Phase stimmt nicht
Schau unter Einstellungen → Werkzeuge → Template nach {{ states('sensor.esszimmer_phase') }} und {{ states('input_boolean.esszimmer_nacht') }}. Hängt der Nachtmodus tagsüber auf an, hat die Automation um 5 Uhr nicht gegriffen.
Zeig mir dein Setup
Hängt bei dir auch ein Wandtablet oder ein anderes Display, mit dem du Home Assistant schaltest? Schreib mir gern in die Kommentare, was du damit steuerst, dann können wir ein paar Ideen austauschen.
