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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user