Migliora discovery e pubblicazione MQTT per inverter in cascata
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 9m22s

This commit is contained in:
Pi Developer
2026-02-10 21:59:47 +01:00
parent 61567e3326
commit 9e72d4f5a7
6 changed files with 696 additions and 128 deletions
+71 -22
View File
@@ -111,12 +111,55 @@ if [ -z "$PARALLEL_COUNT" ]; then
PARALLEL_COUNT=0
fi
VALID_SERIALS=()
VALID_QPGS=()
MAX_QPGS_IDX=-1
if [ $PARALLEL_COUNT -gt 0 ]; then
echo -e "${GREEN}✓ Found $PARALLEL_COUNT parallel inverter(s)${NC}"
for i in $(seq 1 $PARALLEL_COUNT); do
SERIAL=$(echo "$PARALLEL_OUTPUT" | grep "INVERTER_${i}_SERIAL=" | cut -d= -f2)
QPGS_IDX=$(echo "$PARALLEL_OUTPUT" | grep "INVERTER_${i}_QPGS=" | cut -d= -f2)
echo " • Inverter #$i: Serial $SERIAL (QPGS$QPGS_IDX)"
QPGS_COUNT=$PARALLEL_COUNT
if [ "$QPGS_COUNT" -lt 2 ]; then
QPGS_COUNT=2
fi
QPGS_OUTPUT=$($SUDO_CMD "$INVERTER_BIN" -P "$QPGS_COUNT" 2>/dev/null)
for idx in $(seq 0 $((QPGS_COUNT - 1))); do
QPGS_DATA=$(echo "$QPGS_OUTPUT" | grep "^QPGS${idx}_REPLY=" | cut -d= -f2- | xargs)
if [ -z "$QPGS_DATA" ]; then
continue
fi
SERIAL=$(echo "$QPGS_DATA" | awk '{print $2}')
if [ -z "$SERIAL" ] || [ "$SERIAL" = "0.0" ]; then
continue
fi
if echo "$SERIAL" | grep -qE '^0+$'; then
continue
fi
if ! echo "$SERIAL" | grep -qE '^[0-9]{10,}$'; then
continue
fi
duplicate=false
for existing in "${VALID_SERIALS[@]}"; do
if [ "$existing" = "$SERIAL" ]; then
duplicate=true
break
fi
done
if [ "$duplicate" = true ]; then
continue
fi
VALID_SERIALS+=("$SERIAL")
VALID_QPGS+=("$idx")
if [ "$idx" -gt "$MAX_QPGS_IDX" ]; then
MAX_QPGS_IDX=$idx
fi
done
VALID_COUNT=${#VALID_SERIALS[@]}
echo -e "${GREEN}✓ Found $VALID_COUNT valid parallel inverter(s)${NC}"
for idx in "${!VALID_SERIALS[@]}"; do
inv_id=$((idx + 1))
echo " • Inverter #$inv_id: Serial ${VALID_SERIALS[$idx]} (QPGS${VALID_QPGS[$idx]})"
done
else
echo -e "${YELLOW}⚠ No parallel inverters found, using single mode${NC}"
@@ -151,25 +194,30 @@ while true; do
echo ""
# Get parallel data
if [ $PARALLEL_COUNT -gt 0 ]; then
if [ ${#VALID_SERIALS[@]} -gt 0 ]; then
echo -e "${YELLOW}[2.2] Reading parallel inverters data${NC}"
for i in $(seq 1 $PARALLEL_COUNT); do
SERIAL=$(echo "$PARALLEL_OUTPUT" | grep "INVERTER_${i}_SERIAL=" | cut -d= -f2)
QPGS_IDX=$(echo "$PARALLEL_OUTPUT" | grep "INVERTER_${i}_QPGS=" | cut -d= -f2)
QPGS_COUNT=$((MAX_QPGS_IDX + 1))
if [ "$QPGS_COUNT" -lt 1 ]; then
QPGS_COUNT=2
fi
QPGS_OUTPUT=$($SUDO_CMD "$INVERTER_BIN" -P "$QPGS_COUNT" 2>/dev/null)
for idx in "${!VALID_SERIALS[@]}"; do
inv_id=$((idx + 1))
SERIAL="${VALID_SERIALS[$idx]}"
QPGS_IDX="${VALID_QPGS[$idx]}"
QPGS_DATA=$(echo "$QPGS_OUTPUT" | grep "^QPGS${QPGS_IDX}_REPLY=" | cut -d= -f2- | xargs)
QPGS_DATA=$($SUDO_CMD "$INVERTER_BIN" -r "QPGS$QPGS_IDX" 2>&1 | grep "Reply:" | cut -d: -f2- | xargs)
if [ ! -z "$QPGS_DATA" ] && [ "$QPGS_DATA" != "NAK" ]; then
# Parse key values
if [ ! -z "$QPGS_DATA" ]; then
IFS=' ' read -ra DATA <<< "$QPGS_DATA"
MODE="${DATA[2]}"
GRID_V="${DATA[4]}"
BATT_V="${DATA[11]}"
LOAD_W="${DATA[9]}"
echo -e " ${GREEN}${NC} Inverter #$i ($SERIAL): Mode=$MODE, Grid=${GRID_V}V, Battery=${BATT_V}V, Load=${LOAD_W}W"
echo -e " ${GREEN}${NC} Inverter #$inv_id ($SERIAL): Mode=$MODE, Grid=${GRID_V}V, Battery=${BATT_V}V, Load=${LOAD_W}W"
else
echo -e " ${RED}${NC} Inverter #$i ($SERIAL): No data"
echo -e " ${RED}${NC} Inverter #$inv_id ($SERIAL): No data"
fi
done
echo ""
@@ -184,13 +232,14 @@ while true; do
echo "$MQTT_OUTPUT" | sed 's/^/ /'
# Show sample topics published
if [ $PARALLEL_COUNT -gt 0 ]; then
if [ ${#VALID_SERIALS[@]} -gt 0 ]; then
echo -e " ${GREEN}Sample topics published:${NC}"
for i in $(seq 1 $PARALLEL_COUNT); do
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${i}_serial"
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${i}_Battery_voltage"
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${i}_Load_watt"
[ $i -eq 1 ] && echo " • ... (and more)"
for idx in "${!VALID_SERIALS[@]}"; do
inv_id=$((idx + 1))
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${inv_id}_serial"
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${inv_id}_Battery_voltage"
echo "$MQTT_TOPIC/sensor/${MQTT_DEVICE}_inv${inv_id}_Load_watt"
[ $inv_id -eq 1 ] && echo " • ... (and more)"
done
fi