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.
valuesenthält den aktuellen Wert jedes Feldes auf Einheitsebene, das einen Wert hat (oder hatte), mit seiner Herkunft:revision,source,review_status,recorded_atund bei Zustandsdatenmeasured_at. Ein geleertes Feld hatvalue: 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
429wartet 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{"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.
QR-Etiketten für eine Charge
Listen Sie die veröffentlichten Einheiten einer Charge über das Seriennummernpräfix und speichern Sie den QR-Code jeder Einheit als SVG-Datei für den Etikettendruck.
Signaturen prüfen
Prüfen Sie die Ed25519-Signaturen einer Liste öffentlicher Pässe offline, laden Sie das Schlüsselset nur einmal und geben Sie je Pass ein Ergebnis aus.