Zum Inhalt springen

Nächtlicher Zustandsdaten-Push

Ein geplanter Job, der die Messwerte der letzten Nacht aus Ihrer eigenen Quelle liest und je Einheit ein updateCondition sendet, mit Backoff bei 429.

Der Job liest Messwerte aus Ihrer eigenen Quelle, hier ein Platzhalter, und sendet je Einheit ein updateCondition. Er braucht einen Schlüssel mit dem Scope condition. Starten Sie ihn einmal pro Nacht per Cron, systemd-Timer oder Ihrem Scheduler.

  • Bei 429 oder 5xx wartet er (Retry-After, sonst exponentieller Backoff) und sendet denselben Body erneut. Das ist unbedenklich: Bereits gespeicherte Werte kommen in skipped als unchanged zurück.
  • Andere Fehler (etwa 400 validation_error für einen Wert außerhalb des Bereichs) protokolliert er je Einheit, macht mit der nächsten weiter und endet am Schluss mit dem Status 1.
  • Tragen Sie in measured_at den Zeitpunkt der Messung ein, nicht den Zeitpunkt, zu dem der Job läuft.
#!/usr/bin/env bash
# nightly-condition-push.sh: one updateCondition per line of readings.jsonl (needs curl and jq)
# Each line, written by your BMS export: {"battery_id": "…", "measured_at": "…", "values": {"condition.…": 81.5}}
set -uo pipefail
failed=0
while IFS= read -r line; do
  id=$(jq -r .battery_id <<<"$line")
  body=$(jq -c '{measured_at, note: "Nightly BMS export",
    values: (.values | to_entries | map({field_key: .key, value: .value}))}' <<<"$line")
  # --retry repeats 429 and 5xx answers and waits as long as Retry-After says
  status=$(curl -sS --retry 5 -o response.json -w '%{http_code}' -X PATCH \
    "$BATTERYPASS_URL/api/v1/batteries/$id/condition" \
    -H "Authorization: Bearer $BATTERYPASS_API_KEY" \
    -H "Content-Type: application/json" \
    --data "$body")
  if [ "$status" = 200 ]; then
    jq -c --arg id "$id" '{id: $id, accepted: (.accepted | length), skipped, outcome: .publication.outcome}' response.json
  else
    failed=1
    jq -c --arg id "$id" --arg status "$status" '{id: $id, status: $status, code, request_id}' response.json >&2
  fi
done < readings.jsonl
exit $failed
Ausgabe
0192a3f0-5b7c-7d21-8e4f-6a2b9c1d3e5f accepted 1, skipped 1, published

Die Shell-Fassung liest readings.jsonl, je Einheit ein JSON-Objekt wie in ihrem Kopf gezeigt. Felder, Maßeinheiten und die Regeln für measured_at erklärt Zustandsdaten senden. Denken Sie bei vielen Einheiten daran, dass sich alle Schlüssel Ihrer Organisation 600 Anfragen pro Minute teilen.