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
429oder5xxwartet er (Retry-After, sonst exponentieller Backoff) und sendet denselben Body erneut. Das ist unbedenklich: Bereits gespeicherte Werte kommen inskippedalsunchangedzurück. - Andere Fehler (etwa
400 validation_errorfü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_atden 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 $failed0192a3f0-5b7c-7d21-8e4f-6a2b9c1d3e5f accepted 1, skipped 1, publishedDie 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.
Überblick
Kurze, lauffähige Programme für häufige Integrationsaufgaben, jeweils in cURL, TypeScript, Python und Go.
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.