From dc5bd074381e6a44bc6b42eebbe9e1b557caf9b7 Mon Sep 17 00:00:00 2001 From: Pi Developer Date: Mon, 2 Feb 2026 23:24:49 +0100 Subject: [PATCH] feat: Auto-detection inverter paralleli con script dedicati - Modificato entrypoint.sh per rilevare automaticamente inverter paralleli - Usa flag -p per parallel discovery (testa QPGS0-9) - Script mqtt-push-parallel.sh per pubblicare dati di ogni inverter - Script mqtt-init-parallel.sh per discovery topics (ogni 10 min) - Naming: voltronic_inv1, voltronic_inv2, ecc. - Fallback automatico a single-mode se PARALLEL_COUNT=0 Nota: Il parallel discovery richiede che inverter supportino comandi QPGS --- sources/inverter-mqtt/entrypoint.sh | 32 ++++++-- sources/inverter-mqtt/mqtt-init-parallel.sh | 90 +++++++++++++++++++++ 2 files changed, 117 insertions(+), 5 deletions(-) create mode 100755 sources/inverter-mqtt/mqtt-init-parallel.sh diff --git a/sources/inverter-mqtt/entrypoint.sh b/sources/inverter-mqtt/entrypoint.sh index f75e6e4..5908e78 100755 --- a/sources/inverter-mqtt/entrypoint.sh +++ b/sources/inverter-mqtt/entrypoint.sh @@ -235,16 +235,38 @@ if [ "$NEED_DISCOVERY" = "true" ]; then fi echo "" -echo "=== Starting MQTT Bridge Services ===" +echo "=== Detecting Inverter Configuration ===" echo "" # Wait a bit for the device to be ready sleep 2 -# Init the mqtt server for the first time, then every 5 minutes +# Check for parallel inverters +PARALLEL_CHECK=$(/opt/inverter-cli/bin/inverter_poller -p 2>&1) +PARALLEL_COUNT=$(echo "$PARALLEL_CHECK" | grep "PARALLEL_COUNT=" | cut -d= -f2) + +if [ ! -z "$PARALLEL_COUNT" ] && [ "$PARALLEL_COUNT" -gt 0 ]; then + echo "✓ Detected $PARALLEL_COUNT parallel inverter(s)" + echo " Using parallel mode scripts..." + USE_PARALLEL=true + MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push-parallel.sh" + MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init-parallel.sh" +else + echo "ℹ Single inverter mode" + echo " Using standard scripts..." + USE_PARALLEL=false + MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push.sh" + MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init.sh" +fi + +echo "" +echo "=== Starting MQTT Bridge Services ===" +echo "" + +# Init the mqtt server for the first time, then every 10 minutes (600 seconds) # This will re-create the auto-created topics in the MQTT server if HA is restarted... -echo "Starting MQTT initialization service..." -watch -n 300 /opt/inverter-mqtt/mqtt-init.sh > /dev/null 2>&1 & +echo "Starting MQTT initialization service (every 10 minutes)..." +watch -n 600 "$MQTT_INIT_SCRIPT" > /dev/null 2>&1 & # Run the MQTT Subscriber process in the background (so that way we can change the configuration on the inverter from home assistant) echo "Starting MQTT subscriber for commands..." @@ -257,4 +279,4 @@ echo "✓ All services started successfully!" echo " Logs will appear below..." echo "" -watch -n 30 /opt/inverter-mqtt/mqtt-push.sh > /dev/null 2>&1 +watch -n 30 "$MQTT_PUSH_SCRIPT" > /dev/null 2>&1 diff --git a/sources/inverter-mqtt/mqtt-init-parallel.sh b/sources/inverter-mqtt/mqtt-init-parallel.sh new file mode 100755 index 0000000..80aa896 --- /dev/null +++ b/sources/inverter-mqtt/mqtt-init-parallel.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# +# MQTT Discovery for Parallel Inverters +# Registers Home Assistant auto-discovery topics for each parallel inverter + +MQTT_CONFIG="/etc/inverter/mqtt.json" +INVERTER_BIN="/opt/inverter-cli/bin/inverter_poller" + +MQTT_SERVER=$(jq -r '.server' "$MQTT_CONFIG") +MQTT_PORT=$(jq -r '.port' "$MQTT_CONFIG") +MQTT_TOPIC=$(jq -r '.topic' "$MQTT_CONFIG") +MQTT_DEVICENAME=$(jq -r '.devicename' "$MQTT_CONFIG") +MQTT_USERNAME=$(jq -r '.username' "$MQTT_CONFIG") +MQTT_PASSWORD=$(jq -r '.password' "$MQTT_CONFIG") +MQTT_CLIENTID=$(jq -r '.clientid' "$MQTT_CONFIG") + +registerTopic () { + local inverter_id="$1" + local metric="$2" + local unit="$3" + local icon="$4" + + local device_name="${MQTT_DEVICENAME}_inv${inverter_id}" + + mosquitto_pub \ + -h $MQTT_SERVER \ + -p $MQTT_PORT \ + -u "$MQTT_USERNAME" \ + -P "$MQTT_PASSWORD" \ + -i "${MQTT_CLIENTID}_init" \ + -t "$MQTT_TOPIC/sensor/${device_name}_${metric}/config" \ + -r \ + -m "{ + \"name\": \"${device_name}_${metric}\", + \"unit_of_measurement\": \"$unit\", + \"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_${metric}\", + \"icon\": \"mdi:$icon\", + \"unique_id\": \"${device_name}_${metric}\", + \"device\": { + \"identifiers\": [\"${device_name}\"], + \"name\": \"${device_name}\", + \"manufacturer\": \"Voltronic\", + \"model\": \"Parallel Inverter\" + } + }" +} + +register_inverter_topics() { + local inverter_id="$1" + + echo "Registering MQTT discovery topics for: ${MQTT_DEVICENAME}_inv${inverter_id}" + + # Register all metrics for this inverter + registerTopic "$inverter_id" "serial" "" "identifier" + registerTopic "$inverter_id" "mode" "" "solar-power" + registerTopic "$inverter_id" "AC_grid_voltage" "V" "power-plug" + registerTopic "$inverter_id" "AC_grid_frequency" "Hz" "current-ac" + registerTopic "$inverter_id" "AC_out_voltage" "V" "power-plug" + registerTopic "$inverter_id" "AC_out_frequency" "Hz" "current-ac" + registerTopic "$inverter_id" "PV_in_voltage" "V" "solar-panel-large" + registerTopic "$inverter_id" "PV_in_current" "A" "solar-panel-large" + registerTopic "$inverter_id" "PV_in_watts" "W" "solar-panel-large" + registerTopic "$inverter_id" "Load_pct" "%" "brightness-percent" + registerTopic "$inverter_id" "Load_watt" "W" "chart-bell-curve" + registerTopic "$inverter_id" "Load_va" "VA" "chart-bell-curve" + registerTopic "$inverter_id" "Battery_capacity" "%" "battery-outline" + registerTopic "$inverter_id" "Battery_voltage" "V" "battery-outline" + registerTopic "$inverter_id" "Battery_charge_current" "A" "current-dc" + + echo " ✓ Discovery topics registered" +} + +# Discover parallel inverters +PARALLEL_DISCOVERY=$("$INVERTER_BIN" -p 2>&1) +PARALLEL_COUNT=$(echo "$PARALLEL_DISCOVERY" | grep "PARALLEL_COUNT=" | cut -d= -f2) + +if [ -z "$PARALLEL_COUNT" ] || [ "$PARALLEL_COUNT" -eq 0 ]; then + echo "No parallel inverters found, falling back to standard init" + exec /opt/inverter-mqtt/mqtt-init.sh + exit 0 +fi + +echo "Found $PARALLEL_COUNT parallel inverters" + +# Register topics for each inverter +for i in $(seq 1 $PARALLEL_COUNT); do + register_inverter_topics "$i" +done + +echo "✓ All MQTT discovery topics registered for $PARALLEL_COUNT inverters"