🆕 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.8 KiB
Auto-Discovery Feature
Il sistema di auto-discovery rileva automaticamente i parametri di comunicazione corretti del tuo inverter all'avvio del container.
Come Funziona
All'avvio, il container:
- Controlla se esiste già una configurazione salvata (
.discovery_done) - Testa la comunicazione con l'inverter inviando i 4 comandi principali
- Rileva le dimensioni corrette del buffer per ogni comando
- Salva i parametri scoperti in
/etc/inverter/.discovery_done - Aggiorna
/etc/inverter/inverter.confcon i valori corretti - Avvia i servizi MQTT normalmente
Variabili d'Ambiente
INVERTER_DEVICE
Specifica il device seriale dell'inverter.
Default: /dev/ttyUSB0
Esempi:
environment:
- INVERTER_DEVICE=/dev/ttyUSB1 # USB-to-Serial adapter
- INVERTER_DEVICE=/dev/ttyS0 # Built-in serial port
- INVERTER_DEVICE=/dev/hidraw0 # USB HID device
FORCE_DISCOVERY
Forza l'auto-discovery ad ogni avvio, anche se esistono già parametri salvati.
Default: false
Quando usarlo:
- Dopo aver cambiato inverter
- Se sospetti che i parametri salvati siano errati
- Per debug o testing
Esempio:
environment:
- FORCE_DISCOVERY=true
SKIP_DISCOVERY
Salta completamente l'auto-discovery e usa solo i valori da inverter.conf.
Default: false
Quando usarlo:
- Quando conosci già i parametri corretti
- Per velocizzare l'avvio (risparmia ~10 secondi)
- In ambienti di produzione stabili
Esempio:
environment:
- SKIP_DISCOVERY=true
Scenari d'Uso
Scenario 1: Primo Avvio (Default)
services:
voltronic-mqtt:
environment:
- INVERTER_DEVICE=/dev/ttyUSB1
Cosa succede:
- ✓ Container rileva che non esiste
.discovery_done - ✓ Esegue auto-discovery (~10-15 secondi)
- ✓ Salva i parametri trovati
- ✓ Avvia i servizi MQTT
Log:
=== Voltronic MQTT Bridge Starting ===
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...
Testing QMOD command (buffer 5-100)...
✓ QMOD: found response at 5 bytes
...
✓ Auto-discovery completed successfully!
device=/dev/ttyUSB1
qmod=5
qpigs=110
qpiri=103
qpiws=40
Scenario 2: Avvii Successivi (Cached)
services:
voltronic-mqtt:
environment:
- INVERTER_DEVICE=/dev/ttyUSB1
Cosa succede:
- ✓ Container trova
.discovery_doneesistente - ✓ Verifica che il device non sia cambiato
- ✓ Carica i parametri salvati
- ✓ Avvia immediatamente i servizi (nessun ritardo)
Log:
=== Voltronic MQTT Bridge Starting ===
Configuration:
Device: /dev/ttyUSB1
Force Discovery: false
Skip Discovery: false
✓ Using previous discovery results
Current configuration:
device=/dev/ttyUSB1
qmod=5
qpigs=110
qpiri=103
qpiws=40
=== Starting MQTT Bridge Services ===
Scenario 3: Cambio Device
services:
voltronic-mqtt:
environment:
- INVERTER_DEVICE=/dev/ttyUSB0 # Cambiato da ttyUSB1
Cosa succede:
- ✓ Container rileva che il device è cambiato
- ✓ Elimina
.discovery_doneesistente - ✓ Esegue nuovamente l'auto-discovery
- ✓ Salva i nuovi parametri
Log:
⚠ Device changed from /dev/ttyUSB1 to /dev/ttyUSB0
Running new discovery...
=== Running Auto-Discovery ===
...
Scenario 4: Force Discovery
services:
voltronic-mqtt:
environment:
- INVERTER_DEVICE=/dev/ttyUSB1
- FORCE_DISCOVERY=true
Cosa succede:
- ✓ Ignora
.discovery_doneesistente - ✓ Esegue sempre auto-discovery
- ✓ Aggiorna parametri salvati
Quando usarlo: Dopo aggiornamento firmware inverter, troubleshooting.
Scenario 5: Skip Discovery
services:
voltronic-mqtt:
environment:
- INVERTER_DEVICE=/dev/ttyUSB1
- SKIP_DISCOVERY=true
Cosa succede:
- ✓ Non esegue mai auto-discovery
- ✓ Usa solo valori da
config/inverter.conf - ✓ Avvio istantaneo
Quando usarlo: Parametri già noti e stabili, avvio rapido richiesto.
File Generati
/etc/inverter/.discovery_done
Contiene i parametri scoperti con timestamp:
device=/dev/ttyUSB1
qmod=5
qpigs=110
qpiri=103
qpiws=40
timestamp=2024-01-15T10:30:00+01:00
Questo file è persistente nel volume ./config/ e sopravvive ai restart del container.
/etc/inverter/inverter.conf.backup
Backup automatico della configurazione originale prima dell'auto-discovery.
Troubleshooting
Discovery Fallisce
Log:
✗ Auto-discovery failed!
Please check:
1. Inverter is powered on
2. Cable is properly connected
3. Device path is correct: /dev/ttyUSB1
Falling back to default configuration...
Soluzioni:
- Verifica che l'inverter sia acceso
- Controlla il cablaggio RS232/USB
- Verifica il device corretto:
ls -la /dev/tty* - Testa manualmente:
docker exec -it voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -a
Device Non Trovato
Errore:
Unable to open device file
Soluzioni:
- Verifica mapping in docker-compose.yml:
devices: - /dev/ttyUSB1:/dev/ttyUSB1:rwm - Controlla permessi:
sudo chmod 666 /dev/ttyUSB1 - Verifica che il device esista:
ls -la /dev/ttyUSB1
Valori Scoperti Errati
Soluzione 1 - Force Discovery:
environment:
- FORCE_DISCOVERY=true
Soluzione 2 - Configurazione Manuale:
environment:
- SKIP_DISCOVERY=true
E modifica manualmente config/inverter.conf:
device=/dev/ttyUSB1
qmod=5
qpigs=110
qpiri=103
qpiws=40
Test Manuale
Puoi testare l'auto-discovery manualmente senza riavviare il container:
# Test base
docker exec -it voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -a
# Test con debug
docker exec -it voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -d -a
# Test singolo comando
docker exec -it voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -r QPIGS
Best Practices
- Primo Setup: Lascia auto-discovery attivo (default)
- Produzione: Dopo aver verificato che funzioni, considera
SKIP_DISCOVERY=trueper avvio rapido - Multi-Inverter: Usa container separati con
INVERTER_DEVICEdiversi - Backup: Salva
config/.discovery_donedopo il primo successo - Logging: Monitora i log del primo avvio per verificare discovery:
docker logs voltronic-mqtt
Esempio Completo docker-compose.yml
version: '3'
services:
# Inverter primario su ttyUSB1
voltronic-mqtt-primary:
image: bushrangers/ha-voltronic-mqtt
container_name: voltronic-mqtt-primary
privileged: true
restart: always
environment:
- INVERTER_DEVICE=/dev/ttyUSB1
- FORCE_DISCOVERY=false
- SKIP_DISCOVERY=false
volumes:
- ./config-primary/:/etc/inverter/
devices:
- /dev/ttyUSB1:/dev/ttyUSB1:rwm
# Inverter secondario su ttyUSB0 (discovery skippato)
voltronic-mqtt-secondary:
image: bushrangers/ha-voltronic-mqtt
container_name: voltronic-mqtt-secondary
privileged: true
restart: always
environment:
- INVERTER_DEVICE=/dev/ttyUSB0
- SKIP_DISCOVERY=true # Parametri già noti
volumes:
- ./config-secondary/:/etc/inverter/
devices:
- /dev/ttyUSB0:/dev/ttyUSB0:rwm
Migrazione da Versione Precedente
Se stai aggiornando da una versione senza auto-discovery:
-
Backup configurazione esistente:
cp config/inverter.conf config/inverter.conf.old -
Aggiungi variabili d'ambiente al docker-compose.yml:
environment: - INVERTER_DEVICE=/dev/ttyUSB1 # Il tuo device attuale -
Primo avvio con auto-discovery:
docker-compose down docker-compose up -d docker logs -f voltronic-mqtt -
Verifica risultati:
cat config/.discovery_done -
Se tutto OK, abilita skip per avvio rapido:
environment: - INVERTER_DEVICE=/dev/ttyUSB1 - SKIP_DISCOVERY=true # Usa parametri scoperti
FAQ
Q: Quanto tempo impiega l'auto-discovery?
A: Circa 10-15 secondi al primo avvio. Gli avvii successivi sono istantanei.
Q: Posso usare auto-discovery con più inverter?
A: Sì! Usa container separati con INVERTER_DEVICE diversi e directory config separate.
Q: Cosa succede se l'inverter è spento durante discovery?
A: Il container fallisce gracefully e usa i parametri di default da inverter.conf.
Q: Devo eliminare .discovery_done manualmente?
A: No, il container lo fa automaticamente quando cambi INVERTER_DEVICE o usi FORCE_DISCOVERY=true.
Q: Posso disabilitare completamente auto-discovery?
A: Sì, usa SKIP_DISCOVERY=true.
Q: I parametri scoperti sono persistenti?
A: Sì, sono salvati nel volume ./config/ e sopravvivono ai restart.