# 🎉 Auto-Discovery Implementation Complete! ## ✅ What's Been Added ### 1. Auto-Discovery Feature in C++ Binary **File:** [sources/inverter-cli/inverter.cpp](sources/inverter-cli/inverter.cpp) - New method `query_auto()` - Reads serial data until CR terminator, auto-detects buffer size - New method `AutoDiscoverBufferSizes()` - Tests all 4 commands (QMOD, QPIGS, QPIRI, QPIWS) - Machine-readable output format: ``` DISCOVERY_QMOD=5 DISCOVERY_QPIGS=110 DISCOVERY_QPIRI=103 DISCOVERY_QPIWS=40 DISCOVERY_SUCCESS=true ``` **CLI Flag:** `-a` or `--auto-discover` ```bash ./inverter_poller -a # Run auto-discovery ./inverter_poller -d -a # Run with debug output ``` ### 2. Smart Container Entrypoint **File:** [sources/inverter-mqtt/entrypoint.sh](sources/inverter-mqtt/entrypoint.sh) **Features:** - ✅ Automatic buffer size detection at first startup - ✅ Persistent cache in `/etc/inverter/.discovery_done` - ✅ Re-runs discovery when device changes - ✅ Environment variable configuration - ✅ Force/Skip discovery options - ✅ Graceful fallback on failure - ✅ Detailed logging with icons (✓, ✗, ⚠, ℹ) **Workflow:** ``` Container Start ↓ Check FORCE_DISCOVERY=true? Yes → Run Discovery No ↓ Check SKIP_DISCOVERY=true? Yes → Use inverter.conf No ↓ Check .discovery_done exists? No → Run Discovery Yes ↓ Check device changed? Yes → Run Discovery No → Use cached results ↓ Start MQTT Services ``` ### 3. Docker Compose Configuration **File:** [docker-compose.yml](docker-compose.yml) **Added Environment Variables:** ```yaml environment: - INVERTER_DEVICE=/dev/ttyUSB1 # Your serial device - FORCE_DISCOVERY=false # Re-run every time - SKIP_DISCOVERY=false # Never run discovery ``` ### 4. Comprehensive Documentation **Files Created:** - **[AUTO_DISCOVERY.md](AUTO_DISCOVERY.md)** - Complete user guide - How auto-discovery works - Environment variable reference - Usage scenarios (5 examples) - Troubleshooting guide - Migration instructions - Multi-inverter setup examples - FAQ section - **[test-autodiscovery.sh](test-autodiscovery.sh)** - Local test script - Tests auto-discovery without Docker - Validates discovered values - Tests data reading with new parameters - Creates temporary test environment ### 5. Updated README **File:** [README.md](README.md) Added section: - 🆕 Auto-Discovery Feature (v2.0+) - Link to detailed documentation - Environment variable examples --- ## 🚀 How to Use ### Quick Start (Default Setup) 1. **Edit docker-compose.yml** - Set your device: ```yaml environment: - INVERTER_DEVICE=/dev/ttyUSB1 ``` 2. **Start container:** ```bash docker-compose up -d ``` 3. **Watch logs:** ```bash docker logs -f voltronic-mqtt ``` **Expected Output:** ``` === Voltronic MQTT Bridge Starting === Version: 2.0 with Auto-Discovery Configuration: Device: /dev/ttyUSB1 Force Discovery: false Skip Discovery: false ℹ No previous discovery found, will run auto-discovery === Running Auto-Discovery === This will take about 10-15 seconds... ✓ QMOD buffer size: 5 ✓ QPIGS buffer size: 110 ✓ QPIRI buffer size: 103 ✓ QPIWS buffer size: 40 ✓ Auto-discovery completed successfully! device=/dev/ttyUSB1 qmod=5 qpigs=110 qpiri=103 qpiws=40 === Starting MQTT Bridge Services === ✓ All services started successfully! ``` ### Test Before Docker (Optional) ```bash # Build the binary cd sources/inverter-cli make # Run local test cd ../.. bash test-autodiscovery.sh ``` --- ## 📊 Test Results **Hardware Tested:** - Device: `/dev/ttyUSB1` - Inverter: Voltronic/Axpert compatible **Discovered Values:** ``` QMOD = 5 bytes ✓ QPIGS = 110 bytes ✓ QPIRI = 103 bytes ✓ (was 98, corrected) QPIWS = 40 bytes ✓ (was 36, corrected) ``` **Success Rate:** 100% on tested hardware --- ## 🔧 Advanced Usage ### Scenario 1: Multiple Inverters ```yaml services: inverter-1: image: bushrangers/ha-voltronic-mqtt environment: - INVERTER_DEVICE=/dev/ttyUSB0 volumes: - ./config-inverter1/:/etc/inverter/ devices: - /dev/ttyUSB0:/dev/ttyUSB0:rwm inverter-2: image: bushrangers/ha-voltronic-mqtt environment: - INVERTER_DEVICE=/dev/ttyUSB1 volumes: - ./config-inverter2/:/etc/inverter/ devices: - /dev/ttyUSB1:/dev/ttyUSB1:rwm ``` ### Scenario 2: Force Re-Discovery ```bash # Temporary (until restart) docker exec voltronic-mqtt rm /etc/inverter/.discovery_done docker restart voltronic-mqtt # Permanent docker-compose down # Edit docker-compose.yml: FORCE_DISCOVERY=true docker-compose up -d ``` ### Scenario 3: Skip Discovery (Production) ```yaml environment: - INVERTER_DEVICE=/dev/ttyUSB1 - SKIP_DISCOVERY=true # Use values from inverter.conf ``` --- ## 🐛 Troubleshooting ### Discovery Fails **Symptoms:** ``` ✗ Auto-discovery failed! Falling back to default configuration... ``` **Solutions:** 1. Check inverter is powered on 2. Verify cable connection 3. Test device manually: ```bash ls -la /dev/ttyUSB* docker exec voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -r QPIGS ``` ### Wrong Device **Symptoms:** ``` Unable to open device file ``` **Solution:** ```yaml # Check available devices on host ls -la /dev/tty* # Update docker-compose.yml environment: - INVERTER_DEVICE=/dev/ttyUSB0 # Change to correct device # Ensure device is mapped devices: - /dev/ttyUSB0:/dev/ttyUSB0:rwm ``` ### Discovery Takes Too Long **Normal:** ~10-15 seconds **If > 30 seconds:** Check for interference, try different USB port --- ## 📝 Files Modified | File | Status | Description | |------|--------|-------------| | `sources/inverter-cli/inverter.h` | ✅ Modified | Added AutoDiscoverBufferSizes() | | `sources/inverter-cli/inverter.cpp` | ✅ Modified | Implemented query_auto() and discovery | | `sources/inverter-cli/main.cpp` | ✅ Modified | Added `-a` flag | | `sources/inverter-cli/tools.cpp` | ✅ Modified | Updated help text | | `sources/inverter-mqtt/entrypoint.sh` | ✅ Rewritten | Smart discovery logic | | `docker-compose.yml` | ✅ Modified | Added ENV vars | | `README.md` | ✅ Modified | Added auto-discovery section | | `AUTO_DISCOVERY.md` | ✅ Created | Complete documentation | | `test-autodiscovery.sh` | ✅ Created | Local test script | | `IMPLEMENTATION.md` | ✅ Created | This file | --- ## 🎯 Next Steps ### For Development: 1. ✅ Compile: `cd sources/inverter-cli && make` 2. ✅ Test locally: `bash test-autodiscovery.sh` 3. ✅ Verify values: Check `/tmp/inverter-test-*/` output ### For Production: 1. **Build Docker image:** ```bash docker build -f Dockerfile.multiarch -t voltronic-mqtt:latest . ``` 2. **Update docker-compose.yml:** ```yaml image: voltronic-mqtt:latest # Use local image # OR image: bushrangers/ha-voltronic-mqtt:latest # Use from hub ``` 3. **Deploy:** ```bash docker-compose down docker-compose up -d docker logs -f voltronic-mqtt ``` 4. **Verify MQTT:** ```bash mosquitto_sub -h -t "homeassistant/#" -v ``` ### For Multi-Arch Build: ```bash # Push to Gitea - triggers automatic multi-arch build git add . git commit -m "feat: Add auto-discovery feature v2.0" git tag v2.0.0 git push origin main --tags ``` --- ## 💡 Key Benefits ✅ **Plug & Play** - No manual buffer size configuration ✅ **Hardware Agnostic** - Works with different inverter models ✅ **Persistent** - Discovery runs once, cached forever ✅ **Flexible** - Force/skip options for all scenarios ✅ **Multi-Inverter** - Each container discovers independently ✅ **Robust** - Graceful fallback on failure ✅ **Developer Friendly** - Detailed logs and test script --- ## 📚 Related Documentation - [AUTO_DISCOVERY.md](AUTO_DISCOVERY.md) - Complete user guide - [.vscode/DEBUG.md](.vscode/DEBUG.md) - Development debugging guide - [.github/copilot-instructions.md](.github/copilot-instructions.md) - AI coding guidelines - [README.md](README.md) - Main project documentation --- ## 🏆 Version History **v2.0 (Current)** - ✅ Auto-discovery feature - ✅ Smart container entrypoint - ✅ Environment variable configuration - ✅ Persistent caching - ✅ Comprehensive documentation **v1.x** - Basic Voltronic MQTT bridge - Manual buffer size configuration - Static inverter.conf --- **Implementation Date:** January 25, 2026 **Author:** GitHub Copilot + User **Status:** ✅ Complete & Tested