* docs: rename FONT_MANAGER_USAGE.md to FONT_MANAGER.md Renamed for clearer naming convention. Part of documentation consolidation effort. * docs: consolidate Plugin Store guides (2→1) Merged: - PLUGIN_STORE_USER_GUIDE.md - PLUGIN_STORE_QUICK_REFERENCE.md Into: PLUGIN_STORE_GUIDE.md - Unified writing style to professional technical - Added Quick Reference section at top for easy access - Removed duplicate content - Added cross-references to related documentation - Updated formatting to match style guidelines * docs: create user-focused Web Interface Guide Created WEB_INTERFACE_GUIDE.md consolidating: - V3_INTERFACE_README.md (technical details) - User-facing interface documentation - Focused on end-user tasks and navigation - Removed technical implementation details - Added common tasks section - Included troubleshooting - Professional technical writing style * docs: consolidate WiFi setup guides (4→1) Merged: - WIFI_SETUP.md - OPTIMAL_WIFI_AP_FAILOVER_SETUP.md - AP_MODE_MANUAL_ENABLE.md - WIFI_ETHERNET_AP_MODE_FIX.md (behavior documentation) Into: WIFI_NETWORK_SETUP.md - Comprehensive coverage of WiFi setup and configuration - Clear explanation of AP mode failover and grace period - Configuration scenarios and best practices - Troubleshooting section combining all sources - Professional technical writing style - Added quick reference table for behavior * docs: consolidate troubleshooting guides (4→1) Merged: - TROUBLESHOOTING_QUICK_START.md - WEB_INTERFACE_TROUBLESHOOTING.md - CAPTIVE_PORTAL_TROUBLESHOOTING.md - WEATHER_TROUBLESHOOTING.md Into: TROUBLESHOOTING.md - Organized by issue category (web, WiFi, plugins) - Comprehensive diagnostic commands reference - Quick diagnosis steps at the top - Service file template preserved - Complete diagnostic script included - Professional technical writing style * docs: create consolidated Advanced Features guide Merged: - VEGAS_SCROLL_MODE.md - ON_DEMAND_DISPLAY_QUICK_START.md - ON_DEMAND_DISPLAY_API.md - ON_DEMAND_CACHE_MANAGEMENT.md - BACKGROUND_SERVICE_README.md - PERMISSION_MANAGEMENT_GUIDE.md Into: ADVANCED_FEATURES.md - Comprehensive guide covering all advanced features - Vegas scroll mode with integration examples - On-demand display with API reference - Cache management troubleshooting - Background service documentation - Permission management patterns - Professional technical writing style * docs: create Getting Started guide for first-time users Created GETTING_STARTED.md: - Quick start guide (5 minutes) - Initial configuration walkthrough - Common first-time issues and solutions - Next steps and quick reference - User-friendly tone for beginners - Links to detailed documentation * docs: archive consolidated source files and ephemeral docs Archived files that have been consolidated: - Plugin Store guides (2 files → PLUGIN_STORE_GUIDE.md) - Web Interface guide (V3_INTERFACE_README.md → WEB_INTERFACE_GUIDE.md) - WiFi Setup guides (4 files → WIFI_NETWORK_SETUP.md) - Troubleshooting guides (4 files → TROUBLESHOOTING.md) - Advanced Features (6 files → ADVANCED_FEATURES.md) Archived ephemeral/debug documentation: - DEBUG_WEB_ISSUE.md - BROWSER_ERRORS_EXPLANATION.md - FORM_VALIDATION_FIXES.md - WEB_UI_RELIABILITY_IMPROVEMENTS.md - CAPTIVE_PORTAL_TESTING.md - NEXT_STEPS_COMMANDS.md - STATIC_IMAGE_MULTI_UPLOAD_PLAN.md - RECONNECT_AFTER_CAPTIVE_PORTAL_TESTING.md Archived implementation summaries: - PLUGIN_CONFIG_TABS_SUMMARY.md - PLUGIN_CONFIG_SYSTEM_VERIFICATION.md - PLUGIN_SCHEMA_AUDIT_SUMMARY.md - STARTUP_OPTIMIZATION_SUMMARY.md - PLUGIN_DISPATCH_IMPLEMENTATION.md - NESTED_SCHEMA_IMPLEMENTATION.md - AP_MODE_MANUAL_ENABLE_CHANGES.md - PLUGIN_CONFIG_SYSTEM_EXPLANATION.md Total archived: 27 files Preserves git history while cleaning up main docs directory * docs: rename API_REFERENCE.md to REST_API_REFERENCE.md Renamed for clarity - this is specifically the REST API reference for the web interface, not a general API reference. * docs: update README.md to reflect consolidated documentation structure Updated documentation index: - Reflects new consolidated guides (51 → 16-17 files) - Updated Quick Start sections with new file names - Added consolidation history (January 2026) - Updated file references (API_REFERENCE → REST_API_REFERENCE) - Documented archival of 33 files - Added benefits of consolidation - Updated statistics and highlights - Removed outdated references - Professional writing style maintained throughout * docs: add Vegas scroll mode system architecture documentation Added comprehensive internal architecture section for Vegas mode: - Component overview with diagram - VegasModeCoordinator responsibilities and main loop - StreamManager buffering strategy and content flow - PluginAdapter integration and fallback behavior - RenderPipeline 125 FPS rendering process - Component interaction flows - Thread safety patterns - Performance characteristics Covers: - How the four components work together - Initialization and render loop flows - Config update handling - Frame rate management and optimization - Memory usage and CPU characteristics --------- Co-authored-by: Chuck <chuck@example.com>
12 KiB
Captive Portal Testing Guide
This guide explains how to test the captive portal WiFi setup functionality.
Prerequisites
- Raspberry Pi with LEDMatrix installed
- WiFi adapter (built-in or USB)
- Test devices (smartphone, tablet, or laptop)
- Access to Pi (SSH or direct access)
Important: Before Testing
⚠️ Make sure you have a way to reconnect!
Before starting testing, ensure you have:
- Ethernet cable (if available) as backup connection
- SSH access via another method (Ethernet, direct connection)
- Physical access to Pi (keyboard/monitor) as last resort
- Your WiFi credentials saved/noted down
If testing fails, see: Reconnecting After Testing
Quick recovery script: sudo ./scripts/emergency_reconnect.sh
Pre-Testing Setup
0. Verify WiFi is Ready (IMPORTANT!)
⚠️ CRITICAL: Run this BEFORE disconnecting Ethernet!
sudo ./scripts/verify_wifi_before_testing.sh
This script will verify:
- WiFi interface exists and is enabled
- WiFi can scan for networks
- You have saved WiFi connections (for reconnecting)
- Required services are ready
- Current network status
Do NOT disconnect Ethernet until this script passes all checks!
1. Ensure WiFi Monitor Service is Running
sudo systemctl status ledmatrix-wifi-monitor
If not running:
sudo systemctl start ledmatrix-wifi-monitor
sudo systemctl enable ledmatrix-wifi-monitor
2. Disconnect Pi from WiFi/Ethernet
⚠️ Only do this AFTER running the verification script!
To test captive portal, the Pi should NOT be connected to any network:
# First, verify WiFi is ready (see step 0 above)
sudo ./scripts/verify_wifi_before_testing.sh
# Check current network status
nmcli device status
# Disconnect WiFi (if connected)
sudo nmcli device disconnect wlan0
# Disconnect Ethernet (if connected)
# Option 1: Unplug Ethernet cable (safest)
# Option 2: Via command (if you're sure WiFi works):
sudo nmcli device disconnect eth0
# Verify disconnection
nmcli device status
# Both should show "disconnected" or "unavailable"
3. Enable AP Mode
You can enable AP mode manually or wait for it to auto-enable (if auto_enable_ap_mode is true):
Manual enable via web interface:
- Access web interface at
http://<pi-ip>:5000(if still accessible) - Go to WiFi tab
- Click "Enable AP Mode"
Manual enable via command line:
python3 -c "from src.wifi_manager import WiFiManager; wm = WiFiManager(); print(wm.enable_ap_mode())"
Or via API:
curl -X POST http://localhost:5000/api/v3/wifi/ap/enable
4. Verify AP Mode is Active
# Check hostapd service
sudo systemctl status hostapd
# Check dnsmasq service
sudo systemctl status dnsmasq
# Check if wlan0 is in AP mode
iwconfig wlan0
# Should show "Mode:Master"
# Check IP address
ip addr show wlan0
# Should show 192.168.4.1
5. Verify DNSMASQ Configuration
# Check dnsmasq config
sudo cat /etc/dnsmasq.conf
# Should contain:
# - address=/#/192.168.4.1
# - address=/captive.apple.com/192.168.4.1
# - address=/connectivitycheck.gstatic.com/192.168.4.1
# - address=/www.msftconnecttest.com/192.168.4.1
# - address=/detectportal.firefox.com/192.168.4.1
6. Verify Web Interface is Running
# Check if web service is running
sudo systemctl status ledmatrix-web
# Or check if Flask app is running
ps aux | grep "web_interface"
Testing Procedures
Test 1: DNS Redirection
Purpose: Verify that DNS queries are redirected to the Pi.
Steps:
- Connect a device to "LEDMatrix-Setup" network (password:
ledmatrix123) - Try to resolve any domain name:
# On Linux/Mac nslookup google.com # Should return 192.168.4.1 # On Windows nslookup google.com # Should return 192.168.4.1
Expected Result: All DNS queries should resolve to 192.168.4.1
Test 2: HTTP Redirect (Manual Browser Test)
Purpose: Verify that HTTP requests redirect to WiFi setup page.
Steps:
- Connect device to "LEDMatrix-Setup" network
- Open a web browser
- Try to access any website:
http://google.comhttp://example.comhttp://192.168.4.1(direct IP)
Expected Result: All requests should redirect to http://192.168.4.1:5000/v3 (WiFi setup interface)
Test 3: Captive Portal Detection Endpoints
Purpose: Verify that device detection endpoints respond correctly.
Test each endpoint:
# iOS/macOS detection
curl http://192.168.4.1:5000/hotspot-detect.html
# Expected: HTML response with "Success"
# Android detection
curl -I http://192.168.4.1:5000/generate_204
# Expected: HTTP 204 No Content
# Windows detection
curl http://192.168.4.1:5000/connecttest.txt
# Expected: "Microsoft Connect Test"
# Firefox detection
curl http://192.168.4.1:5000/success.txt
# Expected: "success"
Expected Result: Each endpoint should return the appropriate response
Test 4: iOS Device (iPhone/iPad)
Purpose: Test automatic captive portal detection on iOS.
Steps:
- On iPhone/iPad, go to Settings > Wi-Fi
- Connect to "LEDMatrix-Setup" network
- Enter password:
ledmatrix123 - Wait a few seconds
Expected Result:
- iOS should automatically detect the captive portal
- A popup should appear saying "Sign in to Network" or similar
- Tapping it should open Safari with the WiFi setup page
- The setup page should show the captive portal banner
If it doesn't auto-open:
- Open Safari manually
- Try to visit any website (e.g., apple.com)
- Should redirect to WiFi setup page
Test 5: Android Device
Purpose: Test automatic captive portal detection on Android.
Steps:
- On Android device, go to Settings > Wi-Fi
- Connect to "LEDMatrix-Setup" network
- Enter password:
ledmatrix123 - Wait a few seconds
Expected Result:
- Android should show a notification: "Sign in to network" or "Network sign-in required"
- Tapping the notification should open a browser with the WiFi setup page
- The setup page should show the captive portal banner
If notification doesn't appear:
- Open Chrome browser
- Try to visit any website
- Should redirect to WiFi setup page
Test 6: Windows Laptop
Purpose: Test captive portal on Windows.
Steps:
- Connect Windows laptop to "LEDMatrix-Setup" network
- Enter password:
ledmatrix123 - Wait a few seconds
Expected Result:
- Windows may show a notification about network sign-in
- Opening any browser and visiting any website should redirect to WiFi setup page
- Edge/Chrome may automatically open a sign-in window
Manual test:
- Open any browser
- Visit
http://www.msftconnecttest.comor any website - Should redirect to WiFi setup page
Test 7: API Endpoints Still Work
Purpose: Verify that WiFi API endpoints function normally during AP mode.
Steps:
- While connected to "LEDMatrix-Setup" network
- Test API endpoints:
# Status endpoint
curl http://192.168.4.1:5000/api/v3/wifi/status
# Scan networks
curl http://192.168.4.1:5000/api/v3/wifi/scan
Expected Result: API endpoints should return JSON responses normally (not redirect)
Test 8: WiFi Connection Flow
Purpose: Test the complete flow of connecting to WiFi via captive portal.
Steps:
- Connect device to "LEDMatrix-Setup" network
- Wait for captive portal to redirect to setup page
- Click "Scan" to find available networks
- Select a network from the list
- Enter WiFi password
- Click "Connect"
- Wait for connection to establish
Expected Result:
- Device should connect to selected WiFi network
- AP mode should automatically disable
- Device should now be on the new network
- Can access Pi via new network IP address
Troubleshooting
Issue: DNS Not Redirecting
Symptoms: DNS queries resolve to actual IPs, not 192.168.4.1
Solutions:
- Check dnsmasq config:
sudo cat /etc/dnsmasq.conf | grep address - Restart dnsmasq:
sudo systemctl restart dnsmasq - Check dnsmasq logs:
sudo journalctl -u dnsmasq -n 50
Issue: HTTP Not Redirecting
Symptoms: Browser shows actual websites instead of redirecting
Solutions:
- Check if AP mode is active:
python3 -c "from src.wifi_manager import WiFiManager; wm = WiFiManager(); print(wm._is_ap_mode_active())" - Check Flask app logs for errors
- Verify web interface is running on port 5000
- Test redirect middleware manually:
curl -I http://192.168.4.1:5000/google.com # Should return 302 redirect
Issue: Captive Portal Not Detected by Device
Symptoms: Device doesn't show sign-in notification/popup
Solutions:
- Verify detection endpoints are accessible:
curl http://192.168.4.1:5000/hotspot-detect.html curl http://192.168.4.1:5000/generate_204 - Try manually opening browser and visiting any website
- Some devices require specific responses - check endpoint implementations
- Clear device's network settings and reconnect
Issue: Infinite Redirect Loop
Symptoms: Browser keeps redirecting in a loop
Solutions:
- Check that
/v3path is in allowed_paths list - Verify redirect middleware logic in
app.py - Check Flask logs for errors
- Ensure WiFi API endpoints are not being redirected
Issue: AP Mode Not Enabling
Symptoms: Can't connect to "LEDMatrix-Setup" network
Solutions:
- Check WiFi monitor service:
sudo systemctl status ledmatrix-wifi-monitor - Check WiFi config:
cat config/wifi_config.json - Manually enable AP mode:
python3 -c "from src.wifi_manager import WiFiManager; wm = WiFiManager(); print(wm.enable_ap_mode())" - Check hostapd logs:
sudo journalctl -u hostapd -n 50
Verification Checklist
- DNS redirection works (all domains resolve to 192.168.4.1)
- HTTP redirect works (all websites redirect to setup page)
- Captive portal detection endpoints respond correctly
- iOS device auto-opens setup page
- Android device shows sign-in notification
- Windows device redirects to setup page
- WiFi API endpoints still work during AP mode
- Can successfully connect to WiFi via setup page
- AP mode disables after WiFi connection
- No infinite redirect loops
- Captive portal banner appears on setup page when AP mode is active
Quick Test Script
Save this as test_captive_portal.sh:
#!/bin/bash
echo "Testing Captive Portal Functionality"
echo "===================================="
# Test DNS redirection
echo -e "\n1. Testing DNS redirection..."
nslookup google.com | grep -q "192.168.4.1" && echo "✓ DNS redirection works" || echo "✗ DNS redirection failed"
# Test HTTP redirect
echo -e "\n2. Testing HTTP redirect..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -L http://192.168.4.1:5000/google.com)
[ "$HTTP_CODE" = "200" ] && echo "✓ HTTP redirect works" || echo "✗ HTTP redirect failed (got $HTTP_CODE)"
# Test detection endpoints
echo -e "\n3. Testing captive portal detection endpoints..."
curl -s http://192.168.4.1:5000/hotspot-detect.html | grep -q "Success" && echo "✓ iOS endpoint works" || echo "✗ iOS endpoint failed"
curl -s -o /dev/null -w "%{http_code}" http://192.168.4.1:5000/generate_204 | grep -q "204" && echo "✓ Android endpoint works" || echo "✗ Android endpoint failed"
curl -s http://192.168.4.1:5000/connecttest.txt | grep -q "Microsoft" && echo "✓ Windows endpoint works" || echo "✗ Windows endpoint failed"
curl -s http://192.168.4.1:5000/success.txt | grep -q "success" && echo "✓ Firefox endpoint works" || echo "✗ Firefox endpoint failed"
# Test API endpoints
echo -e "\n4. Testing API endpoints..."
API_RESPONSE=$(curl -s http://192.168.4.1:5000/api/v3/wifi/status)
echo "$API_RESPONSE" | grep -q "status" && echo "✓ API endpoints work" || echo "✗ API endpoints failed"
echo -e "\nTesting complete!"
Make it executable and run:
chmod +x test_captive_portal.sh
./test_captive_portal.sh
Notes
- Port Number: The web interface runs on port 5000 by default. If you've changed this, update all URLs accordingly.
- Network Range: The AP uses 192.168.4.0/24 network. If you need a different range, update both hostapd and dnsmasq configs.
- Password: Default AP password is
ledmatrix123. Change it inconfig/wifi_config.jsonif needed. - Testing on Same Device: If testing from the Pi itself, you'll need a second device to connect to the AP network.