Zum Inhalt springen

Data-Warehouse-Abgleich

Gehen Sie alle Einheiten und ihre aktuellen Werte seitenweise durch und schreiben Sie je Einheit eine JSON-Zeile, bereit zum Laden in ein Data Warehouse.

Das Skript geht mit listBatteries alle Einheiten seitenweise durch, liest die aktuellen Werte jeder Einheit mit listBatteryValues und schreibt units.jsonl: je Einheit eine Zeile mit synced_at, der unit und ihren values. Die meisten Data Warehouses laden JSON Lines direkt. Es braucht einen Schlüssel mit dem Scope read.

  • values enthält den aktuellen Wert jedes Feldes auf Einheitsebene, das einen Wert hat (oder hatte), mit seiner Herkunft: revision, source, review_status, recorded_at und bei Zustandsdaten measured_at. Ein geleertes Feld hat value: null.
  • Daten auf Modellebene (Nennspannung, Nennkapazität und Ähnliches) gehören zur Modellversion, nicht zur Einheit: Lesen Sie sie einmal je Version mit listModelVersionValues.
  • Das Skript stellt eine Anfrage je Einheit und eine je 200 Einheiten. Bei 10 000 Einheiten sind das am gemeinsamen Limit von 600 Anfragen pro Minute etwa 17 Minuten; bei 429 wartet es.
#!/usr/bin/env bash
# warehouse-sync.sh: every unit with its current values as one JSON line (needs curl and jq)
set -euo pipefail
auth="Authorization: Bearer $BATTERYPASS_API_KEY"
synced_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)
cursor=""
: > units.jsonl
while :; do
  page=$(curl -sS --fail --retry 5 -G "$BATTERYPASS_URL/api/v1/batteries" -H "$auth" \
    -d limit=200 ${cursor:+--data-urlencode "cursor=$cursor"})
  jq -c '.items[]' <<<"$page" | while IFS= read -r unit; do
    id=$(jq -r .id <<<"$unit")
    curl -sS --fail --retry 5 -H "$auth" "$BATTERYPASS_URL/api/v1/batteries/$id/values" |
      jq -c --argjson unit "$unit" --arg at "$synced_at" '{synced_at: $at, unit: $unit, values: .items}' >> units.jsonl
  done
  cursor=$(jq -r '.next_cursor // empty' <<<"$page")
  [ -n "$cursor" ] || break
done
wc -l < units.jsonl
units.jsonl (eine Zeile, hier umbrochen)
{"synced_at":"2026-10-24T02:00:00Z",
 "unit":{"id":"0192a3f0-5b7c-7d21-8e4f-6a2b9c1d3e5f","serial_number":"SV2027-000184","passport_status":"published","row_version":4,"updated_at":"2026-07-02T10:15:00Z"},
 "values":[{"field_key":"condition.state_of_charge","value":81.5,"unit":"%","revision":9,"source":"api","review_status":"approved","measured_at":"2026-10-24T06:00:00Z","recorded_at":"2026-10-24T06:00:03Z","registry_version":"0.5.0","checks":[]}]}

Laden Sie die Datei in eine Staging-Tabelle und führen Sie sie über unit.id zusammen. Um bei späteren Läufen weniger zu lesen, vergleichen Sie row_version, passport_status und die revision der Werte mit dem, was Sie gespeichert haben, wie unter Einheiten abgleichen beschrieben. Eine vollständige Kopie aller Daten Ihrer Organisation kann ein Admin zusätzlich im Portal als Organisationsexport herunterladen.