078544381e
Build Docker Image for Raspberry Pi / build-and-push (push) Has been cancelled
- 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)
132 lines
4.8 KiB
Bash
Executable File
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
|