---
title: "SpotLogic – battery optimisation over the spot market (HTTP API)"
description: "SpotLogic cloud API cez HTTPS: číta povel batérie podľa spotových cien, cieľový stav nabitia a vek plánu; odosiela telemetriu batérie. Treba predikcie."
url: "https://taphome.com/sk/compatibility/spotlogic-energy-optimizer-http/"
language: sk
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","cloud-api","data-service","energy-management","battery-storage","spot-prices","photovoltaic"]
  questions: ["Ako integrovať SpotLogic s TapHome?","Čo šablóna SpotLogic pre TapHome číta a odosiela?","Ako pripojiť TapHome k SpotLogic API cez HTTPS?","Kde získam PLC ID a prístupový token SpotLogic?","Prečo povel SpotLogic ostáva na No plan?","Prečo SpotLogic odmieta telemetriu s HTTP 422?","Ktoré časové rady predikcií a cien potrebuje SpotLogic od TapHome?","Ovláda šablóna SpotLogic solárny invertor priamo?"]
---

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

Komunikácia: Packet Parser → HTTP

## Návod na integráciu

SpotLogic je cloudová služba, ktorá počíta plán nabíjania a vybíjania batérie fotovoltického systému podľa spotového trhu s elektrinou. Je to výpočtová služba, nie zdroj dát: riadiaca jednotka posiela telemetriu batérie spolu s predikciou solárnych ziskov, predikciou spotreby domu a cenami za odber a dodávku elektriny a SpotLogic odpovedá povelom pre aktuálny časový úsek. Táto šablóna pripája TapHome k SpotLogic API cez HTTPS (`spotlogic.cz`, port 443) pomocou modulu Packet Parser HTTP. Povel **číta** a telemetriu **odosiela**; solárny invertor neovláda — povel sa so solárnym invertorom prepojí vlastnými smart rules inštalatéra.

Nič sa nezapája. Sprevádzkovanie služby znamená aktivovať SpotLogic pre danú inštaláciu, zistiť parametre batérie a siete, zabezpečiť riadiacej jednotke odchádzajúci prístup na internet a pripraviť časové rady predikcií a cien.

> [!WARNING]
> SpotLogic potrebuje v každom odoslaní telemetrie časové rady predikcií a cien (predikcia solárnych ziskov a spotreby domu na dnes a zajtra, ceny za odber a dodávku). Táto šablóna ich sama vyplniť nevie — pozrite [Časové rady predikcií a cien](https://taphome.com/sk/compatibility/spotlogic-energy-optimizer-http/#časové-rady-predikcií-a-cien). Kým nie sú vyplnené, SpotLogic telemetriu odmieta s HTTP 422, plán nepočíta a povel ostáva na **No plan**.

## Konfigurácia

### 1. Aktivujte SpotLogic a uschovajte prístupové údaje

SpotLogic pri aktivácii zariadenia pošle e-mailom **PLC ID** a **prístupový token**. Token je tajný, viazaný na práve jedno PLC ID a platný počas obdobia predplatného. Obe hodnoty sa prenášajú len v reťazci dopytu každej požiadavky (`?plc_id=…&token=…`), ako to vyžaduje kontrakt SpotLogic — nikdy v tele požiadavky.

> [!WARNING]
> Token nedávajte do zdieľaných dokumentov ani do verejných repozitárov. Nesprávna dvojica PLC ID a tokenu, neplatný token aj vypršané predplatné končia rovnako s HTTP 401 a SpotLogic zámerne neprezradí, o ktorý z troch prípadov išlo.

### 2. Zistite parametre batérie a siete

SpotLogic plánuje len s číslami, ktoré dostane v telemetrii. Pred importom ich vyhľadajte v dokumentácii solárneho invertora a batérie a v zmluve o pripojení k distribučnej sústave:

| Hodnota | Odkiaľ ju zistiť | Jednotka |
|---|---|---|
| Kapacita batérie | katalógový list batérie; musí byť väčšia ako 0 | kWh |
| Maximálny výkon batérie | jedna hodnota pre nabíjanie aj vybíjanie | kW |
| Maximálny výkon odberu zo siete | veľkosť hlavného ističa; `0` znamená, že inštalácia nikdy neodoberá zo siete | kW |
| Maximálny výkon dodávky do siete | limit dodávky podľa pripojenia k sieti; `0` znamená, že inštalácia nikdy nedodáva do siete | kW |
| Pevné minimum batérie | najnižší stav nabitia povolený výrobcom solárneho invertora, predvolene 10 | % |
| Rezerva batérie | rezerva, z ktorej plán nikdy nepredáva do siete (napríklad pre nepredvídateľnú spotrebu), predvolene 10 | % |

V TapHome musí byť dostupný aj **aktuálny stav nabitia** batérie, zvyčajne z vlastnej integrácie solárneho invertora, aby ho bolo možné cez smart rule zapisovať do tejto šablóny (pozrite nižšie Odosielanie telemetrie).

### 3. Sieť a hodiny riadiacej jednotky

- Riadiaca jednotka potrebuje odchádzajúci prístup na internet cez HTTPS na `spotlogic.cz`, port 443. SpotLogic sa k riadiacej jednotke spätne nepripája — časové rady predikcií a cien putujú v tele odosielanej telemetrie, takže netreba otvárať žiadny prichádzajúci port.
- Telemetria nesie čas odoslania z hodín riadiacej jednotky a SpotLogic z neho zostavuje okno plánu. Odchýlka niekoľkých minút neškodí; odchýlka niekoľkých hodín posunie celý plán do nesprávnych časových úsekov. Udržiavajte hodiny riadiacej jednotky presné.
- Časové pásmo (názov IANA, napríklad `Europe/Prague`) určuje, kde končí „dnes“ a začína „zajtra“. Zadajte časové pásmo miesta inštalácie.

### 4. Parametre importu

Šablóna sa importuje do rozhrania Packet Parser v aplikácii TapHome a pri importe sa vyplnia tieto parametre:

| Parameter | Význam | Jednotka |
|---|---|---|
| PLC ID, access token | z aktivačného e-mailu | — |
| Time zone | názov IANA, predvolene `Europe/Prague`; určuje hranice dní plánu | — |
| Battery capacity | musí byť väčšia ako 0 | kWh |
| Battery max power | jedna hodnota pre nabíjanie aj vybíjanie | kW |
| Max grid import / export power | `0` znamená, že inštalácia nikdy neodoberá / nikdy nedodáva | kW |
| Max state of charge | SpotLogic ho len zaznamenáva, súčasný plánovač ho nevynucuje | % |
| Hard battery floor | minimum od výrobcu solárneho invertora, predvolene 10 | % |

Čísla sa píšu s desatinnou bodkou (čiarka sa prevedie). PLC ID a token sa uložia do premenných modulu `PlcId` a `Token`. Všetky hodnoty sa dajú neskôr upraviť ako premenné modulu.

### 5. Overenie prístupových údajov

Interaktívna dokumentácia API služby SpotLogic (na `spotlogic.cz` pod `/docs`) má dialóg **Authorize** na zadanie PLC ID a tokenu a jej príklad telemetrie pre TapHome je úplný: s platnými prístupovými údajmi ho SpotLogic prijme s HTTP 202. Najprv v ňom aktualizujte čas odoslania (`TimeStampUnix`) na aktuálny čas. Prijaté vzorové dáta sa pre plán ukladajú rovnako ako skutočná telemetria, preto toto overenie patrí pred prepojenie povelu so solárnym invertorom.

> [!TIP]
> Odpoveď HTTP 422 o neúplnom horizonte predikcie tiež dokazuje, že PLC ID a token sú správne — nesprávny token vráti HTTP 401.

## Možnosti zariadenia

### Čítanie povelu (každých 20 s)

Modul každých 20 sekúnd volá `GET /api/v1/dispatch` a zariadenia odpoveď spracujú:

- **SpotLogic command** — povel pre prebiehajúci časový úsek (`action_id`):

| Hodnota | Hodnota v TapHome | Názov v SpotLogic | Význam |
|---|---|---|---|
| 0 | No plan | `no_plan` | Žiadny použiteľný plán — nechajte solárny invertor v jeho vlastnom bezpečnom režime |
| 1 | Self-use | `self_use` | Vlastná spotreba: nabíjanie z prebytku FV, vybíjanie na pokrytie spotreby domu |
| 2 | Force charge | `force_charge` | Nabíjanie batérie maximálnym výkonom |
| 3 | Force discharge to grid | `force_discharge` | Vybíjanie batérie do siete maximálnym výkonom |
| 4 | Self-use, no discharging | `self_use_ChargeOnly` | Vlastná spotreba, nabíjanie povolené, vybíjanie zakázané |
| 5 | Self-use, no charging | `self_use_DischargeOnly` | Vlastná spotreba, vybíjanie povolené, nabíjanie zakázané |
| 6 | Stop PV (reserved) | `stopPV` | Rezervované — súčasný plánovač ho nevydáva |
| 7 | Grid charge without PV (reserved) | `ChargeMaxNoPV` | Rezervované — súčasný plánovač ho nevydáva |

  Servisné atribúty zobrazujú názov povelu a čas, kedy povel končí (miestny čas).
- **SpotLogic target state of charge** — stav nabitia (%), ktorý plán očakáva na konci časového úseku. Keď ho batéria dosiahne, ukončite vynútené nabíjanie alebo vybíjanie; pri vlastnej spotrebe nad neho nenabíjajte. SpotLogic dopĺňa, že pri `self_use_DischargeOnly` sa batéria nemá vybiť pod túto hodnotu. Hodnota je výsledkom plánu, nie žiadaná hodnota, ktorú treba vynútiť, a potom, čo dom spotreboval rezervu, môže byť dočasne nižšia ako rezerva batérie.
- **SpotLogic next command** — povel nasledujúceho časového úseku, čas jeho začiatku je v servisnom atribúte.
- **SpotLogic plan age** — vek poskytnutého plánu v sekundách. Môže spúšťať záložný smart rule: keď výrazne prerastie interval prepočtu, plán sa neprepočítava.

Odpoveď HTTP 404 `no_plan` **nie je chyba**: povel je 0 a zariadenie zobrazí informačnú správu. SpotLogic v tomto stave žiada prepnúť solárny invertor do jeho vlastného bezpečného režimu a nikdy neopakovať posledný známy povel z pamäte. HTTP 401 (nesprávne PLC ID alebo token, vypršané predplatné) nastaví chybu na zariadeniach aj na module; SpotLogic žiada také volania neopakovať, preto opravte prístupové údaje.

### Odosielanie telemetrie (približne každé 2 minúty)

Modul posiela `POST /api/v1/optimize` s `PLCtype: "taphome"` najviac raz za 2 minúty. Posiela čas odoslania, časové pásmo, parametre batérie a siete a dve hodnoty zo zariadení:

- **Battery state of charge (input)** — zapisujte doň cez smart rule aktuálny stav nabitia 0–100 % zo solárneho invertora (keď šablóna solárneho invertora dáva 0–1, vynásobte hodnotu 100). Zaokrúhľuje sa na celé percento, pretože SpotLogic odmieta desatinné hodnoty. Kým nemá hodnotu, nič sa neposiela a modul zobrazuje varovanie.
- **Battery reserve for SpotLogic** — rezerva `SOCmin`, predvolene 10 %: úroveň, z ktorej plán nikdy nepredáva do siete.

Servisné atribúty modulu zobrazujú výsledok posledného odoslania, interval prepočtu hlásený službou SpotLogic (predvolene 900 s), čas výpočtu plánu, beh plánu a verziu API. Odmietnuté odoslanie (HTTP 422) je chyba modulu so správou, ktorú vrátil SpotLogic. Odpoveď na odoslanie nikdy neobsahuje plán — SpotLogic ho počíta na pozadí a modul si ho vyzdvihne pri ďalšom čítaní povelu.

### Časové rady predikcií a cien

SpotLogic očakáva v tele šesť časových radov, každý ako dvojice `[unix_ts, value]`:

| Premenná modulu | Obsah | Kontrakt |
|---|---|---|
| `PvForecastTod`, `PvForecastTom` | výroba FV dnes / zajtra, kWh za hodinu | hodinový, bez medzier, od aktuálnej hodiny do konca zajtrajška |
| `LoadForecastTod`, `LoadForecastTom` | spotreba domu dnes / zajtra, kWh za hodinu | rovnako |
| `PriceImp`, `PriceExp` | cena za odber / dodávku, CZK/kWh | konštantný krok (hodinový alebo 15 minút), stačí dnešok, záporné ceny sú povolené |

Premenné držia časové rady ako text JSON, napríklad `[[1788645600,0.0],[1788649200,0.42]]`, a vkladajú sa do tela bez zmeny; predvolená hodnota `[]` je prázdny rad. Samotná integrácia funguje, potrebuje len dáta. TapHome zatiaľ nevie zdieľať jeden text JSON medzi skriptami a skript smart rule nevie posielať požiadavky HTTP. Šesť časových radov — spolu asi 500 hodnôt — preto treba zozbierať z iných skriptov (napríklad zo šablóny predikcie alebo spotových cien) a odovzdať tomuto modulu cez stovky pomocných zariadení, alebo ich zostaviť priamo v skripte na čítanie modulu. Integrácia bude naozaj praktická, keď TapHome pridá textovú premennú zdieľanú medzi skriptami — pozrite nápad [Textová premenná a HTTP zo skriptov smart rules](https://taphome.com/sk/ideas/script-data-http/). Dovtedy vyplňte šesť premenných a šablóna funguje bez ďalších úprav. Skript to vysvetľuje v komentári na svojom začiatku a na mieste, kde sa časové rady vkladajú.

Odkiaľ dáta pochádzajú, je na inštalatérovi; SpotLogic uvádza tieto typické zdroje:

- **Výroba FV** — služba predikcie solárnych ziskov, do ktorej sa zadá poloha, orientácia a sklon panelov a inštalovaný výkon, alebo cloud výrobcu solárneho invertora.
- **Spotreba domu** — vlastná história inštalácie: na začiatok stačí hodinová spotreba spriemerovaná podľa hodiny dňa a typu dňa (pracovný deň, víkend, sviatok).
- **Ceny** — spotová cena prepočítaná podľa zmluvy o dodávke (odber, napríklad spot plus marža) a podľa zmluvy o výkupe prebytkov (dodávka).

Deň so zmenou letného času má 23 alebo 25 hodín, takže úplný rad výroby FV alebo spotreby má 47, 48 alebo 49 hodnôt. Vzorky staršie ako jedna hodina pred aktuálnou hodinou sa orežú, rovnako ako vzorky za koncom zajtrajška; rad, ktorý končí pred koncom zajtrajška, sa odmietne.

## Riešenie problémov

| Príznak | Príčina a riešenie |
|---|---|
| Povel ostáva na **No plan** | Plán ešte nebol vypočítaný alebo je telemetria odmietaná. Skontrolujte chybu modulu a servisný atribút Last telemetry upload. Plán starší ako 60 minút sa tiež neposkytuje. Po prvom prijatom odoslaní môže výpočet plánu chvíľu trvať — najmenej jeden interval prepočtu. |
| Chyba modulu HTTP 422 | Telemetria porušuje dátový kontrakt SpotLogic; správa uvádza, ktorú časť. Najčastejšie chýbajú časové rady predikcií alebo cien, alebo nepokrývajú obdobie do konca zajtrajška. |
| Chyba HTTP 401 | PLC ID a token k sebe nepatria alebo vypršalo predplatné. Opravte premenné modulu `PlcId` a `Token`. |
| Varovanie "Telemetry not sent" | Stav nabitia ešte nebol zapísaný alebo je prázdny niektorý parameter batérie či siete. |
| Vek plánu stále rastie | Nová telemetria sa do SpotLogic nedostáva alebo zlyhávajú jeho zdroje dát; posledný platný plán zostáva v platnosti, kým nemá 60 minút. |
| Chyba HTTP 500 alebo 502 | Chyba servera alebo zlyhávajúci zdroj dát na strane SpotLogic; posledný platný plán zostáva v platnosti. SpotLogic odporúča obe opakovať s narastajúcim odstupom; modul jednoducho zopakuje obe požiadavky pri ďalšom dopyte. |
| Plán riadi nesprávne hodiny | Hodiny riadiacej jednotky alebo časové pásmo sú nesprávne — okno plánu sa zostavuje z času odoslania a deklarovaného pásma. |

## Dostupné zariadenia 6

Tieto zariadenia sa po importe zobrazia v TapHome.

SpotLogic Modul

Servisné atribúty

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

Vlastné premenné

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

Čítanie (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
```

Servisné atribúty

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 Viacstavový prepínač

Hodnoty / Stavy: 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)

Čítanie stavu prepínača

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

Servisné atribúty

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 Premenná

Čítanie

```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 Viacstavový prepínač

Hodnoty / Stavy: 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)

Čítanie stavu prepínača

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

Servisné atribúty

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 Premenná

Čítanie

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

Čítanie

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

Zápis

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

Battery reserve for SpotLogic Premenná

Čítanie

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

Zápis

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

**Pripojenie:** Packet Parser → HTTP

## Parametre importu

Tieto hodnoty zadáte pri importe XML.

| Pýta sa v aplikácii                                         | Predvolené         |
|-------------------------------------------------------------|--------------------|
| SpotLogic PLC ID (from the activation e-mail)               | Zadáte pri importe |
| SpotLogic access token (from the activation e-mail, secret) | Zadáte pri importe |
| Time zone (IANA name)                                       | `Europe/Prague`    |
| Battery capacity \[kWh]                                     | Zadáte pri importe |
| Battery max charge and discharge power \[kW]                | Zadáte pri importe |
| Max grid import power \[kW] (0 = never import)              | Zadáte pri importe |
| Max grid export power \[kW] (0 = never export)              | Zadáte pri importe |
| Max state of charge \[%] (recorded only)                    | `100`              |
| Hard battery floor from the inverter manufacturer \[%]      | `10`               |

## Súvisiaca dokumentácia

- [Integrácia Packet Parser](https://taphome.com/sk/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/sk/docs/integration/packet-parser/)
- [Funkcie Packet parsera](https://taphome.com/sk/docs/script/packet-parser/)
- [Parsovacie funkcie](https://taphome.com/sk/docs/script/parsing-functions/)

