From 53899b0fac7376d13826f0f15b56a50cb6b44e01 Mon Sep 17 00:00:00 2001 From: Pi Developer Date: Mon, 2 Feb 2026 23:17:50 +0100 Subject: [PATCH] feat: Supporto multi-inverter in mqtt-init.sh con discovery topics - Aggiornato mqtt-init.sh per supportare array INVERTER_DEVICES - Registrazione discovery topics per ogni inverter (voltronic, voltronic2, ecc.) - Aggiunto unique_id e device info per Home Assistant - Flag retain sui config topics per persistenza - Naming coerente con mqtt-push.sh (voltronic, voltronic2, voltronic3, ...) - Echo output per debug registrazione topics --- sources/inverter-mqtt/mqtt-init.sh | 158 +++++++++++++++++++---------- 1 file changed, 106 insertions(+), 52 deletions(-) diff --git a/sources/inverter-mqtt/mqtt-init.sh b/sources/inverter-mqtt/mqtt-init.sh index dbc3dfd..f051b83 100755 --- a/sources/inverter-mqtt/mqtt-init.sh +++ b/sources/inverter-mqtt/mqtt-init.sh @@ -1,77 +1,131 @@ #!/bin/bash # -# Simple script to register the MQTT topics when the container starts for the first time... +# Script to register MQTT topics for Home Assistant auto-discovery +# Supports multi-inverter configuration -MQTT_SERVER=`cat /etc/inverter/mqtt.json | jq '.server' -r` -MQTT_PORT=`cat /etc/inverter/mqtt.json | jq '.port' -r` -MQTT_TOPIC=`cat /etc/inverter/mqtt.json | jq '.topic' -r` -MQTT_DEVICENAME=`cat /etc/inverter/mqtt.json | jq '.devicename' -r` -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` +MQTT_CONFIG_FILE="/etc/inverter/mqtt.json" + +MQTT_SERVER=$(jq -r '.server' "$MQTT_CONFIG_FILE") +MQTT_PORT=$(jq -r '.port' "$MQTT_CONFIG_FILE") +MQTT_TOPIC=$(jq -r '.topic' "$MQTT_CONFIG_FILE") +MQTT_BASE_DEVICENAME=$(jq -r '.devicename' "$MQTT_CONFIG_FILE") +MQTT_USERNAME=$(jq -r '.username' "$MQTT_CONFIG_FILE") +MQTT_PASSWORD=$(jq -r '.password' "$MQTT_CONFIG_FILE") +MQTT_CLIENTID=$(jq -r '.clientid' "$MQTT_CONFIG_FILE") + +# Determine device array +if [ ! -z "$INVERTER_DEVICES" ]; then + IFS=':' read -ra DEVICE_ARRAY <<< "$INVERTER_DEVICES" +else + DEFAULT_DEVICE=$(grep "^device=" /etc/inverter/inverter.conf | cut -d= -f2) + DEVICE_ARRAY=("${DEFAULT_DEVICE:-/dev/ttyUSB0}") +fi registerTopic () { + local devicename="$1" + local metric="$2" + local unit="$3" + local icon="$4" + mosquitto_pub \ -h $MQTT_SERVER \ -p $MQTT_PORT \ -u "$MQTT_USERNAME" \ -P "$MQTT_PASSWORD" \ - -i $MQTT_CLIENTID \ - -t "$MQTT_TOPIC/sensor/"$MQTT_DEVICENAME"_$1/config" \ + -i "${MQTT_CLIENTID}_init" \ + -t "$MQTT_TOPIC/sensor/${devicename}_${metric}/config" \ + -r \ -m "{ - \"name\": \""$MQTT_DEVICENAME"_$1\", - \"unit_of_measurement\": \"$2\", - \"state_topic\": \"$MQTT_TOPIC/sensor/"$MQTT_DEVICENAME"_$1\", - \"icon\": \"mdi:$3\" + \"name\": \"${devicename}_${metric}\", + \"unit_of_measurement\": \"$unit\", + \"state_topic\": \"$MQTT_TOPIC/sensor/${devicename}_${metric}\", + \"icon\": \"mdi:$icon\", + \"unique_id\": \"${devicename}_${metric}\", + \"device\": { + \"identifiers\": [\"${devicename}\"], + \"name\": \"${devicename}\", + \"manufacturer\": \"Voltronic\", + \"model\": \"Inverter\" + } }" } registerInverterRawCMD () { + local devicename="$1" + mosquitto_pub \ -h $MQTT_SERVER \ -p $MQTT_PORT \ -u "$MQTT_USERNAME" \ -P "$MQTT_PASSWORD" \ - -i $MQTT_CLIENTID \ - -t "$MQTT_TOPIC/sensor/$MQTT_DEVICENAME/config" \ + -i "${MQTT_CLIENTID}_init" \ + -t "$MQTT_TOPIC/sensor/$devicename/config" \ + -r \ -m "{ - \"name\": \""$MQTT_DEVICENAME"\", - \"state_topic\": \"$MQTT_TOPIC/sensor/$MQTT_DEVICENAME\" + \"name\": \"$devicename\", + \"state_topic\": \"$MQTT_TOPIC/sensor/$devicename\", + \"unique_id\": \"${devicename}_raw\", + \"device\": { + \"identifiers\": [\"${devicename}\"], + \"name\": \"${devicename}\", + \"manufacturer\": \"Voltronic\", + \"model\": \"Inverter\" + } }" } -registerTopic "Inverter_mode" "" "solar-power" # 1 = Power_On, 2 = Standby, 3 = Line, 4 = Battery, 5 = Fault, 6 = Power_Saving, 7 = Unknown -registerTopic "AC_grid_voltage" "V" "power-plug" -registerTopic "AC_grid_frequency" "Hz" "current-ac" -registerTopic "AC_out_voltage" "V" "power-plug" -registerTopic "AC_out_frequency" "Hz" "current-ac" -registerTopic "PV_in_voltage" "V" "solar-panel-large" -registerTopic "PV_in_current" "A" "solar-panel-large" -registerTopic "PV_in_watts" "W" "solar-panel-large" -registerTopic "PV_in_watthour" "Wh" "solar-panel-large" -registerTopic "SCC_voltage" "V" "current-dc" -registerTopic "Load_pct" "%" "brightness-percent" -registerTopic "Load_watt" "W" "chart-bell-curve" -registerTopic "Load_watthour" "Wh" "chart-bell-curve" -registerTopic "Load_va" "VA" "chart-bell-curve" -registerTopic "Bus_voltage" "V" "details" -registerTopic "Heatsink_temperature" "°C" "details" -registerTopic "Battery_capacity" "%" "battery-outline" -registerTopic "Battery_voltage" "V" "battery-outline" -registerTopic "Battery_charge_current" "A" "current-dc" -registerTopic "Battery_discharge_current" "A" "current-dc" -registerTopic "Load_status_on" "" "power" -registerTopic "SCC_charge_on" "" "power" -registerTopic "AC_charge_on" "" "power" -registerTopic "Battery_recharge_voltage" "V" "current-dc" -registerTopic "Battery_under_voltage" "V" "current-dc" -registerTopic "Battery_bulk_voltage" "V" "current-dc" -registerTopic "Battery_float_voltage" "V" "current-dc" -registerTopic "Max_grid_charge_current" "A" "current-ac" -registerTopic "Max_charge_current" "A" "current-ac" -registerTopic "Out_source_priority" "" "grid" -registerTopic "Charger_source_priority" "" "solar-power" -registerTopic "Battery_redischarge_voltage" "V" "battery-negative" +register_inverter_topics() { + local devicename="$1" + + echo "Registering MQTT discovery topics for: $devicename" + + registerTopic "$devicename" "Inverter_mode" "" "solar-power" + registerTopic "$devicename" "AC_grid_voltage" "V" "power-plug" + registerTopic "$devicename" "AC_grid_frequency" "Hz" "current-ac" + registerTopic "$devicename" "AC_out_voltage" "V" "power-plug" + registerTopic "$devicename" "AC_out_frequency" "Hz" "current-ac" + registerTopic "$devicename" "PV_in_voltage" "V" "solar-panel-large" + registerTopic "$devicename" "PV_in_current" "A" "solar-panel-large" + registerTopic "$devicename" "PV_in_watts" "W" "solar-panel-large" + registerTopic "$devicename" "PV_in_watthour" "Wh" "solar-panel-large" + registerTopic "$devicename" "SCC_voltage" "V" "current-dc" + registerTopic "$devicename" "Load_pct" "%" "brightness-percent" + registerTopic "$devicename" "Load_watt" "W" "chart-bell-curve" + registerTopic "$devicename" "Load_watthour" "Wh" "chart-bell-curve" + registerTopic "$devicename" "Load_va" "VA" "chart-bell-curve" + registerTopic "$devicename" "Bus_voltage" "V" "details" + registerTopic "$devicename" "Heatsink_temperature" "°C" "details" + registerTopic "$devicename" "Battery_capacity" "%" "battery-outline" + registerTopic "$devicename" "Battery_voltage" "V" "battery-outline" + registerTopic "$devicename" "Battery_charge_current" "A" "current-dc" + registerTopic "$devicename" "Battery_discharge_current" "A" "current-dc" + registerTopic "$devicename" "Load_status_on" "" "power" + registerTopic "$devicename" "SCC_charge_on" "" "power" + registerTopic "$devicename" "AC_charge_on" "" "power" + registerTopic "$devicename" "Battery_recharge_voltage" "V" "current-dc" + registerTopic "$devicename" "Battery_under_voltage" "V" "current-dc" + registerTopic "$devicename" "Battery_bulk_voltage" "V" "current-dc" + registerTopic "$devicename" "Battery_float_voltage" "V" "current-dc" + registerTopic "$devicename" "Max_grid_charge_current" "A" "current-ac" + registerTopic "$devicename" "Max_charge_current" "A" "current-ac" + registerTopic "$devicename" "Out_source_priority" "" "grid" + registerTopic "$devicename" "Charger_source_priority" "" "solar-power" + registerTopic "$devicename" "Battery_redischarge_voltage" "V" "battery-negative" + + # Command topic + registerInverterRawCMD "$devicename" + + echo "✓ Discovery topics registered for: $devicename" +} -# Add in a separate topic so we can send raw commands from assistant back to the inverter via MQTT (such as changing power modes etc)... -registerInverterRawCMD +# Register topics for each inverter +for i in "${!DEVICE_ARRAY[@]}"; do + devicename="${MQTT_BASE_DEVICENAME}" + if [ $i -gt 0 ]; then + devicename="${MQTT_BASE_DEVICENAME}$((i + 1))" + fi + + register_inverter_topics "$devicename" +done + +echo "✓ All MQTT discovery topics registered"