Files
thor-emitter/docs/features/SLEEP_MODE_AUTO_DISABLE.md
2026-01-16 19:06:38 +00:00

6.1 KiB

Sleep Mode Auto-Disable Feature

Problem Statement

NL-43/NL-53 sound level meters have a sleep/eco mode feature that conserves battery power. However, when these devices enter sleep mode, they turn off TCP communications, which completely breaks remote monitoring and control capabilities. This makes it impossible to:

  • Query device status remotely
  • Start/stop measurements
  • Stream real-time data
  • Download files via FTP
  • Perform any remote management tasks

This is particularly problematic in deployed scenarios where physical access to devices is limited or impossible.

Solution

SLMM now automatically disables sleep mode in two key scenarios:

1. Device Configuration

When a device configuration is created or updated with TCP enabled, SLMM automatically:

  • Checks the current sleep mode status on the device
  • Disables sleep mode if it's enabled
  • Logs the operation for visibility

Endpoint: PUT /api/nl43/{unit_id}/config

2. Measurement Start

Before starting any measurement, SLMM:

  • Proactively disables sleep mode
  • Ensures TCP remains active throughout the measurement session
  • Allows remote monitoring to work reliably

Endpoint: POST /api/nl43/{unit_id}/start

Implementation Details

Helper Function

A new async helper function was added to app/routers.py:

async def ensure_sleep_mode_disabled(client: NL43Client, unit_id: str):
    """
    Helper function to ensure sleep mode is disabled on the device.
    Sleep/eco mode turns off TCP communications, preventing remote monitoring.
    This should be called when configuring a device or starting measurements.
    """
    try:
        current_status = await client.get_sleep_status()
        logger.info(f"Current sleep mode status for {unit_id}: {current_status}")

        # If sleep mode is on, disable it
        if "On" in current_status or "on" in current_status:
            logger.info(f"Sleep mode is enabled on {unit_id}, disabling it to maintain TCP connectivity")
            await client.wake()
            logger.info(f"Successfully disabled sleep mode on {unit_id}")
        else:
            logger.info(f"Sleep mode already disabled on {unit_id}")
    except Exception as e:
        logger.warning(f"Could not verify/disable sleep mode on {unit_id}: {e}")
        # Don't raise - we want configuration to succeed even if sleep mode check fails

Non-Blocking Design

The sleep mode check is non-blocking:

  • If the device is unreachable, the operation logs a warning but continues
  • Configuration updates succeed even if sleep mode can't be verified
  • Measurement starts proceed even if sleep mode check fails
  • This prevents device communication issues from blocking critical operations

Logging

All sleep mode operations are logged with appropriate levels:

  • INFO: Successful operations and status checks
  • WARNING: Failed operations (device unreachable, timeout, etc.)

Example logs:

2026-01-14 18:37:12,889 - app.routers - INFO - TCP enabled for test-nl43-001, ensuring sleep mode is disabled
2026-01-14 18:37:12,889 - app.services - INFO - Sending command to 192.168.1.100:2255: Sleep Mode?
2026-01-14 18:37:17,890 - app.routers - WARNING - Could not verify/disable sleep mode on test-nl43-001: Failed to connect to device at 192.168.1.100:2255

Testing

A comprehensive test script is available: test_sleep_mode_auto_disable.py

Run it with:

python3 test_sleep_mode_auto_disable.py

The test verifies:

  1. Config updates trigger sleep mode check
  2. Config retrieval works correctly
  3. Start measurement triggers sleep mode check
  4. Operations succeed even without a physical device (non-blocking)

API Documentation Updates

The following documentation files were updated to reflect this feature:

docs/API.md

  • Updated config endpoint documentation with sleep mode auto-disable note
  • Added warning to start measurement endpoint
  • Enhanced power management section with detailed warnings about sleep mode behavior

Key additions:

  • Configuration section now explains that sleep mode is automatically disabled when TCP is enabled
  • Measurement control section notes that sleep mode is disabled before starting measurements
  • Power management section includes comprehensive warnings about sleep mode affecting TCP connectivity

Usage Notes

For Operators

  • You no longer need to manually disable sleep mode before starting remote monitoring
  • Sleep mode will be automatically disabled when you configure a device or start measurements
  • Check logs to verify sleep mode operations if experiencing connectivity issues

For Developers

  • The ensure_sleep_mode_disabled() helper can be called from any endpoint that requires reliable TCP connectivity
  • Always use it before long-running operations that depend on continuous device communication
  • The function is designed to fail gracefully - don't worry about exception handling

Battery Conservation

If battery conservation is a concern:

  • Consider using Timer Auto mode with scheduled measurements
  • Sleep mode can be manually re-enabled between measurements using POST /{unit_id}/sleep
  • Be aware that TCP connectivity will be lost until the device wakes or is physically accessed

Deployment

The feature is automatically included when building the SLMM container:

cd /home/serversdown/tmi/terra-view
docker compose build slmm
docker compose up -d slmm

No configuration changes are required - the feature is active by default.

Future Enhancements

Potential improvements for future versions:

  • Add a user preference to optionally skip sleep mode disable
  • Implement smart sleep mode scheduling (enable between measurements, disable during)
  • Add sleep mode status to device health checks
  • Create alerts when sleep mode is detected as enabled

References