36743a59c8
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 6m49s
- 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
354 lines
8.7 KiB
Markdown
354 lines
8.7 KiB
Markdown
# Configurazione Multi-Inverter
|
|
|
|
## Panoramica
|
|
|
|
Il sistema supporta **un inverter per container**. Per monitorare più inverter, devi eseguire più istanze del container, ciascuna configurata con:
|
|
- Device seriale diverso (`/dev/ttyUSB0`, `/dev/ttyUSB1`, ecc.)
|
|
- Nome device MQTT unico (`voltronic1`, `voltronic2`, ecc.)
|
|
- Topic MQTT dedicato (opzionale)
|
|
|
|
## Configurazione Docker Compose per Due Inverter
|
|
|
|
```yaml
|
|
version: '3'
|
|
|
|
services:
|
|
# Primo Inverter - /dev/ttyUSB0
|
|
voltronic-inverter1:
|
|
image: gitea.home-nas-ds.org/alessio/docker-voltronic-homeassistant:latest
|
|
container_name: voltronic-inverter1
|
|
privileged: true
|
|
restart: always
|
|
|
|
environment:
|
|
- INVERTER_DEVICE=/dev/ttyUSB0
|
|
- MQTT_SERVER=192.168.1.37
|
|
- MQTT_PORT=1883
|
|
- MQTT_TOPIC=homeassistant
|
|
- MQTT_DEVICENAME=inverter1 # Nome unico per primo inverter
|
|
- MQTT_USERNAME=mqtt_user
|
|
- MQTT_PASSWORD=your_password_here
|
|
- FORCE_DISCOVERY=false
|
|
- SKIP_DISCOVERY=false
|
|
|
|
volumes:
|
|
- ./config/inverter1/:/etc/inverter/
|
|
- voltronic-cache1:/cache/
|
|
|
|
devices:
|
|
- /dev/bus/usb:/dev/bus/usb:rwm
|
|
- /dev/ttyUSB0:/dev/ttyUSB0:rwm
|
|
|
|
# Secondo Inverter - /dev/ttyUSB1
|
|
voltronic-inverter2:
|
|
image: gitea.home-nas-ds.org/alessio/docker-voltronic-homeassistant:latest
|
|
container_name: voltronic-inverter2
|
|
privileged: true
|
|
restart: always
|
|
|
|
environment:
|
|
- INVERTER_DEVICE=/dev/ttyUSB1
|
|
- MQTT_SERVER=192.168.1.37
|
|
- MQTT_PORT=1883
|
|
- MQTT_TOPIC=homeassistant
|
|
- MQTT_DEVICENAME=inverter2 # Nome unico per secondo inverter
|
|
- MQTT_USERNAME=mqtt_user
|
|
- MQTT_PASSWORD=your_password_here
|
|
- FORCE_DISCOVERY=false
|
|
- SKIP_DISCOVERY=false
|
|
|
|
volumes:
|
|
- ./config/inverter2/:/etc/inverter/
|
|
- voltronic-cache2:/cache/
|
|
|
|
devices:
|
|
- /dev/bus/usb:/dev/bus/usb:rwm
|
|
- /dev/ttyUSB1:/dev/ttyUSB1:rwm
|
|
|
|
volumes:
|
|
voltronic-cache1:
|
|
voltronic-cache2:
|
|
```
|
|
|
|
## Struttura Directory Config
|
|
|
|
Ogni inverter deve avere la propria directory di configurazione:
|
|
|
|
```
|
|
config/
|
|
├── inverter1/
|
|
│ ├── inverter.conf # Configurazione inverter 1
|
|
│ ├── mqtt.json # Template MQTT (credenziali vuote)
|
|
│ └── .discovery_done # Cache discovery (creato automaticamente)
|
|
└── inverter2/
|
|
├── inverter.conf # Configurazione inverter 2
|
|
├── mqtt.json # Template MQTT (credenziali vuote)
|
|
└── .discovery_done # Cache discovery (creato automaticamente)
|
|
```
|
|
|
|
## Topic MQTT Risultanti
|
|
|
|
Con la configurazione sopra, i sensori verranno pubblicati su:
|
|
|
|
**Inverter 1:**
|
|
- `homeassistant/sensor/inverter1_Battery_voltage`
|
|
- `homeassistant/sensor/inverter1_PV_in_watts`
|
|
- `homeassistant/sensor/inverter1_Load_watt`
|
|
- ...
|
|
|
|
**Inverter 2:**
|
|
- `homeassistant/sensor/inverter2_Battery_voltage`
|
|
- `homeassistant/sensor/inverter2_PV_in_watts`
|
|
- `homeassistant/sensor/inverter2_Load_watt`
|
|
- ...
|
|
|
|
## Identificazione Device Seriali
|
|
|
|
Per identificare quale inverter è connesso a quale porta USB:
|
|
|
|
```bash
|
|
# Lista tutti i device USB seriali
|
|
ls -la /dev/ttyUSB*
|
|
|
|
# Mostra info dettagliate device
|
|
udevadm info --name=/dev/ttyUSB0 | grep ID_SERIAL
|
|
|
|
# Test comunicazione con inverter
|
|
docker run --rm --device=/dev/ttyUSB0:/dev/ttyUSB0 \
|
|
gitea.home-nas-ds.org/alessio/docker-voltronic-homeassistant:latest \
|
|
/opt/inverter-cli/bin/inverter_poller -d -1
|
|
```
|
|
|
|
## Creazione File di Configurazione
|
|
|
|
### inverter.conf (per ogni inverter)
|
|
|
|
```bash
|
|
# Crea directory config per ogni inverter
|
|
mkdir -p config/inverter1 config/inverter2
|
|
|
|
# Crea inverter.conf per inverter1
|
|
cat > config/inverter1/inverter.conf << 'EOF'
|
|
device=/dev/ttyUSB0
|
|
run_interval=120
|
|
amperage_factor=1.0
|
|
watt_factor=1.01
|
|
qpiri=103
|
|
qpiws=40
|
|
qmod=5
|
|
qpigs=110
|
|
EOF
|
|
|
|
# Crea inverter.conf per inverter2
|
|
cat > config/inverter2/inverter.conf << 'EOF'
|
|
device=/dev/ttyUSB1
|
|
run_interval=120
|
|
amperage_factor=1.0
|
|
watt_factor=1.01
|
|
qpiri=103
|
|
qpiws=40
|
|
qmod=5
|
|
qpigs=110
|
|
EOF
|
|
```
|
|
|
|
### mqtt.json (template per ogni inverter)
|
|
|
|
```bash
|
|
# Crea mqtt.json per inverter1
|
|
cat > config/inverter1/mqtt.json << 'EOF'
|
|
{
|
|
"server": "192.168.1.37",
|
|
"port": "1883",
|
|
"topic": "homeassistant",
|
|
"devicename": "inverter1",
|
|
"username": "",
|
|
"password": "",
|
|
"clientid": "inverter1_auto",
|
|
"influx": {
|
|
"enabled": "false"
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Crea mqtt.json per inverter2
|
|
cat > config/inverter2/mqtt.json << 'EOF'
|
|
{
|
|
"server": "192.168.1.37",
|
|
"port": "1883",
|
|
"topic": "homeassistant",
|
|
"devicename": "inverter2",
|
|
"username": "",
|
|
"password": "",
|
|
"clientid": "inverter2_auto",
|
|
"influx": {
|
|
"enabled": "false"
|
|
}
|
|
}
|
|
EOF
|
|
```
|
|
|
|
**Nota:** Le credenziali MQTT vengono fornite tramite ENV variables e aggiornate automaticamente all'avvio del container.
|
|
|
|
## Avvio Container
|
|
|
|
```bash
|
|
# Avvia entrambi i container
|
|
docker compose up -d
|
|
|
|
# Verifica stato
|
|
docker compose ps
|
|
|
|
# Verifica log primo inverter
|
|
docker logs -f voltronic-inverter1
|
|
|
|
# Verifica log secondo inverter
|
|
docker logs -f voltronic-inverter2
|
|
```
|
|
|
|
## Discovery Automatica
|
|
|
|
Al primo avvio, ogni container:
|
|
1. Rileva automaticamente i buffer sizes dell'inverter connesso
|
|
2. Salva la configurazione in `.discovery_done`
|
|
3. Nei successivi restart, usa i valori cached
|
|
|
|
Per forzare re-discovery:
|
|
```bash
|
|
# Primo inverter
|
|
docker exec voltronic-inverter1 rm /etc/inverter/.discovery_done
|
|
docker restart voltronic-inverter1
|
|
|
|
# Secondo inverter
|
|
docker exec voltronic-inverter2 rm /etc/inverter/.discovery_done
|
|
docker restart voltronic-inverter2
|
|
```
|
|
|
|
## Home Assistant Integration
|
|
|
|
Entrambi gli inverter verranno rilevati automaticamente in Home Assistant tramite MQTT Discovery. I sensori appariranno come dispositivi separati:
|
|
|
|
- **Device: inverter1**
|
|
- Sensori: Battery Voltage, PV Watts, Load, ecc.
|
|
- **Device: inverter2**
|
|
- Sensori: Battery Voltage, PV Watts, Load, ecc.
|
|
|
|
## Troubleshooting
|
|
|
|
### Problema: Container non riesce ad accedere al device
|
|
|
|
**Soluzione:** Verifica permessi device e gruppo utente
|
|
|
|
```bash
|
|
# Aggiungi utente al gruppo dialout
|
|
sudo usermod -aG dialout $USER
|
|
|
|
# Verifica permessi device
|
|
ls -la /dev/ttyUSB*
|
|
|
|
# Dovrebbe mostrare: crw-rw---- 1 root dialout ...
|
|
```
|
|
|
|
### Problema: Discovery fallisce per un inverter
|
|
|
|
**Causa:** Buffer sizes incompatibili o device non risponde
|
|
|
|
**Soluzione:** Esegui discovery manuale con debug
|
|
|
|
```bash
|
|
docker exec -it voltronic-inverter1 \
|
|
/opt/inverter-cli/bin/inverter_poller -d -a
|
|
```
|
|
|
|
### Problema: Topic MQTT sovrapposti
|
|
|
|
**Causa:** Entrambi i container usano lo stesso `MQTT_DEVICENAME`
|
|
|
|
**Soluzione:** Verifica che ogni container abbia nome unico:
|
|
- inverter1: `MQTT_DEVICENAME=inverter1`
|
|
- inverter2: `MQTT_DEVICENAME=inverter2`
|
|
|
|
### Problema: Alto consumo CPU
|
|
|
|
**Causa:** Intervallo polling troppo frequente
|
|
|
|
**Soluzione:** Aumenta `run_interval` in `inverter.conf`:
|
|
```bash
|
|
# Default: 120 (ogni 30s)
|
|
# Meno frequente: 240 (ogni 60s)
|
|
run_interval=240
|
|
```
|
|
|
|
## Performance e Risorse
|
|
|
|
**Consumo per singolo container:**
|
|
- CPU: ~0-2% (spike ogni 30s durante polling)
|
|
- RAM: ~10-15 MB
|
|
- Network: ~1-2 KB/s (MQTT messages)
|
|
|
|
**Consumo totale per 2 inverter:**
|
|
- CPU: ~0-4%
|
|
- RAM: ~20-30 MB
|
|
- Network: ~2-4 KB/s
|
|
|
|
## Sicurezza
|
|
|
|
⚠️ **IMPORTANTE:**
|
|
- Non committare credenziali MQTT in `mqtt.json` (devono rimanere vuote)
|
|
- Le credenziali vengono fornite solo tramite ENV variables
|
|
- Usa password forti per l'accesso MQTT broker
|
|
- Considera l'uso di Docker secrets per ambienti production
|
|
|
|
## Esempio Completo: Due Inverter in Parallelo
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
version: '3'
|
|
|
|
services:
|
|
inverter-garage:
|
|
image: gitea.home-nas-ds.org/alessio/docker-voltronic-homeassistant:latest
|
|
container_name: inverter-garage
|
|
privileged: true
|
|
restart: always
|
|
environment:
|
|
- INVERTER_DEVICE=/dev/ttyUSB0
|
|
- MQTT_SERVER=192.168.1.37
|
|
- MQTT_DEVICENAME=garage
|
|
- MQTT_USERNAME=mqtt_user
|
|
- MQTT_PASSWORD=${MQTT_PASSWORD} # Da .env file
|
|
volumes:
|
|
- ./config/garage/:/etc/inverter/
|
|
- voltronic-garage:/cache/
|
|
devices:
|
|
- /dev/ttyUSB0:/dev/ttyUSB0:rwm
|
|
|
|
inverter-cantina:
|
|
image: gitea.home-nas-ds.org/alessio/docker-voltronic-homeassistant:latest
|
|
container_name: inverter-cantina
|
|
privileged: true
|
|
restart: always
|
|
environment:
|
|
- INVERTER_DEVICE=/dev/ttyUSB1
|
|
- MQTT_SERVER=192.168.1.37
|
|
- MQTT_DEVICENAME=cantina
|
|
- MQTT_USERNAME=mqtt_user
|
|
- MQTT_PASSWORD=${MQTT_PASSWORD} # Da .env file
|
|
volumes:
|
|
- ./config/cantina/:/etc/inverter/
|
|
- voltronic-cantina:/cache/
|
|
devices:
|
|
- /dev/ttyUSB1:/dev/ttyUSB1:rwm
|
|
|
|
volumes:
|
|
voltronic-garage:
|
|
voltronic-cantina:
|
|
```
|
|
|
|
**.env file:**
|
|
```bash
|
|
MQTT_PASSWORD=your_secure_password_here
|
|
```
|
|
|
|
Questo setup permette di monitorare due inverter in parallelo con nomi descrittivi e gestione centralizzata delle credenziali.
|