Files
docker-voltronic-homeassistant/sources/inverter-mqtt/entrypoint.sh
T
Pi Developer 078544381e
Build Docker Image for Raspberry Pi / build-and-push (push) Has been cancelled
refactor: Rimuove discovery, usa QPGS diretto in cascade mode
- 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)
2026-02-22 15:02:22 +01:00

132 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
export TERM=xterm
echo "=== Voltronic MQTT Bridge Starting ==="
echo "Version: 2.0 - Cascade Mode"
echo ""
# Configuration paths
CONF_FILE="/etc/inverter/inverter.conf"
MQTT_CONF="/etc/inverter/mqtt.json"
# Environment variables with defaults
INVERTER_DEVICE="${INVERTER_DEVICE:-/dev/ttyUSB0}"
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:-}"
CASCADE_COUNT="${CASCADE_COUNT:-2}"
# ── Ensure config files exist ─────────────────────────────────────────────────
if [ ! -f "$CONF_FILE" ]; then
echo "⚠ inverter.conf not found, creating default..."
cat > "$CONF_FILE" << 'EOF'
device=/dev/ttyUSB0
run_interval=120
amperage_factor=1.0
watt_factor=1.01
qpiri=103
qpiws=40
qmod=5
qpigs=110
EOF
fi
if [ ! -f "$MQTT_CONF" ]; then
echo "⚠ mqtt.json not found, creating default..."
cat > "$MQTT_CONF" << 'EOF'
{
"server": "192.168.1.37",
"port": "1883",
"topic": "homeassistant",
"devicename": "voltronic",
"username": "",
"password": "",
"clientid": "voltronic_default",
"influx": {
"enabled": "false"
}
}
EOF
fi
# ── Apply device path to config ───────────────────────────────────────────────
sed -i "s|^device=.*|device=$INVERTER_DEVICE|g" "$CONF_FILE"
echo "Configuration:"
echo " Device: $INVERTER_DEVICE"
echo " Cascade count: $CASCADE_COUNT inverters"
echo " MQTT Server: $MQTT_SERVER:$MQTT_PORT"
echo " MQTT Topic: $MQTT_TOPIC"
echo " MQTT Device: $MQTT_DEVICENAME"
echo ""
# ── Update MQTT config from ENV (only when credentials are provided) ──────────
if [ ! -z "$MQTT_USERNAME" ] || [ ! -z "$MQTT_PASSWORD" ]; then
echo "Updating MQTT configuration from environment variables..."
cp $MQTT_CONF ${MQTT_CONF}.backup 2>/dev/null || true
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 ""
fi
# ── Wait for serial device ────────────────────────────────────────────────────
echo "Waiting for device $INVERTER_DEVICE to be ready..."
sleep 3
# ── Clean up legacy single-inverter MQTT topics ───────────────────────────────
_MQTT_SERVER=$(jq -r '.server' $MQTT_CONF)
_MQTT_PORT=$(jq -r '.port' $MQTT_CONF)
_MQTT_USER=$(jq -r '.username' $MQTT_CONF)
_MQTT_PASS=$(jq -r '.password' $MQTT_CONF)
_MQTT_DEVICENAME=$(jq -r '.devicename' $MQTT_CONF)
_MQTT_TOPIC=$(jq -r '.topic' $MQTT_CONF)
mosquitto_pub -h $_MQTT_SERVER -p $_MQTT_PORT -u "$_MQTT_USER" -P "$_MQTT_PASS" \
-t "$_MQTT_TOPIC/sensor/$_MQTT_DEVICENAME/config" -n -r > /dev/null 2>&1 || true
echo ""
echo "=== Starting MQTT Bridge Services ==="
echo "Cascade mode: $CASCADE_COUNT inverters on $INVERTER_DEVICE"
echo ""
MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push-parallel.sh"
MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init-parallel.sh"
# ── Initialize MQTT discovery topics ─────────────────────────────────────────
echo "Initializing MQTT discovery topics..."
CASCADE_COUNT="$CASCADE_COUNT" "$MQTT_INIT_SCRIPT"
echo "✓ MQTT discovery topics initialized"
# ── Periodic MQTT init (re-register topics every 5 min for HA restarts) ──────
(
while true; do
sleep 300
CASCADE_COUNT="$CASCADE_COUNT" "$MQTT_INIT_SCRIPT" > /dev/null 2>&1
done
) &
# ── MQTT subscriber (listen for commands from Home Assistant) ─────────────────
echo "Starting MQTT command subscriber..."
/opt/inverter-mqtt/mqtt-subscriber.sh > /dev/null 2>&1 &
# ── Main data push loop (every 30 seconds) ────────────────────────────────────
echo "Starting data push loop (every 30s)..."
echo ""
echo "✓ All services started. Logs appear below..."
echo ""
while true; do
CASCADE_COUNT="$CASCADE_COUNT" "$MQTT_PUSH_SCRIPT" > /dev/null 2>&1
sleep 30
done