I have added a lot of changes from various ai sessions

This commit is contained in:
Moritz Graf
2026-07-01 11:01:01 +02:00
parent 68345648d9
commit 15e802bebc
37 changed files with 5704 additions and 252 deletions
+63
View File
@@ -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 ==="
+98
View File
@@ -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 ==="