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

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

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

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

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

Que se passe-t-il lorsque deux agents IA se disputent un serveur ?
L'expérience de cybersécurité IA de Zero Noichi a utilisé deux appareils ZimaBoard 2 pour simuler des agents attaquants et défenseurs, démontrant comment les serveurs...

IA locale sur le ZimaCube 2 — Extension PCIe, Ollama et pérennisation de votre homelab
Le ZimaCube 2 est livré avec 4 emplacements NVMe, un slot d'extension PCIe et de la RAM DDR5 — prêt à l'emploi pour Ollama,...

Guide de surveillance du laboratoire domestique ZimaCube : de Uptime Kuma aux agents IA
Surveillez votre serveur domestique avec Uptime Kuma, Pulse, Proxmox Data Center Manager ou un agent IA pour suivre le temps de fonctionnement, les sauvegardes,...

