Hola a todos,
Quería compartir cómo logré ejecutar un kiosco de pantalla táctil a pantalla completa en mi ZimaBoard 2 conectado a un monitor táctil de 22" vía HDMI.
Como ZimaOS no tiene gestor de paquetes (apt no existe), el truco es hacer todo dentro de contenedores Docker.
Mi configuración
ZimaBoard 2 1664 (Intel N100, 16 GB RAM)
ZimaOS v1.5.4
Monitor táctil de 22" vía HDMI + entrada táctil USB-C→USB-A

El enfoque
ZimaOS está basado en Buildroot — sin apt, sin Xorg, sin entorno de escritorio. En su lugar, ejecutamos un contenedor Debian con el controlador modesetting de Xorg + Chromium en modo kiosco, con /dev/dri pasado. Un contenedor nginx:alpine separado sirve los archivos del panel.
Paso 1 — Añade tu usuario al grupo docker
Abre el terminal web en http://your-zima-ip:7681 y ejecuta:
bash
sudo usermod -aG docker TU_NOMBRE_DE_USUARIO
Luego reconecta SSH para que el cambio tenga efecto.
Paso 2 — Crear los archivos
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"]
| ¿Por qué backports Mesa? El Intel N100 (Alder Lake-N, ID PCI 0x46d4) solo es compatible desde Mesa 23.0+. Debian bookworm incluye la 22.3. Backports proporciona la 25.x. |
/DATA/AppData/kiosk/xorg.conf:
text
Sección "Dispositivo"
Identificador "Intel"
Controlador "modesetting"
Opción "Método de aceleración" "ninguno"
EndSection
Sección "Pantalla"
Identificador "Predeterminado"
Dispositivo "Intel"
EndSection
Sección "Dispositivo de entrada"
Identificador "Pantalla táctil"
Controlador "libinput"
Opción "Dispositivo" "/dev/input/event8"
EndSection
Sección "Disposición del servidor"
Identificador "Predeterminado"
Pantalla "Predeterminado"
Dispositivo de entrada "Pantalla táctil" "CorePointer"
EndSection
|
Encuentra el número de evento de tu dispositivo táctil con: 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;
}
Coloca tus archivos HTML/CSS/JS del panel en /DATA/AppData/kiosk/dashboard/.

Paso 3 — Construir y Ejecutar
Construir (nota: docker build necesita --config /tmp en ZimaOS):
bash
docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk
Servidor web del panel:
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
Pantalla 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
Ambos contenedores tienen --restart unless-stopped para que sobrevivan a reinicios automáticamente.
Corrección de clic en pantalla táctil (¡importante!)
El libinput de Xorg mapea el tacto como eventos de puntero (ratón). Chromium luego aplica un umbral de movimiento pequeño para el clic — incluso un desplazamiento de dedo de 1px impide que se dispare. Si tu panel usa manejadores onclick, añade este JS para reemplazarlos con pointerup + un umbral 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);
}
función run(fn) { intenta { nuevo Function(fn)(); } captura(ex) {} }
función patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
constante 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 => {
constante oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
nuevo MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();
También añade a tu CSS para ocultar el cursor del ratón en una pantalla táctil:
css
{ cursor: none !important; touch-action: manipulation; }

Solución de problemas
| Problema | Solución |
| docker build falla con bandera desconocida | Usa docker --config /tmp build … |
| Pantalla negra / Prueba básica de salida fallida | Usa el modo Xorg, no Wayland/cage |
| Mesa no soporta N100 | Instala libgl1-mesa-dri desde bookworm-backports |
| No se detecta entrada táctil | Verifica el número de evento con /proc/bus/input/devices, actualiza xorg.conf |
| El panel muestra el inicio de sesión de ZimaOS | El puerto 80 está ocupado por ZimaOS — usa un puerto diferente (el 888 funciona) |
Mi configuración siempre activa de Home Assistant (Respuesta)
Construí una configuración eficiente en energía de asistente para el hogar disponible 24/7 sin que mi equipo principal consuma electricidad todo el tiempo. El arma secreta es un Zima que actúa como el cerebro siempre activo, mientras mi PC completa está en hibernación hasta que realmente se necesita.
El PC principal
Esto es lo que hay dentro de la máquina principal:
CPU: AMD Ryzen 9 9950X3D
Placa base: ASUS ROG Crosshair X870E Glacial
RAM: Acer Predator Hermes RGB DDR5 96GB (2×48GB) 6000MHz CL28
Almacenamiento: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5
GPU (Gaming): ASUS ROG Astral GeForce RTX 5080 16GB
GPU (IA): Intel Arc Pro B70 32GB (esperando lanzamiento)
Fuente de poder: Corsair RM1200x
Gabinete: Thermaltake Tower 900
La configuración Zima (El centro siempre activo)
El Zima funciona 24/7 y maneja todo lo liviano — tareas de asistente doméstico, transmisiones de cámara, y consultas básicas de IA usando Groq free tier vía la nube.
Periféricos conectados directamente al Zima:
Monitor táctil Pisichen de 22" vía HDMI → adaptador miniDP + un cable USB-C para entrada táctil
Altavoces Edifier G1000 II a través de una tarjeta de sonido externa USB-A a 3.5mm
Micrófono DAMAO DGM20S vía USB-A
Almacenamiento:
Seagate IronWolf Pro 20TB — disco NAS ''agujero negro''
Seagate IronWolf Pro 1TB — disco principal NAS
Redes:
Zima conectado al router vía Ethernet
Un segundo cable Ethernet va directamente del Zima al PC para transferencias locales rápidas

La parte inteligente: Wake-on-LAN
Aquí está la magia — cuando alguien hace una pregunta demasiado compleja para que Gemini la maneje bien, el Zima envía un paquete Wake-on-LAN para sacar al PC principal de la hibernación. Una vez activo, se conecta a un modelo LLM local de 70 mil millones de parámetros que corre en la Intel Arc Pro B70. Después de completar la tarea, el PC vuelve a dormir.
El resultado: un asistente doméstico que siempre responde, pero el equipo principal solo se activa cuando hay trabajo pesado que hacer. Las facturas de electricidad se mantienen razonables, y aún así tengo acceso a un modelo local realmente capaz cuando lo necesito.
Un enorme agradecimiento a Claude Code y Perplexity — honestamente, sin su ayuda nunca habría podido armar todo este proyecto por mi cuenta. Fueron invaluables durante todo el proceso.
Espero que esta información ayude a cualquiera lo suficientemente loco como para emprender un proyecto similar — ¡siéntete libre de compartirla donde quieras!
Centro de Campañas Zima
Más para leer

Qué pasó cuando la IA tomó el control de una ZimaBoard 2
This article explores how a creator used ZimaBoard 2 to run a looping AI agent in Linux, revealing both the promise and limits of...

3 Incidentes Reales que Revelaron Amenazas Ocultas en Mi Red Doméstica Inteligente
En ZimaSpace, nos dedicamos a equipar a creadores, aficionados y entusiastas de homelabs con hardware compacto pero realmente potente que funciona 24/7 sin disparar...

¿Qué es un servidor de IA local?
Deja de pagar cuotas mensuales y de arriesgar fugas de datos con bots en la nube. Construye un servidor de IA local privado para...

