I have added a lot of changes from various ai sessions
This commit is contained in:
+63
@@ -0,0 +1,63 @@
|
||||
#!/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 ==="
|
||||
Executable
+98
@@ -0,0 +1,98 @@
|
||||
#!/bin/bash
|
||||
# discover-influxdb.sh — Query InfluxDB to discover measurements, fields, and tags
|
||||
# Usage: ./discover-influxdb.sh [namespace]
|
||||
# Requires: kubectl, curl, jq
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
NAMESPACE="${1:-influxdb}"
|
||||
INFLUXDB_TOKEN="enaiY9yaiWi6ahv0phoph3FaiphoGh"
|
||||
INFLUXDB_ORG="influxdata"
|
||||
INFLUXDB_BUCKET="default"
|
||||
LOCAL_PORT="8086"
|
||||
|
||||
echo "=== InfluxDB Discovery ==="
|
||||
echo "Namespace: $NAMESPACE"
|
||||
echo ""
|
||||
|
||||
# Start port-forward in background
|
||||
echo "→ Starting port-forward to influxdb-influxdb2..."
|
||||
kubectl -n "$NAMESPACE" port-forward "svc/influxdb-influxdb2" "$LOCAL_PORT:80" &>/dev/null &
|
||||
PF_PID=$!
|
||||
sleep 2
|
||||
|
||||
# Ensure cleanup on exit
|
||||
cleanup() {
|
||||
kill "$PF_PID" 2>/dev/null || true
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
API="http://localhost:$LOCAL_PORT/api/v2/query?org=$INFLUXDB_ORG"
|
||||
AUTH="Authorization: Token $INFLUXDB_TOKEN"
|
||||
CT="Content-Type: application/vnd.flux"
|
||||
|
||||
echo ""
|
||||
echo "=== Measurements (tables) in bucket '$INFLUXDB_BUCKET' ==="
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "import \"influxdata/influxdb/schema\"
|
||||
schema.measurements(bucket: \"$INFLUXDB_BUCKET\")" \
|
||||
| jq -r '.[] | ._value' 2>/dev/null || echo "(no results or parse error)"
|
||||
|
||||
echo ""
|
||||
echo "=== Measurements with data in last 6 months ==="
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "from(bucket: \"$INFLUXDB_BUCKET\")
|
||||
|> range(start: -6mo)
|
||||
|> keep(columns: [\"_measurement\"])
|
||||
|> distinct()
|
||||
|> sort()" \
|
||||
| jq -r '.[] | ._value' 2>/dev/null || echo "(no results or parse error)"
|
||||
|
||||
echo ""
|
||||
echo "=== For each measurement: fields, tags, and sample count ==="
|
||||
|
||||
# Get measurements
|
||||
MEASUREMENTS=$(curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "import \"influxdata/influxdb/schema\"
|
||||
schema.measurements(bucket: \"$INFLUXDB_BUCKET\")" \
|
||||
| jq -r '.[] | ._value' 2>/dev/null)
|
||||
|
||||
for m in $MEASUREMENTS; do
|
||||
echo ""
|
||||
echo "--- Measurement: $m ---"
|
||||
|
||||
# Fields
|
||||
echo " Fields:"
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "import \"influxdata/influxdb/schema\"
|
||||
schema.measurementFieldKeys(bucket: \"$INFLUXDB_BUCKET\", measurement: \"$m\")" \
|
||||
| jq -r '.[] | " - \(._value)"' 2>/dev/null || echo " (none)"
|
||||
|
||||
# Tags
|
||||
echo " Tags:"
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "import \"influxdata/influxdb/schema\"
|
||||
schema.measurementTagKeys(bucket: \"$INFLUXDB_BUCKET\", measurement: \"$m\")" \
|
||||
| jq -r '.[] | " - \(._value)"' 2>/dev/null || echo " (none)"
|
||||
|
||||
# Tag values for entity_id (most common tag in HA data)
|
||||
echo " entity_id values (sample):"
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "import \"influxdata/influxdb/schema\"
|
||||
schema.tagValues(bucket: \"$INFLUXDB_BUCKET\", tag: \"entity_id\")
|
||||
|> filter(fn: (r) => r._measurement == \"$m\")
|
||||
|> limit(n: 20)" \
|
||||
| jq -r '.[] | " - \(._value)"' 2>/dev/null || echo " (none)"
|
||||
|
||||
# Sample count in last 6 months
|
||||
echo " Data points (last 6 months):"
|
||||
curl -s "$API" -H "$AUTH" -H "$CT" \
|
||||
-d "from(bucket: \"$INFLUXDB_BUCKET\")
|
||||
|> range(start: -6mo)
|
||||
|> filter(fn: (r) => r._measurement == \"$m\")
|
||||
|> count()" \
|
||||
| jq -r '.[] | " - \(._value)"' 2>/dev/null || echo " (none)"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Discovery complete ==="
|
||||
Reference in New Issue
Block a user