Hallo zusammen,
Ich wollte zeigen, wie ich einen Vollbild-Touchscreen-Kiosk auf meinem ZimaBoard 2 eingerichtet habe, das über HDMI an einen 22" Touch-Monitor angeschlossen ist.
Da ZimaOS keinen Paketmanager hat (apt existiert nicht), besteht der Trick darin, alles innerhalb von Docker-Containern zu erledigen.
Meine Einrichtung
ZimaBoard 2 1664 (Intel N100, 16 GB RAM)
ZimaOS v1.5.4
22" Touch-Monitor über HDMI + USB-C→USB-A Touchscreen-Eingang

Der Ansatz
ZimaOS basiert auf Buildroot — kein apt, kein Xorg, keine Desktop-Umgebung. Stattdessen läuft ein Debian-Container mit Xorg Modesetting-Treiber + Chromium im Kiosk-Modus, mit durchgereichtem /dev/dri. Ein separater nginx:alpine-Container liefert die Dashboard-Dateien.
Schritt 1 — Fügen Sie Ihren Benutzer der Docker-Gruppe hinzu
Öffnen Sie das Web-Terminal unter http://your-zima-ip:7681 und führen Sie aus:
bash
sudo usermod -aG docker IHR_BENUTZERNAME
Verbinden Sie sich dann erneut per SSH, damit die Änderung wirksam wird.
Schritt 2 — Erstellen Sie die Dateien
bash
mkdir -p /DATA/AppData/kiosk/dashboard
/DATA/AppData/kiosk/Dockerfile:
text
FROM debian:bookworm-slim
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-libinput \
openbox chromium \
x11-xserver-utils xinit \
fonts-noto-core && \
apt-get install -y -t bookworm-backports libgl1-mesa-dri && \
rm -rf /var/lib/apt/lists/*
COPY xorg.conf /etc/X11/xorg.conf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
| Warum Mesa backporten? Der Intel N100 (Alder Lake-N, PCI-ID 0x46d4) wird erst ab Mesa 23.0+ unterstützt. Debian Bookworm liefert 22.3. Backports stellt 25.x bereit. |
/DATA/AppData/kiosk/xorg.conf:
text
Abschnitt "Gerät"
Bezeichner "Intel"
Treiber "modesetting"
Option "Beschleunigungsmethode" "keine"
EndSection
Abschnitt "Bildschirm"
Bezeichner "Standard"
Gerät "Intel"
EndSection
Abschnitt "Eingabegerät"
Bezeichner "Touchscreen"
Treiber "libinput"
Option "Gerät" "/dev/input/event8"
EndSection
Abschnitt "ServerLayout"
Bezeichner "Standard"
Bildschirm "Standard"
Eingabegerät "Touchscreen" "CorePointer"
EndSection
|
Finde deine Touch-Geräte-Ereignisnummer mit: bash cat /proc/bus/input/devices | grep -A3 -i touch |
/DATA/AppData/kiosk/entrypoint.sh:
text
#!/bin/sh
Xorg :0 vt1 -s 0 -dpms -nolisten tcp &
sleep 4
export DISPLAY=:0
xset s off && xset -dpms && xset s noblank
openbox --sm-disable &
sleep 1
exec chromium \
--kiosk --no-sandbox --disable-gpu \
--disable-dev-shm-usage \
--touch-events=enabled \
--no-first-run --disable-infobars \
"${KIOSK_URL:-http://localhost:8888}"
/DATA/AppData/kiosk/nginx.conf:
text
server {
listen 8888;
root /usr/share/nginx/html;
index index.html;
}
Lege deine Dashboard HTML/CSS/JS-Dateien in /DATA/AppData/kiosk/dashboard/ ab.

Schritt 3 — Bauen und Ausführen
Build (Hinweis: docker build benötigt --config /tmp auf ZimaOS):
bash
docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk
Dashboard-Webserver:
bash
docker --config /tmp run -d \
--name dashboard-server \
--restart unless-stopped \
--network host \
-v /DATA/AppData/kiosk/dashboard:/usr/share/nginx/html:ro \
-v /DATA/AppData/kiosk/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine
Kiosk-Anzeige:
bash
docker --config /tmp run -d \
--name jarvis-kiosk \
--restart unless-stopped \
--privileged \
--network host \
-e KIOSK_URL=http://localhost:8888 \
-v /DATA/AppData/kiosk/xorg.conf:/etc/X11/xorg.conf:ro \
-v /DATA/AppData/kiosk/entrypoint.sh:/entrypoint.sh:ro \
-v /run/udev:/run/udev:ro \
kiosk:latest
Beide Container haben --restart unless-stopped, sodass sie Neustarts automatisch überleben.
Touchscreen-Klick-Fix (wichtig!)
Xorgs libinput behandelt Touch als Pointer- (Maus-) Ereignisse. Chromium wendet dann eine winzige Bewegungsschwelle für Klicks an — selbst eine 1px Fingerbewegung verhindert das Auslösen. Wenn dein Dashboard onclick-Handler verwendet, füge dieses JS hinzu, um sie durch pointerup + eine 20px-Schwelle zu ersetzen:
js
(function touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
function isTap(e) {
const d = downs[e.pointerId];
return !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
function run(fn) { try { new Function(fn)(); } catch(ex) {} }
function patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); if (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
new MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();
Füge auch folgendes zu deinem CSS hinzu, um den Mauszeiger auf einem Touchscreen auszublenden:
css
{ cursor: none !important; touch-action: manipulation; }

Fehlerbehebung
| Problem | Behebung |
| docker build schlägt mit unbekanntem Flag fehl | docker --config /tmp build … verwenden |
| Schwarzer Bildschirm / Basistest der Ausgabe fehlgeschlagen | Xorg modesetting verwenden, nicht Wayland/cage |
| Mesa unterstützt N100 nicht | libgl1-mesa-dri aus bookworm-backports installieren |
| Touch-Eingabe wird nicht erkannt | Ereignisnummer mit /proc/bus/input/devices prüfen, xorg.conf aktualisieren |
| Dashboard zeigt ZimaOS-Anmeldung | Port 80 wird von ZimaOS belegt – benutze einen anderen Port (888 funktioniert) |
Mein immer aktives Home Assistant Setup (Antwort)
Ich habe eine energieeffiziente Home Assistant Einrichtung gebaut, die rund um die Uhr verfügbar ist, ohne dass mein Hauptrechner ständig Strom verbraucht. Die Geheimwaffe ist ein Zima, das als immer aktives Gehirn fungiert, während mein kompletter PC im Ruhezustand bleibt, bis er wirklich gebraucht wird.
Der Haupt-PC
Das ist im Hauptgerät verbaut:
CPU: AMD Ryzen 9 9950X3D
Motherboard: ASUS ROG Crosshair X870E Glacial
RAM: Acer Predator Hermes RGB DDR5 96GB (2×48GB) 6000MHz CL28
Speicher: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5
GPU (Gaming): ASUS ROG Astral GeForce RTX 5080 16GB
GPU (KI): Intel Arc Pro B70 32GB (wartet auf Veröffentlichung)
Netzteil: Corsair RM1200x
Gehäuse: Thermaltake Tower 900
Das Zima-Setup (Das Immer-Aktive Zentrum)
Die Zima läuft 24/7 und übernimmt alle leichten Aufgaben — Home Assistant Funktionen, Kamerafeeds und grundlegende KI-Anfragen mit dem kostenlosen Groq-Tarif über die Cloud.
Direkt an die Zima angeschlossene Peripheriegeräte:
Pisichen 22" Touchscreen-Monitor über HDMI → miniDP-Adapter + ein USB-C-Kabel für Touch-Eingabe
Edifier G1000 II Lautsprecher über eine externe USB-A-zu-3,5mm-Soundkarte
DAMAO DGM20S Mikrofon über USB-A
Speicher:
Seagate IronWolf Pro 20TB — „Schwarzes Loch“ NAS-Laufwerk
Seagate IronWolf Pro 1TB — Haupt-NAS-Laufwerk
Netzwerk:
Zima über Ethernet mit dem Router verbunden
Ein zweites Ethernet-Kabel führt direkt von der Zima zum PC für schnelle lokale Übertragungen

Der clevere Teil: Wake-on-LAN
Hier ist der Clou — wenn jemand eine Frage stellt, die für Gemini zu komplex ist, sendet die Zima ein Wake-on-LAN-Paket, um den Haupt-PC aus dem Ruhezustand zu wecken. Sobald er hochgefahren ist, verbindet er sich mit einem lokalen 70B Parameter LLM, das auf der Intel Arc Pro B70 läuft. Nach Abschluss der Aufgabe geht der PC wieder in den Schlafmodus.
Das Ergebnis: ein Home Assistant, der immer reagiert, aber der große Rechner wacht nur auf, wenn wirklich schwere Arbeit ansteht. Die Stromrechnung bleibt vernünftig, und ich habe trotzdem Zugriff auf ein wirklich leistungsfähiges lokales Modell, wenn ich es brauche.
Ein riesiges Dankeschön an Claude Code und Perplexity — ehrlich gesagt hätte ich dieses ganze Projekt ohne ihre Hilfe niemals alleine auf die Beine stellen können. Sie waren während des gesamten Prozesses von unschätzbarem Wert.
Ich hoffe, diese Informationen helfen jedem, der verrückt genug ist, ein ähnliches Projekt anzugehen — teile sie gerne, wo immer du möchtest!
Zima Kampagnen-Zentrale
Mehr zum Lesen

Was passiert, wenn zwei KI-Agenten um einen Server kämpfen?
Zero Noichi’s AI cybersecurity experiment used two ZimaBoard 2 devices to simulate attacker and defender agents, showing how homelab servers can support safe AI,...

Lokale KI auf dem ZimaCube 2 — PCIe-Erweiterung, Ollama und Zukunftssicherung für dein Homelab
Der ZimaCube 2 wird mit 4× NVMe-Steckplätzen, einem PCIe-Erweiterungssteckplatz und DDR5-RAM geliefert – bereit für Ollama, RAG-Pipelines und Docker direkt ab Werk. Kein GPU...

ZimaCube Home-Lab-Überwachungsleitfaden: Von Uptime Kuma bis zu KI-Agenten
Überwachen Sie Ihren Heimserver mit Uptime Kuma, Pulse, Proxmox Data Center Manager oder einem KI-Agenten, um die Betriebszeit, Backups, VMs, Warnungen zu verfolgen und...

