From 61567e3326beae34c46a9fd92cb660b61f1d7feb Mon Sep 17 00:00:00 2001 From: Pi Developer Date: Tue, 3 Feb 2026 00:51:37 +0100 Subject: [PATCH] fix: Pulizia topic legacy e discovery retention - 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 --- sources/inverter-mqtt/entrypoint.sh | 22 +++++++++++-- sources/inverter-mqtt/mqtt-init-parallel.sh | 26 +++++++++++++--- sources/inverter-mqtt/mqtt-subscriber.sh | 34 +++++++++++++++++---- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/sources/inverter-mqtt/entrypoint.sh b/sources/inverter-mqtt/entrypoint.sh index 6b5a825..023e919 100755 --- a/sources/inverter-mqtt/entrypoint.sh +++ b/sources/inverter-mqtt/entrypoint.sh @@ -246,14 +246,32 @@ sleep 2 MQTT_PUSH_SCRIPT="/opt/inverter-mqtt/mqtt-push-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... echo "Starting MQTT initialization service (every 5 minutes)..." 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) 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... echo "Starting MQTT data push service (every 30 seconds)..." diff --git a/sources/inverter-mqtt/mqtt-init-parallel.sh b/sources/inverter-mqtt/mqtt-init-parallel.sh index 3f461ac..a7643a3 100755 --- a/sources/inverter-mqtt/mqtt-init-parallel.sh +++ b/sources/inverter-mqtt/mqtt-init-parallel.sh @@ -21,12 +21,20 @@ registerTopic () { -u "$MQTT_USERNAME" \ -P "$MQTT_PASSWORD" \ -i $MQTT_CLIENTID \ + -r \ -t "$MQTT_TOPIC/sensor/${device_name}_$2/config" \ -m "{ \"name\": \"${device_name}_$2\", \"unit_of_measurement\": \"$3\", \"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" \ -P "$MQTT_PASSWORD" \ -i $MQTT_CLIENTID \ - -t "$MQTT_TOPIC/sensor/$device_name/config" \ + -r \ + -t "$MQTT_TOPIC/sensor/${device_name}_raw_cmd/config" \ -m "{ - \"name\": \"$device_name\", - \"state_topic\": \"$MQTT_TOPIC/sensor/$device_name\" + \"name\": \"${device_name} Raw Command\", + \"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}\" + } }" } diff --git a/sources/inverter-mqtt/mqtt-subscriber.sh b/sources/inverter-mqtt/mqtt-subscriber.sh index 4901edb..ab7b9a2 100755 --- a/sources/inverter-mqtt/mqtt-subscriber.sh +++ b/sources/inverter-mqtt/mqtt-subscriber.sh @@ -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_CLIENTID=`cat /etc/inverter/mqtt.json | jq '.clientid' -r` -while read rawcmd; -do +echo "MQTT Subscriber started for parallel inverters" +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." - /opt/inverter-cli/bin/inverter_poller -r $rawcmd; - -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) +# Subscribe to all command topics (legacy + parallel) +mosquitto_sub \ + -h $MQTT_SERVER \ + -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