Tableau de bord kiosque tactile sur ZimaBoard 2 avec Docker (X.Org + Chromium)

Eva Wong est la rédactrice technique et bricoleuse résidente chez ZimaSpace. Geek passionnée depuis toujours, elle s'intéresse aux homelabs et aux logiciels open source, et elle est spécialisée dans la traduction de concepts techniques complexes en guides pratiques et accessibles. Eva croit que l'auto-hébergement doit être amusant, pas intimidant. À travers ses tutoriels, elle donne à la communauté les moyens de démystifier les configurations matérielles, depuis la construction de leur premier NAS jusqu'à la maîtrise des conteneurs Docker.

Salut à tous,

Je voulais partager comment j’ai fait fonctionner un kiosque tactile en plein écran sur mon ZimaBoard 2 connecté à un écran tactile 22" via HDMI.

Comme ZimaOS n’a pas de gestionnaire de paquets (apt n’existe pas), l’astuce est de tout faire à l’intérieur des conteneurs Docker.

Ma configuration

ZimaBoard 2 1664 (Intel N100, 16 Go RAM)

ZimaOS v1.5.4

Écran tactile 22" via HDMI + entrée tactile USB-C→USB-A

Gros plan sur un boîtier PC Thermaltake Tower 900 blanc et rouge, avec éclairage LED bleu personnalisé et vue détaillée des composants internes, incluant un processeur Intel et de la mémoire.

L’approche

ZimaOS est basé sur Buildroot — pas d’apt, pas de Xorg, pas d’environnement de bureau. À la place, nous exécutons un conteneur Debian avec le pilote Xorg modesetting + Chromium en mode kiosque, avec /dev/dri passé. Un conteneur nginx:alpine séparé sert les fichiers du tableau de bord.

Étape 1 — Ajoutez votre utilisateur au groupe docker

Ouvrez le terminal web à http://your-zima-ip:7681 et exécutez :

bash

sudo usermod -aG docker VOTRE_NOM_UTILISATEUR

Reconnectez ensuite SSH pour que la modification prenne effet.

Étape 2 — Créez les fichiers

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"]

Pourquoi des backports de Mesa ? Le Intel N100 (Alder Lake-N, ID PCI 0x46d4) est supporté uniquement à partir de Mesa 23.0+. Debian bookworm fournit la version 22.3. Les backports fournissent la 25.x.

/DATA/AppData/kiosk/xorg.conf :

text

Section "Périphérique"
Identifiant "Intel"
Pilote "modesetting"
Option "MéthodeAccel" "aucune"
EndSection

Section "Écran"
Identifiant "Par défaut"
Périphérique "Intel"
EndSection

Section "Périphérique d'entrée"
Identifiant "Écran tactile"
Pilote "libinput"
Option "Périphérique" "/dev/input/event8"
EndSection

Section "DispositionServeur"
Identifiant "Par défaut"
Écran "Par défaut"
Périphérique d'entrée "Écran tactile" "CorePointer"
EndSection

Trouvez le numéro d'événement de votre appareil tactile avec :

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;
}

Placez vos fichiers HTML/CSS/JS du tableau de bord dans /DATA/AppData/kiosk/dashboard/.

Vue de dessus du serveur monocarte ZimaBoard, mettant en évidence son slot d'extension PCIe, ses deux ports Ethernet et ses connecteurs SATA pour l'intégration de projets DIY.

Étape 3 — Construire et lancer

Construire (note : docker build nécessite --config /tmp sur ZimaOS) :

bash

docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk

Serveur web du tableau de bord :

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

Affichage Kiosk :

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

Les deux conteneurs ont --restart unless-stopped pour qu'ils survivent automatiquement aux redémarrages.

Correction du clic sur écran tactile (important !)

Le libinput de Xorg mappe le tactile comme des événements pointeur (souris). Chromium applique ensuite un seuil de mouvement minime pour le clic — même un déplacement de 1px du doigt l'empêche de se déclencher. Si votre tableau de bord utilise des gestionnaires onclick, ajoutez ce JS pour les remplacer par pointerup + un seuil de 20px :

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 });
})();

Ajoutez aussi à votre CSS pour cacher le curseur de la souris sur un écran tactile :

css

{ cursor: none !important; touch-action: manipulation; }

Un moniteur tactile Pisichen de 22 pouces connecté à un ZimaBoard via HDMI et USB, affichant un tableau de bord domotique personnalisé avec des widgets interactifs.

Dépannage

Problème Correction
docker build échoue avec un drapeau inconnu Utilisez docker --config /tmp build …
Écran noir / test de sortie basique échoué Utilisez le mode Xorg, pas Wayland/cage
Mesa ne supporte pas N100 Installez libgl1-mesa-dri depuis bookworm-backports
Entrée tactile non détectée Vérifiez le numéro d'événement avec /proc/bus/input/devices, mettez à jour xorg.conf
Le tableau de bord affiche la connexion ZimaOS Le port 80 est utilisé par ZimaOS — utilisez un autre port (888 fonctionne)

Ma configuration d'assistant domestique toujours active (Réponse)

J'ai construit une configuration d'assistant domestique économe en énergie, disponible 24h/24 sans que mon PC principal ne consomme de l'électricité en permanence. L'arme secrète est un Zima qui agit comme le cerveau toujours actif, tandis que mon PC complet reste en veille prolongée jusqu'à ce qu'il soit réellement nécessaire.

Le PC principal

Voici ce qu'il y a à l'intérieur de la machine principale :

Processeur : AMD Ryzen 9 9950X3D

Carte mère : ASUS ROG Crosshair X870E Glacial

RAM : Acer Predator Hermes RGB DDR5 96 Go (2×48 Go) 6000 MHz CL28

Stockage : Crucial T710 4 To NVMe M.2 PCIe 5.0 Gen5

GPU (Jeu) : ASUS ROG Astral GeForce RTX 5080 16 Go

GPU (IA) : Intel Arc Pro B70 32 Go (en attente de sortie)

Alimentation : Corsair RM1200x

Boîtier : Thermaltake Tower 900

La configuration Zima (le hub toujours actif)

Le Zima fonctionne 24/7 et gère tout ce qui est léger — tâches d'assistant domestique, flux vidéo des caméras, et requêtes IA basiques via le niveau gratuit Groq dans le cloud.

Périphériques connectés directement au Zima :

Écran tactile Pisichen 22" via adaptateur HDMI → miniDP + un câble USB-C pour l'entrée tactile

Enceintes Edifier G1000 II via une carte son externe USB-A vers 3,5 mm

Microphone DAMAO DGM20S via USB-A

Stockage :

Seagate IronWolf Pro 20 To — disque NAS « trou noir »

Seagate IronWolf Pro 1 To — disque principal NAS

Réseau :

Zima connecté au routeur via Ethernet

Un second câble Ethernet relie directement le Zima au PC pour des transferts locaux rapides

Un espace de travail domotique complet avec un kiosque tactile alimenté par ZimaBoard, des enceintes professionnelles et un bureau minimaliste pour une surveillance 24/7.

La partie intelligente : Wake-on-LAN

Voici la magie — quand quelqu'un pose une question trop complexe pour que Gemini la gère bien, le Zima envoie un paquet Wake-on-LAN pour sortir le PC principal de l'hibernation. Une fois allumé, il se connecte à un LLM local de 70 milliards de paramètres fonctionnant sur l'Intel Arc Pro B70. Une fois la tâche terminée, le PC se remet en veille.

Le résultat : un assistant domestique toujours réactif, mais la grosse machine ne se réveille que lorsqu'il y a un vrai travail lourd à faire. Les factures d'électricité restent raisonnables, et j'ai toujours accès à un modèle local vraiment performant quand j'en ai besoin.

Un immense merci à Claude Code et Perplexity — honnêtement, sans leur aide, je n'aurais jamais pu réaliser ce projet tout seul. Ils ont été inestimables tout au long du processus.

J'espère que ces informations aideront tous ceux qui sont assez fous pour se lancer dans un projet similaire — n'hésitez pas à les partager où vous voulez !

Centre de campagne Zima

À lire aussi

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.