From c73ebc825c2221b11fd90df9c948bccaa379f3f1 Mon Sep 17 00:00:00 2001 From: Pi Developer Date: Mon, 2 Feb 2026 23:32:56 +0100 Subject: [PATCH] feat: Auto-discovery parallelo con timeout e stile originale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aggiunto timeout 15s al parallel discovery per evitare blocchi - mqtt-init-parallel.sh in stile originale semplice - Per ogni inverter scoperto: registra topic discovery (voltronic_inv1_*, inv2_*, ...) - Discovery topics ogni 10 minuti invece di 5 - Fallback automatico a single-mode se timeout o count=0 - Mantiene la semplicità dello script originale Il parallel discovery testa QPGS0-9 per trovare inverter configurati in parallelo. Se timeout o nessun inverter trovato, usa modalità standard. --- sources/inverter-mqtt/entrypoint.sh | 33 +++-- sources/inverter-mqtt/mqtt-init-parallel.sh | 134 +++++++++++--------- 2 files changed, 97 insertions(+), 70 deletions(-) diff --git a/sources/inverter-mqtt/entrypoint.sh b/sources/inverter-mqtt/entrypoint.sh index 5908e78..cfbe319 100755 --- a/sources/inverter-mqtt/entrypoint.sh +++ b/sources/inverter-mqtt/entrypoint.sh @@ -241,20 +241,33 @@ echo "" # Wait a bit for the device to be ready sleep 2 -# 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) +# Check for parallel inverters (with timeout to avoid hanging) +echo "Checking for parallel inverters..." +PARALLEL_CHECK=$(timeout 15 /opt/inverter-cli/bin/inverter_poller -p 2>&1) +PARALLEL_EXIT=$? -if [ ! -z "$PARALLEL_COUNT" ] && [ "$PARALLEL_COUNT" -gt 0 ]; then - echo "✓ Detected $PARALLEL_COUNT parallel inverter(s)" - echo " Using parallel mode scripts..." - USE_PARALLEL=true +if [ $PARALLEL_EXIT -eq 124 ]; then + echo "⚠ Parallel discovery timed out (15s), using single inverter mode" + USE_PARALLEL=false +else + 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 + else + echo "ℹ Single inverter mode (count=$PARALLEL_COUNT)" + echo " Using standard scripts..." + USE_PARALLEL=false + fi +fi + +# Set script paths based on mode +if [ "$USE_PARALLEL" = true ]; then 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 diff --git a/sources/inverter-mqtt/mqtt-init-parallel.sh b/sources/inverter-mqtt/mqtt-init-parallel.sh index 80aa896..128093c 100755 --- a/sources/inverter-mqtt/mqtt-init-parallel.sh +++ b/sources/inverter-mqtt/mqtt-init-parallel.sh @@ -1,78 +1,55 @@ #!/bin/bash # -# MQTT Discovery for Parallel Inverters -# Registers Home Assistant auto-discovery topics for each parallel inverter +# MQTT Discovery for Parallel Inverters (simple style) -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") +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` registerTopic () { - local inverter_id="$1" - local metric="$2" - local unit="$3" - local icon="$4" - - local device_name="${MQTT_DEVICENAME}_inv${inverter_id}" + # $1 = inverter_id, $2 = metric, $3 = unit, $4 = icon + local inv_id=$1 + local device_name="${MQTT_DEVICENAME}_inv${inv_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 \ + -i $MQTT_CLIENTID \ + -t "$MQTT_TOPIC/sensor/${device_name}_$2/config" \ -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\" - } + \"name\": \"${device_name}_$2\", + \"unit_of_measurement\": \"$3\", + \"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_$2\", + \"icon\": \"mdi:$4\" }" } -register_inverter_topics() { - local inverter_id="$1" +registerInverterRawCMD () { + local inv_id=$1 + local device_name="${MQTT_DEVICENAME}_inv${inv_id}" - 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" + mosquitto_pub \ + -h $MQTT_SERVER \ + -p $MQTT_PORT \ + -u "$MQTT_USERNAME" \ + -P "$MQTT_PASSWORD" \ + -i $MQTT_CLIENTID \ + -t "$MQTT_TOPIC/sensor/$device_name/config" \ + -m "{ + \"name\": \"$device_name\", + \"state_topic\": \"$MQTT_TOPIC/sensor/$device_name\" + }" } # Discover parallel inverters -PARALLEL_DISCOVERY=$("$INVERTER_BIN" -p 2>&1) -PARALLEL_COUNT=$(echo "$PARALLEL_DISCOVERY" | grep "PARALLEL_COUNT=" | cut -d= -f2) +PARALLEL_DISCOVERY=`timeout 15 /opt/inverter-cli/bin/inverter_poller -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" @@ -82,9 +59,46 @@ fi echo "Found $PARALLEL_COUNT parallel inverters" -# Register topics for each inverter -for i in $(seq 1 $PARALLEL_COUNT); do - register_inverter_topics "$i" +# Register topics for each inverter discovered +for inv_id in $(seq 1 $PARALLEL_COUNT); do + echo "Registering discovery topics for inverter #$inv_id..." + + registerTopic $inv_id "serial" "" "identifier" + registerTopic $inv_id "Inverter_mode" "" "solar-power" + registerTopic $inv_id "AC_grid_voltage" "V" "power-plug" + registerTopic $inv_id "AC_grid_frequency" "Hz" "current-ac" + registerTopic $inv_id "AC_out_voltage" "V" "power-plug" + registerTopic $inv_id "AC_out_frequency" "Hz" "current-ac" + registerTopic $inv_id "PV_in_voltage" "V" "solar-panel-large" + registerTopic $inv_id "PV_in_current" "A" "solar-panel-large" + registerTopic $inv_id "PV_in_watts" "W" "solar-panel-large" + registerTopic $inv_id "PV_in_watthour" "Wh" "solar-panel-large" + registerTopic $inv_id "SCC_voltage" "V" "current-dc" + registerTopic $inv_id "Load_pct" "%" "brightness-percent" + registerTopic $inv_id "Load_watt" "W" "chart-bell-curve" + registerTopic $inv_id "Load_watthour" "Wh" "chart-bell-curve" + registerTopic $inv_id "Load_va" "VA" "chart-bell-curve" + registerTopic $inv_id "Bus_voltage" "V" "details" + registerTopic $inv_id "Heatsink_temperature" "°C" "details" + registerTopic $inv_id "Battery_capacity" "%" "battery-outline" + registerTopic $inv_id "Battery_voltage" "V" "battery-outline" + registerTopic $inv_id "Battery_charge_current" "A" "current-dc" + registerTopic $inv_id "Battery_discharge_current" "A" "current-dc" + registerTopic $inv_id "Load_status_on" "" "power" + registerTopic $inv_id "SCC_charge_on" "" "power" + registerTopic $inv_id "AC_charge_on" "" "power" + registerTopic $inv_id "Battery_recharge_voltage" "V" "current-dc" + registerTopic $inv_id "Battery_under_voltage" "V" "current-dc" + registerTopic $inv_id "Battery_bulk_voltage" "V" "current-dc" + registerTopic $inv_id "Battery_float_voltage" "V" "current-dc" + registerTopic $inv_id "Max_grid_charge_current" "A" "current-ac" + registerTopic $inv_id "Max_charge_current" "A" "current-ac" + registerTopic $inv_id "Out_source_priority" "" "grid" + registerTopic $inv_id "Charger_source_priority" "" "solar-power" + registerTopic $inv_id "Battery_redischarge_voltage" "V" "battery-negative" + + # Raw command topic + registerInverterRawCMD $inv_id done -echo "✓ All MQTT discovery topics registered for $PARALLEL_COUNT inverters" +echo "✓ All discovery topics registered for $PARALLEL_COUNT inverters"