Zum Inhalt springen
Alles Automatisch
Videos

Dashboard

Home Assistant Wandtablet mit Fully Kiosk einrichten

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 Sonntag, 8. November, um 9 Uhr. Die komplette Anleitung kannst du heute schon lesen, sie steht direkt darunter.

Mitglieder seit 4. Nov.Für alle am So., 8. Nov.
noch 4 Tage

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.

Jetzt-Ansicht am Morgen mit Uhr, Terminen, Szenen, Musik, Licht und Energie
Die Jetzt-Ansicht am Morgen, alles aus dem Demo-Modus

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.

  1. Installiere Fully Kiosk Browser aus dem Play Store und kaufe die PLUS-Lizenz für dieses Gerät.
  2. Öffne in Fully die Einstellungen (vom linken Rand wischen, dann „Settings“). Die Menüs sind auf Englisch.
  3. 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.
  4. 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.
  5. 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.
  6. 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 255
  • number.galaxy_tab_a11_bildschirm_aus_timer: nach wie vielen Sekunden ohne Bewegung der Bildschirm ausgeht
  • switch.galaxy_tab_a11_bildschirm: Bildschirm an oder aus
  • switch.galaxy_tab_a11_kiosk_sperre: Kiosk-Modus an oder aus
  • switch.galaxy_tab_a11_bewegungserkennung: die Kamera-Bewegungserkennung von Fully
  • button.galaxy_tab_a11_bewegungsaktivitat_auslosen: meldet Fully eine Bewegung wie von der Kamera und weckt damit den Bildschirm
  • button.galaxy_tab_a11_start_url_laden: lädt die Start-URL neu, praktisch nach jeder Änderung an der Card
  • button.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.

  1. Einstellungen → Personen → Person hinzufügen.
  2. Als Namen nimmst du zum Beispiel „Wandtablet“ und schaltest „Anmeldung erlauben“ ein.
  3. 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.

yaml
homeassistant:
  packages: !include_dir_named packages

Prü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:

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_nacht

Der 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:

Jetzt-Ansicht am Abend mit Abendessen, Terminen für morgen und der Szene Gute Nacht
Abends rücken Essen, die Termine von morgen und Gute Nacht nach vorn

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

Nachtansicht mit gedimmter Uhr, Wecker und Zeitleiste für morgen
Die Nachtansicht: gedimmte Uhr, Wecker und der nächste Tag

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:

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: restart bricht 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_error am 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:

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_auslosen

Die 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.

  1. Geh auf Einstellungen → Bereiche, Labels & Zonen → Labels → Label erstellen und leg die Labels „Hauslicht“ und „Rollos“ an.
  2. Gib allen Lampen, die abends ausgehen sollen, das Label „Hauslicht“. Die Rollos bekommen „Rollos“.
  3. Ersetze cover.garagentor durch dein Garagentor oder lösch die letzte Aktion, wenn du keins hast.

Speichere den Block als /config/packages/esszimmer_gute_nacht.yaml:

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.

javascript
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    ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[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“.

  1. Klick auf Ressource hinzufügen.
  2. Als URL trägst du /local/wandtablet/wandtablet-card.js?v=1 ein.
  3. 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

  1. Einstellungen → Dashboards → Dashboard hinzufügen → Neues Dashboard von Grund auf.
  2. Titel „Esszimmer“, als URL esszimmer-tablet. Die URL muss einen Bindestrich enthalten.
  3. „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.
  4. Klick auf Erstellen und öffne das neue Dashboard. Häng in der Adresszeile ?edit=1 an 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=1 bleibt sie eine kleine graue Karte.
  5. Stift oben rechts, dann „Dashboard-Menü öffnen“ und Raw-Konfigurationseditor. Ersetze den Inhalt durch diesen Block. Trag unter lights deine eigenen Lampen ein. Unter scripts steht das Skript „Gute Nacht“ aus Schritt 9, es wird zu einem eigenen Knopf:
yaml
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
  1. Speichern, dann Fertig.
  2. Nimm ?edit=1 wieder 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:

  1. 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 Tablet homeassistant.local nicht auf, nimm die IP-Adresse deines Home Assistant.
  2. 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.
  3. Lade die Start-URL, melde dich mit dem Tablet-Benutzer aus Schritt 4 an und setz „Angemeldet bleiben“.
  4. 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-EinstellungSchlüsselWert
Start URLstartURLAdresse des Dashboards
URL WhitelisturlWhitelisthttp://homeassistant.local:8123*
Enable Visual Motion DetectionmotionDetectiontrue
Motion SensitivitymotionSensitivity92
Turn Screen On on MotionscreenOnOnMotiontrue
Stop Screensaver on MotionstopScreensaverOnMotiontrue
Reload on Internet ConnectionreloadOnInternettrue
Reload on Page ErrorreloadPageFailure15
Launch on BootlaunchOnBoottrue
Keep in ForegroundrunInForegroundtrue

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:

Nachtansicht mit eingeblendeten Bedienelementen nach einem Tipp
Nachts genügt ein Tipp, dann sind die Bedienelemente kurz zurück

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

Wohnzimmer-Ansicht mit Licht, Rollos, Stimmungen und Fernseher
Wohnzimmer: Licht, Rollos, Stimmungen und Fernseher auf einer Seite

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

Musik-Ansicht mit Sendern, Playlists und Lautstärke pro Raum
Musik: Sender, Playlists und Räume mit eigener Lautstärke

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

Kamera-Ansicht mit fünf Kameras und den erkannten Ereignissen des Tages
Kameras mit den Ereignissen des Tages, Bilder aus dem Demo-Modus
Livebild der Haustür mit Haustürlicht, Meldungen und Schnappschuss
Livebild der Haustür mit den passenden Knöpfen daneben

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:

Klingel-Popup mit Kamerabild und Knöpfen für Vollbild, Haustürlicht und Schließen
Es klingelt: das Kamerabild kommt von selbst nach vorn

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:

Wetter-Ansicht mit Temperaturkurve, Warnungen und Vorschau für die Woche
Wetter: 24 Stunden, Warnungen und die nächsten Tage
Tagesvorschau im Wetter mit Stundenkurve für morgen
Die Vorschau für einen einzelnen Tag

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

Popup Solar der letzten 7 Tage mit Tagesbalken und Wochensumme
Solar der letzten sieben Tage aus der Energieleiste

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

Jetzt-Ansicht an einem Geburtstag mit Hinweis unter dem Datum und Konfetti
Geburtstag im Demo-Modus mit 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.

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.