Plant Telemetry — Speicherstand und Zähler an uns schicken

POST /v1/plant/telemetry — SOC % und Zähler (kWh) regelmäßig senden. Loxone: Nur Telemetrie oder im Paket Hours & Telemetrie. Telemetrie-Softcap Community 2000/Tag — frisst nicht das Decision-Kontingent (120/Tag).

Was macht diese Funktion?

Ihr Haus schickt regelmäßig zwei Messwerte:

1. SOC % — wie voll ist die Batterie? (z. B. 40 %) 2. Zählerstand kWh — wie viele Kilowattstunden hat der Bezugszähler bisher angezeigt? (eine steigende Zahl, z. B. 3725,4 — nicht „Verbrauch heute“)

Wir speichern das am API-Key (Ihrer Anlage). Daraus lernen wir über Tage, wie Ihr Haus typischerweise verbraucht. Das verbessert die Empfehlungen von Hours Demand. Jeder SOC-Ping wird zusätzlich als Historie gespeichert (ca. 15‑Min-Rhythmus), damit die Anlagenprognose den Speicherverlauf zeigen kann.

Im Portal unter Anlagenprognose und in der Sparvo-App (Startseite + Anlage) sehen Sie grafisch:

1. Speicherstand % 2. Tagesverbrauch heute (kWh) — bis zur ersten Differenz „warte auf Zählerdaten“, nie der Roh-Zählerstand 3. Geschätzter Gesamttagesverbrauch (kWh) 4. Aktueller Zählerstand seit Baseline-Datum (kWh) — Label „seit {Datum}“ (erste Übertragung bzw. letzter Reset)

Die Live-Leiste zeigt nur die Werte — ohne Methoden-Hinweis unter dem geschätzten Tagesverbrauch. Die Schätzung kommt intern aus Zählerhistorie (recency-gewichtet, Spike-gedämpft; heute plus Same-Day-Overlay über die WD/WE-Stundenform, nicht Uhrzeit × 24) bzw. Jahres÷365 bis ≥1 vollem Tag. Dieselbe Zahl wie Hours Rest-heute und Outlook-D0. Hours-Explain „Bis heute früh“ nutzt für die Kurzfrist-Cover-Nacht zusätzlich Teilstunde + Recent-Rate (v1.9) — nicht identisch mit dem Kalendertag-Summenwert oben. Ab ≥1 vollem Zählertag schreiben wir Typical × 365 (auf 100 kWh aufgerundet) ins Anlagenprofil — auch bei einem SOC-only-Ping, sobald Historie da ist. Details: Hours Demand.

Die Live-Leiste aktualisiert sich automatisch etwa alle 15 Minuten (ohne Seiten-Reload), solange der Tab sichtbar ist — inkl. Zeitstempel „Aktualisiert …“. Endpunkte: Portal GET /plant-outlook/live-telem, Sparvo GET /api/live-telem.

Auf /plant-outlook und Sparvo /plant darunter (Reihenfolge: Live-Leiste → Hours-Erklärung → PV-Chart):

  • Start-Speicherstand (manuell) — Slider nur als Fallback, wenn noch keine Live-Telemetrie kommt (bei Live-SOC gesperrt).
  • Zähler zurücksetzen — nächster EMS-Ping = neuer Startwert.

SOC, Tagesverbrauch und Zählerstand erscheinen nur in der Live-Leiste, nicht noch einmal in separaten Karten. Ohne Live-Telem zeigt das Portal die Werte weiterhin in der Telemetrie-Karte (Fallback).

Portal-Slider: Sobald POST /v1/plant/telemetry einen SOC liefert (soc_source=hours_api), überschreibt er den Slider-Wert und sperrt den Slider (ca. 36 h Frische). Ohne frischen API-SOC ist der Slider wieder freigegeben.

Alltagsbeispiel: Wie eine Fitness-App, der Sie täglich Gewicht und Schritte schicken — nur eben SOC und Stromzähler.

Wann nutzen?

  • Sie haben eine Batterie / ein EMS
  • Sie wollen gute Hours-Empfehlungen, nicht nur Schätzungen

Telemetry speichert SOC und Zähler. Ausnahme: liegt der SoC nur noch 10 Prozentpunkte über dem Mindest-SoC (dann nochmal bei 5 pp und am Minimum) — oder steigt er spiegelbildlich wieder (Floor → 5 pp → 10 pp → Headroom) —, startet der Server intern async einen Hours-Decide — Snapshot + optional Webhook plant.plan_updated. Das zählt nicht gegen das Decision-Kontingent. Loxone-Extract liest die neue Entnahme-Cap (O12) erst beim nächsten Hours-Decide (:00 / SOC-Stufe / I6), sofern kein Webhook den Plan holt.

Wichtig: Kontingent

Telemetry zählt nicht gegen das normale Decision-Fair-Use-Limit. Sie dürfen also öfter „pingen“ (mit Softcap, siehe Rate Limits).

Endpoint


POST https://api.spotpriceapi.com/v1/plant/telemetry

curl -X POST https://api.spotpriceapi.com/v1/plant/telemetry \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sf_live_YOUR_KEY" \
  -d "{
    \"battery\": { \"soc_pct\": 40 },
    \"meter\": { \"import_kwh_total\": 3725.4 }
  }"

Erster Ping vs. später

SituationWas passiert
Erster Zählerwert (auch 3725 kWh)Startwert / Baseline — noch kein Verbrauch; meter.is_baseline=true, delta_kwh leer
Ping mit 0, danach echter Stand0 ist Platzhalter, kein Startwert; der echte Stand wird Baseline (kein erfundener Tagesverbrauch)
Bis zur ersten DifferenzPortal/Sparvo „Tagesverbrauch heute“ = warte auf Zählerdaten (0 kWh intern) — der Zählerstand selbst zählt nicht
Ab dem zweiten Ping mit Anstiegdelta_kwh = Differenz zum letzten Stand; erst dann ein Wert > 0 in der Live-Leiste
Portal „Zähler zurücksetzen“Gespeicherter Stand wird gelöscht; nächster Ping ist wieder Startwert
Zählerstand sinkt (Zählerwechsel)Neuer Startwert; meter.reset_suspected=true (kein negativer Verbrauch)

Antwort

FeldBedeutung
telemetry_statusok wenn gespeichert
soc_pctGespeicherter Stand
meter.import_kwh_totalGespeicherter Zählerstand
meter.observed_atZeitstempel der Speicherung
meter.is_baselinetrue beim Startwert (erster Ping / nach Reset)
meter.delta_kwhVerbrauch seit letztem Ping (fehlt beim Startwert)
quota_classtelemetry

Live-Leiste (Portal / Sparvo)

GET /plant-outlook/live-telem bzw. GET /api/live-telem liefern u. a.:

FeldBedeutung
day_import_kwhSumme der Meter-Δ heute (intern 0, bis erste positive Δ)
awaiting_first_deltatrue bis zur ersten positiven Δ seit Baseline/Reset — UI zeigt dann warte auf Zählerdaten, nicht den Zählerstand
awaiting_baselinetrue, wenn noch kein Zählerstand gespeichert (wartet auf Ping nach Reset)
meter_total_kwhLetzter kumulativer Stand (auch während awaiting_first_delta)
meter_since_dateLokales ISO-Datum der aktuellen Baseline-Serie (YYYY-MM-DD); nach Portal-Reset Fallback cleared_at bis zum nächsten Ping — UI „Zählerstand seit …“

Voraussetzungen

  • Community-Key (oder höher)
  • Anlagenprofil im Portal (Standort)

Loxone / Miniserver

Laut Loxone-Doku ersetzt der Virtuelle Ausgang Befehl nur <v> / <v.1> / <v.2> / <v.3> / <v.t> — das ist der Wert am Input des Befehls, nicht <v.ViName>.

Empfohlen:

1. VO FetchPlantTelemetrySoc — Input = SOC, Body {"battery":{"soc_pct":<v.2>}} 2. VO FetchPlantTelemetryMeter — Input = Zähler, Body {"meter":{"import_kwh_total":<v.2>}} 3. Optional VO FetchPlantGridChargeAllow — Input = Schalter 0/1, Body {"grid_charge_allowed":<v.0>} (nur bei Änderung senden) 4. Soc+Meter-Trigger von FetchPlantHours O4; Antwort nach /user/common/spotprice_telemetry.json 5. Header: X-API-Key + Content-Type: application/json

Die API akzeptiert Partial-POSTs (nur SOC, nur Meter, nur grid_charge_allowed, oder Kombinationen). FetchPlantHours v1.9 — O4 → Analogspeicher → VO <v.2>: Nur Telemetrie. Netzladung lesen: Extract O10 nach Decide — Loxone Hours.

Nächste Schritte

Mit SpotpriceAPI starten

Community registrieren oder Code-Beispiele mit Ihrem persönlichen Key.

Live API-Status