- Aggiunto Step 1.5: query QPIGS prima del loop QPGS
- inv1 (master RS232): usa QPIGS DATA[19] = potenza PV misurata direttamente
dal controller MPPT (campo aggiunto nel firmware 'after_current_upgrade')
- inv2 (slave): formula DC-bus balance divisa per η_total (SCC+inverter losses)
- η calcolato dinamicamente da QPIGS quando batteria ferma (<2A carica/scarica)
altrimenti usa default 0.93 (~93.7% da misura reale su questo impianto)
- Corregge sottostima sistematica ~7% dovuta alle perdite DC→AC ignorate
Il protocollo QPGS non espone la corrente reale lato pannelli.
DATA[25] = corrente SCC→batteria SOLTANTO (0 quando batteria carica).
Formula corretta via conservazione energetica del DC bus:
P_pv = V_batt×DATA[25] + max(0, Load_W − V_batt×DATA[26])
Dove:
V_batt×DATA[25] = potenza SCC inviata alla batteria
Load_W = potenza consumata dal carico dal bus DC
V_batt×DATA[26] = potenza fornita dalla batteria in scarica
Casi coperti:
1. Bat. in carica (DATA[25]>0, DATA[26]=0): P = V_b×I_scc + Load
2. Bat. piena (DATA[25]=0, DATA[26]=0): P = Load
3. Bat. in scar. (DATA[25]=0, DATA[26]>0): P = max(0, Load−Pdisch)
Guard: calcolo solo quando SCC_charging (STATUS b5=1), altrimenti 0.
Aggiunto SCC_current (=DATA[25]) come campo separato per monitorare
la corrente SCC→batteria indipendentemente dalla produzione PV.
Aggiunto SCC_current al topic di discovery HA in mqtt-init-parallel.sh
- mqtt-push-parallel.sh: riscritto da 659 a 230 righe
* Rimosse tutte le meccaniche di serial discovery (VALID_SERIALS,
VALID_QPGS, PARALLEL_DISCOVERY, DIRECT_SERIALS, ecc.)
* Ora query direte QPGS0→inv1, QPGS1→inv2 senza discovery preliminare
* Numero inverter configurabile via CASCADE_COUNT env var (default 2)
* Fix PV_in_watts: quando DATA[25]=0 (batteria carica) e SCC_OK e
no AC grid (line_loss=1), usa Load_watt come proxy di produzione PV
* Aggiunto publish di PV_in_watthour e Load_watthour
* Aggiunto parsing corretto dei status flags dal byte di stato QPGS
- entrypoint.sh: riscritto da 240 a 131 righe
* Rimossa intera logica di auto-discovery buffer sizes
* Rimossi FORCE_DISCOVERY, SKIP_DISCOVERY, DISCOVERY_FLAG
* Rimossi run_discovery() e update_config_with_discovery()
* Startup immediato senza attese/tentativi di discovery
* CASCADE_COUNT env var propagata agli script
- healthcheck: corretto per processi effettivi del container
* Prima: cercava mqtt-subscriber + mosquitto_sub + watch (3 proc)
* watch non viene mai avviato → sempre unhealthy
* Ora: controlla mosquitto_sub (subscriber) + sleep (push loop cicla)
DATA[25] ('PV Input Current') nei reply QPGS è in realtà la corrente
in uscita dal SCC (Solar Charge Controller) verso la batteria, a tensione
batteria - NON la corrente ai pannelli PV a tensione PV.
Bug: PV_WATTS = DATA[14] (PV voltage ~246V) * DATA[25] (SCC current ~55A)
→ valore ~4-5x troppo alto (es. 246.8 * 55 = 13574W per inverter)
Fix: PV_WATTS = DATA[11] (battery voltage ~54V) * DATA[25] (SCC current)
→ valore corretto (es. 53.9 * 55 = 2964W per inverter)
Identico al comportamento di QPIGS in main.cpp:
pv_input_watts = scc_voltage * pv_input_current
con commento: 'input current is going to battery at battery voltage
(NOT at PV voltage)'
- Aggiunta funzione extractAndPublishAllData() con tutti i 33 parametri
- Parsing QPGS (19 params runtime) + QPIRI (8 params config) + PV_watts calcolato
- Fallback automatico a modalità standard se QPGS non disponibile
- Retry ridotto a 1 tentativo (2s delay) per performance
- Gestione errori NAK con messaggi informativi per utente
- Supporto bitmap status flags da QPGS (Load_on, SCC_on, AC_charge_on)
Note: Test mostrano che inverter attualmente in modalità Battery (QMOD=B)
risponde NAK a tutti i comandi eccetto QMOD. Necessaria verifica stato
fisico inverter o attivazione modalità parallela nel firmware.
FLUSSO IMPLEMENTATO:
1. All'avvio: registra discovery topics per 2 inverter (hardcoded)
2. Discovery topics ripetuti ogni 5 minuti (invece di 10)
3. Parallel discovery parametri con retry:
- Tenta discovery fino a 3 volte
- Se fallisce: attende 5s e riprova
- Se tutti i tentativi falliscono: assume 2 inverter
4. Estrazione dati ogni 30s per entrambi gli inverter
NAMING:
- Inverter 1: voltronic_inv1_*
- Inverter 2: voltronic_inv2_*
Discovery topics include tutti i 33 parametri per entrambi gli inverter
- Rimosso timeout e detection automatica
- Sempre modalità parallela forzata
- Default 2 inverter se parallel discovery fallisce
- Registra discovery per voltronic_inv1 e voltronic_inv2
NOTA: Se gli inverter non rispondono a QPGS, NON sono in modalità parallela.
Per gestire 2 inverter fisici separati, serve INVERTER_DEVICES=/dev/ttyUSB0:/dev/ttyUSB1
- Aggiunto supporto lettura inverter paralleli tramite comandi QPGS0-QPGS9
- Implementato discovery automatico inverter con filtro duplicati e serial invalidi
- Risolti bug critici comunicazione seriale:
* Fix buffer ExecuteCmd da 7 a 200 bytes
* Supporto terminatori CR e LF
* Modalità blocking con delay 500ms
* Lettura byte-by-byte per terminatore affidabile
- Implementato script MQTT per pubblicazione dati multi-inverter:
* mqtt-push-parallel.sh con topic separati per ogni inverter
* Fix autenticazione MQTT con username/password
* Aggiunto flag retain (-r) per persistenza dati
- Creato test-loop-parallel.sh per simulazione completa container
- Aggiornata documentazione con compatibilità MKS IV e guida test loop
- Aggiornati profili debug VS Code per bash e parallel discovery
- Configurazione MQTT completa con server reale (192.168.1.37:1883)
Sistema testato e funzionante con 2 inverter Voltronic Axpert MKS IV