#!/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