11 KiB
Project Research Summary
Project: TCKRTUIYO - Rainfall Station RTU Web Interface Domain: Embedded IoT/Web Monitoring Systems Researched: 2026-03-12 Confidence: HIGH
Executive Summary
This is a Raspberry Pi-based web monitoring interface for rainfall telemetry. The system reads tipping bucket sensors, displays real-time data on a 7-inch touchscreen (kiosk mode), and transmits CSV files to a remote myvscada server. The target hardware is Pi Zero 2 W with ~512MB RAM — significantly constrained compared to typical web servers.
Recommended approach: Build a vertical slice first (sensor → API → basic UI), then layer features. Use Flask with Flask-SocketIO for real-time updates, Bootstrap for responsive touchscreen layouts, and Chart.js for future historical graphs. The architecture follows a clear three-tier pattern: Web Layer (dual ports 8080/9090), API Layer (blueprint-based Flask routes), and Service Layer (Sensor, Data, Network, Config services).
Key risks to mitigate:
- Performance on Pi Zero 2 W — Flask dev server will be unusable; must use eventlet workers and optimize imports
- SD card corruption — Continuous CSV writes destroy SD cards; use SQLite or buffered writes with tmpfs
- Chromium kiosk instability — Updates break kiosk mode; pin version and add watchdog script
- Silent data transmission failures — FTP/SFTP failures must be visible in UI, not just logged
Key Findings
Recommended Stack
Core technologies:
- Flask 3.1.0 — Lightweight web framework, ~15MB RAM vs Django's 80MB+
- Flask-SocketIO 5.6.0 — Real-time server-push for live sensor updates
- Chart.js 4.4.x — Canvas-based charting, GPU-accelerated on Pi
- Bootstrap 5.3.x — Touchscreen-friendly grid system, ~200KB
- Python 3.11+ — Raspberry Pi OS Bookworm ships with 3.11
Supporting libraries:
- eventlet 0.40+ — Required for Flask-SocketIO production (not gunicorn threading)
- paramiko 3.5+ — SFTP/SCP file transmission
- psutil 6.1.0 — System health monitoring
- pyserial 3.5 — Sensor communication
What NOT to use: Django (too heavy), FastAPI (unnecessary Pydantic overhead), React/Vue/Angular (build step + memory intensive), Node.js (breaks Python sensor stack), InfluxDB+Grafana (too heavy for Pi Zero).
Expected Features
Must have (table stakes):
- Real-time rainfall display (Today, Hourly, MAR Acc, Yearly Acc)
- Voltage monitoring (battery and solar)
- Date/time and station identification
- Communication status (RSSI, connection state)
- Main menu navigation for 7" touchscreen
- Settings configuration (thresholds, network, calibration)
- Calibration view (live sensor readings)
- File management (CSV navigation/deletion)
Should have (differentiators):
- Historical data graphs (Chart.js on Pi Zero is viable with limited data points)
- Configurable alarm thresholds with visual indicators
- Touch-optimized UI (minimum 48px touch targets, 64px for primary)
- Dual-mode display (single codebase serves kiosk 1024x600 and remote HD)
- Real-time Socket.IO push (live updates without page refresh)
- CSV transmission status (last sync time, pending count)
Defer (v2+):
- Multi-station dashboard (server-side aggregation)
- Cloud data storage (direct CSV transmission is the model)
- Video streaming (not in spec)
- SMS/email alerts (future server-side feature)
- Data export from browser (low priority)
Architecture Approach
The system follows a three-tier architecture with clear component boundaries:
- Web Layer (Dual Port) — Port 8080 for kiosk (no auth, fixed 1024x600), Port 9090 for remote (auth required, responsive HD)
- API Layer — Flask blueprints for routes:
/api/status,/api/sensors,/api/settings,/api/files,/api/calibration - Service Layer — SensorService (GPIO/ADC polling), DataLogger (CSV write), NetworkService (FTP/SFTP), ConfigService (JSON files)
Data flow: Timer → Sensor Service reads hardware → Update in-memory state → DataLogger writes CSV → API returns JSON → Web layer displays
Build order: Foundation (sensor→API→basic UI) → Local Interface (settings, calibration) → Data Persistence (CSV logging, transmission) → Remote Access (auth, responsive)
Critical Pitfalls
-
Flask performance on Pi Zero — Dev server takes 60+ seconds to start, blocks on every request. Avoid: Use eventlet workers, pre-compile templates, cache static assets, implement SSE instead of polling.
-
Chromium kiosk instability — Updates replace version, Wayland/X11 differences break flags, session restore prompts interrupt. Avoid: Pin Chromium version (
apt-mark hold), use X11 instead of Wayland, add watchdog script, test after every system update. -
SD card corruption — Continuous CSV writes cause wear, power loss corrupts filesystem. Avoid: Mount
/var/logand/tmpas tmpfs, write to memory buffer and flush every 5 minutes, use SQLite with WAL mode, implement shutdown button, disable swap. -
Touchscreen unresponsiveness — 7-inch display has 33Hz polling rate, causing lag. Avoid: Set
gpu_mem=128, design 64px touch targets, provide immediate visual feedback, avoid rapid-fire interactions. -
Network transmission failures silent — FTP/SFTP fails but only logged, not surfaced to UI. Avoid: Implement retry queue with exponential backoff, verify server receipt, show transmission status prominently, dead-letter alert after N failures.
-
Stale data without notification — Dashboard shows old readings with no indication. Avoid: Always display "last updated" timestamp, use Socket.IO for live updates, add backend health check, show warning if sensor reader hasn't updated in X minutes.
Implications for Roadmap
Based on research, suggested phase structure:
Phase 1: Foundation & Kiosk UI
Rationale: Must prove sensor-to-display works before adding persistence or networking. This is a vertical slice — each layer works end-to-end before adding features.
Delivers:
- Hardware interface (GPIO/ADC)
- Sensor service with live readings
- Basic API (status, sensors endpoints)
- Minimal dashboard UI (rainfall, voltage, time, station ID)
- Port 8080 kiosk server with Chromium autostart
Addresses: FEATURES table stakes — dashboard display, voltage monitoring, date/time, station ID, main menu
Avoids: Pitfall 1 (Flask performance) — use eventlet from start, not as afterthought; Pitfall 4 (touchscreen lag) — test touch responsiveness early; Pitfall 6 (stale data) — show timestamps from day one
Research flag: Complex integration with sensor hardware — may need /gsd-research-phase for GPIO/ADC specifics if not already available from existing RTU.
Phase 2: Data Persistence
Rationale: CSV logging is the primary data workflow. Must establish proper storage before transmission. Avoids Pitfall 3 (SD card corruption) by designing correctly from the start.
Delivers:
- Data logger service with buffered writes
- SQLite or structured CSV storage
- tmpfs mounts for logs/tmp
- Settings UI and configuration persistence
- Calibration view UI
Addresses: FEATURES settings configuration, calibration view
Avoids: Pitfall 3 (SD card corruption) — implement tmpfs, buffered writes, proper shutdown
Research flag: Standard patterns — SQLite and CSV logging are well-documented. Skip deep research.
Phase 3: Network Transmission
Rationale: Data must reach myvscada server. Requires proven persistence layer first. Avoids Pitfall 5 (silent transmission failures) by building verification upfront.
Delivers:
- Network service with FTP/SFTP/SCP
- Transmission queue with retry logic
- Server receipt verification
- Transmission status UI (last sync, pending count)
- File management UI
Addresses: FEATURES file management, transmission status
Avoids: Pitfall 5 (silent failures) — queue with backoff, verification, UI visibility
Research flag: May need deeper research on myvscada server integration specifics (API, expected file format).
Phase 4: Remote Access
Rationale: Full HD remote interface is the "pro" experience. Can reuse most backend. Focus on responsive design and authentication.
Delivers:
- Port 9090 server with authentication
- Responsive templates for Full HD
- Historical graphs (Chart.js)
- Configurable alarm thresholds with visual indicators
Addresses: FEATURES historical graphs, threshold indicators, alarm threshold config, dual-mode display
Research flag: Standard Flask + Bootstrap patterns — skip deep research.
Phase Ordering Rationale
- Vertical slice first: Each layer works end-to-end before adding complexity
- Data before network: Can't transmit what hasn't been stored correctly
- Kiosk before remote: Local display is primary use case; remote is secondary
- Pitfall prevention: Each phase addresses specific pitfalls identified in research
Research Flags
Phases likely needing deeper research during planning:
- Phase 1: Sensor hardware integration — need specifics on existing RTU GPIO/ADC interface
- Phase 3: myvscada server API — format expectations, authentication, transmission protocol
Phases with standard patterns (skip research-phase):
- Phase 2: SQLite/CSV logging is well-documented
- Phase 4: Flask + Bootstrap responsive design is standard
Confidence Assessment
| Area | Confidence | Notes |
|---|---|---|
| Stack | HIGH | Verified with multiple GitHub projects using exact Flask+SocketIO+Chart.js pattern on Pi |
| Features | HIGH | Based on competitive analysis of Rainwise, Weather Display, Davis WeatherLink |
| Architecture | HIGH | Matches proven IoT/SCADA three-tier patterns, clear component boundaries |
| Pitfalls | HIGH | Documented from Raspberry Pi forums, Stack Exchange, community reports |
Overall confidence: HIGH
Gaps to Address
- Sensor hardware specifics: Research assumes GPIO/ADC interface available. Need to verify existing RTU sensor connection method.
- myvscada integration: Research assumes FTP/SFTP transmission but need to verify server requirements (path, authentication, file format).
- Touchscreen calibration: 33Hz polling rate is documented but may need tuning per unit.
Sources
Primary (HIGH confidence)
- GitHub g1forfun/Pi-Monitor — Active project (Feb 2026), Flask+SocketIO+Chart.js pattern
- Cytron.io tutorial — "Create a Real-Time Raspberry Pi Dashboard" (Dec 2025)
- Flask-SocketIO PyPI — Verified 5.6.0 release (Dec 2025), Python 3.8+ compatibility
- piwheels.org — Verified packages available for Raspberry Pi OS
Secondary (MEDIUM confidence)
- Raspberry Pi Forums — Kiosk mode issues, performance discussions
- Raspberry Pi Stack Exchange — Flask on Pi Zero W performance
- Multiple community tutorials — Confirms Flask is de facto standard
Tertiary (LOW confidence)
- GitHub Issue #3777 (raspberrypi/linux) — 7" touchscreen 33Hz polling (needs verification)
- Community reports on SD card corruption — patterns consistent but may vary by card quality
Research completed: 2026-03-12 Ready for roadmap: yes