- Updated all instances of device_type from "sound_level_meter" to "slm" across the codebase. - Enhanced documentation to reflect the new device type standardization. - Added migration script to convert legacy device types in the database. - Updated relevant API endpoints, models, and frontend templates to use the new device type. - Ensured backward compatibility by deprecating the old device type without data loss.
9.6 KiB
Sound Level Meters Dashboard
Overview
The Sound Level Meters dashboard is a new feature in SFM (soon to be rebranded as Terra-view) that provides real-time monitoring and control of Rion NL-43/NL-53 sound level meters through the SLMM backend integration.
Features
1. Dashboard Summary Statistics
- Total Units: Count of all SLM devices in the system
- Deployed Units: Active devices currently in the field
- Active Now: Units that have checked in within the last hour
- Benched Units: Devices not currently deployed
2. Unit List (Sidebar)
- Searchable list of all deployed SLM units
- Real-time status indicators:
- 🟢 Green: Active (recently checked in)
- ⚪ Gray: No check-in data
- Quick unit information:
- Device model (NL-43, NL-53, etc.)
- Location/address
- Network address (IP:port)
- Click any unit to view its live data
3. Live View Panel
When a unit is selected, the live view panel displays:
Control Buttons
- Start: Begin measurement
- Pause: Pause current measurement
- Stop: Stop measurement
- Reset: Reset measurement data
- Start Live Stream: Open WebSocket connection for real-time DRD data
Real-time Metrics
- Lp (Current): Instantaneous sound level in dB
- Leq (Average): Equivalent continuous sound level
- Lmax (Peak): Maximum sound level recorded
- Lmin: Minimum sound level recorded
Live Chart
- Real-time line chart showing Lp and Leq over time
- 60-second rolling window (adjustable)
- Chart.js-powered visualization with dark mode support
- No animation for smooth real-time updates
Device Information
- Battery level and power source
- Frequency weighting (A, C, Z)
- Time weighting (F, S, I)
- SD card remaining space
Architecture
Frontend Components
Main Template
File: templates/sound_level_meters.html
The main dashboard page that includes:
- Page header and navigation integration
- Stats summary section (auto-refreshes every 10s)
- Two-column layout: unit list (left) + live view (right)
- JavaScript functions for unit selection and WebSocket streaming
Partial Templates
-
slm_stats.html - Summary statistics cards
- Auto-loads on page load
- Refreshes every 10 seconds via HTMX
-
slm_unit_list.html - Searchable unit list
- Auto-loads on page load
- Refreshes every 10 seconds via HTMX
- Supports search filtering
-
slm_live_view.html - Live data panel for selected unit
- Loaded on-demand when unit is selected
- Includes Chart.js for visualization
- WebSocket connection for streaming data
-
slm_live_view_error.html - Error state display
Backend Components
Router: backend/routers/slm_dashboard.py
Endpoints:
GET /api/slm-dashboard/stats
Returns HTML partial with summary statistics.
GET /api/slm-dashboard/units?search={term}
Returns HTML partial with filtered unit list.
GET /api/slm-dashboard/live-view/{unit_id}
Returns HTML partial with live view panel for specific unit.
- Fetches unit details from database
- Queries SLMM API for current measurement state
- Queries SLMM API for live status (DOD data)
POST /api/slm-dashboard/control/{unit_id}/{action}
Sends control commands to SLMM backend.
- Valid actions: start, stop, pause, resume, reset
- Proxies to
http://localhost:8100/api/nl43/{unit_id}/{action}
Integration with SLMM
The dashboard communicates with the SLMM backend service running on port 8100:
REST API Calls:
GET /api/nl43/{unit_id}/measurement-state- Check if measuringGET /api/nl43/{unit_id}/live- Get current DOD dataPOST /api/nl43/{unit_id}/start|stop|pause|resume|reset- Control commands
WebSocket Streaming:
WS /api/nl43/{unit_id}/live- Real-time DRD data stream- Proxied through SFM at
/api/slmm/{unit_id}/live - Streams continuous measurement data for live charting
Database Schema
Table: roster
SLM-specific fields in the RosterUnit model:
device_type = "slm" # Distinguishes SLMs from seismographs
slm_host = String # Device IP or hostname
slm_tcp_port = Integer # TCP control port (default 2255)
slm_model = String # NL-43, NL-53, etc.
slm_serial_number = String # Device serial number
slm_frequency_weighting = String # A, C, or Z weighting
slm_time_weighting = String # F (Fast), S (Slow), I (Impulse)
slm_measurement_range = String # e.g., "30-130 dB"
slm_last_check = DateTime # Last communication timestamp
Navigation
The Sound Level Meters page is accessible from:
- URL:
/sound-level-meters - Sidebar: "Sound Level Meters" menu item (between Fleet Roster and Projects)
- Icon: Speaker/sound wave SVG icon
Real-time Updates
The dashboard uses three mechanisms for real-time updates:
-
HTMX Polling (10-second intervals)
- Summary statistics
- Unit list
- Ensures data freshness even without user interaction
-
On-Demand Loading (HTMX)
- Live view panel loads when unit is selected
- Control button responses
-
WebSocket Streaming (continuous)
- Real-time DRD data for live charting
- User-initiated via "Start Live Stream" button
- Automatically closed on page unload or unit change
Measurement Duration Tracking
Important: The NL-43/NL-53 devices do not expose measurement duration via their API. Elapsed time and interval counts are only visible on the device's on-screen display (OSD).
Solution: Track measurement start time in your application when calling the /start endpoint:
// When starting measurement
const startTime = new Date();
localStorage.setItem(`slm_${unitId}_start`, startTime.toISOString());
// Calculate elapsed time
const startTime = new Date(localStorage.getItem(`slm_${unitId}_start`));
const elapsed = (new Date() - startTime) / 1000; // seconds
Future Enhancement: SLMM backend could store measurement start times in a database table to track duration across sessions.
Testing
Add Test Data
Use the included script to add test SLM units:
python3 add_test_slms.py
This creates:
- 3 deployed test units (nl43-001, nl43-002, nl53-001)
- 1 benched unit (nl43-003)
Running the Dashboard
-
Start SLMM backend (port 8100):
cd /home/serversdown/slmm uvicorn main:app --host 0.0.0.0 --port 8100 -
Start SFM (port 8000):
cd /home/serversdown/sfm/seismo-fleet-manager uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload -
Access dashboard:
http://localhost:8000/sound-level-meters
Testing Without Physical Devices
The dashboard will work without physical NL-43 devices connected:
- Unit list will display based on database records
- Live view will show connection errors (gracefully handled)
- Mock data can be added to SLMM for testing
Future Enhancements
Near-term
-
Measurement Duration Tracking
- Add database table to track measurement sessions
- Display elapsed time in live view
- Store start/stop timestamps
-
Historical Data View
- Chart historical Leq intervals
- Export measurement data
- Comparison between units
-
Alerts & Thresholds
- Configurable sound level alerts
- Email/SMS notifications when thresholds exceeded
- Visual indicators on dashboard
Long-term
-
Map View
- Display all SLMs on a map (like seismographs)
- Click map markers to view live data
- Color-coded by current sound level
-
Batch Operations
- Start/stop multiple units simultaneously
- Synchronized measurements
- Group configurations
-
Advanced Analytics
- Noise compliance reports
- Statistical summaries
- Trend analysis
Integration with Terra-view
When SFM is rebranded to Terra-view:
-
Multi-Module Dashboard
- Sound Level Meters module (this dashboard)
- Seismograph Fleet Manager module (existing)
- Future monitoring modules
-
Project Management
- Link SLMs to projects
- Combined project view with seismographs + SLMs
- Project-level reporting
-
Unified Navigation
- Top-level module switcher
- Consistent UI/UX across modules
- Shared authentication and settings
Technical Notes
HTMX Integration
The dashboard extensively uses HTMX for dynamic updates without full page reloads:
hx-get: Fetch and swap contenthx-trigger: Auto-refresh intervalshx-swap: Content replacement strategyhx-target: Specify update target
Dark Mode Support
All components support dark mode:
- Chart.js colors adapt to theme
- Tailwind dark: classes throughout
- Automatic theme detection
Performance Considerations
- WebSocket connections are per-unit (only one active at a time)
- Chart data limited to 60 points (1 minute) to prevent memory bloat
- Polling intervals balanced for responsiveness vs server load
- Lazy loading of live view panel (only when unit selected)
Files Modified/Created
New Files
templates/sound_level_meters.htmltemplates/partials/slm_stats.htmltemplates/partials/slm_unit_list.htmltemplates/partials/slm_live_view.htmltemplates/partials/slm_live_view_error.htmlbackend/routers/slm_dashboard.pyadd_test_slms.pydocs/SOUND_LEVEL_METERS_DASHBOARD.md
Modified Files
backend/main.py- Added route and router importtemplates/base.html- Added navigation menu item
Support
For issues or questions:
- Check SLMM API documentation:
/home/serversdown/slmm/docs/API.md - Review SFM changelog:
CHANGELOG.md - Submit issues to project repository
Version: 1.0.0 Created: January 2026 Last Updated: January 5, 2026