Domotique Réseau Serveurs

Kiosque tactile UniFi sur NUC Proxmox : le retour d’expérience (et les 3 heures qu’il ne fallait pas perdre)

22/04/2026 · 7 min de lecture
Kiosque tactile UniFi sur Intel NUC Proxmox avec dashboard réseau affiché et câble USB-C
TL;DR : Transformer un Intel NUC en kiosque tactile permanent : LXC Proxmox Debian + autologin + Chromium Kiosk sur mon dashboard Home Assistant, écran tactile 15″. Tient 24/7 en 5W, refresh auto toutes les heures, et remplace une Google Home Hub pas extensible.

Le besoin

Chez moi, je supervise un réseau UniFi complet : switch, gateway, access points, caméras. Le dashboard UniFi Network donne une vue temps réel utile… quand on la regarde. Problème classique : ouvrir un onglet de navigateur pour « jeter un œil » implique d’être devant un ordi, et mon ordi principal n’est pas dans le bureau en permanence.

L’idée : un kiosque tactile dédié qui affiche en permanence le dashboard UniFi, s’allume quand j’entre dans la pièce, s’éteint quand je pars. Discret, passif, sans clavier souris qui traîne.

Le matériel sous la main :

  • Un Intel NUC i3-1220P qui tourne déjà 24/7 avec plusieurs VMs Proxmox — son iGPU n’était pas exploité, c’est l’opportunité parfaite
  • Un écran portable Anmite 14″ 1920×1200 USB-C tactile
  • Home Assistant et deux capteurs Hue déjà en place dans le bureau

Sur le papier : 30 minutes. En vrai : trois heures. Voici pourquoi, et surtout comment faire en 30 minutes la prochaine fois.


L’architecture

Au lieu de mettre Debian + Chromium directement sur le métal, j’ai ajouté une VM dédiée sur le NUC existant pour trois raisons :

  • Isolation : le kiosque n’est qu’un affichage, il n’a pas à toucher l’hyperviseur ni les autres VMs
  • Snapshotabilité : je peux tester des configs sans risque de perdre quoi que ce soit
  • Zéro impact sur l’existant : les VMs déjà en production continuent de tourner normalement, le kiosque s’ajoute en parallèle
┌─────────────────────────────────────────────┐
│ Proxmox host (VMs existantes + iGPU bindé)  │
│ ┌─────────────────────────────────────────┐ │
│ │ VM 510 "nuc-kiosk" Debian 13 Trixie     │ │
│ │ ├── iGPU passthrough (x-vga)            │ │
│ │ ├── USB passthrough direct (touchscreen)│ │
│ │ ├── Xorg + Chromium --kiosk             │ │
│ │ └── x11vnc (pour debug initial)         │ │
│ └─────────────────────────────────────────┘ │
│         Sortie : DP-3 → USB-C → écran       │
└─────────────────────────────────────────────┘

Côté Home Assistant, deux capteurs Hue (bureau + tableau) sont agrégés en un binary_sensor template qui pilote l’allumage de l’écran via SSH.


Piège n°1 : le kernel cloud Debian

Symptôme : iGPU en passthrough, VM bootée, écran noir sans erreur utile.

Cause : Debian 13 propose linux-image-cloud-amd64 par défaut dans les templates VM. Ce kernel optimisé ne contient pas le module i915.

Fix en 3 commandes :

  • apt install linux-image-amd64
  • apt purge 'linux-image-*-cloud-amd64'
  • update-grub && reboot

À retenir : sur VM Debian pour passthrough GPU, toujours installer le kernel complet.


Piège n°2 : le VBT manquant

Symptôme : i915 se charge, puis dmesg affiche failed to load vbt.bin (-2).

Cause : le VBT (Video BIOS Table) est une config que le firmware Intel lit depuis la ROM iGPU. En passthrough, la VM voit le GPU mais pas la ROM.

La procédure (une fois, puis oubliée) :

  • Sur l’hôte, temporairement binder l’iGPU à i915 au lieu de vfio-pci
  • Dumper le VBT depuis debugfs : cp /sys/kernel/debug/dri/0/i915_vbt /tmp/vbt.bin
  • Copier vbt.bin dans /lib/firmware/i915/ sur la VM
  • Hook initramfs pour inclure le VBT dans l’image de démarrage
  • Paramètre kernel i915.vbt_firmware=i915/vbt.bin via GRUB
  • Remettre l’iGPU en vfio-pci et rebooter

À retenir : pour tout iGPU Intel en passthrough, le VBT n’est pas optionnel. Dump et injection en 5 minutes si on connaît la séquence.


Piège n°3 : Thunderbolt tunneling dans une VM, c’est cassé

Symptôme : écran USB-C branché, image OK, tactile inerte. dmesg :

thunderbolt 0000:04:00.0: device links to tunneled native ports are missing!

Cause : le TB tunneling en VM nécessite une table ACPI DSD correctement propagée, que QEMU ne reconstruit pas en passthrough classique.

Le sauvetage : vérifier d’abord comment le périphérique est vu par l’hôte. Dans mon cas, le touchscreen Anmite passait directement par le xHCI PCH (00:14.0), pas via les contrôleurs TB4. Donc :

  • lsusb -tv sur l’hôte pour identifier le bon bus
  • qm set 510 --usb0 host=27c0:0859,usb3=1 (passthrough USB par VID:PID)
  • Reboot VM

Tactile remonte immédiatement. Pas besoin de toucher à Thunderbolt.

À retenir : USB VID:PID > TB tunneling, quasi toujours.


Piège n°4 : Chromium kiosk + window manager = pas besoin

Symptôme : Xorg en boucle de redémarrage avec erreurs PyXDG cryptiques après install Openbox.

Cause : Chromium --kiosk gère le fullscreen seul. Ajouter un WM = dépendances en plus et points de rupture.

Le .xinitrc final tient en 10 lignes :

  • xset -dpms + xset s off pour éviter les mises en veille indésirables
  • xrandr --output DP-3 --mode 1920x1200 pour forcer la résolution (sans ça, Chromium se lance à 50% de l’écran)
  • unclutter -idle 0.5 -root & pour masquer le curseur
  • chromium --kiosk --touch-events=enabled --no-sandbox <url>

Deux flags clés : --touch-events=enabled (sinon pas de multi-touch) et --no-sandbox (le sandbox namespace ne marche pas toujours en VM).

À retenir : pas de WM dans un kiosque. chromium --kiosk fait tout.


Piège n°5 : le clavier virtuel qui fait perdre 1h

Symptôme : UniFi demande login/password à la première connexion. Comment saisir sur un kiosque sans clavier physique ?

Ce qui a fait perdre du temps : onboard, le clavier virtuel Linux. Trois configs imbriquées (gsettings, AT-SPI, --force-renderer-accessibility), un bouton « minimize » piégeux, des heures de galère.

Ce qui a pris 5 minutes :

  • apt install x11vnc sur la VM
  • Lancer un serveur VNC sur :0
  • vnc://10.0.10.147:5900 depuis le Mac, saisir les credentials avec le vrai clavier physique
  • Chromium les mémorise dans son --user-data-dir
  • Tuer le VNC après (ou le garder pour les maintenances)

À retenir : pour tout kiosque tactile, installer x11vnc dès le début. 5 minutes qui évitent des heures de galère clavier virtuel.


Home Assistant : allumer l’écran uniquement quand quelqu’un est là

Dernière brique : pas de gaspillage, l’écran ne reste pas allumé 24/7 pour rien. Deux capteurs Hue couvrent les zones d’approche du bureau, agrégés côté HA en un binary_sensor OR.

Pourquoi agréger plutôt que deux triggers séparés : avec deux triggers indépendants, le timer for: 00:05:00 de l’un continue même si l’autre capteur est actif. L’écran peut s’éteindre alors qu’on est encore dans la pièce. Le template en OR règle ça : le timer ne court que si les deux capteurs sont inactifs simultanément.

Le package HA tient en un seul fichier /config/packages/kiosk_nuc.yaml :

  • shell_command : 2 commandes SSH vers la VM (xset dpms force on / off)
  • template binary_sensor : agrégation OR des deux capteurs Hue
  • 2 automation : ON sur mouvement, OFF après 5 min sans mouvement

Avantage du package : pour désactiver le kiosque, je supprime ce fichier et c’est propre. Aucun fragment dispersé dans configuration.yaml.


Les 5 leçons à retenir

  • VNC d’abord, toujours — pour tout kiosque tactile, x11vnc dès le début évite la galère clavier virtuel
  • USB VID:PID > Thunderbolt tunneling — regarde toujours si le périphérique USB-C ne passe pas directement par le xHCI du chipset
  • Le VBT est obligatoire pour iGPU Intel en passthrough — pas d’exception, dump et injection via initramfs
  • Pas de window manager dans un kiosque — Chromium --kiosk gère le fullscreen seul
  • Kernel full, pas cloud — sur VM Debian pour passthrough iGPU, toujours linux-image-amd64

Résultat final

Un écran tactile 14″ accroché près du bureau, qui affiche en permanence le dashboard UniFi avec toutes les métriques temps réel. Il s’allume quand j’entre dans la pièce, s’éteint après 5 minutes sans présence. Le tactile fonctionne, je peux naviguer dans l’interface UniFi sans clavier ni souris. Consommation : négligeable en veille, ~8W en usage.

Le plus satisfaisant dans tout ça : le NUC continue d’héberger ses VMs comme avant, l’iGPU jusqu’ici inutilisé fait maintenant tourner un affichage dédié, et l’ensemble coûte zéro matériel supplémentaire hormis l’écran.

Durée du projet une fois qu’on connaît tous les pièges : 30 minutes. Durée réelle la première fois : 3 heures. La différence tient à cinq patterns qui reviennent sur la plupart des projets homelab, et que j’espère vous avoir évités en partageant ce retour d’expérience.

Prochaine étape : cloner la VM kiosk et changer l’URL pour afficher une vue Grafana de ma consommation électrique sur un deuxième écran au salon.

Pour aller plus loin

FAQ

Pourquoi un Intel NUC plutôt qu’un Raspberry Pi pour un kiosque 24/7 ?

Le NUC a une ventilation plus fiable sur la durée, un stockage NVMe qui ne meurt pas comme les SD, et assez de CPU pour un Chromium fluide avec HA dashboard + animations CSS. Pour 5W de conso supplémentaire.

Quelle distribution Linux pour un kiosque tactile ?

Debian 12 minimal (LXC Proxmox ou bare-metal). J’utilise Debian sur LXC privilégié avec passthrough GPU + écran tactile. Ubuntu marche aussi mais Debian est plus stable sur le long terme.

Comment gérer le refresh automatique du dashboard ?

Chromium Kiosk Mode + extension auto-refresh chaque heure. Si HA redémarre, Chromium reprend automatiquement la session. Pour éviter les écrans blancs, j’ai un script bash qui ping HA toutes les 5 min et relance Chromium si timeout.

Vous avez aimé cet article ?

Rejoignez la newsletter : nouveaux articles & contenu exclusif directement par mail, sans pubs.

Je m'abonne