7.9 KiB
7.9 KiB
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
# 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 sensorsidleCyrex/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