#!/usr/bin/env bash # Shared mosquitto_pub/mosquitto_sub argument construction. # Passwords are read from a protected file rather than placed in .env or Git. mqtt_common_args() { MQTT_ARGS=(-h "$MQTT_HOST" -p "$MQTT_PORT") [[ -n "$MQTT_USERNAME" ]] && MQTT_ARGS+=(-u "$MQTT_USERNAME") if [[ -n "$MQTT_PASSWORD_FILE" ]]; then [[ -r "$MQTT_PASSWORD_FILE" ]] || die "MQTT password file is not readable: $MQTT_PASSWORD_FILE" MQTT_ARGS+=(-P "$(<"$MQTT_PASSWORD_FILE")") fi } mqtt_publish() { local topic="$1" payload="$2" retain="${3:-0}" [[ -n "$MQTT_HOST" ]] || die "MQTT_HOST is not configured" require_command mosquitto_pub mqtt_common_args # Backup state is retained so Home Assistant receives the latest result after # reconnecting. Command messages are handled separately and are never kept. (( retain )) && MQTT_ARGS+=(-r) mosquitto_pub "${MQTT_ARGS[@]}" -t "$topic" -m "$payload" }