6af9fcad7e
Build Docker Image for Raspberry Pi / build-and-push (push) Failing after 4m42s
🆕 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
393 lines
8.8 KiB
Markdown
393 lines
8.8 KiB
Markdown
# 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:
|
||
|
||
1. **Controlla** se esiste già una configurazione salvata (`.discovery_done`)
|
||
2. **Testa** la comunicazione con l'inverter inviando i 4 comandi principali
|
||
3. **Rileva** le dimensioni corrette del buffer per ogni comando
|
||
4. **Salva** i parametri scoperti in `/etc/inverter/.discovery_done`
|
||
5. **Aggiorna** `/etc/inverter/inverter.conf` con i valori corretti
|
||
6. **Avvia** i servizi MQTT normalmente
|
||
|
||
## Variabili d'Ambiente
|
||
|
||
### `INVERTER_DEVICE`
|
||
Specifica il device seriale dell'inverter.
|
||
|
||
**Default:** `/dev/ttyUSB0`
|
||
|
||
**Esempi:**
|
||
```yaml
|
||
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:**
|
||
```yaml
|
||
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:**
|
||
```yaml
|
||
environment:
|
||
- SKIP_DISCOVERY=true
|
||
```
|
||
|
||
## Scenari d'Uso
|
||
|
||
### Scenario 1: Primo Avvio (Default)
|
||
```yaml
|
||
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)
|
||
```yaml
|
||
services:
|
||
voltronic-mqtt:
|
||
environment:
|
||
- INVERTER_DEVICE=/dev/ttyUSB1
|
||
```
|
||
|
||
**Cosa succede:**
|
||
- ✓ Container trova `.discovery_done` esistente
|
||
- ✓ 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
|
||
```yaml
|
||
services:
|
||
voltronic-mqtt:
|
||
environment:
|
||
- INVERTER_DEVICE=/dev/ttyUSB0 # Cambiato da ttyUSB1
|
||
```
|
||
|
||
**Cosa succede:**
|
||
- ✓ Container rileva che il device è cambiato
|
||
- ✓ Elimina `.discovery_done` esistente
|
||
- ✓ 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
|
||
```yaml
|
||
services:
|
||
voltronic-mqtt:
|
||
environment:
|
||
- INVERTER_DEVICE=/dev/ttyUSB1
|
||
- FORCE_DISCOVERY=true
|
||
```
|
||
|
||
**Cosa succede:**
|
||
- ✓ Ignora `.discovery_done` esistente
|
||
- ✓ Esegue sempre auto-discovery
|
||
- ✓ Aggiorna parametri salvati
|
||
|
||
**Quando usarlo:** Dopo aggiornamento firmware inverter, troubleshooting.
|
||
|
||
### Scenario 5: Skip Discovery
|
||
```yaml
|
||
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:
|
||
|
||
```bash
|
||
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:**
|
||
1. Verifica che l'inverter sia acceso
|
||
2. Controlla il cablaggio RS232/USB
|
||
3. Verifica il device corretto: `ls -la /dev/tty*`
|
||
4. Testa manualmente:
|
||
```bash
|
||
docker exec -it voltronic-mqtt /opt/inverter-cli/bin/inverter_poller -a
|
||
```
|
||
|
||
### Device Non Trovato
|
||
|
||
**Errore:**
|
||
```
|
||
Unable to open device file
|
||
```
|
||
|
||
**Soluzioni:**
|
||
1. Verifica mapping in docker-compose.yml:
|
||
```yaml
|
||
devices:
|
||
- /dev/ttyUSB1:/dev/ttyUSB1:rwm
|
||
```
|
||
2. Controlla permessi: `sudo chmod 666 /dev/ttyUSB1`
|
||
3. Verifica che il device esista: `ls -la /dev/ttyUSB1`
|
||
|
||
### Valori Scoperti Errati
|
||
|
||
**Soluzione 1 - Force Discovery:**
|
||
```yaml
|
||
environment:
|
||
- FORCE_DISCOVERY=true
|
||
```
|
||
|
||
**Soluzione 2 - Configurazione Manuale:**
|
||
```yaml
|
||
environment:
|
||
- SKIP_DISCOVERY=true
|
||
```
|
||
E modifica manualmente `config/inverter.conf`:
|
||
```bash
|
||
device=/dev/ttyUSB1
|
||
qmod=5
|
||
qpigs=110
|
||
qpiri=103
|
||
qpiws=40
|
||
```
|
||
|
||
## Test Manuale
|
||
|
||
Puoi testare l'auto-discovery manualmente senza riavviare il container:
|
||
|
||
```bash
|
||
# 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
|
||
|
||
1. **Primo Setup:** Lascia auto-discovery attivo (default)
|
||
2. **Produzione:** Dopo aver verificato che funzioni, considera `SKIP_DISCOVERY=true` per avvio rapido
|
||
3. **Multi-Inverter:** Usa container separati con `INVERTER_DEVICE` diversi
|
||
4. **Backup:** Salva `config/.discovery_done` dopo il primo successo
|
||
5. **Logging:** Monitora i log del primo avvio per verificare discovery:
|
||
```bash
|
||
docker logs voltronic-mqtt
|
||
```
|
||
|
||
## Esempio Completo docker-compose.yml
|
||
|
||
```yaml
|
||
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:
|
||
|
||
1. **Backup configurazione esistente:**
|
||
```bash
|
||
cp config/inverter.conf config/inverter.conf.old
|
||
```
|
||
|
||
2. **Aggiungi variabili d'ambiente al docker-compose.yml:**
|
||
```yaml
|
||
environment:
|
||
- INVERTER_DEVICE=/dev/ttyUSB1 # Il tuo device attuale
|
||
```
|
||
|
||
3. **Primo avvio con auto-discovery:**
|
||
```bash
|
||
docker-compose down
|
||
docker-compose up -d
|
||
docker logs -f voltronic-mqtt
|
||
```
|
||
|
||
4. **Verifica risultati:**
|
||
```bash
|
||
cat config/.discovery_done
|
||
```
|
||
|
||
5. **Se tutto OK, abilita skip per avvio rapido:**
|
||
```yaml
|
||
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.
|