- 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 timeout 15s al parallel discovery per evitare blocchi
- mqtt-init-parallel.sh in stile originale semplice
- Per ogni inverter scoperto: registra topic discovery (voltronic_inv1_*, inv2_*, ...)
- Discovery topics ogni 10 minuti invece di 5
- Fallback automatico a single-mode se timeout o count=0
- Mantiene la semplicità dello script originale
Il parallel discovery testa QPGS0-9 per trovare inverter configurati in parallelo.
Se timeout o nessun inverter trovato, usa modalità standard.
- Modificato entrypoint.sh per rilevare automaticamente inverter paralleli
- Usa flag -p per parallel discovery (testa QPGS0-9)
- Script mqtt-push-parallel.sh per pubblicare dati di ogni inverter
- Script mqtt-init-parallel.sh per discovery topics (ogni 10 min)
- Naming: voltronic_inv1, voltronic_inv2, ecc.
- Fallback automatico a single-mode se PARALLEL_COUNT=0
Nota: Il parallel discovery richiede che inverter supportino comandi QPGS
- Aggiornato mqtt-init.sh per supportare array INVERTER_DEVICES
- Registrazione discovery topics per ogni inverter (voltronic, voltronic2, ecc.)
- Aggiunto unique_id e device info per Home Assistant
- Flag retain sui config topics per persistenza
- Naming coerente con mqtt-push.sh (voltronic, voltronic2, voltronic3, ...)
- Echo output per debug registrazione topics
- Necessario configurare il runner per risolvere il dominio all'IP locale
- Evita problemi con pull dall'esterno usando tag con IP locale
- Mantiene compatibilità con accesso pubblico al registry
- Evita passaggio attraverso Cloudflare (413 Payload Too Large)
- Registry in rete locale: 192.168.1.37 invece di gitea.home-nas-ds.org
- Image name: 192.168.1.37/alessio/ha-voltronic-mqtt
- Sostituito GITEA_TOKEN con GITHUB_TOKEN (token standard Actions)
- Username: github.repository_owner invece di github.actor
- GITHUB_TOKEN è fornito automaticamente senza configurazione
- Sostituito DOCKER_USERNAME/PASSWORD con github.actor/GITEA_TOKEN
- Il token GITEA_TOKEN è fornito automaticamente dalle Actions
- Non richiede configurazione manuale dei secrets
- Implementato array parsing per INVERTER_DEVICES (separatore ':')
- Refactoring mqtt-push.sh con funzione process_inverter()
- Topic MQTT separati per ogni inverter (voltronic, voltronic2, voltronic3, ecc.)
- Aggiornate tutte le 33 metriche con devicename dinamico
- Fix parsing JSON con filtro grep per messaggi [POLL]
- Documentazione ENV variable INVERTER_DEVICES in docker-compose.yml
Esempio configurazione:
INVERTER_DEVICES=/dev/ttyUSB0:/dev/ttyUSB1:/dev/ttyUSB2
- Rimosso credenziali hardcoded da mqtt.json (devono essere fornite solo da ENV)
- Ottimizzato mqtt-push.sh: caricamento config MQTT una sola volta all'avvio
- Ridotto I/O con redirect stderr su /dev/null
- Fix errore sed con device path contenente slash
- Aggiunto controllo esecuzione update_mqtt_config solo se ENV impostate
- Ridotto consumo CPU da 25% a ~0-2%
Nuovo:
- Documentazione multi-inverter completa (MULTI_INVERTER.md)
- Aggiornato README con sezione performance e multi-inverter
- Aggiunto .gitignore per file cache/backup runtime
Fixes:
- Bug sed delimiter con device path /dev/ttyUSB*
- Letture ripetute mqtt.json con jq (30+ per ciclo)
- Credenziali non aggiornate da ENV se mqtt.json esiste
- Aggiunto check all'avvio per verificare esistenza inverter.conf e mqtt.json
- Se mancanti, crea file di default automaticamente
- Risolve problema volume mount che sovrascrive file copiati in build
- Config default con valori standard funzionanti
- ENV variables sovrascrivono comunque i default tramite update_mqtt_config()
Ora il container parte anche con directory ./config vuota
- Aggiunto quote all'output dei tag per evitare esecuzione come comando
- Risolve errore 'No such file or directory' quando tag contengono '/'
- Output ora corretto: echo "Tags:" && echo "${{ tags }}"
- Previene interpretazione shell dei tag come path/comandi
- Rimosse opzioni cache-from e cache-to type=gha
- GitHub Actions Cache non supportata da Gitea Actions
- Risolve errore 'dial tcp 172.16.8.2:36207: i/o timeout'
- Build ora procede senza cache (più lento ma funzionante)
- Possibile ottimizzazione futura: cache locale o registry
- Cambiato FROM debian:bullseye -> debian:bookworm
- Risolve errore 'no match for platform in manifest' per arm/v6
- Debian Bookworm (12) è la versione stable corrente
- Supporto multi-arch completo per linux/arm/v6,v7,arm64
- Bullseye è ora oldstable con supporto multi-arch limitato
- Aggiunto step 'Prepare image name' per gestire nome immagine dinamico
- Se secrets configurati: usa username/ha-voltronic-mqtt
- Se secrets mancanti: usa local/ha-voltronic-mqtt (build locale)
- Corretto flag SHOULD_PUSH basato su presenza secrets
- Risolto errore 'invalid tag' quando DOCKER_USERNAME è vuoto
Ora il workflow esegue build anche senza secrets configurati
- Aggiunto supporto ENV variables nel Dockerfile:
* INVERTER_DEVICE, MQTT_SERVER, MQTT_PORT, MQTT_TOPIC
* MQTT_DEVICENAME, MQTT_USERNAME, MQTT_PASSWORD
* FORCE_DISCOVERY, SKIP_DISCOVERY
- Implementata funzione update_mqtt_config() in entrypoint.sh
* Aggiorna automaticamente mqtt.json da ENV variables all'avvio
* Backup automatico configurazione originale
- Fix workflow Docker build:
* Login Docker Hub solo se secrets configurati
* Push solo se secrets disponibili (evita errori CI/CD)
* Build funziona anche senza secrets (utile per test locali)
- Aggiornato docker-compose.yml con esempio ENV variables
- Creata documentazione completa DOCKER_SETUP.md:
* Guida configurazione variabili d'ambiente
* Esempi docker-compose e docker run
* Guida configurazione secrets Gitea
* Troubleshooting e health check
Ora è possibile configurare completamente il container senza modificare file
- 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
- Aggiunto id 'docker_build' allo step di build
- Quotato output tags per evitare errore 'command not found'
- Aggiunto output del digest dell'immagine
- Migliorato formato output con labels descrittivi
- Aggiunto env REGISTRY: 192.168.1.37:30008 per bypassare Cloudflare
- Configurato buildx per supportare HTTP insecure sul registry locale
- Aggiornato docker meta per usare registry IP diretto
- Modificato login per autenticarsi su 192.168.1.37:30008
- Risolto errore 413 Payload Too Large causato da Cloudflare
Il binario inverter_poller viene già compilato direttamente in bin/ da cmake/make, il comando 'mv inverter_poller bin/' causava errore perché il file non esisteva nella directory corrente.
- Debian Bullseye non supporta arm/v6 (solo Pi Zero W v1 e Pi 1)
- Mantenuti arm/v7 e arm64 (compatibili con Pi 3, 4, 5)
- Pi 5 a 64-bit usa linux/arm64
- Modificato docker-build.yml e docker-cleanup.yml
- Il token automatico github.token non ha permessi sufficienti
- Aggiunta guida SETUP_GITEA_TOKEN.md per configurazione
- Modificato docker-build.yml per usare gitea.home-nas-ds.org invece di Docker Hub
- Modificato docker-cleanup.yml per autenticazione con registry Gitea
- Usato github.token automatico invece di secrets esterni
- Aggiornata documentazione per riflettere i cambiamenti
Since I am not using Influx as a DB of my HomeAssistant setup, I wanted a way to bring the data there. Another issue is that I used another script to gather the data and hence have other naming conventions on my dashboards. Therefore the name of the measurements are now part of the config JSON file. This could be an idea adopted to MQTT as well.