Files
terra-view/docs/archive/PROJECTS_SYSTEM_IMPLEMENTATION.md
2026-01-16 19:07:08 +00:00

16 KiB

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:

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

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

# 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

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):

  1. Add location management UI
  2. Add unit assignment UI
  3. Add scheduler UI (agenda view)

Medium-term (Data Flow):

  1. Implement SLMM download endpoint
  2. Test full recording workflow
  3. Add file browser for downloaded data

Long-term (Complete System):

  1. Implement SFM client for seismographs
  2. Add data visualization
  3. Add project reporting
  4. 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

{
  "id": "sound_monitoring",
  "name": "Sound Monitoring",
  "description": "...",
  "icon": "volume-2",
  "supports_sound": true,
  "supports_vibration": false
}

Project Object

{
  "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

{
  "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

{
  "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

{
  "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

  • Database schema designed
  • Models created
  • Migration script run successfully
  • Service layer complete (SLMM client, device controller, scheduler)
  • API routers created (projects, locations, scheduler)
  • Navigation updated
  • Main overview page created
  • Routes registered in main.py
  • 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)