🆕 Funzionalità Auto-Discovery - Aggiunto metodo AutoDiscoverBufferSizes() per rilevamento automatico QPIGS/QPIRI/QMOD/QPIWS - Supporto variabili d'ambiente (INVERTER_DEVICE, MQTT_SERVER, etc.) - Caching persistente buffer sizes in /cache/inverter.conf.cache - Flag -a/--auto-discover per modalità auto-detection 🐛 Bug Fixes Critici - **Parsing interi**: Aggiunta attemptAddSettingInt() con stoi() invece di stof() - Fix: stof('98') = 98.0f → 97 (int), ora stoi('98') = 98 direttamente - Applicato a: qpiri, qpiws, qmod, qpigs - **Thread sync**: Aggiunto ups_qpiws_changed a main loop e condizione exit poll() - Fix: loop principale controllava solo 3 flag su 4, causava hang - Fix: thread poll() non usciva in runOnce perché mancava controllo QPIWS - **Config accuracy**: Corretti buffer sizes (qpiri: 98→103, qpiws: 36→40) - Rimosso sources/inverter-cli/inverter.conf che sovrascriveva config globale - Validato con test: inverter_poller -1 completa in 6s con JSON completo 📚 Documentazione Completa - Creato documentation/CODE_ARCHITECTURE.md (38KB) - Mappa logica variabili globali - Flusso esecuzione main() con diagrammi ASCII - Sequence diagram classe cInverter (poll, query, auto-discovery) - Thread synchronization diagrams - MQTT integration bash scripts flow - Mappa concettuale 5-layer system architecture - Error handling e performance optimizations - Organizzati file .md in documentation/ (AUTO_DISCOVERY, IMPLEMENTATION, QUICKSTART, DEBUG) - Aggiornato README.md con sezione v2.0 e indice documentazione - Aggiornato .github/copilot-instructions.md con novità v2.0 🔧 Miglioramenti Build & CI/CD - Gitea Actions per build multi-arch (arm/v6, arm/v7, arm64, amd64, 386) - Configurazione VS Code completa (tasks, launch, debug GDB) - Script test-autodiscovery.sh e test-device.sh ✅ Testing Validato - inverter_poller -1 completa in 6 secondi - Output JSON completo con tutte le metriche - Exit pulito senza timeout (exit code 0) - Tutte le 4 query QMOD/QPIGS/QPIRI/QPIWS funzionanti
8.4 KiB
🎉 Auto-Discovery Implementation Complete!
✅ What's Been Added
1. Auto-Discovery Feature in C++ Binary
File: 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
./inverter_poller -a # Run auto-discovery
./inverter_poller -d -a # Run with debug output
2. Smart Container Entrypoint
File: 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
Added Environment Variables:
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 - 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 - 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
Added section:
- 🆕 Auto-Discovery Feature (v2.0+)
- Link to detailed documentation
- Environment variable examples
🚀 How to Use
Quick Start (Default Setup)
-
Edit docker-compose.yml - Set your device:
environment: - INVERTER_DEVICE=/dev/ttyUSB1 -
Start container:
docker-compose up -d -
Watch logs:
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)
# 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
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
# 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)
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:
- Check inverter is powered on
- Verify cable connection
- Test device manually:
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:
# 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:
- ✅ Compile:
cd sources/inverter-cli && make - ✅ Test locally:
bash test-autodiscovery.sh - ✅ Verify values: Check
/tmp/inverter-test-*/output
For Production:
-
Build Docker image:
docker build -f Dockerfile.multiarch -t voltronic-mqtt:latest . -
Update docker-compose.yml:
image: voltronic-mqtt:latest # Use local image # OR image: bushrangers/ha-voltronic-mqtt:latest # Use from hub -
Deploy:
docker-compose down docker-compose up -d docker logs -f voltronic-mqtt -
Verify MQTT:
mosquitto_sub -h <mqtt-server> -t "homeassistant/#" -v
For Multi-Arch Build:
# 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 - Complete user guide
- .vscode/DEBUG.md - Development debugging guide
- .github/copilot-instructions.md - AI coding guidelines
- 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