feat: Supporto multi-inverter in mqtt-init.sh con discovery topics
Build Docker Image for Raspberry Pi / build-and-push (push) Has started running
Build Docker Image for Raspberry Pi / build-and-push (push) Has started running
- 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
This commit is contained in:
@@ -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"
|
||||
|
||||
# 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
|
||||
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"
|
||||
}
|
||||
|
||||
# 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"
|
||||
|
||||
Reference in New Issue
Block a user