---
title: "SpotLogic – battery optimisation over the spot market (HTTP API)"
description: "SpotLogic cloud API přes HTTPS: čte povel baterie podle spotových cen, cílový stav nabití a stáří plánu; odesílá telemetrii baterie. Nutné predikce."
url: "https://taphome.com/cs/compatibility/spotlogic-energy-optimizer-http/"
language: cs
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","cloud-api","data-service","energy-management","battery-storage","spot-prices","photovoltaic"]
  questions: ["Jak integrovat SpotLogic s TapHome?","Co šablona SpotLogic pro TapHome čte a odesílá?","Jak připojit TapHome k SpotLogic API přes HTTPS?","Kde získám PLC ID a přístupový token SpotLogic?","Proč povel SpotLogic zůstává na No plan?","Proč SpotLogic odmítá telemetrii s HTTP 422?","Které časové řady predikcí a cen potřebuje SpotLogic od TapHome?","Ovládá šablona SpotLogic střídač přímo?"]
---

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

Komunikace: Packet Parser → HTTP

## Návod na integraci

SpotLogic je cloudová služba, která počítá plán nabíjení a vybíjení baterie fotovoltaické elektrárny podle spotového trhu s elektřinou. Je to výpočetní služba, ne zdroj dat: řídicí jednotka posílá telemetrii baterie spolu s predikcí solárních zisků, predikcí spotřeby domu a cenami za odběr a dodávku elektřiny a SpotLogic odpovídá povelem pro aktuální časový úsek. Tato šablona připojuje TapHome k SpotLogic API přes HTTPS (`spotlogic.cz`, port 443) pomocí modulu Packet Parser HTTP. Povel **čte** a telemetrii **odesílá**; střídač neovládá — povel se se střídačem propojí vlastními smart rules instalatéra.

Nic se nezapojuje. Zprovoznění služby znamená aktivovat SpotLogic pro danou instalaci, zjistit parametry baterie a sítě, zajistit řídicí jednotce odchozí přístup na internet a připravit časové řady predikcí a cen.

> [!WARNING]
> SpotLogic potřebuje v každém odeslání telemetrie časové řady predikcí a cen (predikce solárních zisků a spotřeby domu na dnešek a zítřek, ceny za odběr a dodávku). Tato šablona je sama vyplnit neumí — viz [Časové řady predikcí a cen](https://taphome.com/cs/compatibility/spotlogic-energy-optimizer-http/#časové-řady-predikcí-a-cen). Dokud nejsou vyplněné, SpotLogic telemetrii odmítá s HTTP 422, plán nepočítá a povel zůstává na **No plan**.

## Konfigurace

### 1. Aktivujte SpotLogic a uschovejte přístupové údaje

SpotLogic při aktivaci zařízení pošle e-mailem **PLC ID** a **přístupový token**. Token je tajný, vázaný na právě jedno PLC ID a platný po dobu předplatného. Obě hodnoty se přenášejí jen v řetězci dotazu každého požadavku (`?plc_id=…&token=…`), jak to vyžaduje kontrakt SpotLogic — nikdy v těle požadavku.

> [!WARNING]
> Token nedávejte do sdílených dokumentů ani do veřejných repozitářů. Nesprávná dvojice PLC ID a tokenu, neplatný token i vypršelé předplatné končí stejně s HTTP 401 a SpotLogic záměrně neprozradí, o který ze tří případů šlo.

### 2. Zjistěte parametry baterie a sítě

SpotLogic plánuje jen s čísly, která dostane v telemetrii. Před importem je vyhledejte v dokumentaci střídače a baterie a ve smlouvě o připojení k distribuční soustavě:

| Hodnota | Odkud ji zjistit | Jednotka |
|---|---|---|
| Kapacita baterie | katalogový list baterie; musí být větší než 0 | kWh |
| Maximální výkon baterie | jedna hodnota pro nabíjení i vybíjení | kW |
| Maximální výkon odběru ze sítě | velikost hlavního jističe; `0` znamená, že instalace nikdy neodebírá ze sítě | kW |
| Maximální výkon dodávky do sítě | limit dodávky podle připojení k síti; `0` znamená, že instalace nikdy nedodává do sítě | kW |
| Pevné minimum baterie | nejnižší stav nabití povolený výrobcem střídače, výchozí 10 | % |
| Rezerva baterie | rezerva, ze které plán nikdy neprodává do sítě (například pro nepředvídatelnou spotřebu), výchozí 10 | % |

V TapHome musí být dostupný i **aktuální stav nabití** baterie, obvykle z vlastní integrace střídače, aby ho bylo možné přes smart rule zapisovat do této šablony (viz níže Odesílání telemetrie).

### 3. Síť a hodiny řídicí jednotky

- Řídicí jednotka potřebuje odchozí přístup na internet přes HTTPS na `spotlogic.cz`, port 443. SpotLogic se k řídicí jednotce zpětně nepřipojuje — časové řady predikcí a cen putují v těle odesílané telemetrie, takže není třeba otevírat žádný příchozí port.
- Telemetrie nese čas odeslání z hodin řídicí jednotky a SpotLogic z něj sestavuje okno plánu. Odchylka několika minut nevadí; odchylka několika hodin posune celý plán do nesprávných časových úseků. Udržujte hodiny řídicí jednotky přesné.
- Časové pásmo (název IANA, například `Europe/Prague`) určuje, kde končí „dnes“ a začíná „zítra“. Zadejte časové pásmo místa instalace.

### 4. Parametry importu

Šablona se importuje do rozhraní Packet Parser v aplikaci TapHome a při importu se vyplní tyto parametry:

| Parametr | Význam | Jednotka |
|---|---|---|
| PLC ID, access token | z aktivačního e-mailu | — |
| Time zone | název IANA, výchozí `Europe/Prague`; určuje hranice dnů plánu | — |
| Battery capacity | musí být větší než 0 | kWh |
| Battery max power | jedna hodnota pro nabíjení i vybíjení | kW |
| Max grid import / export power | `0` znamená, že instalace nikdy neodebírá / nikdy nedodává | kW |
| Max state of charge | SpotLogic ho jen zaznamenává, současný plánovač ho nevynucuje | % |
| Hard battery floor | minimum od výrobce střídače, výchozí 10 | % |

Čísla se píší s desetinnou tečkou (čárka se převede). PLC ID a token se uloží do proměnných modulu `PlcId` a `Token`. Všechny hodnoty lze později upravit jako proměnné modulu.

### 5. Ověření přístupových údajů

Interaktivní dokumentace API služby SpotLogic (na `spotlogic.cz` pod `/docs`) má dialog **Authorize** pro zadání PLC ID a tokenu a její příklad telemetrie pro TapHome je úplný: s platnými přístupovými údaji ho SpotLogic přijme s HTTP 202. Nejprve v něm aktualizujte čas odeslání (`TimeStampUnix`) na aktuální čas. Přijatá vzorová data se pro plán ukládají stejně jako skutečná telemetrie, proto toto ověření patří před propojení povelu se střídačem.

> [!TIP]
> Odpověď HTTP 422 o neúplném horizontu predikce také dokazuje, že PLC ID a token jsou správné — nesprávný token vrátí HTTP 401.

## Možnosti zařízení

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

Modul každých 20 sekund volá `GET /api/v1/dispatch` a zařízení odpověď zpracují:

- **SpotLogic command** — povel pro probíhající časový úsek (`action_id`):

| Hodnota | Hodnota v TapHome | Název v SpotLogic | Význam |
|---|---|---|---|
| 0 | No plan | `no_plan` | Žádný použitelný plán — nechte střídač v jeho vlastním bezpečném režimu |
| 1 | Self-use | `self_use` | Vlastní spotřeba: nabíjení z přebytku FV, vybíjení na pokrytí spotřeby domu |
| 2 | Force charge | `force_charge` | Nabíjení baterie maximálním výkonem |
| 3 | Force discharge to grid | `force_discharge` | Vybíjení baterie do sítě maximálním výkonem |
| 4 | Self-use, no discharging | `self_use_ChargeOnly` | Vlastní spotřeba, nabíjení povoleno, vybíjení zakázáno |
| 5 | Self-use, no charging | `self_use_DischargeOnly` | Vlastní spotřeba, vybíjení povoleno, nabíjení zakázáno |
| 6 | Stop PV (reserved) | `stopPV` | Rezervováno — současný plánovač ho nevydává |
| 7 | Grid charge without PV (reserved) | `ChargeMaxNoPV` | Rezervováno — současný plánovač ho nevydává |

  Servisní atributy zobrazují název povelu a čas, kdy povel končí (místní čas).
- **SpotLogic target state of charge** — stav nabití (%), který plán očekává na konci časového úseku. Když ho baterie dosáhne, ukončete vynucené nabíjení nebo vybíjení; při vlastní spotřebě nad něj nenabíjejte. SpotLogic dodává, že při `self_use_DischargeOnly` se baterie nemá vybít pod tuto hodnotu. Hodnota je výsledkem plánu, ne žádaná hodnota, kterou je třeba vynutit, a poté, co dům spotřeboval rezervu, může být dočasně nižší než rezerva baterie.
- **SpotLogic next command** — povel následujícího časového úseku, čas jeho začátku je v servisním atributu.
- **SpotLogic plan age** — stáří poskytnutého plánu v sekundách. Může spouštět záložní smart rule: když výrazně přeroste interval přepočtu, plán se nepřepočítává.

Odpověď HTTP 404 `no_plan` **není chyba**: povel je 0 a zařízení zobrazí informační zprávu. SpotLogic v tomto stavu žádá přepnout střídač do jeho vlastního bezpečného režimu a nikdy neopakovat poslední známý povel z paměti. HTTP 401 (nesprávné PLC ID nebo token, vypršelé předplatné) nastaví chybu na zařízeních i na modulu; SpotLogic žádá taková volání neopakovat, proto opravte přístupové údaje.

### Odesílání telemetrie (přibližně každé 2 minuty)

Modul posílá `POST /api/v1/optimize` s `PLCtype: "taphome"` nejvýše jednou za 2 minuty. Posílá čas odeslání, časové pásmo, parametry baterie a sítě a dvě hodnoty ze zařízení:

- **Battery state of charge (input)** — zapisujte do něj přes smart rule aktuální stav nabití 0–100 % ze střídače (když šablona střídače dává 0–1, vynásobte hodnotu 100). Zaokrouhluje se na celé procento, protože SpotLogic odmítá desetinné hodnoty. Dokud nemá hodnotu, nic se neposílá a modul zobrazuje varování.
- **Battery reserve for SpotLogic** — rezerva `SOCmin`, výchozí 10 %: úroveň, ze které plán nikdy neprodává do sítě.

Servisní atributy modulu zobrazují výsledek posledního odeslání, interval přepočtu hlášený službou SpotLogic (výchozí 900 s), čas výpočtu plánu, běh plánu a verzi API. Odmítnuté odeslání (HTTP 422) je chyba modulu se zprávou, kterou vrátil SpotLogic. Odpověď na odeslání nikdy neobsahuje plán — SpotLogic ho počítá na pozadí a modul si ho vyzvedne při dalším čtení povelu.

### Časové řady predikcí a cen

SpotLogic očekává v těle šest časových řad, každou jako dvojice `[unix_ts, value]`:

| Proměnná modulu | Obsah | Kontrakt |
|---|---|---|
| `PvForecastTod`, `PvForecastTom` | výroba FV dnes / zítra, kWh za hodinu | hodinová, bez mezer, od aktuální hodiny do konce zítřka |
| `LoadForecastTod`, `LoadForecastTom` | spotřeba domu dnes / zítra, kWh za hodinu | stejně |
| `PriceImp`, `PriceExp` | cena za odběr / dodávku, CZK/kWh | konstantní krok (hodinový nebo 15 minut), stačí dnešek, záporné ceny jsou povolené |

Proměnné drží časové řady jako text JSON, například `[[1788645600,0.0],[1788649200,0.42]]`, a vkládají se do těla beze změny; výchozí hodnota `[]` je prázdná řada. Samotná integrace funguje, potřebuje jen data. TapHome zatím neumí sdílet jeden text JSON mezi skripty a skript smart rule neumí posílat požadavky HTTP. Šest časových řad — dohromady asi 500 hodnot — proto musí být posbírané z jiných skriptů (například ze šablony predikce nebo spotových cen) a předané tomuto modulu přes stovky pomocných zařízení, nebo sestavené přímo ve čtecím skriptu modulu. Integrace bude opravdu praktická, až TapHome přidá textovou proměnnou sdílenou mezi skripty — viz nápad [Textová proměnná a HTTP ze skriptů smart rules](https://taphome.com/cs/ideas/script-data-http/). Do té doby vyplňte šest proměnných a šablona funguje bez dalších úprav. Skript to vysvětluje v komentáři na svém začátku a v místě, kde se časové řady vkládají.

Odkud data pocházejí, je na instalatérovi; SpotLogic uvádí tyto typické zdroje:

- **Výroba FV** — služba predikce solárních zisků, do které se zadá poloha, orientace a sklon panelů a instalovaný výkon, nebo cloud výrobce střídače.
- **Spotřeba domu** — vlastní historie instalace: pro začátek stačí hodinová spotřeba zprůměrovaná podle hodiny dne a typu dne (pracovní den, víkend, svátek).
- **Ceny** — spotová cena přepočtená podle smlouvy o dodávce (odběr, například spot plus marže) a podle smlouvy o výkupu přebytků (dodávka).

Den se změnou letního času má 23 nebo 25 hodin, takže úplná řada výroby FV nebo spotřeby má 47, 48 nebo 49 hodnot. Vzorky starší než jedna hodina před aktuální hodinou se oříznou, stejně jako vzorky za koncem zítřka; řada, která končí před koncem zítřka, se odmítne.

## Řešení problémů

| Příznak | Příčina a řešení |
|---|---|
| Povel zůstává na **No plan** | Plán ještě nebyl vypočítán nebo je telemetrie odmítána. Zkontrolujte chybu modulu a servisní atribut Last telemetry upload. Plán starší než 60 minut se také neposkytuje. Po prvním přijatém odeslání může výpočet plánu chvíli trvat — nejméně jeden interval přepočtu. |
| Chyba modulu HTTP 422 | Telemetrie porušuje datový kontrakt SpotLogic; zpráva uvádí, kterou část. Nejčastěji chybí časové řady predikcí nebo cen, nebo nepokrývají období do konce zítřka. |
| Chyba HTTP 401 | PLC ID a token k sobě nepatří nebo vypršelo předplatné. Opravte proměnné modulu `PlcId` a `Token`. |
| Varování "Telemetry not sent" | Stav nabití ještě nebyl zapsán nebo je prázdný některý parametr baterie či sítě. |
| Stáří plánu stále roste | Nová telemetrie se do SpotLogic nedostává nebo selhávají jeho zdroje dat; poslední platný plán zůstává v platnosti, dokud nemá 60 minut. |
| Chyba HTTP 500 nebo 502 | Chyba serveru nebo selhávající zdroj dat na straně SpotLogic; poslední platný plán zůstává v platnosti. SpotLogic doporučuje oba opakovat s rostoucím odstupem; modul jednoduše zopakuje oba požadavky při dalším dotazu. |
| Plán řídí nesprávné hodiny | Hodiny řídicí jednotky nebo časové pásmo jsou nesprávné — okno plánu se sestavuje z času odeslání a deklarovaného pásma. |

## Dostupná zařízení 6

Tato zařízení se po importu zobrazí v TapHome.

SpotLogic Modul

Servisní atributy

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

Vlastní proměnné

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

Čtení (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í atributy

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 Vícestavový přepí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)

Čtení stavu přepínače

```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í atributy

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 Proměnná

Čtení

```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 Vícestavový přepí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)

Čtení stavu přepínače

```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í atributy

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 Proměnná

Čtení

```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) Proměnná

Čtení

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

Zápis

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

Battery reserve for SpotLogic Proměnná

Čtení

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

Zápis

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

**Připojení:** Packet Parser → HTTP

## Parametry importu

Tyto hodnoty zadáte při importu XML.

| Ptá se v aplikaci                                           | Výchozí            |
|-------------------------------------------------------------|--------------------|
| SpotLogic PLC ID (from the activation e-mail)               | Zadáte při importu |
| SpotLogic access token (from the activation e-mail, secret) | Zadáte při importu |
| Time zone (IANA name)                                       | `Europe/Prague`    |
| Battery capacity \[kWh]                                     | Zadáte při importu |
| Battery max charge and discharge power \[kW]                | Zadáte při importu |
| Max grid import power \[kW] (0 = never import)              | Zadáte při importu |
| Max grid export power \[kW] (0 = never export)              | Zadáte při importu |
| Max state of charge \[%] (recorded only)                    | `100`              |
| Hard battery floor from the inverter manufacturer \[%]      | `10`               |

## Související dokumentace

- [Integrace Packet Parser](https://taphome.com/cs/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/cs/docs/integration/packet-parser/)
- [Funkce Packet parser](https://taphome.com/cs/docs/script/packet-parser/)
- [Funkce pro parsování](https://taphome.com/cs/docs/script/parsing-functions/)

