diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 6700c2a..f308f2d 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -43,7 +43,7 @@ jobs: type=raw,value=latest,enable={{is_default_branch}} - name: Login to Docker Hub - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request' && secrets.DOCKER_USERNAME != '' uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} @@ -55,7 +55,7 @@ jobs: context: . file: ./Dockerfile.multiarch platforms: linux/arm/v6,linux/arm/v7,linux/arm64 - push: ${{ github.event_name != 'pull_request' }} + push: ${{ github.event_name != 'pull_request' && secrets.DOCKER_USERNAME != '' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | diff --git a/Dockerfile.multiarch b/Dockerfile.multiarch index 411e852..2c95711 100644 --- a/Dockerfile.multiarch +++ b/Dockerfile.multiarch @@ -24,6 +24,17 @@ ADD config/ /etc/inverter/ RUN cd /opt/inverter-cli && \ mkdir bin && cmake . && make +# Environment variables for runtime configuration +ENV INVERTER_DEVICE="/dev/ttyUSB0" \ + MQTT_SERVER="192.168.1.37" \ + MQTT_PORT="1883" \ + MQTT_TOPIC="homeassistant" \ + MQTT_DEVICENAME="voltronic" \ + MQTT_USERNAME="" \ + MQTT_PASSWORD="" \ + FORCE_DISCOVERY="false" \ + SKIP_DISCOVERY="false" + HEALTHCHECK \ --interval=30s \ --timeout=10s \ diff --git a/docker-compose.yml b/docker-compose.yml index 21434a9..9972029 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,9 +19,18 @@ services: # Environment variables for auto-discovery environment: - # Default device (can be ttyUSB0, ttyUSB1, ttyS0, hidraw0, etc.) - - INVERTER_DEVICE=/dev/ttyUSB1 + # Device configuration + - INVERTER_DEVICE=/dev/ttyUSB0 + # MQTT Broker configuration + - MQTT_SERVER=192.168.1.37 + - MQTT_PORT=1883 + - MQTT_TOPIC=homeassistant + - MQTT_DEVICENAME=voltronic + - MQTT_USERNAME=mqtt_user + - MQTT_PASSWORD=your_password_here + + # Auto-discovery options # Force auto-discovery on every container start (default: false) # Set to "true" to re-run discovery even if previous results exist - FORCE_DISCOVERY=false diff --git a/documentation/DOCKER_SETUP.md b/documentation/DOCKER_SETUP.md new file mode 100644 index 0000000..76fa5cc --- /dev/null +++ b/documentation/DOCKER_SETUP.md @@ -0,0 +1,203 @@ +# Docker Setup e Configurazione + +## Variabili d'Ambiente + +Il container supporta la configurazione tramite variabili d'ambiente per massima flessibilità. + +### Variabili Disponibili + +| Variabile | Descrizione | Default | +|-----------|-------------|---------| +| `INVERTER_DEVICE` | Device seriale inverter | `/dev/ttyUSB0` | +| `MQTT_SERVER` | Indirizzo IP/hostname broker MQTT | `192.168.1.37` | +| `MQTT_PORT` | Porta broker MQTT | `1883` | +| `MQTT_TOPIC` | Topic base MQTT | `homeassistant` | +| `MQTT_DEVICENAME` | Nome device per i topic | `voltronic` | +| `MQTT_USERNAME` | Username autenticazione MQTT | (vuoto) | +| `MQTT_PASSWORD` | Password autenticazione MQTT | (vuoto) | +| `FORCE_DISCOVERY` | Forza discovery ad ogni avvio | `false` | +| `SKIP_DISCOVERY` | Salta discovery, usa solo config | `false` | + +### Esempio docker-compose.yml + +```yaml +version: '3' + +services: + voltronic-mqtt: + image: bushrangers/ha-voltronic-mqtt + container_name: voltronic-mqtt + privileged: true + restart: always + + environment: + # Device configuration + - INVERTER_DEVICE=/dev/ttyUSB0 + + # MQTT Broker configuration + - MQTT_SERVER=192.168.1.100 + - MQTT_PORT=1883 + - MQTT_TOPIC=homeassistant + - MQTT_DEVICENAME=voltronic + - MQTT_USERNAME=mqtt_user + - MQTT_PASSWORD=secret_password + + # Discovery options + - FORCE_DISCOVERY=false + - SKIP_DISCOVERY=false + + volumes: + - ./config/:/etc/inverter/ + + devices: + - /dev/ttyUSB0:/dev/ttyUSB0:rwm + - /dev/ttyUSB1:/dev/ttyUSB1:rwm +``` + +### Esempio docker run + +```bash +docker run -d \ + --name voltronic-mqtt \ + --privileged \ + --restart always \ + -e INVERTER_DEVICE=/dev/ttyUSB0 \ + -e MQTT_SERVER=192.168.1.100 \ + -e MQTT_PORT=1883 \ + -e MQTT_USERNAME=mqtt_user \ + -e MQTT_PASSWORD=secret_password \ + -v $(pwd)/config:/etc/inverter/ \ + --device=/dev/ttyUSB0:/dev/ttyUSB0:rwm \ + bushrangers/ha-voltronic-mqtt +``` + +## Topic MQTT Pubblicati + +Con configurazione default (`MQTT_DEVICENAME=voltronic`): + +### Singolo Inverter +``` +homeassistant/sensor/voltronic_Battery_voltage +homeassistant/sensor/voltronic_Load_watt +homeassistant/sensor/voltronic_PV_in_voltage +... (e altri) +``` + +### Multi-Inverter Paralleli +``` +homeassistant/sensor/voltronic_inv1_serial +homeassistant/sensor/voltronic_inv1_Battery_voltage +homeassistant/sensor/voltronic_inv1_Load_watt +homeassistant/sensor/voltronic_inv2_serial +homeassistant/sensor/voltronic_inv2_Battery_voltage +homeassistant/sensor/voltronic_inv2_Load_watt +... (e altri) +``` + +## Build Locale + +### Build Semplice (architettura corrente) +```bash +docker build -f Dockerfile.multiarch -t voltronic-mqtt:local . +``` + +### Build Multi-Arch (richiede buildx) +```bash +docker buildx build \ + --platform linux/arm/v6,linux/arm/v7,linux/arm64 \ + -f Dockerfile.multiarch \ + -t voltronic-mqtt:multi-arch \ + --load \ + . +``` + +## Configurazione Secrets Gitea (per CI/CD) + +Se vuoi abilitare il push automatico su Docker Hub tramite Gitea Actions: + +1. Vai su Gitea → Repository → Settings → Secrets +2. Aggiungi i seguenti secrets: + - `DOCKER_USERNAME`: tuo username Docker Hub + - `DOCKER_PASSWORD`: token di accesso Docker Hub (o password) + +**Nota:** Se i secrets non sono configurati, il workflow eseguirà comunque la build ma **non farà push** su Docker Hub (utile per testing). + +### Creare un Access Token Docker Hub + +1. Login su https://hub.docker.com +2. Account Settings → Security → New Access Token +3. Copia il token generato +4. Usa questo token come `DOCKER_PASSWORD` in Gitea + +## Troubleshooting + +### Container non si avvia + +**Verifica device:** +```bash +ls -la /dev/ttyUSB* +``` + +**Verifica permessi:** +```bash +# Aggiungi utente al gruppo dialout +sudo usermod -a -G dialout $USER + +# Riavvia la sessione o logout/login +``` + +### MQTT non funziona + +**Test connessione MQTT:** +```bash +docker exec -it voltronic-mqtt bash -c "mosquitto_pub -h \$MQTT_SERVER -p \$MQTT_PORT -u \$MQTT_USERNAME -P \$MQTT_PASSWORD -t test/voltronic -m 'test'" +``` + +**Verifica topic pubblicati:** +```bash +mosquitto_sub -h 192.168.1.100 -p 1883 -u mqtt_user -P password -v -t "homeassistant/sensor/voltronic_#" +``` + +### Discovery fallisce + +**Forza re-discovery:** +```bash +docker restart voltronic-mqtt +# oppure +docker stop voltronic-mqtt +docker rm voltronic-mqtt +docker-compose up -d +``` + +**Test manuale discovery:** +```bash +docker exec -it voltronic-mqtt bash -c '/opt/inverter-cli/bin/inverter_poller -d -a' +``` + +### Verificare logs + +```bash +# Logs real-time +docker logs -f voltronic-mqtt + +# Ultimi 100 righe +docker logs --tail 100 voltronic-mqtt + +# Logs con timestamp +docker logs -t voltronic-mqtt +``` + +## Health Check + +Il container include un healthcheck automatico che verifica: +- Processo inverter_poller attivo +- Comunicazione con l'inverter funzionante + +Status: +```bash +docker ps +# Colonna STATUS mostra "healthy" o "unhealthy" + +# Dettagli healthcheck +docker inspect --format='{{json .State.Health}}' voltronic-mqtt | jq +``` diff --git a/sources/inverter-mqtt/entrypoint.sh b/sources/inverter-mqtt/entrypoint.sh index 2207662..2bd26c5 100755 --- a/sources/inverter-mqtt/entrypoint.sh +++ b/sources/inverter-mqtt/entrypoint.sh @@ -14,13 +14,50 @@ TEMP_CONF="/tmp/inverter_discovered.conf" INVERTER_DEVICE="${INVERTER_DEVICE:-/dev/ttyUSB0}" FORCE_DISCOVERY="${FORCE_DISCOVERY:-false}" SKIP_DISCOVERY="${SKIP_DISCOVERY:-false}" +MQTT_SERVER="${MQTT_SERVER:-192.168.1.37}" +MQTT_PORT="${MQTT_PORT:-1883}" +MQTT_TOPIC="${MQTT_TOPIC:-homeassistant}" +MQTT_DEVICENAME="${MQTT_DEVICENAME:-voltronic}" +MQTT_USERNAME="${MQTT_USERNAME:-}" +MQTT_PASSWORD="${MQTT_PASSWORD:-}" echo "Configuration:" echo " Device: $INVERTER_DEVICE" echo " Force Discovery: $FORCE_DISCOVERY" echo " Skip Discovery: $SKIP_DISCOVERY" +echo " MQTT Server: $MQTT_SERVER:$MQTT_PORT" +echo " MQTT Topic: $MQTT_TOPIC" +echo " MQTT Device: $MQTT_DEVICENAME" echo "" +# Function to update MQTT configuration +update_mqtt_config() { + local mqtt_conf="/etc/inverter/mqtt.json" + echo "Updating MQTT configuration from environment variables..." + + # Backup original + cp $mqtt_conf ${mqtt_conf}.backup + + # Update MQTT settings using jq + jq --arg server "$MQTT_SERVER" \ + --arg port "$MQTT_PORT" \ + --arg topic "$MQTT_TOPIC" \ + --arg devicename "$MQTT_DEVICENAME" \ + --arg username "$MQTT_USERNAME" \ + --arg password "$MQTT_PASSWORD" \ + '.server = $server | .port = $port | .topic = $topic | .devicename = $devicename | .username = $username | .password = $password' \ + $mqtt_conf > ${mqtt_conf}.tmp && mv ${mqtt_conf}.tmp $mqtt_conf + + echo "✓ MQTT configuration updated" + echo " Server: $MQTT_SERVER:$MQTT_PORT" + echo " Topic: $MQTT_TOPIC/sensor/$MQTT_DEVICENAME" + [ ! -z "$MQTT_USERNAME" ] && echo " Auth: Enabled (username: $MQTT_USERNAME)" + echo "" +} + +# Update MQTT config from ENV on startup +update_mqtt_config + # Function to update config file with discovered values update_config_with_discovery() { local qmod=$1