Drive HA's REST config-flow endpoint to add the NUT integration programmatically,
no manual UI clicks required. The script (setup-ha-nut.sh + ha-nut-setup.py) is
idempotent — skips if a NUT entry already exists.
Key finding: HAOS runs Tailscale as an isolated add-on container, so the HA core
container cannot route to Tailscale IPs. Added a LAN listener (192.168.3.11:3493)
to upsd so HA can reach it over the shared vmbr0 bridge. Both VMs (pfv-bms HA at
192.168.3.12 and pfv-tsys1 at 192.168.3.11) are on the same bridge.
Integration is live — sensors for battery charge (100%), status (Online), and
status data (OL) are reporting.
Secrets (HA token, NUT password) are read from ~/.config/pfvcluster/ and never
committed to the repo.
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
66 lines
2.0 KiB
Bash
66 lines
2.0 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# setup-ha-nut.sh — Add the Home Assistant NUT integration via REST API.
|
|
#
|
|
# Idempotent: skips if a NUT entry already exists. Reads secrets from
|
|
# ~/.config/pfvcluster/ (ha-token, nut-password) or env vars.
|
|
#
|
|
# Usage:
|
|
# bash ups/setup-ha-nut.sh
|
|
#
|
|
# Env overrides:
|
|
# HA_TOKEN HA long-lived access token
|
|
# NUT_PASS NUT upsd password for the homeassistant user
|
|
# HA_HOST HA host (default pfv-bms.knel.net)
|
|
# NUT_HOST upsd host (default 192.168.3.11 — LAN, see README)
|
|
# NUT_PORT upsd port (default 3493)
|
|
# NUT_USER upsd user (default homeassistant)
|
|
# NUT_UPS UPS name (default apc-smartups-c1500)
|
|
#
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONF_DIR="${PFV_CONF_DIR:-$HOME/.config/pfvcluster}"
|
|
|
|
# --- HA token ---
|
|
HA_TOKEN="${HA_TOKEN:-}"
|
|
if [[ -z "$HA_TOKEN" ]]; then
|
|
TOKEN_FILE="$CONF_DIR/ha-token"
|
|
if [[ -f "$TOKEN_FILE" ]]; then
|
|
HA_TOKEN="$(head -1 "$TOKEN_FILE" | tr -d '[:space:]')"
|
|
else
|
|
echo "error: no HA token. Set \$HA_TOKEN or create $TOKEN_FILE" >&2
|
|
echo " (HA → Profile → Long-Lived Access Tokens → Create Token)" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# --- NUT password ---
|
|
NUT_PASS="${NUT_PASS:-}"
|
|
if [[ -z "$NUT_PASS" ]]; then
|
|
PASS_FILE="$CONF_DIR/nut-password"
|
|
if [[ -f "$PASS_FILE" ]]; then
|
|
NUT_PASS="$(head -1 "$PASS_FILE" | tr -d '[:space:]')"
|
|
else
|
|
echo "error: no NUT password. Set \$NUT_PASS or create $PASS_FILE" >&2
|
|
echo " (value is in /etc/nut/upsd.users on the NUT host)" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# --- connection params (override for your own kit) ---
|
|
export HA_TOKEN
|
|
export NUT_PASS
|
|
export HA_HOST="${HA_HOST:-pfv-bms.knel.net}"
|
|
export HA_PORT="${HA_PORT:-8123}"
|
|
export NUT_HOST="${NUT_HOST:-192.168.3.11}"
|
|
export NUT_PORT="${NUT_PORT:-3493}"
|
|
export NUT_USER="${NUT_USER:-homeassistant}"
|
|
export NUT_UPS="${NUT_UPS:-apc-smartups-c1500}"
|
|
|
|
echo "HA: ${HA_HOST}:${HA_PORT}"
|
|
echo "NUT: ${NUT_USER}@${NUT_HOST}:${NUT_PORT} (UPS: ${NUT_UPS})"
|
|
echo ""
|
|
|
|
exec python3 "$SCRIPT_DIR/ha-nut-setup.py"
|