547 lines
16 KiB
Markdown
547 lines
16 KiB
Markdown
# Projects System Implementation - Terra-View
|
|
|
|
## Overview
|
|
|
|
The Projects system has been successfully scaffolded in Terra-View. This document provides a complete overview of what has been built, how it works, and what needs to be completed.
|
|
|
|
## ✅ Completed Components
|
|
|
|
### 1. Database Schema
|
|
|
|
**Location**: `/backend/models.py`
|
|
|
|
Seven new tables have been added:
|
|
|
|
- **ProjectType**: Template definitions for project types (Sound, Vibration, Combined)
|
|
- **Project**: Top-level project organization with type reference
|
|
- **MonitoringLocation**: Generic locations (NRLs for sound, monitoring points for vibration)
|
|
- **UnitAssignment**: Links devices to locations
|
|
- **ScheduledAction**: Automated recording control schedules
|
|
- **RecordingSession**: Tracks actual recording/monitoring sessions
|
|
- **DataFile**: File references for downloaded data
|
|
|
|
**Key Features**:
|
|
- Type-aware design (project_type_id determines features)
|
|
- Flexible metadata fields (JSON columns for type-specific data)
|
|
- Denormalized fields for efficient queries
|
|
- Proper indexing on foreign keys
|
|
|
|
### 2. Service Layer
|
|
|
|
#### SLMM Client (`/backend/services/slmm_client.py`)
|
|
- Clean wrapper for all SLMM API operations
|
|
- Methods for: start/stop/pause/resume recording, get status, configure devices
|
|
- Error handling with custom exceptions
|
|
- Singleton pattern for easy access
|
|
|
|
#### Device Controller (`/backend/services/device_controller.py`)
|
|
- Routes commands to appropriate backend (SLMM for SLMs, SFM for seismographs)
|
|
- Unified interface across device types
|
|
- Ready for future SFM implementation
|
|
|
|
#### Scheduler Service (`/backend/services/scheduler.py`)
|
|
- Background task that checks for pending scheduled actions every 60 seconds
|
|
- Executes actions by calling device controller
|
|
- Creates/updates recording sessions
|
|
- Tracks execution status and errors
|
|
- Manual execution support for testing
|
|
|
|
### 3. API Routers
|
|
|
|
#### Projects Router (`/backend/routers/projects.py`)
|
|
Endpoints:
|
|
- `GET /api/projects/list` - Project list with stats
|
|
- `GET /api/projects/stats` - Overview statistics
|
|
- `POST /api/projects/create` - Create new project
|
|
- `GET /api/projects/{id}` - Get project details
|
|
- `PUT /api/projects/{id}` - Update project
|
|
- `DELETE /api/projects/{id}` - Archive project
|
|
- `GET /api/projects/{id}/dashboard` - Project dashboard data
|
|
- `GET /api/projects/types/list` - Get project type templates
|
|
|
|
#### Project Locations Router (`/backend/routers/project_locations.py`)
|
|
Endpoints:
|
|
- `GET /api/projects/{id}/locations` - List locations
|
|
- `POST /api/projects/{id}/locations/create` - Create location
|
|
- `PUT /api/projects/{id}/locations/{location_id}` - Update location
|
|
- `DELETE /api/projects/{id}/locations/{location_id}` - Delete location
|
|
- `GET /api/projects/{id}/assignments` - List unit assignments
|
|
- `POST /api/projects/{id}/locations/{location_id}/assign` - Assign unit
|
|
- `POST /api/projects/{id}/assignments/{assignment_id}/unassign` - Unassign unit
|
|
- `GET /api/projects/{id}/available-units` - Get units available for assignment
|
|
|
|
#### Scheduler Router (`/backend/routers/scheduler.py`)
|
|
Endpoints:
|
|
- `GET /api/projects/{id}/scheduler/actions` - List scheduled actions
|
|
- `POST /api/projects/{id}/scheduler/actions/create` - Create action
|
|
- `POST /api/projects/{id}/scheduler/schedule-session` - Schedule recording session
|
|
- `PUT /api/projects/{id}/scheduler/actions/{action_id}` - Update action
|
|
- `POST /api/projects/{id}/scheduler/actions/{action_id}/cancel` - Cancel action
|
|
- `DELETE /api/projects/{id}/scheduler/actions/{action_id}` - Delete action
|
|
- `POST /api/projects/{id}/scheduler/actions/{action_id}/execute` - Manual execution
|
|
- `GET /api/projects/{id}/scheduler/status` - Scheduler status
|
|
- `POST /api/projects/{id}/scheduler/execute-pending` - Trigger pending executions
|
|
|
|
### 4. Frontend
|
|
|
|
#### Main Page
|
|
**Location**: `/templates/projects/overview.html`
|
|
|
|
Features:
|
|
- Summary statistics cards (projects, locations, assignments, sessions)
|
|
- Tabbed interface (All, Active, Completed, Archived)
|
|
- Project cards grid layout
|
|
- Create project modal with two-step flow:
|
|
1. Select project type (Sound/Vibration/Combined)
|
|
2. Fill project details
|
|
- HTMX-powered dynamic updates
|
|
|
|
#### Navigation
|
|
**Location**: `/templates/base.html` (updated)
|
|
- "Projects" link added to sidebar
|
|
- Active state highlighting
|
|
|
|
### 5. Application Integration
|
|
|
|
**Location**: `/backend/main.py`
|
|
|
|
- Routers registered
|
|
- Page route added (`/projects`)
|
|
- Scheduler service starts on application startup
|
|
- Scheduler stops on application shutdown
|
|
|
|
### 6. Database Initialization
|
|
|
|
**Script**: `/backend/init_projects_db.py`
|
|
|
|
- Creates all project tables
|
|
- Populates ProjectType with default templates
|
|
- ✅ Successfully executed - database is ready
|
|
|
|
---
|
|
|
|
## 📁 File Organization
|
|
|
|
```
|
|
terra-view/
|
|
├── backend/
|
|
│ ├── models.py [✅ Updated]
|
|
│ ├── init_projects_db.py [✅ Created]
|
|
│ ├── main.py [✅ Updated]
|
|
│ ├── routers/
|
|
│ │ ├── projects.py [✅ Created]
|
|
│ │ ├── project_locations.py [✅ Created]
|
|
│ │ └── scheduler.py [✅ Created]
|
|
│ └── services/
|
|
│ ├── slmm_client.py [✅ Created]
|
|
│ ├── device_controller.py [✅ Created]
|
|
│ └── scheduler.py [✅ Created]
|
|
├── templates/
|
|
│ ├── base.html [✅ Updated]
|
|
│ ├── projects/
|
|
│ │ └── overview.html [✅ Created]
|
|
│ └── partials/
|
|
│ └── projects/ [📁 Created, empty]
|
|
└── data/
|
|
└── seismo_fleet.db [✅ Tables created]
|
|
```
|
|
|
|
---
|
|
|
|
## 🔨 What Still Needs to be Built
|
|
|
|
### 1. Frontend Templates (Partials)
|
|
|
|
**Directory**: `/templates/partials/projects/`
|
|
|
|
**Required Files**:
|
|
|
|
#### `project_stats.html`
|
|
Stats cards for overview page:
|
|
- Total/Active/Completed projects
|
|
- Total locations
|
|
- Assigned units
|
|
- Active sessions
|
|
|
|
#### `project_list.html`
|
|
Project cards grid:
|
|
- Project name, type, status
|
|
- Location count, unit count
|
|
- Active session indicator
|
|
- Link to project dashboard
|
|
|
|
#### `project_dashboard.html`
|
|
Main project dashboard panel with tabs:
|
|
- Summary stats
|
|
- Active locations and assignments
|
|
- Upcoming scheduled actions
|
|
- Recent sessions
|
|
|
|
#### `location_list.html`
|
|
Location cards/table:
|
|
- Location name, type, coordinates
|
|
- Assigned unit (if any)
|
|
- Session count
|
|
- Assign/unassign button
|
|
|
|
#### `assignment_list.html`
|
|
Unit assignment table:
|
|
- Unit ID, device type
|
|
- Location name
|
|
- Assignment dates
|
|
- Status
|
|
- Unassign button
|
|
|
|
#### `scheduler_agenda.html`
|
|
Calendar/agenda view:
|
|
- Scheduled actions sorted by time
|
|
- Action type (start/stop/download)
|
|
- Location and unit
|
|
- Status indicator
|
|
- Cancel/execute buttons
|
|
|
|
### 2. Project Dashboard Page
|
|
|
|
**Location**: `/templates/projects/project_dashboard.html`
|
|
|
|
Full project detail page with:
|
|
- Header with project name, type, status
|
|
- Tab navigation (Dashboard, Scheduler, Locations, Units, Data, Settings)
|
|
- Tab content areas
|
|
- Modals for adding locations, scheduling sessions
|
|
|
|
### 3. Additional UI Components
|
|
|
|
- Project type selection cards (with icons)
|
|
- Location creation modal
|
|
- Unit assignment modal
|
|
- Schedule session modal (with date/time picker)
|
|
- Data file browser
|
|
|
|
### 4. SLMM Enhancements
|
|
|
|
**Location**: `/slmm/app/routers.py` (SLMM repo)
|
|
|
|
New endpoint needed:
|
|
```python
|
|
POST /api/nl43/{unit_id}/ftp/download
|
|
```
|
|
|
|
This should:
|
|
- Accept destination_path and files list
|
|
- Connect to SLM via FTP
|
|
- Download specified files
|
|
- Save to Terra-View's `data/Projects/` directory
|
|
- Return file list with metadata
|
|
|
|
### 5. SFM Client (Future)
|
|
|
|
**Location**: `/backend/services/sfm_client.py` (to be created)
|
|
|
|
Similar to SLMM client, but for seismographs:
|
|
- Get seismograph status
|
|
- Start/stop recording
|
|
- Download data files
|
|
- Integrate with device controller
|
|
|
|
---
|
|
|
|
## 🚀 Testing the System
|
|
|
|
### 1. Start Terra-View
|
|
|
|
```bash
|
|
cd /home/serversdown/tmi/terra-view
|
|
# Start Terra-View (however you normally start it)
|
|
```
|
|
|
|
Verify in logs:
|
|
```
|
|
Starting scheduler service...
|
|
Scheduler service started
|
|
```
|
|
|
|
### 2. Navigate to Projects
|
|
|
|
Open browser: `http://localhost:8001/projects`
|
|
|
|
You should see:
|
|
- Summary stats cards (all zeros initially)
|
|
- Tabs (All Projects, Active, Completed, Archived)
|
|
- "New Project" button
|
|
|
|
### 3. Create a Project
|
|
|
|
1. Click "New Project"
|
|
2. Select a project type (e.g., "Sound Monitoring")
|
|
3. Fill in details:
|
|
- Name: "Test Sound Project"
|
|
- Client: "Test Client"
|
|
- Start Date: Today
|
|
4. Submit
|
|
|
|
### 4. Test API Endpoints
|
|
|
|
```bash
|
|
# Get project types
|
|
curl http://localhost:8001/api/projects/types/list
|
|
|
|
# Get projects list
|
|
curl http://localhost:8001/api/projects/list
|
|
|
|
# Get project stats
|
|
curl http://localhost:8001/api/projects/stats
|
|
```
|
|
|
|
### 5. Test Scheduler Status
|
|
|
|
```bash
|
|
curl http://localhost:8001/api/projects/{project_id}/scheduler/status
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 Dataflow Examples
|
|
|
|
### Creating and Scheduling a Recording Session
|
|
|
|
1. **User creates project** → Project record in DB
|
|
2. **User adds NRL** → MonitoringLocation record
|
|
3. **User assigns SLM to NRL** → UnitAssignment record
|
|
4. **User schedules recording** → 2 ScheduledAction records (start + stop)
|
|
5. **Scheduler runs every minute** → Checks for pending actions
|
|
6. **Start action time arrives** → Scheduler calls SLMM via device controller
|
|
7. **SLMM sends TCP command to SLM** → Recording starts
|
|
8. **RecordingSession created** → Tracks the session
|
|
9. **Stop action time arrives** → Scheduler stops recording
|
|
10. **Session updated** → stopped_at, duration_seconds filled
|
|
11. **User triggers download** → Files copied to `data/Projects/{project_id}/sound/{nrl_name}/`
|
|
12. **DataFile records created** → Track file references
|
|
|
|
---
|
|
|
|
## 🎨 UI Design Patterns
|
|
|
|
### Established Patterns (from SLM dashboard):
|
|
|
|
1. **Stats Cards**: 4-column grid, auto-refresh every 30s
|
|
2. **Sidebar Lists**: Searchable, filterable, auto-refresh
|
|
3. **Main Panel**: Large central area for details
|
|
4. **Modals**: Centered, overlay background
|
|
5. **HTMX**: All dynamic updates, minimal JavaScript
|
|
6. **Tailwind**: Consistent styling with dark mode support
|
|
|
|
### Color Scheme:
|
|
|
|
- Primary: `seismo-orange` (#f48b1c)
|
|
- Secondary: `seismo-navy` (#142a66)
|
|
- Accent: `seismo-burgundy` (#7d234d)
|
|
|
|
---
|
|
|
|
## 🔧 Configuration
|
|
|
|
### Environment Variables
|
|
|
|
- `SLMM_BASE_URL`: SLMM backend URL (default: http://localhost:8100)
|
|
- `ENVIRONMENT`: "development" or "production"
|
|
|
|
### Scheduler Settings
|
|
|
|
Located in `/backend/services/scheduler.py`:
|
|
- `check_interval`: 60 seconds (adjust as needed)
|
|
|
|
---
|
|
|
|
## 📚 Next Steps
|
|
|
|
### Immediate (Get Basic UI Working):
|
|
1. Create partial templates (stats, lists)
|
|
2. Test creating projects via UI
|
|
3. Implement project dashboard page
|
|
|
|
### Short-term (Core Features):
|
|
4. Add location management UI
|
|
5. Add unit assignment UI
|
|
6. Add scheduler UI (agenda view)
|
|
|
|
### Medium-term (Data Flow):
|
|
7. Implement SLMM download endpoint
|
|
8. Test full recording workflow
|
|
9. Add file browser for downloaded data
|
|
|
|
### Long-term (Complete System):
|
|
10. Implement SFM client for seismographs
|
|
11. Add data visualization
|
|
12. Add project reporting
|
|
13. Add user authentication
|
|
|
|
---
|
|
|
|
## 🐛 Known Issues / TODOs
|
|
|
|
1. **Partial templates missing**: Need to create HTML templates for all partials
|
|
2. **SLMM download endpoint**: Needs implementation in SLMM backend
|
|
3. **Project dashboard page**: Not yet created
|
|
4. **SFM integration**: Placeholder only, needs real implementation
|
|
5. **File download tracking**: DataFile records not yet created after downloads
|
|
6. **Error handling**: Need better user-facing error messages
|
|
7. **Validation**: Form validation could be improved
|
|
8. **Testing**: No automated tests yet
|
|
|
|
---
|
|
|
|
## 📖 API Documentation
|
|
|
|
### Project Type Object
|
|
```json
|
|
{
|
|
"id": "sound_monitoring",
|
|
"name": "Sound Monitoring",
|
|
"description": "...",
|
|
"icon": "volume-2",
|
|
"supports_sound": true,
|
|
"supports_vibration": false
|
|
}
|
|
```
|
|
|
|
### Project Object
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"name": "Project Name",
|
|
"description": "...",
|
|
"project_type_id": "sound_monitoring",
|
|
"status": "active",
|
|
"client_name": "Client Inc",
|
|
"site_address": "123 Main St",
|
|
"site_coordinates": "40.7128,-74.0060",
|
|
"start_date": "2024-01-15",
|
|
"end_date": null,
|
|
"created_at": "2024-01-15T10:00:00",
|
|
"updated_at": "2024-01-15T10:00:00"
|
|
}
|
|
```
|
|
|
|
### MonitoringLocation Object
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"project_id": "uuid",
|
|
"location_type": "sound",
|
|
"name": "NRL-001",
|
|
"description": "...",
|
|
"coordinates": "40.7128,-74.0060",
|
|
"address": "123 Main St",
|
|
"location_metadata": "{...}",
|
|
"created_at": "2024-01-15T10:00:00"
|
|
}
|
|
```
|
|
|
|
### UnitAssignment Object
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"unit_id": "nl43-001",
|
|
"location_id": "uuid",
|
|
"project_id": "uuid",
|
|
"device_type": "sound_level_meter",
|
|
"assigned_at": "2024-01-15T10:00:00",
|
|
"assigned_until": null,
|
|
"status": "active",
|
|
"notes": "..."
|
|
}
|
|
```
|
|
|
|
### ScheduledAction Object
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"project_id": "uuid",
|
|
"location_id": "uuid",
|
|
"unit_id": "nl43-001",
|
|
"action_type": "start",
|
|
"device_type": "sound_level_meter",
|
|
"scheduled_time": "2024-01-16T08:00:00",
|
|
"executed_at": null,
|
|
"execution_status": "pending",
|
|
"module_response": null,
|
|
"error_message": null
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🎓 Architecture Decisions
|
|
|
|
### Why Project Types?
|
|
Allows the system to scale to different monitoring scenarios (air quality, multi-hazard, etc.) without code changes. Just add a new ProjectType record and the UI adapts.
|
|
|
|
### Why Generic MonitoringLocation?
|
|
Instead of separate NRL and MonitoringPoint tables, one table with a `location_type` discriminator keeps the schema clean and allows for combined projects.
|
|
|
|
### Why Denormalized Fields?
|
|
Fields like `project_id` in UnitAssignment (already have via location) enable faster queries without joins.
|
|
|
|
### Why Scheduler in Terra-View?
|
|
Terra-View is the orchestration layer. SLMM only handles device communication. Keeping scheduling logic in Terra-View allows for complex workflows across multiple device types.
|
|
|
|
### Why JSON Metadata Columns?
|
|
Type-specific fields (like ambient_conditions for sound projects) don't apply to all location types. JSON columns provide flexibility without cluttering the schema.
|
|
|
|
---
|
|
|
|
## 💡 Tips for Continuing Development
|
|
|
|
1. **Follow Existing Patterns**: Look at the SLM dashboard code for reference
|
|
2. **Use HTMX Aggressively**: Minimize JavaScript, let HTMX handle updates
|
|
3. **Keep Routers Thin**: Move business logic to service layer
|
|
4. **Return HTML Partials**: Most endpoints should return HTML, not JSON
|
|
5. **Test Incrementally**: Build one partial at a time and test in browser
|
|
6. **Check Logs**: Scheduler logs execution attempts
|
|
7. **Use Browser DevTools**: Network tab shows HTMX requests
|
|
|
|
---
|
|
|
|
## 📞 Support
|
|
|
|
For questions or issues:
|
|
1. Check this document first
|
|
2. Review existing dashboards (SLM, Seismographs) for patterns
|
|
3. Check logs for scheduler execution details
|
|
4. Test API endpoints with curl to isolate issues
|
|
|
|
---
|
|
|
|
## ✅ Checklist for Completion
|
|
|
|
- [x] Database schema designed
|
|
- [x] Models created
|
|
- [x] Migration script run successfully
|
|
- [x] Service layer complete (SLMM client, device controller, scheduler)
|
|
- [x] API routers created (projects, locations, scheduler)
|
|
- [x] Navigation updated
|
|
- [x] Main overview page created
|
|
- [x] Routes registered in main.py
|
|
- [x] Scheduler service integrated
|
|
- [ ] Partial templates created
|
|
- [ ] Project dashboard page created
|
|
- [ ] Location management UI
|
|
- [ ] Unit assignment UI
|
|
- [ ] Scheduler UI (agenda view)
|
|
- [ ] SLMM download endpoint implemented
|
|
- [ ] Full workflow tested end-to-end
|
|
- [ ] SFM client implemented (future)
|
|
|
|
---
|
|
|
|
**Last Updated**: 2026-01-12
|
|
|
|
**Database Status**: ✅ Initialized
|
|
|
|
**Backend Status**: ✅ Complete
|
|
|
|
**Frontend Status**: 🟡 Partial (overview page only)
|
|
|
|
**Ready for Testing**: ✅ Yes (basic functionality)
|