fix: Pulizia topic legacy e discovery retention
Build Docker Image for Raspberry Pi / build-and-push (push) Successful in 7m31s
Docker Image Cleanup / cleanup-old-images (push) Failing after 3m16s

- Rimosso vecchio topic homeassistant/sensor/voltronic/config all'avvio
- Aggiunto flag -r (retain) a tutti i discovery topics
- MQTT init eseguito immediatamente all'avvio + ogni 5 minuti
- Aggiunto unique_id e device info a tutti i sensori per HA
- mqtt-subscriber ora ascolta su 3 topic:
  - homeassistant/sensor/voltronic/command (legacy)
  - homeassistant/sensor/voltronic_inv1_raw_cmd/command
  - homeassistant/sensor/voltronic_inv2_raw_cmd/command
- Subscriber con output verbose e timestamp
- Discovery topics ora persistono dopo restart broker MQTT

Timing verificato:
- Init all'avvio: immediato
- Re-init periodico: ogni 5 minuti (300s)
- Data push: ogni 30 secondi
This commit is contained in:
Pi Developer
2026-02-03 00:51:37 +01:00
parent 168ee6d12a
commit 61567e3326
3 changed files with 70 additions and 12 deletions
+20 -2
View File
@@ -246,14 +246,32 @@ sleep 2
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"
# Init the mqtt server for the first time, then every 5 minutes (300 seconds) # Remove old single-inverter discovery topics (legacy cleanup)
echo "Cleaning up legacy MQTT topics..."
MQTT_SERVER=$(jq -r '.server' /etc/inverter/mqtt.json)
MQTT_PORT=$(jq -r '.port' /etc/inverter/mqtt.json)
MQTT_USERNAME=$(jq -r '.username' /etc/inverter/mqtt.json)
MQTT_PASSWORD=$(jq -r '.password' /etc/inverter/mqtt.json)
MQTT_DEVICENAME=$(jq -r '.devicename' /etc/inverter/mqtt.json)
mosquitto_pub -h $MQTT_SERVER -p $MQTT_PORT -u "$MQTT_USERNAME" -P "$MQTT_PASSWORD" \
-t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME/config" -n -r > /dev/null 2>&1
echo "✓ Legacy topics cleaned"
# Run MQTT initialization immediately on startup
echo "Initializing MQTT discovery topics for both inverters..."
"$MQTT_INIT_SCRIPT"
echo "✓ MQTT discovery topics initialized"
# Init the mqtt server every 5 minutes (300 seconds)
# This will re-create the auto-created topics in the MQTT server if HA is restarted... # This will re-create the auto-created topics in the MQTT server if HA is restarted...
echo "Starting MQTT initialization service (every 5 minutes)..." echo "Starting MQTT initialization service (every 5 minutes)..."
watch -n 300 "$MQTT_INIT_SCRIPT" > /dev/null 2>&1 & watch -n 300 "$MQTT_INIT_SCRIPT" > /dev/null 2>&1 &
# Run the MQTT Subscriber process in the background (so that way we can change the configuration on the inverter from home assistant) # Run the MQTT Subscriber process in the background (so that way we can change the configuration on the inverter from home assistant)
echo "Starting MQTT subscriber for commands..." echo "Starting MQTT subscriber for commands..."
/opt/inverter-mqtt/mqtt-subscriber.sh & /opt/inverter-mqtt/mqtt-subscriber.sh > /dev/null 2>&1 &
# execute exactly every 30 seconds... # execute exactly every 30 seconds...
echo "Starting MQTT data push service (every 30 seconds)..." echo "Starting MQTT data push service (every 30 seconds)..."
+22 -4
View File
@@ -21,12 +21,20 @@ registerTopic () {
-u "$MQTT_USERNAME" \ -u "$MQTT_USERNAME" \
-P "$MQTT_PASSWORD" \ -P "$MQTT_PASSWORD" \
-i $MQTT_CLIENTID \ -i $MQTT_CLIENTID \
-r \
-t "$MQTT_TOPIC/sensor/${device_name}_$2/config" \ -t "$MQTT_TOPIC/sensor/${device_name}_$2/config" \
-m "{ -m "{
\"name\": \"${device_name}_$2\", \"name\": \"${device_name}_$2\",
\"unit_of_measurement\": \"$3\", \"unit_of_measurement\": \"$3\",
\"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_$2\", \"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_$2\",
\"icon\": \"mdi:$4\" \"icon\": \"mdi:$4\",
\"unique_id\": \"${device_name}_$2\",
\"device\": {
\"identifiers\": [\"${device_name}\"],
\"name\": \"${device_name}\",
\"manufacturer\": \"Voltronic\",
\"model\": \"Parallel Inverter #${inv_id}\"
}
}" }"
} }
@@ -40,10 +48,20 @@ registerInverterRawCMD () {
-u "$MQTT_USERNAME" \ -u "$MQTT_USERNAME" \
-P "$MQTT_PASSWORD" \ -P "$MQTT_PASSWORD" \
-i $MQTT_CLIENTID \ -i $MQTT_CLIENTID \
-t "$MQTT_TOPIC/sensor/$device_name/config" \ -r \
-t "$MQTT_TOPIC/sensor/${device_name}_raw_cmd/config" \
-m "{ -m "{
\"name\": \"$device_name\", \"name\": \"${device_name} Raw Command\",
\"state_topic\": \"$MQTT_TOPIC/sensor/$device_name\" \"state_topic\": \"$MQTT_TOPIC/sensor/${device_name}_raw_cmd\",
\"command_topic\": \"$MQTT_TOPIC/sensor/${device_name}_raw_cmd/command\",
\"unique_id\": \"${device_name}_raw_cmd\",
\"icon\": \"mdi:console\",
\"device\": {
\"identifiers\": [\"${device_name}\"],
\"name\": \"${device_name}\",
\"manufacturer\": \"Voltronic\",
\"model\": \"Parallel Inverter #${inv_id}\"
}
}" }"
} }
+28 -6
View File
@@ -8,10 +8,32 @@ MQTT_USERNAME=`cat /etc/inverter/mqtt.json | jq '.username' -r`
MQTT_PASSWORD=`cat /etc/inverter/mqtt.json | jq '.password' -r` MQTT_PASSWORD=`cat /etc/inverter/mqtt.json | jq '.password' -r`
MQTT_CLIENTID=`cat /etc/inverter/mqtt.json | jq '.clientid' -r` MQTT_CLIENTID=`cat /etc/inverter/mqtt.json | jq '.clientid' -r`
while read rawcmd; echo "MQTT Subscriber started for parallel inverters"
do echo "Listening on topics:"
echo " - $MQTT_TOPIC/sensor/${MQTT_DEVICENAME}/command (legacy single inverter)"
echo " - $MQTT_TOPIC/sensor/${MQTT_DEVICENAME}_inv1_raw_cmd/command (inverter #1)"
echo " - $MQTT_TOPIC/sensor/${MQTT_DEVICENAME}_inv2_raw_cmd/command (inverter #2)"
echo "Incoming request send: [$rawcmd] to inverter." # Subscribe to all command topics (legacy + parallel)
/opt/inverter-cli/bin/inverter_poller -r $rawcmd; mosquitto_sub \
-h $MQTT_SERVER \
done < <(mosquitto_sub -h $MQTT_SERVER -p $MQTT_PORT -u "$MQTT_USERNAME" -P "$MQTT_PASSWORD" -i $MQTT_CLIENTID -t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME" -q 1) -p $MQTT_PORT \
-u "$MQTT_USERNAME" \
-P "$MQTT_PASSWORD" \
-i $MQTT_CLIENTID \
-t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME/command" \
-t "$MQTT_TOPIC/sensor/${MQTT_DEVICENAME}_inv1_raw_cmd/command" \
-t "$MQTT_TOPIC/sensor/${MQTT_DEVICENAME}_inv2_raw_cmd/command" \
-q 1 | while read -r topic_and_payload; do
# mosquitto_sub with -v outputs "topic payload"
# Extract topic and payload
topic=$(echo "$topic_and_payload" | cut -d' ' -f1)
rawcmd=$(echo "$topic_and_payload" | cut -d' ' -f2-)
echo "[$(date)] Incoming command from $topic: [$rawcmd]"
# Execute command on inverter
/opt/inverter-cli/bin/inverter_poller -r "$rawcmd"
done