HydroSense / ARCHITECTURE.md
dpv007's picture
Clean sample deploy
53c9876
# System Architecture
## Overview
The Water Quality Monitoring System follows a modern full-stack architecture using Next.js for both frontend and backend, MongoDB for data persistence, and MQTT for real-time sensor data ingestion.
## Architecture Diagram
```
┌─────────────────────────────────────────────────────────────────┐
│ PRESENTATION LAYER │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Next.js Frontend (React 18) │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ • SensorMap Component (Leaflet.js) │ │
│ │ • Dashboard with Charts (Recharts) │ │
│ │ • Real-time Updates (Polling) │ │
│ │ • Responsive UI (Tailwind CSS) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ HTTP/REST │
│ ▼ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ APPLICATION LAYER │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Next.js API Routes (Node.js) │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ GET /api/sensors - List all sensors │ │
│ │ POST /api/sensors - Create new sensor │ │
│ │ GET /api/readings - Get historical readings │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ │
│ ▼ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ DATA LAYER │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ MongoDB Database │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ • sensors collection │ │
│ │ - sensorId (indexed) │ │
│ │ - location (2dsphere index) │ │
│ │ │ │
│ │ • readings collection │ │
│ │ - sensorId + timestamp (compound index) │ │
│ │ - timestamp (indexed for queries) │ │
│ │ │ │
│ │ Retention: 5 years │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ▲ │
└───────────────────────────────┼──────────────────────────────────┘
┌───────────────────────────────┼──────────────────────────────────┐
│ INGESTION LAYER │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ MQTT Ingestion Service (Node.js) │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ • Subscribe to MQTT topics │ │
│ │ • Validate incoming readings │ │
│ │ • Store in MongoDB │ │
│ │ • Error handling & logging │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ MQTT Protocol │
│ │ │
└───────────────────────────────┼──────────────────────────────────┘
┌───────────────────────────────┼──────────────────────────────────┐
│ SENSOR LAYER │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Sensor 1 │ │ Sensor 2 │ │ Sensor N │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ • pH │ │ • pH │ │ • pH │ │
│ │ • Turbidity │ │ • Turbidity │ │ • Turbidity │ │
│ │ • Temp │ │ • Temp │ │ • Temp │ │
│ │ • Hardness │ │ • Hardness │ │ • Hardness │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ Fixed geographic locations │
│ Random transmission intervals │
└──────────────────────────────────────────────────────────────────┘
```
## Component Details
### 1. Frontend (React/Next.js)
**Key Components:**
- `SensorMap`: Main container component managing state
- `MapView`: Leaflet.js integration for interactive mapping
- `SensorDashboard`: Charts and statistics display
**Features:**
- Interactive global map with zoomable interface
- Marker clustering for performance
- Real-time data updates (30-second polling)
- Responsive design for mobile/desktop
- Time-series visualization with Recharts
**State Management:**
- React hooks (useState, useEffect)
- Local component state
- No Redux/Context needed (simple state)
### 2. API Layer (Next.js API Routes)
**Endpoints:**
```typescript
GET /api/sensors
Response: SensorWithLatestReading[]
- Returns all sensors with their most recent reading
- Efficient aggregation using MongoDB pipelines
GET /api/readings?sensorId=XXX&timeRange=1d
Response: Reading[]
- Time-filtered readings for a specific sensor
- Supports: 1h, 1d, 1w, 1m, custom ranges
- Optimized queries with indexed timestamps
POST /api/sensors
Request: { sensorId, latitude, longitude, locationName? }
Response: Sensor
- Create new sensor record
- Auto-generates installedAt timestamp
```
**Features:**
- RESTful design
- Input validation
- Error handling with proper status codes
- Connection pooling for MongoDB
### 3. MQTT Ingestion Service
**Responsibilities:**
- Subscribe to MQTT broker topics
- Parse and validate incoming JSON messages
- Store validated readings in MongoDB
- Log invalid/malformed messages
- Handle connection failures gracefully
**Data Validation:**
```javascript
{
sensorId: required,
timestamp: required (ISO date),
pH: 0-14,
turbidity: >= 0,
temperature: -50 to 100°C,
hardness: >= 0
}
```
**Error Handling:**
- Retry logic for MongoDB failures
- Graceful reconnection to MQTT broker
- Detailed error logging
### 4. Database (MongoDB)
**Collections:**
**sensors:**
```javascript
{
_id: ObjectId,
sensorId: "SENSOR_XXX_001",
latitude: 40.7128,
longitude: -74.0060,
locationName: "New York City",
installedAt: ISODate("2020-01-15")
}
```
Indexes:
- `{ sensorId: 1 }` - Unique index for lookups
- `{ location: "2dsphere" }` - Geospatial queries
**readings:**
```javascript
{
_id: ObjectId,
sensorId: "SENSOR_XXX_001",
timestamp: ISODate("2024-02-16T10:30:00Z"),
pH: 7.2,
turbidity: 3.5,
temperature: 22.1,
hardness: 150.0
}
```
Indexes:
- `{ sensorId: 1, timestamp: -1 }` - Compound index for sensor queries
- `{ timestamp: -1 }` - Time-based filtering
**Retention Policy:**
- TTL index for 5-year retention (future implementation)
- Archive strategy for historical data
## Data Flow
### 1. Sensor Reading Flow
```
Sensor Device
│ MQTT Publish
MQTT Broker (HiveMQ)
│ Subscribe
Ingestion Service
│ Validate
MongoDB (readings)
│ Query (via API)
Next.js Frontend
│ Render
User Browser
```
### 2. User Query Flow
```
User clicks sensor
Frontend fetches data
API Route handler
MongoDB query
Data aggregation
JSON response
Chart rendering
```
## Scalability Considerations
### Current Scale
- 10-100 sensors: Easily handled
- 1 reading/sensor/hour: ~240 readings/day per sensor
- 5 years retention: ~440K readings per sensor
### Scaling Strategies
**Horizontal Scaling:**
- Multiple MQTT ingestion workers
- Load balancer for Next.js instances
- MongoDB replica sets
**Vertical Scaling:**
- Increased server resources
- MongoDB sharding by sensorId
- Redis caching layer
**Optimization:**
- Data aggregation pre-computation
- CDN for static assets
- Query result caching
## Security Considerations
**Current Status (Development):**
- No authentication (as per PRD requirements)
- Public MQTT broker
- Open API endpoints
**Production Recommendations:**
- JWT authentication for APIs
- MQTT broker with TLS/SSL
- Role-based access control
- API rate limiting
- Input sanitization
- Environment variable protection
## Monitoring & Observability
**Recommended Tools:**
- Application logs (Winston/Pino)
- MongoDB Atlas monitoring
- MQTT broker metrics
- Error tracking (Sentry)
- Performance monitoring (New Relic)
**Key Metrics:**
- Sensor uptime
- Reading ingestion rate
- API response times
- Database query performance
- Error rates
## Technology Choices Rationale
| Technology | Reason |
|-----------|--------|
| Next.js | Full-stack framework, API routes, SSR/SSG |
| MongoDB | Flexible schema, time-series data, geospatial queries |
| MQTT | Lightweight, efficient for IoT, publish-subscribe |
| Leaflet | Open-source, customizable mapping |
| Recharts | React-friendly, responsive charts |
| TypeScript | Type safety, better developer experience |
## Future Enhancements
1. **Real-time Updates**: WebSocket integration
2. **Advanced Analytics**: ML-based anomaly detection
3. **Alerting System**: Email/SMS notifications
4. **Data Export**: CSV/PDF generation
5. **Mobile App**: React Native implementation
6. **Admin Panel**: Sensor management interface
7. **Authentication**: User accounts and permissions
8. **Caching Layer**: Redis for frequently accessed data
---
This architecture supports the current requirements while providing a foundation for future enhancements and scale.