feat: Ottimizzazione performance e gestione credenziali MQTT
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
This commit is contained in:
Pi Developer
2026-01-31 17:45:53 +01:00
parent 9c911a90c4
commit 36743a59c8
8 changed files with 520 additions and 83 deletions
+16 -2
View File
@@ -68,10 +68,17 @@ echo ""
# Function to update MQTT configuration
update_mqtt_config() {
local mqtt_conf="/etc/inverter/mqtt.json"
# Solo aggiorna se le ENV variables sono impostate
if [ -z "$MQTT_USERNAME" ] && [ -z "$MQTT_PASSWORD" ]; then
echo " MQTT credentials not provided via ENV, using values from mqtt.json"
return 0
fi
echo "Updating MQTT configuration from environment variables..."
# Backup original
cp $mqtt_conf ${mqtt_conf}.backup
cp $mqtt_conf ${mqtt_conf}.backup 2>/dev/null || true
# Update MQTT settings using jq
jq --arg server "$MQTT_SERVER" \
@@ -87,6 +94,13 @@ update_mqtt_config() {
echo " Server: $MQTT_SERVER:$MQTT_PORT"
echo " Topic: $MQTT_TOPIC/sensor/$MQTT_DEVICENAME"
[ ! -z "$MQTT_USERNAME" ] && echo " Auth: Enabled (username: $MQTT_USERNAME)"
# Verifica che le credenziali siano state scritte
local check_user=$(jq -r '.username' $mqtt_conf)
local check_pass=$(jq -r '.password' $mqtt_conf)
if [ -z "$check_user" ] || [ -z "$check_pass" ]; then
echo "⚠ WARNING: MQTT credentials were not properly written to config file!"
fi
echo ""
}
@@ -202,7 +216,7 @@ else
if [[ $line =~ ^(device|qmod|qpigs|qpiri|qpiws)= ]]; then
key=$(echo "$line" | cut -d= -f1)
value=$(echo "$line" | cut -d= -f2)
sed -i "s/^$key=.*/$key=$value/g" $CONF_FILE
sed -i "s|^$key=.*|$key=$value|g" $CONF_FILE
fi
done < "$DISCOVERY_FLAG"
+33 -24
View File
@@ -1,42 +1,51 @@
#!/bin/bash
INFLUX_ENABLED=`cat /etc/inverter/mqtt.json | jq '.influx.enabled' -r`
# Carica configurazione MQTT una sola volta all'inizio (ottimizzazione performance)
MQTT_CONFIG_FILE="/etc/inverter/mqtt.json"
MQTT_SERVER=$(jq -r '.server' "$MQTT_CONFIG_FILE")
MQTT_PORT=$(jq -r '.port' "$MQTT_CONFIG_FILE")
MQTT_TOPIC=$(jq -r '.topic' "$MQTT_CONFIG_FILE")
MQTT_DEVICENAME=$(jq -r '.devicename' "$MQTT_CONFIG_FILE")
MQTT_USERNAME=$(jq -r '.username' "$MQTT_CONFIG_FILE")
MQTT_PASSWORD=$(jq -r '.password' "$MQTT_CONFIG_FILE")
MQTT_CLIENTID=$(jq -r '.clientid' "$MQTT_CONFIG_FILE")
INFLUX_ENABLED=$(jq -r '.influx.enabled' "$MQTT_CONFIG_FILE")
pushMQTTData () {
MQTT_SERVER=`cat /etc/inverter/mqtt.json | jq '.server' -r`
MQTT_PORT=`cat /etc/inverter/mqtt.json | jq '.port' -r`
MQTT_TOPIC=`cat /etc/inverter/mqtt.json | jq '.topic' -r`
MQTT_DEVICENAME=`cat /etc/inverter/mqtt.json | jq '.devicename' -r`
MQTT_USERNAME=`cat /etc/inverter/mqtt.json | jq '.username' -r`
MQTT_PASSWORD=`cat /etc/inverter/mqtt.json | jq '.password' -r`
MQTT_CLIENTID=`cat /etc/inverter/mqtt.json | jq '.clientid' -r`
# Usa variabili già caricate invece di rileggere il file ogni volta
mosquitto_pub \
-h $MQTT_SERVER \
-p $MQTT_PORT \
-h "$MQTT_SERVER" \
-p "$MQTT_PORT" \
-u "$MQTT_USERNAME" \
-P "$MQTT_PASSWORD" \
-i $MQTT_CLIENTID \
-t "$MQTT_TOPIC/sensor/"$MQTT_DEVICENAME"_$1" \
-m "$2"
-i "$MQTT_CLIENTID" \
-t "$MQTT_TOPIC/sensor/${MQTT_DEVICENAME}_$1" \
-m "$2" \
2>/dev/null
if [[ $INFLUX_ENABLED == "true" ]] ; then
pushInfluxData $1 $2
pushInfluxData "$1" "$2"
fi
}
pushInfluxData () {
INFLUX_HOST=`cat /etc/inverter/mqtt.json | jq '.influx.host' -r`
INFLUX_USERNAME=`cat /etc/inverter/mqtt.json | jq '.influx.username' -r`
INFLUX_PASSWORD=`cat /etc/inverter/mqtt.json | jq '.influx.password' -r`
INFLUX_DEVICE=`cat /etc/inverter/mqtt.json | jq '.influx.device' -r`
INFLUX_PREFIX=`cat /etc/inverter/mqtt.json | jq '.influx.prefix' -r`
INFLUX_DATABASE=`cat /etc/inverter/mqtt.json | jq '.influx.database' -r`
INFLUX_MEASUREMENT_NAME=`cat /etc/inverter/mqtt.json | jq '.influx.namingMap.'$1'' -r`
# Carica configurazione InfluxDB solo se necessario (lazy loading)
local INFLUX_HOST=$(jq -r '.influx.host' "$MQTT_CONFIG_FILE")
local INFLUX_USERNAME=$(jq -r '.influx.username' "$MQTT_CONFIG_FILE")
local INFLUX_PASSWORD=$(jq -r '.influx.password' "$MQTT_CONFIG_FILE")
local INFLUX_DEVICE=$(jq -r '.influx.device' "$MQTT_CONFIG_FILE")
local INFLUX_PREFIX=$(jq -r '.influx.prefix' "$MQTT_CONFIG_FILE")
local INFLUX_DATABASE=$(jq -r '.influx.database' "$MQTT_CONFIG_FILE")
local INFLUX_MEASUREMENT_NAME=$(jq -r ".influx.namingMap.$1" "$MQTT_CONFIG_FILE")
curl -i -XPOST "$INFLUX_HOST/write?db=$INFLUX_DATABASE&precision=s" -u "$INFLUX_USERNAME:$INFLUX_PASSWORD" --data-binary "$INFLUX_PREFIX,device=$INFLUX_DEVICE $INFLUX_MEASUREMENT_NAME=$2"
curl -s -XPOST "$INFLUX_HOST/write?db=$INFLUX_DATABASE&precision=s" \
-u "$INFLUX_USERNAME:$INFLUX_PASSWORD" \
--data-binary "$INFLUX_PREFIX,device=$INFLUX_DEVICE $INFLUX_MEASUREMENT_NAME=$2" \
> /dev/null 2>&1
}
INVERTER_DATA=`timeout 10 /opt/inverter-cli/bin/inverter_poller -1`
# Esegui polling inverter con timeout per evitare hang
INVERTER_DATA=$(timeout 10 /opt/inverter-cli/bin/inverter_poller -1 2>/dev/null)
#####################################################################################