#!/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 ==="