23 KiB
Project Research Summary
Project: TCKRTUIYO - RTU Web Interface Domain: Embedded IoT/SCADA Web Interface for Rainfall Monitoring Researched: 2026-03-13 Confidence: HIGH
Executive Summary
This research covers the development of a web-based interface for a Remote Terminal Unit (RTU) used in rainfall monitoring, deployed on Raspberry Pi Zero 2 W hardware with constrained resources (1GHz quad-core, 512MB RAM). Based on comprehensive research across technology stacks, feature requirements, architecture patterns, and common pitfalls, the recommended approach is a React 19 + Vite 8 + Tailwind 4 stack, optimized for embedded kiosk deployment with aggressive performance budgets.
The RTU interface must serve dual purposes: a touch-optimized local dashboard on a 7" 1024x600 touchscreen display, and a responsive remote interface for desktop users. Experts in this domain emphasize hardware-aware development—the Pi Zero 2 W's limited resources demand strict bundle size budgets (<170KB initial JS), memory-bounded data handling (circular buffers, not unbounded state growth), and careful avoidance of performance anti-patterns that work fine on development machines but cripple embedded deployments. The architecture should follow a clean separation between presentation, state management, and hardware interface layers, with a Python backend handling GPIO/ADC operations and a React frontend communicating via REST API.
Critical risks include memory leaks from improper cleanup (fatal for 24/7 operation), layout thrashing from unoptimized re-renders, and kiosk-specific UX failures from designing for mouse rather than touch. These are all preventable with the right patterns: React.memo for dashboard components, proper useEffect cleanup, minimum 44px touch targets, and aggressive testing on actual Pi hardware throughout development—not just at the end.
Key Findings
Recommended Stack
For a production RTU interface on Pi Zero 2 W constraints, the stack prioritizes bundle size reduction and runtime performance while maintaining developer ergonomics. React 19 (not Preact) is recommended because shadcn/ui component library requires React ecosystem compatibility. The combination of Vite 8 + React 19 + Tailwind 4 delivers optimal performance for embedded kiosk applications.
Core technologies:
- React 19.2.4: UI rendering — 15-20% smaller than React 18, required for shadcn/ui compatibility, supports Concurrent Features for better performance
- Vite 8.0.0: Build tool — Fastest HMR, superior tree-shaking vs webpack, Rollup-based production builds optimized for embedded targets
- Tailwind CSS 4.2.0: Styling — Zero-runtime CSS with CSS variables + Vite plugin, ~3KB CSS for typical component set vs 100KB+ traditional CSS
- shadcn/ui: Component library — Headless UI components copy-pasted into repo (tree-shakeable), Radix UI primitives underneath
- React Router 7.x: Routing — Type-safe routing, data APIs, smaller than v6, non-breaking from v6
- Zustand 5.0.11: State management — ~1.1KB bundle, minimal boilerplate, no providers needed, excellent TypeScript support
Bundle size budget: <200KB total JS gzipped for initial load (leaves 30KB buffer for application code)
Performance optimizations required:
- Aggressive code splitting with manual chunks for react-vendor and router-vendor
- Drop console.* and debugger in production builds
- React.memo for dashboard components
- Debounce sensor data updates to 100-200ms
- Use CSS transforms instead of layout properties for animations
What NOT to use:
- Preact (incompatible with shadcn/ui despite smaller size)
- Redux Toolkit (15KB+ overhead vs Zustand's 1KB)
- TanStack Query (12KB+ for simple polling—use native fetch + Zustand instead)
- Material UI / Ant Design (100KB+ CSS-in-JS runtime)
- Create React App (deprecated, poor tree-shaking)
- Emotion / Styled Components (CSS-in-JS runtime overhead)
Expected Features
Based on analysis of existing RTU interfaces, IoT dashboard patterns, and project requirements.
Must have (table stakes):
- Real-time rainfall display (Today, Hourly, Monthly Acc, Yearly Acc) — core purpose of RTU, must update without page refresh
- Solar/Battery voltage monitoring — critical for field maintenance scheduling, color-coded warnings for low voltage
- Station identification (ID, coordinates, serial number) — multiple stations in field, visible on all screens
- Date/time display with sync status — large, readable format, essential for data timestamping
- Communication status (GPRS/Network) — remote stations need connectivity visibility, last sync timestamp
- Historical data viewing (24h time-series charts) — essential for hydrology analysis
- Device configuration (4 key categories: Rainfall, ADC, Network, GPRS) — field calibration necessary
- Data export (CSV download) — external analysis required for hydrology software integration
- Alarm indicators — visual/audible alerts for high rainfall, low battery, communication loss
Should have (competitive):
- Touch-optimized 7" UI (44px+ touch targets, finger-friendly) — most competitors use desktop-oriented interfaces
- Dual-mode display (1024x600 kiosk + Full HD remote) — single codebase serves both use cases
- Sub-1-second refresh — near real-time monitoring for critical events via WebSocket or SSE
- Extended time ranges (7d, 30d, 1y charts) — longer historical views for trend analysis
- Alarm threshold configuration — custom alerts for site-specific conditions
- Full settings suite (remaining 7 categories: Utility, Calibration, Flash, Mobile, EVAP, Level, Siren)
- One-touch calibration — guided wizard vs manual parameter entry
Defer (v2+):
- Offline data buffering with sync — adds significant complexity, cloud-only solutions handle this
- Multi-station dashboard — single-station focus for MVP
- Advanced analytics (rainfall intensity, accumulation rates) — complex, niche use cases
- Network protocol options (FTP/SCP/SFTP/WebDAV) — customer infrastructure requirements can wait
- Remote configuration API — third-party integration needs customer demand validation
Anti-features to avoid:
- Mobile app (responsive web works on all devices, no installation overhead)
- Cloud data storage (adds cost, connectivity dependency, latency, security concerns)
- Real-time 3D visualizations (heavy on Pi Zero resources, adds no analytical value)
- Multi-touch gestures (error-prone with gloved hands, outdoor use)
- Voice control (unreliable in outdoor/industrial noise)
- Predictive analytics/AI (overkill for rainfall monitoring)
Architecture Approach
Modern RTU web interfaces bridge physical sensors with human operators. The architecture balances real-time data visualization, configuration management, and remote accessibility while operating on constrained hardware. A layered architecture provides clear separation of concerns and enables testing at each level.
Major components:
- Presentation Layer — Dashboard UI, Settings UI (11 submenus), Calibration UI, Navigation/Router. Dashboard optimized for 1024x600, refresh every 1-5s.
- State Management Layer — Sensor Data Store (rainfall, voltage, ADC, status), Configuration Store (settings, calibration, network), UI Store (theme, layout mode). Uses Zustand for minimal overhead.
- Data Access Layer — Sensor API (real-time), Config API (CRUD), File Manager (CSV/Flash), Network API (FTP/SCP). Abstracts hardware communication via RESTful interface.
- Hardware Interface Layer — Rainfall sensor, ADC inputs (4-20mA), GPIO/Power monitoring, Network interface. Python backend handles GPIO access, serial communication, ADC reading.
Key patterns to follow:
- Dual-Mode Display Architecture: Single codebase supporting kiosk mode (1024x600, touch-optimized) and remote mode (Full HD, desktop-friendly). Detection via viewport or port (8080=kiosk, 9090=remote).
- Polling-Based Real-Time Updates: Periodic data fetching (1-5s interval) with optimistic UI updates. Use when WebSocket is unavailable or too resource-intensive for embedded hardware.
- Offline-First Configuration: Configuration changes persisted locally first (localStorage), synced to backend asynchronously. Critical for intermittent network connectivity.
Project structure:
components/ui/— shadcn/ui base components (copy-paste ready)components/dashboard/— Dashboard-specific components optimized for 7" displaycomponents/settings/— Modular settings forms, one per configuration categoryhooks/— Custom React hooks for data fetching and hardware interactionstores/— Zustand stores for sensor data, configuration, UI stateservices/— API abstraction layer for hardware communicationviews/— Page-level components corresponding to routes (Dashboard, Settings/*, Calibration, FlashMemory)
Anti-patterns to avoid:
- Heavy frameworks on embedded (Next.js, Redux) — Pi Zero has limited RAM
- Real-time everything (constant polling) — drains battery, saturates network
- Tight hardware coupling (direct GPIO access from JavaScript) — security risk, platform lock-in
- Ignoring kiosk constraints (designing for desktop) — 1024x600 is cramped, no right-click menus
Critical Pitfalls
Research identified 8 critical pitfalls specific to RTU interfaces on Raspberry Pi, all preventable with the right patterns and testing.
-
Ignoring Hardware Performance Constraints — Developers build on powerful machines, deploy to Pi Zero where code runs at 2-5 FPS. Avoid: Set hard budgets (<170KB JS, <2s LCP), test on actual hardware weekly, use Chrome DevTools Performance throttling (6x CPU slowdown approximates Pi Zero).
-
Unbounded Real-Time Data Accumulation — Dashboard polls every 1-5 seconds, stores all data in React state. After 24-48 hours, browser crashes from memory pressure. Avoid: Implement circular buffers (keep only last N points, e.g., 1000 points = ~20 minutes), store historical data in SQLite/file system, add
document.visibilitycheck to pause polling when tab hidden. -
Layout Thrashing from Unoptimized Re-renders — Sensor updates trigger React re-renders of entire tree, causing forced reflow. On Pi Zero, creates jank/jerky animations. Avoid: Memoize components with
React.memo, useuseMemofor expensive calculations, colocate state (not global), use CSS transforms instead of layout properties, debounce visual updates to 30fps max. -
Blocking Main Thread with Synchronous Operations — CSV file operations, data serialization run on main thread. During 100-500ms operations, UI becomes completely unresponsive. Avoid: Use Web Workers for all CSV processing, yield to main thread with
setTimeout(..., 0), stream CSV data instead of loading entire file, useperformance.mark()to identify long tasks (>50ms). -
Kiosk Mode UI Anti-Patterns — Dashboard designed for mouse/keyboard deployed to 7" touchscreen. Buttons too small, hover states don't work, users get trapped in deep settings. Avoid: Minimum 48x48px touch targets (Apple HIG) or 44x44px (Material Design), use
:activenot just:hover, always show back button in settings sub-pages, test with actual fingers on target display size. -
Not Handling Browser Resource Throttling — Dashboard works during active use, but when idle for hours, Chromium throttles timers. Real-time sensor data stops updating. Avoid: Implement Page Visibility API to adjust behavior when
document.hidden, use Web Workers for background processing (not throttled), add visual indicator showing "live" vs "stale" data. -
Memory Leaks from Event Listeners and Subscriptions — Component mounts add listeners/WebSockets, unmounts don't clean up. Memory grows with each navigation cycle. Avoid: Always return cleanup function from useEffect, use
AbortControllerfor fetch cancellation, remove all addEventListener with matching removeEventListener, use React StrictMode during development (double-mounts expose leaks). -
Choking the Pixel Pipeline with Expensive CSS — Heavy effects (box-shadow, backdrop-filter) trigger expensive paint/composite operations. On Pi Zero's GPU, results in dropped frames. Avoid: Prefer
transformandopacityfor animations, avoidbackdrop-filterentirely on Pi Zero (software fallback), use Chrome DevTools Layers panel to diagnose layer count, limit simultaneous animations to 2-3 elements.
"Looks Done But Isn't" checklist:
- Dashboard loads: Tested on actual Pi Zero 2 W hardware, not just dev machine
- Memory bounded: Running for 24+ hours without memory growth
- Touch optimized: All interactions tested with finger on 7" touchscreen
- Kiosk configured: Chromium flags set for kiosk mode
- Performance budget met: <170KB initial JS, <2s LCP on target hardware
- No layout thrashing: Chrome DevTools Performance shows minimal purple (layout) bars
- Visibility aware: Page handles backgrounding/throttling correctly
- Cleanup implemented: All useEffect hooks have proper cleanup functions
Implications for Roadmap
Based on combined research, the following phase structure is recommended to build the RTU interface while avoiding critical pitfalls:
Phase 1: Foundation & MVP Dashboard
Rationale: Core dependencies and infrastructure must be established first. Dashboard is the primary user-facing feature and has the most stringent performance requirements. Addressing performance pitfalls early prevents costly rework.
Delivers:
- Project setup with Vite 8, React 19, TypeScript, Tailwind 4, shadcn/ui
- Basic routing and layout structure
- Sensor data API integration layer
- Dashboard with real-time rainfall display, voltage monitoring, station info header
- 24-hour historical chart
- Performance budget validated on Pi Zero 2 W hardware
Uses: React 19, Vite 8, Tailwind 4, shadcn/ui, React Router 7, Zustand
Addresses (from FEATURES.md): Real-time rainfall display, solar/battery monitoring, station info header, 24-hour historical chart
Avoids (from PITFALLS.md): Hardware performance constraints, layout thrashing, kiosk mode UI anti-patterns, memory leaks, expensive CSS
Research flag: Standard patterns—no additional research needed. Use established React/Vite patterns.
Phase 2: Data Persistence & Settings Framework
Rationale: Settings infrastructure is required before implementing individual settings categories. Data persistence layer must handle bounded memory from day one (circular buffers). Builds on dashboard's sensor data layer.
Delivers:
- Settings navigation and layout framework
- Form components with validation
- Configuration store (Zustand) with localStorage persistence
- Offline-first configuration pattern
- Basic settings: Station Info, Date/Time, Network Setup
- Data retention policies and circular buffer implementation
Uses: Zustand stores, localStorage/IndexedDB, form validation utilities
Addresses (from FEATURES.md): Key settings categories (4), basic device configuration
Avoids (from PITFALLS.md): Unbounded data accumulation, memory leaks, offline resilience gaps
Research flag: Standard patterns—configuration management is well-documented. Test circular buffer implementation on Pi hardware.
Phase 3: Extended Settings & CSV Workflow
Rationale: Complete the settings suite with remaining categories. CSV export is a medium-complexity feature requiring file operations that must not block the main thread.
Delivers:
- Remaining settings categories: ADC, Rainfall, GPRS, Utility, Calibration, Flash, Mobile, EVAP, Level, Siren
- CSV data export functionality
- File manager view (Flash/USB)
- Web Workers for CSV processing
- Progress indicators for async operations
Uses: Web Workers, FileReader API, CSV parsing libraries
Addresses (from FEATURES.md): Full settings suite, CSV data export, data export
Avoids (from PITFALLS.md): Blocking main thread with synchronous operations, memory leaks from file operations
Research flag: May need research on CSV libraries compatible with Web Workers and Pi Zero constraints.
Phase 4: Network Stack & Remote Access
Rationale: Network protocols and remote access features are complex and can be deferred until core functionality is stable. Requires careful handling of browser throttling for long-running connections.
Delivers:
- Network protocol options (FTP/SCP/SFTP/WebDAV) for data push
- Dual-mode display implementation (kiosk vs remote detection)
- Page Visibility API implementation for background handling
- Network status detection and offline indicators
- Remote server integration (HTTP POST / MQTT for data transmission)
Uses: Background services, HTTP clients, MQTT if applicable
Addresses (from FEATURES.md): Dual-mode display, network protocol options
Avoids (from PITFALLS.md): Browser resource throttling, network status detection mistakes
Research flag: May need research on specific protocol implementations (FTP/SCP/SFTP/WebDAV) for embedded Linux.
Phase 5: Advanced Features & Polish
Rationale: Alarm system and calibration wizard add significant value but are not required for core functionality. Can be added once MVP is stable and validated.
Delivers:
- Alarm threshold configuration
- Visual/audible alarm indicators
- Calibration wizard (ADC channel calibration, level sensor calibration)
- Extended time ranges (7d, 30d, 1y charts)
- Touch optimization refinements
- Performance tuning based on field feedback
Uses: Threshold logic, wizard pattern, chart extensions
Addresses (from FEATURES.md): Alarm thresholds, calibration wizard, extended time ranges, touch optimization
Avoids (from PITFALLS.md): Memory leaks from alarm subscriptions, layout thrashing from chart updates
Research flag: Standard patterns—wizard and threshold logic are well-established.
Phase Ordering Rationale
-
Dashboard First: The dashboard is the core value proposition and has the strictest performance requirements. Validating performance on Pi hardware early prevents costly architectural changes later.
-
Settings Framework Before Individual Settings: The settings navigation and form infrastructure is a prerequisite for all 11 settings categories. Building the framework first enables parallel development of individual settings.
-
CSV Before Network Protocols: CSV export is simpler and shares file handling logic with the network stack. Mastering file operations in CSV phase informs the more complex network protocol implementations.
-
Remote Access Last: Network protocols and dual-mode display are valuable but not required for core RTU functionality. They add complexity (background services, protocol handling) that can be deferred.
-
Pitfall Avoidance Throughout: Each phase explicitly addresses specific pitfalls from research. Performance testing in Phase 1, bounded memory in Phase 2, non-blocking operations in Phase 3, throttling handling in Phase 4.
Research Flags
Phases likely needing deeper research during planning:
- Phase 3 (CSV Workflow): Specific CSV libraries compatible with Web Workers and Pi Zero memory constraints. Streaming CSV parsing vs loading entire file.
- Phase 4 (Network Stack): FTP/SCP/SFTP/WebDAV implementation options for embedded Linux. Python libraries vs shell commands. Security implications of each protocol.
Phases with standard patterns (skip research-phase):
- Phase 1 (MVP Dashboard): Well-established React/Vite/shadcn/ui patterns. Performance optimization strategies are documented.
- Phase 2 (Settings Framework): Form handling and state management are standard React patterns. Zustand usage is well-documented.
- Phase 5 (Advanced Features): Wizard and threshold logic are standard UI patterns. No domain-specific research needed.
Confidence Assessment
| Area | Confidence | Notes |
|---|---|---|
| Stack | HIGH | All technologies verified with official sources (React 19.2.4, Vite 8.0.0, Tailwind 4.2.0, React Router 7, Zustand 5.0.11). Bundle size claims verified via bundlephobia. |
| Features | HIGH | Based on analysis of existing codebase (16 view components), ThingsBoard and Grafana dashboard patterns, industrial HMI design principles, and project requirements from PROJECT.md. |
| Architecture | HIGH | Patterns drawn from React/Vite documentation, shadcn/ui architecture, SCADA system patterns, and existing codebase structure. Layered architecture is standard for embedded systems. |
| Pitfalls | HIGH | Sources include web.dev performance docs (Google), MDN Web Performance, React documentation, and Chromium kiosk mode behavior. Hardware specs verified. |
Overall confidence: HIGH
All research areas have high confidence due to multiple authoritative sources and verification of specific versions. The stack recommendations are current as of research date (March 2026). The embedded/IoT domain has well-established patterns for constrained hardware deployment.
Gaps to Address
-
Hardware API Specification: Research assumes REST API to Python backend, but specific endpoint contracts and data formats need definition during requirements phase. Coordinate with Python backend team.
-
CSV Library Selection: Specific library for CSV processing (Papa Parse, d3-dsv, custom) needs evaluation during Phase 3 planning. Must support Web Workers and streaming for Pi Zero constraints.
-
Network Protocol Prioritization: Order of implementing FTP/SCP/SFTP/WebDAV should be determined by customer requirements. Not all may be needed for MVP.
-
Touchscreen Hardware Details: Exact touchscreen specifications (resistive vs capacitive, bezel size) may affect touch target sizing recommendations. Validate 44px minimum on actual hardware.
-
Chromium Version on Target OS: Kiosk mode flags and throttling behavior may vary by Chromium version on Raspberry Pi OS. Verify during Phase 1 testing on actual hardware.
-
Backup/Recovery Strategy: Research focused on runtime behavior. Backup/recovery of configuration and data needs definition during architecture phase.
Sources
Primary (HIGH confidence)
- React 19 Documentation (react.dev) — React 19 features, Concurrent Features, bundle size
- React GitHub Releases (v19.2.4, Jan 26 2026) — Version verification
- Vite Documentation (vitejs.dev) — Vite 8.0.0 configuration, build optimization
- Tailwind CSS Documentation (tailwindcss.com) — Tailwind 4.2.0 installation with Vite, zero-runtime CSS
- React Router Documentation (reactrouter.com) — React Router 7 features, migration from v6
- Zustand GitHub Releases (v5.0.11, Feb 2026) — State management patterns
- web.dev Performance Budgets 101 — Bundle size guidelines
- web.dev Optimize LCP/INP — Performance metrics
- MDN Page Visibility API — Background tab handling
- Raspberry Pi Zero 2 W Specifications — Hardware constraints (1GHz quad-core, 512MB RAM)
Secondary (MEDIUM confidence)
- shadcn/ui Documentation — Component library patterns (no semantic versioning, tracks Radix releases)
- ThingsBoard IoT Dashboard Documentation — Dashboard patterns for IoT devices
- Grafana Dashboard Best Practices — Time-series visualization patterns
- Inductive Automation HMI Resources — Industrial HMI design principles
- Chromium Kiosk Mode documentation — Resource throttling behavior (some variation by version)
- Industrial touchscreen UX research — 44px minimum touch targets, no hover states
Tertiary (LOW confidence)
- Existing codebase analysis (16 view components) — Domain-specific requirements validation
- Project requirements from PROJECT.md — Validated requirements and constraints
Research completed: 2026-03-13 Ready for roadmap: yes