docs: complete project research
This commit is contained in:
157
.planning/research/STACK.md
Normal file
157
.planning/research/STACK.md
Normal file
@@ -0,0 +1,157 @@
|
||||
# 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*
|
||||
Reference in New Issue
Block a user