# Stack Research **Domain:** Web-based RTU Interface for Raspberry Pi Embedded Sensor Monitoring **Researched:** 2026-03-12 **Confidence:** HIGH ## Recommended Stack ### Core Technologies | Technology | Version | Purpose | Why Recommended | |------------|---------|---------|-----------------| | **Flask** | 3.1.0 | Lightweight Python web framework | The de facto standard for Raspberry Pi web projects. Extensive ecosystem, minimal overhead, perfect for Pi Zero 2 W. Multiple verified projects use Flask for sensor dashboards. | | **Flask-SocketIO** | 5.6.0 | Real-time bidirectional communication | Proven combination with Flask for live sensor data. Latest version (5.6.0) released Dec 2025, compatible with Python 3.8+. | | **Chart.js** | 4.4.x | JavaScript charting library | Industry standard for dashboard visualizations. Lightweight (~60KB), canvas-based rendering performs well on embedded displays. Extensive documentation and examples for Raspberry Pi projects. | | **Bootstrap** | 5.3.x | CSS framework for responsive UI | Works exceptionally well for touchscreen interfaces. Built-in support for 1024x600 resolution layouts. Grid system simplifies the menu-driven RTU interface. | | **Python** | 3.11+ | Backend runtime | Raspberry Pi OS (Bookworm) ships with Python 3.11. Excellent sensor library ecosystem (GPIO, I2C, serial). | ### Supporting Libraries | Library | Version | Purpose | When to Use | |---------|---------|---------|-------------| | **python-socketio** | 5.12.0+ | Socket.IO client/server | Required by Flask-SocketIO, handles WebSocket transport | | **psutil** | 6.1.0+ | System monitoring | Reading CPU temp, memory for health checks | | **pyserial** | 3.5+ | Serial communication | Reading sensor data from ADC/serial ports | | **smbus2** | 0.5+ | I2C communication | Water level sensors, other I2C devices | | **gunicorn** | 23.0+ | WSGI server | Production deployment, replaces Flask dev server | | **eventlet** | 0.40+ | Async worker | Recommended for Flask-SocketIO production (better than gevent) | | **paramiko** | 3.5+ | SSH/SFTP | SCP/SFTP file transmission to server | ### Real-Time Communication | Technology | Purpose | Why Use | |------------|---------|---------| | **Socket.IO** (via Flask-SocketIO) | Server-push for sensor updates | Bidirectional, auto-reconnection, fallback to polling. Proven in multiple Pi monitoring projects. | ### Development Tools | Tool | Purpose | Notes | |------|---------|-------| | **systemd** | Service management | Auto-start Flask app on boot, restart on failure | | **Chromium Kiosk Mode** | Local display | `chromium-browser --kiosk --incognito http://localhost:8080` | | **nginx** | Reverse proxy | Route 8080 (kiosk) and 9090 (remote) ports | ## Installation ```bash # Core Python packages pip install flask==3.1.0 pip install flask-socketio==5.6.0 pip install python-socketio==5.12.0 # Sensor and system access pip install psutil==6.1.0 pip install pyserial==3.5 pip install smbus2==0.5 # Production server pip install gunicorn==23.0 pip install eventlet==0.40 # File transmission pip install paramiko==3.5 # Frontend (via CDN or download) # - Bootstrap 5.3.x CSS/JS # - Chart.js 4.4.x # - Socket.IO client 4.x ``` ## Alternatives Considered | Recommended | Alternative | When to Use Alternative | |-------------|-------------|-------------------------| | Flask | FastAPI | Only if you need async/await for high-concurrency (50+ concurrent users). Flask is simpler for embedded. | | Flask | Quart | If you prefer async Flask syntax. Flask-SocketIO still works but adds complexity. | | Socket.IO | Server-Sent Events (SSE) | SSE is simpler (no JS library) but only one-way. Use only if you never need client→server real-time messages. | | Socket.IO | Polling | Only for absolute minimal overhead. Not recommended—Socket.IO overhead is negligible, benefits are substantial. | | Chart.js | Lightweight Charts | Only if you need financial-style candlestick charts. Chart.js is better for standard line/bar charts. | | Bootstrap 5 | Pure CSS | If you need absolute minimum footprint. Bootstrap adds ~200KB but saves大量 development time for touchscreen layouts. | ## What NOT to Use | Avoid | Why | Use Instead | |-------|-----|-------------| | **Django** | Too heavy (~30MB+), complex setup, overkill for embedded RTU | Flask (lightweight, sufficient for this use case) | | **FastAPI** | While fast, adds Pydantic complexity without benefit. Async not needed for single-user dashboard | Flask (simpler, same performance for this use case) | | **React/Vue/Angular** | Framework overhead, build step required, memory intensive on Pi Zero | Vanilla JS + Bootstrap (direct, no build, ~500KB total) | | **Node.js** | Adds runtime complexity, unnecessary for Python-centric sensor stack | Python/Flask (native sensor access, simpler deployment) | | **gunicorn (threading mode)** | Doesn't work well with Flask-SocketIO | eventlet worker (required for WebSocket support) | | **InfluxDB + Grafana** | Full database + visualization stack, too heavy for Pi Zero | Flask + Chart.js (direct data, minimal overhead) | ## Stack Patterns by Variant **If running on Pi Zero 2 W (primary target):** - Use Flask development server (`python app.py`) for simplicity - Single worker, Socket.IO handles concurrency - Minimal CSS, avoid heavy JavaScript frameworks - Reason: Pi Zero 2 W has limited RAM (~512MB), every MB counts **If running on Pi 3B (alternative):** - Can use gunicorn + eventlet with 2-4 workers - More aggressive caching allowed - Consider nginx for static files - Reason: Pi 3B has more RAM (~1GB), can handle more overhead **If remote HD interface needed (port 9090):** - Serve same Flask app on different port - Use CSS media queries to show full HD layout on larger screens - No separate codebase needed - Reason: Single app, responsive design handles both ## Version Compatibility | Package | Compatible With | Notes | |---------|----------------|-------| | Flask 3.1.0 | Python 3.10+ | Requires Python 3.10 minimum | | Flask-SocketIO 5.6.0 | Flask >=2.1.0, python-socketio >=5.12.0 | Use latest python-socketio for best performance | | Socket.IO client 4.x | Flask-SocketIO 5.x | Client/server version must match protocol | | Bootstrap 5.3.x | All modern browsers | No IE11 support (not needed for kiosk) | | Chart.js 4.4.x | All modern browsers | Requires canvas support | | eventlet 0.40+ | Python 3.10+ | Monkey-patching required before other imports | | psutil 6.1.0 | Python 3.8+ | Works on all Pi models | ## Why This Stack ### Performance on Pi Zero 2 W - Flask overhead: ~10-15MB RAM (vs Django ~80MB) - Chart.js canvas rendering is GPU-accelerated on Pi - Socket.IO connection: ~1-2MB per client - Total app footprint: ~50-80MB RAM ### Developer Experience - Flask: Simple, Pythonic, extensive documentation - Bootstrap: Ready-made touchscreen-friendly components - Chart.js: Extensive examples for real-time data - Single codebase serves both kiosk (1024x600) and remote (HD) ### Ecosystem Evidence Multiple verified GitHub projects use this exact stack: - `g1forfun/Pi-Monitor` — Flask + Socket.IO + Chart.js (Pi 5 dashboard) - `Mohammed-Shehsin/sensehat-iot-dashboard` — Flask + real-time sensors - `idleCyrex/raspberry-pi-weather-station` — Flask + environmental monitoring - Multiple Raspberry Pi community tutorials (Cytron, official forums) ## Sources - **Flask-SocketIO PyPI** — Verified latest version 5.6.0 (Dec 2025), Python 3.8+ compatibility - **piwheels.org** — Verified Flask-SocketIO 5.6.0 available for Raspberry Pi OS - **GitHub g1forfun/Pi-Monitor** — Active project (last push Feb 2026), Flask + Socket.IO + Chart.js pattern - **GitHub sensehat-iot-dashboard** — Real-time sensor example with Flask - **Cytron.io tutorial** — "Create a Real-Time Raspberry Pi Dashboard" (Dec 2025), Flask + Chart.js + psutil - **Multiple Raspberry Pi forum discussions** — Confirmed Flask + Socket.IO is the community standard for sensor dashboards --- *Stack research for: Raspberry Pi RTU Web Interface* *Researched: 2026-03-12*