- Introduced a new communication guide detailing protocol basics, transport modes, and a quick startup checklist. - Added a detailed list of commands with their functions and usage for NL-43/NL-53 devices. - Created a verified quick reference for command formats to prevent common mistakes. - Implemented an improvements document outlining critical fixes, security enhancements, reliability upgrades, and code quality improvements for the SLMM project. - Enhanced the frontend with a new button to retrieve all device settings, along with corresponding JavaScript functionality. - Added a test script for the new settings retrieval API endpoint to demonstrate its usage and validate functionality.
196 lines
6.0 KiB
Markdown
196 lines
6.0 KiB
Markdown
# Feature Summary: Device Settings Verification
|
|
|
|
## What Was Added
|
|
|
|
A new API endpoint that retrieves all current device settings in a single request, allowing users to quickly verify the NL43/NL53 configuration before starting measurements.
|
|
|
|
## New Endpoint
|
|
|
|
**`GET /api/nl43/{unit_id}/settings`**
|
|
|
|
Returns comprehensive device configuration including:
|
|
- Measurement state and weighting settings
|
|
- Timing and interval configuration
|
|
- Battery level and device clock
|
|
- Sleep mode and FTP status
|
|
|
|
## Files Modified
|
|
|
|
### 1. [app/routers.py](app/routers.py)
|
|
**Lines:** 728-761
|
|
|
|
Added new route handler `get_all_settings()` that:
|
|
- Validates device configuration exists
|
|
- Checks TCP communication is enabled
|
|
- Calls `NL43Client.get_all_settings()`
|
|
- Returns formatted JSON response with all settings
|
|
- Handles connection errors, timeouts, and exceptions
|
|
|
|
### 2. [README.md](README.md)
|
|
**Updated sections:**
|
|
- Line 134: Added new endpoint to Measurement Settings table
|
|
- Lines 259-283: Added usage example showing how to verify device settings
|
|
|
|
## Files Created
|
|
|
|
### 1. [test_settings_endpoint.py](test_settings_endpoint.py)
|
|
Test/demonstration script showing:
|
|
- How to use the `get_all_settings()` method
|
|
- Example API endpoint usage with curl
|
|
- Expected response format
|
|
|
|
### 2. [SETTINGS_ENDPOINT.md](SETTINGS_ENDPOINT.md)
|
|
Comprehensive documentation including:
|
|
- Detailed endpoint description
|
|
- Complete list of settings retrieved
|
|
- Usage examples in bash, Python, and JavaScript
|
|
- Performance considerations
|
|
- Best practices and troubleshooting
|
|
|
|
### 3. [FEATURE_SUMMARY.md](FEATURE_SUMMARY.md)
|
|
This file - summary of changes for reference
|
|
|
|
## Existing Functionality Used
|
|
|
|
The implementation leverages the existing `get_all_settings()` method in [app/services.py](app/services.py#L538) which was already implemented but not exposed via the API. This method queries multiple device settings and handles errors gracefully.
|
|
|
|
## How It Works
|
|
|
|
1. **User makes GET request** to `/api/nl43/{unit_id}/settings`
|
|
2. **Router validates** device configuration exists and TCP is enabled
|
|
3. **NL43Client queries device** for each setting sequentially (with 1-second delays)
|
|
4. **Individual errors** are caught and returned as error strings
|
|
5. **Response returned** with all settings in JSON format
|
|
|
|
## Usage Example
|
|
|
|
```bash
|
|
# Quick verification before measurement
|
|
curl http://localhost:8100/api/nl43/NL43-001/settings
|
|
|
|
# Response:
|
|
{
|
|
"status": "ok",
|
|
"unit_id": "NL43-001",
|
|
"settings": {
|
|
"measurement_state": "Stop",
|
|
"frequency_weighting": "A",
|
|
"time_weighting": "F",
|
|
"measurement_time": "00:01:00",
|
|
"leq_interval": "1s",
|
|
"lp_interval": "125ms",
|
|
"index_number": "0",
|
|
"battery_level": "100%",
|
|
"clock": "2025/12/24,20:45:30",
|
|
"sleep_mode": "Off",
|
|
"ftp_status": "On"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Benefits
|
|
|
|
1. **Single request** - Get all settings at once instead of multiple API calls
|
|
2. **Pre-flight checks** - Verify configuration before starting measurements
|
|
3. **Documentation** - Easy to save configuration snapshots for audit trails
|
|
4. **Troubleshooting** - Quickly identify misconfigured settings
|
|
5. **Multi-device** - Compare settings across multiple devices
|
|
|
|
## Performance Notes
|
|
|
|
- **Query time:** ~10-15 seconds (due to required 1-second delays between commands)
|
|
- **Rate limiting:** Automatically enforced by NL43Client
|
|
- **Error handling:** Partial failures don't prevent other settings from being retrieved
|
|
- **Caching recommended:** Settings don't change frequently, cache for 5-10 minutes
|
|
|
|
## Testing
|
|
|
|
To test the new endpoint:
|
|
|
|
1. **Start the server:**
|
|
```bash
|
|
uvicorn app.main:app --reload --port 8100
|
|
```
|
|
|
|
2. **Configure a device** (if not already configured):
|
|
```bash
|
|
curl -X PUT http://localhost:8100/api/nl43/test-meter/config \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"host": "192.168.1.100", "tcp_port": 80, "tcp_enabled": true}'
|
|
```
|
|
|
|
3. **Query settings:**
|
|
```bash
|
|
curl http://localhost:8100/api/nl43/test-meter/settings
|
|
```
|
|
|
|
4. **Check Swagger UI:**
|
|
- Navigate to http://localhost:8100/docs
|
|
- Find "GET /api/nl43/{unit_id}/settings" endpoint
|
|
- Click "Try it out" and test interactively
|
|
|
|
## Integration Tips
|
|
|
|
### Frontend Integration
|
|
```javascript
|
|
// React/Vue/Angular example
|
|
async function verifyDeviceBeforeMeasurement(unitId) {
|
|
const response = await fetch(`/api/nl43/${unitId}/settings`);
|
|
const { settings } = await response.json();
|
|
|
|
// Verify critical settings
|
|
if (settings.frequency_weighting !== 'A') {
|
|
alert('Warning: Frequency weighting not set to A');
|
|
}
|
|
|
|
// Check battery
|
|
const batteryPercent = parseInt(settings.battery_level);
|
|
if (batteryPercent < 20) {
|
|
alert('Low battery! Please charge device.');
|
|
}
|
|
|
|
return settings;
|
|
}
|
|
```
|
|
|
|
### Python Automation
|
|
```python
|
|
def ensure_correct_config(unit_id: str, required_config: dict):
|
|
"""Verify device matches required configuration."""
|
|
settings = get_device_settings(unit_id)
|
|
|
|
mismatches = []
|
|
for key, expected in required_config.items():
|
|
actual = settings.get(key)
|
|
if actual != expected:
|
|
mismatches.append(f"{key}: expected {expected}, got {actual}")
|
|
|
|
if mismatches:
|
|
raise ValueError(f"Configuration mismatch: {', '.join(mismatches)}")
|
|
|
|
return True
|
|
```
|
|
|
|
## Future Enhancements
|
|
|
|
Potential improvements for future versions:
|
|
|
|
1. **Filtered queries** - Query parameter to select specific settings
|
|
2. **Diff mode** - Compare current settings to expected values
|
|
3. **Batch queries** - Get settings from multiple devices in one request
|
|
4. **Settings profiles** - Save/load common configuration profiles
|
|
5. **Change detection** - Track when settings were last modified
|
|
|
|
## Support
|
|
|
|
For questions or issues with this feature:
|
|
- See [SETTINGS_ENDPOINT.md](SETTINGS_ENDPOINT.md) for detailed documentation
|
|
- Check [README.md](README.md) for general API usage
|
|
- Review [COMMUNICATION_GUIDE.md](COMMUNICATION_GUIDE.md) for protocol details
|
|
|
|
## Version Info
|
|
|
|
- **Added:** December 24, 2025
|
|
- **API Version:** Compatible with existing v1 API
|
|
- **Breaking Changes:** None - purely additive feature
|