Skip to content

Jaolmos/pizerorss

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PiZeroRSS

Lector RSS de noticias tech para Raspberry Pi Zero 2W con pantalla Waveshare 1.44" LCD HAT (128x128px). Muestra titulares de tecnología, IA, Linux, ciberseguridad y ciencia en español, con estilo Matrix (verde sobre negro). Diseñado para funcionar 24/7 como panel informativo de escritorio.

Raspberry Pi Zero 2W con Waveshare 1.44 LCD HAT montado
Raspberry Pi Zero 2 W con el Waveshare 1.44" LCD HAT montado

Simulador Pygame mostrando una noticia
Simulador Pygame en modo desarrollo (mismo render que la pantalla real)

Pantalla de carga descargando feeds Pantalla mostrando una noticia
Pantalla de resumen del artículo Menú de ajustes
Pantallas en hardware real: carga, noticias, resumen y ajustes

Características

  • 20 feeds RSS en español: tech, IA, Linux, seguridad, ciencia
  • Auto-avance de artículos cada 30s por defecto (configurable: 10s/30s/60s/120s/OFF)
  • Pantalla de resumen con scroll para leer artículos
  • Menú de ajustes para activar/desactivar feeds e intervalos de auto-avance y actualización
  • Estilo Matrix verde sobre negro, optimizado para 128x128px
  • Cero escritura en SD durante el uso normal (cache en RAM)
  • Actualización automática de feeds cada 15 minutos en background

Stack

  • Python >=3.12 con uv
  • feedparser, Pillow, PyYAML, requests
  • lgpio + spidev (display Pi) / gpiozero (botones Pi) / pygame (desarrollo)
  • Fuente Cozette (MIT)

Desarrollo en PC

# Clonar y configurar
git clone https://github.com/Jaolmos/pizerorss.git
cd pizerorss
uv venv --python 3.12
uv sync --extra dev

# Ejecutar simulador
uv run python src/main.py --dev

El simulador Pygame muestra la pantalla a escala x4 (512x512) y usa el teclado como controles.

Controles en desarrollo (teclado)

Pantalla de noticias

Tecla Acción
↑ / ↓ Artículo anterior / siguiente
← / → Feed anterior / siguiente
Enter o A Abrir resumen del artículo
B Marcar artículo como leído
C mantenido 1s Abrir menú de ajustes

Pantalla de resumen

Tecla Acción
↑ / ↓ Scroll del texto
Enter, A o ← Volver a noticias

Menú de ajustes

Tecla Acción
↑ / ↓ Navegar opciones
Enter o A Cambiar valor / Entrar en submenú
C o ← Volver

El menú tiene 3 opciones: Intervalo (10s/30s/60s/120s/OFF), Update (5m/15m/30m/1h) y Feeds (submenú para activar/desactivar feeds individuales).

Instalación en Raspberry Pi

Hardware utilizado: Raspberry Pi Zero 2 WH (con pines pre-soldados) + Waveshare 1.44" LCD HAT + microSD + cable micro-USB. Guía completa: docs/setup-pi.md.

Resumen rápido:

git clone https://github.com/Jaolmos/pizerorss.git ~/pizerorss
cd ~/pizerorss
./setup.sh
sudo systemctl start pizerorss.service

Controles en la Pi (Waveshare HAT)

El HAT tiene un joystick de 5 direcciones (izquierda) y 3 botones KEY1/KEY2/KEY3 (derecha).

Pantalla de noticias

Control Acción
Joystick ↑ / ↓ Artículo anterior / siguiente
Joystick ← / → Feed anterior / siguiente
Joystick PRESS o KEY1 Abrir resumen del artículo
KEY2 Marcar artículo como leído
KEY3 mantenido 1s Abrir menú de ajustes

Pantalla de resumen

Control Acción
Joystick ↑ / ↓ Scroll del texto
Joystick PRESS, KEY1 o Joystick ← Volver a noticias

Menú de ajustes

Control Acción
Joystick ↑ / ↓ Navegar opciones
Joystick PRESS o KEY1 Cambiar valor / Entrar en submenú
KEY3 o Joystick ← Volver

Estructura

pizerorss/
├── config/feeds.yaml          # Configuración de feeds y display
├── src/
│   ├── main.py                # Entry point (--dev para simulador)
│   ├── app.py                 # Orquestador principal
│   ├── config/settings.py     # Gestión de configuración YAML
│   ├── display/
│   │   ├── st7735.py          # Driver ST7735S (lgpio + SPI)
│   │   ├── renderer.py        # Renderizado UI con Pillow (128x128)
│   │   └── simulator.py       # Simulador Pygame para PC
│   ├── feeds/
│   │   ├── manager.py         # Cache en RAM + actualizaciones background
│   │   └── parser.py          # Parsing RSS con feedparser
│   ├── input/
│   │   └── controller.py      # Teclado (dev) / GPIO (Pi)
│   └── ui/
│       ├── screen.py           # Interfaz base de pantallas
│       ├── news_screen.py      # Pantalla de titulares
│       ├── summary_screen.py   # Resumen del artículo
│       ├── settings_screen.py  # Menú de ajustes
│       └── feeds_screen.py     # Submenú de feeds (activar/desactivar)
├── assets/fonts/              # Fuente Cozette
├── screenshots/               # Capturas
└── systemd/                   # Servicio para la Pi

Feeds incluidos

Categoría Feeds
Tech Xataka, Computerhoy, Microsiervos, WWWhat's New, NeoTeo, Hipertextual, El Chapuzas Informático
IA IA en Español, Enrique Dans
Linux Linux Adictos, Ubunlog, DesdeLinux
Seguridad Una Al Día (Hispasec), RedesZone
Ciencia Naukas, Muy Interesante

Añadir o quitar feeds

Edita config/feeds.yaml y añade un nuevo bloque siguiendo este formato:

feeds:
  - name: "Xataka"
    url: "https://www.xataka.com/feedburner.xml"
    enabled: true
    category: "tech"

  # Ejemplo: añadir un nuevo feed
  - name: "Mi Blog Favorito"
    url: "https://ejemplo.com/feed"
    enabled: true
    category: "tech"

Campos:

  • name: nombre corto que se muestra arriba de cada titular (máx. ~18 caracteres para que quepa en la pantalla).
  • url: URL del feed RSS/Atom (.xml, /feed, /rss, etc.).
  • enabled: true para mostrarlo, false para desactivarlo sin borrarlo.
  • category: etiqueta libre (tech, ia, ciencia, linux, seguridad...).

También puedes desactivar feeds desde la propia aplicación sin editar el YAML: abre el menú de ajustes (pulsación larga del botón C) y navega hasta el feed para cambiar su estado.

Tras modificar manualmente el fichero, reinicia la aplicación para que los cambios surtan efecto:

sudo systemctl restart pizerorss.service

Arquitectura

  • Interfaces ABC para Display e InputController (inversión de dependencias)
  • Thread-safe: actualizaciones de feeds en hilo background con Lock + swap atómico
  • Dirty flag rendering: solo re-renderiza cuando hay cambios
  • Escritura atómica del YAML (tempfile + rename) para proteger la microSD
  • Todo el estado en RAM: artículos, leídos, cache — cero escrituras en SD durante el uso

Licencia

MIT

About

Lector RSS embebido en Python para Raspberry Pi Zero 2W + pantalla LCD 128x128. Panel always-on estilo Matrix que muestra titulares de tech, IA y ciencia en español, operativo las 24 horas.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors