TapHome
Community Beta · nicht verifiziert Energie & Messung

SpotLogic – battery optimisation over the spot market (HTTP API)

SpotLogic ist ein Cloud-Dienst, der plant, wann eine PV-Batterie lädt, das Haus versorgt oder ins Netz verkauft – nach Spotpreisen. Die Vorlage liest über HTTPS den Befehl für das aktuelle Zeitfenster (0–7), den Ziel-Ladezustand, den nächsten Befehl und das Planalter und sendet alle 2 Minuten Batterietelemetrie. PV-, Verbrauchs- und Preisreihen liefert der Installateur; den Wechselrichter steuern eigene smart rules.

SpotLogicPacket Parser → HTTP6 GeräteRevision 1.1 Zuletzt aktualisiert: 10. November 2026

Eingereicht von Adam Pelikán

Import in die TapHome AppHardware › Packet Parser › Aus Vorlage hinzufügen

Vorlage herunterladen
Auf dieser Seite

Integrationsanleitung

SpotLogic ist ein Cloud-Dienst, der für eine Photovoltaik-Batterie einen Lade- und Entladeplan nach den Preisen des Strom-Spotmarkts berechnet. Er ist ein Rechendienst, keine Datenquelle: Die Steuereinheit sendet die Batterietelemetrie zusammen mit der Prognose der PV-Erzeugung, der Prognose des Hausverbrauchs sowie den Bezugs- und Einspeisepreisen, und SpotLogic antwortet mit dem Befehl für das aktuelle Zeitfenster. Diese Vorlage verbindet TapHome über HTTPS (spotlogic.cz, Port 443) mittels eines Packet-Parser-HTTP-Moduls mit der SpotLogic API. Sie liest den Befehl und sendet die Telemetrie; den Wechselrichter steuert sie nicht — der Befehl wird mit eigenen smart rules des Installateurs an den Wechselrichter angebunden.

Es ist nichts zu verdrahten. Zur Inbetriebnahme gehören die Aktivierung von SpotLogic für den Standort, das Zusammentragen der Batterie- und Netzparameter, ein ausgehender Internetzugang der Steuereinheit und die Vorbereitung der Prognose- und Preisreihen.

SpotLogic benötigt in jedem Telemetrie-Upload Prognose- und Preisreihen (PV-Erzeugung und Hausverbrauch für heute und morgen, Bezugs- und Einspeisepreise). Diese Vorlage kann sie nicht selbst befüllen — siehe Prognosereihen und Preisreihen. Solange sie leer sind, lehnt SpotLogic die Telemetrie mit HTTP 422 ab, berechnet keinen Plan, und der Befehl bleibt auf No plan.

Konfiguration

1. SpotLogic aktivieren und Zugangsdaten aufbewahren

SpotLogic sendet die PLC ID und den Zugriffstoken bei der Aktivierung des Geräts per E-Mail. Der Token ist geheim, an genau eine PLC ID gebunden und für die Dauer des Abonnements gültig. Beide werden, wie es der SpotLogic-Vertrag verlangt, nur im Query-String jeder Anfrage übertragen (?plc_id=…&token=…) — nie im Anfragekörper.

Halten Sie den Token aus gemeinsam genutzten Dokumenten und öffentlichen Repositorys heraus. Ein falsches Paar aus PLC ID und Token, ein ungültiger Token oder ein abgelaufenes Abonnement enden alle mit HTTP 401, und SpotLogic sagt bewusst nicht, welcher der drei Fälle vorliegt.

2. Batterie- und Netzparameter zusammentragen

SpotLogic plant nur mit den Zahlen, die es in der Telemetrie erhält. Schlagen Sie diese vor dem Import in der Dokumentation des Wechselrichters und der Batterie sowie im Netzanschlussvertrag nach:

WertHerkunftEinheit
BatteriekapazitätDatenblatt der Batterie; muss größer als 0 seinkWh
Maximale Batterieleistungein Wert für Laden und EntladenkW
Maximale NetzbezugsleistungGröße der Hauptsicherung; 0 bedeutet, dass der Standort nie Strom beziehtkW
Maximale EinspeiseleistungEinspeisegrenze des Netzanschlusses; 0 bedeutet, dass der Standort nie einspeistkW
Harte Untergrenze der Batterieniedrigster vom Wechselrichterhersteller zugelassener Ladezustand, Standard 10%
BatteriereserveReserve, aus der der Plan nie ins Netz verkauft (zum Beispiel für unvorhersehbaren Verbrauch), Standard 10%

Auch der aktuelle Ladezustand der Batterie muss in TapHome verfügbar sein, typischerweise aus der eigenen Integration des Wechselrichters, damit eine smart rule ihn in diese Vorlage schreiben kann (siehe Senden der Telemetrie unten).

3. Netzwerk und Uhr der Steuereinheit

  • Die Steuereinheit benötigt ausgehenden Internetzugang über HTTPS zu spotlogic.cz auf Port 443. SpotLogic baut keine Verbindung zurück zur Steuereinheit auf — die Prognose- und Preisreihen werden im Körper des Telemetrie-Uploads übertragen, daher muss kein eingehender Port geöffnet werden.
  • Die Telemetrie enthält den Sendezeitpunkt aus der Uhr der Steuereinheit, und SpotLogic bildet daraus das Planfenster. Einige Minuten Abweichung sind unschädlich; Stunden Abweichung verschieben den ganzen Plan in die falschen Zeitfenster. Halten Sie die Uhr der Steuereinheit korrekt.
  • Die Zeitzone (IANA-Name, zum Beispiel Europe/Prague) bestimmt, wo „heute“ endet und „morgen“ beginnt. Geben Sie die Zeitzone des Standorts ein.

4. Importparameter

Die Vorlage wird in der Packet-Parser-Schnittstelle der TapHome App importiert, und beim Import werden die folgenden Parameter ausgefüllt:

ParameterBedeutungEinheit
PLC ID, Zugriffstokenaus der Aktivierungs-E-Mail—
ZeitzoneIANA-Name, Standard Europe/Prague; daraus ergeben sich die Tagesgrenzen des Plans—
Batteriekapazitätmuss größer als 0 seinkWh
Maximale Batterieleistungein Wert für Laden und EntladenkW
Maximale Netzbezugs- / Einspeiseleistung0 bedeutet, dass der Standort nie Strom bezieht / nie einspeistkW
Maximaler Ladezustandwird von SpotLogic nur erfasst, der aktuelle Planer setzt ihn nicht durch%
Harte Untergrenze der BatterieUntergrenze vom Wechselrichterhersteller, Standard 10%

Zahlen werden mit Dezimalpunkt geschrieben (ein Komma wird umgewandelt). Die PLC ID und der Token werden in den Modulvariablen PlcId und Token gespeichert. Alle Werte lassen sich danach als Modulvariablen weiter bearbeiten.

5. Zugangsdaten prüfen

Die interaktive API-Dokumentation von SpotLogic (auf spotlogic.cz unter /docs) hat einen Authorize-Dialog für die PLC ID und den Token, und ihr TapHome-Telemetriebeispiel ist vollständig: Mit gültigen Zugangsdaten nimmt SpotLogic es mit HTTP 202 an. Aktualisieren Sie zuvor seinen Sendezeitpunkt (TimeStampUnix) auf die aktuelle Zeit. Angenommene Beispieldaten werden wie echte Telemetrie für einen Plan gepuffert, daher gehört diese Prüfung vor die Anbindung des Befehls an den Wechselrichter.

Auch eine Antwort HTTP 422 über einen unvollständigen Prognosehorizont beweist, dass PLC ID und Token korrekt sind — ein falscher Token ergibt HTTP 401.

Funktionen des Geräts

Lesen des Befehls (alle 20 s)

Das Modul fragt GET /api/v1/dispatch alle 20 Sekunden ab, und die Geräte werten die Antwort aus:

  • SpotLogic command — Befehl für das laufende Zeitfenster (action_id):
WertWert in TapHomeName bei SpotLogicBedeutung
0No planno_planKein verwendbarer Plan — den Wechselrichter in seinem eigenen sicheren Modus belassen
1Self-useself_useEigenverbrauch: aus PV-Überschuss laden, zur Deckung des Hausverbrauchs entladen
2Force chargeforce_chargeBatterie mit maximaler Leistung laden
3Force discharge to gridforce_dischargeBatterie mit maximaler Leistung ins Netz entladen
4Self-use, no dischargingself_use_ChargeOnlyEigenverbrauch, Laden erlaubt, Entladen verboten
5Self-use, no chargingself_use_DischargeOnlyEigenverbrauch, Entladen erlaubt, Laden verboten
6Stop PV (reserved)stopPVReserviert — wird vom aktuellen Planer nicht ausgegeben
7Grid charge without PV (reserved)ChargeMaxNoPVReserviert — wird vom aktuellen Planer nicht ausgegeben

Die Service-Attribute zeigen den Namen des Befehls und das Ende des Befehls (Ortszeit).

  • SpotLogic target state of charge — Ladezustand (%), den der Plan am Ende des Zeitfensters erwartet. Beenden Sie erzwungenes Laden oder Entladen, wenn die Batterie ihn erreicht; im Eigenverbrauch nicht über ihn hinaus laden. SpotLogic ergänzt, dass die Batterie bei self_use_DischargeOnly nicht unter ihn entladen werden soll. Der Wert ist ein Ergebnis des Plans, kein Sollwert, der erzwungen werden muss, und er kann vorübergehend unter der Batteriereserve liegen, nachdem das Haus die Reserve verbraucht hat.
  • SpotLogic next command — der Befehl des folgenden Zeitfensters, mit seiner Startzeit als Service-Attribut.
  • SpotLogic plan age — Alter des ausgelieferten Plans in Sekunden. Es kann eine smart rule für den Rückfallbetrieb steuern: Steigt es deutlich über das Neuberechnungsintervall, wird der Plan nicht mehr neu berechnet.

Die Antwort HTTP 404 no_plan ist kein Fehler: Der Befehl ist 0, und das Gerät zeigt eine Informationsmeldung. SpotLogic bittet, in diesem Zustand in den eigenen sicheren Modus des Wechselrichters zu wechseln und nie den letzten bekannten Befehl aus dem Speicher zu wiederholen. HTTP 401 (falsche PLC ID oder falscher Token, abgelaufenes Abonnement) setzt einen Fehler bei den Geräten und beim Modul; SpotLogic bittet, solche Aufrufe nicht zu wiederholen, korrigieren Sie also die Zugangsdaten.

Senden der Telemetrie (etwa alle 2 Minuten)

Das Modul sendet POST /api/v1/optimize mit PLCtype: "taphome" höchstens alle 2 Minuten. Es sendet den Sendezeitpunkt, die Zeitzone, die Batterie- und Netzparameter und zwei Werte aus Geräten:

  • Battery state of charge (input) — schreiben Sie mit einer smart rule den aktuellen Ladezustand 0–100 % vom Wechselrichter hinein (liefert die Wechselrichter-Vorlage 0–1, mit 100 multiplizieren). Er wird auf ganze Prozent gerundet, da SpotLogic Nachkommawerte ablehnt. Solange er keinen Wert hat, wird nichts gesendet, und das Modul zeigt eine Warnung.
  • Battery reserve for SpotLogic — die Reserve SOCmin, Standard 10 %: der Füllstand, aus dem der Plan nie ins Netz verkauft.

Die Service-Attribute des Moduls zeigen das Ergebnis des letzten Uploads, das von SpotLogic gemeldete Neuberechnungsintervall (Standard 900 s), den Zeitpunkt der Planberechnung, den Planlauf und die API-Version. Ein abgelehnter Upload (HTTP 422) ist ein Modulfehler mit der Meldung, die SpotLogic zurückgegeben hat. Die Antwort auf den Upload enthält nie den Plan — SpotLogic berechnet ihn im Hintergrund, und das Modul holt ihn mit dem nächsten Lesen des Befehls ab.

Prognosereihen und Preisreihen

SpotLogic erwartet im Körper sechs Reihen, jede als Paare [unix_ts, value]:

ModulvariableInhaltVertrag
PvForecastTod, PvForecastTomPV-Erzeugung heute / morgen, kWh pro Stundestündlich, lückenlos, von der aktuellen Stunde bis zum Ende von morgen
LoadForecastTod, LoadForecastTomHausverbrauch heute / morgen, kWh pro Stundeebenso
PriceImp, PriceExpBezugs- / Einspeisepreis, CZK/kWhkonstantes Raster (stündlich oder 15 Minuten), heute genügt, negative Preise erlaubt

Die Variablen enthalten die Reihen als JSON-Text, zum Beispiel [[1788645600,0.0],[1788649200,0.42]], und werden unverändert in den Körper eingefügt; der Standardwert [] ist eine leere Reihe. Die Integration selbst funktioniert; was sie braucht, sind die Daten. TapHome kann noch keinen JSON-Text zwischen Skripten teilen, und ein Skript einer smart rule kann keine HTTP-Anfragen senden. Die sechs Reihen — zusammen etwa 500 Werte — müssen daher aus anderen Skripten (zum Beispiel einer Prognose- oder Spotpreis-Vorlage) gesammelt und über Hunderte von Hilfsgeräten an dieses Modul übergeben oder direkt im Leseskript des Moduls gebildet werden. Wirklich praktikabel wird die Integration, sobald TapHome eine zwischen Skripten geteilte Textvariable einführt — siehe die Idee Textvariable und HTTP aus Skripten von smart rules. Bis dahin befüllen Sie die sechs Variablen, und die Vorlage funktioniert so, wie sie ist. Das Skript erklärt dies in einem Kommentar am Anfang und an der Stelle, an der die Reihen eingefügt werden.

Woher die Daten kommen, entscheidet der Installateur; SpotLogic nennt diese typischen Quellen:

  • PV-Erzeugung — ein Dienst für die Solarertragsprognose, der mit Standort, Ausrichtung und Neigung der Module sowie der installierten Leistung gespeist wird, oder die Cloud des Wechselrichterherstellers.
  • Hausverbrauch — die eigene Historie des Standorts: Für den Anfang genügt der stündliche Verbrauch, gemittelt nach Tagesstunde und Tagesart (Werktag, Wochenende, Feiertag).
  • Preise — der Spotpreis, umgerechnet nach dem Stromliefervertrag (Bezug, zum Beispiel Spot plus Aufschlag) und nach dem Vertrag über den Verkauf von Überschussenergie (Einspeisung).

Ein Tag mit Zeitumstellung hat 23 oder 25 Stunden, eine vollständige PV- oder Verbrauchsreihe hat daher 47, 48 oder 49 Werte. Werte, die älter als eine Stunde vor der aktuellen Stunde sind, werden abgeschnitten, ebenso Werte nach dem Ende von morgen; eine Reihe, die vor dem Ende von morgen endet, wird abgelehnt.

Fehlerbehebung

SymptomUrsache und Lösung
Befehl bleibt auf No planEs wurde noch kein Plan berechnet, oder die Telemetrie wird abgelehnt. Prüfen Sie den Modulfehler und das Service-Attribut Last telemetry upload. Ein Plan, der älter als 60 Minuten ist, wird ebenfalls nicht ausgeliefert. Nach dem ersten angenommenen Upload kann der Plan eine Weile dauern — mindestens ein Neuberechnungsintervall.
Modulfehler HTTP 422Die Telemetrie verletzt den Datenvertrag von SpotLogic; die Meldung sagt, welchen Teil. Meist fehlen die Prognose- oder Preisreihen oder decken den Zeitraum bis zum Ende von morgen nicht ab.
Fehler HTTP 401PLC ID und Token passen nicht zusammen, oder das Abonnement ist abgelaufen. Korrigieren Sie die Modulvariablen PlcId und Token.
Warnung „Telemetry not sent“Der Ladezustand wurde noch nicht geschrieben, oder ein Batterie- oder Netzparameter ist leer.
Planalter steigt ständigNeue Telemetrie erreicht SpotLogic nicht, oder seine Datenquellen fallen aus; der letzte gültige Plan bleibt in Kraft, bis er 60 Minuten alt ist.
Fehler HTTP 500 oder 502Serverfehler oder ausgefallene Datenquelle auf der Seite von SpotLogic; der letzte gültige Plan bleibt in Kraft. SpotLogic empfiehlt, beides mit wachsenden Abständen zu wiederholen; das Modul wiederholt beide Anfragen einfach bei der nächsten Abfrage.
Plan steuert die falschen StundenDie Uhr der Steuereinheit oder die Zeitzone ist falsch — das Planfenster wird aus dem Sendezeitpunkt und der angegebenen Zeitzone gebildet.

Verfügbare Geräte 6

Diese Geräte erscheinen nach dem Import in TapHome.

SpotLogic Modul
Serviceattribute
Last telemetry upload
Plan recompute interval
Plan computed at
Plan run
API version
Benutzerdefinierte Variablen
PlcId (string)
Token (string)
TimeZone (string)
BatCapacity (string)
BatPmax (string)
GridImportPmax (string)
GridExportPmax (string)
SocMax (string)
SocHardMin (string)
SocNow (numeric) = -1
SocMin (numeric) = 10
PvForecastTod (string) = []
PvForecastTom (string) = []
LoadForecastTod (string) = []
LoadForecastTom (string) = []
PriceImp (string) = []
PriceExp (string) = []
DispatchJson (string)
DispatchCode (numeric)
OptimizeJson (string)
OptimizeCode (numeric)
OptimizeAt (string)
LastOptimizeUnix (numeric)

SpotLogic

Lesen (Modul)
# =============================================================================
#  STATUS: WORKING, BUT THE DATA MUST BE BROUGHT IN BY HAND
# =============================================================================
#  The integration itself works - dispatch reading, action_id -> inverter mode
#  mapping, next command, plan diagnostics and error reporting are finished.
#  What it needs is the data: six series (PV forecast, load forecast, import and
#  export spot price; ~500 values, hourly or 15-minute, horizon now -> end of
#  tomorrow) as JSON text [[unix_ts, value], ...] in the module variables
#  PvForecastTod ... PriceExp (see below).
#  Until TapHome ships a shared variable between scripts, those series must be
#  collected from other scripts and handed over through hundreds of helper
#  devices - that is why the integration is only really practical once that
#  feature lands.
#  Tracking: https://taphome.com/cs/ideas/script-data-http/  (TapHome idea FR-003)
#  In the meantime: fill the six variables below and the template works as is.
# =============================================================================

# 1) GET /api/v1/dispatch - the command for the slot in progress (module poll ~20 s).
#    plc_id and token travel ONLY in the query string (SpotLogic contract).
VAR r := SENDHTTPREQUEST("/api/v1/dispatch?plc_id=" + PlcId + "&token=" + Token);
DispatchCode := r.StatusCode;
DispatchJson := r.Content;
IF r.StatusCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token; the subscription may have expired. Not retried by SpotLogic rules, fix the credentials.");
ELSEIF r.StatusCode != 200 AND r.StatusCode != 404
    VAR dmsg := PARSEJSON(r.Content, "$.message", true);
    ADDERROR(2, "SpotLogic dispatch failed: HTTP " + r.StatusCode + IF(ISNULL(dmsg), "", " " + dmsg));
END

# 2) POST /api/v1/optimize - telemetry, at most every ~2 min (SpotLogic asks for no more often).
datetime now := NOW();
VAR nowUnix := now.UNIXTIME;
IF nowUnix - LastOptimizeUnix >= 115
    LastOptimizeUnix := nowUnix;
    VAR cap := TODOUBLE(REPLACE(BatCapacity, ",", "."));
    VAR bp := TODOUBLE(REPLACE(BatPmax, ",", "."));
    VAR gi := TODOUBLE(REPLACE(GridImportPmax, ",", "."));
    VAR ge := TODOUBLE(REPLACE(GridExportPmax, ",", "."));
    VAR smax := TODOUBLE(SocMax);
    VAR shard := TODOUBLE(SocHardMin);
    IF SocNow < 0 OR SocNow > 100
        OptimizeCode := -1;
    ELSEIF ISNAN(cap) OR ISNAN(bp) OR ISNAN(gi) OR ISNAN(ge) OR ISNAN(smax) OR ISNAN(shard) OR LENGTH(PlcId) = 0 OR LENGTH(Token) = 0
        OptimizeCode := -2;
    ELSE
        # Forecast and price series: module variables PvForecastTod, PvForecastTom,
        # LoadForecastTod, LoadForecastTom, PriceImp, PriceExp hold JSON text
        # [[unix_ts, value], ...]. The template does NOT fill them - see the banner
        # at the top of this script. Until they are filled, SpotLogic answers 422.
        VAR body := "{\"PLCtype\":\"taphome\"";
        body := body + ",\"TimeZone\":\"" + TimeZone + "\"";
        body := body + ",\"TimeStampUnix\":" + TOSTRING(nowUnix, "F0");
        body := body + ",\"BatCapacity\":" + TOSTRING(cap, "F2");
        body := body + ",\"BatPmax\":" + TOSTRING(bp, "F2");
        body := body + ",\"GridImportPmax\":" + TOSTRING(gi, "F2");
        body := body + ",\"GridExportPmax\":" + TOSTRING(ge, "F2");
        body := body + ",\"SOCnow\":" + TOSTRING(SocNow, "F0");
        body := body + ",\"SOCmin\":" + TOSTRING(SocMin, "F0");
        body := body + ",\"SOCmax\":" + TOSTRING(smax, "F0");
        body := body + ",\"SOChardmin\":" + TOSTRING(shard, "F0");
        body := body + ",\"PvForecastTod\":" + PvForecastTod;
        body := body + ",\"PvForecastTom\":" + PvForecastTom;
        body := body + ",\"LoadForecastTod\":" + LoadForecastTod;
        body := body + ",\"LoadForecastTom\":" + LoadForecastTom;
        body := body + ",\"PriceImp\":" + PriceImp;
        body := body + ",\"PriceExp\":" + PriceExp + "}";
        VAR o := SENDHTTPREQUEST("/api/v1/optimize?plc_id=" + PlcId + "&token=" + Token, "POST", body, "Content-Type: application/json");
        OptimizeCode := o.StatusCode;
        OptimizeJson := o.Content;
        OptimizeAt := TOSTRING(now, "yyyy-MM-dd HH:mm:ss");
    END
END

# The outcome of the last telemetry upload is reported on every run, not only on the upload run.
VAR omsg := "";
IF LENGTH(OptimizeJson) > 0
    omsg := PARSEJSON(OptimizeJson, "$.message", true);
    IF ISNULL(omsg)
        omsg := "";
    END
END
IF OptimizeCode = -1
    ADDWARNING(3, "Telemetry not sent: the device Battery state of charge (input) has no value 0-100 yet - write it from the inverter with a smart rule.");
ELSEIF OptimizeCode = -2
    ADDWARNING(7, "Telemetry not sent: fill the module variables PlcId, Token, BatCapacity, BatPmax, GridImportPmax, GridExportPmax, SocMax and SocHardMin (numbers with a decimal point).");
ELSEIF OptimizeCode = 401
    ADDERROR(4, "SpotLogic rejected the telemetry: PLC ID or token invalid (HTTP 401).");
ELSEIF OptimizeCode = 422
    ADDERROR(5, "SpotLogic rejected the telemetry (HTTP 422): " + omsg + " - the forecast and price series (module variables PvForecastTod ... PriceExp) must be filled, see the template description.");
ELSEIF OptimizeCode != 0 AND OptimizeCode != 202
    ADDERROR(6, "SpotLogic telemetry upload failed: HTTP " + OptimizeCode + " " + omsg);
END
Serviceattribute
Last telemetry upload
IF(OptimizeCode = 0, "not sent yet", IF(OptimizeCode < 0, "waiting for inputs", "HTTP " + OptimizeCode + " at " + OptimizeAt))
Plan recompute interval
VAR v := PARSEJSON(OptimizeJson, "$.data.recompute_interval_sec", true);
IF ISNULL(v)
    RETURN("-");
END
RETURN(TOSTRING(v, "F0") + " s");
Plan computed at
VAR s := PARSEJSON(DispatchJson, "$.meta.plan_created_at", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
Plan run
VAR v := PARSEJSON(DispatchJson, "$.meta.run_id", true);
RETURN(IF(ISNULL(v), "-", v));
API version
VAR v := PARSEJSON(DispatchJson, "$.meta.version.api", true);
RETURN(IF(ISNULL(v), "-", v));
SpotLogic command Mehrwertschalter
Werte / Zustände: No plan · Self-use · Force charge · Force discharge to grid · Self-use, no discharging · Self-use, no charging · Stop PV (reserved) · Grid charge without PV (reserved)

SpotLogic command

Schaltzustand lesen
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode = 404
    ADDINFO(2, "No usable plan yet (no_plan) - keep the inverter in its own safe mode.");
    RETURN(0);
END
IF DispatchCode != 200
    ADDERROR(3, "Command not available: HTTP " + DispatchCode);
    RETURN(NaN);
END
VAR id := PARSEJSON(DispatchJson, "$.data.command.action_id", true);
IF ISNULL(id)
    ADDERROR(4, "Unexpected SpotLogic answer: data.command.action_id is missing.");
    RETURN(NaN);
END
RETURN(id);
Serviceattribute
Command name
VAR v := PARSEJSON(DispatchJson, "$.data.command.action_name", true);
IF ISNULL(v)
    v := PARSEJSON(DispatchJson, "$.data.action_name", true);
END
RETURN(IF(ISNULL(v), "-", v));
Command valid until
VAR s := PARSEJSON(DispatchJson, "$.data.command.valid_until", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
SpotLogic target state of charge Variable

SpotLogic target state of charge

Lesen
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode != 200
    RETURN(NaN);
END
VAR v := PARSEJSON(DispatchJson, "$.data.command.target_soc_percent", true);
IF ISNULL(v)
    RETURN(NaN);
END
RETURN(v);
SpotLogic next command Mehrwertschalter
Werte / Zustände: No plan · Self-use · Force charge · Force discharge to grid · Self-use, no discharging · Self-use, no charging · Stop PV (reserved) · Grid charge without PV (reserved)

SpotLogic next command

Schaltzustand lesen
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode = 404
    RETURN(0);
END
IF DispatchCode != 200
    ADDERROR(3, "Next command not available: HTTP " + DispatchCode);
    RETURN(NaN);
END
VAR id := PARSEJSON(DispatchJson, "$.data.context.next_action_id", true);
IF ISNULL(id)
    RETURN(NaN);
END
RETURN(id);
Serviceattribute
Next command name
VAR v := PARSEJSON(DispatchJson, "$.data.context.next_action_name", true);
RETURN(IF(ISNULL(v), "-", v));
Next command starts
VAR s := PARSEJSON(DispatchJson, "$.data.context.next_action_time", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
SpotLogic plan age Variable

SpotLogic plan age

Lesen
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode != 200
    RETURN(NaN);
END
VAR v := PARSEJSON(DispatchJson, "$.meta.plan_age_sec", true);
IF ISNULL(v)
    RETURN(NaN);
END
RETURN(v);
Battery state of charge (input) Variable

Battery state of charge (input)

Lesen
IF(SocNow < 0, NaN, SocNow)
Schreiben
SocNow := Va;
Battery reserve for SpotLogic Variable

Battery reserve for SpotLogic

Lesen
RETURN(SocMin);
Schreiben
SocMin := Va;
Verbindung: Packet Parser → HTTP

Importparameter

Diese Werte geben Sie beim Import des XML ein.

In der App abgefragtStandard
SpotLogic PLC ID (from the activation e-mail)Beim Import eingeben
SpotLogic access token (from the activation e-mail, secret)Beim Import eingeben
Time zone (IANA name)Europe/Prague
Battery capacity [kWh]Beim Import eingeben
Battery max charge and discharge power [kW]Beim Import eingeben
Max grid import power [kW] (0 = never import)Beim Import eingeben
Max grid export power [kW] (0 = never export)Beim Import eingeben
Max state of charge [%] (recorded only)100
Hard battery floor from the inverter manufacturer [%]10

Haben Sie ein Problem mit dieser Gerätevorlage gefunden?

Sagen Sie uns, was nicht funktioniert, was fehlt oder wie sich die Vorlage verhalten sollte. Ihr Feedback hilft uns, den Katalog genau zu halten.

Vorlage · TapHome-Portal SpotLogic – battery optimisation over the spot market (HTTP API) Öffne diese Vorlage im Kundenportal, um sie auf eine deiner Wohnungen anzuwenden, oder entwirf eine Anpassung und reiche sie an den Katalog ein. Packet Parser → HTTP Im TapHome-Portal ansehen