# SLM Configuration Interface
This document describes the SLM configuration interface added to the Sound Level Meters dashboard.
## Overview
Sound Level Meters can now be configured directly from the dashboard without needing to navigate to the unit detail page. A configuration button appears on each SLM unit card on hover, opening a modal with all configurable parameters.
## Features
### 1. Quick Access Configuration Button
- **Location**: Appears on each SLM unit card in the unit list
- **Behavior**: Shows on hover (desktop) or always visible (mobile)
- **Icon**: Gear/settings icon in top-right corner of unit card
### 2. Configuration Modal
The configuration modal provides a comprehensive interface for all SLM parameters:
#### Device Information
- **Model**: Dropdown selection (NL-43, NL-53)
- **Serial Number**: Text input for device serial number
#### Measurement Parameters
- **Frequency Weighting**: A, C, or Z (Linear)
- **Time Weighting**: Fast (125ms), Slow (1s), or Impulse
- **Measurement Range**: 30-130 dB, 40-140 dB, or 50-140 dB
#### Network Configuration
- **Assigned Modem**: Dropdown list of available modems
- Shows modem ID and IP address
- Option for "No modem (direct connection)"
- **Direct IP Address**: Only shown when no modem assigned
- **TCP Port**: Only shown when no modem assigned (default: 502)
### 3. Actions
The modal provides three action buttons:
- **Test Connection**: Tests network connectivity to the SLM
- Uses current form values (not saved values)
- Shows toast notification with results
- Green: Connection successful
- Yellow: Connection failed or device offline
- Red: Test error
- **Cancel**: Closes modal without saving changes
- **Save Configuration**: Saves all changes to database
- Shows success/error toast
- Refreshes unit list on success
- Auto-closes modal after 2 seconds
## Implementation
### Frontend Components
#### Unit List Partial
**File**: [templates/partials/slm_unit_list.html](../templates/partials/slm_unit_list.html)
```html
```
#### Configuration Modal
**File**: [templates/sound_level_meters.html](../templates/sound_level_meters.html#L73)
```html
```
#### Configuration Form
**File**: [templates/partials/slm_config_form.html](../templates/partials/slm_config_form.html)
Form fields mapped to database columns:
- `slm_model` → `unit.slm_model`
- `slm_serial_number` → `unit.slm_serial_number`
- `slm_frequency_weighting` → `unit.slm_frequency_weighting`
- `slm_time_weighting` → `unit.slm_time_weighting`
- `slm_measurement_range` → `unit.slm_measurement_range`
- `deployed_with_modem_id` → `unit.deployed_with_modem_id`
- `slm_host` → `unit.slm_host` (legacy, only if no modem)
- `slm_tcp_port` → `unit.slm_tcp_port` (legacy, only if no modem)
### Backend Endpoints
#### GET /api/slm-dashboard/config/{unit_id}
**File**: [backend/routers/slm_dashboard.py:184](../backend/routers/slm_dashboard.py#L184)
Returns configuration form HTML partial with current unit values pre-populated.
**Response**: HTML partial (slm_config_form.html)
#### POST /api/slm-dashboard/config/{unit_id}
**File**: [backend/routers/slm_dashboard.py:203](../backend/routers/slm_dashboard.py#L203)
Saves configuration changes to database.
**Request**: Form data with configuration parameters
**Response**: JSON
```json
{
"status": "success",
"unit_id": "nl43-001"
}
```
**Behavior**:
- Updates all SLM-specific fields from form data
- If modem is assigned: clears legacy `slm_host` and `slm_tcp_port`
- If no modem: uses direct IP fields from form
### JavaScript Functions
#### openConfigModal(unitId)
**File**: [templates/sound_level_meters.html:127](../templates/sound_level_meters.html#L127)
Opens configuration modal and loads form via HTMX.
```javascript
function openConfigModal(unitId) {
const modal = document.getElementById('config-modal');
modal.classList.remove('hidden');
htmx.ajax('GET', `/api/slm-dashboard/config/${unitId}`, {
target: '#config-modal-content',
swap: 'innerHTML'
});
}
```
#### closeConfigModal()
**File**: [templates/sound_level_meters.html:136](../templates/sound_level_meters.html#L136)
Closes configuration modal.
#### handleConfigSave(event)
**File**: [templates/partials/slm_config_form.html:109](../templates/partials/slm_config_form.html#L109)
Handles HTMX response after form submission:
- Shows success/error toast
- Refreshes unit list
- Auto-closes modal after 2 seconds
#### testConnection(unitId)
**File**: [templates/partials/slm_config_form.html:129](../templates/partials/slm_config_form.html#L129)
Tests connection to SLM unit:
```javascript
async function testConnection(unitId) {
const response = await fetch(`/api/slmm/${unitId}/status`);
const data = await response.json();
if (response.ok && data.status === 'online') {
// Show success toast
} else {
// Show warning toast
}
}
```
#### loadModemsForConfig()
**File**: [templates/partials/slm_config_form.html:87](../templates/partials/slm_config_form.html#L87)
Loads available modems from `/api/roster/modems` and populates dropdown.
## User Workflow
### Configuring an SLM
1. Navigate to Sound Level Meters dashboard ([/sound-level-meters](../sound-level-meters))
2. Hover over desired SLM unit card in the list
3. Click the gear icon that appears in top-right corner
4. Configuration modal opens with current values pre-filled
5. Modify desired parameters:
- Update model/serial if needed
- Set measurement parameters (frequency/time weighting, range)
- Choose network configuration:
- **Option A**: Select a modem from dropdown (recommended)
- **Option B**: Enter direct IP address and port
6. (Optional) Click "Test Connection" to verify network settings
7. Click "Save Configuration"
8. Modal shows success message and auto-closes
9. Unit list refreshes to show updated information
### Network Configuration Options
**Modem Assignment (Recommended)**:
- Select modem from dropdown
- IP address automatically resolved from modem's `ip_address` field
- Direct IP/port fields hidden
- Enables modem tracking and management
**Direct Connection (Legacy)**:
- Select "No modem (direct connection)"
- Enter IP address and TCP port manually
- Direct IP/port fields become visible
- Useful for temporary setups or non-modem connections
## Database Schema
The configuration interface updates these `roster` table columns:
```sql
-- SLM-specific fields
slm_model VARCHAR -- Device model (NL-43, NL-53)
slm_serial_number VARCHAR -- Serial number
slm_frequency_weighting VARCHAR -- A, C, or Z weighting
slm_time_weighting VARCHAR -- Fast, Slow, or Impulse
slm_measurement_range VARCHAR -- Measurement range (30-130, 40-140, 50-140)
-- Network configuration
deployed_with_modem_id VARCHAR -- FK to modem unit (preferred method)
slm_host VARCHAR -- Legacy direct IP (only if no modem)
slm_tcp_port INTEGER -- Legacy TCP port (only if no modem)
```
## UI/UX Design
### Modal Behavior
- **Opens**: Via configure button on unit card
- **Closes**:
- Cancel button
- X button in header
- Escape key
- Clicking outside modal (on backdrop)
- **Auto-close**: After successful save (2 second delay)
### Responsive Design
- **Desktop**: Configuration button appears on hover
- **Mobile**: Configuration button always visible
- **Modal**: Responsive width, scrollable on small screens
- **Form**: Two-column layout on desktop, single column on mobile
### Visual Feedback
- **Loading**: Skeleton loader while form loads
- **Saving**: HTMX handles form submission
- **Success**: Green toast notification
- **Error**: Red toast notification
- **Testing**: Blue toast while testing, then green/yellow/red based on result
### Accessibility
- **Keyboard**: Modal can be closed with Escape key
- **Focus**: Modal traps focus when open
- **Labels**: All form fields have proper labels
- **Colors**: Sufficient contrast in dark/light modes
## Future Enhancements
Potential improvements for future versions:
1. **Bulk Configuration**: Configure multiple SLMs at once
2. **Configuration Templates**: Save and apply configuration presets
3. **Configuration History**: Track configuration changes over time
4. **Remote Configuration**: Push configuration directly to device via SLMM
5. **Validation**: Real-time validation of IP addresses and ports
6. **Advanced Settings**: Additional NL-43/NL-53 specific parameters
7. **Configuration Import/Export**: JSON/CSV configuration files
## Related Documentation
- [SOUND_LEVEL_METERS_DASHBOARD.md](SOUND_LEVEL_METERS_DASHBOARD.md) - Main SLM dashboard
- [MODEM_INTEGRATION.md](MODEM_INTEGRATION.md) - Modem assignment architecture
- [DEVICE_TYPE_SLM_SUPPORT.md](DEVICE_TYPE_SLM_SUPPORT.md) - SLM device type implementation