infrapuzzle/k8s/monitoring/scripts/discover-home-assistant.sh

63 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
# discover-home-assistant.sh — Query Home Assistant REST API for entity metadata
# Usage: ./discover-home-assistant.sh
# Requires: curl, jq
set -euo pipefail
HA_URL="https://hass.moritzgraf.de"
HA_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI2NDMyZTI1MDIzZjU0ZmFiYTU3OTc0ODYyMzg3M2ExZSIsImlhdCI6MTc4MjczMTY4NiwiZXhwIjoyMDk4MDkxNjg2fQ.u8kFHoYL2kdhVenfe3BiWcNkN_en3yn91MRGSVJvbmw"
echo "=== Home Assistant Entity Discovery ==="
echo "URL: $HA_URL"
echo ""
# Get all entities
echo "→ Fetching all entities..."
ENTITIES=$(curl -s -H "Authorization: Bearer $HA_TOKEN" "$HA_URL/api/states")
if [ -z "$ENTITIES" ] || echo "$ENTITIES" | jq -e '. == null' >/dev/null 2>&1; then
echo "ERROR: Failed to fetch entities. Check token and connectivity."
exit 1
fi
echo ""
echo "=== Entity Summary ==="
echo "$ENTITIES" | jq -r '
[.[] | {
entity_id,
state,
friendly_name: (.attributes.friendly_name // ""),
unit: (.attributes.unit_of_measurement // ""),
device_class: (.attributes.device_class // ""),
domain: (.entity_id | split(".")[0])
}]
| sort_by(.domain, .entity_id)
| .[]
| "\(.entity_id) | state=\(.state) | name=\(.friendly_name) | unit=\(.unit) | class=\(.device_class) | domain=\(.domain)"
'
echo ""
echo "=== Domains (entity types) ==="
echo "$ENTITIES" | jq -r '[.[].entity_id | split(".")[0]] | unique | .[]'
echo ""
echo "=== Entities with unit_of_measurement (likely sensor data in InfluxDB) ==="
echo "$ENTITIES" | jq -r '
[.[] | select(.attributes.unit_of_measurement != null) | {
entity_id,
unit: .attributes.unit_of_measurement,
friendly_name: (.attributes.friendly_name // ""),
device_class: (.attributes.device_class // "")
}]
| sort_by(.unit, .entity_id)
| .[]
| "\(.entity_id) | \(.unit) | \(.device_class) | \(.friendly_name)"
'
echo ""
echo "=== Device classes ==="
echo "$ENTITIES" | jq -r '[.[].attributes.device_class | select(. != null)] | unique | .[]'
echo ""
echo "=== Discovery complete ==="