Migliora discovery e pubblicazione MQTT per inverter in cascata
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 9m22s
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 9m22s
This commit is contained in:
@@ -8,12 +8,14 @@ if [ -f "/etc/inverter/mqtt.json" ] && [ -x "/opt/inverter-cli/bin/inverter_poll
|
||||
MQTT_CONFIG="/etc/inverter/mqtt.json"
|
||||
INVERTER_BIN="/opt/inverter-cli/bin/inverter_poller"
|
||||
MQTT_FALLBACK="/opt/inverter-mqtt/mqtt-push.sh"
|
||||
INVERTER_CONF="/etc/inverter/inverter.conf"
|
||||
CONTAINER_MODE=true
|
||||
else
|
||||
# Development mode
|
||||
MQTT_CONFIG="/home/pi/Progetti/config/mqtt.json"
|
||||
INVERTER_BIN="/home/pi/Progetti/sources/inverter-cli/bin/inverter_poller"
|
||||
MQTT_FALLBACK="/home/pi/Progetti/sources/inverter-mqtt/mqtt-push.sh"
|
||||
INVERTER_CONF="/home/pi/Progetti/config/inverter.conf"
|
||||
CONTAINER_MODE=false
|
||||
fi
|
||||
|
||||
@@ -180,8 +182,36 @@ if [ "$EUID" -ne 0 ] && [ -c "/dev/ttyUSB0" ]; then
|
||||
SUDO_CMD="sudo"
|
||||
fi
|
||||
|
||||
# Multi-device mode: if INVERTER_DEVICES is set, poll each device separately
|
||||
if [ -n "$INVERTER_DEVICES" ]; then
|
||||
IFS=':' read -ra DEVICE_ARRAY <<< "$INVERTER_DEVICES"
|
||||
if [ ${#DEVICE_ARRAY[@]} -gt 0 ]; then
|
||||
echo "Multi-device mode enabled (${#DEVICE_ARRAY[@]} devices)"
|
||||
for idx in "${!DEVICE_ARRAY[@]}"; do
|
||||
inv_id=$((idx + 1))
|
||||
device_path="${DEVICE_ARRAY[$idx]}"
|
||||
temp_dir=$(mktemp -d)
|
||||
cp "$INVERTER_CONF" "$temp_dir/inverter.conf" 2>/dev/null
|
||||
sed -i "s|^device=.*|device=$device_path|g" "$temp_dir/inverter.conf"
|
||||
|
||||
INVERTER_DATA=$(cd "$temp_dir" && $SUDO_CMD "$INVERTER_BIN" -1 2>/dev/null | tr -d '\r')
|
||||
rm -rf "$temp_dir"
|
||||
|
||||
if [ -z "$INVERTER_DATA" ] || ! echo "$INVERTER_DATA" | jq -e . >/dev/null 2>&1; then
|
||||
echo "⚠ No valid JSON from $device_path (inv$inv_id)"
|
||||
continue
|
||||
fi
|
||||
|
||||
extractAndPublishAllData "$inv_id" "$INVERTER_DATA"
|
||||
done
|
||||
|
||||
echo "Multi-device MQTT push completed"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Try parallel discovery with retry
|
||||
MAX_RETRIES=1 # Reduced to 1 since we'll fallback to direct QPGS anyway
|
||||
MAX_RETRIES=3
|
||||
RETRY_DELAY=2
|
||||
PARALLEL_COUNT=0
|
||||
|
||||
@@ -205,44 +235,80 @@ done
|
||||
# If still no count or discovery failed, try direct QPGS commands
|
||||
if [ -z "$PARALLEL_COUNT" ] || [ "$PARALLEL_COUNT" -eq 0 ]; then
|
||||
echo "⚠ Discovery reports 0 inverters, trying direct QPGS0/QPGS1 commands..."
|
||||
|
||||
# Test QPGS0 to see if parallel mode is active
|
||||
TEST_QPGS0=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS0" 2>&1 | grep "Reply:"`
|
||||
TEST_QPGS1=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS1" 2>&1 | grep "Reply:"`
|
||||
|
||||
if [ ! -z "$TEST_QPGS0" ] && [[ "$TEST_QPGS0" != *"NAK"* ]]; then
|
||||
echo "✓ QPGS0 responds, assuming 2 inverters in cascade"
|
||||
PARALLEL_COUNT=2
|
||||
|
||||
# Build fake discovery output
|
||||
PARALLEL_DISCOVERY="INVERTER_1_SERIAL=unknown
|
||||
|
||||
for attempt in 1 2 3; do
|
||||
# Test QPGS0 to see if parallel mode is active
|
||||
TEST_QPGS0=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS0" 2>&1 | grep "Reply:"`
|
||||
TEST_QPGS1=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS1" 2>&1 | grep "Reply:"`
|
||||
|
||||
if [ ! -z "$TEST_QPGS0" ] && [[ "$TEST_QPGS0" != *"NAK"* ]]; then
|
||||
echo "✓ QPGS0 responds, assuming 2 inverters in cascade"
|
||||
PARALLEL_COUNT=2
|
||||
|
||||
# Build fake discovery output
|
||||
PARALLEL_DISCOVERY="INVERTER_1_SERIAL=unknown
|
||||
INVERTER_1_QPGS=0
|
||||
INVERTER_2_SERIAL=unknown
|
||||
INVERTER_2_QPGS=1"
|
||||
elif [ ! -z "$TEST_QPGS1" ] && [[ "$TEST_QPGS1" != *"NAK"* ]]; then
|
||||
echo "✓ QPGS1 responds, assuming 2 inverters in cascade"
|
||||
PARALLEL_COUNT=2
|
||||
|
||||
# Build fake discovery output
|
||||
PARALLEL_DISCOVERY="INVERTER_1_SERIAL=unknown
|
||||
break
|
||||
elif [ ! -z "$TEST_QPGS1" ] && [[ "$TEST_QPGS1" != *"NAK"* ]]; then
|
||||
echo "✓ QPGS1 responds, assuming 2 inverters in cascade"
|
||||
PARALLEL_COUNT=2
|
||||
|
||||
# Build fake discovery output
|
||||
PARALLEL_DISCOVERY="INVERTER_1_SERIAL=unknown
|
||||
INVERTER_1_QPGS=0
|
||||
INVERTER_2_SERIAL=unknown
|
||||
INVERTER_2_QPGS=1"
|
||||
else
|
||||
break
|
||||
else
|
||||
echo "⚠ QPGS commands failed (attempt $attempt/3)"
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$PARALLEL_COUNT" -eq 0 ]; then
|
||||
echo "✗ QPGS commands also failed"
|
||||
PARALLEL_COUNT=0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Processing $PARALLEL_COUNT parallel inverters"
|
||||
DISCOVERY_SERIALS=()
|
||||
DISCOVERY_QPGS=()
|
||||
MAX_QPGS_IDX=-1
|
||||
|
||||
# Publish discovery info
|
||||
pushMQTTData "system" "parallel_count" "$PARALLEL_COUNT"
|
||||
for i in $(seq 1 $PARALLEL_COUNT); do
|
||||
serial=$(echo "$PARALLEL_DISCOVERY" | grep "INVERTER_${i}_SERIAL=" | cut -d= -f2)
|
||||
qpgs_idx=$(echo "$PARALLEL_DISCOVERY" | grep "INVERTER_${i}_QPGS=" | cut -d= -f2)
|
||||
|
||||
if [ -z "$serial" ] || [ "$serial" = "0.0" ]; then
|
||||
continue
|
||||
fi
|
||||
if echo "$serial" | grep -qE '^0+$'; then
|
||||
continue
|
||||
fi
|
||||
if [ -z "$qpgs_idx" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
DISCOVERY_SERIALS+=("$serial")
|
||||
DISCOVERY_QPGS+=("$qpgs_idx")
|
||||
|
||||
if [ "$qpgs_idx" -gt "$MAX_QPGS_IDX" ]; then
|
||||
MAX_QPGS_IDX=$qpgs_idx
|
||||
fi
|
||||
done
|
||||
|
||||
# Get QPIRI data once (shared configuration for all inverters in cascade)
|
||||
echo ""
|
||||
echo "Getting shared configuration (QPIRI)..."
|
||||
QPIRI_RAW=`$SUDO_CMD "$INVERTER_BIN" -r "QPIRI" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
QPIRI_RAW=""
|
||||
for attempt in 1 2 3 4 5; do
|
||||
QPIRI_RAW=`$SUDO_CMD "$INVERTER_BIN" -r "QPIRI" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
if [ ! -z "$QPIRI_RAW" ] && [ "$QPIRI_RAW" != "NAK" ]; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
QPIRI_SUCCESS=false
|
||||
if [ ! -z "$QPIRI_RAW" ] && [ "$QPIRI_RAW" != "NAK" ]; then
|
||||
@@ -270,18 +336,145 @@ else
|
||||
echo "⚠ QPIRI failed, configuration parameters unavailable"
|
||||
fi
|
||||
|
||||
# Extract runtime data for each inverter using QPGS
|
||||
# Extract runtime data for each inverter using QPGS (single session)
|
||||
PARALLEL_SUCCESS=false
|
||||
|
||||
for i in $(seq 1 $PARALLEL_COUNT); do
|
||||
QPGS_IDX=$((i - 1)) # 0-based index
|
||||
SERIAL=`echo "$PARALLEL_DISCOVERY" | grep "INVERTER_${i}_SERIAL=" | cut -d= -f2`
|
||||
|
||||
PARALLEL_QPGS_COUNT=$PARALLEL_COUNT
|
||||
if [ "$PARALLEL_QPGS_COUNT" -lt 2 ]; then
|
||||
PARALLEL_QPGS_COUNT=2
|
||||
fi
|
||||
if [ "$MAX_QPGS_IDX" -ge 0 ] && [ $((MAX_QPGS_IDX + 1)) -gt "$PARALLEL_QPGS_COUNT" ]; then
|
||||
PARALLEL_QPGS_COUNT=$((MAX_QPGS_IDX + 1))
|
||||
fi
|
||||
|
||||
PARALLEL_QPGS_OUTPUT=`$SUDO_CMD "$INVERTER_BIN" -P "$PARALLEL_QPGS_COUNT" 2>/dev/null`
|
||||
HAS_PARALLEL_QPGS=false
|
||||
if echo "$PARALLEL_QPGS_OUTPUT" | grep -q "^QPGS[0-9]_REPLY="; then
|
||||
HAS_PARALLEL_QPGS=true
|
||||
PARALLEL_QPGS_OUTPUT=`$SUDO_CMD "$INVERTER_BIN" -P "$PARALLEL_QPGS_COUNT" 2>/dev/null`
|
||||
fi
|
||||
|
||||
VALID_SERIALS=()
|
||||
VALID_QPGS=()
|
||||
|
||||
DIRECT_SERIALS=()
|
||||
DIRECT_QPGS=()
|
||||
if [ "$PARALLEL_COUNT" -lt 2 ]; then
|
||||
for idx in 0 1; do
|
||||
reply_value=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS$idx" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
if [ -z "$reply_value" ]; then
|
||||
continue
|
||||
fi
|
||||
serial_from_reply=`echo "$reply_value" | awk '{print $2}'`
|
||||
if [ -z "$serial_from_reply" ] || [ "$serial_from_reply" = "0.0" ]; then
|
||||
continue
|
||||
fi
|
||||
if echo "$serial_from_reply" | grep -qE '^0+$'; then
|
||||
continue
|
||||
fi
|
||||
if ! echo "$serial_from_reply" | grep -qE '^[0-9]{10,}$'; then
|
||||
continue
|
||||
fi
|
||||
duplicate=false
|
||||
for existing in "${DIRECT_SERIALS[@]}"; do
|
||||
if [ "$existing" = "$serial_from_reply" ]; then
|
||||
duplicate=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$duplicate" = true ]; then
|
||||
continue
|
||||
fi
|
||||
DIRECT_SERIALS+=("$serial_from_reply")
|
||||
DIRECT_QPGS+=("$idx")
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ${#DIRECT_SERIALS[@]} -gt 0 ]; then
|
||||
VALID_SERIALS=("${DIRECT_SERIALS[@]}")
|
||||
VALID_QPGS=("${DIRECT_QPGS[@]}")
|
||||
fi
|
||||
|
||||
if [ ${#VALID_SERIALS[@]} -eq 0 ] && [ "$HAS_PARALLEL_QPGS" = true ]; then
|
||||
for attempt in 1 2 3; do
|
||||
VALID_SERIALS=()
|
||||
VALID_QPGS=()
|
||||
|
||||
for idx in $(seq 0 $((PARALLEL_QPGS_COUNT - 1))); do
|
||||
reply_line=`echo "$PARALLEL_QPGS_OUTPUT" | grep "^QPGS${idx}_REPLY="`
|
||||
reply_value=`echo "$reply_line" | cut -d= -f2- | xargs`
|
||||
if [ -z "$reply_value" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
serial_from_reply=`echo "$reply_value" | awk '{print $2}'`
|
||||
if [ -z "$serial_from_reply" ] || [ "$serial_from_reply" = "0.0" ]; then
|
||||
continue
|
||||
fi
|
||||
if echo "$serial_from_reply" | grep -qE '^0+$'; then
|
||||
continue
|
||||
fi
|
||||
if ! echo "$serial_from_reply" | grep -qE '^[0-9]{10,}$'; then
|
||||
continue
|
||||
fi
|
||||
|
||||
duplicate=false
|
||||
for existing in "${VALID_SERIALS[@]}"; do
|
||||
if [ "$existing" = "$serial_from_reply" ]; then
|
||||
duplicate=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$duplicate" = true ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
VALID_SERIALS+=("$serial_from_reply")
|
||||
VALID_QPGS+=("$idx")
|
||||
done
|
||||
|
||||
if [ ${#VALID_SERIALS[@]} -ge 2 ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
PARALLEL_QPGS_OUTPUT=`$SUDO_CMD "$INVERTER_BIN" -P "$PARALLEL_QPGS_COUNT" 2>/dev/null`
|
||||
sleep 1
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ${#VALID_SERIALS[@]} -eq 0 ]; then
|
||||
VALID_SERIALS=("${DISCOVERY_SERIALS[@]}")
|
||||
VALID_QPGS=("${DISCOVERY_QPGS[@]}")
|
||||
fi
|
||||
|
||||
VALID_COUNT=${#VALID_SERIALS[@]}
|
||||
|
||||
SUCCESS_INV_IDS=()
|
||||
|
||||
if [ "$VALID_COUNT" -eq 0 ]; then
|
||||
echo "⚠ No valid inverter serials found (excluding 0.0/all-zero)"
|
||||
else
|
||||
echo "Processing $VALID_COUNT valid parallel inverters"
|
||||
fi
|
||||
|
||||
# Publish discovery info (valid inverters only)
|
||||
pushMQTTData "system" "parallel_count" "$VALID_COUNT"
|
||||
|
||||
for idx in "${!VALID_SERIALS[@]}"; do
|
||||
inv_id=$((idx + 1))
|
||||
QPGS_IDX="${VALID_QPGS[$idx]}"
|
||||
SERIAL="${VALID_SERIALS[$idx]}"
|
||||
|
||||
echo ""
|
||||
echo "Processing Inverter #$i (Serial: $SERIAL, QPGS$QPGS_IDX)"
|
||||
|
||||
# Get QPGS data: 1 Serial Mode Status GridV GridF OutV OutF VA W PCT BattV ChgA Cap PVV PVA ...
|
||||
QPGS_RAW=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS$QPGS_IDX" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
echo "Processing Inverter #$inv_id (Serial: $SERIAL, QPGS$QPGS_IDX)"
|
||||
|
||||
# Get QPGS data from single-session output, fallback to direct query
|
||||
if [ "$HAS_PARALLEL_QPGS" = true ]; then
|
||||
QPGS_RAW=`echo "$PARALLEL_QPGS_OUTPUT" | grep "^QPGS${QPGS_IDX}_REPLY=" | cut -d= -f2- | xargs`
|
||||
fi
|
||||
if [ -z "$QPGS_RAW" ]; then
|
||||
QPGS_RAW=`$SUDO_CMD "$INVERTER_BIN" -r "QPGS$QPGS_IDX" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
fi
|
||||
|
||||
if [ ! -z "$QPGS_RAW" ] && [ "$QPGS_RAW" != "NAK" ]; then
|
||||
echo " ✓ QPGS$QPGS_IDX successful"
|
||||
@@ -295,46 +488,57 @@ for i in $(seq 1 $PARALLEL_COUNT); do
|
||||
# 8=VA, 9=W, 10=PCT, 11=BattV, 12=ChgA, 13=Cap, 14=PVV, 15=PVA
|
||||
# 16=?, 17=?, 18=?, 19-26=additional fields
|
||||
|
||||
# Prefer serial from QPGS payload if valid
|
||||
serial_from_data="${DATA[1]}"
|
||||
if echo "$serial_from_data" | grep -qE '^[0-9]{10,}$'; then
|
||||
SERIAL="$serial_from_data"
|
||||
fi
|
||||
|
||||
# Publish serial
|
||||
pushMQTTData "$i" "serial" "$SERIAL"
|
||||
pushMQTTData "$inv_id" "serial" "$SERIAL"
|
||||
|
||||
# Runtime data from QPGS (19 parameters)
|
||||
[ "${DATA[2]}" ] && pushMQTTData "$i" "Inverter_mode" "${DATA[2]}"
|
||||
[ "${DATA[4]}" ] && pushMQTTData "$i" "AC_grid_voltage" "${DATA[4]}"
|
||||
[ "${DATA[5]}" ] && pushMQTTData "$i" "AC_grid_frequency" "${DATA[5]}"
|
||||
[ "${DATA[6]}" ] && pushMQTTData "$i" "AC_out_voltage" "${DATA[6]}"
|
||||
[ "${DATA[7]}" ] && pushMQTTData "$i" "AC_out_frequency" "${DATA[7]}"
|
||||
[ "${DATA[8]}" ] && pushMQTTData "$i" "Load_va" "${DATA[8]}"
|
||||
[ "${DATA[9]}" ] && pushMQTTData "$i" "Load_watt" "${DATA[9]}"
|
||||
[ "${DATA[10]}" ] && pushMQTTData "$i" "Load_pct" "${DATA[10]}"
|
||||
[ "${DATA[11]}" ] && pushMQTTData "$i" "Battery_voltage" "${DATA[11]}"
|
||||
[ "${DATA[12]}" ] && pushMQTTData "$i" "Battery_charge_current" "${DATA[12]}"
|
||||
[ "${DATA[13]}" ] && pushMQTTData "$i" "Battery_capacity" "${DATA[13]}"
|
||||
[ "${DATA[14]}" ] && pushMQTTData "$i" "PV_in_voltage" "${DATA[14]}"
|
||||
[ "${DATA[15]}" ] && pushMQTTData "$i" "PV_in_current" "${DATA[15]}"
|
||||
[ "${DATA[2]}" ] && pushMQTTData "$inv_id" "Inverter_mode" "${DATA[2]}"
|
||||
[ "${DATA[4]}" ] && pushMQTTData "$inv_id" "AC_grid_voltage" "${DATA[4]}"
|
||||
[ "${DATA[5]}" ] && pushMQTTData "$inv_id" "AC_grid_frequency" "${DATA[5]}"
|
||||
[ "${DATA[6]}" ] && pushMQTTData "$inv_id" "AC_out_voltage" "${DATA[6]}"
|
||||
[ "${DATA[7]}" ] && pushMQTTData "$inv_id" "AC_out_frequency" "${DATA[7]}"
|
||||
[ "${DATA[8]}" ] && pushMQTTData "$inv_id" "Load_va" "${DATA[8]}"
|
||||
[ "${DATA[9]}" ] && pushMQTTData "$inv_id" "Load_watt" "${DATA[9]}"
|
||||
[ "${DATA[10]}" ] && pushMQTTData "$inv_id" "Load_pct" "${DATA[10]}"
|
||||
[ "${DATA[11]}" ] && pushMQTTData "$inv_id" "Battery_voltage" "${DATA[11]}"
|
||||
[ "${DATA[12]}" ] && pushMQTTData "$inv_id" "Battery_charge_current" "${DATA[12]}"
|
||||
[ "${DATA[13]}" ] && pushMQTTData "$inv_id" "Battery_capacity" "${DATA[13]}"
|
||||
[ "${DATA[14]}" ] && pushMQTTData "$inv_id" "PV_in_voltage" "${DATA[14]}"
|
||||
[ "${DATA[15]}" ] && pushMQTTData "$inv_id" "PV_in_current" "${DATA[15]}"
|
||||
|
||||
# Calculate PV watts (V * A)
|
||||
if [ ! -z "${DATA[14]}" ] && [ ! -z "${DATA[15]}" ]; then
|
||||
PV_WATTS=`echo "${DATA[14]} ${DATA[15]}" | awk '{printf "%.1f", $1 * $2}'`
|
||||
pushMQTTData "$i" "PV_in_watts" "$PV_WATTS"
|
||||
pushMQTTData "$inv_id" "PV_in_watts" "$PV_WATTS"
|
||||
fi
|
||||
|
||||
# Status flags (parse from field 18 bitmap if available)
|
||||
[ "${DATA[18]}" ] && {
|
||||
BITMAP="${DATA[18]}"
|
||||
# Binary flags: bit0=Load_on, bit1=SCC_on, bit2=AC_charge_on
|
||||
LOAD_ON=$((($BITMAP & 1) ? 1 : 0))
|
||||
SCC_ON=$((($BITMAP & 2) ? 1 : 0))
|
||||
AC_CHG_ON=$((($BITMAP & 4) ? 1 : 0))
|
||||
|
||||
pushMQTTData "$i" "Load_status_on" "$LOAD_ON"
|
||||
pushMQTTData "$i" "SCC_charge_on" "$SCC_ON"
|
||||
pushMQTTData "$i" "AC_charge_on" "$AC_CHG_ON"
|
||||
if [[ "$BITMAP" =~ ^[0-9]+$ ]]; then
|
||||
BITMAP=$((10#$BITMAP))
|
||||
# Binary flags: bit0=Load_on, bit1=SCC_on, bit2=AC_charge_on
|
||||
LOAD_ON=$((($BITMAP & 1) ? 1 : 0))
|
||||
SCC_ON=$((($BITMAP & 2) ? 1 : 0))
|
||||
AC_CHG_ON=$((($BITMAP & 4) ? 1 : 0))
|
||||
|
||||
pushMQTTData "$inv_id" "Load_status_on" "$LOAD_ON"
|
||||
pushMQTTData "$inv_id" "SCC_charge_on" "$SCC_ON"
|
||||
pushMQTTData "$inv_id" "AC_charge_on" "$AC_CHG_ON"
|
||||
fi
|
||||
}
|
||||
|
||||
echo " ✓ Published 17 runtime parameters for inverter #$i"
|
||||
echo " ✓ Published 17 runtime parameters for inverter #$inv_id"
|
||||
echo " (QPGS data + calculated PV_watts + status flags)"
|
||||
echo " ⚠ Missing 5 params: PV_watthour, Load_watthour, Bus_voltage, Heatsink_temp, Warnings"
|
||||
|
||||
SUCCESS_INV_IDS+=("$inv_id")
|
||||
|
||||
else
|
||||
echo " ✗ QPGS$QPGS_IDX failed (NAK or empty)"
|
||||
@@ -342,27 +546,71 @@ for i in $(seq 1 $PARALLEL_COUNT); do
|
||||
done
|
||||
|
||||
# Publish shared configuration parameters for ALL inverters (replicate QPIRI data)
|
||||
if [ "$QPIRI_SUCCESS" = true ]; then
|
||||
if [ "$QPIRI_SUCCESS" = true ] && [ ${#SUCCESS_INV_IDS[@]} -gt 0 ]; then
|
||||
echo ""
|
||||
echo "Publishing shared configuration to all inverters..."
|
||||
|
||||
for i in $(seq 1 $PARALLEL_COUNT); do
|
||||
echo " Replicating QPIRI config to inverter #$i..."
|
||||
|
||||
for inv_id in "${SUCCESS_INV_IDS[@]}"; do
|
||||
echo " Replicating QPIRI config to inverter #$inv_id..."
|
||||
|
||||
[ ! -z "$BATT_RECHARGE" ] && pushMQTTData "$i" "Battery_recharge_voltage" "$BATT_RECHARGE"
|
||||
[ ! -z "$BATT_UNDER" ] && pushMQTTData "$i" "Battery_under_voltage" "$BATT_UNDER"
|
||||
[ ! -z "$BATT_BULK" ] && pushMQTTData "$i" "Battery_bulk_voltage" "$BATT_BULK"
|
||||
[ ! -z "$BATT_FLOAT" ] && pushMQTTData "$i" "Battery_float_voltage" "$BATT_FLOAT"
|
||||
[ ! -z "$MAX_CHARGE_CURRENT" ] && pushMQTTData "$i" "Max_charge_current" "$MAX_CHARGE_CURRENT"
|
||||
[ ! -z "$MAX_GRID_CHARGE" ] && pushMQTTData "$i" "Max_grid_charge_current" "$MAX_GRID_CHARGE"
|
||||
[ ! -z "$OUT_SOURCE_PRIORITY" ] && pushMQTTData "$i" "Out_source_priority" "$OUT_SOURCE_PRIORITY"
|
||||
[ ! -z "$CHARGER_SOURCE_PRIORITY" ] && pushMQTTData "$i" "Charger_source_priority" "$CHARGER_SOURCE_PRIORITY"
|
||||
[ ! -z "$BATT_REDISCHARGE" ] && pushMQTTData "$i" "Battery_redischarge_voltage" "$BATT_REDISCHARGE"
|
||||
[ ! -z "$BATT_RECHARGE" ] && pushMQTTData "$inv_id" "Battery_recharge_voltage" "$BATT_RECHARGE"
|
||||
[ ! -z "$BATT_UNDER" ] && pushMQTTData "$inv_id" "Battery_under_voltage" "$BATT_UNDER"
|
||||
[ ! -z "$BATT_BULK" ] && pushMQTTData "$inv_id" "Battery_bulk_voltage" "$BATT_BULK"
|
||||
[ ! -z "$BATT_FLOAT" ] && pushMQTTData "$inv_id" "Battery_float_voltage" "$BATT_FLOAT"
|
||||
[ ! -z "$MAX_CHARGE_CURRENT" ] && pushMQTTData "$inv_id" "Max_charge_current" "$MAX_CHARGE_CURRENT"
|
||||
[ ! -z "$MAX_GRID_CHARGE" ] && pushMQTTData "$inv_id" "Max_grid_charge_current" "$MAX_GRID_CHARGE"
|
||||
[ ! -z "$OUT_SOURCE_PRIORITY" ] && pushMQTTData "$inv_id" "Out_source_priority" "$OUT_SOURCE_PRIORITY"
|
||||
[ ! -z "$CHARGER_SOURCE_PRIORITY" ] && pushMQTTData "$inv_id" "Charger_source_priority" "$CHARGER_SOURCE_PRIORITY"
|
||||
[ ! -z "$BATT_REDISCHARGE" ] && pushMQTTData "$inv_id" "Battery_redischarge_voltage" "$BATT_REDISCHARGE"
|
||||
|
||||
echo " ✓ Published 9 shared config parameters to inv$i"
|
||||
echo " ✓ Published 9 shared config parameters to inv$inv_id"
|
||||
done
|
||||
fi
|
||||
|
||||
# Retry shared config once after QPGS if needed
|
||||
if [ "$QPIRI_SUCCESS" = false ] && [ ${#SUCCESS_INV_IDS[@]} -gt 0 ]; then
|
||||
echo ""
|
||||
echo "Retrying shared configuration (QPIRI) after QPGS..."
|
||||
for attempt in 1 2 3; do
|
||||
QPIRI_RAW=`$SUDO_CMD "$INVERTER_BIN" -r "QPIRI" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs`
|
||||
if [ ! -z "$QPIRI_RAW" ] && [ "$QPIRI_RAW" != "NAK" ]; then
|
||||
QPIRI_SUCCESS=true
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$QPIRI_SUCCESS" = true ]; then
|
||||
IFS=' ' read -ra QPIRI <<< "$QPIRI_RAW"
|
||||
BATT_RECHARGE="${QPIRI[8]}"
|
||||
BATT_UNDER="${QPIRI[9]}"
|
||||
BATT_BULK="${QPIRI[10]}"
|
||||
BATT_FLOAT="${QPIRI[11]}"
|
||||
MAX_CHARGE_CURRENT="${QPIRI[13]}"
|
||||
MAX_GRID_CHARGE="${QPIRI[14]}"
|
||||
OUT_SOURCE_PRIORITY="${QPIRI[15]}"
|
||||
CHARGER_SOURCE_PRIORITY="${QPIRI[16]}"
|
||||
BATT_REDISCHARGE="${QPIRI[22]}"
|
||||
|
||||
echo "Publishing shared configuration to all inverters..."
|
||||
for inv_id in "${SUCCESS_INV_IDS[@]}"; do
|
||||
echo " Replicating QPIRI config to inverter #$inv_id..."
|
||||
[ ! -z "$BATT_RECHARGE" ] && pushMQTTData "$inv_id" "Battery_recharge_voltage" "$BATT_RECHARGE"
|
||||
[ ! -z "$BATT_UNDER" ] && pushMQTTData "$inv_id" "Battery_under_voltage" "$BATT_UNDER"
|
||||
[ ! -z "$BATT_BULK" ] && pushMQTTData "$inv_id" "Battery_bulk_voltage" "$BATT_BULK"
|
||||
[ ! -z "$BATT_FLOAT" ] && pushMQTTData "$inv_id" "Battery_float_voltage" "$BATT_FLOAT"
|
||||
[ ! -z "$MAX_CHARGE_CURRENT" ] && pushMQTTData "$inv_id" "Max_charge_current" "$MAX_CHARGE_CURRENT"
|
||||
[ ! -z "$MAX_GRID_CHARGE" ] && pushMQTTData "$inv_id" "Max_grid_charge_current" "$MAX_GRID_CHARGE"
|
||||
[ ! -z "$OUT_SOURCE_PRIORITY" ] && pushMQTTData "$inv_id" "Out_source_priority" "$OUT_SOURCE_PRIORITY"
|
||||
[ ! -z "$CHARGER_SOURCE_PRIORITY" ] && pushMQTTData "$inv_id" "Charger_source_priority" "$CHARGER_SOURCE_PRIORITY"
|
||||
[ ! -z "$BATT_REDISCHARGE" ] && pushMQTTData "$inv_id" "Battery_redischarge_voltage" "$BATT_REDISCHARGE"
|
||||
echo " ✓ Published 9 shared config parameters to inv$inv_id"
|
||||
done
|
||||
else
|
||||
echo "⚠ QPIRI retry failed, shared configuration not published"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback: use standard mode with full JSON output
|
||||
if [ "$PARALLEL_SUCCESS" = false ]; then
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user