---
title: "SpotLogic – battery optimisation over the spot market (HTTP API)"
description: "SpotLogic felhő API HTTPS-en: olvassa a spot áras akkumulátorparancsot, a cél töltöttséget és a terv korát; feltölti a telemetriát. Előrejelzés kell."
url: "https://taphome.com/hu/compatibility/spotlogic-energy-optimizer-http/"
language: hu
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","cloud-api","data-service","energy-management","battery-storage","spot-prices","photovoltaic"]
  questions: ["Hogyan integrálható a SpotLogic a TapHome-mal?","Mit olvas és mit tölt fel a SpotLogic TapHome sablon?","Hogyan csatlakoztatható a TapHome a SpotLogic API-hoz HTTPS-en?","Honnan kapom meg a SpotLogic PLC ID-t és a hozzáférési tokent?","Miért marad a SpotLogic parancs No plan értéken?","Miért utasítja el a SpotLogic a telemetriát HTTP 422-vel?","Milyen előrejelzési és ár-idősorokra van szüksége a SpotLogicnak a TapHome-tól?","Közvetlenül vezérli a SpotLogic sablon a napelem invertert?"]
---

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

Kommunikáció: Packet Parser → HTTP

## Integrációs útmutató

A SpotLogic felhőszolgáltatás, amely a spot villamosenergia-piac alapján kiszámítja egy napelemes akkumulátor töltési és kisütési tervét. Számítási szolgáltatás, nem adatforrás: a vezérlőegység elküldi az akkumulátor telemetriáját a napenergia-hozam előrejelzéssel, a ház fogyasztásának előrejelzésével, valamint a vételi és visszatáplálási árakkal együtt, a SpotLogic pedig az aktuális időszeletre vonatkozó paranccsal válaszol. Ez a sablon egy Packet Parser HTTP modullal köti össze a TapHome-ot a SpotLogic API-val HTTPS-en keresztül (`spotlogic.cz`, 443-as port). A parancsot **olvassa**, a telemetriát **feltölti**; a napelem invertert nem vezérli — a parancsot a telepítő saját smart rule-jai kötik össze a napelem inverterrel.

Nincs mit bekötni. A szolgáltatás beállítása annyit jelent, hogy aktiválod a SpotLogicot a helyszínre, összegyűjtöd az akkumulátor és a hálózati csatlakozás paramétereit, kimenő internet-hozzáférést adsz a vezérlőegységnek, és előkészíted az előrejelzési és ár-idősorokat.

> [!WARNING]
> A SpotLogicnak minden telemetria-feltöltésben szüksége van az előrejelzési és ár-idősorokra (napenergia-hozam és a ház fogyasztása mára és holnapra, vételi és visszatáplálási árak). Ez a sablon önmagában nem tudja kitölteni őket — lásd [Előrejelzési és ár-idősorok](https://taphome.com/hu/compatibility/spotlogic-energy-optimizer-http/#előrejelzési-és-ár-idősorok). Amíg nincsenek kitöltve, a SpotLogic HTTP 422-vel elutasítja a telemetriát, nem számít tervet, és a parancs **No plan** értéken marad.

## Konfiguráció

### 1. A SpotLogic aktiválása és a hozzáférési adatok megőrzése

Az eszköz aktiválásakor a SpotLogic e-mailben küldi el a **PLC ID**-t és a **hozzáférési tokent** (access token). A token titkos, pontosan egy PLC ID-hoz kötött, és az előfizetési időszakra érvényes. Mindkettő kizárólag az egyes kérések lekérdezési karakterláncában (query string) utazik (`?plc_id=…&token=…`), ahogy a SpotLogic szerződése előírja — soha nem a kérés törzsében.

> [!WARNING]
> Ne tedd a tokent megosztott dokumentumokba és nyilvános repozitóriumokba. A hibás PLC ID–token pár, az érvénytelen token és a lejárt előfizetés egyaránt HTTP 401-gyel végződik, és a SpotLogic szándékosan nem árulja el, hogy a három közül melyikről van szó.

### 2. Az akkumulátor és a hálózati csatlakozás paramétereinek összegyűjtése

A SpotLogic csak azokkal a számokkal tervez, amelyeket a telemetriában megkap. Az importálás előtt keresd ki őket a napelem inverter és az akkumulátor dokumentációjából, valamint a hálózati csatlakozási szerződésből:

| Érték | Honnan származik | Mértékegység |
|---|---|---|
| Akkumulátor-kapacitás | az akkumulátor adatlapja; 0-nál nagyobbnak kell lennie | kWh |
| Az akkumulátor maximális teljesítménye | egyetlen érték a töltésre és a kisütésre | kW |
| Maximális vételi teljesítmény a hálózatból | a főbiztosíték mérete; `0` azt jelenti, hogy a helyszín soha nem vételez a hálózatból | kW |
| Maximális visszatáplálási teljesítmény a hálózatba | a hálózati csatlakozás visszatáplálási korlátja; `0` azt jelenti, hogy a helyszín soha nem táplál vissza | kW |
| Az akkumulátor abszolút alsó határa | a napelem inverter gyártója által megengedett legalacsonyabb töltöttségi szint, alapértelmezés 10 | % |
| Akkumulátor-tartalék | tartalék, amelyből a terv soha nem ad el a hálózatba (például az előre nem látható fogyasztásra), alapértelmezés 10 | % |

Az akkumulátor **aktuális töltöttségi szintjének** is elérhetőnek kell lennie a TapHome-ban, jellemzően a napelem inverter saját integrációjából, hogy egy smart rule beírhassa ebbe a sablonba (lásd lent a Telemetria feltöltése részt).

### 3. A vezérlőegység hálózata és órája

- A vezérlőegységnek kimenő internet-hozzáférésre van szüksége HTTPS-en a `spotlogic.cz` címre, a 443-as porton. A SpotLogic nem kapcsolódik vissza a vezérlőegységhez — az előrejelzési és ár-idősorok a telemetria-feltöltés törzsében utaznak, így egyetlen bejövő portot sem kell megnyitni.
- A telemetria a vezérlőegység órája szerinti küldési időt tartalmazza, és a SpotLogic ebből építi fel a terv időablakát. Néhány perc eltérés ártalmatlan; több órás eltérés az egész tervet rossz időszeletekre tolja. Tartsd pontosan a vezérlőegység óráját.
- Az időzóna (IANA-név, például `Europe/Prague`) határozza meg, hol ér véget a „ma” és hol kezdődik a „holnap”. Add meg a helyszín időzónáját.

### 4. Importálási paraméterek

A sablont a TapHome alkalmazás Packet Parser interfészébe kell importálni, és importáláskor a következő paramétereket kell kitölteni:

| Paraméter | Jelentés | Mértékegység |
|---|---|---|
| PLC ID, access token | az aktiváló e-mailből | — |
| Time zone | IANA-név, alapértelmezés `Europe/Prague`; ebből adódnak a terv napjainak határai | — |
| Battery capacity | 0-nál nagyobbnak kell lennie | kWh |
| Battery max power | egyetlen érték a töltésre és a kisütésre | kW |
| Max grid import / export power | `0` azt jelenti, hogy a helyszín soha nem vételez / soha nem táplál vissza | kW |
| Max state of charge | csak a SpotLogic rögzíti, a jelenlegi tervező nem érvényesíti | % |
| Hard battery floor | a napelem inverter gyártójától származó alsó határ, alapértelmezés 10 | % |

A számokat tizedesponttal írd (a vessző átalakításra kerül). A PLC ID és a token a `PlcId` és `Token` modulváltozókban tárolódik. Minden érték utólag is szerkeszthető marad modulváltozóként.

### 5. A hozzáférési adatok ellenőrzése

A SpotLogic interaktív API-dokumentációjában (a `spotlogic.cz` oldalon, a `/docs` alatt) található egy **Authorize** párbeszédablak a PLC ID-hoz és a tokenhez, a benne lévő TapHome-telemetria példa pedig teljes: érvényes hozzáférési adatokkal a SpotLogic HTTP 202-vel elfogadja. Előtte frissítsd a küldési idejét (`TimeStampUnix`) az aktuális időre. Az elfogadott példaadatokat a SpotLogic a valódi telemetriához hasonlóan eltárolja a tervhez, ezért ez az ellenőrzés még azelőtt esedékes, hogy a parancsot összekötnéd a napelem inverterrel.

> [!TIP]
> A hiányos előrejelzési horizontról szóló HTTP 422-es válasz is bizonyítja, hogy a PLC ID és a token helyes — hibás token esetén HTTP 401 érkezik.

## Eszközfunkciók

### A parancs olvasása (20 másodpercenként)

A modul 20 másodpercenként lekérdezi a `GET /api/v1/dispatch` végpontot, és az eszközök feldolgozzák a választ:

- **SpotLogic command** — a folyamatban lévő időszelet parancsa (`action_id`):

| Érték | TapHome-érték | SpotLogic-név | Jelentés |
|---|---|---|---|
| 0 | No plan | `no_plan` | Nincs használható terv — tartsd a napelem invertert a saját biztonságos üzemmódjában |
| 1 | Self-use | `self_use` | Saját fogyasztás: töltés a napelemes többletből, kisütés a ház ellátására |
| 2 | Force charge | `force_charge` | Az akkumulátor töltése maximális teljesítménnyel |
| 3 | Force discharge to grid | `force_discharge` | Az akkumulátor kisütése a hálózatba maximális teljesítménnyel |
| 4 | Self-use, no discharging | `self_use_ChargeOnly` | Saját fogyasztás, a töltés engedélyezett, a kisütés tiltott |
| 5 | Self-use, no charging | `self_use_DischargeOnly` | Saját fogyasztás, a kisütés engedélyezett, a töltés tiltott |
| 6 | Stop PV (reserved) | `stopPV` | Fenntartva — a jelenlegi tervező nem adja ki |
| 7 | Grid charge without PV (reserved) | `ChargeMaxNoPV` | Fenntartva — a jelenlegi tervező nem adja ki |

  A szervizattribútumok a parancs nevét és a parancs végének időpontját mutatják (helyi idő szerint).
- **SpotLogic target state of charge** — az a töltöttségi szint (%), amelyet a terv az időszelet végére vár. Állítsd le a kényszerített töltést vagy kisütést, amikor az akkumulátor eléri; saját fogyasztásnál ne tölts fölé. A SpotLogic hozzáteszi, hogy `self_use_DischargeOnly` esetén az akkumulátort nem szabad ez alá kisütni. Az érték a terv eredménye, nem kikényszerítendő alapjel, és átmenetileg alacsonyabb is lehet az akkumulátor-tartaléknál, miután a ház elfogyasztotta a tartalékot.
- **SpotLogic next command** — a következő időszelet parancsa, a kezdési időpontjával szervizattribútumként.
- **SpotLogic plan age** — a kiszolgált terv kora másodpercben. Egy tartalék smart rule-t vezérelhet: ha jóval az újraszámítási intervallum fölé nő, a tervet nem számítják újra.

A HTTP 404 `no_plan` válasz **nem hiba**: a parancs 0, és az eszköz tájékoztató üzenetet jelenít meg. A SpotLogic ilyenkor azt kéri, hogy válts a napelem inverter saját biztonságos üzemmódjára, és soha ne ismételd meg emlékezetből az utolsó ismert parancsot. A HTTP 401 (hibás PLC ID vagy token, lejárt előfizetés) hibát állít be az eszközökön és a modulon; a SpotLogic azt kéri, hogy az ilyen hívásokat ne ismételd, ezért javítsd ki a hozzáférési adatokat.

### Telemetria feltöltése (kb. 2 percenként)

A modul legfeljebb 2 percenként elküldi a `POST /api/v1/optimize` kérést `PLCtype: "taphome"` értékkel. Elküldi a küldési időt, az időzónát, az akkumulátor és a hálózati csatlakozás paramétereit, valamint két értéket eszközökből:

- **Battery state of charge (input)** — egy smart rule-lal írd be a napelem inverterből az aktuális töltöttségi szintet 0–100 % tartományban (ha a napelem inverter sablonja 0–1 értéket ad, szorozd meg 100-zal). Egész százalékra kerekítődik, mert a SpotLogic elutasítja a törtértékeket. Amíg nincs értéke, semmi sem kerül elküldésre, és a modul figyelmeztetést jelenít meg.
- **Battery reserve for SpotLogic** — a `SOCmin` tartalék, alapértelmezés 10 %: az a szint, amelyből a terv soha nem ad el a hálózatba.

A modul szervizattribútumai mutatják az utolsó feltöltés eredményét, a SpotLogic által jelzett újraszámítási intervallumot (alapértelmezés 900 s), a terv kiszámításának időpontját, a tervfuttatást és az API verzióját. Az elutasított feltöltés (HTTP 422) modulhiba, a SpotLogic által visszaadott üzenettel. A feltöltésre adott válasz soha nem tartalmazza a tervet — a SpotLogic a háttérben számítja ki, és a modul a parancs következő olvasásakor veszi át.

### Előrejelzési és ár-idősorok

A SpotLogic hat idősort vár a törzsben, mindegyiket `[unix_ts, value]` párok formájában:

| Modulváltozó | Tartalom | Szerződés |
|---|---|---|
| `PvForecastTod`, `PvForecastTom` | napenergia-hozam ma / holnap, kWh óránként | óránként, hézagok nélkül, az aktuális órától holnap végéig |
| `LoadForecastTod`, `LoadForecastTom` | a ház fogyasztása ma / holnap, kWh óránként | ugyanaz |
| `PriceImp`, `PriceExp` | vételi / visszatáplálási ár, CZK/kWh | állandó lépésköz (óránként vagy 15 percenként), elég a mai nap, negatív árak megengedettek |

A változók JSON-szövegként tárolják az idősorokat, például `[[1788645600,0.0],[1788649200,0.42]]`, és változatlanul kerülnek a törzsbe; az alapértelmezett `[]` üres idősor. Maga az integráció működik; amire szüksége van, az az adat. A TapHome egyelőre nem tud egy JSON-szöveget megosztani a szkriptek között, és a smart rule szkriptje nem tud HTTP-kéréseket küldeni. A hat idősort — összesen körülbelül 500 értéket — ezért más szkriptekből (például előrejelző vagy spot áras sablonból) kell összegyűjteni, és több száz segédeszközön keresztül átadni ennek a modulnak, vagy magában a modul olvasó szkriptjében kell felépíteni. Az integráció akkor válik igazán praktikussá, amikor a TapHome bevezeti a szkriptek között megosztott szöveges változót — lásd az ötletet: [Szöveges változó és HTTP a smart rule-ok szkriptjeiből](https://taphome.com/hu/ideas/script-data-http/). Addig töltsd ki a hat változót, és a sablon változtatás nélkül működik. A szkript ezt megjegyzésben elmagyarázza a tetején és azon a helyen, ahol az idősorok beillesztésre kerülnek.

Hogy az adatok honnan származnak, az a telepítőn múlik; a SpotLogic ezeket a jellemző forrásokat nevezi meg:

- **Napenergia-hozam** — napenergia-hozam előrejelző szolgáltatás, amely megkapja a helyszínt, a panelek tájolását és dőlésszögét, valamint a beépített teljesítményt, vagy a napelem inverter gyártójának felhője.
- **A ház fogyasztása** — a helyszín saját előzményei: kezdésnek elegendő az órás fogyasztás, átlagolva a nap órája és a nap típusa (munkanap, hétvége, ünnepnap) szerint.
- **Árak** — a spot ár, átszámítva az ellátási szerződés szerint (vétel, például spot ár plusz árrés) és a többletenergia eladására szóló szerződés szerint (visszatáplálás).

Az óraátállítás napja 23 vagy 25 órás, így egy teljes napenergia-hozam- vagy fogyasztási idősor 47, 48 vagy 49 értéket tartalmaz. Az aktuális óra előtti egy óránál régebbi mintákat a SpotLogic levágja, ahogy a holnap végén túli mintákat is; a holnap vége előtt végződő idősort elutasítja.

## Hibaelhárítás

| Tünet | Ok és megoldás |
|---|---|
| A parancs **No plan** értéken marad | Még nem készült terv, vagy a telemetriát a SpotLogic elutasítja. Ellenőrizd a modul hibáját és a Last telemetry upload szervizattribútumot. A 60 percnél régebbi tervet sem szolgálja ki. Az első elfogadott feltöltés után a terv elkészülése eltarthat egy ideig — legalább egy újraszámítási intervallumig. |
| HTTP 422 modulhiba | A telemetria megsérti a SpotLogic adatszerződését; az üzenet megmondja, melyik részét. Leggyakrabban hiányoznak az előrejelzési vagy ár-idősorok, vagy nem fedik le az időszakot holnap végéig. |
| HTTP 401 hiba | A PLC ID és a token nem egyezik, vagy lejárt az előfizetés. Javítsd a `PlcId` és `Token` modulváltozókat. |
| „Telemetry not sent” figyelmeztetés | A töltöttségi szint még nincs beírva, vagy az akkumulátor vagy a hálózati csatlakozás valamelyik paramétere üres. |
| A terv kora folyamatosan nő | Az új telemetria nem jut el a SpotLogichoz, vagy a SpotLogic adatforrásai hibáznak; az utolsó érvényes terv addig marad érvényben, amíg el nem éri a 60 perces kort. |
| HTTP 500 vagy 502 hiba | Szerverhiba vagy hibás adatforrás a SpotLogic oldalán; az utolsó érvényes terv érvényben marad. A SpotLogic mindkét kérés növekvő késleltetésű ismétlését javasolja; a modul egyszerűen megismétli mindkét kérést a következő lekérdezéskor. |
| A terv rossz órákat vezérel | Hibás a vezérlőegység órája vagy az időzóna — a terv időablaka a küldési időből és a megadott időzónából épül fel. |

## Elérhető eszközök 6

Ezek az eszközök az importálás után jelennek meg a TapHome-ban.

SpotLogic Modul

Szerviz attribútumok

|                         |
|-------------------------|
| Last telemetry upload   |
| Plan recompute interval |
| Plan computed at        |
| Plan run                |
| API version             |

Egyéni változók

|                                  |
|----------------------------------|
| `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)     |

Olvasás (modul)

```taphome
# =============================================================================
#  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
```

Szerviz attribútumok

Last telemetry upload

```taphome
IF(OptimizeCode = 0, "not sent yet", IF(OptimizeCode < 0, "waiting for inputs", "HTTP " + OptimizeCode + " at " + OptimizeAt))
```

Plan recompute interval

```taphome
VAR v := PARSEJSON(OptimizeJson, "$.data.recompute_interval_sec", true);
IF ISNULL(v)
    RETURN("-");
END
RETURN(TOSTRING(v, "F0") + " s");
```

Plan computed at

```taphome
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

```taphome
VAR v := PARSEJSON(DispatchJson, "$.meta.run_id", true);
RETURN(IF(ISNULL(v), "-", v));
```

API version

```taphome
VAR v := PARSEJSON(DispatchJson, "$.meta.version.api", true);
RETURN(IF(ISNULL(v), "-", v));
```

SpotLogic command Többértékű kapcsoló

Értékek / Állapotok: 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)

Kapcsoló állapot olvasása

```taphome
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);
```

Szerviz attribútumok

Command name

```taphome
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

```taphome
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 Változó

Olvasás

```taphome
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 Többértékű kapcsoló

Értékek / Állapotok: 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)

Kapcsoló állapot olvasása

```taphome
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);
```

Szerviz attribútumok

Next command name

```taphome
VAR v := PARSEJSON(DispatchJson, "$.data.context.next_action_name", true);
RETURN(IF(ISNULL(v), "-", v));
```

Next command starts

```taphome
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 Változó

Olvasás

```taphome
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) Változó

Olvasás

```taphome
IF(SocNow < 0, NaN, SocNow)
```

Írás

```taphome
SocNow := Va;
```

Battery reserve for SpotLogic Változó

Olvasás

```taphome
RETURN(SocMin);
```

Írás

```taphome
SocMin := Va;
```

**Kapcsolat:** Packet Parser → HTTP

## Importálási paraméterek

Ezeket az értékeket az XML importálásakor adja meg.

| Az alkalmazás kéri                                          | Alapérték              |
|-------------------------------------------------------------|------------------------|
| SpotLogic PLC ID (from the activation e-mail)               | Importáláskor adja meg |
| SpotLogic access token (from the activation e-mail, secret) | Importáláskor adja meg |
| Time zone (IANA name)                                       | `Europe/Prague`        |
| Battery capacity \[kWh]                                     | Importáláskor adja meg |
| Battery max charge and discharge power \[kW]                | Importáláskor adja meg |
| Max grid import power \[kW] (0 = never import)              | Importáláskor adja meg |
| Max grid export power \[kW] (0 = never export)              | Importáláskor adja meg |
| Max state of charge \[%] (recorded only)                    | `100`                  |
| Hard battery floor from the inverter manufacturer \[%]      | `10`                   |

## Kapcsolódó dokumentáció

- [Packet Parser integráció](https://taphome.com/hu/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/hu/docs/integration/packet-parser/)
- [Packet parser függvények](https://taphome.com/hu/docs/script/packet-parser/)
- [Elemző függvények](https://taphome.com/hu/docs/script/parsing-functions/)

