Si tienes una Raspberry Pi 4 configurada como kiosko con labwc (Wayland) y necesitas que la pantalla se apague tras 10 minutos de inactividad, pero usas wtype para simular pulsaciones de teclado (por ejemplo, para rotar tabs en Chromium), te habrás encontrado con un problema: swayidle nunca detecta inactividad porque wtype genera eventos de entrada constantemente.
En esta guía explico la solución que me ha funcionado: eliminar wtype y usar una extensión nativa de Chrome para rotar tabs, liberando el idle monitor para que funcione correctamente.
1. El problema: wtype vs. swayidle
Mi configuración original usaba un script switchtab.sh con wtype para enviar Ctrl+Tab cada 10 segundos:
#!/bin/bash chromium_pid=$(pgrep chromium | head -1) while [[ -z $chromium_pid ]]; do sleep 5 chromium_pid=$(pgrep chromium | head -1) done while true; do wtype -M ctrl -P Tab -p Tab sleep 10 done
Esto funciona para rotar tabs, pero swayidle detecta cada pulsación de wtype como actividad del usuario, por lo que el timeout de 10 minutos nunca se cumple.
swayidle -w timeout 600 'wlopm --off HDMI-A-1' resume 'wlopm --on HDMI-A-1' &
Resultado: la pantalla nunca se apaga.
2. La solución: Extensión de Chrome para rotar tabs
En lugar de simular teclado desde fuera, hacemos que Chromium gestione la rotación internamente mediante una extensión. Así no hay eventos de entrada falsos y swayidle puede medir la inactividad real del usuario.
2.1. Crear la extensión
Crea la carpeta y los archivos:
mkdir -p ~/chrome-rotator
Archivo ~/chrome-rotator/manifest.json:
{
"manifest_version": 3,
"name": "Tab Rotator",
"version": "1.0",
"permissions": ["tabs"],
"background": {
"service_worker": "background.js"
}
}
Archivo ~/chrome-rotator/background.js:
setInterval(() => {
chrome.tabs.query({currentWindow: true}, (tabs) => {
if (tabs.length > 1) {
let current = tabs.findIndex(t => t.active);
let next = (current + 1) % tabs.length;
chrome.tabs.update(tabs[next].id, {active: true});
}
});
}, 10000);
2.2. Lanzar Chromium con la extensión
En tu ~/.config/labwc/autostart, lanza Chromium así:
chromium 'https://btc-clock.com' \
--kiosk \
--noerrdialogs \
--disable-infobars \
--no-first-run \
--enable-features=OverlayScrollbar \
--start-maximized \
--load-extension=/home/pi/chrome-rotator &
Nota: Cambia /home/pi por tu usuario real (por ejemplo, /home/user).
3. Configurar swayidle en labwc
Ahora que no hay eventos de teclado falsos, swayidle funciona correctamente. Añade al final de tu ~/.config/labwc/autostart:
export WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-1}"
swayidle -w timeout 600 'wlopm --off HDMI-A-1' resume 'wlopm --on HDMI-A-1' &
Explicación de los parámetros:
timeout 600: 600 segundos = 10 minutos de inactividad real.wlopm --off HDMI-A-1: Apaga la salida HDMI-A-1.resume 'wlopm --on HDMI-A-1': Enciende la pantalla al detectar cualquier evento de ratón o teclado.
4. Archivo autostart completo
Así queda mi ~/.config/labwc/autostart completo:
# Asegurar entorno Wayland
export WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-1}"
# Chromium en modo kiosko con rotador de tabs nativo
chromium 'https://btc-clock.com' \
--kiosk \
--noerrdialogs \
--disable-infobars \
--no-first-run \
--enable-features=OverlayScrollbar \
--start-maximized \
--load-extension=/home/pi/chrome-rotator &
# Screensaver: apagar pantalla a los 10 min de inactividad real
swayidle -w timeout 600 'wlopm --off HDMI-A-1' resume 'wlopm --on HDMI-A-1' &
5. Dependencias necesarias
Asegúrate de tener instalados los paquetes:
sudo apt install swayidle wlopm
Verifica tu salida de video con:
wlopm
Si tu salida no es HDMI-A-1, sustitúyela en los comandos anteriores.
6. Resultado
✅ La Raspberry Pi muestra el kiosko rotando tabs cada 10 segundos.
✅ Si nadie toca la pantalla durante 10 minutos, se apaga automáticamente.
✅ Al tocar el ratón o pantalla táctil, se enciende de nuevo.
✅ No más conflictos entre wtype y swayidle.
No hay comentarios:
Publicar un comentario