#!/bin/bash # # Script to register MQTT topics for Home Assistant auto-discovery # Supports multi-inverter configuration 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}_init" \ -t "$MQTT_TOPIC/sensor/${devicename}_${metric}/config" \ -r \ -m "{ \"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}_init" \ -t "$MQTT_TOPIC/sensor/$devicename/config" \ -r \ -m "{ \"name\": \"$devicename\", \"state_topic\": \"$MQTT_TOPIC/sensor/$devicename\", \"unique_id\": \"${devicename}_raw\", \"device\": { \"identifiers\": [\"${devicename}\"], \"name\": \"${devicename}\", \"manufacturer\": \"Voltronic\", \"model\": \"Inverter\" } }" } 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" } # 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"