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
This commit is contained in:
@@ -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)..."
|
||||||
|
|||||||
@@ -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}\"
|
||||||
|
}
|
||||||
}"
|
}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
-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
|
||||||
|
|
||||||
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)
|
# 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
|
||||||
|
|||||||
Reference in New Issue
Block a user