feat: Auto-discovery parallelo con timeout e stile originale
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 7m13s
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 7m13s
- 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.
This commit is contained in:
@@ -241,20 +241,33 @@ echo ""
|
|||||||
# Wait a bit for the device to be ready
|
# Wait a bit for the device to be ready
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
# Check for parallel inverters
|
# Check for parallel inverters (with timeout to avoid hanging)
|
||||||
PARALLEL_CHECK=$(/opt/inverter-cli/bin/inverter_poller -p 2>&1)
|
echo "Checking for parallel inverters..."
|
||||||
|
PARALLEL_CHECK=$(timeout 15 /opt/inverter-cli/bin/inverter_poller -p 2>&1)
|
||||||
|
PARALLEL_EXIT=$?
|
||||||
|
|
||||||
|
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)
|
PARALLEL_COUNT=$(echo "$PARALLEL_CHECK" | grep "PARALLEL_COUNT=" | cut -d= -f2)
|
||||||
|
|
||||||
if [ ! -z "$PARALLEL_COUNT" ] && [ "$PARALLEL_COUNT" -gt 0 ]; then
|
if [ ! -z "$PARALLEL_COUNT" ] && [ "$PARALLEL_COUNT" -gt 0 ]; then
|
||||||
echo "✓ Detected $PARALLEL_COUNT parallel inverter(s)"
|
echo "✓ Detected $PARALLEL_COUNT parallel inverter(s)"
|
||||||
echo " Using parallel mode scripts..."
|
echo " Using parallel mode scripts..."
|
||||||
USE_PARALLEL=true
|
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_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push-parallel.sh"
|
||||||
MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init-parallel.sh"
|
MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init-parallel.sh"
|
||||||
else
|
else
|
||||||
echo "ℹ Single inverter mode"
|
|
||||||
echo " Using standard scripts..."
|
|
||||||
USE_PARALLEL=false
|
|
||||||
MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push.sh"
|
MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push.sh"
|
||||||
MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init.sh"
|
MQTT_INIT_SCRIPT="/opt/inverter-mqtt/mqtt-init.sh"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,78 +1,55 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# MQTT Discovery for Parallel Inverters
|
# MQTT Discovery for Parallel Inverters (simple style)
|
||||||
# Registers Home Assistant auto-discovery topics for each parallel inverter
|
|
||||||
|
|
||||||
MQTT_CONFIG="/etc/inverter/mqtt.json"
|
MQTT_SERVER=`cat /etc/inverter/mqtt.json | jq '.server' -r`
|
||||||
INVERTER_BIN="/opt/inverter-cli/bin/inverter_poller"
|
MQTT_PORT=`cat /etc/inverter/mqtt.json | jq '.port' -r`
|
||||||
|
MQTT_TOPIC=`cat /etc/inverter/mqtt.json | jq '.topic' -r`
|
||||||
MQTT_SERVER=$(jq -r '.server' "$MQTT_CONFIG")
|
MQTT_DEVICENAME=`cat /etc/inverter/mqtt.json | jq '.devicename' -r`
|
||||||
MQTT_PORT=$(jq -r '.port' "$MQTT_CONFIG")
|
MQTT_USERNAME=`cat /etc/inverter/mqtt.json | jq '.username' -r`
|
||||||
MQTT_TOPIC=$(jq -r '.topic' "$MQTT_CONFIG")
|
MQTT_PASSWORD=`cat /etc/inverter/mqtt.json | jq '.password' -r`
|
||||||
MQTT_DEVICENAME=$(jq -r '.devicename' "$MQTT_CONFIG")
|
MQTT_CLIENTID=`cat /etc/inverter/mqtt.json | jq '.clientid' -r`
|
||||||
MQTT_USERNAME=$(jq -r '.username' "$MQTT_CONFIG")
|
|
||||||
MQTT_PASSWORD=$(jq -r '.password' "$MQTT_CONFIG")
|
|
||||||
MQTT_CLIENTID=$(jq -r '.clientid' "$MQTT_CONFIG")
|
|
||||||
|
|
||||||
registerTopic () {
|
registerTopic () {
|
||||||
local inverter_id="$1"
|
# $1 = inverter_id, $2 = metric, $3 = unit, $4 = icon
|
||||||
local metric="$2"
|
local inv_id=$1
|
||||||
local unit="$3"
|
local device_name="${MQTT_DEVICENAME}_inv${inv_id}"
|
||||||
local icon="$4"
|
|
||||||
|
|
||||||
local device_name="${MQTT_DEVICENAME}_inv${inverter_id}"
|
|
||||||
|
|
||||||
mosquitto_pub \
|
mosquitto_pub \
|
||||||
-h $MQTT_SERVER \
|
-h $MQTT_SERVER \
|
||||||
-p $MQTT_PORT \
|
-p $MQTT_PORT \
|
||||||
-u "$MQTT_USERNAME" \
|
-u "$MQTT_USERNAME" \
|
||||||
-P "$MQTT_PASSWORD" \
|
-P "$MQTT_PASSWORD" \
|
||||||
-i "${MQTT_CLIENTID}_init" \
|
-i $MQTT_CLIENTID \
|
||||||
-t "$MQTT_TOPIC/sensor/${device_name}_${metric}/config" \
|
-t "$MQTT_TOPIC/sensor/${device_name}_$2/config" \
|
||||||
-r \
|
|
||||||
-m "{
|
-m "{
|
||||||
\"name\": \"${device_name}_${metric}\",
|
\"name\": \"${device_name}_$2\",
|
||||||
\"unit_of_measurement\": \"$unit\",
|
\"unit_of_measurement\": \"$3\",
|
||||||
\"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_${metric}\",
|
\"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_$2\",
|
||||||
\"icon\": \"mdi:$icon\",
|
\"icon\": \"mdi:$4\"
|
||||||
\"unique_id\": \"${device_name}_${metric}\",
|
|
||||||
\"device\": {
|
|
||||||
\"identifiers\": [\"${device_name}\"],
|
|
||||||
\"name\": \"${device_name}\",
|
|
||||||
\"manufacturer\": \"Voltronic\",
|
|
||||||
\"model\": \"Parallel Inverter\"
|
|
||||||
}
|
|
||||||
}"
|
}"
|
||||||
}
|
}
|
||||||
|
|
||||||
register_inverter_topics() {
|
registerInverterRawCMD () {
|
||||||
local inverter_id="$1"
|
local inv_id=$1
|
||||||
|
local device_name="${MQTT_DEVICENAME}_inv${inv_id}"
|
||||||
|
|
||||||
echo "Registering MQTT discovery topics for: ${MQTT_DEVICENAME}_inv${inverter_id}"
|
mosquitto_pub \
|
||||||
|
-h $MQTT_SERVER \
|
||||||
# Register all metrics for this inverter
|
-p $MQTT_PORT \
|
||||||
registerTopic "$inverter_id" "serial" "" "identifier"
|
-u "$MQTT_USERNAME" \
|
||||||
registerTopic "$inverter_id" "mode" "" "solar-power"
|
-P "$MQTT_PASSWORD" \
|
||||||
registerTopic "$inverter_id" "AC_grid_voltage" "V" "power-plug"
|
-i $MQTT_CLIENTID \
|
||||||
registerTopic "$inverter_id" "AC_grid_frequency" "Hz" "current-ac"
|
-t "$MQTT_TOPIC/sensor/$device_name/config" \
|
||||||
registerTopic "$inverter_id" "AC_out_voltage" "V" "power-plug"
|
-m "{
|
||||||
registerTopic "$inverter_id" "AC_out_frequency" "Hz" "current-ac"
|
\"name\": \"$device_name\",
|
||||||
registerTopic "$inverter_id" "PV_in_voltage" "V" "solar-panel-large"
|
\"state_topic\": \"$MQTT_TOPIC/sensor/$device_name\"
|
||||||
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
|
# Discover parallel inverters
|
||||||
PARALLEL_DISCOVERY=$("$INVERTER_BIN" -p 2>&1)
|
PARALLEL_DISCOVERY=`timeout 15 /opt/inverter-cli/bin/inverter_poller -p 2>&1`
|
||||||
PARALLEL_COUNT=$(echo "$PARALLEL_DISCOVERY" | grep "PARALLEL_COUNT=" | cut -d= -f2)
|
PARALLEL_COUNT=`echo "$PARALLEL_DISCOVERY" | grep "PARALLEL_COUNT=" | cut -d= -f2`
|
||||||
|
|
||||||
if [ -z "$PARALLEL_COUNT" ] || [ "$PARALLEL_COUNT" -eq 0 ]; then
|
if [ -z "$PARALLEL_COUNT" ] || [ "$PARALLEL_COUNT" -eq 0 ]; then
|
||||||
echo "No parallel inverters found, falling back to standard init"
|
echo "No parallel inverters found, falling back to standard init"
|
||||||
@@ -82,9 +59,46 @@ fi
|
|||||||
|
|
||||||
echo "Found $PARALLEL_COUNT parallel inverters"
|
echo "Found $PARALLEL_COUNT parallel inverters"
|
||||||
|
|
||||||
# Register topics for each inverter
|
# Register topics for each inverter discovered
|
||||||
for i in $(seq 1 $PARALLEL_COUNT); do
|
for inv_id in $(seq 1 $PARALLEL_COUNT); do
|
||||||
register_inverter_topics "$i"
|
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
|
done
|
||||||
|
|
||||||
echo "✓ All MQTT discovery topics registered for $PARALLEL_COUNT inverters"
|
echo "✓ All discovery topics registered for $PARALLEL_COUNT inverters"
|
||||||
|
|||||||
Reference in New Issue
Block a user