jueves, 23 de julio de 2026

Cómo configurar un screensaver/apagado de pantalla en Raspberry Pi 4 con labwc (kiosko)

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.


Referencias

No hay comentarios: